{"owner":"thedaviddias","repo":"Front-End-Checklist","hasSkills":true,"totalSkillsCount":794,"totalTokensCount":690838,"categories":["marketplace","root-instruction","claude-rule","plugin-manifest","anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":[".agents/plugins/marketplace.json",".claude-plugin/marketplace.json","AGENTS.md","CLAUDE.md","packages/analytics/README.md","packages/cli/README.md","packages/cli/SKILL.md","packages/rules/README.md","plugins/front-end-checklist/.claude-plugin/plugin.json","plugins/front-end-checklist/.codex-plugin/plugin.json","plugins/front-end-checklist/README.md","plugins/front-end-checklist/skills/frontend-checklist-global/SKILL.md","plugins/front-end-checklist/skills/frontend-checklist-global/references/categories.md","skills/404-page/SKILL.md","skills/404-page/references/rule.md","skills/about-page/SKILL.md","skills/about-page/references/rule.md","skills/accessibility-testing/SKILL.md","skills/accessibility-testing/references/rule.md","skills/accessible-authentication/SKILL.md","skills/accessible-authentication/references/rule.md","skills/accessible-notifications/SKILL.md","skills/accessible-notifications/references/rule.md","skills/accessible-tables/SKILL.md","skills/accessible-tables/references/rule.md","skills/accessible-tooltips/SKILL.md","skills/accessible-tooltips/references/rule.md","skills/accesskeys/SKILL.md","skills/accesskeys/references/rule.md","skills/accordion-accessibility/SKILL.md","skills/accordion-accessibility/references/rule.md","skills/affiliate-disclosure/SKILL.md","skills/affiliate-disclosure/references/rule.md","skills/ai-content/SKILL.md","skills/ai-content/references/rule.md","skills/all-noindex-pages/SKILL.md","skills/all-noindex-pages/references/rule.md","skills/alt-text/SKILL.md","skills/alt-text/references/rule.md","skills/anchor-smooth-scroll/SKILL.md","skills/anchor-smooth-scroll/references/rule.md","skills/anchor-text/SKILL.md","skills/anchor-text/references/rule.md","skills/animated-content/SKILL.md","skills/animated-content/references/rule.md","skills/animation-performance/SKILL.md","skills/animation-performance/references/rule.md","skills/aria-allowed-attr/SKILL.md","skills/aria-allowed-attr/references/rule.md","skills/aria-command-name/SKILL.md","skills/aria-command-name/references/rule.md","skills/aria-deprecated-role/SKILL.md","skills/aria-deprecated-role/references/rule.md","skills/aria-dialog-name/SKILL.md","skills/aria-dialog-name/references/rule.md","skills/aria-hidden-body/SKILL.md","skills/aria-hidden-body/references/rule.md","skills/aria-hidden-focus/SKILL.md","skills/aria-hidden-focus/references/rule.md","skills/aria-input-field-name/SKILL.md","skills/aria-input-field-name/references/rule.md","skills/aria-labels/SKILL.md","skills/aria-labels/references/rule.md","skills/aria-live-regions/SKILL.md","skills/aria-live-regions/references/rule.md","skills/aria-meter-name/SKILL.md","skills/aria-meter-name/references/rule.md","skills/aria-progressbar-name/SKILL.md","skills/aria-progressbar-name/references/rule.md","skills/aria-required-attr/SKILL.md","skills/aria-required-attr/references/rule.md","skills/aria-required-children/SKILL.md","skills/aria-required-children/references/rule.md","skills/aria-required-parent/SKILL.md","skills/aria-required-parent/references/rule.md","skills/aria-roles/SKILL.md","skills/aria-roles/references/rule.md","skills/aria-text/SKILL.md","skills/aria-text/references/rule.md","skills/aria-toggle-field-name/SKILL.md","skills/aria-toggle-field-name/references/rule.md","skills/aria-tooltip-name/SKILL.md","skills/aria-tooltip-name/references/rule.md","skills/aria-treeitem-name/SKILL.md","skills/aria-treeitem-name/references/rule.md","skills/aria-valid-attr-value/SKILL.md","skills/aria-valid-attr-value/references/rule.md","skills/aria-valid-attr/SKILL.md","skills/aria-valid-attr/references/rule.md","skills/article-links/SKILL.md","skills/article-links/references/rule.md","skills/article/SKILL.md","skills/article/references/rule.md","skills/audio-descriptions/SKILL.md","skills/audio-descriptions/references/rule.md","skills/author-byline/SKILL.md","skills/author-byline/references/rule.md","skills/author-expertise/SKILL.md","skills/author-expertise/references/rule.md","skills/author-info/SKILL.md","skills/author-info/references/rule.md","skills/autofocus-avoidance/SKILL.md","skills/autofocus-avoidance/references/rule.md","skills/autoplay-media/SKILL.md","skills/autoplay-media/references/rule.md","skills/avif-format/SKILL.md","skills/avif-format/references/rule.md","skills/avoid-eval/SKILL.md","skills/avoid-eval/references/rule.md","skills/back-forward-cache/SKILL.md","skills/back-forward-cache/references/rule.md","skills/blocked-links/SKILL.md","skills/blocked-links/references/rule.md","skills/breadcrumb-navigation/SKILL.md","skills/breadcrumb-navigation/references/rule.md","skills/breadcrumb/SKILL.md","skills/breadcrumb/references/rule.md","skills/broken-external-links/SKILL.md","skills/broken-external-links/references/rule.md","skills/broken-html/SKILL.md","skills/broken-html/references/rule.md","skills/broken-images/SKILL.md","skills/broken-images/references/rule.md","skills/broken-links/SKILL.md","skills/broken-links/references/rule.md","skills/browser-caching/SKILL.md","skills/browser-caching/references/rule.md","skills/browser-required/SKILL.md","skills/browser-required/references/rule.md","skills/button-name/SKILL.md","skills/button-name/references/rule.md","skills/canonical-chain/SKILL.md","skills/canonical-chain/references/rule.md","skills/canonical-header/SKILL.md","skills/canonical-header/references/rule.md","skills/canonical-url/SKILL.md","skills/canonical-url/references/rule.md","skills/carousel-accessibility/SKILL.md","skills/carousel-accessibility/references/rule.md","skills/cascade-layers/SKILL.md","skills/cascade-layers/references/rule.md","skills/cdn/SKILL.md","skills/cdn/references/rule.md","skills/charset/SKILL.md","skills/charset/references/rule.md","skills/citations/SKILL.md","skills/citations/references/rule.md","skills/clean-up-comments/SKILL.md","skills/clean-up-comments/references/rule.md","skills/code-splitting/SKILL.md","skills/code-splitting/references/rule.md","skills/color-contrast/SKILL.md","skills/color-contrast/references/rule.md","skills/color-oklch/SKILL.md","skills/color-oklch/references/rule.md","skills/compression/SKILL.md","skills/compression/references/rule.md","skills/consent-mode/SKILL.md","skills/consent-mode/references/rule.md","skills/consistent-help/SKILL.md","skills/consistent-help/references/rule.md","skills/console-cleanup/SKILL.md","skills/console-cleanup/references/rule.md","skills/const-let/SKILL.md","skills/const-let/references/rule.md","skills/contact-page/SKILL.md","skills/contact-page/references/rule.md","skills/container-queries/SKILL.md","skills/container-queries/references/rule.md","skills/content-dates/SKILL.md","skills/content-dates/references/rule.md","skills/content-security-policy/SKILL.md","skills/content-security-policy/references/rule.md","skills/content-without-css/SKILL.md","skills/content-without-css/references/rule.md","skills/contract-testing/SKILL.md","skills/contract-testing/references/rule.md","skills/cookie-consent/SKILL.md","skills/cookie-consent/references/rule.md","skills/critical-images/SKILL.md","skills/critical-images/references/rule.md","skills/critical-request-chains/SKILL.md","skills/critical-request-chains/references/rule.md","skills/cross-browser-testing/SKILL.md","skills/cross-browser-testing/references/rule.md","skills/cross-origin-isolation/SKILL.md","skills/cross-origin-isolation/references/rule.md","skills/cross-origin-security/SKILL.md","skills/cross-origin-security/references/rule.md","skills/css-at-property/SKILL.md","skills/css-at-property/references/rule.md","skills/css-containment/SKILL.md","skills/css-containment/references/rule.md","skills/css-critical/SKILL.md","skills/css-critical/references/rule.md","skills/css-custom-properties/SKILL.md","skills/css-custom-properties/references/rule.md","skills/css-file-size/SKILL.md","skills/css-file-size/references/rule.md","skills/css-grid/SKILL.md","skills/css-grid/references/rule.md","skills/css-minification/SKILL.md","skills/css-minification/references/rule.md","skills/css-non-blocking/SKILL.md","skills/css-non-blocking/references/rule.md","skills/css-order/SKILL.md","skills/css-order/references/rule.md","skills/css-print/SKILL.md","skills/css-print/references/rule.md","skills/cumulative-layout-shift/SKILL.md","skills/cumulative-layout-shift/references/rule.md","skills/currency-formatting/SKILL.md","skills/currency-formatting/references/rule.md","skills/custom-element-accessibility/SKILL.md","skills/custom-element-accessibility/references/rule.md","skills/dark-mode-css/SKILL.md","skills/dark-mode-css/references/rule.md","skills/data-minimisation/SKILL.md","skills/data-minimisation/references/rule.md","skills/dead-end-pages/SKILL.md","skills/dead-end-pages/references/rule.md","skills/debounce-throttle/SKILL.md","skills/debounce-throttle/references/rule.md","skills/decorative-elements/SKILL.md","skills/decorative-elements/references/rule.md","skills/defer-async/SKILL.md","skills/defer-async/references/rule.md","skills/definition-list/SKILL.md","skills/definition-list/references/rule.md","skills/dependency-audit/SKILL.md","skills/dependency-audit/references/rule.md","skills/dimensions/SKILL.md","skills/dimensions/references/rule.md","skills/direction-attribute/SKILL.md","skills/direction-attribute/references/rule.md","skills/disclaimers/SKILL.md","skills/disclaimers/references/rule.md","skills/dlitem/SKILL.md","skills/dlitem/references/rule.md","skills/doctype/SKILL.md","skills/doctype/references/rule.md","skills/dom-performance/SKILL.md","skills/dom-performance/references/rule.md","skills/dom-size/SKILL.md","skills/dom-size/references/rule.md","skills/draggable-accessibility/SKILL.md","skills/draggable-accessibility/references/rule.md","skills/duplicate-description/SKILL.md","skills/duplicate-description/references/rule.md","skills/duplicate-id-active/SKILL.md","skills/duplicate-id-active/references/rule.md","skills/duplicate-id-aria/SKILL.md","skills/duplicate-id-aria/references/rule.md","skills/duplicate-js/SKILL.md","skills/duplicate-js/references/rule.md","skills/e2e-testing/SKILL.md","skills/e2e-testing/references/rule.md","skills/editorial-policy/SKILL.md","skills/editorial-policy/references/rule.md","skills/element-hiding/SKILL.md","skills/element-hiding/references/rule.md","skills/embedded-or-inline-css/SKILL.md","skills/embedded-or-inline-css/references/rule.md","skills/empty-heading/SKILL.md","skills/empty-heading/references/rule.md","skills/empty-links/SKILL.md","skills/empty-links/references/rule.md","skills/error-handling/SKILL.md","skills/error-handling/references/rule.md","skills/error-images/SKILL.md","skills/error-images/references/rule.md","skills/error-monitoring/SKILL.md","skills/error-monitoring/references/rule.md","skills/es-modules/SKILL.md","skills/es-modules/references/rule.md","skills/event-delegation/SKILL.md","skills/event-delegation/references/rule.md","skills/external-links/SKILL.md","skills/external-links/references/rule.md","skills/faq/SKILL.md","skills/faq/references/rule.md","skills/favicon/SKILL.md","skills/favicon/references/rule.md","skills/favicons/SKILL.md","skills/favicons/references/rule.md","skills/fetchpriority-attribute/SKILL.md","skills/fetchpriority-attribute/references/rule.md","skills/figure-figcaption/SKILL.md","skills/figure-figcaption/references/rule.md","skills/file-upload-accessibility/SKILL.md","skills/file-upload-accessibility/references/rule.md","skills/filename-quality/SKILL.md","skills/filename-quality/references/rule.md","skills/find-npm-packages/SKILL.md","skills/first-contentful-paint/SKILL.md","skills/first-contentful-paint/references/rule.md","skills/flashing-content/SKILL.md","skills/flashing-content/references/rule.md","skills/flexbox-patterns/SKILL.md","skills/flexbox-patterns/references/rule.md","skills/focus-management/SKILL.md","skills/focus-management/references/rule.md","skills/focus-not-obscured/SKILL.md","skills/focus-not-obscured/references/rule.md","skills/focus-order/SKILL.md","skills/focus-order/references/rule.md","skills/focus-styles/SKILL.md","skills/focus-styles/references/rule.md","skills/font-loading/SKILL.md","skills/font-loading/references/rule.md","skills/font-size/SKILL.md","skills/font-size/references/rule.md","skills/form-captcha/SKILL.md","skills/form-captcha/references/rule.md","skills/form-field-multiple-labels/SKILL.md","skills/form-field-multiple-labels/references/rule.md","skills/form-https/SKILL.md","skills/form-https/references/rule.md","skills/form-labels/SKILL.md","skills/form-labels/references/rule.md","skills/form-validation/SKILL.md","skills/form-validation/references/rule.md","skills/frame-title/SKILL.md","skills/frame-title/references/rule.md","skills/freshness/SKILL.md","skills/freshness/references/rule.md","skills/frontend-checklist-global/SKILL.md","skills/frontend-checklist-global/references/categories.md","skills/geo-meta/SKILL.md","skills/geo-meta/references/rule.md","skills/gtm-present/SKILL.md","skills/gtm-present/references/rule.md","skills/h1/SKILL.md","skills/h1/references/rule.md","skills/has-selector/SKILL.md","skills/has-selector/references/rule.md","skills/heading-hierarchy/SKILL.md","skills/heading-hierarchy/references/rule.md","skills/heading-order/SKILL.md","skills/heading-order/references/rule.md","skills/horizontal-scroll/SKILL.md","skills/horizontal-scroll/references/rule.md","skills/hreflang/SKILL.md","skills/hreflang/references/rule.md","skills/hsts/SKILL.md","skills/hsts/references/rule.md","skills/html-resource-hints/SKILL.md","skills/html-resource-hints/references/rule.md","skills/html-size/SKILL.md","skills/html-size/references/rule.md","skills/html-xml-lang-mismatch/SKILL.md","skills/html-xml-lang-mismatch/references/rule.md","skills/html5-semantic-elements/SKILL.md","skills/html5-semantic-elements/references/rule.md","skills/http-requests/SKILL.md","skills/http-requests/references/rule.md","skills/http-to-https/SKILL.md","skills/http-to-https/references/rule.md","skills/http2/SKILL.md","skills/http2/references/rule.md","skills/https-downgrade/SKILL.md","skills/https-downgrade/references/rule.md","skills/https/SKILL.md","skills/https/references/rule.md","skills/hyphens/SKILL.md","skills/hyphens/references/rule.md","skills/identical-links-same-purpose/SKILL.md","skills/identical-links-same-purpose/references/rule.md","skills/image-cdn/SKILL.md","skills/image-cdn/references/rule.md","skills/image-compression/SKILL.md","skills/image-compression/references/rule.md","skills/image-file-size/SKILL.md","skills/image-file-size/references/rule.md","skills/image-optimization/SKILL.md","skills/image-optimization/references/rule.md","skills/image-redundant-alt/SKILL.md","skills/image-redundant-alt/references/rule.md","skills/immutable-patterns/SKILL.md","skills/immutable-patterns/references/rule.md","skills/import-on-interaction/SKILL.md","skills/import-on-interaction/references/rule.md","skills/import-on-visibility/SKILL.md","skills/import-on-visibility/references/rule.md","skills/improve-rule/SKILL.md","skills/improve-rule/references/scoring-rubric.md","skills/inclusive-language/SKILL.md","skills/inclusive-language/references/rule.md","skills/indexability-conflicts/SKILL.md","skills/indexability-conflicts/references/rule.md","skills/indexability/SKILL.md","skills/indexability/references/rule.md","skills/input-image-alt/SKILL.md","skills/input-image-alt/references/rule.md","skills/input-types/SKILL.md","skills/input-types/references/rule.md","skills/integration-testing/SKILL.md","skills/integration-testing/references/rule.md","skills/interaction-to-next-paint/SKILL.md","skills/interaction-to-next-paint/references/rule.md","skills/internal-links/SKILL.md","skills/internal-links/references/rule.md","skills/interstitials/SKILL.md","skills/interstitials/references/rule.md","skills/invalid-links/SKILL.md","skills/invalid-links/references/rule.md","skills/javascript-inline/SKILL.md","skills/javascript-inline/references/rule.md","skills/javascript-linter/SKILL.md","skills/javascript-linter/references/rule.md","skills/javascript-minification/SKILL.md","skills/javascript-minification/references/rule.md","skills/js-file-size/SKILL.md","skills/js-file-size/references/rule.md","skills/js-libraries/SKILL.md","skills/js-libraries/references/rule.md","skills/js-redirects/SKILL.md","skills/js-redirects/references/rule.md","skills/json-ld-valid/SKILL.md","skills/json-ld-valid/references/rule.md","skills/json-safety/SKILL.md","skills/json-safety/references/rule.md","skills/keyboard-navigation/SKILL.md","skills/keyboard-navigation/references/rule.md","skills/keyword-stuffing/SKILL.md","skills/keyword-stuffing/references/rule.md","skills/label-content-name-mismatch/SKILL.md","skills/label-content-name-mismatch/references/rule.md","skills/landmark-one-main/SKILL.md","skills/landmark-one-main/references/rule.md","skills/landmark-regions/SKILL.md","skills/landmark-regions/references/rule.md","skills/lang-attribute/SKILL.md","skills/lang-attribute/references/rule.md","skills/largest-contentful-paint/SKILL.md","skills/largest-contentful-paint/references/rule.md","skills/lazy-above-fold/SKILL.md","skills/lazy-above-fold/references/rule.md","skills/lazy-loading/SKILL.md","skills/lazy-loading/references/rule.md","skills/leaked-secrets/SKILL.md","skills/leaked-secrets/references/rule.md","skills/legacy-js/SKILL.md","skills/legacy-js/references/rule.md","skills/length/SKILL.md","skills/length/references/rule.md","skills/link-checker/SKILL.md","skills/link-checker/references/rule.md","skills/link-in-text-block/SKILL.md","skills/link-in-text-block/references/rule.md","skills/link-text/SKILL.md","skills/link-text/references/rule.md","skills/list-structure/SKILL.md","skills/list-structure/references/rule.md","skills/list-virtualization/SKILL.md","skills/list-virtualization/references/rule.md","skills/listitem/SKILL.md","skills/listitem/references/rule.md","skills/llm-parsability/SKILL.md","skills/llm-parsability/references/rule.md","skills/llms-txt/SKILL.md","skills/llms-txt/references/rule.md","skills/loading-indicators/SKILL.md","skills/loading-indicators/references/rule.md","skills/local-business/SKILL.md","skills/local-business/references/rule.md","skills/locale-images/SKILL.md","skills/locale-images/references/rule.md","skills/logical-properties/SKILL.md","skills/logical-properties/references/rule.md","skills/lowercase/SKILL.md","skills/lowercase/references/rule.md","skills/memory-leaks/SKILL.md","skills/memory-leaks/references/rule.md","skills/meta-description/SKILL.md","skills/meta-description/references/rule.md","skills/meta-in-body/SKILL.md","skills/meta-in-body/references/rule.md","skills/meta-refresh/SKILL.md","skills/meta-refresh/references/rule.md","skills/meta-title/SKILL.md","skills/meta-title/references/rule.md","skills/mime-type/SKILL.md","skills/mime-type/references/rule.md","skills/mixed-content/SKILL.md","skills/mixed-content/references/rule.md","skills/mobile-testing/SKILL.md","skills/mobile-testing/references/rule.md","skills/mock-best-practices/SKILL.md","skills/mock-best-practices/references/rule.md","skills/modal-accessibility/SKILL.md","skills/modal-accessibility/references/rule.md","skills/modern-array-methods/SKILL.md","skills/modern-array-methods/references/rule.md","skills/modern-format/SKILL.md","skills/modern-format/references/rule.md","skills/mutation-testing/SKILL.md","skills/mutation-testing/references/rule.md","skills/naming-conventions/SKILL.md","skills/naming-conventions/references/rule.md","skills/nap-consistency/SKILL.md","skills/nap-consistency/references/rule.md","skills/navigation-landmark/SKILL.md","skills/navigation-landmark/references/rule.md","skills/new-tab/SKILL.md","skills/new-tab/references/rule.md","skills/no-explicit-any/SKILL.md","skills/no-explicit-any/references/rule.md","skills/no-unchecked-indexed-access/SKILL.md","skills/no-unchecked-indexed-access/references/rule.md","skills/nofollow-internal/SKILL.md","skills/nofollow-internal/references/rule.md","skills/noindex-in-sitemap/SKILL.md","skills/noindex-in-sitemap/references/rule.md","skills/noscript-tag/SKILL.md","skills/noscript-tag/references/rule.md","skills/nosnippet/SKILL.md","skills/nosnippet/references/rule.md","skills/object-alt/SKILL.md","skills/object-alt/references/rule.md","skills/offline-fallback/SKILL.md","skills/offline-fallback/references/rule.md","skills/offscreen-lazy/SKILL.md","skills/offscreen-lazy/references/rule.md","skills/og-image-size/SKILL.md","skills/og-image-size/references/rule.md","skills/og-tags/SKILL.md","skills/og-tags/references/rule.md","skills/og-url-match/SKILL.md","skills/og-url-match/references/rule.md","skills/optimized/SKILL.md","skills/optimized/references/rule.md","skills/organization/SKILL.md","skills/organization/references/rule.md","skills/orientation/SKILL.md","skills/orientation/references/rule.md","skills/orphan-pages/SKILL.md","skills/orphan-pages/references/rule.md","skills/page-load-time/SKILL.md","skills/page-load-time/references/rule.md","skills/page-weight/SKILL.md","skills/page-weight/references/rule.md","skills/pagination-accessibility/SKILL.md","skills/pagination-accessibility/references/rule.md","skills/pagination/SKILL.md","skills/pagination/references/rule.md","skills/parallax-effects/SKILL.md","skills/parallax-effects/references/rule.md","skills/parameters/SKILL.md","skills/parameters/references/rule.md","skills/password-field-security/SKILL.md","skills/password-field-security/references/rule.md","skills/paste-inputs/SKILL.md","skills/paste-inputs/references/rule.md","skills/pdf-size/SKILL.md","skills/pdf-size/references/rule.md","skills/performance-budget/SKILL.md","skills/performance-budget/references/rule.md","skills/performance-resource-hints/SKILL.md","skills/performance-resource-hints/references/rule.md","skills/permissions-policy/SKILL.md","skills/permissions-policy/references/rule.md","skills/physical-address/SKILL.md","skills/physical-address/references/rule.md","skills/picture-element/SKILL.md","skills/picture-element/references/rule.md","skills/plain-language/SKILL.md","skills/plain-language/references/rule.md","skills/pluralization/SKILL.md","skills/pluralization/references/rule.md","skills/preconnect/SKILL.md","skills/preconnect/references/rule.md","skills/privacy-policy/SKILL.md","skills/privacy-policy/references/rule.md","skills/product/SKILL.md","skills/product/references/rule.md","skills/progressive-jpeg/SKILL.md","skills/progressive-jpeg/references/rule.md","skills/pwa-installability/SKILL.md","skills/pwa-installability/references/rule.md","skills/quality/SKILL.md","skills/quality/references/rule.md","skills/reading-level/SKILL.md","skills/reading-level/references/rule.md","skills/redirect-chain/SKILL.md","skills/redirect-chain/references/rule.md","skills/redirect-chains/SKILL.md","skills/redirect-chains/references/rule.md","skills/reduced-motion/SKILL.md","skills/reduced-motion/references/rule.md","skills/redundant-entry/SKILL.md","skills/redundant-entry/references/rule.md","skills/referrer-policy/SKILL.md","skills/referrer-policy/references/rule.md","skills/render-blocking/SKILL.md","skills/render-blocking/references/rule.md","skills/reset-css/SKILL.md","skills/reset-css/references/rule.md","skills/resource-hints/SKILL.md","skills/resource-hints/references/rule.md","skills/responsive-images/SKILL.md","skills/responsive-images/references/rule.md","skills/responsive-size/SKILL.md","skills/responsive-size/references/rule.md","skills/responsive-units/SKILL.md","skills/responsive-units/references/rule.md","skills/retina-display/SKILL.md","skills/retina-display/references/rule.md","skills/review/SKILL.md","skills/review/references/rule.md","skills/right-to-erasure/SKILL.md","skills/right-to-erasure/references/rule.md","skills/robots-meta-conflict/SKILL.md","skills/robots-meta-conflict/references/rule.md","skills/robots-meta/SKILL.md","skills/robots-meta/references/rule.md","skills/robots-txt/SKILL.md","skills/robots-txt/references/rule.md","skills/runtime-validation/SKILL.md","skills/runtime-validation/references/rule.md","skills/scheduler-yield/SKILL.md","skills/scheduler-yield/references/rule.md","skills/schema-noindex-conflict/SKILL.md","skills/schema-noindex-conflict/references/rule.md","skills/screen-reader-testing/SKILL.md","skills/screen-reader-testing/references/rule.md","skills/scrolljacking/SKILL.md","skills/scrolljacking/references/rule.md","skills/search-input/SKILL.md","skills/search-input/references/rule.md","skills/select-name/SKILL.md","skills/select-name/references/rule.md","skills/semantic-lists/SKILL.md","skills/semantic-lists/references/rule.md","skills/sensory-instructions/SKILL.md","skills/sensory-instructions/references/rule.md","skills/service-area/SKILL.md","skills/service-area/references/rule.md","skills/service-worker/SKILL.md","skills/service-worker/references/rule.md","skills/session-cookie-flags/SKILL.md","skills/session-cookie-flags/references/rule.md","skills/session-timeout-recovery/SKILL.md","skills/session-timeout-recovery/references/rule.md","skills/share-buttons/SKILL.md","skills/share-buttons/references/rule.md","skills/sitemap-4xx/SKILL.md","skills/sitemap-4xx/references/rule.md","skills/sitemap-coverage/SKILL.md","skills/sitemap-coverage/references/rule.md","skills/sitemap-domain/SKILL.md","skills/sitemap-domain/references/rule.md","skills/sitemap-valid/SKILL.md","skills/sitemap-valid/references/rule.md","skills/sitemap/SKILL.md","skills/sitemap/references/rule.md","skills/skip-link/SKILL.md","skills/skip-link/references/rule.md","skills/skip-navigation/SKILL.md","skills/skip-navigation/references/rule.md","skills/slug-keywords/SKILL.md","skills/slug-keywords/references/rule.md","skills/social-profiles/SKILL.md","skills/social-profiles/references/rule.md","skills/source-maps/SKILL.md","skills/source-maps/references/rule.md","skills/special-chars/SKILL.md","skills/special-chars/references/rule.md","skills/specificity-management/SKILL.md","skills/specificity-management/references/rule.md","skills/speculation-rules/SKILL.md","skills/speculation-rules/references/rule.md","skills/sprite-generation/SKILL.md","skills/sprite-generation/references/rule.md","skills/srcset/SKILL.md","skills/srcset/references/rule.md","skills/stack-trace-exposure/SKILL.md","skills/stack-trace-exposure/references/rule.md","skills/stop-words/SKILL.md","skills/stop-words/references/rule.md","skills/streaming-html/SKILL.md","skills/streaming-html/references/rule.md","skills/structured-data/SKILL.md","skills/structured-data/references/rule.md","skills/styles-lint/SKILL.md","skills/styles-lint/references/rule.md","skills/subgrid/SKILL.md","skills/subgrid/references/rule.md","skills/subresource-integrity/SKILL.md","skills/subresource-integrity/references/rule.md","skills/svg-inline/SKILL.md","skills/svg-inline/references/rule.md","skills/svg-optimization/SKILL.md","skills/svg-optimization/references/rule.md","skills/tabindex/SKILL.md","skills/tabindex/references/rule.md","skills/table-duplicate-name/SKILL.md","skills/table-duplicate-name/references/rule.md","skills/table-headers/SKILL.md","skills/table-headers/references/rule.md","skills/tabs-accessibility/SKILL.md","skills/tabs-accessibility/references/rule.md","skills/td-headers-attr/SKILL.md","skills/td-headers-attr/references/rule.md","skills/tel-mailto/SKILL.md","skills/tel-mailto/references/rule.md","skills/terms-of-service/SKILL.md","skills/terms-of-service/references/rule.md","skills/test-coverage/SKILL.md","skills/test-coverage/references/rule.md","skills/text-expansion/SKILL.md","skills/text-expansion/references/rule.md","skills/text-in-images/SKILL.md","skills/text-in-images/references/rule.md","skills/text-resizing/SKILL.md","skills/text-resizing/references/rule.md","skills/th-has-data-cells/SKILL.md","skills/th-has-data-cells/references/rule.md","skills/third-party-cookies/SKILL.md","skills/third-party-cookies/references/rule.md","skills/third-party-scripts/SKILL.md","skills/third-party-scripts/references/rule.md","skills/title-unique/SKILL.md","skills/title-unique/references/rule.md","skills/token-storage-security/SKILL.md","skills/token-storage-security/references/rule.md","skills/touch-targets/SKILL.md","skills/touch-targets/references/rule.md","skills/trailing-slash/SKILL.md","skills/trailing-slash/references/rule.md","skills/translation-strings/SKILL.md","skills/translation-strings/references/rule.md","skills/trust-signals/SKILL.md","skills/trust-signals/references/rule.md","skills/ttfb/SKILL.md","skills/ttfb/references/rule.md","skills/twitter-cards/SKILL.md","skills/twitter-cards/references/rule.md","skills/type-coercion/SKILL.md","skills/type-coercion/references/rule.md","skills/type-only-imports/SKILL.md","skills/type-only-imports/references/rule.md","skills/typescript-strict-mode/SKILL.md","skills/typescript-strict-mode/references/rule.md","skills/unique-id/SKILL.md","skills/unique-id/references/rule.md","skills/unit-tests/SKILL.md","skills/unit-tests/references/rule.md","skills/unused-css/SKILL.md","skills/unused-css/references/rule.md","skills/video-accessibility/SKILL.md","skills/video-accessibility/references/rule.md","skills/video-captions/SKILL.md","skills/video-captions/references/rule.md","skills/video-optimization/SKILL.md","skills/video-optimization/references/rule.md","skills/video-thumbnail/SKILL.md","skills/video-thumbnail/references/rule.md","skills/video/SKILL.md","skills/video/references/rule.md","skills/view-transitions/SKILL.md","skills/view-transitions/references/rule.md","skills/viewport-zoom/SKILL.md","skills/viewport-zoom/references/rule.md","skills/viewport/SKILL.md","skills/viewport/references/rule.md","skills/visual-regression/SKILL.md","skills/visual-regression/references/rule.md","skills/w3c-compliant/SKILL.md","skills/w3c-compliant/references/rule.md","skills/weak-internal-links/SKILL.md","skills/weak-internal-links/references/rule.md","skills/web-app-manifest/SKILL.md","skills/web-app-manifest/references/rule.md","skills/web-storage/SKILL.md","skills/web-storage/references/rule.md","skills/webfont-format/SKILL.md","skills/webfont-format/references/rule.md","skills/webp-format/SKILL.md","skills/webp-format/references/rule.md","skills/webpagetest/SKILL.md","skills/webpagetest/references/rule.md","skills/website-search/SKILL.md","skills/website-search/references/rule.md","skills/word-count/SKILL.md","skills/word-count/references/rule.md","skills/x-content-type/SKILL.md","skills/x-content-type/references/rule.md","skills/x-frame-options/SKILL.md","skills/x-frame-options/references/rule.md","skills/ymyl-detection/SKILL.md","skills/ymyl-detection/references/rule.md","skills/zoom-reflow/SKILL.md","skills/zoom-reflow/references/rule.md"],"skills":{".agents/plugins/marketplace.json":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=.agents%2Fplugins%2Fmarketplace.json -->",".claude-plugin/marketplace.json":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=.claude-plugin%2Fmarketplace.json -->","AGENTS.md":"# AGENTS.md — Front-End Checklist\n\nRepository rules and conventions for contributors and automation tools.\n\n## Project Overview\n\n**Front-End Checklist** is an open-source monorepo providing 385 quality-gated frontend best practice rules with an MCP server for structured review workflows.\n\n- **MCP Server**: `https://mcp.frontendchecklist.io` (11 tools)\n- **Rules**: `packages/content/rules/en/<category>/<slug>.mdx`\n- **Web App**: `apps/web/` (Next.js App Router)\n- **MCP Package**: `packages/mcp/` (TypeScript)\n- **Package Manager**: pnpm (workspaces + Turborepo)\n\n## Work Tracking\n\nWork in this repo is tracked in Paperclip project **FEC** (Front-End Checklist, id `c5edfe8f-731b-43e8-b805-c52999831084`). New tickets get the `DAV-` prefix.\n\n## MCP Usage\n\nWhen working on frontend implementation, review, debugging, or audit tasks, use the Front-End Checklist MCP server when available so recommendations stay grounded in the project rule corpus.\n\n- Use `review_code` first for pasted or inspected HTML, CSS, JavaScript, TypeScript, React, or Next.js code.\n- Use `search_rules` before making accessibility, performance, SEO, security, image, privacy, i18n, or testing recommendations.\n- Use `get_rule`, `check_rule`, `fix_rule`, or `explain_rule` for rule-specific guidance and remediation.\n- Use `get_workflow` or `get_checklist_rules` for broad launch, accessibility, SEO, security, performance, and testing audits.\n- Use `audit_url` for public `https://` pages.\n\nSome clients lazy-load installed MCP tools. If the tools are not initially visible, search for or explicitly request the Front-End Checklist MCP before proceeding with frontend work.\n\n## Monorepo Structure\n\n```\napps/\n  web/                    # Next.js app (App Router)\npackages/\n  mcp/                    # MCP server implementation\n  content/                # Rules MDX content + content-collections config\n  auth/                   # Better-Auth + Prisma + Supabase\n  design-system/          # Shared UI components\n  types/                  # Shared TypeScript types\n  data-layer/             # Data access layer\n  schemas/                # Zod v4 schemas\n```\n\n## Rule MDX Frontmatter Spec\n\nRules live at `packages/content/rules/en/<category>/<slug>.mdx`.\n\n### Required Fields\n\n```yaml\n---\ntitle: \"Human-readable rule title (string, use quotes)\"\ndescription: \"One-sentence description of what to do\"\ncategories: ['html']           # Array; first item = primaryCategory\npriority: 'high'               # 'critical' | 'high' | 'medium' | 'low'\ndifficulty: 'beginner'         # 'beginner' | 'intermediate' | 'advanced' | 'expert'\nestimatedTime: 15              # Minutes as integer\nprompts:\n  check: \"Prompt for checking whether the implementation follows this rule\"\n  fix: \"Prompt for fixing the issue\"\n  explain: \"Prompt for explaining why this rule matters\"\n---\n```\n\n### Recommended Fields\n\nThese fields are not required by the parser, but they materially improve rule quality, MCP usefulness, and generated skills.\n\n```yaml\nsubcategory: 'keyboard'        # Sub-grouping within category\ntldr:                          # Array of bullet points (used in llms.txt)\n  - \"Key point one\"\n  - \"Key point two\"\nwhyItMatters: \"Paragraph explaining the business/user impact\"\nsources:\n  - title: \"MDN or spec page title\"\n    url: \"https://...\"\n    type: \"mdn|spec|guide|wcag|google\"\n    id: \"stable-source-id\"\n    role: \"standard|reference|implementation|compatibility|regulation|search|research\"\n    authority: \"primary|secondary\"\nresources:\n  - name: \"Supplementary tool or article\"\n    url: \"https://...\"\n    type: \"tool|article|reference\"\nrelatedRules:\n  - slug: other-rule-slug\n    reason: \"Why these rules relate\"\ntools:\n  - name: \"Tool Name\"\n    url: \"https://...\"         # or null\ntags: ['wcag', 'performance']\nprompts:\n  codeReview: \"Recommended prompt for systematic code review context\"\naiContext: \"Additional context for automated review about when this rule applies\"\n```\n\nAuthoring placement rules:\n\n- Put authoritative citations in `sources`, not in body prose like `Reference: ...`\n- `sources` are proof metadata, not generic further reading. Every rule needs at least 2 sources, 2 source roles, and 1 `authority: primary`.\n- `resources` are for further reading or tools only. Do not map evidence claims to `resources`.\n- The system may infer or normalize `id`, `role`, and `authority` for sources at build time; authors should focus on strong, relevant sources rather than maintaining claim-by-claim proof objects.\n- Put cross-rule navigation in `relatedRules`, not in body prose like `See also ...`\n- Keep intro paragraphs focused on the rule itself; metadata should render from frontmatter-driven UI\n\nInline link contract:\n\n- Natural inline links inside body prose are allowed when they support a specific claim, comparison, or implementation recommendation.\n- Prefer light-touch density: usually `2-5` inline links per rule, with `0-1` in the intro and `1-3` across the main guidance sections.\n- Prefer external links over internal ones; internal rule links should usually stay at `0-1`, with `2` only for unusually interconnected rules.\n- Keep standalone metadata lines out of the body. Do not add paragraphs that start with `See also ...` or `Reference: ...`.\n- Keep evergreen proof in `sources`, and use newer inline external articles only when they add practical or recent context that the primary sources do not cover alone.\n- When a named tool is mentioned in prose for the first meaningful time (for example `Screaming Frog` or `Google Search Console`), link that first mention if the tool materially helps the reader and already exists in `resources` or `tools`.\n- Approved secondary inline links should stay curated. Prefer strong platforms such as `CSS-Tricks`, `Smashing Magazine`, `Nielsen Norman Group`, `WebAIM`, `Screaming Frog`, `Sitebulb`, `Moz`, or `Yoast` when they add practical implementation context.\n- Use descriptive anchor text tied to the sentence claim, not generic labels like “read more”.\n\n`impact`, `standards`, and `automation` are intentionally not part of the active rule-writing contract right now. The current corpus and tooling do not consume them consistently enough to justify treating them as standard authoring fields.\n\n## Canonical Rule Shape\n\nNew and refreshed rules should follow this structure unless there is a strong reason not to:\n\n1. Short intro paragraph explaining the rule in plain language\n2. `## Code Example` or `## Code Examples`\n3. `## Why It Matters`\n4. Optional implementation or guidance sections\n5. `## Verification`\n\nCanonical ordering rules:\n\n- `## Code Example` or `## Code Examples` must appear before `## Why It Matters`\n- `## Why It Matters` must appear before `## Verification`\n- `## Verification` must be the final H2 in the rule body\n- Optional H2 sections belong between `## Why It Matters` and `## Verification`\n\nPreferred optional H2 taxonomy:\n\n- `## Best Practices`\n- `## Common Mistakes`\n- `## Framework Examples`\n- `## Tools & Validation`\n- `## Thresholds`\n- `## Exceptions`\n- `## Browser Support`\n- `## Support Notes`\n- `## Standards`\n- `## Implementation Notes`\n\nThe validator reports headings outside this preferred taxonomy so section sprawl stays visible over time.\n\nRule Contract V2 adds three conditional concepts:\n\n- `## Exceptions` for nuanced rules, false positives, or valid caveats\n- `### Automated Checks` and `### Manual Checks` inside `## Verification` when both matter\n- a short visible standards/support note for compatibility-sensitive or compliance-sensitive rules\n\nApply these conditionally, not universally.\n\nBrowser support guidance should be derived from the repo browser policy in `.browserslistrc` plus package-backed compatibility data, not from memory.\n\nUse explicit thresholds whenever the rule is measurable:\n\n- Web Vitals and performance metrics (`LCP <= 2.5s`, `CLS <= 0.1`, bundle or image size budgets)\n- Accessibility measurements (contrast ratios, target sizes, zoom or reflow thresholds)\n- SEO and crawling states (indexability, status codes, canonical-url behavior)\n- Security headers and transport requirements\n\nPrefer “how to verify” guidance over generic advice. A strong rule should tell an engineer exactly how to confirm the rule passes.\n\n### Common Mistakes to Avoid\n\n- **Unquoted colons in YAML**: Always quote strings containing `:` — e.g. `title: \"Use rel: new-tab\"` not `title: Use rel: noopener`\n- **Stub prompts**: Prompts must be actionable. Bad: `\"Check this rule\"`. Good: `\"Find all <img> elements missing an alt attribute in this HTML\"`\n- **Missing sources**: Add at least one authoritative reference (`MDN`, `W3C/WCAG`, specs, `web.dev`, or product docs) before considering a rule complete\n- **No verification path**: Include a final `## Verification` section so the fix is testable\n- **Verification not last**: Do not place additional H2 sections after `## Verification`\n- **Missing caveats**: Add `## Exceptions` when the rule has important false positives or valid exceptions\n- **Missing support note**: Add `## Browser Support`, `## Support Notes`, or a visible standards note when compatibility or compliance changes implementation decisions\n- **Wrong priority**: `critical` = site-breaking / security / legal. `high` = significantly degrades UX. `medium` = best practice. `low` = nice-to-have\n- **Missing required fields**: All 7 required fields must be present; builds fail otherwise\n- **Emoji in titles**: Titles should be plain text (no emoji)\n\n## Category Taxonomy\n\nValid values for the `categories` array:\n\n| Slug | Description |\n|------|-------------|\n| `html` | Document structure, semantics, forms |\n| `css` | Layout, typography, animation, responsive |\n| `javascript` | Client-side scripting, async, security |\n| `performance` | Loading speed, rendering, Core Web Vitals |\n| `accessibility` | WCAG, ARIA, keyboard, screen readers |\n| `seo` | Meta tags, structured data, crawlability |\n| `security` | HTTPS, CSP, XSS prevention, headers |\n| `images` | Optimization, formats, responsive images |\n| `testing` | Unit, integration, e2e, a11y testing |\n| `privacy` | Consent, data minimisation, data rights |\n| `i18n` | Localization, pluralization, bidi, locale formatting |\n| `general` | Cross-cutting best practices |\n\n## Quality Scoring Rubric\n\nRules are scored automatically via `pnpm score:rules` (100-point base score plus up to 12 conditional points, minimum 50 to pass the current quality gate).\n\n| Dimension | Points | What to Check |\n|-----------|--------|---------------|\n| Prompts (`check`/`fix`/`explain`) | 24 | All 3 prompts are specific and non-generic |\n| TLDR bullets | 4 | 3+ actionable bullets |\n| Why it matters | 4 | Explains user, business, or operational impact |\n| AI context | 6 | Captures where and when the rule applies in automated reviews |\n| Related rules | 6 | Links adjacent rules with clear reasons |\n| Sources | 10 | Includes authoritative references |\n| Resources / tools | 6 | Includes useful supporting docs or tools |\n| Code review prompt | 6 | Provides a systematic review strategy |\n| Code examples | 10 | Includes realistic examples, not just prose |\n| Body depth | 10 | Provides substantive implementation detail |\n| Verification section | 8 | Includes `Verification`, `Testing`, `Audit Checklist`, or equivalent |\n| Thresholds / pass-fail criteria | 6 | Uses explicit numbers or conditions where the rule is measurable |\n| Exceptions (conditional) | 4 | Adds an `Exceptions` section when the rule is nuanced or false-positive-prone |\n| Verification split (conditional) | 4 | Splits verification into automated and manual checks when both apply |\n| Standards/support visibility (conditional) | 4 | Adds a visible threshold, standards note, or support note when required by the rule type |\n\nRules scoring < 50 are excluded from MCP tool responses and the web UI.\n\n## Adding or Updating a Rule\n\n1. Create `packages/content/rules/en/<category>/<slug>.mdx`\n2. Fill all required frontmatter fields\n3. Add recommended metadata: `sources`, `resources`, `aiContext`, `relatedRules`, and `prompts.codeReview` where applicable\n4. Write the rule using the canonical-url structure (intro, examples, why it matters, verification, category-specific guidance)\n5. Run `pnpm score:rules` — must score ≥ 50 for now; target 60+ for new work\n6. Run `pnpm validate:rule-structure` — validates rule section order and final `Verification` heading\n7. Run `pnpm report:rule-links` — reviews inline-link density and suggests safe internal/external candidates\n8. Run `pnpm validate:sources` — validates external URLs\n9. Run `pnpm generate:skills` — regenerates skills index\n\n## Scripts Reference\n\n```bash\npnpm score:rules          # Score all rules; flags < 50 quality gate failures\npnpm validate:rule-structure  # Validate rule heading structure and report drift\npnpm report:v2-gaps       # Report conditional V2 gaps by category and migration batch\npnpm report:rule-links    # Review inline-link density and candidate internal/external links\npnpm generate:exceptions-hints  # Dry-run suggestions for missing Exceptions sections\npnpm generate:support-notes  # Dry-run support-note suggestions from browser data\npnpm generate:verification-split  # Dry-run Verification split suggestions\npnpm validate:sources     # Validate external URLs in rule frontmatter\npnpm validate:packages    # Check package dependency consistency\npnpm generate:skills      # Regenerate skills/ directory from rules\npnpm build                # Full monorepo build (via Turborepo)\npnpm typecheck            # TypeScript check across all packages\npnpm lint                 # Biome lint\npnpm lint:fix             # Biome lint with auto-fix\n```\n\n## MCP Tool Development\n\nNew MCP tools go in `packages/mcp/src/tools/<tool-name>.ts` and must be:\n\n1. Exported from `packages/mcp/src/tools/index.ts`\n2. Added to `BASE_TOOL_DEFINITIONS` in `packages/mcp/src/server.ts`\n3. Added as a `case` in the `handleToolsCall` switch in `server.ts`\n\nTool definition shape:\n```typescript\nexport const myToolDefinition = {\n  name: 'my_tool',\n  description: '...',  // Critical for tool discoverability — be specific\n  inputSchema: {\n    type: 'object' as const,\n    properties: { ... },\n    required: ['fieldName'],\n  },\n}\n```\n\n## Workspace Architecture Notes\n\n- **Auth**: Better-Auth + Prisma + Supabase Postgres in `packages/auth/`\n- **Validation**: Zod v4 — use `.issues` not `.errors` on `ZodError`\n- **Forms**: `@tanstack/react-form` with manual Zod validation on submit\n- **Email**: Resend SDK v6, sending domain `mail.frontendchecklist.io`\n- **Rate limiting**: `@upstash/ratelimit` + `@upstash/redis` in `apps/web/lib/rate-limit.ts`\n- **Query**: TanStack Query v5 with `getQueryClient()` factory (not singleton)\n- **Dev server**: `portless run next dev`\n\n## Learned User Preferences\n\n- Put shared concerns (e.g. fonts, typography) in the design system and import from there; apps wire implementation (e.g. next/font) using config from the design system.\n- Do not use `suppressHydrationWarning`; fix server/client mismatch (e.g. defer client-only state until after mount).\n- Reuse existing components instead of creating page-specific variants (e.g. shared `FAQAccordion` for any FAQ section, `.code-block`/`.code-inline` for all code display, ChecklistActionBar instead of new progress bars). When adding a feature to one page type, add it to all relevant page types (e.g. ShareButton on category, rule detail, and all-rules pages).\n- Rule row: click on rule title toggles completion; expand/collapse only via the plus/minus icon. Expanded content shows description first, then tags and action buttons on one row aligned with the description.\n- Prefer Tailwind utility classes in components over custom CSS classes in globals.css.\n- Use a scalable overrides map for special-case labels (e.g. subcategory aria → ARIA) instead of hardcoded conditionals.\n- Do not use `git commit --no-verify`; fix ALL pre-commit violations (JSDoc, as-casts, barrel files, complexity, relative imports) rather than deferring or working around them. Write JSDoc at the same time as the code, not as a batch fix later.\n- **Card-style links**: Use the stretched-link pattern: the `<a>`/`<Link>` wraps **only the title text** inside a heading and uses `after:absolute after:inset-0 after:content-[\"\"]` so its `::after` pseudo-element expands to fill the card container (`position: relative`). Secondary interactive elements need `relative z-10`. See `docs/card-links.md`.\n- Centralize all icons in `@repo/design-system`: brand icons in `brand-icons.tsx`, Lucide re-exported from `icons.ts`. Use official brand icons (`@icons-pack/react-simple-icons`) for branded services, not Lucide approximations. Consumers never import directly from `lucide-react`.\n- Never use Tailwind opacity modifiers (`/50`, `/60`, `/70`) on semantic theme text colors like `text-foreground-muted` — it crushes contrast in light mode. Use the appropriate token (`text-foreground-muted`, `text-foreground-subtle`) at full opacity instead.\n- Always refer to the social platform as \"X\", never \"Twitter\". Schema fields use `xUrl` (not `twitterUrl`), UI labels say \"X\", and URLs point to `x.com`.\n- About page link belongs in the footer only, not in the main navbar.\n\n## Learned Workspace Facts\n\n- Fluid typography tokens use `clamp()` in `@theme inline` for `text-base` and above; `text-xs` and `text-sm` stay fixed for compact UI controls (buttons, badges, inputs, tooltips).\n- next/font: apply each font’s `.className` to the document element (not `.variable`); Next.js requires literal option objects, so the app must inline font options while the design system can document them.\n- Do not apply client-side bot protection (e.g. Vercel BotID) to programmatic API endpoints like MCP; use it only for browser-originated form and mutation endpoints.\n- Next.js reads next.config.js at startup; restart the dev server after changing it (e.g. images.remotePatterns). `withContentCollections` returns a Promise (async config) so it must be the outermost wrapper — `export default withContentCollections(withBotId(nextConfig))`. `withBotId` does not handle async configs and will silently drop all properties including `images`.\n- Tailwind preflight resets `list-style` on `ul`/`ol`; `.prose` styles must explicitly set `list-style-type: disc` (ul), `decimal` (ol), and nested variants (`circle`, `lower-alpha`).\n- CSS custom properties use OKLCH color format. Light mode tokens need visible contrast on all screens: `--border` at least oklch(0.885), `--foreground-subtle` at oklch(0.64), shadows at 0.06+ opacity. Use `color-mix(in oklch, var(--token) N%, transparent)` for theme-aware transparent colors instead of hardcoded `rgba()`.\n- Pre-commit hooks (lefthook) enforce: biome check, JSDoc, no-as-casts, no-barrel-files, file-complexity (300 lines React / 500 lines other), no-deep-relative-imports, no-console-logs, test coverage.\n- Button default variant uses `bg-accent text-accent-foreground hover:bg-accent-hover` (project's accent tokens), not shadcn's `bg-primary`; keep project-specific semantic tokens in component variants even when shadcn aliases exist.\n- Scripts are organized in subfolders: `scripts/{validation,generate,rule-structure,validate,audit}/`; `scripts/README.md` documents each script and subfolder.\n- Biome's `useSortedClasses` only sorts class **order**; it cannot rename deprecated classes. Use `@tailwindcss/upgrade` (installed in `apps/web`) to canonicalize class names project-wide.\n- Monorepo uses pnpm catalogs (`catalog:` in `pnpm-workspace.yaml`) for centralized dependency versions; shared deps appearing in 2+ packages use `catalog:` instead of hardcoded version strings.\n- Brand icons (ChatGPT, Claude, X, LinkedIn, Reddit, Cursor, VSCode) live in `packages/design-system/src/brand-icons.tsx` and are re-exported from the design-system barrel.\n\n<!-- BEGIN:turborepo-agent-rules -->\n\n# This is NOT the Turborepo you know\n\nTurborepo configuration, task behavior, and CLI commands can vary between installed versions and may differ from your training data. Resolve the `turbo` package from this file's directory or relevant workspace; in monorepos, it may not be visible from the repository root. For example, run `node -p \"require.resolve('turbo/package.json')\"` from a workspace that depends on `turbo`.\n\nRead `docs/README.md` inside that installed package first, then read the relevant pages from its `docs/` directory before changing Turborepo configuration or commands. Heed deprecation notices. These bundled docs match the installed package version and are available without network access.\n\nThis block is written and re-added by `turbo` before repository-scoped commands when an AI agent is detected. In the Turborepo source repository, its template is defined in `crates/turborepo-cli/src/cli/agent_guidance.rs`. Removing the managed block while updates are enabled means a later qualifying invocation will add it again. Set `\"agentGuidance\": false` in the root `turbo.json` or `turbo.jsonc` to opt out; this does not remove an existing block. Keep the block committed with your work to avoid an uncommitted change on the next agent invocation.\n<!-- END:turborepo-agent-rules -->\n","CLAUDE.md":"# Project Guidance\n\nUse [AGENTS.md](AGENTS.md) for repository conventions, workflows, and tool setup.\n\nLocal Claude Code session state belongs in `.claude/`, which is ignored by git and should not be committed.\n","packages/analytics/README.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Fanalytics%2FREADME.md -->","packages/cli/README.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Fcli%2FREADME.md -->","packages/cli/SKILL.md":"---\nname: frontendchecklist\ndescription: Review frontend code and live pages against the Front-End Checklist (380+ rules for accessibility, performance, SEO, security, HTML, CSS, JavaScript, images, i18n, privacy, testing) using the `frontendchecklist` CLI. Use when writing, reviewing, or shipping HTML/CSS/JS/JSX/TSX/Vue/Svelte/Astro code, before a commit or PR, or when asked to audit a public URL.\n---\n\n# Front-End Checklist CLI\n\n`frontendchecklist` checks frontend code against the Front-End Checklist rules. It works offline,\nprints JSON when its output is piped (which is how you will usually call it), and uses exit codes\nyou can branch on.\n\nRun it with `npx -y @frontendchecklist/cli <command>` if `frontendchecklist` is not installed.\n\n## When to use it\n\n- After writing or editing frontend files: `frontendchecklist review <paths>`.\n- Before committing: `git diff --cached | frontendchecklist review -`.\n- When the user asks to audit a deployed page: `frontendchecklist audit https://...`.\n- When you need the authoritative guidance for a topic: `frontendchecklist search <topic>`, then\n  `frontendchecklist rule <slug>`.\n- For a structured pass (launch, accessibility, SEO, performance): `frontendchecklist checklists`,\n  then `frontendchecklist checklist <slug>`.\n\n## Commands\n\n| Command | Purpose |\n| --- | --- |\n| `review <paths...\\|->` | Static review of files, directories (walked; vendor dirs skipped), or stdin |\n| `audit <https-url>` | Fetch a public page and review its HTML |\n| `search [query] [--focus a,b] [-n 10]` | Find rules by keyword, technology, or category |\n| `rule <slug>` | Why a rule matters, how to check it, how to fix it |\n| `checklists` / `checklist <slug>` | Curated checklists and their rules |\n| `categories` | Categories with rule counts |\n| `schema` | Full command reference as JSON |\n\nUseful flags: `--focus accessibility,seo`, `--min-priority high`, `--fail-on high`.\n\n## Reading results\n\n- `review` and `audit` return `{ findings: [{ target, rule, title, priority, issue, fix? }], failing }`.\n- Exit code `0`: fine. `1`: findings at or above `--fail-on`. `2`: bad input or runtime error, with\n  `{ \"error\": \"...\" }` on stdout.\n- Findings are conservative static heuristics. \"No findings\" means nothing provable was found, not\n  that the code is clean: follow up with `search`/`rule` for areas the heuristics cannot see\n  (rendered contrast, focus order, real performance).\n\n## Workflow\n\n1. `frontendchecklist review <changed files> --min-priority medium`\n2. For each finding, run `frontendchecklist rule <rule>` and apply its fix guidance.\n3. Re-run the review until no critical/high findings remain (`--fail-on high` exits 0).\n4. Mention any remaining medium/low findings to the user instead of silently ignoring them.\n","packages/rules/README.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Frules%2FREADME.md -->","plugins/front-end-checklist/.claude-plugin/plugin.json":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2F.claude-plugin%2Fplugin.json -->","plugins/front-end-checklist/.codex-plugin/plugin.json":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2F.codex-plugin%2Fplugin.json -->","plugins/front-end-checklist/README.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2FREADME.md -->","plugins/front-end-checklist/skills/frontend-checklist-global/SKILL.md":"---\nname: frontend-checklist-global\ndescription: \"Use when auditing or improving any frontend codebase against the full Front-End Checklist rule corpus through one entry point.\"\nmetadata:\n  category: global\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"30\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/mcp\n---\n\n# Front-End Checklist Global Audit\n\nThis skill connects one entry point to all 386 Front-End Checklist rules.\nUse MCP retrieval instead of trying to recall rules from memory.\n\n## Workflow\n\n1. Start with `review_code` for pasted code, file contents, or focused code review.\n2. Use `audit_url` for a public page when you need rendered HTML audited quickly.\n3. Narrow or expand scope with `search_rules`, `list_categories`, `get_workflow`, or `get_quick_reference`.\n4. For each issue, use `get_rule`, `fix_rule`, or `explain_rule` to give exact remediation.\n5. If a checklist is a better fit than ad hoc search, use `get_checklist_rules`.\n\n## Audit Stance\n\n- Be conservative. Prefer fewer, stronger findings over speculative breadth.\n- Only report an issue when the code or markup shown supports it directly.\n- In small component or route audits, prefer the strongest 1-2 supported findings over listing every possible enhancement.\n- Do not infer business intent from a snippet alone. Example: do not assume a field is required unless the code or surrounding copy makes that explicit.\n- Do not treat `alt=\"\"` as an issue by default; empty alt can be correct for decorative images.\n- When an image is explicitly decorative, prefer zero findings unless the snippet shows a concrete problem rather than a hypothetical optimization.\n- If you see an isolated decorative image like `<img ... alt=\"\" aria-hidden=\"true\">`, treat it as a zero-issue pattern unless the snippet also shows real evidence of layout instability.\n- Do not raise low-confidence preference tweaks as findings when the snippet is otherwise sound. Prefer silence over weak nitpicks.\n- Do not treat `autocomplete=\"off\"` as a defect by itself unless the snippet shows a stronger user-harm or security reason to flag it.\n- In link-preview cards, decorative preview images and favicons may be safe when nearby visible text already names the destination.\n- Do not treat React or JSX fragments as full HTML documents unless the snippet includes real document context like `<html>`, `<head>`, or `<body>`.\n- When reviewing Next.js or metadata-driven page files, consider `metadata`, `viewport`, and `generateMetadata` APIs before claiming head-tag omissions.\n\n## Coverage Checklist\n\n- Forms: check labels, accessible button names, explicit button types, `autocomplete` hints, password-field autocomplete, and validation semantics that are explicit in the code.\n- Images: check `width`/`height`, `loading`, `srcset`/`sizes`, and whether image semantics are clearly meaningful or decorative. Do not assume tiny SVG logos or clearly decorative assets must be lazy-loaded, and do not demand explicit dimensions for tiny ornamental dividers unless the snippet shows a real layout-shift risk. If an image is both decorative and hidden from assistive tech, bias strongly toward no finding.\n- Metadata: check title placement, canonical-url behavior, meta descriptions, Open Graph coverage, and structured data only when the file is responsible for metadata.\n- Motion: check expensive animated properties, prefer transform/opacity, and require `prefers-reduced-motion` handling for persistent motion.\n- Motion: when counters or visual widgets animate every frame, assess both reduced-motion support and whether the animation strategy adds unnecessary main-thread work.\n- Security: check `target=\"_blank\"` links for `noopener noreferrer`, insecure form actions, password input best practices, and blocking third-party scripts.\n- Structure: check duplicate ids, list semantics, and table headers conservatively. For simple tables, column-header associations are stronger findings than speculative row-header or outer-layout landmark issues.\n- Structure: when a visible heading already introduces a simple table, treat missing captions as a lower-confidence improvement than missing header associations.\n\n## Rule-Derived Highlights\n\n### Set explicit width and height on images\n- Reserve findings for meaningful content images; decorative micro-SVGs or ornament-only assets are low-priority exceptions when CSS already reserves stable space\n- Example low-risk exception: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` should not be flagged on its own without evidence of visible layout shift\n- Always set `width` and `height` attributes on `<img>` matching the image's intrinsic dimensions\n- Pair with `height: auto` in CSS to keep the image fluid while preserving the aspect ratio\n- Missing dimensions are the leading cause of Cumulative Layout Shift (CLS) from images\n\n### Hide decorative elements from assistive technology\n- Use alt='' (empty) for decorative images—not alt='image' or missing alt\n- Add aria-hidden='true' to decorative SVGs and icons\n- Use CSS background-image for purely decorative visuals\n- Role='presentation' removes semantic meaning from elements\n- Do not automatically raise performance findings on decorative micro-assets unless the snippet shows real layout instability\n\n### Use transform and opacity for animations\n- Only transform and opacity can be composited on the GPU without triggering layout\n- Use will-change: transform sparingly to promote an element to its own compositor layer\n- Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n- Respect prefers-reduced-motion to disable animations for users who need it\n\n### Respect reduced motion preferences\n- Use prefers-reduced-motion media query to disable non-essential animations\n- Never flash content more than 3 times per second (seizure risk)\n- Replace motion with opacity/color transitions when reduced motion is enabled\n- Provide user controls to pause or disable animations\n\n### Use semantic table markup for screen readers\n- Use <th> elements for headers with scope='col' or scope='row'\n- Add <caption> to describe the table's purpose\n- Never use tables for layout—use CSS Grid or Flexbox instead\n- Use id/headers for complex tables with merged cells\n- For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n\n### Define proper table headers\n- Use `<th>` for all table headers, not `<td>`\n- Apply `scope=\"col\"` or `scope=\"row\"` to clarify header relationship\n- Ensure every data cell is associated with at least one header\n- In simple tables, prefer fixing header associations before escalating to caption-level recommendations\n- Missing `scope=\"col\"` on a straightforward header row is often the clearest first fix\n\n### Minimize costly DOM read/write operations\n- Never interleave DOM reads (offsetHeight, getBoundingClientRect) with DOM writes (style changes)\n- Batch all reads first, then all writes\n- Use requestAnimationFrame for visual updates\n- Use DocumentFragment or innerHTML for bulk DOM insertion\n- Avoid per-frame React state updates across many visible components when a simpler CSS or reduced-frequency approach would work\n\n### Validate forms accessibly\n- Associate error messages with fields using aria-describedby\n- Use aria-invalid to indicate validation state\n- Mark required fields programmatically with `required` or `aria-required`\n- Provide inline error messages near the field\n- Don't rely solely on color to indicate errors\n\n### Secure password input fields\n- Use type='password' with correct autocomplete attribute\n- Provide accessible show/hide toggle for password visibility\n- Show password strength indicator with requirements\n- Never store or transmit passwords in plain text\n- Support password managers with proper input names\n\n### Provide visible custom focus indicators\n- Never use outline: none or outline: 0 without a visible :focus-visible replacement\n- Use :focus-visible instead of :focus to show indicators only during keyboard navigation\n- Focus indicators must have 3:1 contrast ratio against adjacent colors (WCAG 2.2)\n- Provide at least 2px solid outline with an offset for a high-quality focus ring\n- If a focus ring is drawn with pseudo-elements, verify it is anchored to the correct positioned element and not clipped by `overflow: hidden`\n\n## Known Safe Patterns\n\n### Decorative Divider\n- Safe example: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">`\n- Treat this as a safe decorative pattern by default. Do not flag alt text or missing dimensions unless the snippet also shows a real layout-shift risk.\n\n### Client-Handled React Form\n- Safe example: `<form onSubmit={event => event.preventDefault()}><label htmlFor=\"q\">Search</label><input id=\"q\" type=\"search\" /></form>`\n- Do not require `method` or `action` when client-side submit handling is explicit and the form controls are otherwise accessible.\n\n### Next Metadata API\n- Safe example: `export async function generateMetadata() { return { title: 'Docs', description: 'Reference' } }`\n- Do not infer missing canonical-url, meta description, or Open Graph tags just because literal `<head>` markup is absent from the component file.\n\n### Preview Card Images\n- Safe example: `<img src={resource.image} alt=\"\" className=\"object-cover\" /><img src={favicon} alt=\"\" width={20} height={20} />`\n- In link-preview or resource-card UIs, decorative preview/favicons can legitimately use empty alt when adjacent text already provides the destination name. Do not invent responsive-image or layout-shift defects for tiny favicon assets without stronger evidence.\n\n### Aspect-Ratio Media Wrapper\n- Safe example: `<div className=\"aspect-2/1 overflow-hidden\"><img className=\"object-cover w-full h-full\" ... /></div>`\n- When a wrapper already reserves media space with a stable aspect ratio, do not automatically raise a missing dimensions finding for the child preview image.\n\n### Pseudo-Element Focus Ring\n- Safe example: `focus-visible:outline-none focus-visible:after:ring-2 after:absolute after:inset-0`\n- If focus styling depends on a pseudo-element, verify the ring is anchored to the correct positioned element. A removed native outline is only safe when the replacement ring is clearly reliable.\n\n### Per-Frame React Counter Animation\n- Safe example: `requestAnimationFrame(animate); setCount(Math.floor(eased * target))`\n- Repeated requestAnimationFrame state updates across multiple components are a concrete performance concern when shown directly in the code.\n\n### Simple Data Table Headers\n- Safe example: `<thead><tr><th>Priority</th><th>Rule</th><th>Title</th></tr></thead>`\n- For simple data tables, prefer conservative column-header findings before speculating about row headers or outer-layout landmarks.\n\n### Adjacent Heading + Table\n- Safe example: `<h2>Issues</h2><table><thead>...</thead><tbody>...</tbody></table>`\n- A nearby visible section heading may already provide table context. Prefer scope/header association findings before requiring a caption unless the table purpose is ambiguous.\n\n## Conflict Resolution\n\n- If decorative-image guidance and dimensions guidance conflict, decorative guidance wins unless the snippet shows visible layout instability.\n- Example zero-issue pattern: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` in an isolated component should not be flagged for alt text or dimensions unless the snippet also shows real layout-shift evidence.\n- If a form is clearly handled client-side with `onSubmit`, do not require traditional server-post `method` or `action` attributes.\n- If a file uses Next.js metadata APIs, do not infer missing head tags from the absence of literal `<meta>` or canonical-url markup.\n\n## Coverage\n\n- accessibility: 89 rules (9 critical, 25 high)\n- css: 31 rules (10 high)\n- html: 34 rules (3 critical, 12 high)\n- i18n: 5 rules\n- images: 25 rules (1 critical, 15 high)\n- javascript: 26 rules (1 critical, 12 high)\n- performance: 43 rules (1 critical, 22 high)\n- privacy: 5 rules (2 high)\n- security: 22 rules (4 critical, 10 high)\n- seo: 93 rules (19 high)\n- testing: 13 rules (7 high)\n\n## Evaluation Standard\n\n- Prefer findings tied to exact files, routes, selectors, or code snippets.\n- Prioritize critical and high issues first.\n- Explain uncertainty instead of overstating when the snippet does not show enough context.\n- Avoid generic advice when the MCP tools can retrieve a rule or fix prompt.\n- When no issue is found automatically, use `search_rules` to broaden review coverage before concluding clean.\n\n---\n\nSee `references/categories.md` for category coverage and tool routing.\n\nMCP docs: https://frontendchecklist.io/mcp\n","plugins/front-end-checklist/skills/frontend-checklist-global/references/categories.md":"# Front-End Checklist Global Skill Reference\n\nThis aggregate skill routes to the Front-End Checklist MCP tools across 386 rules.\n\n## Tool Routing\n\n| Goal | Preferred tool |\n| --- | --- |\n| Review pasted code or a single file | `review_code` |\n| Audit a public page | `audit_url` |\n| Find relevant rules by topic | `search_rules` |\n| Browse available categories | `list_categories` |\n| Get the full content for one rule | `get_rule` |\n| Get remediation guidance | `fix_rule` |\n| Explain impact to the user | `explain_rule` |\n| Pull a curated checklist at once | `get_checklist_rules` |\n| Start from a workflow or quick checklist | `get_workflow`, `get_quick_reference` |\n\n## Frontend Review Guardrails\n\n- Do not infer missing metadata from a component fragment that is not responsible for document head output.\n- Do not infer required fields, password policies, or decorative-image intent unless the code makes the intent explicit.\n- Favor exact evidence from the snippet over broad style advice.\n- When the snippet is a partial component, focus on what the component itself controls.\n\n## Rule-Derived Highlights\n\n- **Set explicit width and height on images**\n  Reserve findings for meaningful content images; decorative micro-SVGs or ornament-only assets are low-priority exceptions when CSS already reserves stable space\n  Example low-risk exception: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` should not be flagged on its own without evidence of visible layout shift\n  Always set `width` and `height` attributes on `<img>` matching the image's intrinsic dimensions\n  Pair with `height: auto` in CSS to keep the image fluid while preserving the aspect ratio\n  Missing dimensions are the leading cause of Cumulative Layout Shift (CLS) from images\n- **Hide decorative elements from assistive technology**\n  Use alt='' (empty) for decorative images—not alt='image' or missing alt\n  Add aria-hidden='true' to decorative SVGs and icons\n  Use CSS background-image for purely decorative visuals\n  Role='presentation' removes semantic meaning from elements\n  Do not automatically raise performance findings on decorative micro-assets unless the snippet shows real layout instability\n- **Use transform and opacity for animations**\n  Only transform and opacity can be composited on the GPU without triggering layout\n  Use will-change: transform sparingly to promote an element to its own compositor layer\n  Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n  Respect prefers-reduced-motion to disable animations for users who need it\n- **Respect reduced motion preferences**\n  Use prefers-reduced-motion media query to disable non-essential animations\n  Never flash content more than 3 times per second (seizure risk)\n  Replace motion with opacity/color transitions when reduced motion is enabled\n  Provide user controls to pause or disable animations\n- **Use semantic table markup for screen readers**\n  Use <th> elements for headers with scope='col' or scope='row'\n  Add <caption> to describe the table's purpose\n  Never use tables for layout—use CSS Grid or Flexbox instead\n  Use id/headers for complex tables with merged cells\n  For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n- **Define proper table headers**\n  Use `<th>` for all table headers, not `<td>`\n  Apply `scope=\"col\"` or `scope=\"row\"` to clarify header relationship\n  Ensure every data cell is associated with at least one header\n  In simple tables, prefer fixing header associations before escalating to caption-level recommendations\n  Missing `scope=\"col\"` on a straightforward header row is often the clearest first fix\n- **Minimize costly DOM read/write operations**\n  Never interleave DOM reads (offsetHeight, getBoundingClientRect) with DOM writes (style changes)\n  Batch all reads first, then all writes\n  Use requestAnimationFrame for visual updates\n  Use DocumentFragment or innerHTML for bulk DOM insertion\n  Avoid per-frame React state updates across many visible components when a simpler CSS or reduced-frequency approach would work\n- **Validate forms accessibly**\n  Associate error messages with fields using aria-describedby\n  Use aria-invalid to indicate validation state\n  Mark required fields programmatically with `required` or `aria-required`\n  Provide inline error messages near the field\n  Don't rely solely on color to indicate errors\n- **Secure password input fields**\n  Use type='password' with correct autocomplete attribute\n  Provide accessible show/hide toggle for password visibility\n  Show password strength indicator with requirements\n  Never store or transmit passwords in plain text\n  Support password managers with proper input names\n- **Provide visible custom focus indicators**\n  Never use outline: none or outline: 0 without a visible :focus-visible replacement\n  Use :focus-visible instead of :focus to show indicators only during keyboard navigation\n  Focus indicators must have 3:1 contrast ratio against adjacent colors (WCAG 2.2)\n  Provide at least 2px solid outline with an offset for a high-quality focus ring\n  If a focus ring is drawn with pseudo-elements, verify it is anchored to the correct positioned element and not clipped by `overflow: hidden`\n\n## Known Safe Patterns\n\n- **Decorative Divider**\n  Safe example: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">`\n  Treat this as a safe decorative pattern by default. Do not flag alt text or missing dimensions unless the snippet also shows a real layout-shift risk.\n- **Client-Handled React Form**\n  Safe example: `<form onSubmit={event => event.preventDefault()}><label htmlFor=\"q\">Search</label><input id=\"q\" type=\"search\" /></form>`\n  Do not require `method` or `action` when client-side submit handling is explicit and the form controls are otherwise accessible.\n- **Next Metadata API**\n  Safe example: `export async function generateMetadata() { return { title: 'Docs', description: 'Reference' } }`\n  Do not infer missing canonical-url, meta description, or Open Graph tags just because literal `<head>` markup is absent from the component file.\n- **Preview Card Images**\n  Safe example: `<img src={resource.image} alt=\"\" className=\"object-cover\" /><img src={favicon} alt=\"\" width={20} height={20} />`\n  In link-preview or resource-card UIs, decorative preview/favicons can legitimately use empty alt when adjacent text already provides the destination name. Do not invent responsive-image or layout-shift defects for tiny favicon assets without stronger evidence.\n- **Aspect-Ratio Media Wrapper**\n  Safe example: `<div className=\"aspect-2/1 overflow-hidden\"><img className=\"object-cover w-full h-full\" ... /></div>`\n  When a wrapper already reserves media space with a stable aspect ratio, do not automatically raise a missing dimensions finding for the child preview image.\n- **Pseudo-Element Focus Ring**\n  Safe example: `focus-visible:outline-none focus-visible:after:ring-2 after:absolute after:inset-0`\n  If focus styling depends on a pseudo-element, verify the ring is anchored to the correct positioned element. A removed native outline is only safe when the replacement ring is clearly reliable.\n- **Per-Frame React Counter Animation**\n  Safe example: `requestAnimationFrame(animate); setCount(Math.floor(eased * target))`\n  Repeated requestAnimationFrame state updates across multiple components are a concrete performance concern when shown directly in the code.\n- **Simple Data Table Headers**\n  Safe example: `<thead><tr><th>Priority</th><th>Rule</th><th>Title</th></tr></thead>`\n  For simple data tables, prefer conservative column-header findings before speculating about row headers or outer-layout landmarks.\n- **Adjacent Heading + Table**\n  Safe example: `<h2>Issues</h2><table><thead>...</thead><tbody>...</tbody></table>`\n  A nearby visible section heading may already provide table context. Prefer scope/header association findings before requiring a caption unless the table purpose is ambiguous.\n\n## Category Coverage\n\n- **accessibility**: 89 rules · 9 critical · 25 high\n- **css**: 31 rules · 10 high\n- **html**: 34 rules · 3 critical · 12 high\n- **i18n**: 5 rules\n- **images**: 25 rules · 1 critical · 15 high\n- **javascript**: 26 rules · 1 critical · 12 high\n- **performance**: 43 rules · 1 critical · 22 high\n- **privacy**: 5 rules · 2 high\n- **security**: 22 rules · 4 critical · 10 high\n- **seo**: 93 rules · 19 high\n- **testing**: 13 rules · 7 high\n\nRules browser: https://frontendchecklist.io/rules\nFull reference: https://frontendchecklist.io/llms-full.txt\n","skills/404-page/SKILL.md":"---\nname: 404-page\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Create a custom 404 error page. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: beginner\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/404-page\n---\n\n# Create a custom 404 error page\n\nA generic browser 404 page causes users to leave immediately—a well-designed custom page provides recovery paths and keeps users engaged with your site.\n\n## Quick Reference\n\n- Custom 404 pages retain users who encounter broken or moved links\n- Include search, navigation, and links to popular content\n- Maintain consistent branding and site design\n- Track 404 errors to identify and fix broken links\n- Return a real HTTP 404 so the page is not treated as a soft 404\n\n## Check\n\nVerify that this website has a custom 404 error page with helpful navigation options. Confirm the route returns HTTP 404 and not a branded page with a 200 response.\n\n## Fix\n\nCreate a user-friendly 404 page with search functionality and links to important pages. Ensure the server or framework returns status code 404 so the page does not become a soft 404.\n\n## Explain\n\nExplain how custom 404 pages help retain users who encounter broken links and why returning 200 for missing pages creates soft-404 indexing problems.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Create a custom 404 error page. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/404-page\n","skills/404-page/references/rule.md":"# Create a custom 404 error page\n\n> A custom 404 error page is designed with helpful navigation options for lost users.\n\n**Priority:** medium · **Difficulty:** beginner · **Time:** 20 min\n\n---\nCustom 404 pages transform dead ends into opportunities to guide users back to relevant content.\n\n## Code Example\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Page Not Found - Site Name</title>\n  <meta name=\"robots\" content=\"noindex\">\n</head>\n<body>\n  <main class=\"error-page\">\n    <h1>Page Not Found</h1>\n    <p>Sorry, the page you're looking for doesn't exist or has been moved.</p>\n\n    <!-- Search -->\n    <form action=\"/search\" method=\"GET\" role=\"search\">\n      <label for=\"search\">Search our site:</label>\n      <input type=\"search\" id=\"search\" name=\"q\" placeholder=\"What are you looking for?\">\n      <button type=\"submit\">Search</button>\n    </form>\n\n    <!-- Helpful links -->\n    <nav aria-label=\"Helpful links\">\n      <h2>Try these instead:</h2>\n      <ul>\n        <li><a href=\"/\">Home</a></li>\n        <li><a href=\"/products\">Products</a></li>\n        <li><a href=\"/blog\">Blog</a></li>\n        <li><a href=\"/contact\">Contact Us</a></li>\n      </ul>\n    </nav>\n  </main>\n</body>\n</html>\n```\n\n## Why It Matters\n\nA generic browser 404 page causes users to leave immediately—a well-designed custom page provides recovery paths and keeps users engaged with your site.\n\n## Essential Elements\n\n| Element | Purpose |\n|---------|---------|\n| Clear message | Explain the page wasn't found |\n| Search box | Help users find what they need |\n| Navigation links | Quick access to main sections |\n| Popular content | Suggest relevant pages |\n| Home link | Easy return to start |\n| Contact option | Report broken links |\n\n## Next.js Implementation\n\n```tsx\n// app/not-found.tsx\n\n  return (\n    <main className=\"min-h-screen flex items-center justify-center px-4\">\n      <div className=\"text-center max-w-md\">\n        <h1 className=\"text-6xl font-bold text-gray-900 mb-4\">404</h1>\n        <h2 className=\"text-2xl font-semibold mb-4\">Page Not Found</h2>\n        <p className=\"text-gray-600 mb-8\">\n          The page you're looking for doesn't exist or has been moved.\n        </p>\n\n        <div className=\"space-y-4\">\n          \n            Go Home\n          \n\n          \n            Search Site\n          \n        </div>\n\n        <nav className=\"mt-8\" aria-label=\"Popular pages\">\n          <h3 className=\"text-sm font-semibold text-gray-500 mb-3\">\n            Popular Pages\n          </h3>\n          <ul className=\"space-y-2\">\n            <li>Products</li>\n            <li>Documentation</li>\n            <li>Blog</li>\n          </ul>\n        </nav>\n      </div>\n    </main>\n  )\n}\n```\n\n## React Component with Error Tracking\n\n```tsx\ninterface NotFoundPageProps {\n  searchEnabled?: boolean\n  popularLinks?: Array<{ href: string; label: string }>\n}\n\n  searchEnabled = true,\n  popularLinks = []\n}: NotFoundPageProps) {\n  // Track 404 for analytics\n  useEffect(() => {\n    // Report to analytics\n    if (typeof window !== 'undefined') {\n      const path = window.location.pathname\n      console.error(`404 Error: ${path}`)\n\n      // Send to analytics service\n      analytics?.track('404_error', { path, referrer: document.referrer })\n    }\n  }, [])\n\n  return (\n    <main role=\"main\" className=\"error-page\">\n      <div className=\"error-content\">\n        <h1>Oops! Page not found</h1>\n        <p>\n          We couldn't find the page you're looking for.\n          It may have been moved or deleted.\n        </p>\n\n        {searchEnabled && (\n          <form action=\"/search\" method=\"GET\" role=\"search\" className=\"search-form\">\n            <label htmlFor=\"error-search\" className=\"sr-only\">\n              Search\n            </label>\n            <input\n              type=\"search\"\n              id=\"error-search\"\n              name=\"q\"\n              placeholder=\"Search...\"\n              aria-label=\"Search site\"\n            />\n            <button type=\"submit\">Search</button>\n          </form>\n        )}\n\n        {popularLinks.length > 0 && (\n          <nav aria-label=\"Suggested pages\">\n            <h2>You might be looking for:</h2>\n            <ul>\n              {popularLinks.map(link => (\n                <li key={link.href}>\n                  <a href={link.href}>{link.label}</a>\n                </li>\n              ))}\n            </ul>\n          </nav>\n        )}\n\n        <a href=\"/\" className=\"home-link\">\n          ← Back to Home\n        </a>\n      </div>\n    </main>\n  )\n}\n```\n\n## Server Configuration\n\n```nginx\n# Nginx\nserver {\n    error_page 404 /404.html;\n    location = /404.html {\n        root /var/www/html;\n        internal;\n    }\n}\n```\n\n```apache\n# Apache .htaccess\nErrorDocument 404 /404.html\n```\n\n## 404 Error Tracking\n\n```tsx\n// middleware.ts (Next.js)\n\n  // Log 404s for monitoring\n  const response = NextResponse.next()\n\n  // You can check response status and log accordingly\n  // This runs before the 404 page renders\n\n  return response\n}\n\n// Alternative: Track in the 404 page itself\n// app/not-found.tsx\n'use client'\n\n  const pathname = usePathname()\n\n  useEffect(() => {\n    // Send to error tracking service\n    fetch('/api/track-404', {\n      method: 'POST',\n      body: JSON.stringify({\n        path: pathname,\n        referrer: document.referrer,\n        timestamp: new Date().toISOString()\n      })\n    })\n  }, [pathname])\n\n  return (/* ... */)\n}\n```\n\n## SEO Considerations\n\n```html\n<head>\n  <!-- Prevent 404 pages from being indexed -->\n  <meta name=\"robots\" content=\"noindex, nofollow\">\n\n  <!-- Return proper 404 status code (server-side) -->\n  <!-- Next.js handles this automatically for not-found.tsx -->\n</head>\n```\n\n## Avoid Soft 404s\n\nA branded \"page not found\" template is still a search bug if the server responds with `200 OK`. Search engines can treat that as a soft 404, which wastes crawl budget and may surface broken pages in reports.\n\n## Styling Best Practices\n\n```css\n.error-page {\n  min-height: 100vh;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 2rem;\n  text-align: center;\n}\n\n.error-content {\n  max-width: 500px;\n}\n\n.error-page h1 {\n  font-size: 3rem;\n  margin-bottom: 1rem;\n}\n\n/* Keep consistent with site branding */\n.error-page {\n  font-family: inherit;\n  background: var(--background);\n  color: var(--foreground);\n}\n\n/* Ensure search is prominent */\n.search-form {\n  margin: 2rem 0;\n}\n\n.search-form input {\n  padding: 0.75rem 1rem;\n  font-size: 1rem;\n  width: 100%;\n  max-width: 300px;\n}\n```\n\n## Verification\n\n1. Navigate to a non-existent URL\n2. Verify HTTP 404 status code is returned\n3. Check page includes navigation options\n4. Test search functionality works\n5. Verify page is not indexed (check robots meta)\n6. Test on mobile devices\n7. Verify screen reader announces content properly\n8. Confirm the missing URL appears as a real 404 in DevTools Network, not a 200 soft-404 response\n\nA custom 404 page must return HTTP status code 404, not 200. Search engines treat 200 responses as valid pages, potentially indexing your error page content.","skills/about-page/SKILL.md":"---\nname: about-page\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Create a dedicated About page. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/about-page\n---\n\n# Create a dedicated About page\n\nAn About page is a primary trust signal for both users and search engines, directly impacting the website's E-E-A-T profile and overall credibility.\n\n## Quick Reference\n\n- Include a dedicated page explaining the purpose, history, and mission of the website\n- Introduce the key people or organization behind the content to build trust\n- Provide clear evidence of expertise and contact information\n\n## Check\n\nVerify that the website has a dedicated About page that clearly identifies the people or organization responsible for the content.\n\n## Fix\n\nCreate a new page at `/about` and add detailed information about your organization, mission, and the experts behind your content.\n\n## Explain\n\nExplain how an About page contributes to E-E-A-T (Experience, Expertise, Authoritativeness, and Trustworthiness) and why it's a critical SEO factor.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Create a dedicated About page. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/about-page\n","skills/about-page/references/rule.md":"# Create a dedicated About page\n\n> Checks for a dedicated about or company page with meaningful content.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nAn About page provides essential context about the source of the information on your website. It helps search engines and users understand the expertise and authority behind the content.\n\n## Code Example\n\nEnsure the About page is easily discoverable, typically via the main navigation or the footer.\n\n```html\n<footer>\n  <nav aria-label=\"Footer Navigation\">\n    <ul>\n      <li><a href=\"/about\">About Us</a></li>\n      <li><a href=\"/contact\">Contact</a></li>\n      <li><a href=\"/privacy-policy\">Privacy Policy</a></li>\n    </ul>\n  </nav>\n</footer>\n```\n\n## Why It Matters\n\n- **E-E-A-T**: Directly supports the Trustworthiness and Authoritativeness pillars of Google's Quality Rater Guidelines.\n- **Transparency**: Shows users who you are, reducing bounce rates and building long-term brand loyalty.\n- **Entity Recognition**: Helps search engines connect your website to a real-world entity (person or organization).\n- **Compliance**: For many industries, identifying the content creator is a legal or regulatory requirement.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/accessibility-testing/SKILL.md":"---\nname: accessibility-testing\ndescription: \"Use when reviewing component libraries, page flows, or CI pipelines that need repeatable accessibility checks. Automated testing is strongest at catching structural and attribute-level issues; it does not replace keyboard, screen reader, and manual UX testing.\"\nmetadata:\n  category: testing\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"30\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/testing/accessibility-testing\n---\n\n# Include accessibility testing\n\nAutomated accessibility testing catches 30-50% of WCAG violations before code reaches users—reducing legal risk and improving usability for everyone.\n\n## Quick Reference\n\n- Use jest-axe for component-level accessibility testing\n- Integrate @axe-core/playwright or cypress-axe for E2E a11y tests\n- Run accessibility tests in CI/CD to catch regressions early\n- Test specific WCAG rules like color-contrast individually\n\n## Check\n\nReview this test suite for accessibility testing coverage using axe-core, jest-axe, or similar tools.\n\n## Fix\n\nAdd automated accessibility testing to detect WCAG violations in components and pages.\n\n## Explain\n\nExplain how to implement automated accessibility testing and what issues it can detect.\n\n## Code Review\n\nInspect component tests, E2E suites, and CI workflows for automated accessibility coverage. Flag critical pages or shared components that ship without axe-based checks, and note issues that still require manual keyboard or screen reader validation.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/testing/accessibility-testing\n","skills/accessibility-testing/references/rule.md":"# Include accessibility testing\n\n> Automate accessibility testing with tools like axe-core, jest-axe, or Playwright's accessibility testing.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 30 min\n\n---\nAutomated accessibility testing catches common WCAG violations before they reach production, protecting your users and reducing legal risk.\n\n## Code Example\n\n```javascript\n\nexpect.extend(toHaveNoViolations)\n\ndescribe('Button', () => {\n  it('should have no accessibility violations', async () => {\n    const { container } = render(\n       {}}>Click me\n    )\n    const results = await axe(container)\n    expect(results).toHaveNoViolations()\n  })\n})\n\n// Test specific rules\nit('should have proper color contrast', async () => {\n  const { container } = render(Warning)\n  const results = await axe(container, {\n    rules: {\n      'color-contrast': { enabled: true }\n    }\n  })\n  expect(results).toHaveNoViolations()\n})\n```\n\n## Why It Matters\n\nAutomated accessibility testing catches 30-50% of WCAG violations before code reaches users—reducing legal risk and improving usability for everyone.\n\n## Testing Tools\n\n| Tool | Use Case | Framework |\n|------|----------|-----------|\n| jest-axe | Unit/component tests | Jest |\n| @axe-core/playwright | E2E tests | Playwright |\n| cypress-axe | E2E tests | Cypress |\n| pa11y | CI/CD pipeline | Any |\n\n## Playwright\n\n```typescript\n\ntest.describe('Homepage accessibility', () => {\n  test('should have no violations', async ({ page }) => {\n    await page.goto('/')\n\n    const accessibilityScanResults = await new AxeBuilder({ page }).analyze()\n\n    expect(accessibilityScanResults.violations).toEqual([])\n  })\n\n  test('should have no violations on mobile', async ({ page }) => {\n    await page.setViewportSize({ width: 375, height: 667 })\n    await page.goto('/')\n\n    const results = await new AxeBuilder({ page })\n      .withTags(['wcag2a', 'wcag2aa'])\n      .analyze()\n\n    expect(results.violations).toEqual([])\n  })\n})\n```\n\n## Cypress\n\n```javascript\n\ndescribe('Form accessibility', () => {\n  beforeEach(() => {\n    cy.visit('/contact')\n    cy.injectAxe()\n  })\n\n  it('should have no violations on load', () => {\n    cy.checkA11y()\n  })\n\n  it('should have no violations after form errors', () => {\n    cy.get('button[type=\"submit\"]').click()\n    cy.checkA11y()\n  })\n\n  it('should exclude known issues', () => {\n    cy.checkA11y(null, {\n      rules: {\n        'color-contrast': { enabled: false } // Known issue, tracked in backlog\n      }\n    })\n  })\n})\n```\n\n## CI/CD Integration\n\n```yaml\n# GitHub Actions\nname: Accessibility Tests\non: [push, pull_request]\n\njobs:\n  a11y:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - run: npm ci\n      - run: npm run test:a11y\n      - uses: actions/upload-artifact@v4\n        if: failure()\n        with:\n          name: a11y-report\n          path: a11y-report.html\n```\n\n## Lighthouse CI Accessibility\n\n```json\n{\n  \"ci\": {\n    \"assert\": {\n      \"assertions\": {\n        \"categories:accessibility\": [\"error\", { \"minScore\": 0.9 }],\n        \"image-alt\": \"error\",\n        \"label\": \"error\",\n        \"link-name\": \"error\"\n      }\n    }\n  }\n}\n```\n\n## Tools & Validation\n\nAutomated checks are a floor, not a ceiling.\n\nTypically caught automatically:\n\n- Missing alt text\n- Missing form labels\n- Invalid ARIA roles and attributes\n- Many color-contrast failures\n\nUsually still manual:\n\n- Whether alt text is actually meaningful\n- Keyboard interaction quality in complex widgets\n- Screen reader announcements and reading order\n- Whether the flow is understandable, not just technically valid\n\n## Verification\n\n### Automated Checks\n\n- Run the accessibility test suite locally and confirm new violations fail the build or test run; the default target should be `<= 0` unexpected axe violations for covered states.\n- Pair automated coverage with manual keyboard and screen-reader checks for at least one critical user flow.\n- Track ignored or suppressed rules explicitly so temporary exceptions do not become permanent blind spots.\n\n### Manual Checks\n\n- Ensure the suite covers high-risk states such as modal open, form validation errors, and mobile layouts.","skills/accessible-authentication/SKILL.md":"---\nname: accessible-authentication\ndescription: \"Use when reviewing sign-in, sign-up, MFA, CAPTCHA, recovery, and re-auth flows. Evaluate the full authentication path, including error handling and backup methods, not just the primary login form.\"\nmetadata:\n  category: accessibility\n  priority: high\n  difficulty: advanced\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accessible-authentication\n---\n\n# Provide accessible authentication methods\n\nAuthentication often becomes the first hard blocker for users with cognitive, motor, low-vision, or speech-input needs. If sign-in, MFA, or recovery relies on memorization or transcription with no assisted path, the user may be locked out before they can access the product at all.\n\n## Quick Reference\n\n- Do not block paste or password managers in login and recovery flows\n- Prefer passkeys, magic links, device approval, or password-manager-friendly flows\n- Support OTP autofill and paste with appropriate semantics such as `autocomplete=\"one-time-code\"`\n- Avoid CAPTCHA or secondary checks that require memorizing or transcribing information without an alternative\n\n## Check\n\nReview login, MFA, password reset, and account recovery for accessible authentication problems. Flag blocked paste, password-manager hostility, manual transcription requirements, inaccessible OTP handling, and CAPTCHA or knowledge checks without a compliant alternative.\n\n## Fix\n\nAdd password-manager-friendly fields, support paste and OTP autofill, and provide at least one authentication path that does not depend on a cognitive function test.\n\n## Explain\n\nExplain WCAG Accessible Authentication, why memorization and transcription are barriers, and how passkeys, password managers, OTP autofill, and device approval improve both accessibility and security.\n\n## Code Review\n\nReview authentication pages, MFA steps, recovery flows, and security controls related to Provide accessible authentication methods. Flag exact steps that require memorization, transcription, blocked assistive tooling, or inaccessible fallback paths.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accessible-authentication\n","skills/accessible-authentication/references/rule.md":"# Provide accessible authentication methods\n\n> Authentication flows avoid unnecessary cognitive tests and support assistive mechanisms such as password managers, paste, OTP autofill, and passkeys.\n\n**Priority:** high · **Difficulty:** advanced · **Time:** 25 min\n\n---\nAuthentication should not depend on the user's ability to memorize, transcribe, or manually reproduce information when an assistive path is feasible. Good accessible authentication usually improves security too, because it works with password managers, device-based verification, and passkeys rather than against them.\n\n## Code Example\n\n```html\n<!-- Better: password-manager and OTP-friendly fields -->\n<label for=\"email\">Email</label>\n<input id=\"email\" name=\"email\" type=\"email\" autocomplete=\"username webauthn\">\n\n<label for=\"password\">Password</label>\n<input\n  id=\"password\"\n  name=\"password\"\n  type=\"password\"\n  autocomplete=\"current-password\">\n\n<label for=\"otp\">Verification code</label>\n<input\n  id=\"otp\"\n  name=\"otp\"\n  inputmode=\"numeric\"\n  autocomplete=\"one-time-code\">\n```\n\n```tsx\nfunction VerifyCodeField({\n  onSubmit,\n}: {\n  onSubmit: (code: string) => void\n}) {\n  return (\n    <form\n      onSubmit={(event) => {\n        event.preventDefault()\n        const formData = new FormData(event.currentTarget)\n        onSubmit(String(formData.get('otp') ?? ''))\n      }}\n    >\n      <label htmlFor=\"otp\">Enter the verification code</label>\n      <input\n        autoComplete=\"one-time-code\"\n        id=\"otp\"\n        inputMode=\"numeric\"\n        name=\"otp\"\n        type=\"text\"\n      />\n\n      <button type=\"submit\">Continue</button>\n    </form>\n  )\n}\n```\n\n```html\n<!-- Better: offer a non-memory-dependent alternative -->\n<button type=\"button\">Continue with a passkey</button>\n<button type=\"button\">Email me a sign-in link</button>\n```\n\n## Why It Matters\n\nMany authentication patterns are built around unnecessary friction: blocked paste, custom OTP widgets that break autofill, CAPTCHA transcription, or backup questions that require memory instead of possession-based proof.\n\n- cognitive barriers prevent account access before the user can do anything else\n- password-manager hostility leads to weaker, reused passwords\n- speech, switch, and keyboard-only users face more effort when copy/paste and autofill are disabled\n- recovery and MFA steps often fail even when the main login form looks acceptable\n\n## Best Practices\n\n### Support assisted entry\n\nAuthentication should work with:\n\n- password managers\n- pasted credentials and codes\n- OS/browser OTP autofill\n- passkeys or device approval when available\n\nDo not split a one-time code into a widget that breaks standard autofill unless you have verified the real browser behavior.\n\n### Provide a non-memory-dependent path\n\nAt least one viable route through sign-in, MFA, and recovery should avoid a cognitive function test. Good examples include:\n\n- passkeys\n- approval on a trusted device\n- magic links\n- password-manager-assisted password entry\n\n### Keep anti-abuse controls proportional\n\nIf you use CAPTCHA or other abuse mitigations in auth flows, provide an alternative path that does not force memorization or transcription. Accessibility and abuse prevention must be designed together, not as competing concerns.\n\n## Standards\n\n- This rule maps to WCAG 2.2 Success Criterion 3.3.8 Accessible Authentication (Minimum).\n- The practical goal is not \"less security\"; it is at least one viable path that does not depend on a cognitive function test.\n\n## Exceptions\n\n- Re-entering a newly created password can be a valid security exception when the system does not reveal the password back to the user.\n- MFA is compatible with this rule, but the user still needs at least one practical path that does not rely on memorizing or transcribing information.\n- Accessibility does not require removing security; it requires choosing security controls that users can actually complete.\n\n## Verification\n\n### Automated Checks\n\n- Search auth flows for blocked paste handlers, OTP widgets, and missing autocomplete attributes.\n- Verify username, current-password, new-password, and one-time-code fields use appropriate semantics.\n\n### Manual Checks\n\n- Test sign-in with a password manager.\n- Paste an OTP or let the browser autofill it where supported.\n- Exercise recovery and MFA flows, not only the primary login form.\n- Fail if the only available path requires memorizing, transcribing, or solving a cognitive test without an assisted alternative.","skills/accessible-notifications/SKILL.md":"---\nname: accessible-notifications\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Make notifications accessible. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accessible-notifications\n---\n\n# Make notifications accessible\n\nWithout proper ARIA attributes, screen reader users miss critical notifications like form errors, success messages, and real-time updates—leaving them unaware of important page changes.\n\n## Quick Reference\n\n- Use aria-live regions to announce dynamic content changes\n- Choose between 'polite' (waits) and 'assertive' (interrupts) based on urgency\n- Ensure notifications persist long enough to be read\n- Provide visible and programmatic dismiss options\n\n## Check\n\nVerify notifications use aria-live regions, appropriate role (alert or status), and persist long enough to be read.\n\n## Fix\n\nImplement notifications with role='alert' or role='status', aria-live='polite' or 'assertive', and adequate display time.\n\n## Explain\n\nExplain how accessible notifications ensure all users are informed of important updates regardless of how they interact with the page.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Make notifications accessible. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accessible-notifications\n","skills/accessible-notifications/references/rule.md":"# Make notifications accessible\n\n> Toast notifications and alerts are announced to screen readers using ARIA live regions and appropriate roles.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 25 min\n\n---\nAccessible notifications ensure all users receive important feedback about actions and state changes.\n\n## Code Example\n\n```html\n<!-- Status notification (polite) -->\n<div role=\"status\" aria-live=\"polite\" class=\"notification\">\n  Your changes have been saved.\n</div>\n\n<!-- Alert notification (assertive) -->\n<div role=\"alert\" aria-live=\"assertive\" class=\"notification notification--error\">\n  Error: Please fill in all required fields.\n</div>\n\n<!-- Live region container (content injected dynamically) -->\n<div\n  id=\"notifications\"\n  aria-live=\"polite\"\n  aria-atomic=\"true\"\n  class=\"sr-only\"\n></div>\n```\n\n## Why It Matters\n\nWithout proper ARIA attributes, screen reader users miss critical notifications like form errors, success messages, and real-time updates—leaving them unaware of important page changes.\n\n## ARIA Live Region Types\n\n| Attribute | Behavior | Use For |\n|-----------|----------|---------|\n| `aria-live=\"polite\"` | Waits for user pause | Status updates, non-urgent info |\n| `aria-live=\"assertive\"` | Interrupts immediately | Errors, time-sensitive alerts |\n| `role=\"status\"` | Implicit polite | Progress, success messages |\n| `role=\"alert\"` | Implicit assertive | Errors, warnings |\n\n## React Toast Component\n\n```tsx\n\ntype NotificationType = 'success' | 'error' | 'warning' | 'info'\n\ninterface ToastProps {\n  message: string\n  type: NotificationType\n  duration?: number\n  onDismiss: () => void\n}\n\n  message,\n  type,\n  duration = 5000,\n  onDismiss\n}: ToastProps) {\n  const toastRef = useRef(null)\n\n  // Auto-dismiss after duration\n  useEffect(() => {\n    if (duration > 0) {\n      const timer = setTimeout(onDismiss, duration)\n      return () => clearTimeout(timer)\n    }\n  }, [duration, onDismiss])\n\n  // Focus toast for keyboard users\n  useEffect(() => {\n    toastRef.current?.focus()\n  }, [])\n\n  const isError = type === 'error' || type === 'warning'\n\n  return (\n    <div\n      ref={toastRef}\n      role={isError ? 'alert' : 'status'}\n      aria-live={isError ? 'assertive' : 'polite'}\n      aria-atomic=\"true\"\n      tabIndex={-1}\n      className={`toast toast--${type}`}\n    >\n      <span className=\"toast__icon\" aria-hidden=\"true\">\n        {type === 'success' && '✓'}\n        {type === 'error' && '✕'}\n        {type === 'warning' && '⚠'}\n        {type === 'info' && 'ℹ'}\n      </span>\n\n      <span className=\"toast__message\">{message}</span>\n\n      <button\n        type=\"button\"\n        onClick={onDismiss}\n        aria-label=\"Dismiss notification\"\n        className=\"toast__dismiss\"\n      >\n        ×\n      </button>\n    </div>\n  )\n}\n```\n\n## Toast Container with Live Region\n\n```tsx\n\ninterface Notification {\n  id: string\n  message: string\n  type: NotificationType\n  duration?: number\n}\n\ninterface ToastContextType {\n  addToast: (notification: Omit\n      {children}\n\n      {/* Toast container with live region */}\n      <div\n        className=\"toast-container\"\n        aria-label=\"Notifications\"\n      >\n        {toasts.map(toast => (\n           removeToast(toast.id)}\n          />\n        ))}\n      </div>\n\n      {/* Screen reader announcement region */}\n      <div\n        role=\"status\"\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        className=\"sr-only\"\n      >\n        {toasts.length > 0 && toasts[toasts.length - 1].message}\n      </div>\n    </ToastContext.Provider>\n  )\n}\n\n  const context = useContext(ToastContext)\n  if (!context) throw new Error('useToast must be used within ToastProvider')\n  return context\n}\n```\n\n## Usage Example\n\n```tsx\nfunction SaveButton() {\n  const { addToast } = useToast()\n\n  const handleSave = async () => {\n    try {\n      await saveData()\n      addToast({\n        message: 'Changes saved successfully',\n        type: 'success',\n        duration: 3000\n      })\n    } catch (error) {\n      addToast({\n        message: 'Failed to save changes. Please try again.',\n        type: 'error',\n        duration: 0 // Don't auto-dismiss errors\n      })\n    }\n  }\n\n  return <button onClick={handleSave}>Save</button>\n}\n```\n\n## Inline Notifications\n\n```tsx\ninterface InlineNotificationProps {\n  type: 'error' | 'warning' | 'success' | 'info'\n  title?: string\n  children: React.ReactNode\n  dismissible?: boolean\n  onDismiss?: () => void\n}\n\n  type,\n  title,\n  children,\n  dismissible = false,\n  onDismiss\n}: InlineNotificationProps) {\n  const isUrgent = type === 'error' || type === 'warning'\n\n  return (\n    <div\n      role={isUrgent ? 'alert' : 'status'}\n      aria-live={isUrgent ? 'assertive' : 'polite'}\n      className={`notification notification--${type}`}\n    >\n      {title && (\n        <strong className=\"notification__title\">{title}</strong>\n      )}\n      <div className=\"notification__content\">{children}</div>\n\n      {dismissible && (\n        <button\n          type=\"button\"\n          onClick={onDismiss}\n          aria-label=\"Dismiss\"\n          className=\"notification__dismiss\"\n        >\n          ×\n        </button>\n      )}\n    </div>\n  )\n}\n```\n\n## Progress Notifications\n\n```tsx\nfunction UploadProgress({ progress, fileName }: { progress: number; fileName: string }) {\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      aria-busy={progress < 100}\n      className=\"upload-progress\"\n    >\n      <span className=\"sr-only\">\n        Uploading {fileName}: {progress}% complete\n      </span>\n\n      <div aria-hidden=\"true\">\n        <span>{fileName}</span>\n        <progress value={progress} max=\"100\" />\n        <span>{progress}%</span>\n      </div>\n    </div>\n  )\n}\n```\n\n## Timing Guidelines\n\n| Notification Type | Recommended Duration |\n|-------------------|---------------------|\n| Success messages | 3-5 seconds |\n| Info/status | 5-7 seconds |\n| Warnings | 8-10 seconds or manual dismiss |\n| Errors | No auto-dismiss (manual only) |\n\n```tsx\nconst DURATION_MAP = {\n  success: 3000,\n  info: 5000,\n  warning: 8000,\n  error: 0, // No auto-dismiss\n} as const\n```\n\n## Styling\n\n```css\n.toast-container {\n  position: fixed;\n  bottom: 1rem;\n  right: 1rem;\n  z-index: 1000;\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n\n.toast {\n  display: flex;\n  align-items: center;\n  gap: 0.75rem;\n  padding: 1rem;\n  border-radius: 0.5rem;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n  animation: slideIn 0.3s ease-out;\n}\n\n.toast--success { background: #d4edda; border-left: 4px solid #28a745; }\n.toast--error { background: #f8d7da; border-left: 4px solid #dc3545; }\n.toast--warning { background: #fff3cd; border-left: 4px solid #ffc107; }\n.toast--info { background: #d1ecf1; border-left: 4px solid #17a2b8; }\n\n.toast__dismiss {\n  background: none;\n  border: none;\n  font-size: 1.25rem;\n  cursor: pointer;\n  padding: 0.25rem;\n  margin-left: auto;\n}\n\n/* Screen reader only */\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\n@keyframes slideIn {\n  from {\n    transform: translateX(100%);\n    opacity: 0;\n  }\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n/* Respect motion preferences */\n@media (prefers-reduced-motion: reduce) {\n  .toast {\n    animation: none;\n  }\n}\n```\n\n## Verification\n\n1. Enable screen reader and trigger notifications\n2. Verify announcements occur at appropriate times\n3. Test keyboard dismissal (Escape key)\n4. Check notifications don't disappear too quickly\n5. Verify focus management after dismissal\n6. Test with different screen readers (NVDA, VoiceOver, JAWS)\n\nReserve `aria-live=\"assertive\"` for truly urgent messages. Overuse disrupts the user experience by constantly interrupting screen reader output.","skills/accessible-tables/SKILL.md":"---\nname: accessible-tables\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use semantic table markup for screen readers. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accessible-tables\n---\n\n# Use semantic table markup for screen readers\n\nScreen readers read table data cell-by-cell—without proper headers, users hear meaningless numbers without context. 'Row 3, Column 2: $99' vs just '$99'.\n\n## Quick Reference\n\n- Use <th> elements for headers with scope='col' or scope='row'\n- Add <caption> to describe the table's purpose\n- Never use tables for layout—use CSS Grid or Flexbox instead\n- Use id/headers for complex tables with merged cells\n- For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n- Prefer one strong table-semantics finding over multiple weaker enhancements on the same simple table\n\n## Check\n\nVerify tables use proper th elements with scope, caption or aria-labelledby, and semantic table structure.\n\n## Fix\n\nAdd proper table headers with scope attributes, captions for context, and ensure tables are not used for layout.\n\n## Explain\n\nExplain how proper table markup helps screen reader users understand data relationships and navigate table content.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Use semantic table markup for screen readers. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accessible-tables\n","skills/accessible-tables/references/rule.md":"# Use semantic table markup for screen readers\n\n> Data tables use proper semantic markup with headers, captions, and scope attributes for screen reader accessibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nProper table markup enables screen readers to announce header-cell relationships, making data understandable.\n\n## Code Example\n\n```html\n<table>\n  <caption>Q1 2024 Sales by Region</caption>\n  <thead>\n    <tr>\n      <th scope=\"col\">Region</th>\n      <th scope=\"col\">January</th>\n      <th scope=\"col\">February</th>\n      <th scope=\"col\">March</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">North</th>\n      <td>$12,000</td>\n      <td>$14,500</td>\n      <td>$13,200</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">South</th>\n      <td>$9,800</td>\n      <td>$11,000</td>\n      <td>$10,500</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## Why It Matters\n\nScreen readers read table data cell-by-cell—without proper headers, users hear meaningless numbers without context. 'Row 3, Column 2: $99' vs just '$99'.\n\n## Scope Attribute\n\n| Value | Use When |\n|-------|----------|\n| `scope=\"col\"` | Header applies to column below |\n| `scope=\"row\"` | Header applies to row beside it |\n| `scope=\"colgroup\"` | Header spans multiple columns |\n| `scope=\"rowgroup\"` | Header spans multiple rows |\n\n## Complex Tables with Headers Attribute\n\n```html\n<table>\n  <caption>Sales Report</caption>\n  <thead>\n    <tr>\n      <th id=\"region\" rowspan=\"2\">Region</th>\n      <th id=\"q1\" colspan=\"2\">Q1</th>\n      <th id=\"q2\" colspan=\"2\">Q2</th>\n    </tr>\n    <tr>\n      <th id=\"q1-units\" headers=\"q1\">Units</th>\n      <th id=\"q1-revenue\" headers=\"q1\">Revenue</th>\n      <th id=\"q2-units\" headers=\"q2\">Units</th>\n      <th id=\"q2-revenue\" headers=\"q2\">Revenue</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th id=\"north\" headers=\"region\">North</th>\n      <td headers=\"north q1 q1-units\">150</td>\n      <td headers=\"north q1 q1-revenue\">$15,000</td>\n      <td headers=\"north q2 q2-units\">180</td>\n      <td headers=\"north q2 q2-revenue\">$18,000</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## React Table Component\n\n```tsx\ninterface Column{caption}</caption>\n      <thead>\n        <tr>\n          {columns.map(col => (\n            <th key={String(col.key)} scope=\"col\">\n              {col.header}\n            </th>\n          ))}\n        </tr>\n      </thead>\n      <tbody>\n        {data.map((row, i) => (\n          <tr key={i}>\n            {columns.map(col => {\n              const isRowHeader = col.key === rowHeader\n              const Tag = isRowHeader ? 'th' : 'td'\n              return (\n                \n                  {String(row[col.key])}\n                \n              )\n            })}\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  )\n}\n```\n\n## Responsive Tables\n\n```html\n<!-- Scrollable wrapper for mobile -->\n<div class=\"table-wrapper\" tabindex=\"0\" role=\"region\" aria-label=\"Sales data table\">\n  <table>\n    <!-- Table content -->\n  </table>\n</div>\n```\n\n```css\n.table-wrapper {\n  overflow-x: auto;\n  max-width: 100%;\n}\n\n/* Focus indicator for keyboard users scrolling */\n.table-wrapper:focus {\n  outline: 2px solid #005fcc;\n}\n```\n\n## Exceptions\n\n- Simple data tables can sometimes fail more from missing header relationships than from missing enhancements such as captions or mobile wrappers, so prioritize the strongest semantic issue.\n- Do not convert layout structures into data-table markup just to satisfy a rule; the correct fix may be to remove table semantics entirely.\n- When several table-accessibility issues overlap, resolve the header-cell relationship first because downstream announcements depend on it.\n\n## Verification\n\n### Automated Checks\n\n- Use browser accessibility tooling, axe, Lighthouse, or equivalent automated checks against a representative rendered state.\n\n### Manual Checks\n\n- Use screen reader table navigation (Ctrl+Alt+Arrow keys in NVDA)\n- Verify headers are announced with each cell\n- Check caption describes the table purpose\n- Confirm table is not used for layout","skills/accessible-tooltips/SKILL.md":"---\nname: accessible-tooltips\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Create accessible tooltips. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accessible-tooltips\n---\n\n# Create accessible tooltips\n\nInaccessible tooltips leave keyboard and screen reader users without important contextual information, creating an unequal experience and potential confusion.\n\n## Quick Reference\n\n- Tooltips must be keyboard accessible (focusable trigger)\n- Use aria-describedby to associate tooltip with trigger\n- Allow hover and focus to show tooltip, Escape to dismiss\n- Ensure sufficient contrast and don't hide essential info in tooltips\n\n## Check\n\nVerify tooltips are keyboard accessible, use appropriate ARIA roles (tooltip), and can be dismissed without moving focus.\n\n## Fix\n\nImplement tooltips with role='tooltip', aria-describedby, keyboard triggering, and Escape key dismissal.\n\n## Explain\n\nExplain the accessibility requirements for tooltips including keyboard access, ARIA attributes, and timing considerations.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Create accessible tooltips. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accessible-tooltips\n","skills/accessible-tooltips/references/rule.md":"# Create accessible tooltips\n\n> Tooltips are accessible to keyboard users and screen readers with proper ARIA attributes and focus handling.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nAccessible tooltips provide supplementary information without excluding keyboard or screen reader users.\n\n## Code Example\n\n```html\n<div class=\"tooltip-container\">\n  <button\n    type=\"button\"\n    aria-describedby=\"tooltip-1\"\n    class=\"tooltip-trigger\"\n  >\n    Settings\n  </button>\n  <div\n    id=\"tooltip-1\"\n    role=\"tooltip\"\n    class=\"tooltip\"\n  >\n    Configure your preferences\n  </div>\n</div>\n```\n\n## Why It Matters\n\nInaccessible tooltips leave keyboard and screen reader users without important contextual information, creating an unequal experience and potential confusion.\n\n## Accessibility Requirements\n\n| Requirement | Implementation |\n|-------------|----------------|\n| Keyboard accessible | Show on focus, not just hover |\n| Programmatically associated | Use `aria-describedby` |\n| Dismissible | Close with Escape key |\n| Persistent | Stay visible while hovered/focused |\n| Non-essential | Don't hide critical info in tooltips |\n\n## React Tooltip Component\n\n```tsx\n\ninterface TooltipProps {\n  content: string\n  children: React.ReactElement\n  position?: 'top' | 'bottom' | 'left' | 'right'\n  delay?: number\n}\n\n  content,\n  children,\n  position = 'top',\n  delay = 300\n}: TooltipProps) {\n  const [isVisible, setIsVisible] = useState(false)\n  const tooltipId = useId()\n  const timeoutRef = useRef {\n    clearTimeout(timeoutRef.current)\n    setIsVisible(false)\n  }\n\n  // Handle Escape key\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Escape' && isVisible) {\n        hideTooltip()\n      }\n    }\n\n    document.addEventListener('keydown', handleKeyDown)\n    return () => document.removeEventListener('keydown', handleKeyDown)\n  }, [isVisible])\n\n  // Clone child to add props\n  const trigger = React.cloneElement(children, {\n    ref: triggerRef,\n    'aria-describedby': isVisible ? tooltipId : undefined,\n    onMouseEnter: showTooltip,\n    onMouseLeave: hideTooltip,\n    onFocus: showTooltip,\n    onBlur: hideTooltip,\n  })\n\n  return (\n    <div className=\"tooltip-wrapper\">\n      {trigger}\n      {isVisible && (\n        <div\n          id={tooltipId}\n          role=\"tooltip\"\n          className={`tooltip tooltip--${position}`}\n        >\n          {content}\n        </div>\n      )}\n    </div>\n  )\n}\n```\n\n## Usage\n\n```tsx\n\n  <button type=\"button\">\n    \n    <span className=\"sr-only\">Save</span>\n  </button>\n\n  <label htmlFor=\"email\">\n    Email <span aria-hidden=\"true\">*</span>\n  </label>\n\n```\n\n## Advanced Tooltip with Floating UI\n\n```tsx\n\ninterface AdvancedTooltipProps {\n  content: React.ReactNode\n  children: React.ReactElement\n}\n\n  const [isOpen, setIsOpen] = useState(false)\n  const arrowRef = useRef(null)\n  const tooltipId = useId()\n\n  const { refs, floatingStyles, context } = useFloating({\n    open: isOpen,\n    onOpenChange: setIsOpen,\n    placement: 'top',\n    middleware: [\n      offset(8),\n      flip(),\n      shift({ padding: 8 }),\n      arrow({ element: arrowRef })\n    ],\n  })\n\n  return (\n    <>\n      {React.cloneElement(children, {\n        ref: refs.setReference,\n        'aria-describedby': isOpen ? tooltipId : undefined,\n        onMouseEnter: () => setIsOpen(true),\n        onMouseLeave: () => setIsOpen(false),\n        onFocus: () => setIsOpen(true),\n        onBlur: () => setIsOpen(false),\n      })}\n\n      {isOpen && (\n        <div\n          ref={refs.setFloating}\n          id={tooltipId}\n          role=\"tooltip\"\n          style={floatingStyles}\n          className=\"tooltip\"\n        >\n          {content}\n          <div ref={arrowRef} className=\"tooltip-arrow\" />\n        </div>\n      )}\n    </>\n  )\n}\n```\n\n## Icon Button with Tooltip\n\n```tsx\ninterface IconButtonProps {\n  icon: React.ReactNode\n  label: string\n  onClick: () => void\n  tooltip?: string\n}\n\n  const tooltipId = useId()\n  const [showTooltip, setShowTooltip] = useState(false)\n\n  return (\n    <div className=\"icon-button-wrapper\">\n      <button\n        type=\"button\"\n        onClick={onClick}\n        aria-label={label}\n        aria-describedby={tooltip && showTooltip ? tooltipId : undefined}\n        onMouseEnter={() => setShowTooltip(true)}\n        onMouseLeave={() => setShowTooltip(false)}\n        onFocus={() => setShowTooltip(true)}\n        onBlur={() => setShowTooltip(false)}\n        className=\"icon-button\"\n      >\n        {icon}\n      </button>\n\n      {tooltip && showTooltip && (\n        <span id={tooltipId} role=\"tooltip\" className=\"tooltip\">\n          {tooltip}\n        </span>\n      )}\n    </div>\n  )\n}\n```\n\n## Native Title Attribute (Limited)\n\n```html\n<!-- Simple but limited accessibility -->\n<button type=\"button\" title=\"Save document\">\n  <svg aria-hidden=\"true\"><!-- save icon --></svg>\n  <span class=\"sr-only\">Save</span>\n</button>\n\n<!-- Better: Custom tooltip with full control -->\n<button\n  type=\"button\"\n  aria-describedby=\"save-tooltip\"\n  aria-label=\"Save\"\n>\n  <svg aria-hidden=\"true\"><!-- save icon --></svg>\n</button>\n<div id=\"save-tooltip\" role=\"tooltip\" class=\"tooltip\">\n  Save document (Ctrl+S)\n</div>\n```\n\n## Styling\n\n```css\n.tooltip-wrapper {\n  position: relative;\n  display: inline-block;\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1000;\n  padding: 0.5rem 0.75rem;\n  font-size: 0.875rem;\n  background: #1a1a1a;\n  color: #ffffff;\n  border-radius: 4px;\n  white-space: nowrap;\n  pointer-events: none;\n\n  /* Animation */\n  opacity: 0;\n  animation: tooltipFadeIn 0.15s ease-out forwards;\n}\n\n.tooltip--top {\n  bottom: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-bottom: 8px;\n}\n\n.tooltip--bottom {\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-top: 8px;\n}\n\n.tooltip--left {\n  right: 100%;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-right: 8px;\n}\n\n.tooltip--right {\n  left: 100%;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-left: 8px;\n}\n\n/* Arrow */\n.tooltip::after {\n  content: '';\n  position: absolute;\n  border: 6px solid transparent;\n}\n\n.tooltip--top::after {\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  border-top-color: #1a1a1a;\n}\n\n@keyframes tooltipFadeIn {\n  from { opacity: 0; transform: translateX(-50%) translateY(4px); }\n  to { opacity: 1; transform: translateX(-50%) translateY(0); }\n}\n\n/* Respect motion preferences */\n@media (prefers-reduced-motion: reduce) {\n  .tooltip {\n    animation: none;\n    opacity: 1;\n  }\n}\n\n/* Ensure sufficient contrast */\n.tooltip {\n  /* WCAG requires 4.5:1 for normal text */\n  /* #ffffff on #1a1a1a = 16.1:1 ✓ */\n}\n```\n\n## When to Use Tooltips vs Other Patterns\n\n| Use Case | Pattern |\n|----------|---------|\n| Supplementary hint | Tooltip |\n| Essential instruction | Inline text |\n| Complex content | Popover/Dialog |\n| Form field help | `aria-describedby` text |\n| Icon-only button | `aria-label` + optional tooltip |\n\n## Verification\n\n1. Tab to trigger element - tooltip should appear\n2. Press Escape - tooltip should close\n3. Hover over trigger - tooltip appears after delay\n4. Move mouse to tooltip - should stay visible\n5. Test with screen reader (tooltip content announced)\n6. Verify tooltip doesn't block other content\n7. Check color contrast meets WCAG requirements\n\nNever put essential information in tooltips. They're for supplementary hints only. Critical content should be visible by default or in the main UI.","skills/accesskeys/SKILL.md":"---\nname: accesskeys\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure accesskey values are unique. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accesskeys\n---\n\n# Ensure accesskey values are unique\n\nDuplicate access keys cause conflicts where only one element (usually the first) is reachable via the shortcut, making other elements inaccessible to keyboard users.\n\n## Quick Reference\n\n- Each `accesskey` attribute value must be unique on the page\n- Duplicate access keys can lead to unpredictable browser behavior\n- Helps keyboard users navigate reliably using defined shortcuts\n\n## Check\n\nCheck for duplicate `accesskey` attributes across the document to ensure each shortcut is unique.\n\n## Fix\n\nAssign unique values to each `accesskey` attribute or remove redundant ones to prevent shortcut conflicts.\n\n## Explain\n\nExplain how duplicate access keys affect keyboard accessibility and browser shortcut handling.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Ensure accesskey values are unique. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accesskeys\n","skills/accesskeys/references/rule.md":"# Ensure accesskey values are unique\n\n> Checks that accesskey values are unique to avoid shortcut conflicts.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nThe `accesskey` attribute allows developers to assign keyboard shortcuts to specific elements. To ensure these shortcuts work reliably, each value must be unique within the document.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Unique access keys -->\n<a href=\"/home\" accesskey=\"h\">Home</a>\n<a href=\"/contact\" accesskey=\"c\">Contact</a>\n\n<!-- ❌ Incorrect: Duplicate access keys -->\n<a href=\"/save\" accesskey=\"s\">Save</a>\n<a href=\"/search\" accesskey=\"s\">Search</a>\n```\n\n## Why It Matters\n\n- **Predictable Navigation**: Ensures keyboard shortcuts work as intended without conflicts.\n- **Assistive Technology**: Screen readers and other assistive technologies depend on unique identifiers for reliable interaction.\n- **User Experience**: Prevents user frustration when a shortcut doesn't trigger the expected action or moves focus to the wrong element.\n- **Browser Consistency**: Different browsers handle duplicate access keys differently; uniqueness ensures a consistent experience across all platforms.\n\n## Exceptions\n\n- Evaluate the rendered experience before treating a static-code smell as a blocker; interaction timing, browser behavior, and assistive technology output often determine severity.\n- Not every secondary accessibility issue deserves equal weight; prioritize the issue that most directly blocks perception, operation, or understanding.\n- Avoid adding redundant markup or ARIA solely to satisfy a rule when a simpler semantic implementation would eliminate the issue entirely.\n\n## Standards\n\n- Align the implementation with W3C WAI: WCAG Overview and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: Accessibility and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/accordion-accessibility/SKILL.md":"---\nname: accordion-accessibility\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Make accordions keyboard navigable. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accordion-accessibility\n---\n\n# Make accordions keyboard navigable\n\nPoorly implemented accordions trap keyboard users and leave screen reader users unable to understand or navigate collapsed content sections.\n\n## Quick Reference\n\n- Use button elements for accordion triggers with aria-expanded\n- Associate panels with triggers using aria-controls\n- Support Arrow keys for navigation between headers\n- Use heading elements appropriately for document structure\n\n## Check\n\nVerify accordions use button triggers with aria-expanded, aria-controls, and proper keyboard navigation (Enter, Space, arrows).\n\n## Fix\n\nImplement accordions with button elements, aria-expanded state, aria-controls linking to content panels, and keyboard support.\n\n## Explain\n\nExplain the ARIA pattern for accessible accordions and how they enable keyboard and screen reader users to navigate collapsible content.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Make accordions keyboard navigable. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accordion-accessibility\n","skills/accordion-accessibility/references/rule.md":"# Make accordions keyboard navigable\n\n> Accordion components use proper ARIA attributes and keyboard interactions for screen reader accessibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 25 min\n\n---\nAccessible accordions allow users to efficiently navigate and reveal content sections using any input method.\n\n## Code Example\n\n```html\n<div class=\"accordion\">\n  <h3>\n    <button\n      type=\"button\"\n      aria-expanded=\"false\"\n      aria-controls=\"panel-1\"\n      class=\"accordion__trigger\"\n      id=\"accordion-1\"\n    >\n      Section 1\n      <span class=\"accordion__icon\" aria-hidden=\"true\"></span>\n    </button>\n  </h3>\n  <div\n    id=\"panel-1\"\n    role=\"region\"\n    aria-labelledby=\"accordion-1\"\n    class=\"accordion__panel\"\n    hidden\n  >\n    <p>Panel 1 content goes here.</p>\n  </div>\n\n  <h3>\n    <button\n      type=\"button\"\n      aria-expanded=\"false\"\n      aria-controls=\"panel-2\"\n      class=\"accordion__trigger\"\n      id=\"accordion-2\"\n    >\n      Section 2\n      <span class=\"accordion__icon\" aria-hidden=\"true\"></span>\n    </button>\n  </h3>\n  <div\n    id=\"panel-2\"\n    role=\"region\"\n    aria-labelledby=\"accordion-2\"\n    class=\"accordion__panel\"\n    hidden\n  >\n    <p>Panel 2 content goes here.</p>\n  </div>\n</div>\n```\n\n## Why It Matters\n\nPoorly implemented accordions trap keyboard users and leave screen reader users unable to understand or navigate collapsed content sections.\n\n## ARIA Pattern Requirements\n\n| Element | Attribute | Purpose |\n|---------|-----------|---------|\n| Trigger | `button` element | Activatable with Enter/Space |\n| Trigger | `aria-expanded` | Indicates open/closed state |\n| Trigger | `aria-controls` | References panel ID |\n| Panel | `id` | Target of aria-controls |\n| Panel | `role=\"region\"` | Optional, for important sections |\n| Header | Heading element | Maintains document structure |\n\n## React Accordion Component\n\n```tsx\n\ninterface AccordionItemProps {\n  title: string\n  children: React.ReactNode\n  defaultOpen?: boolean\n}\n\ninterface AccordionProps {\n  children: React.ReactNode\n  allowMultiple?: boolean\n}\n\n  const [openItems, setOpenItems] = useState { itemRefs.current[index] = el },\n          } as any)\n        }\n        return child\n      })}\n    </div>\n  )\n}\n\n  title,\n  children,\n  defaultOpen = false,\n  _index,\n  _isOpen,\n  _onToggle,\n  _onKeyDown,\n  _ref,\n}: AccordionItemProps & {\n  _index?: number\n  _isOpen?: boolean\n  _onToggle?: () => void\n  _onKeyDown?: (e: KeyboardEvent) => void\n  _ref?: (el: HTMLButtonElement) => void\n}) {\n  const triggerId = useId()\n  const panelId = useId()\n  const isOpen = _isOpen ?? defaultOpen\n\n  return (\n    <div className=\"accordion__item\">\n      <h3 className=\"accordion__header\">\n        <button\n          ref={_ref}\n          type=\"button\"\n          id={triggerId}\n          aria-expanded={isOpen}\n          aria-controls={panelId}\n          onClick={_onToggle}\n          onKeyDown={_onKeyDown}\n          className=\"accordion__trigger\"\n        >\n          <span className=\"accordion__title\">{title}</span>\n          <span\n            className={`accordion__icon ${isOpen ? 'accordion__icon--open' : ''}`}\n            aria-hidden=\"true\"\n          />\n        </button>\n      </h3>\n      <div\n        id={panelId}\n        role=\"region\"\n        aria-labelledby={triggerId}\n        className=\"accordion__panel\"\n        hidden={!isOpen}\n      >\n        <div className=\"accordion__content\">\n          {children}\n        </div>\n      </div>\n    </div>\n  )\n}\n```\n\n## Usage\n\n```tsx\nYou can return items within 30 days of purchase...</p>\n  \n  \n    <p>Standard shipping takes 5-7 business days...</p>\n  \n  \n    <p>Yes, we ship to over 50 countries...</p>\n  \n\n```\n\n## Keyboard Navigation\n\n| Key | Action |\n|-----|--------|\n| `Enter` / `Space` | Toggle panel open/closed |\n| `Arrow Down` | Move focus to next header |\n| `Arrow Up` | Move focus to previous header |\n| `Home` | Move focus to first header |\n| `End` | Move focus to last header |\n\n## Native HTML Details/Summary\n\n```html\n<!-- Simple native accordion (limited styling) -->\n<details class=\"accordion-native\">\n  <summary>Section Title</summary>\n  <div class=\"accordion-native__content\">\n    <p>Content here...</p>\n  </div>\n</details>\n\n<details class=\"accordion-native\">\n  <summary>Another Section</summary>\n  <div class=\"accordion-native__content\">\n    <p>More content...</p>\n  </div>\n</details>\n```\n\n```tsx\n// React wrapper for details/summary\nfunction NativeAccordion({ title, children, defaultOpen = false }) {\n  return (\n    <details open={defaultOpen} className=\"accordion-native\">\n      <summary>{title}</summary>\n      <div className=\"accordion-native__content\">\n        {children}\n      </div>\n    </details>\n  )\n}\n```\n\n## Styling\n\n```css\n.accordion {\n  border: 1px solid #e0e0e0;\n  border-radius: 8px;\n  overflow: hidden;\n}\n\n.accordion__item {\n  border-bottom: 1px solid #e0e0e0;\n}\n\n.accordion__item:last-child {\n  border-bottom: none;\n}\n\n.accordion__header {\n  margin: 0;\n}\n\n.accordion__trigger {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  width: 100%;\n  padding: 1rem 1.5rem;\n  font-size: 1rem;\n  font-weight: 600;\n  text-align: left;\n  background: #fff;\n  border: none;\n  cursor: pointer;\n  transition: background-color 0.2s;\n}\n\n.accordion__trigger:hover {\n  background: #f5f5f5;\n}\n\n.accordion__trigger:focus-visible {\n  outline: 2px solid #0066cc;\n  outline-offset: -2px;\n}\n\n.accordion__icon {\n  width: 1.25rem;\n  height: 1.25rem;\n  transition: transform 0.2s;\n}\n\n.accordion__trigger[aria-expanded=\"true\"] .accordion__icon {\n  transform: rotate(180deg);\n}\n\n.accordion__panel[hidden] {\n  display: none;\n}\n\n.accordion__content {\n  padding: 0 1.5rem 1rem;\n}\n\n/* Animation */\n.accordion__panel {\n  animation: slideDown 0.2s ease-out;\n}\n\n@keyframes slideDown {\n  from {\n    opacity: 0;\n    transform: translateY(-8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .accordion__panel,\n  .accordion__icon {\n    animation: none;\n    transition: none;\n  }\n}\n```\n\n## Verification\n\n1. Tab to first accordion header\n2. Press Enter/Space to toggle\n3. Use Arrow keys to navigate between headers\n4. Press Home/End to jump to first/last\n5. Test with screen reader (announces expanded state)\n6. Verify heading structure in accessibility tree\n7. Check focus is visible on all interactive elements\n\nChoose an appropriate heading level (h2, h3, etc.) based on the accordion's position in the document outline. Don't skip heading levels.","skills/affiliate-disclosure/SKILL.md":"---\nname: affiliate-disclosure\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Provide clear affiliate disclosures. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/affiliate-disclosure\n---\n\n# Provide clear affiliate disclosures\n\nClear disclosures are required by law (e.g., FTC guidelines) and are essential for maintaining user trust and preventing search engine penalties for hidden advertisements.\n\n## Quick Reference\n\n- Add a clear and conspicuous disclosure for any affiliate or sponsored links\n- Place the disclosure at the top of the page, before any affiliate links appear\n- Use simple, unambiguous language to explain the financial relationship\n\n## Check\n\nVerify that all pages containing affiliate links or sponsored content have a clear, visible disclosure before the links appear.\n\n## Fix\n\nAdd a standardized disclosure statement at the beginning of your content or near affiliate links to inform users of the partnership.\n\n## Explain\n\nExplain the legal and ethical importance of affiliate disclosures and how they impact user trust and SEO.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Provide clear affiliate disclosures. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/affiliate-disclosure\n","skills/affiliate-disclosure/references/rule.md":"# Provide clear affiliate disclosures\n\n> Checks for affiliate and sponsored content disclosures to maintain transparency.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nTransparency regarding financial incentives is crucial for building a sustainable relationship with your audience and complying with consumer protection laws.\n\n## Code Example\n\n```html\n<article>\n  <header>\n    <h1>The Best Laptops for Developers in 2024</h1>\n    <div class=\"disclosure\" style=\"background: #f9f9f9; padding: 10px; border-radius: 4px;\">\n      <p><small><em>Disclaimer: This post contains affiliate links. If you click on one and make a purchase, we may receive a small commission at no extra cost to you.</em></small></p>\n    </div>\n  </header>\n  \n  <p>Looking for a new laptop? Here are our top recommendations...</p>\n</article>\n```\n\n## Why It Matters\n\n- **Legal Compliance**: Adheres to FTC (Federal Trade Commission) and other international regulations regarding online advertising.\n- **User Trust**: Demonstrates honesty and transparency, which can lead to higher conversion rates over time.\n- **SEO Quality**: Prevents being flagged for \"sneaky redirects\" or hidden affiliate programs that can negatively impact rankings.\n- **E-E-A-T**: Supports the \"Trust\" pillar by showing you aren't hiding financial motivations.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/ai-content/SKILL.md":"---\nname: ai-content\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Audit and refine AI-generated content. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/ai-content\n---\n\n# Audit and refine AI-generated content\n\nSearch engines prioritize helpful, reliable, people-first content; unedited AI content often lacks the depth and accuracy required for high rankings.\n\n## Quick Reference\n\n- Review AI-generated content for accuracy, unique value, and human-like voice\n- Ensure content isn't just a rewrite of existing top-ranking articles\n- Verify all factual claims and include original research or insights\n\n## Check\n\nReview the content to see if it provides unique value beyond what AI models can generate by default.\n\n## Fix\n\nRewrite AI-generated sections to include original research, personal experiences, and a unique brand voice.\n\n## Explain\n\nExplain why human oversight is necessary for AI-generated content to meet SEO quality standards and user expectations.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Audit and refine AI-generated content. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/ai-content\n","skills/ai-content/references/rule.md":"# Audit and refine AI-generated content\n\n> Detects and reviews content that appears to be primarily AI-generated to ensure quality.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nWhile AI tools can assist in the writing process, the final output still has to satisfy [Google's Search Essentials](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) and deliver the depth expected from [high-quality content](/en/rules/seo/quality) that genuinely helps the reader.\n\n## Code Example\n\nWhile there's no \"code\" to detect AI, you can signal human involvement and expertise in your metadata and bylines.\n\n```html\n<article>\n  <header>\n    <h1>Advanced TypeScript Patterns</h1>\n    <div class=\"meta\">\n      <span>By Jane Smith, Senior Engineer</span>\n      <span>Fact-checked on October 20, 2023</span>\n    </div>\n  </header>\n  \n  <p>In this article, we'll explore patterns I've used in production at ScaleTech...</p>\n</article>\n```\n\n## Why It Matters\n\n- **Quality Standards**: Google's guidance on [creating helpful, reliable, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) targets low-value automation that does not add original insight.\n- **Accuracy**: AI can hallucinate facts; human verification is essential for [YMYL content](/en/rules/seo/ymyl-detection), where bad advice can cause real harm.\n- **Uniqueness**: Prevents your site from becoming a \"carbon copy\" of other sites using the same AI prompts.\n- **User Experience**: Human-edited content is generally more engaging, nuanced, and better at solving specific user problems.\n\nIf a draft feels generic, unsupported, or too close to what a model would produce by default, review it alongside thin-content risk before deciding it is ready to publish.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/all-noindex-pages/SKILL.md":"---\nname: all-noindex-pages\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Audit all noindex pages. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/all-noindex-pages\n---\n\n# Audit all noindex pages\n\nAn incorrect `noindex` tag can completely remove important pages from search results, while proper usage helps manage crawl budget and prevents duplicate content issues.\n\n## Quick Reference\n\n- Identify all pages using the `noindex` directive in meta tags or headers\n- Verify that critical pages (products, articles) aren't accidentally blocked\n- Ensure `noindex` is correctly applied to thin content, admin, or utility pages\n\n## Check\n\nVerify that the `noindex` directive is only applied to pages that should not appear in search results.\n\n## Fix\n\nRemove `&lt;meta name=\"robots\" content=\"noindex\"&gt;` from pages that should be indexed and ranking.\n\n## Explain\n\nExplain the difference between `noindex` and `disallow` in robots.txt and when to use each for optimal SEO.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Audit all noindex pages. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/all-noindex-pages\n","skills/all-noindex-pages/references/rule.md":"# Audit all noindex pages\n\n> Lists and reviews all pages blocked from indexing to ensure critical content is accessible.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nRegularly auditing your `noindex` directives ensures that you are only blocking pages that don't provide search value, such as staging environments, admin panels, or internal search results.\n\n## Code Example\n\n```html\n<head>\n  <!-- Use this for utility pages like 'Thank You' pages or internal search results -->\n  <meta name=\"robots\" content=\"noindex, follow\">\n  \n  <!-- For pages that should be completely ignored -->\n  <meta name=\"robots\" content=\"noindex, nofollow\">\n</head>\n```\n\n## Why It Matters\n\n- **Visibility**: Prevents accidental exclusion of high-value pages from Google and Bing.\n- **Crawl Budget**: Helps search engines focus their limited crawl resources on your most important pages.\n- **De-indexing**: Useful for removing outdated or sensitive pages from search results without deleting them.\n- **Strategic Control**: Allows you to manage which versions of content (e.g., filtered lists) are available for indexing.\n\n## Exceptions\n\n- Staging, utility, login, account, or internal search pages may intentionally use different crawl or index signals if they are not meant to rank.\n- Temporary migration states can produce noisy intermediate signals; flag the live production URL pattern, not one-off transition artifacts.\n- When redirects, canonicals, robots directives, or indexability signals conflict, fix the strongest final signal first instead of reporting every downstream symptom as a separate blocker.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/alt-text/SKILL.md":"---\nname: alt-text\ndescription: \"Use when reviewing image assets, markup, and CDN or build transforms related to Provide meaningful alt text for images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.\"\nmetadata:\n  category: images\n  priority: critical\n  difficulty: beginner\n  estimatedTime: \"15\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/images/alt-text\n---\n\n# Provide meaningful alt text for images\n\nApproximately 2.2 billion people worldwide have vision impairment. Screen readers read the alt attribute aloud—without meaningful alt text, users who are blind receive no information about image content. Missing alt text also fails WCAG 2.1 Success Criterion 1.1.1, which is a Level A (minimum) requirement. Search engines also rely on alt text to index image content.\n\n## Quick Reference\n\n- Every `<img>` must have an `alt` attribute—omitting it entirely violates WCAG 2.1 SC 1.1.1\n- Decorative images use `alt=\"\"` so screen readers ignore them\n- Alt text should describe the image's *purpose*, not just its appearance\n- Linked images: alt describes the link destination, not the visual\n\n## Check\n\nScan all <img> elements in the codebase. Verify: 1) Every <img> has an alt attribute (missing alt is an error). 2) Decorative images use alt=\"\". 3) Informative images have descriptive text that conveys the image's meaning—not just its file name. 4) Images that are links describe the destination. 5) Images of text reproduce the text in alt. Flag any <img> without alt, with alt matching the filename (e.g., alt=\"photo1.jpg\"), or with generic values like alt=\"image\" or alt=\"photo\".\n\n## Fix\n\nFor each image missing or with poor alt text: 1) Informative images—describe what the image conveys, not just what it shows (e.g., alt=\"Bar chart showing 40% increase in sales Q3 2024\" not alt=\"chart\"). 2) Decorative images—add alt=\"\" so screen readers skip them. 3) Linked images—describe the link destination (e.g., alt=\"Visit our Twitter profile\"). 4) Images of text—copy the text verbatim into alt. 5) Complex images (charts, infographics)—provide a short alt plus a longer description via aria-describedby or a visible caption.\n\n## Explain\n\nExplain WCAG 2.1 Success Criterion 1.1.1 Non-text Content: every image must have a text alternative. Screen readers announce the alt attribute aloud—without it, users who are blind or have low vision cannot understand the page. Bad alt text (like alt=\"image\") is no better than no alt text. Decorative images must use alt=\"\" explicitly so screen readers skip them entirely—omitting alt causes some screen readers to announce the filename.\n\n## Code Review\n\nReview image assets, markup, and delivery configuration related to Provide meaningful alt text for images. Flag exact files or components where format choice, sizing, or loading behavior violates the rule, and describe how to confirm the fix in DevTools.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/images/alt-text\n","skills/alt-text/references/rule.md":"# Provide meaningful alt text for images\n\n> Every informative image has a descriptive alt attribute; decorative images use alt=\"\" to be ignored by screen readers.\n\n**Priority:** critical · **Difficulty:** beginner · **Time:** 15 min\n\n---\nThe `alt` attribute is the primary accessibility mechanism for images. Every `<img>` must have an `alt` attribute. Its value depends on the image's role.\n\nUse the [W3C alt decision tree](https://www.w3.org/WAI/tutorials/images/decision-tree/) to determine the correct alt value for any image type.\n\n## Code Example\n\nImages that convey meaning need descriptive alt text explaining what the image communicates.\n\n```html\n<!-- ❌ Bad: Missing alt -->\n<img src=\"revenue-chart.png\">\n\n<!-- ❌ Bad: Filename as alt -->\n<img src=\"revenue-chart.png\" alt=\"revenue-chart.png\">\n\n<!-- ❌ Bad: Generic alt -->\n<img src=\"revenue-chart.png\" alt=\"chart\">\n\n<!-- ✅ Good: Describes what the image conveys -->\n<img\n  src=\"revenue-chart.png\"\n  alt=\"Bar chart showing Q3 2024 revenue increased 40% year-over-year, reaching $2.4M\"\n>\n```\n\n## Why It Matters\n\nApproximately 2.2 billion people worldwide have vision impairment. Screen readers read the alt attribute aloud—without meaningful alt text, users who are blind receive no information about image content. Missing alt text also fails WCAG 2.1 Success Criterion 1.1.1, which is a Level A (minimum) requirement. Search engines also rely on alt text to index image content.\n\n## Decorative Images\n\nImages used purely for visual decoration carry no information and should be hidden from assistive technology.\n\n```html\n<!-- ❌ Bad: No alt attribute—screen reader may announce the filename -->\n<img src=\"decorative-swirl.png\">\n\n<!-- ✅ Good: Empty alt hides image from screen readers -->\n<img src=\"decorative-swirl.png\" alt=\"\">\n\n<!-- ✅ Good: Or use CSS background images for decoration -->\n<div class=\"decorative-swirl\" aria-hidden=\"true\"></div>\n```\n\n## Images Used as Links\n\nWhen an `<img>` is inside an `<a>`, the alt text must describe the link destination, not the visual appearance.\n\n```html\n<!-- ❌ Bad: Describes appearance, not destination -->\n<a href=\"https://twitter.com/example\">\n  <img src=\"twitter-logo.svg\" alt=\"Blue bird logo\">\n</a>\n\n<!-- ✅ Good: Describes the link destination -->\n<a href=\"https://twitter.com/example\">\n  <img src=\"twitter-logo.svg\" alt=\"Follow us on Twitter\">\n</a>\n```\n\n## Images of Text\n\nIf an image contains text (e.g., a logo, banner, or screenshot), reproduce that text verbatim in alt.\n\n```html\n<!-- ✅ Good: Alt reproduces the text shown in the image -->\n<img src=\"sale-banner.png\" alt=\"Summer Sale — 50% off all items\">\n\n<!-- ✅ Good: Logo with company name -->\n<img src=\"logo.svg\" alt=\"Acme Corp\">\n```\n\n## Complex Images (Charts, Diagrams)\n\nFor complex visuals, provide a brief alt plus a longer description accessible to all users.\n\n```html\n<!-- Using aria-describedby to link to a visible description -->\n<figure>\n  <img\n    src=\"org-chart.png\"\n    alt=\"Company organisational chart\"\n    aria-describedby=\"org-chart-desc\"\n  >\n  <figcaption id=\"org-chart-desc\">\n    The chart shows three departments reporting to the CEO: Engineering (12 staff),\n    Marketing (8 staff), and Operations (5 staff).\n  </figcaption>\n</figure>\n```\n\n## Framework Examples\n\n  \n\n```tsx\ninterface ImageProps {\n  src: string\n  alt: string\n  decorative?: boolean\n}\n\nfunction AccessibleImage({ src, alt, decorative = false }: ImageProps) {\n  return (\n    <img\n      src={src}\n      // Decorative images use empty string; informative images use descriptive text\n      alt={decorative ? '' : alt}\n    />\n  )\n}\n\n// Usage\n\n```\n\n  \n  \n\n```tsx\n\n// Next.js Image requires alt; use \"\" for decorative\nfunction HeroBanner() {\n  return (\n    <>\n      {/* Informative */}\n      \n\n      {/* Decorative */}\n      \n    </>\n  )\n}\n```\n\n  \n\n## Standards\n\n- Use these references as the standard for the final image format, delivery, accessibility, and rendering behavior.\n- Check the implementation against MDN: Responsive images before treating the rule as satisfied.\n- Check the implementation against web.dev: Image performance before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Run axe DevTools or WAVE on the page—both flag missing or empty non-decorative alt attributes\n- Use Lighthouse Accessibility audit—\"Images do not have alternate text\" is a scored item\n\n### Manual Checks\n\n- Enable a screen reader (VoiceOver, NVDA, or JAWS) and navigate through images with the `G` key\n- Inspect the Network tab: for any image URL, verify the corresponding `<img>` has a meaningful `alt`\n- **CAPTCHA images** — provide alt describing the purpose, not the characters (e.g., `alt=\"CAPTCHA: type the characters shown\"`), and offer an audio alternative per WCAG 1.1.1\n- **SVG icons with adjacent text labels** — if the icon's meaning is already conveyed by visible text, use `aria-hidden=\"true\"` on the SVG instead of alt","skills/anchor-smooth-scroll/SKILL.md":"---\nname: anchor-smooth-scroll\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide instant anchor scroll option. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: low\n  difficulty: beginner\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/anchor-smooth-scroll\n---\n\n# Provide instant anchor scroll option\n\nSmooth scroll animations can trigger vertigo, nausea, and disorientation for users with vestibular disorders—instant navigation is safer and often faster.\n\n## Quick Reference\n\n- Disable smooth scroll when prefers-reduced-motion is set\n- Use CSS scroll-behavior: smooth with media query check\n- Ensure focus moves to anchor target for keyboard users\n- Provide instant scroll as default or fallback\n\n## Check\n\nClick anchor links (same-page navigation) and verify smooth scrolling is disabled when prefers-reduced-motion is set. Confirm anchor navigation works correctly with keyboard and screen readers.\n\n## Fix\n\nUse scroll-behavior: smooth only within a prefers-reduced-motion media query check. Provide instant scrolling as the default or reduced-motion fallback. Ensure focus moves to the anchor target.\n\n## Explain\n\nExplain how animated scroll transitions can cause motion sickness and disorientation for users with vestibular disorders, and why instant navigation is often preferable for accessibility.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Provide instant anchor scroll option. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/anchor-smooth-scroll\n","skills/anchor-smooth-scroll/references/rule.md":"# Provide instant anchor scroll option\n\n> Smooth scroll animations to anchor links respect motion preferences or provide an instant alternative.\n\n**Priority:** low · **Difficulty:** beginner · **Time:** 10 min\n\n---\nSmooth scrolling should respect motion preferences to avoid triggering vestibular disorders.\n\n## Code Example\n\n```css\n/* ❌ Bad: Always smooth, ignores preferences */\nhtml {\n  scroll-behavior: smooth;\n}\n\n/* ✅ Good: Respect motion preferences */\n@media (prefers-reduced-motion: no-preference) {\n  html {\n    scroll-behavior: smooth;\n  }\n}\n\n/* Users who prefer reduced motion get instant scrolling (default) */\n```\n\n## Why It Matters\n\nSmooth scroll animations can trigger vertigo, nausea, and disorientation for users with vestibular disorders—instant navigation is safer and often faster.\n\n## JavaScript Approach\n\n```typescript\nfunction scrollToElement(elementId: string) {\n  const element = document.getElementById(elementId)\n  if (!element) return\n\n  const prefersReducedMotion = window.matchMedia(\n    '(prefers-reduced-motion: reduce)'\n  ).matches\n\n  element.scrollIntoView({\n    behavior: prefersReducedMotion ? 'instant' : 'smooth',\n    block: 'start'\n  })\n\n  // Move focus to target for keyboard users\n  element.focus({ preventScroll: true })\n}\n```\n\n## React Hook\n\n```tsx\nfunction useScrollToAnchor() {\n  const prefersReducedMotion = useReducedMotion()\n\n  const scrollTo = useCallback((elementId: string) => {\n    const element = document.getElementById(elementId)\n    if (!element) return\n\n    element.scrollIntoView({\n      behavior: prefersReducedMotion ? 'instant' : 'smooth',\n      block: 'start'\n    })\n\n    // Set tabindex if element isn't focusable\n    if (!element.hasAttribute('tabindex')) {\n      element.setAttribute('tabindex', '-1')\n    }\n    element.focus({ preventScroll: true })\n  }, [prefersReducedMotion])\n\n  return scrollTo\n}\n\nfunction useReducedMotion() {\n  const [prefersReduced, setPrefersReduced] = useState(false)\n\n  useEffect(() => {\n    const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n    setPrefersReduced(mediaQuery.matches)\n\n    const handler = (e: MediaQueryListEvent) => setPrefersReduced(e.matches)\n    mediaQuery.addEventListener('change', handler)\n    return () => mediaQuery.removeEventListener('change', handler)\n  }, [])\n\n  return prefersReduced\n}\n```\n\n## Anchor Link Component\n\n```tsx\ninterface AnchorLinkProps {\n  href: string\n  children: React.ReactNode\n}\n\nfunction AnchorLink({ href, children }: AnchorLinkProps) {\n  const scrollTo = useScrollToAnchor()\n\n  const handleClick = (e: React.MouseEvent) => {\n    if (href.startsWith('#')) {\n      e.preventDefault()\n      scrollTo(href.slice(1))\n    }\n  }\n\n  return (\n    <a href={href} onClick={handleClick}>\n      {children}\n    </a>\n  )\n}\n```\n\n## Focus Management\n\n```html\n<!-- Target must be focusable for keyboard navigation -->\n<section id=\"features\" tabindex=\"-1\">\n  <h2>Features</h2>\n  <!-- Content -->\n</section>\n```\n\n```css\n/* Hide focus ring when section is focused via anchor */\nsection:focus {\n  outline: none;\n}\n\n/* But show focus for keyboard navigation */\nsection:focus-visible {\n  outline: 2px solid var(--focus-color);\n}\n```\n\n## Exceptions\n\n- Simple data tables can sometimes fail more from missing header relationships than from missing enhancements such as captions or mobile wrappers, so prioritize the strongest semantic issue.\n- Do not convert layout structures into data-table markup just to satisfy a rule; the correct fix may be to remove table semantics entirely.\n- When several table-accessibility issues overlap, resolve the header-cell relationship first because downstream announcements depend on it.\n\n## Verification\n\n### Automated Checks\n\n- Use browser accessibility tooling, axe, Lighthouse, or equivalent automated checks against a representative rendered state.\n\n### Manual Checks\n\n- Enable \"Reduce motion\" in system accessibility settings\n- Click anchor links—should scroll instantly, not smoothly\n- Verify focus moves to target section\n- Tab through page after anchor click—focus should continue from anchor target","skills/anchor-text/SKILL.md":"---\nname: anchor-text\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Use descriptive anchor text. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: beginner\n  estimatedTime: \"5\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/anchor-text\n---\n\n# Use descriptive anchor text\n\nDescriptive anchor text helps search engines understand the context of the linked page and significantly improves accessibility for users using screen readers.\n\n## Quick Reference\n\n- Use descriptive text for links instead of generic phrases like 'click here' or 'read more'\n- Ensure the anchor text provides clear context about the linked page's content\n- Avoid over-optimizing with excessive keyword stuffing in your internal links\n\n## Check\n\nVerify that all links in the content use descriptive anchor text that accurately describes the target page.\n\n## Fix\n\nReplace generic link text like 'click here' with descriptive phrases that include relevant keywords for the destination page.\n\n## Explain\n\nExplain how descriptive anchor text improves both SEO crawlability and web accessibility for disabled users.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Use descriptive anchor text. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/anchor-text\n","skills/anchor-text/references/rule.md":"# Use descriptive anchor text\n\n> Checks for descriptive, keyword-rich anchor text that provides context for users and search engines.\n\n**Priority:** medium · **Difficulty:** beginner · **Time:** 5 min\n\n---\nAnchor text is the clickable text in a hyperlink. It should provide a clear indication of what the user will find when they click the link.\n\n## Code Example\n\n```html\n<!-- ✅ Good: Descriptive and contextual -->\n<p>For more information, read our <a href=\"/seo-guide\">complete guide to SEO best practices</a>.</p>\n\n<!-- ❌ Bad: Generic and provides no context -->\n<p>To learn more about our SEO services, <a href=\"/seo-guide\">click here</a>.</p>\n```\n\n## Why It Matters\n\n- **Search Context**: Tells search engines what the linked page is about, helping it rank for those terms.\n- **Accessibility**: Screen reader users often navigate via a list of links; descriptive text makes this list meaningful.\n- **User Trust**: Users are more likely to click a link when they know exactly where it leads.\n- **Internal Navigation**: Helps distribute authority throughout your site by creating a logical web of related content.\n\n## Exceptions\n\n- Utility or intentionally noindex pages may keep minimal metadata when richer search presentation is not a goal.\n- Template-driven pages can look repetitive in isolation; confirm the fully rendered production output before flagging duplication or omission.\n- If a page is intentionally redirected or excluded from indexation, resolve that crawlability decision before treating metadata polish as the primary issue.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/animated-content/SKILL.md":"---\nname: animated-content\ndescription: \"Use when auditing slow page loads, heavy assets, or rendering delays related to Convert animated GIFs to video. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.\"\nmetadata:\n  category: performance\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/performance/animated-content\n---\n\n# Convert animated GIFs to video\n\nLarge animated GIFs can significantly increase page weight and consume excessive CPU/memory, leading to slower page loads and poor scrolling performance.\n\n## Quick Reference\n\n- Use `<video>` instead of large GIFs for animations\n- GIFs are significantly larger than MP4/WebM\n- Videos allow for better control and performance\n\n## Check\n\nCheck for large animated GIFs that could be replaced with more efficient video formats like MP4 or WebM.\n\n## Fix\n\nConvert animated GIFs to MP4 or WebM and use the `<video>` tag with `autoplay`, `loop`, `muted`, and `playsinline` attributes.\n\n## Explain\n\nExplain why video formats are more efficient than GIFs for animated content and how they improve performance.\n\n## Code Review\n\nReview the routes, assets, and loading behavior that affect Convert animated GIFs to video. Flag exact files, requests, or rendering steps that add unnecessary network, CPU, or layout cost, and describe the measurement method used to confirm the issue.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/performance/animated-content\n","skills/animated-content/references/rule.md":"# Convert animated GIFs to video\n\n> Large animated GIFs are replaced with more efficient video formats like MP4 or WebM to reduce page weight.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nLarge animated GIFs are often used for short animations, but they are highly inefficient compared to modern video formats. Converting these to MP4 or WebM can reduce file sizes by 80% or more.\n\n## Code Examples\n\n#\n\n## Traditional GIF (Inefficient)\n```html\n<img src=\"animation.gif\" alt=\"Description of animation\">\n```\n\n### Optimized Video (Recommended)\nUsing the `<video>` tag with specific attributes to mimic GIF behavior:\n\n```html\n<video\n  autoplay\n  loop\n  muted\n  playsinline\n  poster=\"animation-frame.jpg\"\n>\n  <source src=\"animation.webm\" type=\"video/webm\">\n  <source src=\"animation.mp4\" type=\"video/mp4\">\n  Your browser does not support the video tag.\n</video>\n```\n\n## Why It Matters\n\n- **Page Weight**: GIFs are uncompressed and can easily reach several megabytes, slowing down page loads.\n- **CPU Usage**: Browsers consume more CPU/GPU resources to decode and render large GIFs compared to optimized video.\n- **Battery Life**: On mobile devices, the high resource usage of GIFs can significantly drain battery.\n- **User Experience**: Large assets delay the completion of page loading and can cause stuttering during scrolling.\n\n## Best Practices\n\nFavor [browser-native video delivery guidance from web.dev](https://web.dev/learn/performance) when deciding whether an animation should stay a GIF at all, because the biggest wins usually come from eliminating heavy animated assets rather than just caching them better.\n\n✅ **Use Modern Formats**: Provide WebM for modern browsers and MP4 as a fallback.\n✅ **Add Poster Images**: Use the `poster` attribute to show a static frame while the video loads.\n✅ **Mute by Default**: Always use `muted` for autoplaying videos to ensure they work across all browsers.\n✅ **Lazy Loading**: Use `loading=\"lazy\"` or Intersection Observer for videos below the fold.\n\n❌ **Avoid GIF for Large Animations**: Never use GIF for animations larger than a few hundred pixels or longer than a second.\n❌ **Don't Forget Accessibility**: Always provide alternative text or a description for the animation.\n\n## Tools & Validation\n\n- [FFmpeg](https://ffmpeg.org/): Command-line tool for converting GIFs to video.\n- [Cloudinary/Imgix](https://cloudinary.com/): Automated media optimization services.\n- [Lighthouse](https://developers.google.com/web/tools/lighthouse): Checks for large GIFs and suggests video alternatives.\n\n## Standards\n\n- Use web.dev: Learn Performance as the standard for measuring the final production behavior, not just local synthetic output.\n- Use Chrome Developers: Lighthouse overview as the standard for measuring the final production behavior, not just local synthetic output.\n\n## Verification\n\n### Automated Checks\n\n- Measure the affected page or flow in Lighthouse, PageSpeed Insights, or DevTools and confirm the targeted metric improves.\n- Inspect the network waterfall or performance timeline to confirm the intended resource or execution change actually took effect.\n\n### Manual Checks\n\n- Verify the change on a throttled mobile profile, not just local desktop.\n- If this rule maps to a budget or Web Vital, confirm the page now stays within that threshold.","skills/animation-performance/SKILL.md":"---\nname: animation-performance\ndescription: \"Use when reviewing stylesheets, component styles, and responsive behavior related to Use transform and opacity for animations. Check the rendered layout across breakpoints and interaction states before proposing a fix.\"\nmetadata:\n  category: css\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/css/animation-performance\n---\n\n# Use transform and opacity for animations\n\nAnimating layout properties (width, height, top, margin) triggers the full browser rendering pipeline on every frame — style recalculation, layout, paint, and composite. This runs on the main thread and competes with JavaScript. Animating transform and opacity skips layout and paint entirely and runs on a dedicated GPU thread, achieving smooth 60fps even when the main thread is busy.\n\n## Quick Reference\n\n- Only transform and opacity can be composited on the GPU without triggering layout\n- Use will-change: transform sparingly to promote an element to its own compositor layer\n- Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n- Respect prefers-reduced-motion to disable animations for users who need it\n\n## Check\n\nFind CSS animations or transitions in this file that animate layout-triggering properties like top, left, width, height, or margin. Flag them for optimization.\n\n## Fix\n\nConvert layout-triggering animations to use transform equivalents: position changes to translate(), size changes to scale().\n\n## Explain\n\nExplain the browser rendering pipeline, why transform and opacity are performant for animation, and how the GPU compositor works.\n\n## Code Review\n\nReview stylesheets, component styles, and responsive states related to Use transform and opacity for animations. Flag exact selectors, declarations, or breakpoints that violate the rule in the rendered UI.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/css/animation-performance\n","skills/animation-performance/references/rule.md":"# Use transform and opacity for animations\n\n> Animate with CSS transform and opacity properties to keep animations running on the GPU compositor thread at 60fps, avoiding layout-triggering properties like top, left, width, and height.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nThe browser renders pages through a pipeline: Style → Layout → Paint → Composite. Animating the wrong properties restarts this pipeline every frame. Animating `transform` and `opacity` only triggers the composite step.\n\n## Code Example\n\n```\nLayout-triggering properties (avoid animating):\n  width, height, margin, padding, top, left, right, bottom,\n  border-width, font-size, display, position\n\nPaint-triggering properties (acceptable, but not ideal):\n  color, background-color, box-shadow, border-color,\n  outline, text-shadow\n\nCompositor-only properties (optimal for animation):\n  transform (translate, scale, rotate, skew)\n  opacity\n  filter (on composited layers)\n```\n\n## Why It Matters\n\nAnimating layout properties (width, height, top, margin) triggers the full browser rendering pipeline on every frame — style recalculation, layout, paint, and composite. This runs on the main thread and competes with JavaScript. Animating transform and opacity skips layout and paint entirely and runs on a dedicated GPU thread, achieving smooth 60fps even when the main thread is busy.\n\n## Converting Position Animations\n\n```css\n/* ❌ Bad: animates layout properties — triggers full reflow each frame */\n.slide-in {\n  animation: slideIn 300ms ease-out;\n}\n\n@keyframes slideIn {\n  from { left: -100%; }\n  to { left: 0; }\n}\n\n/* ✅ Good: translate() is compositor-only */\n.slide-in {\n  animation: slideIn 300ms ease-out;\n}\n\n@keyframes slideIn {\n  from { transform: translateX(-100%); }\n  to { transform: translateX(0); }\n}\n```\n\n## Converting Size Animations\n\n```css\n/* ❌ Animates width/height — expensive */\n.expand {\n  animation: expand 300ms ease;\n}\n@keyframes expand {\n  from { width: 0; height: 0; }\n  to { width: 200px; height: 200px; }\n}\n\n/* ✅ Use scale() */\n.expand {\n  width: 200px;\n  height: 200px;\n  animation: expand 300ms ease;\n}\n@keyframes expand {\n  from { transform: scale(0); }\n  to { transform: scale(1); }\n}\n```\n\n## Common Performant Patterns\n\n```css\n/* Fade in */\n.fade-in {\n  animation: fadeIn 300ms ease;\n}\n@keyframes fadeIn {\n  from { opacity: 0; }\n  to { opacity: 1; }\n}\n\n/* Slide up and fade in */\n.slide-up {\n  animation: slideUp 400ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n@keyframes slideUp {\n  from {\n    opacity: 0;\n    transform: translateY(16px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n/* Button press */\n.button:active {\n  transform: scale(0.97);\n}\n```\n\n## will-change (Use Sparingly)\n\n```css\n/* Hint to browser to promote this element to its own layer before animation starts */\n.animated-card {\n  will-change: transform;\n}\n\n/* ⚠️ Don't apply to too many elements — each layer uses GPU memory */\n/* Apply just before animation, remove after */\n```\n\n## Respecting Reduced Motion\n\n```css\n/* ✅ Always honor the user's motion preferences */\n.slide-in {\n  animation: slideIn 400ms ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .slide-in {\n    animation: none;\n    /* Provide a non-animated alternative if needed */\n  }\n}\n\n/* Or use the safe pattern */\n@media (prefers-reduced-motion: no-preference) {\n  .slide-in {\n    animation: slideIn 400ms ease;\n  }\n}\n```\n\n## Verification\n\n1. Inspect the rendered UI at the breakpoints and interaction states affected by the rule.\n2. Confirm the computed styles match the intended fix in DevTools.\n3. Test at least one mobile and one desktop viewport before shipping.\n4. If the rule affects motion, contrast, or layout stability, verify those user-facing outcomes directly.","skills/aria-allowed-attr/SKILL.md":"---\nname: aria-allowed-attr\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use only allowed ARIA attributes for each role. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-allowed-attr\n---\n\n# Use only allowed ARIA attributes for each role\n\nInvalid ARIA attributes are ignored by screen readers or may cause them to misinterpret the element's purpose, leading to a broken experience for users with disabilities.\n\n## Quick Reference\n\n- Each ARIA role only supports a specific set of ARIA attributes\n- Using unsupported attributes can confuse assistive technologies\n- Ensures the accessibility tree remains valid and meaningful\n\n## Check\n\nVerify that all ARIA attributes used on elements are valid for their assigned WAI-ARIA roles.\n\n## Fix\n\nRemove or correct ARIA attributes that are not supported by the element's current ARIA role.\n\n## Explain\n\nExplain why using only role-supported ARIA attributes is necessary for proper screen reader communication.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Use only allowed ARIA attributes for each role. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-allowed-attr\n","skills/aria-allowed-attr/references/rule.md":"# Use only allowed ARIA attributes for each role\n\n> Checks that ARIA attributes are allowed on their elements to ensure valid accessibility trees.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nARIA (Accessible Rich Internet Applications) attributes must match the role of the element they are applied to. Using attributes that don't belong to a role can result in \"silent\" failures where accessibility information is lost.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: aria-checked is allowed on checkbox role -->\n<div role=\"checkbox\" aria-checked=\"true\" tabindex=\"0\">Subscribe</div>\n\n<!-- ❌ Incorrect: aria-checked is NOT allowed on a heading role -->\n<h1 role=\"heading\" aria-checked=\"true\">Main Title</h1>\n```\n\n## Why It Matters\n\n- **Standard Compliance**: Adheres to WAI-ARIA specifications for robust and predictable web applications.\n- **AT Accuracy**: Guarantees that assistive technologies receive correct and relevant information about the element's state.\n- **Reduced Noise**: Prevents developers from adding redundant, invalid, or confusing metadata to the DOM.\n- **Future Compatibility**: Valid ARIA usage ensures that your application remains accessible as browser and screen reader implementations evolve.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-command-name/SKILL.md":"---\nname: aria-command-name\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for ARIA command elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-command-name\n---\n\n# Provide accessible names for ARIA command elements\n\nWithout an accessible name, screen reader users will only hear the role (e.g., 'button') without knowing what it does, making the interface impossible to navigate.\n\n## Quick Reference\n\n- Elements with command roles (button, link, menuitem) must have a label\n- Accessible names can be provided via text content, `aria-label`, or `aria-labelledby`\n- Ensures users know the purpose of the interactive element\n\n## Check\n\nIdentify elements with command roles (like button or link) that lack a clear accessible name.\n\n## Fix\n\nAdd an accessible name using inner text, `aria-label`, or `aria-labelledby` to all command elements.\n\n## Explain\n\nExplain how accessible names for command elements enable screen reader users to understand interactive controls.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Provide accessible names for ARIA command elements. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-command-name\n","skills/aria-command-name/references/rule.md":"# Provide accessible names for ARIA command elements\n\n> Checks that command elements like buttons and links have accessible names for screen reader support.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nCommand elements are interactive controls that perform an action. For these to be usable by everyone, they must have a programmatically determinable name that describes their function.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Accessible name via text content -->\n<button>Submit Form</button>\n\n<!-- ✅ Correct: Accessible name via aria-label (for icon buttons) -->\n<button aria-label=\"Close dialog\">\n  <svg>...</svg>\n</button>\n\n<!-- ❌ Incorrect: No accessible name (empty or icon-only without label) -->\n<button>\n  <i class=\"fa fa-trash\"></i>\n</button>\n```\n\n## Why It Matters\n\n- **Clarity**: Informs users exactly what action will be performed when the element is activated.\n- **Navigability**: Allows users to find and activate controls via voice commands or by browsing lists of controls in their screen reader.\n- **Inclusion**: Provides a comparable experience for users who cannot see visual icons or cues.\n- **Avoids Confusion**: Prevents the \"unlabeled button\" experience, which is one of the most common accessibility barriers.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-deprecated-role/SKILL.md":"---\nname: aria-deprecated-role\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid using deprecated ARIA roles. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-deprecated-role\n---\n\n# Avoid using deprecated ARIA roles\n\nUsing deprecated roles can lead to inconsistent behavior across different browsers and screen readers as they transition to newer standards.\n\n## Quick Reference\n\n- Deprecated ARIA roles should be replaced with modern equivalents\n- Browsers may drop support for deprecated roles in future versions\n- Ensures long-term compatibility with assistive technologies\n\n## Check\n\nSearch the codebase for deprecated ARIA roles like `directory` or abstract roles that shouldn't be used in HTML.\n\n## Fix\n\nUpdate deprecated ARIA roles to their modern recommended equivalents or use native HTML elements.\n\n## Explain\n\nExplain the risks of using deprecated ARIA roles and the benefits of moving to modern ARIA standards.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Avoid using deprecated ARIA roles. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-deprecated-role\n","skills/aria-deprecated-role/references/rule.md":"# Avoid using deprecated ARIA roles\n\n> Checks for deprecated or abstract ARIA roles to ensure long-term compatibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nAs the WAI-ARIA specification evolves, some roles are deprecated in favor of more precise or better-supported alternatives. Using modern roles ensures your application remains accessible for years to come.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Use modern roles or native elements -->\n<nav aria-label=\"Site\">...</nav>\n<ul role=\"list\">...</ul>\n\n<!-- ❌ Incorrect: Using deprecated roles -->\n<div role=\"directory\">...</div>\n```\n\n## Why It Matters\n\n- **Future-Proofing**: Keeps the application compatible with evolving browser and assistive technology (AT) standards.\n- **Reliability**: Ensures consistent interpretation of element roles across all platforms and devices.\n- **Semantic Accuracy**: Modern roles often provide more precise meaning than older, deprecated ones, leading to a better user experience.\n- **Cleaner Code**: Often, a deprecated role can be replaced by a native HTML element (like `<nav>` instead of `role=\"navigation\"`), which is the preferred approach.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-dialog-name/SKILL.md":"---\nname: aria-dialog-name\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure dialogs have an accessible name. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-dialog-name\n---\n\n# Ensure dialogs have an accessible name\n\nWhen a dialog opens, screen readers should announce its purpose immediately so users know why their focus has shifted and what information is required.\n\n## Quick Reference\n\n- All dialog and alertdialog elements must have a descriptive label\n- Use `aria-labelledby` to point to a title or `aria-label` for a direct string\n- Helps users understand the context and purpose of the modal\n\n## Check\n\nVerify that every element with `role=\"dialog\"` or `role=\"alertdialog\"` has an accessible name.\n\n## Fix\n\nProvide an accessible name for the dialog using `aria-labelledby` (pointing to the header) or `aria-label`.\n\n## Explain\n\nExplain why naming dialogs is crucial for orienting screen reader users when modals appear.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Ensure dialogs have an accessible name. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-dialog-name\n","skills/aria-dialog-name/references/rule.md":"# Ensure dialogs have an accessible name\n\n> Checks that dialog elements have accessible names to orient screen reader users.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nDialogs (modals) interrupt the user's flow. To provide a smooth transition for assistive technology users, the dialog must identify itself as soon as it gains focus.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Using aria-labelledby to point to the header -->\n<div role=\"dialog\" aria-labelledby=\"modal-title\" aria-modal=\"true\">\n  <h2 id=\"modal-title\">Edit Profile</h2>\n  <form>...</form>\n</div>\n\n<!-- ✅ Correct: Using aria-label for a simple notification -->\n<div role=\"alertdialog\" aria-label=\"Session Timeout\" aria-modal=\"true\">\n  <p>Your session is about to expire.</p>\n  <button>Stay logged in</button>\n</div>\n\n<!-- ❌ Incorrect: No accessible name -->\n<div role=\"dialog\">\n  <p>Some content without a title...</p>\n</div>\n```\n\n## Why It Matters\n\n- **Orientation**: Helps users immediately understand they have entered a new context or \"window.\"\n- **Context**: Clearly states the purpose of the dialog (e.g., \"Confirm Deletion\") before the user starts interacting with its contents.\n- **Compliance**: Follows WAI-ARIA best practices for accessible modal windows and user interface patterns.\n- **Efficiency**: Allows users to decide whether to interact with or dismiss the dialog based on its title alone.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-hidden-body/SKILL.md":"---\nname: aria-hidden-body\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Do not use aria-hidden on the document body. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: critical\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-hidden-body\n---\n\n# Do not use aria-hidden on the document body\n\nSetting `aria-hidden=\"true\"` on the body effectively silences the entire application for screen reader users, rendering the site completely unusable.\n\n## Quick Reference\n\n- The `<body>` element should never have `aria-hidden=\"true\"`\n- Hiding the body makes the entire page invisible to assistive technologies\n- Often happens accidentally when managing modal states\n\n## Check\n\nCheck if the `<body>` element has `aria-hidden=\"true\"` applied at any point in the lifecycle.\n\n## Fix\n\nRemove `aria-hidden=\"true\"` from the `<body>` and use it only on specific background containers when modals are open.\n\n## Explain\n\nExplain the catastrophic impact of hiding the body element from assistive technologies.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Do not use aria-hidden on the document body. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-hidden-body\n","skills/aria-hidden-body/references/rule.md":"# Do not use aria-hidden on the document body\n\n> Ensures the document body is not set to aria-hidden, which would hide the entire page from screen readers.\n\n**Priority:** critical · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nThe `aria-hidden` attribute removes an element and all of its children from the accessibility tree. Applying it to the `<body>` tag makes your entire website non-existent for screen reader users.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Hidden attribute on background content only -->\n<body>\n  <div id=\"app-root\" aria-hidden=\"true\">\n    <!-- Main content hidden while modal is open -->\n  </div>\n  <div id=\"modal-portal\">\n    <!-- Modal remains visible to AT -->\n  </div>\n</body>\n\n<!-- ❌ Incorrect: aria-hidden on body -->\n<body aria-hidden=\"true\">\n  <h1>This whole page is invisible to a screen reader</h1>\n</body>\n```\n\n## Why It Matters\n\n- **Full Inaccessibility**: Hides every single piece of content and interactive element from screen readers.\n- **Broken Experience**: Users cannot navigate, read, or interact with any part of the application.\n- **Common Implementation Bug**: Frequently caused by automated scripts or libraries that try to \"lock\" the background when a modal is open but target the wrong element.\n- **Critical Failure**: This is considered a high-priority accessibility violation that prevents access to the entire service.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-hidden-focus/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-hidden-focus%2FSKILL.md -->","skills/aria-hidden-focus/references/rule.md":"# Remove focusable elements from aria-hidden containers\n\n> Ensures aria-hidden elements do not contain focusable content to avoid \"ghost\" focus.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nWhen an element is marked with `aria-hidden=\"true\"`, it is removed from the accessibility tree, but it is **not** removed from the keyboard tab order. [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) makes that distinction explicit, which is why this failure often shows up alongside broader [focus-management issues](/en/rules/accessibility/focus-management).\n## Code Example\n\n```html\n<!-- ✅ Correct: Focusable element is also removed from tab order -->\n<div aria-hidden=\"true\">\n  <button tabindex=\"-1\">Hidden Button</button>\n</div>\n\n<!-- ✅ Correct: Using the inert attribute (modern browser support) -->\n<div inert>\n  <button>Hidden Button</button>\n</div>\n\n<!-- ❌ Incorrect: Focusable but hidden from AT (Ghost Focus) -->\n<div aria-hidden=\"true\">\n  <button>I can be focused but not heard</button>\n</div>\n```\n\n## Why It Matters\n\n- **Avoid Ghost Focus**: Prevents the keyboard focus from disappearing into \"silent\" regions where no information is announced.\n- **User Clarity**: Ensures every focusable element has a corresponding announcement by the screen reader, maintaining user confidence.\n- **Logical Flow**: Maintains a consistent and predictable navigation path for keyboard-only users.\n- **Reduces Frustration**: Eliminates instances where users might think their browser or the website has crashed because focus seems to have disappeared.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Support Notes\n\n- The `inert` attribute is the cleanest modern fix, but older browser targets may still need a fallback that removes descendants from the tab order manually.\n- Verify the rendered focus behavior in the project target browsers because browser and assistive-technology combinations still differ in how they expose hidden content.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-input-field-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-input-field-name%2FSKILL.md -->","skills/aria-input-field-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-input-field-name%2Freferences%2Frule.md -->","skills/aria-labels/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-labels%2FSKILL.md -->","skills/aria-labels/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-labels%2Freferences%2Frule.md -->","skills/aria-live-regions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-live-regions%2FSKILL.md -->","skills/aria-live-regions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-live-regions%2Freferences%2Frule.md -->","skills/aria-meter-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-meter-name%2FSKILL.md -->","skills/aria-meter-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-meter-name%2Freferences%2Frule.md -->","skills/aria-progressbar-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-progressbar-name%2FSKILL.md -->","skills/aria-progressbar-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-progressbar-name%2Freferences%2Frule.md -->","skills/aria-required-attr/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-attr%2FSKILL.md -->","skills/aria-required-attr/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-attr%2Freferences%2Frule.md -->","skills/aria-required-children/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-children%2FSKILL.md -->","skills/aria-required-children/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-children%2Freferences%2Frule.md -->","skills/aria-required-parent/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-parent%2FSKILL.md -->","skills/aria-required-parent/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-parent%2Freferences%2Frule.md -->","skills/aria-roles/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-roles%2FSKILL.md -->","skills/aria-roles/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-roles%2Freferences%2Frule.md -->","skills/aria-text/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-text%2FSKILL.md -->","skills/aria-text/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-text%2Freferences%2Frule.md -->","skills/aria-toggle-field-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-toggle-field-name%2FSKILL.md -->","skills/aria-toggle-field-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-toggle-field-name%2Freferences%2Frule.md -->","skills/aria-tooltip-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-tooltip-name%2FSKILL.md -->","skills/aria-tooltip-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-tooltip-name%2Freferences%2Frule.md -->","skills/aria-treeitem-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-treeitem-name%2FSKILL.md -->","skills/aria-treeitem-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-treeitem-name%2Freferences%2Frule.md -->","skills/aria-valid-attr-value/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr-value%2FSKILL.md -->","skills/aria-valid-attr-value/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr-value%2Freferences%2Frule.md -->","skills/aria-valid-attr/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr%2FSKILL.md -->","skills/aria-valid-attr/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr%2Freferences%2Frule.md -->","skills/article-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle-links%2FSKILL.md -->","skills/article-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle-links%2Freferences%2Frule.md -->","skills/article/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle%2FSKILL.md -->","skills/article/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle%2Freferences%2Frule.md -->","skills/audio-descriptions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faudio-descriptions%2FSKILL.md -->","skills/audio-descriptions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faudio-descriptions%2Freferences%2Frule.md -->","skills/author-byline/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-byline%2FSKILL.md -->","skills/author-byline/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-byline%2Freferences%2Frule.md -->","skills/author-expertise/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-expertise%2FSKILL.md -->","skills/author-expertise/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-expertise%2Freferences%2Frule.md -->","skills/author-info/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-info%2FSKILL.md -->","skills/author-info/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-info%2Freferences%2Frule.md -->","skills/autofocus-avoidance/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautofocus-avoidance%2FSKILL.md -->","skills/autofocus-avoidance/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautofocus-avoidance%2Freferences%2Frule.md -->","skills/autoplay-media/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautoplay-media%2FSKILL.md -->","skills/autoplay-media/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautoplay-media%2Freferences%2Frule.md -->","skills/avif-format/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favif-format%2FSKILL.md -->","skills/avif-format/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favif-format%2Freferences%2Frule.md -->","skills/avoid-eval/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favoid-eval%2FSKILL.md -->","skills/avoid-eval/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favoid-eval%2Freferences%2Frule.md -->","skills/back-forward-cache/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fback-forward-cache%2FSKILL.md -->","skills/back-forward-cache/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fback-forward-cache%2Freferences%2Frule.md -->","skills/blocked-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fblocked-links%2FSKILL.md -->","skills/blocked-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fblocked-links%2Freferences%2Frule.md -->","skills/breadcrumb-navigation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb-navigation%2FSKILL.md -->","skills/breadcrumb-navigation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb-navigation%2Freferences%2Frule.md -->","skills/breadcrumb/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb%2FSKILL.md -->","skills/breadcrumb/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb%2Freferences%2Frule.md -->","skills/broken-external-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-external-links%2FSKILL.md -->","skills/broken-external-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-external-links%2Freferences%2Frule.md -->","skills/broken-html/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-html%2FSKILL.md -->","skills/broken-html/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-html%2Freferences%2Frule.md -->","skills/broken-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-images%2FSKILL.md -->","skills/broken-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-images%2Freferences%2Frule.md -->","skills/broken-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-links%2FSKILL.md -->","skills/broken-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-links%2Freferences%2Frule.md -->","skills/browser-caching/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-caching%2FSKILL.md -->","skills/browser-caching/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-caching%2Freferences%2Frule.md -->","skills/browser-required/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-required%2FSKILL.md -->","skills/browser-required/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-required%2Freferences%2Frule.md -->","skills/button-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbutton-name%2FSKILL.md -->","skills/button-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbutton-name%2Freferences%2Frule.md -->","skills/canonical-chain/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-chain%2FSKILL.md -->","skills/canonical-chain/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-chain%2Freferences%2Frule.md -->","skills/canonical-header/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-header%2FSKILL.md -->","skills/canonical-header/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-header%2Freferences%2Frule.md -->","skills/canonical-url/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-url%2FSKILL.md -->","skills/canonical-url/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-url%2Freferences%2Frule.md -->","skills/carousel-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcarousel-accessibility%2FSKILL.md -->","skills/carousel-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcarousel-accessibility%2Freferences%2Frule.md -->","skills/cascade-layers/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcascade-layers%2FSKILL.md -->","skills/cascade-layers/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcascade-layers%2Freferences%2Frule.md -->","skills/cdn/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcdn%2FSKILL.md -->","skills/cdn/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcdn%2Freferences%2Frule.md -->","skills/charset/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcharset%2FSKILL.md -->","skills/charset/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcharset%2Freferences%2Frule.md -->","skills/citations/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcitations%2FSKILL.md -->","skills/citations/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcitations%2Freferences%2Frule.md -->","skills/clean-up-comments/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fclean-up-comments%2FSKILL.md -->","skills/clean-up-comments/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fclean-up-comments%2Freferences%2Frule.md -->","skills/code-splitting/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcode-splitting%2FSKILL.md -->","skills/code-splitting/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcode-splitting%2Freferences%2Frule.md -->","skills/color-contrast/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-contrast%2FSKILL.md -->","skills/color-contrast/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-contrast%2Freferences%2Frule.md -->","skills/color-oklch/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-oklch%2FSKILL.md -->","skills/color-oklch/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-oklch%2Freferences%2Frule.md -->","skills/compression/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcompression%2FSKILL.md -->","skills/compression/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcompression%2Freferences%2Frule.md -->","skills/consent-mode/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsent-mode%2FSKILL.md -->","skills/consent-mode/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsent-mode%2Freferences%2Frule.md -->","skills/consistent-help/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsistent-help%2FSKILL.md -->","skills/consistent-help/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsistent-help%2Freferences%2Frule.md -->","skills/console-cleanup/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsole-cleanup%2FSKILL.md -->","skills/console-cleanup/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsole-cleanup%2Freferences%2Frule.md -->","skills/const-let/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconst-let%2FSKILL.md -->","skills/const-let/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconst-let%2Freferences%2Frule.md -->","skills/contact-page/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontact-page%2FSKILL.md -->","skills/contact-page/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontact-page%2Freferences%2Frule.md -->","skills/container-queries/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontainer-queries%2FSKILL.md -->","skills/container-queries/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontainer-queries%2Freferences%2Frule.md -->","skills/content-dates/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-dates%2FSKILL.md -->","skills/content-dates/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-dates%2Freferences%2Frule.md -->","skills/content-security-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-security-policy%2FSKILL.md -->","skills/content-security-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-security-policy%2Freferences%2Frule.md -->","skills/content-without-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-without-css%2FSKILL.md -->","skills/content-without-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-without-css%2Freferences%2Frule.md -->","skills/contract-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontract-testing%2FSKILL.md -->","skills/contract-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontract-testing%2Freferences%2Frule.md -->","skills/cookie-consent/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcookie-consent%2FSKILL.md -->","skills/cookie-consent/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcookie-consent%2Freferences%2Frule.md -->","skills/critical-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-images%2FSKILL.md -->","skills/critical-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-images%2Freferences%2Frule.md -->","skills/critical-request-chains/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-request-chains%2FSKILL.md -->","skills/critical-request-chains/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-request-chains%2Freferences%2Frule.md -->","skills/cross-browser-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-browser-testing%2FSKILL.md -->","skills/cross-browser-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-browser-testing%2Freferences%2Frule.md -->","skills/cross-origin-isolation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-isolation%2FSKILL.md -->","skills/cross-origin-isolation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-isolation%2Freferences%2Frule.md -->","skills/cross-origin-security/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-security%2FSKILL.md -->","skills/cross-origin-security/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-security%2Freferences%2Frule.md -->","skills/css-at-property/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-at-property%2FSKILL.md -->","skills/css-at-property/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-at-property%2Freferences%2Frule.md -->","skills/css-containment/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-containment%2FSKILL.md -->","skills/css-containment/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-containment%2Freferences%2Frule.md -->","skills/css-critical/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-critical%2FSKILL.md -->","skills/css-critical/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-critical%2Freferences%2Frule.md -->","skills/css-custom-properties/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-custom-properties%2FSKILL.md -->","skills/css-custom-properties/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-custom-properties%2Freferences%2Frule.md -->","skills/css-file-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-file-size%2FSKILL.md -->","skills/css-file-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-file-size%2Freferences%2Frule.md -->","skills/css-grid/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-grid%2FSKILL.md -->","skills/css-grid/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-grid%2Freferences%2Frule.md -->","skills/css-minification/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-minification%2FSKILL.md -->","skills/css-minification/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-minification%2Freferences%2Frule.md -->","skills/css-non-blocking/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-non-blocking%2FSKILL.md -->","skills/css-non-blocking/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-non-blocking%2Freferences%2Frule.md -->","skills/css-order/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-order%2FSKILL.md -->","skills/css-order/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-order%2Freferences%2Frule.md -->","skills/css-print/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-print%2FSKILL.md -->","skills/css-print/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-print%2Freferences%2Frule.md -->","skills/cumulative-layout-shift/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcumulative-layout-shift%2FSKILL.md -->","skills/cumulative-layout-shift/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcumulative-layout-shift%2Freferences%2Frule.md -->","skills/currency-formatting/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcurrency-formatting%2FSKILL.md -->","skills/currency-formatting/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcurrency-formatting%2Freferences%2Frule.md -->","skills/custom-element-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcustom-element-accessibility%2FSKILL.md -->","skills/custom-element-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcustom-element-accessibility%2Freferences%2Frule.md -->","skills/dark-mode-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdark-mode-css%2FSKILL.md -->","skills/dark-mode-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdark-mode-css%2Freferences%2Frule.md -->","skills/data-minimisation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdata-minimisation%2FSKILL.md -->","skills/data-minimisation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdata-minimisation%2Freferences%2Frule.md -->","skills/dead-end-pages/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdead-end-pages%2FSKILL.md -->","skills/dead-end-pages/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdead-end-pages%2Freferences%2Frule.md -->","skills/debounce-throttle/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdebounce-throttle%2FSKILL.md -->","skills/debounce-throttle/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdebounce-throttle%2Freferences%2Frule.md -->","skills/decorative-elements/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdecorative-elements%2FSKILL.md -->","skills/decorative-elements/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdecorative-elements%2Freferences%2Frule.md -->","skills/defer-async/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefer-async%2FSKILL.md -->","skills/defer-async/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefer-async%2Freferences%2Frule.md -->","skills/definition-list/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefinition-list%2FSKILL.md -->","skills/definition-list/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefinition-list%2Freferences%2Frule.md -->","skills/dependency-audit/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdependency-audit%2FSKILL.md -->","skills/dependency-audit/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdependency-audit%2Freferences%2Frule.md -->","skills/dimensions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdimensions%2FSKILL.md -->","skills/dimensions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdimensions%2Freferences%2Frule.md -->","skills/direction-attribute/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdirection-attribute%2FSKILL.md -->","skills/direction-attribute/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdirection-attribute%2Freferences%2Frule.md -->","skills/disclaimers/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdisclaimers%2FSKILL.md -->","skills/disclaimers/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdisclaimers%2Freferences%2Frule.md -->","skills/dlitem/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdlitem%2FSKILL.md -->","skills/dlitem/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdlitem%2Freferences%2Frule.md -->","skills/doctype/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdoctype%2FSKILL.md -->","skills/doctype/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdoctype%2Freferences%2Frule.md -->","skills/dom-performance/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-performance%2FSKILL.md -->","skills/dom-performance/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-performance%2Freferences%2Frule.md -->","skills/dom-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-size%2FSKILL.md -->","skills/dom-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-size%2Freferences%2Frule.md -->","skills/draggable-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdraggable-accessibility%2FSKILL.md -->","skills/draggable-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdraggable-accessibility%2Freferences%2Frule.md -->","skills/duplicate-description/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-description%2FSKILL.md -->","skills/duplicate-description/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-description%2Freferences%2Frule.md -->","skills/duplicate-id-active/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-active%2FSKILL.md -->","skills/duplicate-id-active/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-active%2Freferences%2Frule.md -->","skills/duplicate-id-aria/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-aria%2FSKILL.md -->","skills/duplicate-id-aria/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-aria%2Freferences%2Frule.md -->","skills/duplicate-js/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-js%2FSKILL.md -->","skills/duplicate-js/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-js%2Freferences%2Frule.md -->","skills/e2e-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fe2e-testing%2FSKILL.md -->","skills/e2e-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fe2e-testing%2Freferences%2Frule.md -->","skills/editorial-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Feditorial-policy%2FSKILL.md -->","skills/editorial-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Feditorial-policy%2Freferences%2Frule.md -->","skills/element-hiding/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Felement-hiding%2FSKILL.md -->","skills/element-hiding/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Felement-hiding%2Freferences%2Frule.md -->","skills/embedded-or-inline-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fembedded-or-inline-css%2FSKILL.md -->","skills/embedded-or-inline-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fembedded-or-inline-css%2Freferences%2Frule.md -->","skills/empty-heading/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-heading%2FSKILL.md -->","skills/empty-heading/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-heading%2Freferences%2Frule.md -->","skills/empty-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-links%2FSKILL.md -->","skills/empty-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-links%2Freferences%2Frule.md -->","skills/error-handling/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-handling%2FSKILL.md -->","skills/error-handling/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-handling%2Freferences%2Frule.md -->","skills/error-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-images%2FSKILL.md -->","skills/error-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-images%2Freferences%2Frule.md -->","skills/error-monitoring/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-monitoring%2FSKILL.md -->","skills/error-monitoring/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-monitoring%2Freferences%2Frule.md -->","skills/es-modules/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fes-modules%2FSKILL.md -->","skills/es-modules/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fes-modules%2Freferences%2Frule.md -->","skills/event-delegation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fevent-delegation%2FSKILL.md -->","skills/event-delegation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fevent-delegation%2Freferences%2Frule.md -->","skills/external-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fexternal-links%2FSKILL.md -->","skills/external-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fexternal-links%2Freferences%2Frule.md -->","skills/faq/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffaq%2FSKILL.md -->","skills/faq/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffaq%2Freferences%2Frule.md -->","skills/favicon/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicon%2FSKILL.md -->","skills/favicon/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicon%2Freferences%2Frule.md -->","skills/favicons/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicons%2FSKILL.md -->","skills/favicons/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicons%2Freferences%2Frule.md -->","skills/fetchpriority-attribute/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffetchpriority-attribute%2FSKILL.md -->","skills/fetchpriority-attribute/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffetchpriority-attribute%2Freferences%2Frule.md -->","skills/figure-figcaption/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffigure-figcaption%2FSKILL.md -->","skills/figure-figcaption/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffigure-figcaption%2Freferences%2Frule.md -->","skills/file-upload-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffile-upload-accessibility%2FSKILL.md -->","skills/file-upload-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffile-upload-accessibility%2Freferences%2Frule.md -->","skills/filename-quality/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffilename-quality%2FSKILL.md -->","skills/filename-quality/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffilename-quality%2Freferences%2Frule.md -->","skills/find-npm-packages/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffind-npm-packages%2FSKILL.md -->","skills/first-contentful-paint/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffirst-contentful-paint%2FSKILL.md -->","skills/first-contentful-paint/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffirst-contentful-paint%2Freferences%2Frule.md -->","skills/flashing-content/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflashing-content%2FSKILL.md -->","skills/flashing-content/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflashing-content%2Freferences%2Frule.md -->","skills/flexbox-patterns/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflexbox-patterns%2FSKILL.md -->","skills/flexbox-patterns/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflexbox-patterns%2Freferences%2Frule.md -->","skills/focus-management/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-management%2FSKILL.md -->","skills/focus-management/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-management%2Freferences%2Frule.md -->","skills/focus-not-obscured/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-not-obscured%2FSKILL.md -->","skills/focus-not-obscured/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-not-obscured%2Freferences%2Frule.md -->","skills/focus-order/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-order%2FSKILL.md -->","skills/focus-order/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-order%2Freferences%2Frule.md -->","skills/focus-styles/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-styles%2FSKILL.md -->","skills/focus-styles/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-styles%2Freferences%2Frule.md -->","skills/font-loading/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-loading%2FSKILL.md -->","skills/font-loading/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-loading%2Freferences%2Frule.md -->","skills/font-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-size%2FSKILL.md -->","skills/font-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-size%2Freferences%2Frule.md -->","skills/form-captcha/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-captcha%2FSKILL.md -->","skills/form-captcha/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-captcha%2Freferences%2Frule.md -->","skills/form-field-multiple-labels/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-field-multiple-labels%2FSKILL.md -->","skills/form-field-multiple-labels/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-field-multiple-labels%2Freferences%2Frule.md -->","skills/form-https/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-https%2FSKILL.md -->","skills/form-https/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-https%2Freferences%2Frule.md -->","skills/form-labels/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-labels%2FSKILL.md -->","skills/form-labels/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-labels%2Freferences%2Frule.md -->","skills/form-validation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-validation%2FSKILL.md -->","skills/form-validation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-validation%2Freferences%2Frule.md -->","skills/frame-title/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fframe-title%2FSKILL.md -->","skills/frame-title/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fframe-title%2Freferences%2Frule.md -->","skills/freshness/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffreshness%2FSKILL.md -->","skills/freshness/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffreshness%2Freferences%2Frule.md -->","skills/frontend-checklist-global/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffrontend-checklist-global%2FSKILL.md -->","skills/frontend-checklist-global/references/categories.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffrontend-checklist-global%2Freferences%2Fcategories.md -->","skills/geo-meta/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgeo-meta%2FSKILL.md -->","skills/geo-meta/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgeo-meta%2Freferences%2Frule.md -->","skills/gtm-present/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgtm-present%2FSKILL.md -->","skills/gtm-present/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgtm-present%2Freferences%2Frule.md -->","skills/h1/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fh1%2FSKILL.md -->","skills/h1/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fh1%2Freferences%2Frule.md -->","skills/has-selector/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhas-selector%2FSKILL.md -->","skills/has-selector/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhas-selector%2Freferences%2Frule.md -->","skills/heading-hierarchy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-hierarchy%2FSKILL.md -->","skills/heading-hierarchy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-hierarchy%2Freferences%2Frule.md -->","skills/heading-order/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-order%2FSKILL.md -->","skills/heading-order/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-order%2Freferences%2Frule.md -->","skills/horizontal-scroll/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhorizontal-scroll%2FSKILL.md -->","skills/horizontal-scroll/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhorizontal-scroll%2Freferences%2Frule.md -->","skills/hreflang/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhreflang%2FSKILL.md -->","skills/hreflang/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhreflang%2Freferences%2Frule.md -->","skills/hsts/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhsts%2FSKILL.md -->","skills/hsts/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhsts%2Freferences%2Frule.md -->","skills/html-resource-hints/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-resource-hints%2FSKILL.md -->","skills/html-resource-hints/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-resource-hints%2Freferences%2Frule.md -->","skills/html-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-size%2FSKILL.md -->","skills/html-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-size%2Freferences%2Frule.md -->","skills/html-xml-lang-mismatch/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-xml-lang-mismatch%2FSKILL.md -->","skills/html-xml-lang-mismatch/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-xml-lang-mismatch%2Freferences%2Frule.md -->","skills/html5-semantic-elements/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml5-semantic-elements%2FSKILL.md -->","skills/html5-semantic-elements/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml5-semantic-elements%2Freferences%2Frule.md -->","skills/http-requests/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-requests%2FSKILL.md -->","skills/http-requests/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-requests%2Freferences%2Frule.md -->","skills/http-to-https/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-to-https%2FSKILL.md -->","skills/http-to-https/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-to-https%2Freferences%2Frule.md -->","skills/http2/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp2%2FSKILL.md -->","skills/http2/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp2%2Freferences%2Frule.md -->","skills/https-downgrade/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps-downgrade%2FSKILL.md -->","skills/https-downgrade/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps-downgrade%2Freferences%2Frule.md -->","skills/https/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps%2FSKILL.md -->","skills/https/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps%2Freferences%2Frule.md -->","skills/hyphens/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhyphens%2FSKILL.md -->","skills/hyphens/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhyphens%2Freferences%2Frule.md -->","skills/identical-links-same-purpose/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fidentical-links-same-purpose%2FSKILL.md -->","skills/identical-links-same-purpose/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fidentical-links-same-purpose%2Freferences%2Frule.md -->","skills/image-cdn/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-cdn%2FSKILL.md -->","skills/image-cdn/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-cdn%2Freferences%2Frule.md -->","skills/image-compression/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-compression%2FSKILL.md -->","skills/image-compression/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-compression%2Freferences%2Frule.md -->","skills/image-file-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-file-size%2FSKILL.md -->","skills/image-file-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-file-size%2Freferences%2Frule.md -->","skills/image-optimization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-optimization%2FSKILL.md -->","skills/image-optimization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-optimization%2Freferences%2Frule.md -->","skills/image-redundant-alt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-redundant-alt%2FSKILL.md -->","skills/image-redundant-alt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-redundant-alt%2Freferences%2Frule.md -->","skills/immutable-patterns/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimmutable-patterns%2FSKILL.md -->","skills/immutable-patterns/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimmutable-patterns%2Freferences%2Frule.md -->","skills/import-on-interaction/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-interaction%2FSKILL.md -->","skills/import-on-interaction/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-interaction%2Freferences%2Frule.md -->","skills/import-on-visibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-visibility%2FSKILL.md -->","skills/import-on-visibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-visibility%2Freferences%2Frule.md -->","skills/improve-rule/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimprove-rule%2FSKILL.md -->","skills/improve-rule/references/scoring-rubric.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimprove-rule%2Freferences%2Fscoring-rubric.md -->","skills/inclusive-language/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finclusive-language%2FSKILL.md -->","skills/inclusive-language/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finclusive-language%2Freferences%2Frule.md -->","skills/indexability-conflicts/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability-conflicts%2FSKILL.md -->","skills/indexability-conflicts/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability-conflicts%2Freferences%2Frule.md -->","skills/indexability/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability%2FSKILL.md -->","skills/indexability/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability%2Freferences%2Frule.md -->","skills/input-image-alt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-image-alt%2FSKILL.md -->","skills/input-image-alt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-image-alt%2Freferences%2Frule.md -->","skills/input-types/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-types%2FSKILL.md -->","skills/input-types/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-types%2Freferences%2Frule.md -->","skills/integration-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fintegration-testing%2FSKILL.md -->","skills/integration-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fintegration-testing%2Freferences%2Frule.md -->","skills/interaction-to-next-paint/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finteraction-to-next-paint%2FSKILL.md -->","skills/interaction-to-next-paint/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finteraction-to-next-paint%2Freferences%2Frule.md -->","skills/internal-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finternal-links%2FSKILL.md -->","skills/internal-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finternal-links%2Freferences%2Frule.md -->","skills/interstitials/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finterstitials%2FSKILL.md -->","skills/interstitials/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finterstitials%2Freferences%2Frule.md -->","skills/invalid-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finvalid-links%2FSKILL.md -->","skills/invalid-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finvalid-links%2Freferences%2Frule.md -->","skills/javascript-inline/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-inline%2FSKILL.md -->","skills/javascript-inline/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-inline%2Freferences%2Frule.md -->","skills/javascript-linter/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-linter%2FSKILL.md -->","skills/javascript-linter/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-linter%2Freferences%2Frule.md -->","skills/javascript-minification/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-minification%2FSKILL.md -->","skills/javascript-minification/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-minification%2Freferences%2Frule.md -->","skills/js-file-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-file-size%2FSKILL.md -->","skills/js-file-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-file-size%2Freferences%2Frule.md -->","skills/js-libraries/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-libraries%2FSKILL.md -->","skills/js-libraries/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-libraries%2Freferences%2Frule.md -->","skills/js-redirects/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-redirects%2FSKILL.md -->","skills/js-redirects/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-redirects%2Freferences%2Frule.md -->","skills/json-ld-valid/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-ld-valid%2FSKILL.md -->","skills/json-ld-valid/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-ld-valid%2Freferences%2Frule.md -->","skills/json-safety/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-safety%2FSKILL.md -->","skills/json-safety/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-safety%2Freferences%2Frule.md -->","skills/keyboard-navigation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyboard-navigation%2FSKILL.md -->","skills/keyboard-navigation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyboard-navigation%2Freferences%2Frule.md -->","skills/keyword-stuffing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyword-stuffing%2FSKILL.md -->","skills/keyword-stuffing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyword-stuffing%2Freferences%2Frule.md -->","skills/label-content-name-mismatch/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flabel-content-name-mismatch%2FSKILL.md -->","skills/label-content-name-mismatch/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flabel-content-name-mismatch%2Freferences%2Frule.md -->","skills/landmark-one-main/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-one-main%2FSKILL.md -->","skills/landmark-one-main/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-one-main%2Freferences%2Frule.md -->","skills/landmark-regions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-regions%2FSKILL.md -->","skills/landmark-regions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-regions%2Freferences%2Frule.md -->","skills/lang-attribute/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flang-attribute%2FSKILL.md -->","skills/lang-attribute/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flang-attribute%2Freferences%2Frule.md -->","skills/largest-contentful-paint/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flargest-contentful-paint%2FSKILL.md -->","skills/largest-contentful-paint/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flargest-contentful-paint%2Freferences%2Frule.md -->","skills/lazy-above-fold/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-above-fold%2FSKILL.md -->","skills/lazy-above-fold/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-above-fold%2Freferences%2Frule.md -->","skills/lazy-loading/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-loading%2FSKILL.md -->","skills/lazy-loading/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-loading%2Freferences%2Frule.md -->","skills/leaked-secrets/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fleaked-secrets%2FSKILL.md -->","skills/leaked-secrets/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fleaked-secrets%2Freferences%2Frule.md -->","skills/legacy-js/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flegacy-js%2FSKILL.md -->","skills/legacy-js/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flegacy-js%2Freferences%2Frule.md -->","skills/length/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flength%2FSKILL.md -->","skills/length/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flength%2Freferences%2Frule.md -->","skills/link-checker/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-checker%2FSKILL.md -->","skills/link-checker/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-checker%2Freferences%2Frule.md -->","skills/link-in-text-block/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-in-text-block%2FSKILL.md -->","skills/link-in-text-block/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-in-text-block%2Freferences%2Frule.md -->","skills/link-text/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-text%2FSKILL.md -->","skills/link-text/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-text%2Freferences%2Frule.md -->","skills/list-structure/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-structure%2FSKILL.md -->","skills/list-structure/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-structure%2Freferences%2Frule.md -->","skills/list-virtualization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-virtualization%2FSKILL.md -->","skills/list-virtualization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-virtualization%2Freferences%2Frule.md -->","skills/listitem/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flistitem%2FSKILL.md -->","skills/listitem/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flistitem%2Freferences%2Frule.md -->","skills/llm-parsability/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllm-parsability%2FSKILL.md -->","skills/llm-parsability/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllm-parsability%2Freferences%2Frule.md -->","skills/llms-txt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllms-txt%2FSKILL.md -->","skills/llms-txt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllms-txt%2Freferences%2Frule.md -->","skills/loading-indicators/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Floading-indicators%2FSKILL.md -->","skills/loading-indicators/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Floading-indicators%2Freferences%2Frule.md -->","skills/local-business/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocal-business%2FSKILL.md -->","skills/local-business/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocal-business%2Freferences%2Frule.md -->","skills/locale-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocale-images%2FSKILL.md -->","skills/locale-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocale-images%2Freferences%2Frule.md -->","skills/logical-properties/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flogical-properties%2FSKILL.md -->","skills/logical-properties/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flogical-properties%2Freferences%2Frule.md -->","skills/lowercase/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flowercase%2FSKILL.md -->","skills/lowercase/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flowercase%2Freferences%2Frule.md -->","skills/memory-leaks/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmemory-leaks%2FSKILL.md -->","skills/memory-leaks/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmemory-leaks%2Freferences%2Frule.md -->","skills/meta-description/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-description%2FSKILL.md -->","skills/meta-description/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-description%2Freferences%2Frule.md -->","skills/meta-in-body/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-in-body%2FSKILL.md -->","skills/meta-in-body/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-in-body%2Freferences%2Frule.md -->","skills/meta-refresh/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-refresh%2FSKILL.md -->","skills/meta-refresh/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-refresh%2Freferences%2Frule.md -->","skills/meta-title/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-title%2FSKILL.md -->","skills/meta-title/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-title%2Freferences%2Frule.md -->","skills/mime-type/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmime-type%2FSKILL.md -->","skills/mime-type/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmime-type%2Freferences%2Frule.md -->","skills/mixed-content/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmixed-content%2FSKILL.md -->","skills/mixed-content/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmixed-content%2Freferences%2Frule.md -->","skills/mobile-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmobile-testing%2FSKILL.md -->","skills/mobile-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmobile-testing%2Freferences%2Frule.md -->","skills/mock-best-practices/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmock-best-practices%2FSKILL.md -->","skills/mock-best-practices/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmock-best-practices%2Freferences%2Frule.md -->","skills/modal-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodal-accessibility%2FSKILL.md -->","skills/modal-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodal-accessibility%2Freferences%2Frule.md -->","skills/modern-array-methods/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-array-methods%2FSKILL.md -->","skills/modern-array-methods/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-array-methods%2Freferences%2Frule.md -->","skills/modern-format/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-format%2FSKILL.md -->","skills/modern-format/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-format%2Freferences%2Frule.md -->","skills/mutation-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmutation-testing%2FSKILL.md -->","skills/mutation-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmutation-testing%2Freferences%2Frule.md -->","skills/naming-conventions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnaming-conventions%2FSKILL.md -->","skills/naming-conventions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnaming-conventions%2Freferences%2Frule.md -->","skills/nap-consistency/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnap-consistency%2FSKILL.md -->","skills/nap-consistency/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnap-consistency%2Freferences%2Frule.md -->","skills/navigation-landmark/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnavigation-landmark%2FSKILL.md -->","skills/navigation-landmark/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnavigation-landmark%2Freferences%2Frule.md -->","skills/new-tab/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnew-tab%2FSKILL.md -->","skills/new-tab/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnew-tab%2Freferences%2Frule.md -->","skills/no-explicit-any/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-explicit-any%2FSKILL.md -->","skills/no-explicit-any/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-explicit-any%2Freferences%2Frule.md -->","skills/no-unchecked-indexed-access/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-unchecked-indexed-access%2FSKILL.md -->","skills/no-unchecked-indexed-access/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-unchecked-indexed-access%2Freferences%2Frule.md -->","skills/nofollow-internal/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnofollow-internal%2FSKILL.md -->","skills/nofollow-internal/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnofollow-internal%2Freferences%2Frule.md -->","skills/noindex-in-sitemap/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoindex-in-sitemap%2FSKILL.md -->","skills/noindex-in-sitemap/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoindex-in-sitemap%2Freferences%2Frule.md -->","skills/noscript-tag/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoscript-tag%2FSKILL.md -->","skills/noscript-tag/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoscript-tag%2Freferences%2Frule.md -->","skills/nosnippet/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnosnippet%2FSKILL.md -->","skills/nosnippet/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnosnippet%2Freferences%2Frule.md -->","skills/object-alt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fobject-alt%2FSKILL.md -->","skills/object-alt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fobject-alt%2Freferences%2Frule.md -->","skills/offline-fallback/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffline-fallback%2FSKILL.md -->","skills/offline-fallback/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffline-fallback%2Freferences%2Frule.md -->","skills/offscreen-lazy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffscreen-lazy%2FSKILL.md -->","skills/offscreen-lazy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffscreen-lazy%2Freferences%2Frule.md -->","skills/og-image-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-image-size%2FSKILL.md -->","skills/og-image-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-image-size%2Freferences%2Frule.md -->","skills/og-tags/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-tags%2FSKILL.md -->","skills/og-tags/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-tags%2Freferences%2Frule.md -->","skills/og-url-match/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-url-match%2FSKILL.md -->","skills/og-url-match/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-url-match%2Freferences%2Frule.md -->","skills/optimized/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foptimized%2FSKILL.md -->","skills/optimized/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foptimized%2Freferences%2Frule.md -->","skills/organization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forganization%2FSKILL.md -->","skills/organization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forganization%2Freferences%2Frule.md -->","skills/orientation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forientation%2FSKILL.md -->","skills/orientation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forientation%2Freferences%2Frule.md -->","skills/orphan-pages/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forphan-pages%2FSKILL.md -->","skills/orphan-pages/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forphan-pages%2Freferences%2Frule.md -->","skills/page-load-time/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-load-time%2FSKILL.md -->","skills/page-load-time/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-load-time%2Freferences%2Frule.md -->","skills/page-weight/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-weight%2FSKILL.md -->","skills/page-weight/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-weight%2Freferences%2Frule.md -->","skills/pagination-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination-accessibility%2FSKILL.md -->","skills/pagination-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination-accessibility%2Freferences%2Frule.md -->","skills/pagination/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination%2FSKILL.md -->","skills/pagination/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination%2Freferences%2Frule.md -->","skills/parallax-effects/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparallax-effects%2FSKILL.md -->","skills/parallax-effects/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparallax-effects%2Freferences%2Frule.md -->","skills/parameters/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparameters%2FSKILL.md -->","skills/parameters/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparameters%2Freferences%2Frule.md -->","skills/password-field-security/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpassword-field-security%2FSKILL.md -->","skills/password-field-security/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpassword-field-security%2Freferences%2Frule.md -->","skills/paste-inputs/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpaste-inputs%2FSKILL.md -->","skills/paste-inputs/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpaste-inputs%2Freferences%2Frule.md -->","skills/pdf-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpdf-size%2FSKILL.md -->","skills/pdf-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpdf-size%2Freferences%2Frule.md -->","skills/performance-budget/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-budget%2FSKILL.md -->","skills/performance-budget/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-budget%2Freferences%2Frule.md -->","skills/performance-resource-hints/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-resource-hints%2FSKILL.md -->","skills/performance-resource-hints/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-resource-hints%2Freferences%2Frule.md -->","skills/permissions-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpermissions-policy%2FSKILL.md -->","skills/permissions-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpermissions-policy%2Freferences%2Frule.md -->","skills/physical-address/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fphysical-address%2FSKILL.md -->","skills/physical-address/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fphysical-address%2Freferences%2Frule.md -->","skills/picture-element/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpicture-element%2FSKILL.md -->","skills/picture-element/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpicture-element%2Freferences%2Frule.md -->","skills/plain-language/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fplain-language%2FSKILL.md -->","skills/plain-language/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fplain-language%2Freferences%2Frule.md -->","skills/pluralization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpluralization%2FSKILL.md -->","skills/pluralization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpluralization%2Freferences%2Frule.md -->","skills/preconnect/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpreconnect%2FSKILL.md -->","skills/preconnect/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpreconnect%2Freferences%2Frule.md -->","skills/privacy-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprivacy-policy%2FSKILL.md -->","skills/privacy-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprivacy-policy%2Freferences%2Frule.md -->","skills/product/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fproduct%2FSKILL.md -->","skills/product/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fproduct%2Freferences%2Frule.md -->","skills/progressive-jpeg/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprogressive-jpeg%2FSKILL.md -->","skills/progressive-jpeg/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprogressive-jpeg%2Freferences%2Frule.md -->","skills/pwa-installability/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpwa-installability%2FSKILL.md -->","skills/pwa-installability/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpwa-installability%2Freferences%2Frule.md -->","skills/quality/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fquality%2FSKILL.md -->","skills/quality/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fquality%2Freferences%2Frule.md -->","skills/reading-level/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freading-level%2FSKILL.md -->","skills/reading-level/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freading-level%2Freferences%2Frule.md -->","skills/redirect-chain/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chain%2FSKILL.md -->","skills/redirect-chain/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chain%2Freferences%2Frule.md -->","skills/redirect-chains/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chains%2FSKILL.md -->","skills/redirect-chains/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chains%2Freferences%2Frule.md -->","skills/reduced-motion/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freduced-motion%2FSKILL.md -->","skills/reduced-motion/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freduced-motion%2Freferences%2Frule.md -->","skills/redundant-entry/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredundant-entry%2FSKILL.md -->","skills/redundant-entry/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredundant-entry%2Freferences%2Frule.md -->","skills/referrer-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freferrer-policy%2FSKILL.md -->","skills/referrer-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freferrer-policy%2Freferences%2Frule.md -->","skills/render-blocking/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frender-blocking%2FSKILL.md -->","skills/render-blocking/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frender-blocking%2Freferences%2Frule.md -->","skills/reset-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freset-css%2FSKILL.md -->","skills/reset-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freset-css%2Freferences%2Frule.md -->","skills/resource-hints/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresource-hints%2FSKILL.md -->","skills/resource-hints/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresource-hints%2Freferences%2Frule.md -->","skills/responsive-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-images%2FSKILL.md -->","skills/responsive-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-images%2Freferences%2Frule.md -->","skills/responsive-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-size%2FSKILL.md -->","skills/responsive-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-size%2Freferences%2Frule.md -->","skills/responsive-units/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-units%2FSKILL.md -->","skills/responsive-units/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-units%2Freferences%2Frule.md -->","skills/retina-display/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fretina-display%2FSKILL.md -->","skills/retina-display/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fretina-display%2Freferences%2Frule.md -->","skills/review/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freview%2FSKILL.md -->","skills/review/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freview%2Freferences%2Frule.md -->","skills/right-to-erasure/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fright-to-erasure%2FSKILL.md -->","skills/right-to-erasure/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fright-to-erasure%2Freferences%2Frule.md -->","skills/robots-meta-conflict/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta-conflict%2FSKILL.md -->","skills/robots-meta-conflict/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta-conflict%2Freferences%2Frule.md -->","skills/robots-meta/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta%2FSKILL.md -->","skills/robots-meta/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta%2Freferences%2Frule.md -->","skills/robots-txt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-txt%2FSKILL.md -->","skills/robots-txt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-txt%2Freferences%2Frule.md -->","skills/runtime-validation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fruntime-validation%2FSKILL.md -->","skills/runtime-validation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fruntime-validation%2Freferences%2Frule.md -->","skills/scheduler-yield/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscheduler-yield%2FSKILL.md -->","skills/scheduler-yield/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscheduler-yield%2Freferences%2Frule.md -->","skills/schema-noindex-conflict/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fschema-noindex-conflict%2FSKILL.md -->","skills/schema-noindex-conflict/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fschema-noindex-conflict%2Freferences%2Frule.md -->","skills/screen-reader-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscreen-reader-testing%2FSKILL.md -->","skills/screen-reader-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscreen-reader-testing%2Freferences%2Frule.md -->","skills/scrolljacking/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscrolljacking%2FSKILL.md -->","skills/scrolljacking/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscrolljacking%2Freferences%2Frule.md -->","skills/search-input/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsearch-input%2FSKILL.md -->","skills/search-input/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsearch-input%2Freferences%2Frule.md -->","skills/select-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fselect-name%2FSKILL.md -->","skills/select-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fselect-name%2Freferences%2Frule.md -->","skills/semantic-lists/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsemantic-lists%2FSKILL.md -->","skills/semantic-lists/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsemantic-lists%2Freferences%2Frule.md -->","skills/sensory-instructions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsensory-instructions%2FSKILL.md -->","skills/sensory-instructions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsensory-instructions%2Freferences%2Frule.md -->","skills/service-area/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-area%2FSKILL.md -->","skills/service-area/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-area%2Freferences%2Frule.md -->","skills/service-worker/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-worker%2FSKILL.md -->","skills/service-worker/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-worker%2Freferences%2Frule.md -->","skills/session-cookie-flags/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-cookie-flags%2FSKILL.md -->","skills/session-cookie-flags/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-cookie-flags%2Freferences%2Frule.md -->","skills/session-timeout-recovery/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-timeout-recovery%2FSKILL.md -->","skills/session-timeout-recovery/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-timeout-recovery%2Freferences%2Frule.md -->","skills/share-buttons/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fshare-buttons%2FSKILL.md -->","skills/share-buttons/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fshare-buttons%2Freferences%2Frule.md -->","skills/sitemap-4xx/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-4xx%2FSKILL.md -->","skills/sitemap-4xx/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-4xx%2Freferences%2Frule.md -->","skills/sitemap-coverage/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-coverage%2FSKILL.md -->","skills/sitemap-coverage/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-coverage%2Freferences%2Frule.md -->","skills/sitemap-domain/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-domain%2FSKILL.md -->","skills/sitemap-domain/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-domain%2Freferences%2Frule.md -->","skills/sitemap-valid/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-valid%2FSKILL.md -->","skills/sitemap-valid/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-valid%2Freferences%2Frule.md -->","skills/sitemap/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap%2FSKILL.md -->","skills/sitemap/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap%2Freferences%2Frule.md -->","skills/skip-link/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-link%2FSKILL.md -->","skills/skip-link/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-link%2Freferences%2Frule.md -->","skills/skip-navigation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-navigation%2FSKILL.md -->","skills/skip-navigation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-navigation%2Freferences%2Frule.md -->","skills/slug-keywords/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fslug-keywords%2FSKILL.md -->","skills/slug-keywords/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fslug-keywords%2Freferences%2Frule.md -->","skills/social-profiles/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsocial-profiles%2FSKILL.md -->","skills/social-profiles/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsocial-profiles%2Freferences%2Frule.md -->","skills/source-maps/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsource-maps%2FSKILL.md -->","skills/source-maps/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsource-maps%2Freferences%2Frule.md -->","skills/special-chars/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecial-chars%2FSKILL.md -->","skills/special-chars/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecial-chars%2Freferences%2Frule.md -->","skills/specificity-management/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecificity-management%2FSKILL.md -->","skills/specificity-management/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecificity-management%2Freferences%2Frule.md -->","skills/speculation-rules/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspeculation-rules%2FSKILL.md -->","skills/speculation-rules/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspeculation-rules%2Freferences%2Frule.md -->","skills/sprite-generation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsprite-generation%2FSKILL.md -->","skills/sprite-generation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsprite-generation%2Freferences%2Frule.md -->","skills/srcset/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsrcset%2FSKILL.md -->","skills/srcset/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsrcset%2Freferences%2Frule.md -->","skills/stack-trace-exposure/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstack-trace-exposure%2FSKILL.md -->","skills/stack-trace-exposure/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstack-trace-exposure%2Freferences%2Frule.md -->","skills/stop-words/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstop-words%2FSKILL.md -->","skills/stop-words/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstop-words%2Freferences%2Frule.md -->","skills/streaming-html/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstreaming-html%2FSKILL.md -->","skills/streaming-html/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstreaming-html%2Freferences%2Frule.md -->","skills/structured-data/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstructured-data%2FSKILL.md -->","skills/structured-data/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstructured-data%2Freferences%2Frule.md -->","skills/styles-lint/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstyles-lint%2FSKILL.md -->","skills/styles-lint/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstyles-lint%2Freferences%2Frule.md -->","skills/subgrid/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubgrid%2FSKILL.md -->","skills/subgrid/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubgrid%2Freferences%2Frule.md -->","skills/subresource-integrity/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubresource-integrity%2FSKILL.md -->","skills/subresource-integrity/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubresource-integrity%2Freferences%2Frule.md -->","skills/svg-inline/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-inline%2FSKILL.md -->","skills/svg-inline/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-inline%2Freferences%2Frule.md -->","skills/svg-optimization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-optimization%2FSKILL.md -->","skills/svg-optimization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-optimization%2Freferences%2Frule.md -->","skills/tabindex/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabindex%2FSKILL.md -->","skills/tabindex/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabindex%2Freferences%2Frule.md -->","skills/table-duplicate-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-duplicate-name%2FSKILL.md -->","skills/table-duplicate-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-duplicate-name%2Freferences%2Frule.md -->","skills/table-headers/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-headers%2FSKILL.md -->","skills/table-headers/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-headers%2Freferences%2Frule.md -->","skills/tabs-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabs-accessibility%2FSKILL.md -->","skills/tabs-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabs-accessibility%2Freferences%2Frule.md -->","skills/td-headers-attr/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftd-headers-attr%2FSKILL.md -->","skills/td-headers-attr/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftd-headers-attr%2Freferences%2Frule.md -->","skills/tel-mailto/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftel-mailto%2FSKILL.md -->","skills/tel-mailto/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftel-mailto%2Freferences%2Frule.md -->","skills/terms-of-service/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fterms-of-service%2FSKILL.md -->","skills/terms-of-service/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fterms-of-service%2Freferences%2Frule.md -->","skills/test-coverage/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftest-coverage%2FSKILL.md -->","skills/test-coverage/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftest-coverage%2Freferences%2Frule.md -->","skills/text-expansion/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-expansion%2FSKILL.md -->","skills/text-expansion/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-expansion%2Freferences%2Frule.md -->","skills/text-in-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-in-images%2FSKILL.md -->","skills/text-in-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-in-images%2Freferences%2Frule.md -->","skills/text-resizing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-resizing%2FSKILL.md -->","skills/text-resizing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-resizing%2Freferences%2Frule.md -->","skills/th-has-data-cells/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fth-has-data-cells%2FSKILL.md -->","skills/th-has-data-cells/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fth-has-data-cells%2Freferences%2Frule.md -->","skills/third-party-cookies/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-cookies%2FSKILL.md -->","skills/third-party-cookies/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-cookies%2Freferences%2Frule.md -->","skills/third-party-scripts/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-scripts%2FSKILL.md -->","skills/third-party-scripts/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-scripts%2Freferences%2Frule.md -->","skills/title-unique/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftitle-unique%2FSKILL.md -->","skills/title-unique/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftitle-unique%2Freferences%2Frule.md -->","skills/token-storage-security/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftoken-storage-security%2FSKILL.md -->","skills/token-storage-security/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftoken-storage-security%2Freferences%2Frule.md -->","skills/touch-targets/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftouch-targets%2FSKILL.md -->","skills/touch-targets/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftouch-targets%2Freferences%2Frule.md -->","skills/trailing-slash/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrailing-slash%2FSKILL.md -->","skills/trailing-slash/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrailing-slash%2Freferences%2Frule.md -->","skills/translation-strings/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftranslation-strings%2FSKILL.md -->","skills/translation-strings/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftranslation-strings%2Freferences%2Frule.md -->","skills/trust-signals/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrust-signals%2FSKILL.md -->","skills/trust-signals/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrust-signals%2Freferences%2Frule.md -->","skills/ttfb/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fttfb%2FSKILL.md -->","skills/ttfb/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fttfb%2Freferences%2Frule.md -->","skills/twitter-cards/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftwitter-cards%2FSKILL.md -->","skills/twitter-cards/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftwitter-cards%2Freferences%2Frule.md -->","skills/type-coercion/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-coercion%2FSKILL.md -->","skills/type-coercion/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-coercion%2Freferences%2Frule.md -->","skills/type-only-imports/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-only-imports%2FSKILL.md -->","skills/type-only-imports/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-only-imports%2Freferences%2Frule.md -->","skills/typescript-strict-mode/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftypescript-strict-mode%2FSKILL.md -->","skills/typescript-strict-mode/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftypescript-strict-mode%2Freferences%2Frule.md -->","skills/unique-id/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funique-id%2FSKILL.md -->","skills/unique-id/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funique-id%2Freferences%2Frule.md -->","skills/unit-tests/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funit-tests%2FSKILL.md -->","skills/unit-tests/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funit-tests%2Freferences%2Frule.md -->","skills/unused-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funused-css%2FSKILL.md -->","skills/unused-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funused-css%2Freferences%2Frule.md -->","skills/video-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-accessibility%2FSKILL.md -->","skills/video-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-accessibility%2Freferences%2Frule.md -->","skills/video-captions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-captions%2FSKILL.md -->","skills/video-captions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-captions%2Freferences%2Frule.md -->","skills/video-optimization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-optimization%2FSKILL.md -->","skills/video-optimization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-optimization%2Freferences%2Frule.md -->","skills/video-thumbnail/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-thumbnail%2FSKILL.md -->","skills/video-thumbnail/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-thumbnail%2Freferences%2Frule.md -->","skills/video/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo%2FSKILL.md -->","skills/video/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo%2Freferences%2Frule.md -->","skills/view-transitions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fview-transitions%2FSKILL.md -->","skills/view-transitions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fview-transitions%2Freferences%2Frule.md -->","skills/viewport-zoom/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport-zoom%2FSKILL.md -->","skills/viewport-zoom/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport-zoom%2Freferences%2Frule.md -->","skills/viewport/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport%2FSKILL.md -->","skills/viewport/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport%2Freferences%2Frule.md -->","skills/visual-regression/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvisual-regression%2FSKILL.md -->","skills/visual-regression/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvisual-regression%2Freferences%2Frule.md -->","skills/w3c-compliant/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fw3c-compliant%2FSKILL.md -->","skills/w3c-compliant/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fw3c-compliant%2Freferences%2Frule.md -->","skills/weak-internal-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweak-internal-links%2FSKILL.md -->","skills/weak-internal-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweak-internal-links%2Freferences%2Frule.md -->","skills/web-app-manifest/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-app-manifest%2FSKILL.md -->","skills/web-app-manifest/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-app-manifest%2Freferences%2Frule.md -->","skills/web-storage/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-storage%2FSKILL.md -->","skills/web-storage/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-storage%2Freferences%2Frule.md -->","skills/webfont-format/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebfont-format%2FSKILL.md -->","skills/webfont-format/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebfont-format%2Freferences%2Frule.md -->","skills/webp-format/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebp-format%2FSKILL.md -->","skills/webp-format/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebp-format%2Freferences%2Frule.md -->","skills/webpagetest/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebpagetest%2FSKILL.md -->","skills/webpagetest/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebpagetest%2Freferences%2Frule.md -->","skills/website-search/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebsite-search%2FSKILL.md -->","skills/website-search/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebsite-search%2Freferences%2Frule.md -->","skills/word-count/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fword-count%2FSKILL.md -->","skills/word-count/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fword-count%2Freferences%2Frule.md -->","skills/x-content-type/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-content-type%2FSKILL.md -->","skills/x-content-type/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-content-type%2Freferences%2Frule.md -->","skills/x-frame-options/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-frame-options%2FSKILL.md -->","skills/x-frame-options/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-frame-options%2Freferences%2Frule.md -->","skills/ymyl-detection/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fymyl-detection%2FSKILL.md -->","skills/ymyl-detection/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fymyl-detection%2Freferences%2Frule.md -->","skills/zoom-reflow/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fzoom-reflow%2FSKILL.md -->","skills/zoom-reflow/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fzoom-reflow%2Freferences%2Frule.md -->"},"files":{".agents/plugins/marketplace.json":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=.agents%2Fplugins%2Fmarketplace.json -->",".claude-plugin/marketplace.json":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=.claude-plugin%2Fmarketplace.json -->","AGENTS.md":"# AGENTS.md — Front-End Checklist\n\nRepository rules and conventions for contributors and automation tools.\n\n## Project Overview\n\n**Front-End Checklist** is an open-source monorepo providing 385 quality-gated frontend best practice rules with an MCP server for structured review workflows.\n\n- **MCP Server**: `https://mcp.frontendchecklist.io` (11 tools)\n- **Rules**: `packages/content/rules/en/<category>/<slug>.mdx`\n- **Web App**: `apps/web/` (Next.js App Router)\n- **MCP Package**: `packages/mcp/` (TypeScript)\n- **Package Manager**: pnpm (workspaces + Turborepo)\n\n## Work Tracking\n\nWork in this repo is tracked in Paperclip project **FEC** (Front-End Checklist, id `c5edfe8f-731b-43e8-b805-c52999831084`). New tickets get the `DAV-` prefix.\n\n## MCP Usage\n\nWhen working on frontend implementation, review, debugging, or audit tasks, use the Front-End Checklist MCP server when available so recommendations stay grounded in the project rule corpus.\n\n- Use `review_code` first for pasted or inspected HTML, CSS, JavaScript, TypeScript, React, or Next.js code.\n- Use `search_rules` before making accessibility, performance, SEO, security, image, privacy, i18n, or testing recommendations.\n- Use `get_rule`, `check_rule`, `fix_rule`, or `explain_rule` for rule-specific guidance and remediation.\n- Use `get_workflow` or `get_checklist_rules` for broad launch, accessibility, SEO, security, performance, and testing audits.\n- Use `audit_url` for public `https://` pages.\n\nSome clients lazy-load installed MCP tools. If the tools are not initially visible, search for or explicitly request the Front-End Checklist MCP before proceeding with frontend work.\n\n## Monorepo Structure\n\n```\napps/\n  web/                    # Next.js app (App Router)\npackages/\n  mcp/                    # MCP server implementation\n  content/                # Rules MDX content + content-collections config\n  auth/                   # Better-Auth + Prisma + Supabase\n  design-system/          # Shared UI components\n  types/                  # Shared TypeScript types\n  data-layer/             # Data access layer\n  schemas/                # Zod v4 schemas\n```\n\n## Rule MDX Frontmatter Spec\n\nRules live at `packages/content/rules/en/<category>/<slug>.mdx`.\n\n### Required Fields\n\n```yaml\n---\ntitle: \"Human-readable rule title (string, use quotes)\"\ndescription: \"One-sentence description of what to do\"\ncategories: ['html']           # Array; first item = primaryCategory\npriority: 'high'               # 'critical' | 'high' | 'medium' | 'low'\ndifficulty: 'beginner'         # 'beginner' | 'intermediate' | 'advanced' | 'expert'\nestimatedTime: 15              # Minutes as integer\nprompts:\n  check: \"Prompt for checking whether the implementation follows this rule\"\n  fix: \"Prompt for fixing the issue\"\n  explain: \"Prompt for explaining why this rule matters\"\n---\n```\n\n### Recommended Fields\n\nThese fields are not required by the parser, but they materially improve rule quality, MCP usefulness, and generated skills.\n\n```yaml\nsubcategory: 'keyboard'        # Sub-grouping within category\ntldr:                          # Array of bullet points (used in llms.txt)\n  - \"Key point one\"\n  - \"Key point two\"\nwhyItMatters: \"Paragraph explaining the business/user impact\"\nsources:\n  - title: \"MDN or spec page title\"\n    url: \"https://...\"\n    type: \"mdn|spec|guide|wcag|google\"\n    id: \"stable-source-id\"\n    role: \"standard|reference|implementation|compatibility|regulation|search|research\"\n    authority: \"primary|secondary\"\nresources:\n  - name: \"Supplementary tool or article\"\n    url: \"https://...\"\n    type: \"tool|article|reference\"\nrelatedRules:\n  - slug: other-rule-slug\n    reason: \"Why these rules relate\"\ntools:\n  - name: \"Tool Name\"\n    url: \"https://...\"         # or null\ntags: ['wcag', 'performance']\nprompts:\n  codeReview: \"Recommended prompt for systematic code review context\"\naiContext: \"Additional context for automated review about when this rule applies\"\n```\n\nAuthoring placement rules:\n\n- Put authoritative citations in `sources`, not in body prose like `Reference: ...`\n- `sources` are proof metadata, not generic further reading. Every rule needs at least 2 sources, 2 source roles, and 1 `authority: primary`.\n- `resources` are for further reading or tools only. Do not map evidence claims to `resources`.\n- The system may infer or normalize `id`, `role`, and `authority` for sources at build time; authors should focus on strong, relevant sources rather than maintaining claim-by-claim proof objects.\n- Put cross-rule navigation in `relatedRules`, not in body prose like `See also ...`\n- Keep intro paragraphs focused on the rule itself; metadata should render from frontmatter-driven UI\n\nInline link contract:\n\n- Natural inline links inside body prose are allowed when they support a specific claim, comparison, or implementation recommendation.\n- Prefer light-touch density: usually `2-5` inline links per rule, with `0-1` in the intro and `1-3` across the main guidance sections.\n- Prefer external links over internal ones; internal rule links should usually stay at `0-1`, with `2` only for unusually interconnected rules.\n- Keep standalone metadata lines out of the body. Do not add paragraphs that start with `See also ...` or `Reference: ...`.\n- Keep evergreen proof in `sources`, and use newer inline external articles only when they add practical or recent context that the primary sources do not cover alone.\n- When a named tool is mentioned in prose for the first meaningful time (for example `Screaming Frog` or `Google Search Console`), link that first mention if the tool materially helps the reader and already exists in `resources` or `tools`.\n- Approved secondary inline links should stay curated. Prefer strong platforms such as `CSS-Tricks`, `Smashing Magazine`, `Nielsen Norman Group`, `WebAIM`, `Screaming Frog`, `Sitebulb`, `Moz`, or `Yoast` when they add practical implementation context.\n- Use descriptive anchor text tied to the sentence claim, not generic labels like “read more”.\n\n`impact`, `standards`, and `automation` are intentionally not part of the active rule-writing contract right now. The current corpus and tooling do not consume them consistently enough to justify treating them as standard authoring fields.\n\n## Canonical Rule Shape\n\nNew and refreshed rules should follow this structure unless there is a strong reason not to:\n\n1. Short intro paragraph explaining the rule in plain language\n2. `## Code Example` or `## Code Examples`\n3. `## Why It Matters`\n4. Optional implementation or guidance sections\n5. `## Verification`\n\nCanonical ordering rules:\n\n- `## Code Example` or `## Code Examples` must appear before `## Why It Matters`\n- `## Why It Matters` must appear before `## Verification`\n- `## Verification` must be the final H2 in the rule body\n- Optional H2 sections belong between `## Why It Matters` and `## Verification`\n\nPreferred optional H2 taxonomy:\n\n- `## Best Practices`\n- `## Common Mistakes`\n- `## Framework Examples`\n- `## Tools & Validation`\n- `## Thresholds`\n- `## Exceptions`\n- `## Browser Support`\n- `## Support Notes`\n- `## Standards`\n- `## Implementation Notes`\n\nThe validator reports headings outside this preferred taxonomy so section sprawl stays visible over time.\n\nRule Contract V2 adds three conditional concepts:\n\n- `## Exceptions` for nuanced rules, false positives, or valid caveats\n- `### Automated Checks` and `### Manual Checks` inside `## Verification` when both matter\n- a short visible standards/support note for compatibility-sensitive or compliance-sensitive rules\n\nApply these conditionally, not universally.\n\nBrowser support guidance should be derived from the repo browser policy in `.browserslistrc` plus package-backed compatibility data, not from memory.\n\nUse explicit thresholds whenever the rule is measurable:\n\n- Web Vitals and performance metrics (`LCP <= 2.5s`, `CLS <= 0.1`, bundle or image size budgets)\n- Accessibility measurements (contrast ratios, target sizes, zoom or reflow thresholds)\n- SEO and crawling states (indexability, status codes, canonical-url behavior)\n- Security headers and transport requirements\n\nPrefer “how to verify” guidance over generic advice. A strong rule should tell an engineer exactly how to confirm the rule passes.\n\n### Common Mistakes to Avoid\n\n- **Unquoted colons in YAML**: Always quote strings containing `:` — e.g. `title: \"Use rel: new-tab\"` not `title: Use rel: noopener`\n- **Stub prompts**: Prompts must be actionable. Bad: `\"Check this rule\"`. Good: `\"Find all <img> elements missing an alt attribute in this HTML\"`\n- **Missing sources**: Add at least one authoritative reference (`MDN`, `W3C/WCAG`, specs, `web.dev`, or product docs) before considering a rule complete\n- **No verification path**: Include a final `## Verification` section so the fix is testable\n- **Verification not last**: Do not place additional H2 sections after `## Verification`\n- **Missing caveats**: Add `## Exceptions` when the rule has important false positives or valid exceptions\n- **Missing support note**: Add `## Browser Support`, `## Support Notes`, or a visible standards note when compatibility or compliance changes implementation decisions\n- **Wrong priority**: `critical` = site-breaking / security / legal. `high` = significantly degrades UX. `medium` = best practice. `low` = nice-to-have\n- **Missing required fields**: All 7 required fields must be present; builds fail otherwise\n- **Emoji in titles**: Titles should be plain text (no emoji)\n\n## Category Taxonomy\n\nValid values for the `categories` array:\n\n| Slug | Description |\n|------|-------------|\n| `html` | Document structure, semantics, forms |\n| `css` | Layout, typography, animation, responsive |\n| `javascript` | Client-side scripting, async, security |\n| `performance` | Loading speed, rendering, Core Web Vitals |\n| `accessibility` | WCAG, ARIA, keyboard, screen readers |\n| `seo` | Meta tags, structured data, crawlability |\n| `security` | HTTPS, CSP, XSS prevention, headers |\n| `images` | Optimization, formats, responsive images |\n| `testing` | Unit, integration, e2e, a11y testing |\n| `privacy` | Consent, data minimisation, data rights |\n| `i18n` | Localization, pluralization, bidi, locale formatting |\n| `general` | Cross-cutting best practices |\n\n## Quality Scoring Rubric\n\nRules are scored automatically via `pnpm score:rules` (100-point base score plus up to 12 conditional points, minimum 50 to pass the current quality gate).\n\n| Dimension | Points | What to Check |\n|-----------|--------|---------------|\n| Prompts (`check`/`fix`/`explain`) | 24 | All 3 prompts are specific and non-generic |\n| TLDR bullets | 4 | 3+ actionable bullets |\n| Why it matters | 4 | Explains user, business, or operational impact |\n| AI context | 6 | Captures where and when the rule applies in automated reviews |\n| Related rules | 6 | Links adjacent rules with clear reasons |\n| Sources | 10 | Includes authoritative references |\n| Resources / tools | 6 | Includes useful supporting docs or tools |\n| Code review prompt | 6 | Provides a systematic review strategy |\n| Code examples | 10 | Includes realistic examples, not just prose |\n| Body depth | 10 | Provides substantive implementation detail |\n| Verification section | 8 | Includes `Verification`, `Testing`, `Audit Checklist`, or equivalent |\n| Thresholds / pass-fail criteria | 6 | Uses explicit numbers or conditions where the rule is measurable |\n| Exceptions (conditional) | 4 | Adds an `Exceptions` section when the rule is nuanced or false-positive-prone |\n| Verification split (conditional) | 4 | Splits verification into automated and manual checks when both apply |\n| Standards/support visibility (conditional) | 4 | Adds a visible threshold, standards note, or support note when required by the rule type |\n\nRules scoring < 50 are excluded from MCP tool responses and the web UI.\n\n## Adding or Updating a Rule\n\n1. Create `packages/content/rules/en/<category>/<slug>.mdx`\n2. Fill all required frontmatter fields\n3. Add recommended metadata: `sources`, `resources`, `aiContext`, `relatedRules`, and `prompts.codeReview` where applicable\n4. Write the rule using the canonical-url structure (intro, examples, why it matters, verification, category-specific guidance)\n5. Run `pnpm score:rules` — must score ≥ 50 for now; target 60+ for new work\n6. Run `pnpm validate:rule-structure` — validates rule section order and final `Verification` heading\n7. Run `pnpm report:rule-links` — reviews inline-link density and suggests safe internal/external candidates\n8. Run `pnpm validate:sources` — validates external URLs\n9. Run `pnpm generate:skills` — regenerates skills index\n\n## Scripts Reference\n\n```bash\npnpm score:rules          # Score all rules; flags < 50 quality gate failures\npnpm validate:rule-structure  # Validate rule heading structure and report drift\npnpm report:v2-gaps       # Report conditional V2 gaps by category and migration batch\npnpm report:rule-links    # Review inline-link density and candidate internal/external links\npnpm generate:exceptions-hints  # Dry-run suggestions for missing Exceptions sections\npnpm generate:support-notes  # Dry-run support-note suggestions from browser data\npnpm generate:verification-split  # Dry-run Verification split suggestions\npnpm validate:sources     # Validate external URLs in rule frontmatter\npnpm validate:packages    # Check package dependency consistency\npnpm generate:skills      # Regenerate skills/ directory from rules\npnpm build                # Full monorepo build (via Turborepo)\npnpm typecheck            # TypeScript check across all packages\npnpm lint                 # Biome lint\npnpm lint:fix             # Biome lint with auto-fix\n```\n\n## MCP Tool Development\n\nNew MCP tools go in `packages/mcp/src/tools/<tool-name>.ts` and must be:\n\n1. Exported from `packages/mcp/src/tools/index.ts`\n2. Added to `BASE_TOOL_DEFINITIONS` in `packages/mcp/src/server.ts`\n3. Added as a `case` in the `handleToolsCall` switch in `server.ts`\n\nTool definition shape:\n```typescript\nexport const myToolDefinition = {\n  name: 'my_tool',\n  description: '...',  // Critical for tool discoverability — be specific\n  inputSchema: {\n    type: 'object' as const,\n    properties: { ... },\n    required: ['fieldName'],\n  },\n}\n```\n\n## Workspace Architecture Notes\n\n- **Auth**: Better-Auth + Prisma + Supabase Postgres in `packages/auth/`\n- **Validation**: Zod v4 — use `.issues` not `.errors` on `ZodError`\n- **Forms**: `@tanstack/react-form` with manual Zod validation on submit\n- **Email**: Resend SDK v6, sending domain `mail.frontendchecklist.io`\n- **Rate limiting**: `@upstash/ratelimit` + `@upstash/redis` in `apps/web/lib/rate-limit.ts`\n- **Query**: TanStack Query v5 with `getQueryClient()` factory (not singleton)\n- **Dev server**: `portless run next dev`\n\n## Learned User Preferences\n\n- Put shared concerns (e.g. fonts, typography) in the design system and import from there; apps wire implementation (e.g. next/font) using config from the design system.\n- Do not use `suppressHydrationWarning`; fix server/client mismatch (e.g. defer client-only state until after mount).\n- Reuse existing components instead of creating page-specific variants (e.g. shared `FAQAccordion` for any FAQ section, `.code-block`/`.code-inline` for all code display, ChecklistActionBar instead of new progress bars). When adding a feature to one page type, add it to all relevant page types (e.g. ShareButton on category, rule detail, and all-rules pages).\n- Rule row: click on rule title toggles completion; expand/collapse only via the plus/minus icon. Expanded content shows description first, then tags and action buttons on one row aligned with the description.\n- Prefer Tailwind utility classes in components over custom CSS classes in globals.css.\n- Use a scalable overrides map for special-case labels (e.g. subcategory aria → ARIA) instead of hardcoded conditionals.\n- Do not use `git commit --no-verify`; fix ALL pre-commit violations (JSDoc, as-casts, barrel files, complexity, relative imports) rather than deferring or working around them. Write JSDoc at the same time as the code, not as a batch fix later.\n- **Card-style links**: Use the stretched-link pattern: the `<a>`/`<Link>` wraps **only the title text** inside a heading and uses `after:absolute after:inset-0 after:content-[\"\"]` so its `::after` pseudo-element expands to fill the card container (`position: relative`). Secondary interactive elements need `relative z-10`. See `docs/card-links.md`.\n- Centralize all icons in `@repo/design-system`: brand icons in `brand-icons.tsx`, Lucide re-exported from `icons.ts`. Use official brand icons (`@icons-pack/react-simple-icons`) for branded services, not Lucide approximations. Consumers never import directly from `lucide-react`.\n- Never use Tailwind opacity modifiers (`/50`, `/60`, `/70`) on semantic theme text colors like `text-foreground-muted` — it crushes contrast in light mode. Use the appropriate token (`text-foreground-muted`, `text-foreground-subtle`) at full opacity instead.\n- Always refer to the social platform as \"X\", never \"Twitter\". Schema fields use `xUrl` (not `twitterUrl`), UI labels say \"X\", and URLs point to `x.com`.\n- About page link belongs in the footer only, not in the main navbar.\n\n## Learned Workspace Facts\n\n- Fluid typography tokens use `clamp()` in `@theme inline` for `text-base` and above; `text-xs` and `text-sm` stay fixed for compact UI controls (buttons, badges, inputs, tooltips).\n- next/font: apply each font’s `.className` to the document element (not `.variable`); Next.js requires literal option objects, so the app must inline font options while the design system can document them.\n- Do not apply client-side bot protection (e.g. Vercel BotID) to programmatic API endpoints like MCP; use it only for browser-originated form and mutation endpoints.\n- Next.js reads next.config.js at startup; restart the dev server after changing it (e.g. images.remotePatterns). `withContentCollections` returns a Promise (async config) so it must be the outermost wrapper — `export default withContentCollections(withBotId(nextConfig))`. `withBotId` does not handle async configs and will silently drop all properties including `images`.\n- Tailwind preflight resets `list-style` on `ul`/`ol`; `.prose` styles must explicitly set `list-style-type: disc` (ul), `decimal` (ol), and nested variants (`circle`, `lower-alpha`).\n- CSS custom properties use OKLCH color format. Light mode tokens need visible contrast on all screens: `--border` at least oklch(0.885), `--foreground-subtle` at oklch(0.64), shadows at 0.06+ opacity. Use `color-mix(in oklch, var(--token) N%, transparent)` for theme-aware transparent colors instead of hardcoded `rgba()`.\n- Pre-commit hooks (lefthook) enforce: biome check, JSDoc, no-as-casts, no-barrel-files, file-complexity (300 lines React / 500 lines other), no-deep-relative-imports, no-console-logs, test coverage.\n- Button default variant uses `bg-accent text-accent-foreground hover:bg-accent-hover` (project's accent tokens), not shadcn's `bg-primary`; keep project-specific semantic tokens in component variants even when shadcn aliases exist.\n- Scripts are organized in subfolders: `scripts/{validation,generate,rule-structure,validate,audit}/`; `scripts/README.md` documents each script and subfolder.\n- Biome's `useSortedClasses` only sorts class **order**; it cannot rename deprecated classes. Use `@tailwindcss/upgrade` (installed in `apps/web`) to canonicalize class names project-wide.\n- Monorepo uses pnpm catalogs (`catalog:` in `pnpm-workspace.yaml`) for centralized dependency versions; shared deps appearing in 2+ packages use `catalog:` instead of hardcoded version strings.\n- Brand icons (ChatGPT, Claude, X, LinkedIn, Reddit, Cursor, VSCode) live in `packages/design-system/src/brand-icons.tsx` and are re-exported from the design-system barrel.\n\n<!-- BEGIN:turborepo-agent-rules -->\n\n# This is NOT the Turborepo you know\n\nTurborepo configuration, task behavior, and CLI commands can vary between installed versions and may differ from your training data. Resolve the `turbo` package from this file's directory or relevant workspace; in monorepos, it may not be visible from the repository root. For example, run `node -p \"require.resolve('turbo/package.json')\"` from a workspace that depends on `turbo`.\n\nRead `docs/README.md` inside that installed package first, then read the relevant pages from its `docs/` directory before changing Turborepo configuration or commands. Heed deprecation notices. These bundled docs match the installed package version and are available without network access.\n\nThis block is written and re-added by `turbo` before repository-scoped commands when an AI agent is detected. In the Turborepo source repository, its template is defined in `crates/turborepo-cli/src/cli/agent_guidance.rs`. Removing the managed block while updates are enabled means a later qualifying invocation will add it again. Set `\"agentGuidance\": false` in the root `turbo.json` or `turbo.jsonc` to opt out; this does not remove an existing block. Keep the block committed with your work to avoid an uncommitted change on the next agent invocation.\n<!-- END:turborepo-agent-rules -->\n","CLAUDE.md":"# Project Guidance\n\nUse [AGENTS.md](AGENTS.md) for repository conventions, workflows, and tool setup.\n\nLocal Claude Code session state belongs in `.claude/`, which is ignored by git and should not be committed.\n","packages/analytics/README.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Fanalytics%2FREADME.md -->","packages/cli/README.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Fcli%2FREADME.md -->","packages/cli/SKILL.md":"---\nname: frontendchecklist\ndescription: Review frontend code and live pages against the Front-End Checklist (380+ rules for accessibility, performance, SEO, security, HTML, CSS, JavaScript, images, i18n, privacy, testing) using the `frontendchecklist` CLI. Use when writing, reviewing, or shipping HTML/CSS/JS/JSX/TSX/Vue/Svelte/Astro code, before a commit or PR, or when asked to audit a public URL.\n---\n\n# Front-End Checklist CLI\n\n`frontendchecklist` checks frontend code against the Front-End Checklist rules. It works offline,\nprints JSON when its output is piped (which is how you will usually call it), and uses exit codes\nyou can branch on.\n\nRun it with `npx -y @frontendchecklist/cli <command>` if `frontendchecklist` is not installed.\n\n## When to use it\n\n- After writing or editing frontend files: `frontendchecklist review <paths>`.\n- Before committing: `git diff --cached | frontendchecklist review -`.\n- When the user asks to audit a deployed page: `frontendchecklist audit https://...`.\n- When you need the authoritative guidance for a topic: `frontendchecklist search <topic>`, then\n  `frontendchecklist rule <slug>`.\n- For a structured pass (launch, accessibility, SEO, performance): `frontendchecklist checklists`,\n  then `frontendchecklist checklist <slug>`.\n\n## Commands\n\n| Command | Purpose |\n| --- | --- |\n| `review <paths...\\|->` | Static review of files, directories (walked; vendor dirs skipped), or stdin |\n| `audit <https-url>` | Fetch a public page and review its HTML |\n| `search [query] [--focus a,b] [-n 10]` | Find rules by keyword, technology, or category |\n| `rule <slug>` | Why a rule matters, how to check it, how to fix it |\n| `checklists` / `checklist <slug>` | Curated checklists and their rules |\n| `categories` | Categories with rule counts |\n| `schema` | Full command reference as JSON |\n\nUseful flags: `--focus accessibility,seo`, `--min-priority high`, `--fail-on high`.\n\n## Reading results\n\n- `review` and `audit` return `{ findings: [{ target, rule, title, priority, issue, fix? }], failing }`.\n- Exit code `0`: fine. `1`: findings at or above `--fail-on`. `2`: bad input or runtime error, with\n  `{ \"error\": \"...\" }` on stdout.\n- Findings are conservative static heuristics. \"No findings\" means nothing provable was found, not\n  that the code is clean: follow up with `search`/`rule` for areas the heuristics cannot see\n  (rendered contrast, focus order, real performance).\n\n## Workflow\n\n1. `frontendchecklist review <changed files> --min-priority medium`\n2. For each finding, run `frontendchecklist rule <rule>` and apply its fix guidance.\n3. Re-run the review until no critical/high findings remain (`--fail-on high` exits 0).\n4. Mention any remaining medium/low findings to the user instead of silently ignoring them.\n","packages/rules/README.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Frules%2FREADME.md -->","plugins/front-end-checklist/.claude-plugin/plugin.json":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2F.claude-plugin%2Fplugin.json -->","plugins/front-end-checklist/.codex-plugin/plugin.json":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2F.codex-plugin%2Fplugin.json -->","plugins/front-end-checklist/README.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2FREADME.md -->","plugins/front-end-checklist/skills/frontend-checklist-global/SKILL.md":"---\nname: frontend-checklist-global\ndescription: \"Use when auditing or improving any frontend codebase against the full Front-End Checklist rule corpus through one entry point.\"\nmetadata:\n  category: global\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"30\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/mcp\n---\n\n# Front-End Checklist Global Audit\n\nThis skill connects one entry point to all 386 Front-End Checklist rules.\nUse MCP retrieval instead of trying to recall rules from memory.\n\n## Workflow\n\n1. Start with `review_code` for pasted code, file contents, or focused code review.\n2. Use `audit_url` for a public page when you need rendered HTML audited quickly.\n3. Narrow or expand scope with `search_rules`, `list_categories`, `get_workflow`, or `get_quick_reference`.\n4. For each issue, use `get_rule`, `fix_rule`, or `explain_rule` to give exact remediation.\n5. If a checklist is a better fit than ad hoc search, use `get_checklist_rules`.\n\n## Audit Stance\n\n- Be conservative. Prefer fewer, stronger findings over speculative breadth.\n- Only report an issue when the code or markup shown supports it directly.\n- In small component or route audits, prefer the strongest 1-2 supported findings over listing every possible enhancement.\n- Do not infer business intent from a snippet alone. Example: do not assume a field is required unless the code or surrounding copy makes that explicit.\n- Do not treat `alt=\"\"` as an issue by default; empty alt can be correct for decorative images.\n- When an image is explicitly decorative, prefer zero findings unless the snippet shows a concrete problem rather than a hypothetical optimization.\n- If you see an isolated decorative image like `<img ... alt=\"\" aria-hidden=\"true\">`, treat it as a zero-issue pattern unless the snippet also shows real evidence of layout instability.\n- Do not raise low-confidence preference tweaks as findings when the snippet is otherwise sound. Prefer silence over weak nitpicks.\n- Do not treat `autocomplete=\"off\"` as a defect by itself unless the snippet shows a stronger user-harm or security reason to flag it.\n- In link-preview cards, decorative preview images and favicons may be safe when nearby visible text already names the destination.\n- Do not treat React or JSX fragments as full HTML documents unless the snippet includes real document context like `<html>`, `<head>`, or `<body>`.\n- When reviewing Next.js or metadata-driven page files, consider `metadata`, `viewport`, and `generateMetadata` APIs before claiming head-tag omissions.\n\n## Coverage Checklist\n\n- Forms: check labels, accessible button names, explicit button types, `autocomplete` hints, password-field autocomplete, and validation semantics that are explicit in the code.\n- Images: check `width`/`height`, `loading`, `srcset`/`sizes`, and whether image semantics are clearly meaningful or decorative. Do not assume tiny SVG logos or clearly decorative assets must be lazy-loaded, and do not demand explicit dimensions for tiny ornamental dividers unless the snippet shows a real layout-shift risk. If an image is both decorative and hidden from assistive tech, bias strongly toward no finding.\n- Metadata: check title placement, canonical-url behavior, meta descriptions, Open Graph coverage, and structured data only when the file is responsible for metadata.\n- Motion: check expensive animated properties, prefer transform/opacity, and require `prefers-reduced-motion` handling for persistent motion.\n- Motion: when counters or visual widgets animate every frame, assess both reduced-motion support and whether the animation strategy adds unnecessary main-thread work.\n- Security: check `target=\"_blank\"` links for `noopener noreferrer`, insecure form actions, password input best practices, and blocking third-party scripts.\n- Structure: check duplicate ids, list semantics, and table headers conservatively. For simple tables, column-header associations are stronger findings than speculative row-header or outer-layout landmark issues.\n- Structure: when a visible heading already introduces a simple table, treat missing captions as a lower-confidence improvement than missing header associations.\n\n## Rule-Derived Highlights\n\n### Set explicit width and height on images\n- Reserve findings for meaningful content images; decorative micro-SVGs or ornament-only assets are low-priority exceptions when CSS already reserves stable space\n- Example low-risk exception: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` should not be flagged on its own without evidence of visible layout shift\n- Always set `width` and `height` attributes on `<img>` matching the image's intrinsic dimensions\n- Pair with `height: auto` in CSS to keep the image fluid while preserving the aspect ratio\n- Missing dimensions are the leading cause of Cumulative Layout Shift (CLS) from images\n\n### Hide decorative elements from assistive technology\n- Use alt='' (empty) for decorative images—not alt='image' or missing alt\n- Add aria-hidden='true' to decorative SVGs and icons\n- Use CSS background-image for purely decorative visuals\n- Role='presentation' removes semantic meaning from elements\n- Do not automatically raise performance findings on decorative micro-assets unless the snippet shows real layout instability\n\n### Use transform and opacity for animations\n- Only transform and opacity can be composited on the GPU without triggering layout\n- Use will-change: transform sparingly to promote an element to its own compositor layer\n- Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n- Respect prefers-reduced-motion to disable animations for users who need it\n\n### Respect reduced motion preferences\n- Use prefers-reduced-motion media query to disable non-essential animations\n- Never flash content more than 3 times per second (seizure risk)\n- Replace motion with opacity/color transitions when reduced motion is enabled\n- Provide user controls to pause or disable animations\n\n### Use semantic table markup for screen readers\n- Use <th> elements for headers with scope='col' or scope='row'\n- Add <caption> to describe the table's purpose\n- Never use tables for layout—use CSS Grid or Flexbox instead\n- Use id/headers for complex tables with merged cells\n- For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n\n### Define proper table headers\n- Use `<th>` for all table headers, not `<td>`\n- Apply `scope=\"col\"` or `scope=\"row\"` to clarify header relationship\n- Ensure every data cell is associated with at least one header\n- In simple tables, prefer fixing header associations before escalating to caption-level recommendations\n- Missing `scope=\"col\"` on a straightforward header row is often the clearest first fix\n\n### Minimize costly DOM read/write operations\n- Never interleave DOM reads (offsetHeight, getBoundingClientRect) with DOM writes (style changes)\n- Batch all reads first, then all writes\n- Use requestAnimationFrame for visual updates\n- Use DocumentFragment or innerHTML for bulk DOM insertion\n- Avoid per-frame React state updates across many visible components when a simpler CSS or reduced-frequency approach would work\n\n### Validate forms accessibly\n- Associate error messages with fields using aria-describedby\n- Use aria-invalid to indicate validation state\n- Mark required fields programmatically with `required` or `aria-required`\n- Provide inline error messages near the field\n- Don't rely solely on color to indicate errors\n\n### Secure password input fields\n- Use type='password' with correct autocomplete attribute\n- Provide accessible show/hide toggle for password visibility\n- Show password strength indicator with requirements\n- Never store or transmit passwords in plain text\n- Support password managers with proper input names\n\n### Provide visible custom focus indicators\n- Never use outline: none or outline: 0 without a visible :focus-visible replacement\n- Use :focus-visible instead of :focus to show indicators only during keyboard navigation\n- Focus indicators must have 3:1 contrast ratio against adjacent colors (WCAG 2.2)\n- Provide at least 2px solid outline with an offset for a high-quality focus ring\n- If a focus ring is drawn with pseudo-elements, verify it is anchored to the correct positioned element and not clipped by `overflow: hidden`\n\n## Known Safe Patterns\n\n### Decorative Divider\n- Safe example: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">`\n- Treat this as a safe decorative pattern by default. Do not flag alt text or missing dimensions unless the snippet also shows a real layout-shift risk.\n\n### Client-Handled React Form\n- Safe example: `<form onSubmit={event => event.preventDefault()}><label htmlFor=\"q\">Search</label><input id=\"q\" type=\"search\" /></form>`\n- Do not require `method` or `action` when client-side submit handling is explicit and the form controls are otherwise accessible.\n\n### Next Metadata API\n- Safe example: `export async function generateMetadata() { return { title: 'Docs', description: 'Reference' } }`\n- Do not infer missing canonical-url, meta description, or Open Graph tags just because literal `<head>` markup is absent from the component file.\n\n### Preview Card Images\n- Safe example: `<img src={resource.image} alt=\"\" className=\"object-cover\" /><img src={favicon} alt=\"\" width={20} height={20} />`\n- In link-preview or resource-card UIs, decorative preview/favicons can legitimately use empty alt when adjacent text already provides the destination name. Do not invent responsive-image or layout-shift defects for tiny favicon assets without stronger evidence.\n\n### Aspect-Ratio Media Wrapper\n- Safe example: `<div className=\"aspect-2/1 overflow-hidden\"><img className=\"object-cover w-full h-full\" ... /></div>`\n- When a wrapper already reserves media space with a stable aspect ratio, do not automatically raise a missing dimensions finding for the child preview image.\n\n### Pseudo-Element Focus Ring\n- Safe example: `focus-visible:outline-none focus-visible:after:ring-2 after:absolute after:inset-0`\n- If focus styling depends on a pseudo-element, verify the ring is anchored to the correct positioned element. A removed native outline is only safe when the replacement ring is clearly reliable.\n\n### Per-Frame React Counter Animation\n- Safe example: `requestAnimationFrame(animate); setCount(Math.floor(eased * target))`\n- Repeated requestAnimationFrame state updates across multiple components are a concrete performance concern when shown directly in the code.\n\n### Simple Data Table Headers\n- Safe example: `<thead><tr><th>Priority</th><th>Rule</th><th>Title</th></tr></thead>`\n- For simple data tables, prefer conservative column-header findings before speculating about row headers or outer-layout landmarks.\n\n### Adjacent Heading + Table\n- Safe example: `<h2>Issues</h2><table><thead>...</thead><tbody>...</tbody></table>`\n- A nearby visible section heading may already provide table context. Prefer scope/header association findings before requiring a caption unless the table purpose is ambiguous.\n\n## Conflict Resolution\n\n- If decorative-image guidance and dimensions guidance conflict, decorative guidance wins unless the snippet shows visible layout instability.\n- Example zero-issue pattern: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` in an isolated component should not be flagged for alt text or dimensions unless the snippet also shows real layout-shift evidence.\n- If a form is clearly handled client-side with `onSubmit`, do not require traditional server-post `method` or `action` attributes.\n- If a file uses Next.js metadata APIs, do not infer missing head tags from the absence of literal `<meta>` or canonical-url markup.\n\n## Coverage\n\n- accessibility: 89 rules (9 critical, 25 high)\n- css: 31 rules (10 high)\n- html: 34 rules (3 critical, 12 high)\n- i18n: 5 rules\n- images: 25 rules (1 critical, 15 high)\n- javascript: 26 rules (1 critical, 12 high)\n- performance: 43 rules (1 critical, 22 high)\n- privacy: 5 rules (2 high)\n- security: 22 rules (4 critical, 10 high)\n- seo: 93 rules (19 high)\n- testing: 13 rules (7 high)\n\n## Evaluation Standard\n\n- Prefer findings tied to exact files, routes, selectors, or code snippets.\n- Prioritize critical and high issues first.\n- Explain uncertainty instead of overstating when the snippet does not show enough context.\n- Avoid generic advice when the MCP tools can retrieve a rule or fix prompt.\n- When no issue is found automatically, use `search_rules` to broaden review coverage before concluding clean.\n\n---\n\nSee `references/categories.md` for category coverage and tool routing.\n\nMCP docs: https://frontendchecklist.io/mcp\n","plugins/front-end-checklist/skills/frontend-checklist-global/references/categories.md":"# Front-End Checklist Global Skill Reference\n\nThis aggregate skill routes to the Front-End Checklist MCP tools across 386 rules.\n\n## Tool Routing\n\n| Goal | Preferred tool |\n| --- | --- |\n| Review pasted code or a single file | `review_code` |\n| Audit a public page | `audit_url` |\n| Find relevant rules by topic | `search_rules` |\n| Browse available categories | `list_categories` |\n| Get the full content for one rule | `get_rule` |\n| Get remediation guidance | `fix_rule` |\n| Explain impact to the user | `explain_rule` |\n| Pull a curated checklist at once | `get_checklist_rules` |\n| Start from a workflow or quick checklist | `get_workflow`, `get_quick_reference` |\n\n## Frontend Review Guardrails\n\n- Do not infer missing metadata from a component fragment that is not responsible for document head output.\n- Do not infer required fields, password policies, or decorative-image intent unless the code makes the intent explicit.\n- Favor exact evidence from the snippet over broad style advice.\n- When the snippet is a partial component, focus on what the component itself controls.\n\n## Rule-Derived Highlights\n\n- **Set explicit width and height on images**\n  Reserve findings for meaningful content images; decorative micro-SVGs or ornament-only assets are low-priority exceptions when CSS already reserves stable space\n  Example low-risk exception: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` should not be flagged on its own without evidence of visible layout shift\n  Always set `width` and `height` attributes on `<img>` matching the image's intrinsic dimensions\n  Pair with `height: auto` in CSS to keep the image fluid while preserving the aspect ratio\n  Missing dimensions are the leading cause of Cumulative Layout Shift (CLS) from images\n- **Hide decorative elements from assistive technology**\n  Use alt='' (empty) for decorative images—not alt='image' or missing alt\n  Add aria-hidden='true' to decorative SVGs and icons\n  Use CSS background-image for purely decorative visuals\n  Role='presentation' removes semantic meaning from elements\n  Do not automatically raise performance findings on decorative micro-assets unless the snippet shows real layout instability\n- **Use transform and opacity for animations**\n  Only transform and opacity can be composited on the GPU without triggering layout\n  Use will-change: transform sparingly to promote an element to its own compositor layer\n  Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n  Respect prefers-reduced-motion to disable animations for users who need it\n- **Respect reduced motion preferences**\n  Use prefers-reduced-motion media query to disable non-essential animations\n  Never flash content more than 3 times per second (seizure risk)\n  Replace motion with opacity/color transitions when reduced motion is enabled\n  Provide user controls to pause or disable animations\n- **Use semantic table markup for screen readers**\n  Use <th> elements for headers with scope='col' or scope='row'\n  Add <caption> to describe the table's purpose\n  Never use tables for layout—use CSS Grid or Flexbox instead\n  Use id/headers for complex tables with merged cells\n  For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n- **Define proper table headers**\n  Use `<th>` for all table headers, not `<td>`\n  Apply `scope=\"col\"` or `scope=\"row\"` to clarify header relationship\n  Ensure every data cell is associated with at least one header\n  In simple tables, prefer fixing header associations before escalating to caption-level recommendations\n  Missing `scope=\"col\"` on a straightforward header row is often the clearest first fix\n- **Minimize costly DOM read/write operations**\n  Never interleave DOM reads (offsetHeight, getBoundingClientRect) with DOM writes (style changes)\n  Batch all reads first, then all writes\n  Use requestAnimationFrame for visual updates\n  Use DocumentFragment or innerHTML for bulk DOM insertion\n  Avoid per-frame React state updates across many visible components when a simpler CSS or reduced-frequency approach would work\n- **Validate forms accessibly**\n  Associate error messages with fields using aria-describedby\n  Use aria-invalid to indicate validation state\n  Mark required fields programmatically with `required` or `aria-required`\n  Provide inline error messages near the field\n  Don't rely solely on color to indicate errors\n- **Secure password input fields**\n  Use type='password' with correct autocomplete attribute\n  Provide accessible show/hide toggle for password visibility\n  Show password strength indicator with requirements\n  Never store or transmit passwords in plain text\n  Support password managers with proper input names\n- **Provide visible custom focus indicators**\n  Never use outline: none or outline: 0 without a visible :focus-visible replacement\n  Use :focus-visible instead of :focus to show indicators only during keyboard navigation\n  Focus indicators must have 3:1 contrast ratio against adjacent colors (WCAG 2.2)\n  Provide at least 2px solid outline with an offset for a high-quality focus ring\n  If a focus ring is drawn with pseudo-elements, verify it is anchored to the correct positioned element and not clipped by `overflow: hidden`\n\n## Known Safe Patterns\n\n- **Decorative Divider**\n  Safe example: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">`\n  Treat this as a safe decorative pattern by default. Do not flag alt text or missing dimensions unless the snippet also shows a real layout-shift risk.\n- **Client-Handled React Form**\n  Safe example: `<form onSubmit={event => event.preventDefault()}><label htmlFor=\"q\">Search</label><input id=\"q\" type=\"search\" /></form>`\n  Do not require `method` or `action` when client-side submit handling is explicit and the form controls are otherwise accessible.\n- **Next Metadata API**\n  Safe example: `export async function generateMetadata() { return { title: 'Docs', description: 'Reference' } }`\n  Do not infer missing canonical-url, meta description, or Open Graph tags just because literal `<head>` markup is absent from the component file.\n- **Preview Card Images**\n  Safe example: `<img src={resource.image} alt=\"\" className=\"object-cover\" /><img src={favicon} alt=\"\" width={20} height={20} />`\n  In link-preview or resource-card UIs, decorative preview/favicons can legitimately use empty alt when adjacent text already provides the destination name. Do not invent responsive-image or layout-shift defects for tiny favicon assets without stronger evidence.\n- **Aspect-Ratio Media Wrapper**\n  Safe example: `<div className=\"aspect-2/1 overflow-hidden\"><img className=\"object-cover w-full h-full\" ... /></div>`\n  When a wrapper already reserves media space with a stable aspect ratio, do not automatically raise a missing dimensions finding for the child preview image.\n- **Pseudo-Element Focus Ring**\n  Safe example: `focus-visible:outline-none focus-visible:after:ring-2 after:absolute after:inset-0`\n  If focus styling depends on a pseudo-element, verify the ring is anchored to the correct positioned element. A removed native outline is only safe when the replacement ring is clearly reliable.\n- **Per-Frame React Counter Animation**\n  Safe example: `requestAnimationFrame(animate); setCount(Math.floor(eased * target))`\n  Repeated requestAnimationFrame state updates across multiple components are a concrete performance concern when shown directly in the code.\n- **Simple Data Table Headers**\n  Safe example: `<thead><tr><th>Priority</th><th>Rule</th><th>Title</th></tr></thead>`\n  For simple data tables, prefer conservative column-header findings before speculating about row headers or outer-layout landmarks.\n- **Adjacent Heading + Table**\n  Safe example: `<h2>Issues</h2><table><thead>...</thead><tbody>...</tbody></table>`\n  A nearby visible section heading may already provide table context. Prefer scope/header association findings before requiring a caption unless the table purpose is ambiguous.\n\n## Category Coverage\n\n- **accessibility**: 89 rules · 9 critical · 25 high\n- **css**: 31 rules · 10 high\n- **html**: 34 rules · 3 critical · 12 high\n- **i18n**: 5 rules\n- **images**: 25 rules · 1 critical · 15 high\n- **javascript**: 26 rules · 1 critical · 12 high\n- **performance**: 43 rules · 1 critical · 22 high\n- **privacy**: 5 rules · 2 high\n- **security**: 22 rules · 4 critical · 10 high\n- **seo**: 93 rules · 19 high\n- **testing**: 13 rules · 7 high\n\nRules browser: https://frontendchecklist.io/rules\nFull reference: https://frontendchecklist.io/llms-full.txt\n","skills/404-page/SKILL.md":"---\nname: 404-page\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Create a custom 404 error page. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: beginner\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/404-page\n---\n\n# Create a custom 404 error page\n\nA generic browser 404 page causes users to leave immediately—a well-designed custom page provides recovery paths and keeps users engaged with your site.\n\n## Quick Reference\n\n- Custom 404 pages retain users who encounter broken or moved links\n- Include search, navigation, and links to popular content\n- Maintain consistent branding and site design\n- Track 404 errors to identify and fix broken links\n- Return a real HTTP 404 so the page is not treated as a soft 404\n\n## Check\n\nVerify that this website has a custom 404 error page with helpful navigation options. Confirm the route returns HTTP 404 and not a branded page with a 200 response.\n\n## Fix\n\nCreate a user-friendly 404 page with search functionality and links to important pages. Ensure the server or framework returns status code 404 so the page does not become a soft 404.\n\n## Explain\n\nExplain how custom 404 pages help retain users who encounter broken links and why returning 200 for missing pages creates soft-404 indexing problems.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Create a custom 404 error page. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/404-page\n","skills/404-page/references/rule.md":"# Create a custom 404 error page\n\n> A custom 404 error page is designed with helpful navigation options for lost users.\n\n**Priority:** medium · **Difficulty:** beginner · **Time:** 20 min\n\n---\nCustom 404 pages transform dead ends into opportunities to guide users back to relevant content.\n\n## Code Example\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Page Not Found - Site Name</title>\n  <meta name=\"robots\" content=\"noindex\">\n</head>\n<body>\n  <main class=\"error-page\">\n    <h1>Page Not Found</h1>\n    <p>Sorry, the page you're looking for doesn't exist or has been moved.</p>\n\n    <!-- Search -->\n    <form action=\"/search\" method=\"GET\" role=\"search\">\n      <label for=\"search\">Search our site:</label>\n      <input type=\"search\" id=\"search\" name=\"q\" placeholder=\"What are you looking for?\">\n      <button type=\"submit\">Search</button>\n    </form>\n\n    <!-- Helpful links -->\n    <nav aria-label=\"Helpful links\">\n      <h2>Try these instead:</h2>\n      <ul>\n        <li><a href=\"/\">Home</a></li>\n        <li><a href=\"/products\">Products</a></li>\n        <li><a href=\"/blog\">Blog</a></li>\n        <li><a href=\"/contact\">Contact Us</a></li>\n      </ul>\n    </nav>\n  </main>\n</body>\n</html>\n```\n\n## Why It Matters\n\nA generic browser 404 page causes users to leave immediately—a well-designed custom page provides recovery paths and keeps users engaged with your site.\n\n## Essential Elements\n\n| Element | Purpose |\n|---------|---------|\n| Clear message | Explain the page wasn't found |\n| Search box | Help users find what they need |\n| Navigation links | Quick access to main sections |\n| Popular content | Suggest relevant pages |\n| Home link | Easy return to start |\n| Contact option | Report broken links |\n\n## Next.js Implementation\n\n```tsx\n// app/not-found.tsx\n\n  return (\n    <main className=\"min-h-screen flex items-center justify-center px-4\">\n      <div className=\"text-center max-w-md\">\n        <h1 className=\"text-6xl font-bold text-gray-900 mb-4\">404</h1>\n        <h2 className=\"text-2xl font-semibold mb-4\">Page Not Found</h2>\n        <p className=\"text-gray-600 mb-8\">\n          The page you're looking for doesn't exist or has been moved.\n        </p>\n\n        <div className=\"space-y-4\">\n          \n            Go Home\n          \n\n          \n            Search Site\n          \n        </div>\n\n        <nav className=\"mt-8\" aria-label=\"Popular pages\">\n          <h3 className=\"text-sm font-semibold text-gray-500 mb-3\">\n            Popular Pages\n          </h3>\n          <ul className=\"space-y-2\">\n            <li>Products</li>\n            <li>Documentation</li>\n            <li>Blog</li>\n          </ul>\n        </nav>\n      </div>\n    </main>\n  )\n}\n```\n\n## React Component with Error Tracking\n\n```tsx\ninterface NotFoundPageProps {\n  searchEnabled?: boolean\n  popularLinks?: Array<{ href: string; label: string }>\n}\n\n  searchEnabled = true,\n  popularLinks = []\n}: NotFoundPageProps) {\n  // Track 404 for analytics\n  useEffect(() => {\n    // Report to analytics\n    if (typeof window !== 'undefined') {\n      const path = window.location.pathname\n      console.error(`404 Error: ${path}`)\n\n      // Send to analytics service\n      analytics?.track('404_error', { path, referrer: document.referrer })\n    }\n  }, [])\n\n  return (\n    <main role=\"main\" className=\"error-page\">\n      <div className=\"error-content\">\n        <h1>Oops! Page not found</h1>\n        <p>\n          We couldn't find the page you're looking for.\n          It may have been moved or deleted.\n        </p>\n\n        {searchEnabled && (\n          <form action=\"/search\" method=\"GET\" role=\"search\" className=\"search-form\">\n            <label htmlFor=\"error-search\" className=\"sr-only\">\n              Search\n            </label>\n            <input\n              type=\"search\"\n              id=\"error-search\"\n              name=\"q\"\n              placeholder=\"Search...\"\n              aria-label=\"Search site\"\n            />\n            <button type=\"submit\">Search</button>\n          </form>\n        )}\n\n        {popularLinks.length > 0 && (\n          <nav aria-label=\"Suggested pages\">\n            <h2>You might be looking for:</h2>\n            <ul>\n              {popularLinks.map(link => (\n                <li key={link.href}>\n                  <a href={link.href}>{link.label}</a>\n                </li>\n              ))}\n            </ul>\n          </nav>\n        )}\n\n        <a href=\"/\" className=\"home-link\">\n          ← Back to Home\n        </a>\n      </div>\n    </main>\n  )\n}\n```\n\n## Server Configuration\n\n```nginx\n# Nginx\nserver {\n    error_page 404 /404.html;\n    location = /404.html {\n        root /var/www/html;\n        internal;\n    }\n}\n```\n\n```apache\n# Apache .htaccess\nErrorDocument 404 /404.html\n```\n\n## 404 Error Tracking\n\n```tsx\n// middleware.ts (Next.js)\n\n  // Log 404s for monitoring\n  const response = NextResponse.next()\n\n  // You can check response status and log accordingly\n  // This runs before the 404 page renders\n\n  return response\n}\n\n// Alternative: Track in the 404 page itself\n// app/not-found.tsx\n'use client'\n\n  const pathname = usePathname()\n\n  useEffect(() => {\n    // Send to error tracking service\n    fetch('/api/track-404', {\n      method: 'POST',\n      body: JSON.stringify({\n        path: pathname,\n        referrer: document.referrer,\n        timestamp: new Date().toISOString()\n      })\n    })\n  }, [pathname])\n\n  return (/* ... */)\n}\n```\n\n## SEO Considerations\n\n```html\n<head>\n  <!-- Prevent 404 pages from being indexed -->\n  <meta name=\"robots\" content=\"noindex, nofollow\">\n\n  <!-- Return proper 404 status code (server-side) -->\n  <!-- Next.js handles this automatically for not-found.tsx -->\n</head>\n```\n\n## Avoid Soft 404s\n\nA branded \"page not found\" template is still a search bug if the server responds with `200 OK`. Search engines can treat that as a soft 404, which wastes crawl budget and may surface broken pages in reports.\n\n## Styling Best Practices\n\n```css\n.error-page {\n  min-height: 100vh;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 2rem;\n  text-align: center;\n}\n\n.error-content {\n  max-width: 500px;\n}\n\n.error-page h1 {\n  font-size: 3rem;\n  margin-bottom: 1rem;\n}\n\n/* Keep consistent with site branding */\n.error-page {\n  font-family: inherit;\n  background: var(--background);\n  color: var(--foreground);\n}\n\n/* Ensure search is prominent */\n.search-form {\n  margin: 2rem 0;\n}\n\n.search-form input {\n  padding: 0.75rem 1rem;\n  font-size: 1rem;\n  width: 100%;\n  max-width: 300px;\n}\n```\n\n## Verification\n\n1. Navigate to a non-existent URL\n2. Verify HTTP 404 status code is returned\n3. Check page includes navigation options\n4. Test search functionality works\n5. Verify page is not indexed (check robots meta)\n6. Test on mobile devices\n7. Verify screen reader announces content properly\n8. Confirm the missing URL appears as a real 404 in DevTools Network, not a 200 soft-404 response\n\nA custom 404 page must return HTTP status code 404, not 200. Search engines treat 200 responses as valid pages, potentially indexing your error page content.","skills/about-page/SKILL.md":"---\nname: about-page\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Create a dedicated About page. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/about-page\n---\n\n# Create a dedicated About page\n\nAn About page is a primary trust signal for both users and search engines, directly impacting the website's E-E-A-T profile and overall credibility.\n\n## Quick Reference\n\n- Include a dedicated page explaining the purpose, history, and mission of the website\n- Introduce the key people or organization behind the content to build trust\n- Provide clear evidence of expertise and contact information\n\n## Check\n\nVerify that the website has a dedicated About page that clearly identifies the people or organization responsible for the content.\n\n## Fix\n\nCreate a new page at `/about` and add detailed information about your organization, mission, and the experts behind your content.\n\n## Explain\n\nExplain how an About page contributes to E-E-A-T (Experience, Expertise, Authoritativeness, and Trustworthiness) and why it's a critical SEO factor.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Create a dedicated About page. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/about-page\n","skills/about-page/references/rule.md":"# Create a dedicated About page\n\n> Checks for a dedicated about or company page with meaningful content.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nAn About page provides essential context about the source of the information on your website. It helps search engines and users understand the expertise and authority behind the content.\n\n## Code Example\n\nEnsure the About page is easily discoverable, typically via the main navigation or the footer.\n\n```html\n<footer>\n  <nav aria-label=\"Footer Navigation\">\n    <ul>\n      <li><a href=\"/about\">About Us</a></li>\n      <li><a href=\"/contact\">Contact</a></li>\n      <li><a href=\"/privacy-policy\">Privacy Policy</a></li>\n    </ul>\n  </nav>\n</footer>\n```\n\n## Why It Matters\n\n- **E-E-A-T**: Directly supports the Trustworthiness and Authoritativeness pillars of Google's Quality Rater Guidelines.\n- **Transparency**: Shows users who you are, reducing bounce rates and building long-term brand loyalty.\n- **Entity Recognition**: Helps search engines connect your website to a real-world entity (person or organization).\n- **Compliance**: For many industries, identifying the content creator is a legal or regulatory requirement.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/accessibility-testing/SKILL.md":"---\nname: accessibility-testing\ndescription: \"Use when reviewing component libraries, page flows, or CI pipelines that need repeatable accessibility checks. Automated testing is strongest at catching structural and attribute-level issues; it does not replace keyboard, screen reader, and manual UX testing.\"\nmetadata:\n  category: testing\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"30\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/testing/accessibility-testing\n---\n\n# Include accessibility testing\n\nAutomated accessibility testing catches 30-50% of WCAG violations before code reaches users—reducing legal risk and improving usability for everyone.\n\n## Quick Reference\n\n- Use jest-axe for component-level accessibility testing\n- Integrate @axe-core/playwright or cypress-axe for E2E a11y tests\n- Run accessibility tests in CI/CD to catch regressions early\n- Test specific WCAG rules like color-contrast individually\n\n## Check\n\nReview this test suite for accessibility testing coverage using axe-core, jest-axe, or similar tools.\n\n## Fix\n\nAdd automated accessibility testing to detect WCAG violations in components and pages.\n\n## Explain\n\nExplain how to implement automated accessibility testing and what issues it can detect.\n\n## Code Review\n\nInspect component tests, E2E suites, and CI workflows for automated accessibility coverage. Flag critical pages or shared components that ship without axe-based checks, and note issues that still require manual keyboard or screen reader validation.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/testing/accessibility-testing\n","skills/accessibility-testing/references/rule.md":"# Include accessibility testing\n\n> Automate accessibility testing with tools like axe-core, jest-axe, or Playwright's accessibility testing.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 30 min\n\n---\nAutomated accessibility testing catches common WCAG violations before they reach production, protecting your users and reducing legal risk.\n\n## Code Example\n\n```javascript\n\nexpect.extend(toHaveNoViolations)\n\ndescribe('Button', () => {\n  it('should have no accessibility violations', async () => {\n    const { container } = render(\n       {}}>Click me\n    )\n    const results = await axe(container)\n    expect(results).toHaveNoViolations()\n  })\n})\n\n// Test specific rules\nit('should have proper color contrast', async () => {\n  const { container } = render(Warning)\n  const results = await axe(container, {\n    rules: {\n      'color-contrast': { enabled: true }\n    }\n  })\n  expect(results).toHaveNoViolations()\n})\n```\n\n## Why It Matters\n\nAutomated accessibility testing catches 30-50% of WCAG violations before code reaches users—reducing legal risk and improving usability for everyone.\n\n## Testing Tools\n\n| Tool | Use Case | Framework |\n|------|----------|-----------|\n| jest-axe | Unit/component tests | Jest |\n| @axe-core/playwright | E2E tests | Playwright |\n| cypress-axe | E2E tests | Cypress |\n| pa11y | CI/CD pipeline | Any |\n\n## Playwright\n\n```typescript\n\ntest.describe('Homepage accessibility', () => {\n  test('should have no violations', async ({ page }) => {\n    await page.goto('/')\n\n    const accessibilityScanResults = await new AxeBuilder({ page }).analyze()\n\n    expect(accessibilityScanResults.violations).toEqual([])\n  })\n\n  test('should have no violations on mobile', async ({ page }) => {\n    await page.setViewportSize({ width: 375, height: 667 })\n    await page.goto('/')\n\n    const results = await new AxeBuilder({ page })\n      .withTags(['wcag2a', 'wcag2aa'])\n      .analyze()\n\n    expect(results.violations).toEqual([])\n  })\n})\n```\n\n## Cypress\n\n```javascript\n\ndescribe('Form accessibility', () => {\n  beforeEach(() => {\n    cy.visit('/contact')\n    cy.injectAxe()\n  })\n\n  it('should have no violations on load', () => {\n    cy.checkA11y()\n  })\n\n  it('should have no violations after form errors', () => {\n    cy.get('button[type=\"submit\"]').click()\n    cy.checkA11y()\n  })\n\n  it('should exclude known issues', () => {\n    cy.checkA11y(null, {\n      rules: {\n        'color-contrast': { enabled: false } // Known issue, tracked in backlog\n      }\n    })\n  })\n})\n```\n\n## CI/CD Integration\n\n```yaml\n# GitHub Actions\nname: Accessibility Tests\non: [push, pull_request]\n\njobs:\n  a11y:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - run: npm ci\n      - run: npm run test:a11y\n      - uses: actions/upload-artifact@v4\n        if: failure()\n        with:\n          name: a11y-report\n          path: a11y-report.html\n```\n\n## Lighthouse CI Accessibility\n\n```json\n{\n  \"ci\": {\n    \"assert\": {\n      \"assertions\": {\n        \"categories:accessibility\": [\"error\", { \"minScore\": 0.9 }],\n        \"image-alt\": \"error\",\n        \"label\": \"error\",\n        \"link-name\": \"error\"\n      }\n    }\n  }\n}\n```\n\n## Tools & Validation\n\nAutomated checks are a floor, not a ceiling.\n\nTypically caught automatically:\n\n- Missing alt text\n- Missing form labels\n- Invalid ARIA roles and attributes\n- Many color-contrast failures\n\nUsually still manual:\n\n- Whether alt text is actually meaningful\n- Keyboard interaction quality in complex widgets\n- Screen reader announcements and reading order\n- Whether the flow is understandable, not just technically valid\n\n## Verification\n\n### Automated Checks\n\n- Run the accessibility test suite locally and confirm new violations fail the build or test run; the default target should be `<= 0` unexpected axe violations for covered states.\n- Pair automated coverage with manual keyboard and screen-reader checks for at least one critical user flow.\n- Track ignored or suppressed rules explicitly so temporary exceptions do not become permanent blind spots.\n\n### Manual Checks\n\n- Ensure the suite covers high-risk states such as modal open, form validation errors, and mobile layouts.","skills/accessible-authentication/SKILL.md":"---\nname: accessible-authentication\ndescription: \"Use when reviewing sign-in, sign-up, MFA, CAPTCHA, recovery, and re-auth flows. Evaluate the full authentication path, including error handling and backup methods, not just the primary login form.\"\nmetadata:\n  category: accessibility\n  priority: high\n  difficulty: advanced\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accessible-authentication\n---\n\n# Provide accessible authentication methods\n\nAuthentication often becomes the first hard blocker for users with cognitive, motor, low-vision, or speech-input needs. If sign-in, MFA, or recovery relies on memorization or transcription with no assisted path, the user may be locked out before they can access the product at all.\n\n## Quick Reference\n\n- Do not block paste or password managers in login and recovery flows\n- Prefer passkeys, magic links, device approval, or password-manager-friendly flows\n- Support OTP autofill and paste with appropriate semantics such as `autocomplete=\"one-time-code\"`\n- Avoid CAPTCHA or secondary checks that require memorizing or transcribing information without an alternative\n\n## Check\n\nReview login, MFA, password reset, and account recovery for accessible authentication problems. Flag blocked paste, password-manager hostility, manual transcription requirements, inaccessible OTP handling, and CAPTCHA or knowledge checks without a compliant alternative.\n\n## Fix\n\nAdd password-manager-friendly fields, support paste and OTP autofill, and provide at least one authentication path that does not depend on a cognitive function test.\n\n## Explain\n\nExplain WCAG Accessible Authentication, why memorization and transcription are barriers, and how passkeys, password managers, OTP autofill, and device approval improve both accessibility and security.\n\n## Code Review\n\nReview authentication pages, MFA steps, recovery flows, and security controls related to Provide accessible authentication methods. Flag exact steps that require memorization, transcription, blocked assistive tooling, or inaccessible fallback paths.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accessible-authentication\n","skills/accessible-authentication/references/rule.md":"# Provide accessible authentication methods\n\n> Authentication flows avoid unnecessary cognitive tests and support assistive mechanisms such as password managers, paste, OTP autofill, and passkeys.\n\n**Priority:** high · **Difficulty:** advanced · **Time:** 25 min\n\n---\nAuthentication should not depend on the user's ability to memorize, transcribe, or manually reproduce information when an assistive path is feasible. Good accessible authentication usually improves security too, because it works with password managers, device-based verification, and passkeys rather than against them.\n\n## Code Example\n\n```html\n<!-- Better: password-manager and OTP-friendly fields -->\n<label for=\"email\">Email</label>\n<input id=\"email\" name=\"email\" type=\"email\" autocomplete=\"username webauthn\">\n\n<label for=\"password\">Password</label>\n<input\n  id=\"password\"\n  name=\"password\"\n  type=\"password\"\n  autocomplete=\"current-password\">\n\n<label for=\"otp\">Verification code</label>\n<input\n  id=\"otp\"\n  name=\"otp\"\n  inputmode=\"numeric\"\n  autocomplete=\"one-time-code\">\n```\n\n```tsx\nfunction VerifyCodeField({\n  onSubmit,\n}: {\n  onSubmit: (code: string) => void\n}) {\n  return (\n    <form\n      onSubmit={(event) => {\n        event.preventDefault()\n        const formData = new FormData(event.currentTarget)\n        onSubmit(String(formData.get('otp') ?? ''))\n      }}\n    >\n      <label htmlFor=\"otp\">Enter the verification code</label>\n      <input\n        autoComplete=\"one-time-code\"\n        id=\"otp\"\n        inputMode=\"numeric\"\n        name=\"otp\"\n        type=\"text\"\n      />\n\n      <button type=\"submit\">Continue</button>\n    </form>\n  )\n}\n```\n\n```html\n<!-- Better: offer a non-memory-dependent alternative -->\n<button type=\"button\">Continue with a passkey</button>\n<button type=\"button\">Email me a sign-in link</button>\n```\n\n## Why It Matters\n\nMany authentication patterns are built around unnecessary friction: blocked paste, custom OTP widgets that break autofill, CAPTCHA transcription, or backup questions that require memory instead of possession-based proof.\n\n- cognitive barriers prevent account access before the user can do anything else\n- password-manager hostility leads to weaker, reused passwords\n- speech, switch, and keyboard-only users face more effort when copy/paste and autofill are disabled\n- recovery and MFA steps often fail even when the main login form looks acceptable\n\n## Best Practices\n\n### Support assisted entry\n\nAuthentication should work with:\n\n- password managers\n- pasted credentials and codes\n- OS/browser OTP autofill\n- passkeys or device approval when available\n\nDo not split a one-time code into a widget that breaks standard autofill unless you have verified the real browser behavior.\n\n### Provide a non-memory-dependent path\n\nAt least one viable route through sign-in, MFA, and recovery should avoid a cognitive function test. Good examples include:\n\n- passkeys\n- approval on a trusted device\n- magic links\n- password-manager-assisted password entry\n\n### Keep anti-abuse controls proportional\n\nIf you use CAPTCHA or other abuse mitigations in auth flows, provide an alternative path that does not force memorization or transcription. Accessibility and abuse prevention must be designed together, not as competing concerns.\n\n## Standards\n\n- This rule maps to WCAG 2.2 Success Criterion 3.3.8 Accessible Authentication (Minimum).\n- The practical goal is not \"less security\"; it is at least one viable path that does not depend on a cognitive function test.\n\n## Exceptions\n\n- Re-entering a newly created password can be a valid security exception when the system does not reveal the password back to the user.\n- MFA is compatible with this rule, but the user still needs at least one practical path that does not rely on memorizing or transcribing information.\n- Accessibility does not require removing security; it requires choosing security controls that users can actually complete.\n\n## Verification\n\n### Automated Checks\n\n- Search auth flows for blocked paste handlers, OTP widgets, and missing autocomplete attributes.\n- Verify username, current-password, new-password, and one-time-code fields use appropriate semantics.\n\n### Manual Checks\n\n- Test sign-in with a password manager.\n- Paste an OTP or let the browser autofill it where supported.\n- Exercise recovery and MFA flows, not only the primary login form.\n- Fail if the only available path requires memorizing, transcribing, or solving a cognitive test without an assisted alternative.","skills/accessible-notifications/SKILL.md":"---\nname: accessible-notifications\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Make notifications accessible. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accessible-notifications\n---\n\n# Make notifications accessible\n\nWithout proper ARIA attributes, screen reader users miss critical notifications like form errors, success messages, and real-time updates—leaving them unaware of important page changes.\n\n## Quick Reference\n\n- Use aria-live regions to announce dynamic content changes\n- Choose between 'polite' (waits) and 'assertive' (interrupts) based on urgency\n- Ensure notifications persist long enough to be read\n- Provide visible and programmatic dismiss options\n\n## Check\n\nVerify notifications use aria-live regions, appropriate role (alert or status), and persist long enough to be read.\n\n## Fix\n\nImplement notifications with role='alert' or role='status', aria-live='polite' or 'assertive', and adequate display time.\n\n## Explain\n\nExplain how accessible notifications ensure all users are informed of important updates regardless of how they interact with the page.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Make notifications accessible. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accessible-notifications\n","skills/accessible-notifications/references/rule.md":"# Make notifications accessible\n\n> Toast notifications and alerts are announced to screen readers using ARIA live regions and appropriate roles.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 25 min\n\n---\nAccessible notifications ensure all users receive important feedback about actions and state changes.\n\n## Code Example\n\n```html\n<!-- Status notification (polite) -->\n<div role=\"status\" aria-live=\"polite\" class=\"notification\">\n  Your changes have been saved.\n</div>\n\n<!-- Alert notification (assertive) -->\n<div role=\"alert\" aria-live=\"assertive\" class=\"notification notification--error\">\n  Error: Please fill in all required fields.\n</div>\n\n<!-- Live region container (content injected dynamically) -->\n<div\n  id=\"notifications\"\n  aria-live=\"polite\"\n  aria-atomic=\"true\"\n  class=\"sr-only\"\n></div>\n```\n\n## Why It Matters\n\nWithout proper ARIA attributes, screen reader users miss critical notifications like form errors, success messages, and real-time updates—leaving them unaware of important page changes.\n\n## ARIA Live Region Types\n\n| Attribute | Behavior | Use For |\n|-----------|----------|---------|\n| `aria-live=\"polite\"` | Waits for user pause | Status updates, non-urgent info |\n| `aria-live=\"assertive\"` | Interrupts immediately | Errors, time-sensitive alerts |\n| `role=\"status\"` | Implicit polite | Progress, success messages |\n| `role=\"alert\"` | Implicit assertive | Errors, warnings |\n\n## React Toast Component\n\n```tsx\n\ntype NotificationType = 'success' | 'error' | 'warning' | 'info'\n\ninterface ToastProps {\n  message: string\n  type: NotificationType\n  duration?: number\n  onDismiss: () => void\n}\n\n  message,\n  type,\n  duration = 5000,\n  onDismiss\n}: ToastProps) {\n  const toastRef = useRef(null)\n\n  // Auto-dismiss after duration\n  useEffect(() => {\n    if (duration > 0) {\n      const timer = setTimeout(onDismiss, duration)\n      return () => clearTimeout(timer)\n    }\n  }, [duration, onDismiss])\n\n  // Focus toast for keyboard users\n  useEffect(() => {\n    toastRef.current?.focus()\n  }, [])\n\n  const isError = type === 'error' || type === 'warning'\n\n  return (\n    <div\n      ref={toastRef}\n      role={isError ? 'alert' : 'status'}\n      aria-live={isError ? 'assertive' : 'polite'}\n      aria-atomic=\"true\"\n      tabIndex={-1}\n      className={`toast toast--${type}`}\n    >\n      <span className=\"toast__icon\" aria-hidden=\"true\">\n        {type === 'success' && '✓'}\n        {type === 'error' && '✕'}\n        {type === 'warning' && '⚠'}\n        {type === 'info' && 'ℹ'}\n      </span>\n\n      <span className=\"toast__message\">{message}</span>\n\n      <button\n        type=\"button\"\n        onClick={onDismiss}\n        aria-label=\"Dismiss notification\"\n        className=\"toast__dismiss\"\n      >\n        ×\n      </button>\n    </div>\n  )\n}\n```\n\n## Toast Container with Live Region\n\n```tsx\n\ninterface Notification {\n  id: string\n  message: string\n  type: NotificationType\n  duration?: number\n}\n\ninterface ToastContextType {\n  addToast: (notification: Omit\n      {children}\n\n      {/* Toast container with live region */}\n      <div\n        className=\"toast-container\"\n        aria-label=\"Notifications\"\n      >\n        {toasts.map(toast => (\n           removeToast(toast.id)}\n          />\n        ))}\n      </div>\n\n      {/* Screen reader announcement region */}\n      <div\n        role=\"status\"\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        className=\"sr-only\"\n      >\n        {toasts.length > 0 && toasts[toasts.length - 1].message}\n      </div>\n    </ToastContext.Provider>\n  )\n}\n\n  const context = useContext(ToastContext)\n  if (!context) throw new Error('useToast must be used within ToastProvider')\n  return context\n}\n```\n\n## Usage Example\n\n```tsx\nfunction SaveButton() {\n  const { addToast } = useToast()\n\n  const handleSave = async () => {\n    try {\n      await saveData()\n      addToast({\n        message: 'Changes saved successfully',\n        type: 'success',\n        duration: 3000\n      })\n    } catch (error) {\n      addToast({\n        message: 'Failed to save changes. Please try again.',\n        type: 'error',\n        duration: 0 // Don't auto-dismiss errors\n      })\n    }\n  }\n\n  return <button onClick={handleSave}>Save</button>\n}\n```\n\n## Inline Notifications\n\n```tsx\ninterface InlineNotificationProps {\n  type: 'error' | 'warning' | 'success' | 'info'\n  title?: string\n  children: React.ReactNode\n  dismissible?: boolean\n  onDismiss?: () => void\n}\n\n  type,\n  title,\n  children,\n  dismissible = false,\n  onDismiss\n}: InlineNotificationProps) {\n  const isUrgent = type === 'error' || type === 'warning'\n\n  return (\n    <div\n      role={isUrgent ? 'alert' : 'status'}\n      aria-live={isUrgent ? 'assertive' : 'polite'}\n      className={`notification notification--${type}`}\n    >\n      {title && (\n        <strong className=\"notification__title\">{title}</strong>\n      )}\n      <div className=\"notification__content\">{children}</div>\n\n      {dismissible && (\n        <button\n          type=\"button\"\n          onClick={onDismiss}\n          aria-label=\"Dismiss\"\n          className=\"notification__dismiss\"\n        >\n          ×\n        </button>\n      )}\n    </div>\n  )\n}\n```\n\n## Progress Notifications\n\n```tsx\nfunction UploadProgress({ progress, fileName }: { progress: number; fileName: string }) {\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      aria-busy={progress < 100}\n      className=\"upload-progress\"\n    >\n      <span className=\"sr-only\">\n        Uploading {fileName}: {progress}% complete\n      </span>\n\n      <div aria-hidden=\"true\">\n        <span>{fileName}</span>\n        <progress value={progress} max=\"100\" />\n        <span>{progress}%</span>\n      </div>\n    </div>\n  )\n}\n```\n\n## Timing Guidelines\n\n| Notification Type | Recommended Duration |\n|-------------------|---------------------|\n| Success messages | 3-5 seconds |\n| Info/status | 5-7 seconds |\n| Warnings | 8-10 seconds or manual dismiss |\n| Errors | No auto-dismiss (manual only) |\n\n```tsx\nconst DURATION_MAP = {\n  success: 3000,\n  info: 5000,\n  warning: 8000,\n  error: 0, // No auto-dismiss\n} as const\n```\n\n## Styling\n\n```css\n.toast-container {\n  position: fixed;\n  bottom: 1rem;\n  right: 1rem;\n  z-index: 1000;\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n\n.toast {\n  display: flex;\n  align-items: center;\n  gap: 0.75rem;\n  padding: 1rem;\n  border-radius: 0.5rem;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n  animation: slideIn 0.3s ease-out;\n}\n\n.toast--success { background: #d4edda; border-left: 4px solid #28a745; }\n.toast--error { background: #f8d7da; border-left: 4px solid #dc3545; }\n.toast--warning { background: #fff3cd; border-left: 4px solid #ffc107; }\n.toast--info { background: #d1ecf1; border-left: 4px solid #17a2b8; }\n\n.toast__dismiss {\n  background: none;\n  border: none;\n  font-size: 1.25rem;\n  cursor: pointer;\n  padding: 0.25rem;\n  margin-left: auto;\n}\n\n/* Screen reader only */\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\n@keyframes slideIn {\n  from {\n    transform: translateX(100%);\n    opacity: 0;\n  }\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n/* Respect motion preferences */\n@media (prefers-reduced-motion: reduce) {\n  .toast {\n    animation: none;\n  }\n}\n```\n\n## Verification\n\n1. Enable screen reader and trigger notifications\n2. Verify announcements occur at appropriate times\n3. Test keyboard dismissal (Escape key)\n4. Check notifications don't disappear too quickly\n5. Verify focus management after dismissal\n6. Test with different screen readers (NVDA, VoiceOver, JAWS)\n\nReserve `aria-live=\"assertive\"` for truly urgent messages. Overuse disrupts the user experience by constantly interrupting screen reader output.","skills/accessible-tables/SKILL.md":"---\nname: accessible-tables\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use semantic table markup for screen readers. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accessible-tables\n---\n\n# Use semantic table markup for screen readers\n\nScreen readers read table data cell-by-cell—without proper headers, users hear meaningless numbers without context. 'Row 3, Column 2: $99' vs just '$99'.\n\n## Quick Reference\n\n- Use <th> elements for headers with scope='col' or scope='row'\n- Add <caption> to describe the table's purpose\n- Never use tables for layout—use CSS Grid or Flexbox instead\n- Use id/headers for complex tables with merged cells\n- For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n- Prefer one strong table-semantics finding over multiple weaker enhancements on the same simple table\n\n## Check\n\nVerify tables use proper th elements with scope, caption or aria-labelledby, and semantic table structure.\n\n## Fix\n\nAdd proper table headers with scope attributes, captions for context, and ensure tables are not used for layout.\n\n## Explain\n\nExplain how proper table markup helps screen reader users understand data relationships and navigate table content.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Use semantic table markup for screen readers. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accessible-tables\n","skills/accessible-tables/references/rule.md":"# Use semantic table markup for screen readers\n\n> Data tables use proper semantic markup with headers, captions, and scope attributes for screen reader accessibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nProper table markup enables screen readers to announce header-cell relationships, making data understandable.\n\n## Code Example\n\n```html\n<table>\n  <caption>Q1 2024 Sales by Region</caption>\n  <thead>\n    <tr>\n      <th scope=\"col\">Region</th>\n      <th scope=\"col\">January</th>\n      <th scope=\"col\">February</th>\n      <th scope=\"col\">March</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">North</th>\n      <td>$12,000</td>\n      <td>$14,500</td>\n      <td>$13,200</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">South</th>\n      <td>$9,800</td>\n      <td>$11,000</td>\n      <td>$10,500</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## Why It Matters\n\nScreen readers read table data cell-by-cell—without proper headers, users hear meaningless numbers without context. 'Row 3, Column 2: $99' vs just '$99'.\n\n## Scope Attribute\n\n| Value | Use When |\n|-------|----------|\n| `scope=\"col\"` | Header applies to column below |\n| `scope=\"row\"` | Header applies to row beside it |\n| `scope=\"colgroup\"` | Header spans multiple columns |\n| `scope=\"rowgroup\"` | Header spans multiple rows |\n\n## Complex Tables with Headers Attribute\n\n```html\n<table>\n  <caption>Sales Report</caption>\n  <thead>\n    <tr>\n      <th id=\"region\" rowspan=\"2\">Region</th>\n      <th id=\"q1\" colspan=\"2\">Q1</th>\n      <th id=\"q2\" colspan=\"2\">Q2</th>\n    </tr>\n    <tr>\n      <th id=\"q1-units\" headers=\"q1\">Units</th>\n      <th id=\"q1-revenue\" headers=\"q1\">Revenue</th>\n      <th id=\"q2-units\" headers=\"q2\">Units</th>\n      <th id=\"q2-revenue\" headers=\"q2\">Revenue</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th id=\"north\" headers=\"region\">North</th>\n      <td headers=\"north q1 q1-units\">150</td>\n      <td headers=\"north q1 q1-revenue\">$15,000</td>\n      <td headers=\"north q2 q2-units\">180</td>\n      <td headers=\"north q2 q2-revenue\">$18,000</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## React Table Component\n\n```tsx\ninterface Column{caption}</caption>\n      <thead>\n        <tr>\n          {columns.map(col => (\n            <th key={String(col.key)} scope=\"col\">\n              {col.header}\n            </th>\n          ))}\n        </tr>\n      </thead>\n      <tbody>\n        {data.map((row, i) => (\n          <tr key={i}>\n            {columns.map(col => {\n              const isRowHeader = col.key === rowHeader\n              const Tag = isRowHeader ? 'th' : 'td'\n              return (\n                \n                  {String(row[col.key])}\n                \n              )\n            })}\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  )\n}\n```\n\n## Responsive Tables\n\n```html\n<!-- Scrollable wrapper for mobile -->\n<div class=\"table-wrapper\" tabindex=\"0\" role=\"region\" aria-label=\"Sales data table\">\n  <table>\n    <!-- Table content -->\n  </table>\n</div>\n```\n\n```css\n.table-wrapper {\n  overflow-x: auto;\n  max-width: 100%;\n}\n\n/* Focus indicator for keyboard users scrolling */\n.table-wrapper:focus {\n  outline: 2px solid #005fcc;\n}\n```\n\n## Exceptions\n\n- Simple data tables can sometimes fail more from missing header relationships than from missing enhancements such as captions or mobile wrappers, so prioritize the strongest semantic issue.\n- Do not convert layout structures into data-table markup just to satisfy a rule; the correct fix may be to remove table semantics entirely.\n- When several table-accessibility issues overlap, resolve the header-cell relationship first because downstream announcements depend on it.\n\n## Verification\n\n### Automated Checks\n\n- Use browser accessibility tooling, axe, Lighthouse, or equivalent automated checks against a representative rendered state.\n\n### Manual Checks\n\n- Use screen reader table navigation (Ctrl+Alt+Arrow keys in NVDA)\n- Verify headers are announced with each cell\n- Check caption describes the table purpose\n- Confirm table is not used for layout","skills/accessible-tooltips/SKILL.md":"---\nname: accessible-tooltips\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Create accessible tooltips. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accessible-tooltips\n---\n\n# Create accessible tooltips\n\nInaccessible tooltips leave keyboard and screen reader users without important contextual information, creating an unequal experience and potential confusion.\n\n## Quick Reference\n\n- Tooltips must be keyboard accessible (focusable trigger)\n- Use aria-describedby to associate tooltip with trigger\n- Allow hover and focus to show tooltip, Escape to dismiss\n- Ensure sufficient contrast and don't hide essential info in tooltips\n\n## Check\n\nVerify tooltips are keyboard accessible, use appropriate ARIA roles (tooltip), and can be dismissed without moving focus.\n\n## Fix\n\nImplement tooltips with role='tooltip', aria-describedby, keyboard triggering, and Escape key dismissal.\n\n## Explain\n\nExplain the accessibility requirements for tooltips including keyboard access, ARIA attributes, and timing considerations.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Create accessible tooltips. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accessible-tooltips\n","skills/accessible-tooltips/references/rule.md":"# Create accessible tooltips\n\n> Tooltips are accessible to keyboard users and screen readers with proper ARIA attributes and focus handling.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nAccessible tooltips provide supplementary information without excluding keyboard or screen reader users.\n\n## Code Example\n\n```html\n<div class=\"tooltip-container\">\n  <button\n    type=\"button\"\n    aria-describedby=\"tooltip-1\"\n    class=\"tooltip-trigger\"\n  >\n    Settings\n  </button>\n  <div\n    id=\"tooltip-1\"\n    role=\"tooltip\"\n    class=\"tooltip\"\n  >\n    Configure your preferences\n  </div>\n</div>\n```\n\n## Why It Matters\n\nInaccessible tooltips leave keyboard and screen reader users without important contextual information, creating an unequal experience and potential confusion.\n\n## Accessibility Requirements\n\n| Requirement | Implementation |\n|-------------|----------------|\n| Keyboard accessible | Show on focus, not just hover |\n| Programmatically associated | Use `aria-describedby` |\n| Dismissible | Close with Escape key |\n| Persistent | Stay visible while hovered/focused |\n| Non-essential | Don't hide critical info in tooltips |\n\n## React Tooltip Component\n\n```tsx\n\ninterface TooltipProps {\n  content: string\n  children: React.ReactElement\n  position?: 'top' | 'bottom' | 'left' | 'right'\n  delay?: number\n}\n\n  content,\n  children,\n  position = 'top',\n  delay = 300\n}: TooltipProps) {\n  const [isVisible, setIsVisible] = useState(false)\n  const tooltipId = useId()\n  const timeoutRef = useRef {\n    clearTimeout(timeoutRef.current)\n    setIsVisible(false)\n  }\n\n  // Handle Escape key\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Escape' && isVisible) {\n        hideTooltip()\n      }\n    }\n\n    document.addEventListener('keydown', handleKeyDown)\n    return () => document.removeEventListener('keydown', handleKeyDown)\n  }, [isVisible])\n\n  // Clone child to add props\n  const trigger = React.cloneElement(children, {\n    ref: triggerRef,\n    'aria-describedby': isVisible ? tooltipId : undefined,\n    onMouseEnter: showTooltip,\n    onMouseLeave: hideTooltip,\n    onFocus: showTooltip,\n    onBlur: hideTooltip,\n  })\n\n  return (\n    <div className=\"tooltip-wrapper\">\n      {trigger}\n      {isVisible && (\n        <div\n          id={tooltipId}\n          role=\"tooltip\"\n          className={`tooltip tooltip--${position}`}\n        >\n          {content}\n        </div>\n      )}\n    </div>\n  )\n}\n```\n\n## Usage\n\n```tsx\n\n  <button type=\"button\">\n    \n    <span className=\"sr-only\">Save</span>\n  </button>\n\n  <label htmlFor=\"email\">\n    Email <span aria-hidden=\"true\">*</span>\n  </label>\n\n```\n\n## Advanced Tooltip with Floating UI\n\n```tsx\n\ninterface AdvancedTooltipProps {\n  content: React.ReactNode\n  children: React.ReactElement\n}\n\n  const [isOpen, setIsOpen] = useState(false)\n  const arrowRef = useRef(null)\n  const tooltipId = useId()\n\n  const { refs, floatingStyles, context } = useFloating({\n    open: isOpen,\n    onOpenChange: setIsOpen,\n    placement: 'top',\n    middleware: [\n      offset(8),\n      flip(),\n      shift({ padding: 8 }),\n      arrow({ element: arrowRef })\n    ],\n  })\n\n  return (\n    <>\n      {React.cloneElement(children, {\n        ref: refs.setReference,\n        'aria-describedby': isOpen ? tooltipId : undefined,\n        onMouseEnter: () => setIsOpen(true),\n        onMouseLeave: () => setIsOpen(false),\n        onFocus: () => setIsOpen(true),\n        onBlur: () => setIsOpen(false),\n      })}\n\n      {isOpen && (\n        <div\n          ref={refs.setFloating}\n          id={tooltipId}\n          role=\"tooltip\"\n          style={floatingStyles}\n          className=\"tooltip\"\n        >\n          {content}\n          <div ref={arrowRef} className=\"tooltip-arrow\" />\n        </div>\n      )}\n    </>\n  )\n}\n```\n\n## Icon Button with Tooltip\n\n```tsx\ninterface IconButtonProps {\n  icon: React.ReactNode\n  label: string\n  onClick: () => void\n  tooltip?: string\n}\n\n  const tooltipId = useId()\n  const [showTooltip, setShowTooltip] = useState(false)\n\n  return (\n    <div className=\"icon-button-wrapper\">\n      <button\n        type=\"button\"\n        onClick={onClick}\n        aria-label={label}\n        aria-describedby={tooltip && showTooltip ? tooltipId : undefined}\n        onMouseEnter={() => setShowTooltip(true)}\n        onMouseLeave={() => setShowTooltip(false)}\n        onFocus={() => setShowTooltip(true)}\n        onBlur={() => setShowTooltip(false)}\n        className=\"icon-button\"\n      >\n        {icon}\n      </button>\n\n      {tooltip && showTooltip && (\n        <span id={tooltipId} role=\"tooltip\" className=\"tooltip\">\n          {tooltip}\n        </span>\n      )}\n    </div>\n  )\n}\n```\n\n## Native Title Attribute (Limited)\n\n```html\n<!-- Simple but limited accessibility -->\n<button type=\"button\" title=\"Save document\">\n  <svg aria-hidden=\"true\"><!-- save icon --></svg>\n  <span class=\"sr-only\">Save</span>\n</button>\n\n<!-- Better: Custom tooltip with full control -->\n<button\n  type=\"button\"\n  aria-describedby=\"save-tooltip\"\n  aria-label=\"Save\"\n>\n  <svg aria-hidden=\"true\"><!-- save icon --></svg>\n</button>\n<div id=\"save-tooltip\" role=\"tooltip\" class=\"tooltip\">\n  Save document (Ctrl+S)\n</div>\n```\n\n## Styling\n\n```css\n.tooltip-wrapper {\n  position: relative;\n  display: inline-block;\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1000;\n  padding: 0.5rem 0.75rem;\n  font-size: 0.875rem;\n  background: #1a1a1a;\n  color: #ffffff;\n  border-radius: 4px;\n  white-space: nowrap;\n  pointer-events: none;\n\n  /* Animation */\n  opacity: 0;\n  animation: tooltipFadeIn 0.15s ease-out forwards;\n}\n\n.tooltip--top {\n  bottom: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-bottom: 8px;\n}\n\n.tooltip--bottom {\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-top: 8px;\n}\n\n.tooltip--left {\n  right: 100%;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-right: 8px;\n}\n\n.tooltip--right {\n  left: 100%;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-left: 8px;\n}\n\n/* Arrow */\n.tooltip::after {\n  content: '';\n  position: absolute;\n  border: 6px solid transparent;\n}\n\n.tooltip--top::after {\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  border-top-color: #1a1a1a;\n}\n\n@keyframes tooltipFadeIn {\n  from { opacity: 0; transform: translateX(-50%) translateY(4px); }\n  to { opacity: 1; transform: translateX(-50%) translateY(0); }\n}\n\n/* Respect motion preferences */\n@media (prefers-reduced-motion: reduce) {\n  .tooltip {\n    animation: none;\n    opacity: 1;\n  }\n}\n\n/* Ensure sufficient contrast */\n.tooltip {\n  /* WCAG requires 4.5:1 for normal text */\n  /* #ffffff on #1a1a1a = 16.1:1 ✓ */\n}\n```\n\n## When to Use Tooltips vs Other Patterns\n\n| Use Case | Pattern |\n|----------|---------|\n| Supplementary hint | Tooltip |\n| Essential instruction | Inline text |\n| Complex content | Popover/Dialog |\n| Form field help | `aria-describedby` text |\n| Icon-only button | `aria-label` + optional tooltip |\n\n## Verification\n\n1. Tab to trigger element - tooltip should appear\n2. Press Escape - tooltip should close\n3. Hover over trigger - tooltip appears after delay\n4. Move mouse to tooltip - should stay visible\n5. Test with screen reader (tooltip content announced)\n6. Verify tooltip doesn't block other content\n7. Check color contrast meets WCAG requirements\n\nNever put essential information in tooltips. They're for supplementary hints only. Critical content should be visible by default or in the main UI.","skills/accesskeys/SKILL.md":"---\nname: accesskeys\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure accesskey values are unique. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accesskeys\n---\n\n# Ensure accesskey values are unique\n\nDuplicate access keys cause conflicts where only one element (usually the first) is reachable via the shortcut, making other elements inaccessible to keyboard users.\n\n## Quick Reference\n\n- Each `accesskey` attribute value must be unique on the page\n- Duplicate access keys can lead to unpredictable browser behavior\n- Helps keyboard users navigate reliably using defined shortcuts\n\n## Check\n\nCheck for duplicate `accesskey` attributes across the document to ensure each shortcut is unique.\n\n## Fix\n\nAssign unique values to each `accesskey` attribute or remove redundant ones to prevent shortcut conflicts.\n\n## Explain\n\nExplain how duplicate access keys affect keyboard accessibility and browser shortcut handling.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Ensure accesskey values are unique. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accesskeys\n","skills/accesskeys/references/rule.md":"# Ensure accesskey values are unique\n\n> Checks that accesskey values are unique to avoid shortcut conflicts.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nThe `accesskey` attribute allows developers to assign keyboard shortcuts to specific elements. To ensure these shortcuts work reliably, each value must be unique within the document.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Unique access keys -->\n<a href=\"/home\" accesskey=\"h\">Home</a>\n<a href=\"/contact\" accesskey=\"c\">Contact</a>\n\n<!-- ❌ Incorrect: Duplicate access keys -->\n<a href=\"/save\" accesskey=\"s\">Save</a>\n<a href=\"/search\" accesskey=\"s\">Search</a>\n```\n\n## Why It Matters\n\n- **Predictable Navigation**: Ensures keyboard shortcuts work as intended without conflicts.\n- **Assistive Technology**: Screen readers and other assistive technologies depend on unique identifiers for reliable interaction.\n- **User Experience**: Prevents user frustration when a shortcut doesn't trigger the expected action or moves focus to the wrong element.\n- **Browser Consistency**: Different browsers handle duplicate access keys differently; uniqueness ensures a consistent experience across all platforms.\n\n## Exceptions\n\n- Evaluate the rendered experience before treating a static-code smell as a blocker; interaction timing, browser behavior, and assistive technology output often determine severity.\n- Not every secondary accessibility issue deserves equal weight; prioritize the issue that most directly blocks perception, operation, or understanding.\n- Avoid adding redundant markup or ARIA solely to satisfy a rule when a simpler semantic implementation would eliminate the issue entirely.\n\n## Standards\n\n- Align the implementation with W3C WAI: WCAG Overview and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: Accessibility and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/accordion-accessibility/SKILL.md":"---\nname: accordion-accessibility\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Make accordions keyboard navigable. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accordion-accessibility\n---\n\n# Make accordions keyboard navigable\n\nPoorly implemented accordions trap keyboard users and leave screen reader users unable to understand or navigate collapsed content sections.\n\n## Quick Reference\n\n- Use button elements for accordion triggers with aria-expanded\n- Associate panels with triggers using aria-controls\n- Support Arrow keys for navigation between headers\n- Use heading elements appropriately for document structure\n\n## Check\n\nVerify accordions use button triggers with aria-expanded, aria-controls, and proper keyboard navigation (Enter, Space, arrows).\n\n## Fix\n\nImplement accordions with button elements, aria-expanded state, aria-controls linking to content panels, and keyboard support.\n\n## Explain\n\nExplain the ARIA pattern for accessible accordions and how they enable keyboard and screen reader users to navigate collapsible content.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Make accordions keyboard navigable. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accordion-accessibility\n","skills/accordion-accessibility/references/rule.md":"# Make accordions keyboard navigable\n\n> Accordion components use proper ARIA attributes and keyboard interactions for screen reader accessibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 25 min\n\n---\nAccessible accordions allow users to efficiently navigate and reveal content sections using any input method.\n\n## Code Example\n\n```html\n<div class=\"accordion\">\n  <h3>\n    <button\n      type=\"button\"\n      aria-expanded=\"false\"\n      aria-controls=\"panel-1\"\n      class=\"accordion__trigger\"\n      id=\"accordion-1\"\n    >\n      Section 1\n      <span class=\"accordion__icon\" aria-hidden=\"true\"></span>\n    </button>\n  </h3>\n  <div\n    id=\"panel-1\"\n    role=\"region\"\n    aria-labelledby=\"accordion-1\"\n    class=\"accordion__panel\"\n    hidden\n  >\n    <p>Panel 1 content goes here.</p>\n  </div>\n\n  <h3>\n    <button\n      type=\"button\"\n      aria-expanded=\"false\"\n      aria-controls=\"panel-2\"\n      class=\"accordion__trigger\"\n      id=\"accordion-2\"\n    >\n      Section 2\n      <span class=\"accordion__icon\" aria-hidden=\"true\"></span>\n    </button>\n  </h3>\n  <div\n    id=\"panel-2\"\n    role=\"region\"\n    aria-labelledby=\"accordion-2\"\n    class=\"accordion__panel\"\n    hidden\n  >\n    <p>Panel 2 content goes here.</p>\n  </div>\n</div>\n```\n\n## Why It Matters\n\nPoorly implemented accordions trap keyboard users and leave screen reader users unable to understand or navigate collapsed content sections.\n\n## ARIA Pattern Requirements\n\n| Element | Attribute | Purpose |\n|---------|-----------|---------|\n| Trigger | `button` element | Activatable with Enter/Space |\n| Trigger | `aria-expanded` | Indicates open/closed state |\n| Trigger | `aria-controls` | References panel ID |\n| Panel | `id` | Target of aria-controls |\n| Panel | `role=\"region\"` | Optional, for important sections |\n| Header | Heading element | Maintains document structure |\n\n## React Accordion Component\n\n```tsx\n\ninterface AccordionItemProps {\n  title: string\n  children: React.ReactNode\n  defaultOpen?: boolean\n}\n\ninterface AccordionProps {\n  children: React.ReactNode\n  allowMultiple?: boolean\n}\n\n  const [openItems, setOpenItems] = useState { itemRefs.current[index] = el },\n          } as any)\n        }\n        return child\n      })}\n    </div>\n  )\n}\n\n  title,\n  children,\n  defaultOpen = false,\n  _index,\n  _isOpen,\n  _onToggle,\n  _onKeyDown,\n  _ref,\n}: AccordionItemProps & {\n  _index?: number\n  _isOpen?: boolean\n  _onToggle?: () => void\n  _onKeyDown?: (e: KeyboardEvent) => void\n  _ref?: (el: HTMLButtonElement) => void\n}) {\n  const triggerId = useId()\n  const panelId = useId()\n  const isOpen = _isOpen ?? defaultOpen\n\n  return (\n    <div className=\"accordion__item\">\n      <h3 className=\"accordion__header\">\n        <button\n          ref={_ref}\n          type=\"button\"\n          id={triggerId}\n          aria-expanded={isOpen}\n          aria-controls={panelId}\n          onClick={_onToggle}\n          onKeyDown={_onKeyDown}\n          className=\"accordion__trigger\"\n        >\n          <span className=\"accordion__title\">{title}</span>\n          <span\n            className={`accordion__icon ${isOpen ? 'accordion__icon--open' : ''}`}\n            aria-hidden=\"true\"\n          />\n        </button>\n      </h3>\n      <div\n        id={panelId}\n        role=\"region\"\n        aria-labelledby={triggerId}\n        className=\"accordion__panel\"\n        hidden={!isOpen}\n      >\n        <div className=\"accordion__content\">\n          {children}\n        </div>\n      </div>\n    </div>\n  )\n}\n```\n\n## Usage\n\n```tsx\nYou can return items within 30 days of purchase...</p>\n  \n  \n    <p>Standard shipping takes 5-7 business days...</p>\n  \n  \n    <p>Yes, we ship to over 50 countries...</p>\n  \n\n```\n\n## Keyboard Navigation\n\n| Key | Action |\n|-----|--------|\n| `Enter` / `Space` | Toggle panel open/closed |\n| `Arrow Down` | Move focus to next header |\n| `Arrow Up` | Move focus to previous header |\n| `Home` | Move focus to first header |\n| `End` | Move focus to last header |\n\n## Native HTML Details/Summary\n\n```html\n<!-- Simple native accordion (limited styling) -->\n<details class=\"accordion-native\">\n  <summary>Section Title</summary>\n  <div class=\"accordion-native__content\">\n    <p>Content here...</p>\n  </div>\n</details>\n\n<details class=\"accordion-native\">\n  <summary>Another Section</summary>\n  <div class=\"accordion-native__content\">\n    <p>More content...</p>\n  </div>\n</details>\n```\n\n```tsx\n// React wrapper for details/summary\nfunction NativeAccordion({ title, children, defaultOpen = false }) {\n  return (\n    <details open={defaultOpen} className=\"accordion-native\">\n      <summary>{title}</summary>\n      <div className=\"accordion-native__content\">\n        {children}\n      </div>\n    </details>\n  )\n}\n```\n\n## Styling\n\n```css\n.accordion {\n  border: 1px solid #e0e0e0;\n  border-radius: 8px;\n  overflow: hidden;\n}\n\n.accordion__item {\n  border-bottom: 1px solid #e0e0e0;\n}\n\n.accordion__item:last-child {\n  border-bottom: none;\n}\n\n.accordion__header {\n  margin: 0;\n}\n\n.accordion__trigger {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  width: 100%;\n  padding: 1rem 1.5rem;\n  font-size: 1rem;\n  font-weight: 600;\n  text-align: left;\n  background: #fff;\n  border: none;\n  cursor: pointer;\n  transition: background-color 0.2s;\n}\n\n.accordion__trigger:hover {\n  background: #f5f5f5;\n}\n\n.accordion__trigger:focus-visible {\n  outline: 2px solid #0066cc;\n  outline-offset: -2px;\n}\n\n.accordion__icon {\n  width: 1.25rem;\n  height: 1.25rem;\n  transition: transform 0.2s;\n}\n\n.accordion__trigger[aria-expanded=\"true\"] .accordion__icon {\n  transform: rotate(180deg);\n}\n\n.accordion__panel[hidden] {\n  display: none;\n}\n\n.accordion__content {\n  padding: 0 1.5rem 1rem;\n}\n\n/* Animation */\n.accordion__panel {\n  animation: slideDown 0.2s ease-out;\n}\n\n@keyframes slideDown {\n  from {\n    opacity: 0;\n    transform: translateY(-8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .accordion__panel,\n  .accordion__icon {\n    animation: none;\n    transition: none;\n  }\n}\n```\n\n## Verification\n\n1. Tab to first accordion header\n2. Press Enter/Space to toggle\n3. Use Arrow keys to navigate between headers\n4. Press Home/End to jump to first/last\n5. Test with screen reader (announces expanded state)\n6. Verify heading structure in accessibility tree\n7. Check focus is visible on all interactive elements\n\nChoose an appropriate heading level (h2, h3, etc.) based on the accordion's position in the document outline. Don't skip heading levels.","skills/affiliate-disclosure/SKILL.md":"---\nname: affiliate-disclosure\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Provide clear affiliate disclosures. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/affiliate-disclosure\n---\n\n# Provide clear affiliate disclosures\n\nClear disclosures are required by law (e.g., FTC guidelines) and are essential for maintaining user trust and preventing search engine penalties for hidden advertisements.\n\n## Quick Reference\n\n- Add a clear and conspicuous disclosure for any affiliate or sponsored links\n- Place the disclosure at the top of the page, before any affiliate links appear\n- Use simple, unambiguous language to explain the financial relationship\n\n## Check\n\nVerify that all pages containing affiliate links or sponsored content have a clear, visible disclosure before the links appear.\n\n## Fix\n\nAdd a standardized disclosure statement at the beginning of your content or near affiliate links to inform users of the partnership.\n\n## Explain\n\nExplain the legal and ethical importance of affiliate disclosures and how they impact user trust and SEO.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Provide clear affiliate disclosures. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/affiliate-disclosure\n","skills/affiliate-disclosure/references/rule.md":"# Provide clear affiliate disclosures\n\n> Checks for affiliate and sponsored content disclosures to maintain transparency.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nTransparency regarding financial incentives is crucial for building a sustainable relationship with your audience and complying with consumer protection laws.\n\n## Code Example\n\n```html\n<article>\n  <header>\n    <h1>The Best Laptops for Developers in 2024</h1>\n    <div class=\"disclosure\" style=\"background: #f9f9f9; padding: 10px; border-radius: 4px;\">\n      <p><small><em>Disclaimer: This post contains affiliate links. If you click on one and make a purchase, we may receive a small commission at no extra cost to you.</em></small></p>\n    </div>\n  </header>\n  \n  <p>Looking for a new laptop? Here are our top recommendations...</p>\n</article>\n```\n\n## Why It Matters\n\n- **Legal Compliance**: Adheres to FTC (Federal Trade Commission) and other international regulations regarding online advertising.\n- **User Trust**: Demonstrates honesty and transparency, which can lead to higher conversion rates over time.\n- **SEO Quality**: Prevents being flagged for \"sneaky redirects\" or hidden affiliate programs that can negatively impact rankings.\n- **E-E-A-T**: Supports the \"Trust\" pillar by showing you aren't hiding financial motivations.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/ai-content/SKILL.md":"---\nname: ai-content\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Audit and refine AI-generated content. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/ai-content\n---\n\n# Audit and refine AI-generated content\n\nSearch engines prioritize helpful, reliable, people-first content; unedited AI content often lacks the depth and accuracy required for high rankings.\n\n## Quick Reference\n\n- Review AI-generated content for accuracy, unique value, and human-like voice\n- Ensure content isn't just a rewrite of existing top-ranking articles\n- Verify all factual claims and include original research or insights\n\n## Check\n\nReview the content to see if it provides unique value beyond what AI models can generate by default.\n\n## Fix\n\nRewrite AI-generated sections to include original research, personal experiences, and a unique brand voice.\n\n## Explain\n\nExplain why human oversight is necessary for AI-generated content to meet SEO quality standards and user expectations.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Audit and refine AI-generated content. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/ai-content\n","skills/ai-content/references/rule.md":"# Audit and refine AI-generated content\n\n> Detects and reviews content that appears to be primarily AI-generated to ensure quality.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nWhile AI tools can assist in the writing process, the final output still has to satisfy [Google's Search Essentials](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) and deliver the depth expected from [high-quality content](/en/rules/seo/quality) that genuinely helps the reader.\n\n## Code Example\n\nWhile there's no \"code\" to detect AI, you can signal human involvement and expertise in your metadata and bylines.\n\n```html\n<article>\n  <header>\n    <h1>Advanced TypeScript Patterns</h1>\n    <div class=\"meta\">\n      <span>By Jane Smith, Senior Engineer</span>\n      <span>Fact-checked on October 20, 2023</span>\n    </div>\n  </header>\n  \n  <p>In this article, we'll explore patterns I've used in production at ScaleTech...</p>\n</article>\n```\n\n## Why It Matters\n\n- **Quality Standards**: Google's guidance on [creating helpful, reliable, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) targets low-value automation that does not add original insight.\n- **Accuracy**: AI can hallucinate facts; human verification is essential for [YMYL content](/en/rules/seo/ymyl-detection), where bad advice can cause real harm.\n- **Uniqueness**: Prevents your site from becoming a \"carbon copy\" of other sites using the same AI prompts.\n- **User Experience**: Human-edited content is generally more engaging, nuanced, and better at solving specific user problems.\n\nIf a draft feels generic, unsupported, or too close to what a model would produce by default, review it alongside thin-content risk before deciding it is ready to publish.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/all-noindex-pages/SKILL.md":"---\nname: all-noindex-pages\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Audit all noindex pages. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/all-noindex-pages\n---\n\n# Audit all noindex pages\n\nAn incorrect `noindex` tag can completely remove important pages from search results, while proper usage helps manage crawl budget and prevents duplicate content issues.\n\n## Quick Reference\n\n- Identify all pages using the `noindex` directive in meta tags or headers\n- Verify that critical pages (products, articles) aren't accidentally blocked\n- Ensure `noindex` is correctly applied to thin content, admin, or utility pages\n\n## Check\n\nVerify that the `noindex` directive is only applied to pages that should not appear in search results.\n\n## Fix\n\nRemove `&lt;meta name=\"robots\" content=\"noindex\"&gt;` from pages that should be indexed and ranking.\n\n## Explain\n\nExplain the difference between `noindex` and `disallow` in robots.txt and when to use each for optimal SEO.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Audit all noindex pages. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/all-noindex-pages\n","skills/all-noindex-pages/references/rule.md":"# Audit all noindex pages\n\n> Lists and reviews all pages blocked from indexing to ensure critical content is accessible.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nRegularly auditing your `noindex` directives ensures that you are only blocking pages that don't provide search value, such as staging environments, admin panels, or internal search results.\n\n## Code Example\n\n```html\n<head>\n  <!-- Use this for utility pages like 'Thank You' pages or internal search results -->\n  <meta name=\"robots\" content=\"noindex, follow\">\n  \n  <!-- For pages that should be completely ignored -->\n  <meta name=\"robots\" content=\"noindex, nofollow\">\n</head>\n```\n\n## Why It Matters\n\n- **Visibility**: Prevents accidental exclusion of high-value pages from Google and Bing.\n- **Crawl Budget**: Helps search engines focus their limited crawl resources on your most important pages.\n- **De-indexing**: Useful for removing outdated or sensitive pages from search results without deleting them.\n- **Strategic Control**: Allows you to manage which versions of content (e.g., filtered lists) are available for indexing.\n\n## Exceptions\n\n- Staging, utility, login, account, or internal search pages may intentionally use different crawl or index signals if they are not meant to rank.\n- Temporary migration states can produce noisy intermediate signals; flag the live production URL pattern, not one-off transition artifacts.\n- When redirects, canonicals, robots directives, or indexability signals conflict, fix the strongest final signal first instead of reporting every downstream symptom as a separate blocker.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/alt-text/SKILL.md":"---\nname: alt-text\ndescription: \"Use when reviewing image assets, markup, and CDN or build transforms related to Provide meaningful alt text for images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.\"\nmetadata:\n  category: images\n  priority: critical\n  difficulty: beginner\n  estimatedTime: \"15\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/images/alt-text\n---\n\n# Provide meaningful alt text for images\n\nApproximately 2.2 billion people worldwide have vision impairment. Screen readers read the alt attribute aloud—without meaningful alt text, users who are blind receive no information about image content. Missing alt text also fails WCAG 2.1 Success Criterion 1.1.1, which is a Level A (minimum) requirement. Search engines also rely on alt text to index image content.\n\n## Quick Reference\n\n- Every `<img>` must have an `alt` attribute—omitting it entirely violates WCAG 2.1 SC 1.1.1\n- Decorative images use `alt=\"\"` so screen readers ignore them\n- Alt text should describe the image's *purpose*, not just its appearance\n- Linked images: alt describes the link destination, not the visual\n\n## Check\n\nScan all <img> elements in the codebase. Verify: 1) Every <img> has an alt attribute (missing alt is an error). 2) Decorative images use alt=\"\". 3) Informative images have descriptive text that conveys the image's meaning—not just its file name. 4) Images that are links describe the destination. 5) Images of text reproduce the text in alt. Flag any <img> without alt, with alt matching the filename (e.g., alt=\"photo1.jpg\"), or with generic values like alt=\"image\" or alt=\"photo\".\n\n## Fix\n\nFor each image missing or with poor alt text: 1) Informative images—describe what the image conveys, not just what it shows (e.g., alt=\"Bar chart showing 40% increase in sales Q3 2024\" not alt=\"chart\"). 2) Decorative images—add alt=\"\" so screen readers skip them. 3) Linked images—describe the link destination (e.g., alt=\"Visit our Twitter profile\"). 4) Images of text—copy the text verbatim into alt. 5) Complex images (charts, infographics)—provide a short alt plus a longer description via aria-describedby or a visible caption.\n\n## Explain\n\nExplain WCAG 2.1 Success Criterion 1.1.1 Non-text Content: every image must have a text alternative. Screen readers announce the alt attribute aloud—without it, users who are blind or have low vision cannot understand the page. Bad alt text (like alt=\"image\") is no better than no alt text. Decorative images must use alt=\"\" explicitly so screen readers skip them entirely—omitting alt causes some screen readers to announce the filename.\n\n## Code Review\n\nReview image assets, markup, and delivery configuration related to Provide meaningful alt text for images. Flag exact files or components where format choice, sizing, or loading behavior violates the rule, and describe how to confirm the fix in DevTools.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/images/alt-text\n","skills/alt-text/references/rule.md":"# Provide meaningful alt text for images\n\n> Every informative image has a descriptive alt attribute; decorative images use alt=\"\" to be ignored by screen readers.\n\n**Priority:** critical · **Difficulty:** beginner · **Time:** 15 min\n\n---\nThe `alt` attribute is the primary accessibility mechanism for images. Every `<img>` must have an `alt` attribute. Its value depends on the image's role.\n\nUse the [W3C alt decision tree](https://www.w3.org/WAI/tutorials/images/decision-tree/) to determine the correct alt value for any image type.\n\n## Code Example\n\nImages that convey meaning need descriptive alt text explaining what the image communicates.\n\n```html\n<!-- ❌ Bad: Missing alt -->\n<img src=\"revenue-chart.png\">\n\n<!-- ❌ Bad: Filename as alt -->\n<img src=\"revenue-chart.png\" alt=\"revenue-chart.png\">\n\n<!-- ❌ Bad: Generic alt -->\n<img src=\"revenue-chart.png\" alt=\"chart\">\n\n<!-- ✅ Good: Describes what the image conveys -->\n<img\n  src=\"revenue-chart.png\"\n  alt=\"Bar chart showing Q3 2024 revenue increased 40% year-over-year, reaching $2.4M\"\n>\n```\n\n## Why It Matters\n\nApproximately 2.2 billion people worldwide have vision impairment. Screen readers read the alt attribute aloud—without meaningful alt text, users who are blind receive no information about image content. Missing alt text also fails WCAG 2.1 Success Criterion 1.1.1, which is a Level A (minimum) requirement. Search engines also rely on alt text to index image content.\n\n## Decorative Images\n\nImages used purely for visual decoration carry no information and should be hidden from assistive technology.\n\n```html\n<!-- ❌ Bad: No alt attribute—screen reader may announce the filename -->\n<img src=\"decorative-swirl.png\">\n\n<!-- ✅ Good: Empty alt hides image from screen readers -->\n<img src=\"decorative-swirl.png\" alt=\"\">\n\n<!-- ✅ Good: Or use CSS background images for decoration -->\n<div class=\"decorative-swirl\" aria-hidden=\"true\"></div>\n```\n\n## Images Used as Links\n\nWhen an `<img>` is inside an `<a>`, the alt text must describe the link destination, not the visual appearance.\n\n```html\n<!-- ❌ Bad: Describes appearance, not destination -->\n<a href=\"https://twitter.com/example\">\n  <img src=\"twitter-logo.svg\" alt=\"Blue bird logo\">\n</a>\n\n<!-- ✅ Good: Describes the link destination -->\n<a href=\"https://twitter.com/example\">\n  <img src=\"twitter-logo.svg\" alt=\"Follow us on Twitter\">\n</a>\n```\n\n## Images of Text\n\nIf an image contains text (e.g., a logo, banner, or screenshot), reproduce that text verbatim in alt.\n\n```html\n<!-- ✅ Good: Alt reproduces the text shown in the image -->\n<img src=\"sale-banner.png\" alt=\"Summer Sale — 50% off all items\">\n\n<!-- ✅ Good: Logo with company name -->\n<img src=\"logo.svg\" alt=\"Acme Corp\">\n```\n\n## Complex Images (Charts, Diagrams)\n\nFor complex visuals, provide a brief alt plus a longer description accessible to all users.\n\n```html\n<!-- Using aria-describedby to link to a visible description -->\n<figure>\n  <img\n    src=\"org-chart.png\"\n    alt=\"Company organisational chart\"\n    aria-describedby=\"org-chart-desc\"\n  >\n  <figcaption id=\"org-chart-desc\">\n    The chart shows three departments reporting to the CEO: Engineering (12 staff),\n    Marketing (8 staff), and Operations (5 staff).\n  </figcaption>\n</figure>\n```\n\n## Framework Examples\n\n  \n\n```tsx\ninterface ImageProps {\n  src: string\n  alt: string\n  decorative?: boolean\n}\n\nfunction AccessibleImage({ src, alt, decorative = false }: ImageProps) {\n  return (\n    <img\n      src={src}\n      // Decorative images use empty string; informative images use descriptive text\n      alt={decorative ? '' : alt}\n    />\n  )\n}\n\n// Usage\n\n```\n\n  \n  \n\n```tsx\n\n// Next.js Image requires alt; use \"\" for decorative\nfunction HeroBanner() {\n  return (\n    <>\n      {/* Informative */}\n      \n\n      {/* Decorative */}\n      \n    </>\n  )\n}\n```\n\n  \n\n## Standards\n\n- Use these references as the standard for the final image format, delivery, accessibility, and rendering behavior.\n- Check the implementation against MDN: Responsive images before treating the rule as satisfied.\n- Check the implementation against web.dev: Image performance before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Run axe DevTools or WAVE on the page—both flag missing or empty non-decorative alt attributes\n- Use Lighthouse Accessibility audit—\"Images do not have alternate text\" is a scored item\n\n### Manual Checks\n\n- Enable a screen reader (VoiceOver, NVDA, or JAWS) and navigate through images with the `G` key\n- Inspect the Network tab: for any image URL, verify the corresponding `<img>` has a meaningful `alt`\n- **CAPTCHA images** — provide alt describing the purpose, not the characters (e.g., `alt=\"CAPTCHA: type the characters shown\"`), and offer an audio alternative per WCAG 1.1.1\n- **SVG icons with adjacent text labels** — if the icon's meaning is already conveyed by visible text, use `aria-hidden=\"true\"` on the SVG instead of alt","skills/anchor-smooth-scroll/SKILL.md":"---\nname: anchor-smooth-scroll\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide instant anchor scroll option. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: low\n  difficulty: beginner\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/anchor-smooth-scroll\n---\n\n# Provide instant anchor scroll option\n\nSmooth scroll animations can trigger vertigo, nausea, and disorientation for users with vestibular disorders—instant navigation is safer and often faster.\n\n## Quick Reference\n\n- Disable smooth scroll when prefers-reduced-motion is set\n- Use CSS scroll-behavior: smooth with media query check\n- Ensure focus moves to anchor target for keyboard users\n- Provide instant scroll as default or fallback\n\n## Check\n\nClick anchor links (same-page navigation) and verify smooth scrolling is disabled when prefers-reduced-motion is set. Confirm anchor navigation works correctly with keyboard and screen readers.\n\n## Fix\n\nUse scroll-behavior: smooth only within a prefers-reduced-motion media query check. Provide instant scrolling as the default or reduced-motion fallback. Ensure focus moves to the anchor target.\n\n## Explain\n\nExplain how animated scroll transitions can cause motion sickness and disorientation for users with vestibular disorders, and why instant navigation is often preferable for accessibility.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Provide instant anchor scroll option. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/anchor-smooth-scroll\n","skills/anchor-smooth-scroll/references/rule.md":"# Provide instant anchor scroll option\n\n> Smooth scroll animations to anchor links respect motion preferences or provide an instant alternative.\n\n**Priority:** low · **Difficulty:** beginner · **Time:** 10 min\n\n---\nSmooth scrolling should respect motion preferences to avoid triggering vestibular disorders.\n\n## Code Example\n\n```css\n/* ❌ Bad: Always smooth, ignores preferences */\nhtml {\n  scroll-behavior: smooth;\n}\n\n/* ✅ Good: Respect motion preferences */\n@media (prefers-reduced-motion: no-preference) {\n  html {\n    scroll-behavior: smooth;\n  }\n}\n\n/* Users who prefer reduced motion get instant scrolling (default) */\n```\n\n## Why It Matters\n\nSmooth scroll animations can trigger vertigo, nausea, and disorientation for users with vestibular disorders—instant navigation is safer and often faster.\n\n## JavaScript Approach\n\n```typescript\nfunction scrollToElement(elementId: string) {\n  const element = document.getElementById(elementId)\n  if (!element) return\n\n  const prefersReducedMotion = window.matchMedia(\n    '(prefers-reduced-motion: reduce)'\n  ).matches\n\n  element.scrollIntoView({\n    behavior: prefersReducedMotion ? 'instant' : 'smooth',\n    block: 'start'\n  })\n\n  // Move focus to target for keyboard users\n  element.focus({ preventScroll: true })\n}\n```\n\n## React Hook\n\n```tsx\nfunction useScrollToAnchor() {\n  const prefersReducedMotion = useReducedMotion()\n\n  const scrollTo = useCallback((elementId: string) => {\n    const element = document.getElementById(elementId)\n    if (!element) return\n\n    element.scrollIntoView({\n      behavior: prefersReducedMotion ? 'instant' : 'smooth',\n      block: 'start'\n    })\n\n    // Set tabindex if element isn't focusable\n    if (!element.hasAttribute('tabindex')) {\n      element.setAttribute('tabindex', '-1')\n    }\n    element.focus({ preventScroll: true })\n  }, [prefersReducedMotion])\n\n  return scrollTo\n}\n\nfunction useReducedMotion() {\n  const [prefersReduced, setPrefersReduced] = useState(false)\n\n  useEffect(() => {\n    const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n    setPrefersReduced(mediaQuery.matches)\n\n    const handler = (e: MediaQueryListEvent) => setPrefersReduced(e.matches)\n    mediaQuery.addEventListener('change', handler)\n    return () => mediaQuery.removeEventListener('change', handler)\n  }, [])\n\n  return prefersReduced\n}\n```\n\n## Anchor Link Component\n\n```tsx\ninterface AnchorLinkProps {\n  href: string\n  children: React.ReactNode\n}\n\nfunction AnchorLink({ href, children }: AnchorLinkProps) {\n  const scrollTo = useScrollToAnchor()\n\n  const handleClick = (e: React.MouseEvent) => {\n    if (href.startsWith('#')) {\n      e.preventDefault()\n      scrollTo(href.slice(1))\n    }\n  }\n\n  return (\n    <a href={href} onClick={handleClick}>\n      {children}\n    </a>\n  )\n}\n```\n\n## Focus Management\n\n```html\n<!-- Target must be focusable for keyboard navigation -->\n<section id=\"features\" tabindex=\"-1\">\n  <h2>Features</h2>\n  <!-- Content -->\n</section>\n```\n\n```css\n/* Hide focus ring when section is focused via anchor */\nsection:focus {\n  outline: none;\n}\n\n/* But show focus for keyboard navigation */\nsection:focus-visible {\n  outline: 2px solid var(--focus-color);\n}\n```\n\n## Exceptions\n\n- Simple data tables can sometimes fail more from missing header relationships than from missing enhancements such as captions or mobile wrappers, so prioritize the strongest semantic issue.\n- Do not convert layout structures into data-table markup just to satisfy a rule; the correct fix may be to remove table semantics entirely.\n- When several table-accessibility issues overlap, resolve the header-cell relationship first because downstream announcements depend on it.\n\n## Verification\n\n### Automated Checks\n\n- Use browser accessibility tooling, axe, Lighthouse, or equivalent automated checks against a representative rendered state.\n\n### Manual Checks\n\n- Enable \"Reduce motion\" in system accessibility settings\n- Click anchor links—should scroll instantly, not smoothly\n- Verify focus moves to target section\n- Tab through page after anchor click—focus should continue from anchor target","skills/anchor-text/SKILL.md":"---\nname: anchor-text\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Use descriptive anchor text. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: beginner\n  estimatedTime: \"5\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/anchor-text\n---\n\n# Use descriptive anchor text\n\nDescriptive anchor text helps search engines understand the context of the linked page and significantly improves accessibility for users using screen readers.\n\n## Quick Reference\n\n- Use descriptive text for links instead of generic phrases like 'click here' or 'read more'\n- Ensure the anchor text provides clear context about the linked page's content\n- Avoid over-optimizing with excessive keyword stuffing in your internal links\n\n## Check\n\nVerify that all links in the content use descriptive anchor text that accurately describes the target page.\n\n## Fix\n\nReplace generic link text like 'click here' with descriptive phrases that include relevant keywords for the destination page.\n\n## Explain\n\nExplain how descriptive anchor text improves both SEO crawlability and web accessibility for disabled users.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Use descriptive anchor text. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/anchor-text\n","skills/anchor-text/references/rule.md":"# Use descriptive anchor text\n\n> Checks for descriptive, keyword-rich anchor text that provides context for users and search engines.\n\n**Priority:** medium · **Difficulty:** beginner · **Time:** 5 min\n\n---\nAnchor text is the clickable text in a hyperlink. It should provide a clear indication of what the user will find when they click the link.\n\n## Code Example\n\n```html\n<!-- ✅ Good: Descriptive and contextual -->\n<p>For more information, read our <a href=\"/seo-guide\">complete guide to SEO best practices</a>.</p>\n\n<!-- ❌ Bad: Generic and provides no context -->\n<p>To learn more about our SEO services, <a href=\"/seo-guide\">click here</a>.</p>\n```\n\n## Why It Matters\n\n- **Search Context**: Tells search engines what the linked page is about, helping it rank for those terms.\n- **Accessibility**: Screen reader users often navigate via a list of links; descriptive text makes this list meaningful.\n- **User Trust**: Users are more likely to click a link when they know exactly where it leads.\n- **Internal Navigation**: Helps distribute authority throughout your site by creating a logical web of related content.\n\n## Exceptions\n\n- Utility or intentionally noindex pages may keep minimal metadata when richer search presentation is not a goal.\n- Template-driven pages can look repetitive in isolation; confirm the fully rendered production output before flagging duplication or omission.\n- If a page is intentionally redirected or excluded from indexation, resolve that crawlability decision before treating metadata polish as the primary issue.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","skills/animated-content/SKILL.md":"---\nname: animated-content\ndescription: \"Use when auditing slow page loads, heavy assets, or rendering delays related to Convert animated GIFs to video. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.\"\nmetadata:\n  category: performance\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/performance/animated-content\n---\n\n# Convert animated GIFs to video\n\nLarge animated GIFs can significantly increase page weight and consume excessive CPU/memory, leading to slower page loads and poor scrolling performance.\n\n## Quick Reference\n\n- Use `<video>` instead of large GIFs for animations\n- GIFs are significantly larger than MP4/WebM\n- Videos allow for better control and performance\n\n## Check\n\nCheck for large animated GIFs that could be replaced with more efficient video formats like MP4 or WebM.\n\n## Fix\n\nConvert animated GIFs to MP4 or WebM and use the `<video>` tag with `autoplay`, `loop`, `muted`, and `playsinline` attributes.\n\n## Explain\n\nExplain why video formats are more efficient than GIFs for animated content and how they improve performance.\n\n## Code Review\n\nReview the routes, assets, and loading behavior that affect Convert animated GIFs to video. Flag exact files, requests, or rendering steps that add unnecessary network, CPU, or layout cost, and describe the measurement method used to confirm the issue.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/performance/animated-content\n","skills/animated-content/references/rule.md":"# Convert animated GIFs to video\n\n> Large animated GIFs are replaced with more efficient video formats like MP4 or WebM to reduce page weight.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nLarge animated GIFs are often used for short animations, but they are highly inefficient compared to modern video formats. Converting these to MP4 or WebM can reduce file sizes by 80% or more.\n\n## Code Examples\n\n#\n\n## Traditional GIF (Inefficient)\n```html\n<img src=\"animation.gif\" alt=\"Description of animation\">\n```\n\n### Optimized Video (Recommended)\nUsing the `<video>` tag with specific attributes to mimic GIF behavior:\n\n```html\n<video\n  autoplay\n  loop\n  muted\n  playsinline\n  poster=\"animation-frame.jpg\"\n>\n  <source src=\"animation.webm\" type=\"video/webm\">\n  <source src=\"animation.mp4\" type=\"video/mp4\">\n  Your browser does not support the video tag.\n</video>\n```\n\n## Why It Matters\n\n- **Page Weight**: GIFs are uncompressed and can easily reach several megabytes, slowing down page loads.\n- **CPU Usage**: Browsers consume more CPU/GPU resources to decode and render large GIFs compared to optimized video.\n- **Battery Life**: On mobile devices, the high resource usage of GIFs can significantly drain battery.\n- **User Experience**: Large assets delay the completion of page loading and can cause stuttering during scrolling.\n\n## Best Practices\n\nFavor [browser-native video delivery guidance from web.dev](https://web.dev/learn/performance) when deciding whether an animation should stay a GIF at all, because the biggest wins usually come from eliminating heavy animated assets rather than just caching them better.\n\n✅ **Use Modern Formats**: Provide WebM for modern browsers and MP4 as a fallback.\n✅ **Add Poster Images**: Use the `poster` attribute to show a static frame while the video loads.\n✅ **Mute by Default**: Always use `muted` for autoplaying videos to ensure they work across all browsers.\n✅ **Lazy Loading**: Use `loading=\"lazy\"` or Intersection Observer for videos below the fold.\n\n❌ **Avoid GIF for Large Animations**: Never use GIF for animations larger than a few hundred pixels or longer than a second.\n❌ **Don't Forget Accessibility**: Always provide alternative text or a description for the animation.\n\n## Tools & Validation\n\n- [FFmpeg](https://ffmpeg.org/): Command-line tool for converting GIFs to video.\n- [Cloudinary/Imgix](https://cloudinary.com/): Automated media optimization services.\n- [Lighthouse](https://developers.google.com/web/tools/lighthouse): Checks for large GIFs and suggests video alternatives.\n\n## Standards\n\n- Use web.dev: Learn Performance as the standard for measuring the final production behavior, not just local synthetic output.\n- Use Chrome Developers: Lighthouse overview as the standard for measuring the final production behavior, not just local synthetic output.\n\n## Verification\n\n### Automated Checks\n\n- Measure the affected page or flow in Lighthouse, PageSpeed Insights, or DevTools and confirm the targeted metric improves.\n- Inspect the network waterfall or performance timeline to confirm the intended resource or execution change actually took effect.\n\n### Manual Checks\n\n- Verify the change on a throttled mobile profile, not just local desktop.\n- If this rule maps to a budget or Web Vital, confirm the page now stays within that threshold.","skills/animation-performance/SKILL.md":"---\nname: animation-performance\ndescription: \"Use when reviewing stylesheets, component styles, and responsive behavior related to Use transform and opacity for animations. Check the rendered layout across breakpoints and interaction states before proposing a fix.\"\nmetadata:\n  category: css\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/css/animation-performance\n---\n\n# Use transform and opacity for animations\n\nAnimating layout properties (width, height, top, margin) triggers the full browser rendering pipeline on every frame — style recalculation, layout, paint, and composite. This runs on the main thread and competes with JavaScript. Animating transform and opacity skips layout and paint entirely and runs on a dedicated GPU thread, achieving smooth 60fps even when the main thread is busy.\n\n## Quick Reference\n\n- Only transform and opacity can be composited on the GPU without triggering layout\n- Use will-change: transform sparingly to promote an element to its own compositor layer\n- Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n- Respect prefers-reduced-motion to disable animations for users who need it\n\n## Check\n\nFind CSS animations or transitions in this file that animate layout-triggering properties like top, left, width, height, or margin. Flag them for optimization.\n\n## Fix\n\nConvert layout-triggering animations to use transform equivalents: position changes to translate(), size changes to scale().\n\n## Explain\n\nExplain the browser rendering pipeline, why transform and opacity are performant for animation, and how the GPU compositor works.\n\n## Code Review\n\nReview stylesheets, component styles, and responsive states related to Use transform and opacity for animations. Flag exact selectors, declarations, or breakpoints that violate the rule in the rendered UI.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/css/animation-performance\n","skills/animation-performance/references/rule.md":"# Use transform and opacity for animations\n\n> Animate with CSS transform and opacity properties to keep animations running on the GPU compositor thread at 60fps, avoiding layout-triggering properties like top, left, width, and height.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nThe browser renders pages through a pipeline: Style → Layout → Paint → Composite. Animating the wrong properties restarts this pipeline every frame. Animating `transform` and `opacity` only triggers the composite step.\n\n## Code Example\n\n```\nLayout-triggering properties (avoid animating):\n  width, height, margin, padding, top, left, right, bottom,\n  border-width, font-size, display, position\n\nPaint-triggering properties (acceptable, but not ideal):\n  color, background-color, box-shadow, border-color,\n  outline, text-shadow\n\nCompositor-only properties (optimal for animation):\n  transform (translate, scale, rotate, skew)\n  opacity\n  filter (on composited layers)\n```\n\n## Why It Matters\n\nAnimating layout properties (width, height, top, margin) triggers the full browser rendering pipeline on every frame — style recalculation, layout, paint, and composite. This runs on the main thread and competes with JavaScript. Animating transform and opacity skips layout and paint entirely and runs on a dedicated GPU thread, achieving smooth 60fps even when the main thread is busy.\n\n## Converting Position Animations\n\n```css\n/* ❌ Bad: animates layout properties — triggers full reflow each frame */\n.slide-in {\n  animation: slideIn 300ms ease-out;\n}\n\n@keyframes slideIn {\n  from { left: -100%; }\n  to { left: 0; }\n}\n\n/* ✅ Good: translate() is compositor-only */\n.slide-in {\n  animation: slideIn 300ms ease-out;\n}\n\n@keyframes slideIn {\n  from { transform: translateX(-100%); }\n  to { transform: translateX(0); }\n}\n```\n\n## Converting Size Animations\n\n```css\n/* ❌ Animates width/height — expensive */\n.expand {\n  animation: expand 300ms ease;\n}\n@keyframes expand {\n  from { width: 0; height: 0; }\n  to { width: 200px; height: 200px; }\n}\n\n/* ✅ Use scale() */\n.expand {\n  width: 200px;\n  height: 200px;\n  animation: expand 300ms ease;\n}\n@keyframes expand {\n  from { transform: scale(0); }\n  to { transform: scale(1); }\n}\n```\n\n## Common Performant Patterns\n\n```css\n/* Fade in */\n.fade-in {\n  animation: fadeIn 300ms ease;\n}\n@keyframes fadeIn {\n  from { opacity: 0; }\n  to { opacity: 1; }\n}\n\n/* Slide up and fade in */\n.slide-up {\n  animation: slideUp 400ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n@keyframes slideUp {\n  from {\n    opacity: 0;\n    transform: translateY(16px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n/* Button press */\n.button:active {\n  transform: scale(0.97);\n}\n```\n\n## will-change (Use Sparingly)\n\n```css\n/* Hint to browser to promote this element to its own layer before animation starts */\n.animated-card {\n  will-change: transform;\n}\n\n/* ⚠️ Don't apply to too many elements — each layer uses GPU memory */\n/* Apply just before animation, remove after */\n```\n\n## Respecting Reduced Motion\n\n```css\n/* ✅ Always honor the user's motion preferences */\n.slide-in {\n  animation: slideIn 400ms ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .slide-in {\n    animation: none;\n    /* Provide a non-animated alternative if needed */\n  }\n}\n\n/* Or use the safe pattern */\n@media (prefers-reduced-motion: no-preference) {\n  .slide-in {\n    animation: slideIn 400ms ease;\n  }\n}\n```\n\n## Verification\n\n1. Inspect the rendered UI at the breakpoints and interaction states affected by the rule.\n2. Confirm the computed styles match the intended fix in DevTools.\n3. Test at least one mobile and one desktop viewport before shipping.\n4. If the rule affects motion, contrast, or layout stability, verify those user-facing outcomes directly.","skills/aria-allowed-attr/SKILL.md":"---\nname: aria-allowed-attr\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use only allowed ARIA attributes for each role. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-allowed-attr\n---\n\n# Use only allowed ARIA attributes for each role\n\nInvalid ARIA attributes are ignored by screen readers or may cause them to misinterpret the element's purpose, leading to a broken experience for users with disabilities.\n\n## Quick Reference\n\n- Each ARIA role only supports a specific set of ARIA attributes\n- Using unsupported attributes can confuse assistive technologies\n- Ensures the accessibility tree remains valid and meaningful\n\n## Check\n\nVerify that all ARIA attributes used on elements are valid for their assigned WAI-ARIA roles.\n\n## Fix\n\nRemove or correct ARIA attributes that are not supported by the element's current ARIA role.\n\n## Explain\n\nExplain why using only role-supported ARIA attributes is necessary for proper screen reader communication.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Use only allowed ARIA attributes for each role. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-allowed-attr\n","skills/aria-allowed-attr/references/rule.md":"# Use only allowed ARIA attributes for each role\n\n> Checks that ARIA attributes are allowed on their elements to ensure valid accessibility trees.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nARIA (Accessible Rich Internet Applications) attributes must match the role of the element they are applied to. Using attributes that don't belong to a role can result in \"silent\" failures where accessibility information is lost.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: aria-checked is allowed on checkbox role -->\n<div role=\"checkbox\" aria-checked=\"true\" tabindex=\"0\">Subscribe</div>\n\n<!-- ❌ Incorrect: aria-checked is NOT allowed on a heading role -->\n<h1 role=\"heading\" aria-checked=\"true\">Main Title</h1>\n```\n\n## Why It Matters\n\n- **Standard Compliance**: Adheres to WAI-ARIA specifications for robust and predictable web applications.\n- **AT Accuracy**: Guarantees that assistive technologies receive correct and relevant information about the element's state.\n- **Reduced Noise**: Prevents developers from adding redundant, invalid, or confusing metadata to the DOM.\n- **Future Compatibility**: Valid ARIA usage ensures that your application remains accessible as browser and screen reader implementations evolve.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-command-name/SKILL.md":"---\nname: aria-command-name\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for ARIA command elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-command-name\n---\n\n# Provide accessible names for ARIA command elements\n\nWithout an accessible name, screen reader users will only hear the role (e.g., 'button') without knowing what it does, making the interface impossible to navigate.\n\n## Quick Reference\n\n- Elements with command roles (button, link, menuitem) must have a label\n- Accessible names can be provided via text content, `aria-label`, or `aria-labelledby`\n- Ensures users know the purpose of the interactive element\n\n## Check\n\nIdentify elements with command roles (like button or link) that lack a clear accessible name.\n\n## Fix\n\nAdd an accessible name using inner text, `aria-label`, or `aria-labelledby` to all command elements.\n\n## Explain\n\nExplain how accessible names for command elements enable screen reader users to understand interactive controls.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Provide accessible names for ARIA command elements. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-command-name\n","skills/aria-command-name/references/rule.md":"# Provide accessible names for ARIA command elements\n\n> Checks that command elements like buttons and links have accessible names for screen reader support.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nCommand elements are interactive controls that perform an action. For these to be usable by everyone, they must have a programmatically determinable name that describes their function.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Accessible name via text content -->\n<button>Submit Form</button>\n\n<!-- ✅ Correct: Accessible name via aria-label (for icon buttons) -->\n<button aria-label=\"Close dialog\">\n  <svg>...</svg>\n</button>\n\n<!-- ❌ Incorrect: No accessible name (empty or icon-only without label) -->\n<button>\n  <i class=\"fa fa-trash\"></i>\n</button>\n```\n\n## Why It Matters\n\n- **Clarity**: Informs users exactly what action will be performed when the element is activated.\n- **Navigability**: Allows users to find and activate controls via voice commands or by browsing lists of controls in their screen reader.\n- **Inclusion**: Provides a comparable experience for users who cannot see visual icons or cues.\n- **Avoids Confusion**: Prevents the \"unlabeled button\" experience, which is one of the most common accessibility barriers.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-deprecated-role/SKILL.md":"---\nname: aria-deprecated-role\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid using deprecated ARIA roles. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-deprecated-role\n---\n\n# Avoid using deprecated ARIA roles\n\nUsing deprecated roles can lead to inconsistent behavior across different browsers and screen readers as they transition to newer standards.\n\n## Quick Reference\n\n- Deprecated ARIA roles should be replaced with modern equivalents\n- Browsers may drop support for deprecated roles in future versions\n- Ensures long-term compatibility with assistive technologies\n\n## Check\n\nSearch the codebase for deprecated ARIA roles like `directory` or abstract roles that shouldn't be used in HTML.\n\n## Fix\n\nUpdate deprecated ARIA roles to their modern recommended equivalents or use native HTML elements.\n\n## Explain\n\nExplain the risks of using deprecated ARIA roles and the benefits of moving to modern ARIA standards.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Avoid using deprecated ARIA roles. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-deprecated-role\n","skills/aria-deprecated-role/references/rule.md":"# Avoid using deprecated ARIA roles\n\n> Checks for deprecated or abstract ARIA roles to ensure long-term compatibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nAs the WAI-ARIA specification evolves, some roles are deprecated in favor of more precise or better-supported alternatives. Using modern roles ensures your application remains accessible for years to come.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Use modern roles or native elements -->\n<nav aria-label=\"Site\">...</nav>\n<ul role=\"list\">...</ul>\n\n<!-- ❌ Incorrect: Using deprecated roles -->\n<div role=\"directory\">...</div>\n```\n\n## Why It Matters\n\n- **Future-Proofing**: Keeps the application compatible with evolving browser and assistive technology (AT) standards.\n- **Reliability**: Ensures consistent interpretation of element roles across all platforms and devices.\n- **Semantic Accuracy**: Modern roles often provide more precise meaning than older, deprecated ones, leading to a better user experience.\n- **Cleaner Code**: Often, a deprecated role can be replaced by a native HTML element (like `<nav>` instead of `role=\"navigation\"`), which is the preferred approach.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-dialog-name/SKILL.md":"---\nname: aria-dialog-name\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure dialogs have an accessible name. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-dialog-name\n---\n\n# Ensure dialogs have an accessible name\n\nWhen a dialog opens, screen readers should announce its purpose immediately so users know why their focus has shifted and what information is required.\n\n## Quick Reference\n\n- All dialog and alertdialog elements must have a descriptive label\n- Use `aria-labelledby` to point to a title or `aria-label` for a direct string\n- Helps users understand the context and purpose of the modal\n\n## Check\n\nVerify that every element with `role=\"dialog\"` or `role=\"alertdialog\"` has an accessible name.\n\n## Fix\n\nProvide an accessible name for the dialog using `aria-labelledby` (pointing to the header) or `aria-label`.\n\n## Explain\n\nExplain why naming dialogs is crucial for orienting screen reader users when modals appear.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Ensure dialogs have an accessible name. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-dialog-name\n","skills/aria-dialog-name/references/rule.md":"# Ensure dialogs have an accessible name\n\n> Checks that dialog elements have accessible names to orient screen reader users.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nDialogs (modals) interrupt the user's flow. To provide a smooth transition for assistive technology users, the dialog must identify itself as soon as it gains focus.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Using aria-labelledby to point to the header -->\n<div role=\"dialog\" aria-labelledby=\"modal-title\" aria-modal=\"true\">\n  <h2 id=\"modal-title\">Edit Profile</h2>\n  <form>...</form>\n</div>\n\n<!-- ✅ Correct: Using aria-label for a simple notification -->\n<div role=\"alertdialog\" aria-label=\"Session Timeout\" aria-modal=\"true\">\n  <p>Your session is about to expire.</p>\n  <button>Stay logged in</button>\n</div>\n\n<!-- ❌ Incorrect: No accessible name -->\n<div role=\"dialog\">\n  <p>Some content without a title...</p>\n</div>\n```\n\n## Why It Matters\n\n- **Orientation**: Helps users immediately understand they have entered a new context or \"window.\"\n- **Context**: Clearly states the purpose of the dialog (e.g., \"Confirm Deletion\") before the user starts interacting with its contents.\n- **Compliance**: Follows WAI-ARIA best practices for accessible modal windows and user interface patterns.\n- **Efficiency**: Allows users to decide whether to interact with or dismiss the dialog based on its title alone.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-hidden-body/SKILL.md":"---\nname: aria-hidden-body\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Do not use aria-hidden on the document body. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: critical\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-hidden-body\n---\n\n# Do not use aria-hidden on the document body\n\nSetting `aria-hidden=\"true\"` on the body effectively silences the entire application for screen reader users, rendering the site completely unusable.\n\n## Quick Reference\n\n- The `<body>` element should never have `aria-hidden=\"true\"`\n- Hiding the body makes the entire page invisible to assistive technologies\n- Often happens accidentally when managing modal states\n\n## Check\n\nCheck if the `<body>` element has `aria-hidden=\"true\"` applied at any point in the lifecycle.\n\n## Fix\n\nRemove `aria-hidden=\"true\"` from the `<body>` and use it only on specific background containers when modals are open.\n\n## Explain\n\nExplain the catastrophic impact of hiding the body element from assistive technologies.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Do not use aria-hidden on the document body. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-hidden-body\n","skills/aria-hidden-body/references/rule.md":"# Do not use aria-hidden on the document body\n\n> Ensures the document body is not set to aria-hidden, which would hide the entire page from screen readers.\n\n**Priority:** critical · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nThe `aria-hidden` attribute removes an element and all of its children from the accessibility tree. Applying it to the `<body>` tag makes your entire website non-existent for screen reader users.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Hidden attribute on background content only -->\n<body>\n  <div id=\"app-root\" aria-hidden=\"true\">\n    <!-- Main content hidden while modal is open -->\n  </div>\n  <div id=\"modal-portal\">\n    <!-- Modal remains visible to AT -->\n  </div>\n</body>\n\n<!-- ❌ Incorrect: aria-hidden on body -->\n<body aria-hidden=\"true\">\n  <h1>This whole page is invisible to a screen reader</h1>\n</body>\n```\n\n## Why It Matters\n\n- **Full Inaccessibility**: Hides every single piece of content and interactive element from screen readers.\n- **Broken Experience**: Users cannot navigate, read, or interact with any part of the application.\n- **Common Implementation Bug**: Frequently caused by automated scripts or libraries that try to \"lock\" the background when a modal is open but target the wrong element.\n- **Critical Failure**: This is considered a high-priority accessibility violation that prevents access to the entire service.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-hidden-focus/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-hidden-focus%2FSKILL.md -->","skills/aria-hidden-focus/references/rule.md":"# Remove focusable elements from aria-hidden containers\n\n> Ensures aria-hidden elements do not contain focusable content to avoid \"ghost\" focus.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nWhen an element is marked with `aria-hidden=\"true\"`, it is removed from the accessibility tree, but it is **not** removed from the keyboard tab order. [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) makes that distinction explicit, which is why this failure often shows up alongside broader [focus-management issues](/en/rules/accessibility/focus-management).\n## Code Example\n\n```html\n<!-- ✅ Correct: Focusable element is also removed from tab order -->\n<div aria-hidden=\"true\">\n  <button tabindex=\"-1\">Hidden Button</button>\n</div>\n\n<!-- ✅ Correct: Using the inert attribute (modern browser support) -->\n<div inert>\n  <button>Hidden Button</button>\n</div>\n\n<!-- ❌ Incorrect: Focusable but hidden from AT (Ghost Focus) -->\n<div aria-hidden=\"true\">\n  <button>I can be focused but not heard</button>\n</div>\n```\n\n## Why It Matters\n\n- **Avoid Ghost Focus**: Prevents the keyboard focus from disappearing into \"silent\" regions where no information is announced.\n- **User Clarity**: Ensures every focusable element has a corresponding announcement by the screen reader, maintaining user confidence.\n- **Logical Flow**: Maintains a consistent and predictable navigation path for keyboard-only users.\n- **Reduces Frustration**: Eliminates instances where users might think their browser or the website has crashed because focus seems to have disappeared.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Support Notes\n\n- The `inert` attribute is the cleanest modern fix, but older browser targets may still need a fallback that removes descendants from the tab order manually.\n- Verify the rendered focus behavior in the project target browsers because browser and assistive-technology combinations still differ in how they expose hidden content.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","skills/aria-input-field-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-input-field-name%2FSKILL.md -->","skills/aria-input-field-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-input-field-name%2Freferences%2Frule.md -->","skills/aria-labels/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-labels%2FSKILL.md -->","skills/aria-labels/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-labels%2Freferences%2Frule.md -->","skills/aria-live-regions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-live-regions%2FSKILL.md -->","skills/aria-live-regions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-live-regions%2Freferences%2Frule.md -->","skills/aria-meter-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-meter-name%2FSKILL.md -->","skills/aria-meter-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-meter-name%2Freferences%2Frule.md -->","skills/aria-progressbar-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-progressbar-name%2FSKILL.md -->","skills/aria-progressbar-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-progressbar-name%2Freferences%2Frule.md -->","skills/aria-required-attr/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-attr%2FSKILL.md -->","skills/aria-required-attr/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-attr%2Freferences%2Frule.md -->","skills/aria-required-children/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-children%2FSKILL.md -->","skills/aria-required-children/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-children%2Freferences%2Frule.md -->","skills/aria-required-parent/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-parent%2FSKILL.md -->","skills/aria-required-parent/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-parent%2Freferences%2Frule.md -->","skills/aria-roles/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-roles%2FSKILL.md -->","skills/aria-roles/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-roles%2Freferences%2Frule.md -->","skills/aria-text/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-text%2FSKILL.md -->","skills/aria-text/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-text%2Freferences%2Frule.md -->","skills/aria-toggle-field-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-toggle-field-name%2FSKILL.md -->","skills/aria-toggle-field-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-toggle-field-name%2Freferences%2Frule.md -->","skills/aria-tooltip-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-tooltip-name%2FSKILL.md -->","skills/aria-tooltip-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-tooltip-name%2Freferences%2Frule.md -->","skills/aria-treeitem-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-treeitem-name%2FSKILL.md -->","skills/aria-treeitem-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-treeitem-name%2Freferences%2Frule.md -->","skills/aria-valid-attr-value/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr-value%2FSKILL.md -->","skills/aria-valid-attr-value/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr-value%2Freferences%2Frule.md -->","skills/aria-valid-attr/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr%2FSKILL.md -->","skills/aria-valid-attr/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr%2Freferences%2Frule.md -->","skills/article-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle-links%2FSKILL.md -->","skills/article-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle-links%2Freferences%2Frule.md -->","skills/article/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle%2FSKILL.md -->","skills/article/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle%2Freferences%2Frule.md -->","skills/audio-descriptions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faudio-descriptions%2FSKILL.md -->","skills/audio-descriptions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faudio-descriptions%2Freferences%2Frule.md -->","skills/author-byline/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-byline%2FSKILL.md -->","skills/author-byline/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-byline%2Freferences%2Frule.md -->","skills/author-expertise/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-expertise%2FSKILL.md -->","skills/author-expertise/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-expertise%2Freferences%2Frule.md -->","skills/author-info/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-info%2FSKILL.md -->","skills/author-info/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-info%2Freferences%2Frule.md -->","skills/autofocus-avoidance/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautofocus-avoidance%2FSKILL.md -->","skills/autofocus-avoidance/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautofocus-avoidance%2Freferences%2Frule.md -->","skills/autoplay-media/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautoplay-media%2FSKILL.md -->","skills/autoplay-media/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautoplay-media%2Freferences%2Frule.md -->","skills/avif-format/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favif-format%2FSKILL.md -->","skills/avif-format/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favif-format%2Freferences%2Frule.md -->","skills/avoid-eval/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favoid-eval%2FSKILL.md -->","skills/avoid-eval/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favoid-eval%2Freferences%2Frule.md -->","skills/back-forward-cache/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fback-forward-cache%2FSKILL.md -->","skills/back-forward-cache/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fback-forward-cache%2Freferences%2Frule.md -->","skills/blocked-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fblocked-links%2FSKILL.md -->","skills/blocked-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fblocked-links%2Freferences%2Frule.md -->","skills/breadcrumb-navigation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb-navigation%2FSKILL.md -->","skills/breadcrumb-navigation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb-navigation%2Freferences%2Frule.md -->","skills/breadcrumb/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb%2FSKILL.md -->","skills/breadcrumb/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb%2Freferences%2Frule.md -->","skills/broken-external-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-external-links%2FSKILL.md -->","skills/broken-external-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-external-links%2Freferences%2Frule.md -->","skills/broken-html/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-html%2FSKILL.md -->","skills/broken-html/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-html%2Freferences%2Frule.md -->","skills/broken-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-images%2FSKILL.md -->","skills/broken-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-images%2Freferences%2Frule.md -->","skills/broken-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-links%2FSKILL.md -->","skills/broken-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-links%2Freferences%2Frule.md -->","skills/browser-caching/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-caching%2FSKILL.md -->","skills/browser-caching/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-caching%2Freferences%2Frule.md -->","skills/browser-required/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-required%2FSKILL.md -->","skills/browser-required/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-required%2Freferences%2Frule.md -->","skills/button-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbutton-name%2FSKILL.md -->","skills/button-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbutton-name%2Freferences%2Frule.md -->","skills/canonical-chain/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-chain%2FSKILL.md -->","skills/canonical-chain/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-chain%2Freferences%2Frule.md -->","skills/canonical-header/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-header%2FSKILL.md -->","skills/canonical-header/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-header%2Freferences%2Frule.md -->","skills/canonical-url/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-url%2FSKILL.md -->","skills/canonical-url/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-url%2Freferences%2Frule.md -->","skills/carousel-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcarousel-accessibility%2FSKILL.md -->","skills/carousel-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcarousel-accessibility%2Freferences%2Frule.md -->","skills/cascade-layers/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcascade-layers%2FSKILL.md -->","skills/cascade-layers/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcascade-layers%2Freferences%2Frule.md -->","skills/cdn/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcdn%2FSKILL.md -->","skills/cdn/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcdn%2Freferences%2Frule.md -->","skills/charset/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcharset%2FSKILL.md -->","skills/charset/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcharset%2Freferences%2Frule.md -->","skills/citations/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcitations%2FSKILL.md -->","skills/citations/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcitations%2Freferences%2Frule.md -->","skills/clean-up-comments/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fclean-up-comments%2FSKILL.md -->","skills/clean-up-comments/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fclean-up-comments%2Freferences%2Frule.md -->","skills/code-splitting/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcode-splitting%2FSKILL.md -->","skills/code-splitting/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcode-splitting%2Freferences%2Frule.md -->","skills/color-contrast/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-contrast%2FSKILL.md -->","skills/color-contrast/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-contrast%2Freferences%2Frule.md -->","skills/color-oklch/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-oklch%2FSKILL.md -->","skills/color-oklch/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-oklch%2Freferences%2Frule.md -->","skills/compression/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcompression%2FSKILL.md -->","skills/compression/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcompression%2Freferences%2Frule.md -->","skills/consent-mode/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsent-mode%2FSKILL.md -->","skills/consent-mode/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsent-mode%2Freferences%2Frule.md -->","skills/consistent-help/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsistent-help%2FSKILL.md -->","skills/consistent-help/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsistent-help%2Freferences%2Frule.md -->","skills/console-cleanup/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsole-cleanup%2FSKILL.md -->","skills/console-cleanup/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsole-cleanup%2Freferences%2Frule.md -->","skills/const-let/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconst-let%2FSKILL.md -->","skills/const-let/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconst-let%2Freferences%2Frule.md -->","skills/contact-page/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontact-page%2FSKILL.md -->","skills/contact-page/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontact-page%2Freferences%2Frule.md -->","skills/container-queries/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontainer-queries%2FSKILL.md -->","skills/container-queries/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontainer-queries%2Freferences%2Frule.md -->","skills/content-dates/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-dates%2FSKILL.md -->","skills/content-dates/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-dates%2Freferences%2Frule.md -->","skills/content-security-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-security-policy%2FSKILL.md -->","skills/content-security-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-security-policy%2Freferences%2Frule.md -->","skills/content-without-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-without-css%2FSKILL.md -->","skills/content-without-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-without-css%2Freferences%2Frule.md -->","skills/contract-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontract-testing%2FSKILL.md -->","skills/contract-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontract-testing%2Freferences%2Frule.md -->","skills/cookie-consent/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcookie-consent%2FSKILL.md -->","skills/cookie-consent/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcookie-consent%2Freferences%2Frule.md -->","skills/critical-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-images%2FSKILL.md -->","skills/critical-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-images%2Freferences%2Frule.md -->","skills/critical-request-chains/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-request-chains%2FSKILL.md -->","skills/critical-request-chains/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-request-chains%2Freferences%2Frule.md -->","skills/cross-browser-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-browser-testing%2FSKILL.md -->","skills/cross-browser-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-browser-testing%2Freferences%2Frule.md -->","skills/cross-origin-isolation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-isolation%2FSKILL.md -->","skills/cross-origin-isolation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-isolation%2Freferences%2Frule.md -->","skills/cross-origin-security/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-security%2FSKILL.md -->","skills/cross-origin-security/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-security%2Freferences%2Frule.md -->","skills/css-at-property/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-at-property%2FSKILL.md -->","skills/css-at-property/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-at-property%2Freferences%2Frule.md -->","skills/css-containment/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-containment%2FSKILL.md -->","skills/css-containment/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-containment%2Freferences%2Frule.md -->","skills/css-critical/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-critical%2FSKILL.md -->","skills/css-critical/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-critical%2Freferences%2Frule.md -->","skills/css-custom-properties/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-custom-properties%2FSKILL.md -->","skills/css-custom-properties/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-custom-properties%2Freferences%2Frule.md -->","skills/css-file-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-file-size%2FSKILL.md -->","skills/css-file-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-file-size%2Freferences%2Frule.md -->","skills/css-grid/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-grid%2FSKILL.md -->","skills/css-grid/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-grid%2Freferences%2Frule.md -->","skills/css-minification/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-minification%2FSKILL.md -->","skills/css-minification/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-minification%2Freferences%2Frule.md -->","skills/css-non-blocking/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-non-blocking%2FSKILL.md -->","skills/css-non-blocking/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-non-blocking%2Freferences%2Frule.md -->","skills/css-order/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-order%2FSKILL.md -->","skills/css-order/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-order%2Freferences%2Frule.md -->","skills/css-print/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-print%2FSKILL.md -->","skills/css-print/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-print%2Freferences%2Frule.md -->","skills/cumulative-layout-shift/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcumulative-layout-shift%2FSKILL.md -->","skills/cumulative-layout-shift/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcumulative-layout-shift%2Freferences%2Frule.md -->","skills/currency-formatting/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcurrency-formatting%2FSKILL.md -->","skills/currency-formatting/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcurrency-formatting%2Freferences%2Frule.md -->","skills/custom-element-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcustom-element-accessibility%2FSKILL.md -->","skills/custom-element-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcustom-element-accessibility%2Freferences%2Frule.md -->","skills/dark-mode-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdark-mode-css%2FSKILL.md -->","skills/dark-mode-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdark-mode-css%2Freferences%2Frule.md -->","skills/data-minimisation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdata-minimisation%2FSKILL.md -->","skills/data-minimisation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdata-minimisation%2Freferences%2Frule.md -->","skills/dead-end-pages/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdead-end-pages%2FSKILL.md -->","skills/dead-end-pages/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdead-end-pages%2Freferences%2Frule.md -->","skills/debounce-throttle/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdebounce-throttle%2FSKILL.md -->","skills/debounce-throttle/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdebounce-throttle%2Freferences%2Frule.md -->","skills/decorative-elements/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdecorative-elements%2FSKILL.md -->","skills/decorative-elements/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdecorative-elements%2Freferences%2Frule.md -->","skills/defer-async/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefer-async%2FSKILL.md -->","skills/defer-async/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefer-async%2Freferences%2Frule.md -->","skills/definition-list/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefinition-list%2FSKILL.md -->","skills/definition-list/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefinition-list%2Freferences%2Frule.md -->","skills/dependency-audit/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdependency-audit%2FSKILL.md -->","skills/dependency-audit/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdependency-audit%2Freferences%2Frule.md -->","skills/dimensions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdimensions%2FSKILL.md -->","skills/dimensions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdimensions%2Freferences%2Frule.md -->","skills/direction-attribute/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdirection-attribute%2FSKILL.md -->","skills/direction-attribute/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdirection-attribute%2Freferences%2Frule.md -->","skills/disclaimers/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdisclaimers%2FSKILL.md -->","skills/disclaimers/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdisclaimers%2Freferences%2Frule.md -->","skills/dlitem/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdlitem%2FSKILL.md -->","skills/dlitem/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdlitem%2Freferences%2Frule.md -->","skills/doctype/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdoctype%2FSKILL.md -->","skills/doctype/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdoctype%2Freferences%2Frule.md -->","skills/dom-performance/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-performance%2FSKILL.md -->","skills/dom-performance/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-performance%2Freferences%2Frule.md -->","skills/dom-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-size%2FSKILL.md -->","skills/dom-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-size%2Freferences%2Frule.md -->","skills/draggable-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdraggable-accessibility%2FSKILL.md -->","skills/draggable-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdraggable-accessibility%2Freferences%2Frule.md -->","skills/duplicate-description/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-description%2FSKILL.md -->","skills/duplicate-description/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-description%2Freferences%2Frule.md -->","skills/duplicate-id-active/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-active%2FSKILL.md -->","skills/duplicate-id-active/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-active%2Freferences%2Frule.md -->","skills/duplicate-id-aria/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-aria%2FSKILL.md -->","skills/duplicate-id-aria/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-aria%2Freferences%2Frule.md -->","skills/duplicate-js/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-js%2FSKILL.md -->","skills/duplicate-js/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-js%2Freferences%2Frule.md -->","skills/e2e-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fe2e-testing%2FSKILL.md -->","skills/e2e-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fe2e-testing%2Freferences%2Frule.md -->","skills/editorial-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Feditorial-policy%2FSKILL.md -->","skills/editorial-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Feditorial-policy%2Freferences%2Frule.md -->","skills/element-hiding/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Felement-hiding%2FSKILL.md -->","skills/element-hiding/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Felement-hiding%2Freferences%2Frule.md -->","skills/embedded-or-inline-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fembedded-or-inline-css%2FSKILL.md -->","skills/embedded-or-inline-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fembedded-or-inline-css%2Freferences%2Frule.md -->","skills/empty-heading/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-heading%2FSKILL.md -->","skills/empty-heading/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-heading%2Freferences%2Frule.md -->","skills/empty-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-links%2FSKILL.md -->","skills/empty-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-links%2Freferences%2Frule.md -->","skills/error-handling/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-handling%2FSKILL.md -->","skills/error-handling/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-handling%2Freferences%2Frule.md -->","skills/error-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-images%2FSKILL.md -->","skills/error-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-images%2Freferences%2Frule.md -->","skills/error-monitoring/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-monitoring%2FSKILL.md -->","skills/error-monitoring/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-monitoring%2Freferences%2Frule.md -->","skills/es-modules/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fes-modules%2FSKILL.md -->","skills/es-modules/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fes-modules%2Freferences%2Frule.md -->","skills/event-delegation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fevent-delegation%2FSKILL.md -->","skills/event-delegation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fevent-delegation%2Freferences%2Frule.md -->","skills/external-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fexternal-links%2FSKILL.md -->","skills/external-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fexternal-links%2Freferences%2Frule.md -->","skills/faq/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffaq%2FSKILL.md -->","skills/faq/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffaq%2Freferences%2Frule.md -->","skills/favicon/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicon%2FSKILL.md -->","skills/favicon/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicon%2Freferences%2Frule.md -->","skills/favicons/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicons%2FSKILL.md -->","skills/favicons/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicons%2Freferences%2Frule.md -->","skills/fetchpriority-attribute/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffetchpriority-attribute%2FSKILL.md -->","skills/fetchpriority-attribute/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffetchpriority-attribute%2Freferences%2Frule.md -->","skills/figure-figcaption/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffigure-figcaption%2FSKILL.md -->","skills/figure-figcaption/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffigure-figcaption%2Freferences%2Frule.md -->","skills/file-upload-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffile-upload-accessibility%2FSKILL.md -->","skills/file-upload-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffile-upload-accessibility%2Freferences%2Frule.md -->","skills/filename-quality/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffilename-quality%2FSKILL.md -->","skills/filename-quality/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffilename-quality%2Freferences%2Frule.md -->","skills/find-npm-packages/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffind-npm-packages%2FSKILL.md -->","skills/first-contentful-paint/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffirst-contentful-paint%2FSKILL.md -->","skills/first-contentful-paint/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffirst-contentful-paint%2Freferences%2Frule.md -->","skills/flashing-content/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflashing-content%2FSKILL.md -->","skills/flashing-content/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflashing-content%2Freferences%2Frule.md -->","skills/flexbox-patterns/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflexbox-patterns%2FSKILL.md -->","skills/flexbox-patterns/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflexbox-patterns%2Freferences%2Frule.md -->","skills/focus-management/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-management%2FSKILL.md -->","skills/focus-management/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-management%2Freferences%2Frule.md -->","skills/focus-not-obscured/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-not-obscured%2FSKILL.md -->","skills/focus-not-obscured/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-not-obscured%2Freferences%2Frule.md -->","skills/focus-order/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-order%2FSKILL.md -->","skills/focus-order/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-order%2Freferences%2Frule.md -->","skills/focus-styles/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-styles%2FSKILL.md -->","skills/focus-styles/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-styles%2Freferences%2Frule.md -->","skills/font-loading/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-loading%2FSKILL.md -->","skills/font-loading/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-loading%2Freferences%2Frule.md -->","skills/font-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-size%2FSKILL.md -->","skills/font-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-size%2Freferences%2Frule.md -->","skills/form-captcha/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-captcha%2FSKILL.md -->","skills/form-captcha/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-captcha%2Freferences%2Frule.md -->","skills/form-field-multiple-labels/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-field-multiple-labels%2FSKILL.md -->","skills/form-field-multiple-labels/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-field-multiple-labels%2Freferences%2Frule.md -->","skills/form-https/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-https%2FSKILL.md -->","skills/form-https/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-https%2Freferences%2Frule.md -->","skills/form-labels/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-labels%2FSKILL.md -->","skills/form-labels/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-labels%2Freferences%2Frule.md -->","skills/form-validation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-validation%2FSKILL.md -->","skills/form-validation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-validation%2Freferences%2Frule.md -->","skills/frame-title/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fframe-title%2FSKILL.md -->","skills/frame-title/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fframe-title%2Freferences%2Frule.md -->","skills/freshness/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffreshness%2FSKILL.md -->","skills/freshness/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffreshness%2Freferences%2Frule.md -->","skills/frontend-checklist-global/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffrontend-checklist-global%2FSKILL.md -->","skills/frontend-checklist-global/references/categories.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffrontend-checklist-global%2Freferences%2Fcategories.md -->","skills/geo-meta/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgeo-meta%2FSKILL.md -->","skills/geo-meta/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgeo-meta%2Freferences%2Frule.md -->","skills/gtm-present/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgtm-present%2FSKILL.md -->","skills/gtm-present/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgtm-present%2Freferences%2Frule.md -->","skills/h1/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fh1%2FSKILL.md -->","skills/h1/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fh1%2Freferences%2Frule.md -->","skills/has-selector/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhas-selector%2FSKILL.md -->","skills/has-selector/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhas-selector%2Freferences%2Frule.md -->","skills/heading-hierarchy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-hierarchy%2FSKILL.md -->","skills/heading-hierarchy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-hierarchy%2Freferences%2Frule.md -->","skills/heading-order/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-order%2FSKILL.md -->","skills/heading-order/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-order%2Freferences%2Frule.md -->","skills/horizontal-scroll/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhorizontal-scroll%2FSKILL.md -->","skills/horizontal-scroll/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhorizontal-scroll%2Freferences%2Frule.md -->","skills/hreflang/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhreflang%2FSKILL.md -->","skills/hreflang/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhreflang%2Freferences%2Frule.md -->","skills/hsts/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhsts%2FSKILL.md -->","skills/hsts/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhsts%2Freferences%2Frule.md -->","skills/html-resource-hints/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-resource-hints%2FSKILL.md -->","skills/html-resource-hints/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-resource-hints%2Freferences%2Frule.md -->","skills/html-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-size%2FSKILL.md -->","skills/html-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-size%2Freferences%2Frule.md -->","skills/html-xml-lang-mismatch/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-xml-lang-mismatch%2FSKILL.md -->","skills/html-xml-lang-mismatch/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-xml-lang-mismatch%2Freferences%2Frule.md -->","skills/html5-semantic-elements/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml5-semantic-elements%2FSKILL.md -->","skills/html5-semantic-elements/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml5-semantic-elements%2Freferences%2Frule.md -->","skills/http-requests/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-requests%2FSKILL.md -->","skills/http-requests/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-requests%2Freferences%2Frule.md -->","skills/http-to-https/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-to-https%2FSKILL.md -->","skills/http-to-https/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-to-https%2Freferences%2Frule.md -->","skills/http2/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp2%2FSKILL.md -->","skills/http2/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp2%2Freferences%2Frule.md -->","skills/https-downgrade/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps-downgrade%2FSKILL.md -->","skills/https-downgrade/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps-downgrade%2Freferences%2Frule.md -->","skills/https/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps%2FSKILL.md -->","skills/https/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps%2Freferences%2Frule.md -->","skills/hyphens/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhyphens%2FSKILL.md -->","skills/hyphens/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhyphens%2Freferences%2Frule.md -->","skills/identical-links-same-purpose/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fidentical-links-same-purpose%2FSKILL.md -->","skills/identical-links-same-purpose/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fidentical-links-same-purpose%2Freferences%2Frule.md -->","skills/image-cdn/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-cdn%2FSKILL.md -->","skills/image-cdn/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-cdn%2Freferences%2Frule.md -->","skills/image-compression/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-compression%2FSKILL.md -->","skills/image-compression/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-compression%2Freferences%2Frule.md -->","skills/image-file-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-file-size%2FSKILL.md -->","skills/image-file-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-file-size%2Freferences%2Frule.md -->","skills/image-optimization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-optimization%2FSKILL.md -->","skills/image-optimization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-optimization%2Freferences%2Frule.md -->","skills/image-redundant-alt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-redundant-alt%2FSKILL.md -->","skills/image-redundant-alt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-redundant-alt%2Freferences%2Frule.md -->","skills/immutable-patterns/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimmutable-patterns%2FSKILL.md -->","skills/immutable-patterns/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimmutable-patterns%2Freferences%2Frule.md -->","skills/import-on-interaction/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-interaction%2FSKILL.md -->","skills/import-on-interaction/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-interaction%2Freferences%2Frule.md -->","skills/import-on-visibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-visibility%2FSKILL.md -->","skills/import-on-visibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-visibility%2Freferences%2Frule.md -->","skills/improve-rule/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimprove-rule%2FSKILL.md -->","skills/improve-rule/references/scoring-rubric.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimprove-rule%2Freferences%2Fscoring-rubric.md -->","skills/inclusive-language/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finclusive-language%2FSKILL.md -->","skills/inclusive-language/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finclusive-language%2Freferences%2Frule.md -->","skills/indexability-conflicts/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability-conflicts%2FSKILL.md -->","skills/indexability-conflicts/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability-conflicts%2Freferences%2Frule.md -->","skills/indexability/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability%2FSKILL.md -->","skills/indexability/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability%2Freferences%2Frule.md -->","skills/input-image-alt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-image-alt%2FSKILL.md -->","skills/input-image-alt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-image-alt%2Freferences%2Frule.md -->","skills/input-types/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-types%2FSKILL.md -->","skills/input-types/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-types%2Freferences%2Frule.md -->","skills/integration-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fintegration-testing%2FSKILL.md -->","skills/integration-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fintegration-testing%2Freferences%2Frule.md -->","skills/interaction-to-next-paint/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finteraction-to-next-paint%2FSKILL.md -->","skills/interaction-to-next-paint/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finteraction-to-next-paint%2Freferences%2Frule.md -->","skills/internal-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finternal-links%2FSKILL.md -->","skills/internal-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finternal-links%2Freferences%2Frule.md -->","skills/interstitials/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finterstitials%2FSKILL.md -->","skills/interstitials/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finterstitials%2Freferences%2Frule.md -->","skills/invalid-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finvalid-links%2FSKILL.md -->","skills/invalid-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finvalid-links%2Freferences%2Frule.md -->","skills/javascript-inline/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-inline%2FSKILL.md -->","skills/javascript-inline/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-inline%2Freferences%2Frule.md -->","skills/javascript-linter/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-linter%2FSKILL.md -->","skills/javascript-linter/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-linter%2Freferences%2Frule.md -->","skills/javascript-minification/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-minification%2FSKILL.md -->","skills/javascript-minification/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-minification%2Freferences%2Frule.md -->","skills/js-file-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-file-size%2FSKILL.md -->","skills/js-file-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-file-size%2Freferences%2Frule.md -->","skills/js-libraries/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-libraries%2FSKILL.md -->","skills/js-libraries/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-libraries%2Freferences%2Frule.md -->","skills/js-redirects/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-redirects%2FSKILL.md -->","skills/js-redirects/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-redirects%2Freferences%2Frule.md -->","skills/json-ld-valid/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-ld-valid%2FSKILL.md -->","skills/json-ld-valid/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-ld-valid%2Freferences%2Frule.md -->","skills/json-safety/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-safety%2FSKILL.md -->","skills/json-safety/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-safety%2Freferences%2Frule.md -->","skills/keyboard-navigation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyboard-navigation%2FSKILL.md -->","skills/keyboard-navigation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyboard-navigation%2Freferences%2Frule.md -->","skills/keyword-stuffing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyword-stuffing%2FSKILL.md -->","skills/keyword-stuffing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyword-stuffing%2Freferences%2Frule.md -->","skills/label-content-name-mismatch/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flabel-content-name-mismatch%2FSKILL.md -->","skills/label-content-name-mismatch/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flabel-content-name-mismatch%2Freferences%2Frule.md -->","skills/landmark-one-main/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-one-main%2FSKILL.md -->","skills/landmark-one-main/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-one-main%2Freferences%2Frule.md -->","skills/landmark-regions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-regions%2FSKILL.md -->","skills/landmark-regions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-regions%2Freferences%2Frule.md -->","skills/lang-attribute/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flang-attribute%2FSKILL.md -->","skills/lang-attribute/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flang-attribute%2Freferences%2Frule.md -->","skills/largest-contentful-paint/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flargest-contentful-paint%2FSKILL.md -->","skills/largest-contentful-paint/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flargest-contentful-paint%2Freferences%2Frule.md -->","skills/lazy-above-fold/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-above-fold%2FSKILL.md -->","skills/lazy-above-fold/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-above-fold%2Freferences%2Frule.md -->","skills/lazy-loading/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-loading%2FSKILL.md -->","skills/lazy-loading/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-loading%2Freferences%2Frule.md -->","skills/leaked-secrets/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fleaked-secrets%2FSKILL.md -->","skills/leaked-secrets/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fleaked-secrets%2Freferences%2Frule.md -->","skills/legacy-js/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flegacy-js%2FSKILL.md -->","skills/legacy-js/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flegacy-js%2Freferences%2Frule.md -->","skills/length/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flength%2FSKILL.md -->","skills/length/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flength%2Freferences%2Frule.md -->","skills/link-checker/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-checker%2FSKILL.md -->","skills/link-checker/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-checker%2Freferences%2Frule.md -->","skills/link-in-text-block/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-in-text-block%2FSKILL.md -->","skills/link-in-text-block/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-in-text-block%2Freferences%2Frule.md -->","skills/link-text/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-text%2FSKILL.md -->","skills/link-text/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-text%2Freferences%2Frule.md -->","skills/list-structure/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-structure%2FSKILL.md -->","skills/list-structure/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-structure%2Freferences%2Frule.md -->","skills/list-virtualization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-virtualization%2FSKILL.md -->","skills/list-virtualization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-virtualization%2Freferences%2Frule.md -->","skills/listitem/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flistitem%2FSKILL.md -->","skills/listitem/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flistitem%2Freferences%2Frule.md -->","skills/llm-parsability/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllm-parsability%2FSKILL.md -->","skills/llm-parsability/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllm-parsability%2Freferences%2Frule.md -->","skills/llms-txt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllms-txt%2FSKILL.md -->","skills/llms-txt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllms-txt%2Freferences%2Frule.md -->","skills/loading-indicators/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Floading-indicators%2FSKILL.md -->","skills/loading-indicators/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Floading-indicators%2Freferences%2Frule.md -->","skills/local-business/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocal-business%2FSKILL.md -->","skills/local-business/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocal-business%2Freferences%2Frule.md -->","skills/locale-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocale-images%2FSKILL.md -->","skills/locale-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocale-images%2Freferences%2Frule.md -->","skills/logical-properties/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flogical-properties%2FSKILL.md -->","skills/logical-properties/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flogical-properties%2Freferences%2Frule.md -->","skills/lowercase/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flowercase%2FSKILL.md -->","skills/lowercase/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flowercase%2Freferences%2Frule.md -->","skills/memory-leaks/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmemory-leaks%2FSKILL.md -->","skills/memory-leaks/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmemory-leaks%2Freferences%2Frule.md -->","skills/meta-description/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-description%2FSKILL.md -->","skills/meta-description/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-description%2Freferences%2Frule.md -->","skills/meta-in-body/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-in-body%2FSKILL.md -->","skills/meta-in-body/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-in-body%2Freferences%2Frule.md -->","skills/meta-refresh/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-refresh%2FSKILL.md -->","skills/meta-refresh/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-refresh%2Freferences%2Frule.md -->","skills/meta-title/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-title%2FSKILL.md -->","skills/meta-title/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-title%2Freferences%2Frule.md -->","skills/mime-type/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmime-type%2FSKILL.md -->","skills/mime-type/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmime-type%2Freferences%2Frule.md -->","skills/mixed-content/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmixed-content%2FSKILL.md -->","skills/mixed-content/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmixed-content%2Freferences%2Frule.md -->","skills/mobile-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmobile-testing%2FSKILL.md -->","skills/mobile-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmobile-testing%2Freferences%2Frule.md -->","skills/mock-best-practices/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmock-best-practices%2FSKILL.md -->","skills/mock-best-practices/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmock-best-practices%2Freferences%2Frule.md -->","skills/modal-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodal-accessibility%2FSKILL.md -->","skills/modal-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodal-accessibility%2Freferences%2Frule.md -->","skills/modern-array-methods/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-array-methods%2FSKILL.md -->","skills/modern-array-methods/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-array-methods%2Freferences%2Frule.md -->","skills/modern-format/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-format%2FSKILL.md -->","skills/modern-format/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-format%2Freferences%2Frule.md -->","skills/mutation-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmutation-testing%2FSKILL.md -->","skills/mutation-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmutation-testing%2Freferences%2Frule.md -->","skills/naming-conventions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnaming-conventions%2FSKILL.md -->","skills/naming-conventions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnaming-conventions%2Freferences%2Frule.md -->","skills/nap-consistency/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnap-consistency%2FSKILL.md -->","skills/nap-consistency/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnap-consistency%2Freferences%2Frule.md -->","skills/navigation-landmark/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnavigation-landmark%2FSKILL.md -->","skills/navigation-landmark/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnavigation-landmark%2Freferences%2Frule.md -->","skills/new-tab/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnew-tab%2FSKILL.md -->","skills/new-tab/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnew-tab%2Freferences%2Frule.md -->","skills/no-explicit-any/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-explicit-any%2FSKILL.md -->","skills/no-explicit-any/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-explicit-any%2Freferences%2Frule.md -->","skills/no-unchecked-indexed-access/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-unchecked-indexed-access%2FSKILL.md -->","skills/no-unchecked-indexed-access/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-unchecked-indexed-access%2Freferences%2Frule.md -->","skills/nofollow-internal/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnofollow-internal%2FSKILL.md -->","skills/nofollow-internal/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnofollow-internal%2Freferences%2Frule.md -->","skills/noindex-in-sitemap/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoindex-in-sitemap%2FSKILL.md -->","skills/noindex-in-sitemap/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoindex-in-sitemap%2Freferences%2Frule.md -->","skills/noscript-tag/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoscript-tag%2FSKILL.md -->","skills/noscript-tag/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoscript-tag%2Freferences%2Frule.md -->","skills/nosnippet/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnosnippet%2FSKILL.md -->","skills/nosnippet/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnosnippet%2Freferences%2Frule.md -->","skills/object-alt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fobject-alt%2FSKILL.md -->","skills/object-alt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fobject-alt%2Freferences%2Frule.md -->","skills/offline-fallback/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffline-fallback%2FSKILL.md -->","skills/offline-fallback/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffline-fallback%2Freferences%2Frule.md -->","skills/offscreen-lazy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffscreen-lazy%2FSKILL.md -->","skills/offscreen-lazy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffscreen-lazy%2Freferences%2Frule.md -->","skills/og-image-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-image-size%2FSKILL.md -->","skills/og-image-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-image-size%2Freferences%2Frule.md -->","skills/og-tags/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-tags%2FSKILL.md -->","skills/og-tags/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-tags%2Freferences%2Frule.md -->","skills/og-url-match/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-url-match%2FSKILL.md -->","skills/og-url-match/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-url-match%2Freferences%2Frule.md -->","skills/optimized/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foptimized%2FSKILL.md -->","skills/optimized/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foptimized%2Freferences%2Frule.md -->","skills/organization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forganization%2FSKILL.md -->","skills/organization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forganization%2Freferences%2Frule.md -->","skills/orientation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forientation%2FSKILL.md -->","skills/orientation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forientation%2Freferences%2Frule.md -->","skills/orphan-pages/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forphan-pages%2FSKILL.md -->","skills/orphan-pages/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forphan-pages%2Freferences%2Frule.md -->","skills/page-load-time/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-load-time%2FSKILL.md -->","skills/page-load-time/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-load-time%2Freferences%2Frule.md -->","skills/page-weight/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-weight%2FSKILL.md -->","skills/page-weight/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-weight%2Freferences%2Frule.md -->","skills/pagination-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination-accessibility%2FSKILL.md -->","skills/pagination-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination-accessibility%2Freferences%2Frule.md -->","skills/pagination/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination%2FSKILL.md -->","skills/pagination/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination%2Freferences%2Frule.md -->","skills/parallax-effects/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparallax-effects%2FSKILL.md -->","skills/parallax-effects/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparallax-effects%2Freferences%2Frule.md -->","skills/parameters/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparameters%2FSKILL.md -->","skills/parameters/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparameters%2Freferences%2Frule.md -->","skills/password-field-security/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpassword-field-security%2FSKILL.md -->","skills/password-field-security/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpassword-field-security%2Freferences%2Frule.md -->","skills/paste-inputs/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpaste-inputs%2FSKILL.md -->","skills/paste-inputs/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpaste-inputs%2Freferences%2Frule.md -->","skills/pdf-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpdf-size%2FSKILL.md -->","skills/pdf-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpdf-size%2Freferences%2Frule.md -->","skills/performance-budget/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-budget%2FSKILL.md -->","skills/performance-budget/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-budget%2Freferences%2Frule.md -->","skills/performance-resource-hints/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-resource-hints%2FSKILL.md -->","skills/performance-resource-hints/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-resource-hints%2Freferences%2Frule.md -->","skills/permissions-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpermissions-policy%2FSKILL.md -->","skills/permissions-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpermissions-policy%2Freferences%2Frule.md -->","skills/physical-address/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fphysical-address%2FSKILL.md -->","skills/physical-address/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fphysical-address%2Freferences%2Frule.md -->","skills/picture-element/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpicture-element%2FSKILL.md -->","skills/picture-element/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpicture-element%2Freferences%2Frule.md -->","skills/plain-language/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fplain-language%2FSKILL.md -->","skills/plain-language/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fplain-language%2Freferences%2Frule.md -->","skills/pluralization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpluralization%2FSKILL.md -->","skills/pluralization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpluralization%2Freferences%2Frule.md -->","skills/preconnect/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpreconnect%2FSKILL.md -->","skills/preconnect/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpreconnect%2Freferences%2Frule.md -->","skills/privacy-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprivacy-policy%2FSKILL.md -->","skills/privacy-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprivacy-policy%2Freferences%2Frule.md -->","skills/product/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fproduct%2FSKILL.md -->","skills/product/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fproduct%2Freferences%2Frule.md -->","skills/progressive-jpeg/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprogressive-jpeg%2FSKILL.md -->","skills/progressive-jpeg/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprogressive-jpeg%2Freferences%2Frule.md -->","skills/pwa-installability/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpwa-installability%2FSKILL.md -->","skills/pwa-installability/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpwa-installability%2Freferences%2Frule.md -->","skills/quality/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fquality%2FSKILL.md -->","skills/quality/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fquality%2Freferences%2Frule.md -->","skills/reading-level/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freading-level%2FSKILL.md -->","skills/reading-level/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freading-level%2Freferences%2Frule.md -->","skills/redirect-chain/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chain%2FSKILL.md -->","skills/redirect-chain/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chain%2Freferences%2Frule.md -->","skills/redirect-chains/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chains%2FSKILL.md -->","skills/redirect-chains/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chains%2Freferences%2Frule.md -->","skills/reduced-motion/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freduced-motion%2FSKILL.md -->","skills/reduced-motion/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freduced-motion%2Freferences%2Frule.md -->","skills/redundant-entry/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredundant-entry%2FSKILL.md -->","skills/redundant-entry/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredundant-entry%2Freferences%2Frule.md -->","skills/referrer-policy/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freferrer-policy%2FSKILL.md -->","skills/referrer-policy/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freferrer-policy%2Freferences%2Frule.md -->","skills/render-blocking/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frender-blocking%2FSKILL.md -->","skills/render-blocking/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frender-blocking%2Freferences%2Frule.md -->","skills/reset-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freset-css%2FSKILL.md -->","skills/reset-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freset-css%2Freferences%2Frule.md -->","skills/resource-hints/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresource-hints%2FSKILL.md -->","skills/resource-hints/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresource-hints%2Freferences%2Frule.md -->","skills/responsive-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-images%2FSKILL.md -->","skills/responsive-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-images%2Freferences%2Frule.md -->","skills/responsive-size/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-size%2FSKILL.md -->","skills/responsive-size/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-size%2Freferences%2Frule.md -->","skills/responsive-units/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-units%2FSKILL.md -->","skills/responsive-units/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-units%2Freferences%2Frule.md -->","skills/retina-display/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fretina-display%2FSKILL.md -->","skills/retina-display/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fretina-display%2Freferences%2Frule.md -->","skills/review/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freview%2FSKILL.md -->","skills/review/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freview%2Freferences%2Frule.md -->","skills/right-to-erasure/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fright-to-erasure%2FSKILL.md -->","skills/right-to-erasure/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fright-to-erasure%2Freferences%2Frule.md -->","skills/robots-meta-conflict/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta-conflict%2FSKILL.md -->","skills/robots-meta-conflict/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta-conflict%2Freferences%2Frule.md -->","skills/robots-meta/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta%2FSKILL.md -->","skills/robots-meta/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta%2Freferences%2Frule.md -->","skills/robots-txt/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-txt%2FSKILL.md -->","skills/robots-txt/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-txt%2Freferences%2Frule.md -->","skills/runtime-validation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fruntime-validation%2FSKILL.md -->","skills/runtime-validation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fruntime-validation%2Freferences%2Frule.md -->","skills/scheduler-yield/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscheduler-yield%2FSKILL.md -->","skills/scheduler-yield/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscheduler-yield%2Freferences%2Frule.md -->","skills/schema-noindex-conflict/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fschema-noindex-conflict%2FSKILL.md -->","skills/schema-noindex-conflict/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fschema-noindex-conflict%2Freferences%2Frule.md -->","skills/screen-reader-testing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscreen-reader-testing%2FSKILL.md -->","skills/screen-reader-testing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscreen-reader-testing%2Freferences%2Frule.md -->","skills/scrolljacking/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscrolljacking%2FSKILL.md -->","skills/scrolljacking/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscrolljacking%2Freferences%2Frule.md -->","skills/search-input/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsearch-input%2FSKILL.md -->","skills/search-input/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsearch-input%2Freferences%2Frule.md -->","skills/select-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fselect-name%2FSKILL.md -->","skills/select-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fselect-name%2Freferences%2Frule.md -->","skills/semantic-lists/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsemantic-lists%2FSKILL.md -->","skills/semantic-lists/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsemantic-lists%2Freferences%2Frule.md -->","skills/sensory-instructions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsensory-instructions%2FSKILL.md -->","skills/sensory-instructions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsensory-instructions%2Freferences%2Frule.md -->","skills/service-area/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-area%2FSKILL.md -->","skills/service-area/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-area%2Freferences%2Frule.md -->","skills/service-worker/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-worker%2FSKILL.md -->","skills/service-worker/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-worker%2Freferences%2Frule.md -->","skills/session-cookie-flags/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-cookie-flags%2FSKILL.md -->","skills/session-cookie-flags/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-cookie-flags%2Freferences%2Frule.md -->","skills/session-timeout-recovery/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-timeout-recovery%2FSKILL.md -->","skills/session-timeout-recovery/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-timeout-recovery%2Freferences%2Frule.md -->","skills/share-buttons/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fshare-buttons%2FSKILL.md -->","skills/share-buttons/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fshare-buttons%2Freferences%2Frule.md -->","skills/sitemap-4xx/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-4xx%2FSKILL.md -->","skills/sitemap-4xx/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-4xx%2Freferences%2Frule.md -->","skills/sitemap-coverage/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-coverage%2FSKILL.md -->","skills/sitemap-coverage/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-coverage%2Freferences%2Frule.md -->","skills/sitemap-domain/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-domain%2FSKILL.md -->","skills/sitemap-domain/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-domain%2Freferences%2Frule.md -->","skills/sitemap-valid/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-valid%2FSKILL.md -->","skills/sitemap-valid/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-valid%2Freferences%2Frule.md -->","skills/sitemap/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap%2FSKILL.md -->","skills/sitemap/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap%2Freferences%2Frule.md -->","skills/skip-link/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-link%2FSKILL.md -->","skills/skip-link/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-link%2Freferences%2Frule.md -->","skills/skip-navigation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-navigation%2FSKILL.md -->","skills/skip-navigation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-navigation%2Freferences%2Frule.md -->","skills/slug-keywords/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fslug-keywords%2FSKILL.md -->","skills/slug-keywords/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fslug-keywords%2Freferences%2Frule.md -->","skills/social-profiles/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsocial-profiles%2FSKILL.md -->","skills/social-profiles/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsocial-profiles%2Freferences%2Frule.md -->","skills/source-maps/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsource-maps%2FSKILL.md -->","skills/source-maps/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsource-maps%2Freferences%2Frule.md -->","skills/special-chars/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecial-chars%2FSKILL.md -->","skills/special-chars/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecial-chars%2Freferences%2Frule.md -->","skills/specificity-management/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecificity-management%2FSKILL.md -->","skills/specificity-management/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecificity-management%2Freferences%2Frule.md -->","skills/speculation-rules/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspeculation-rules%2FSKILL.md -->","skills/speculation-rules/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspeculation-rules%2Freferences%2Frule.md -->","skills/sprite-generation/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsprite-generation%2FSKILL.md -->","skills/sprite-generation/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsprite-generation%2Freferences%2Frule.md -->","skills/srcset/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsrcset%2FSKILL.md -->","skills/srcset/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsrcset%2Freferences%2Frule.md -->","skills/stack-trace-exposure/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstack-trace-exposure%2FSKILL.md -->","skills/stack-trace-exposure/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstack-trace-exposure%2Freferences%2Frule.md -->","skills/stop-words/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstop-words%2FSKILL.md -->","skills/stop-words/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstop-words%2Freferences%2Frule.md -->","skills/streaming-html/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstreaming-html%2FSKILL.md -->","skills/streaming-html/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstreaming-html%2Freferences%2Frule.md -->","skills/structured-data/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstructured-data%2FSKILL.md -->","skills/structured-data/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstructured-data%2Freferences%2Frule.md -->","skills/styles-lint/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstyles-lint%2FSKILL.md -->","skills/styles-lint/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstyles-lint%2Freferences%2Frule.md -->","skills/subgrid/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubgrid%2FSKILL.md -->","skills/subgrid/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubgrid%2Freferences%2Frule.md -->","skills/subresource-integrity/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubresource-integrity%2FSKILL.md -->","skills/subresource-integrity/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubresource-integrity%2Freferences%2Frule.md -->","skills/svg-inline/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-inline%2FSKILL.md -->","skills/svg-inline/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-inline%2Freferences%2Frule.md -->","skills/svg-optimization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-optimization%2FSKILL.md -->","skills/svg-optimization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-optimization%2Freferences%2Frule.md -->","skills/tabindex/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabindex%2FSKILL.md -->","skills/tabindex/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabindex%2Freferences%2Frule.md -->","skills/table-duplicate-name/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-duplicate-name%2FSKILL.md -->","skills/table-duplicate-name/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-duplicate-name%2Freferences%2Frule.md -->","skills/table-headers/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-headers%2FSKILL.md -->","skills/table-headers/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-headers%2Freferences%2Frule.md -->","skills/tabs-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabs-accessibility%2FSKILL.md -->","skills/tabs-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabs-accessibility%2Freferences%2Frule.md -->","skills/td-headers-attr/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftd-headers-attr%2FSKILL.md -->","skills/td-headers-attr/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftd-headers-attr%2Freferences%2Frule.md -->","skills/tel-mailto/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftel-mailto%2FSKILL.md -->","skills/tel-mailto/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftel-mailto%2Freferences%2Frule.md -->","skills/terms-of-service/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fterms-of-service%2FSKILL.md -->","skills/terms-of-service/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fterms-of-service%2Freferences%2Frule.md -->","skills/test-coverage/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftest-coverage%2FSKILL.md -->","skills/test-coverage/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftest-coverage%2Freferences%2Frule.md -->","skills/text-expansion/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-expansion%2FSKILL.md -->","skills/text-expansion/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-expansion%2Freferences%2Frule.md -->","skills/text-in-images/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-in-images%2FSKILL.md -->","skills/text-in-images/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-in-images%2Freferences%2Frule.md -->","skills/text-resizing/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-resizing%2FSKILL.md -->","skills/text-resizing/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-resizing%2Freferences%2Frule.md -->","skills/th-has-data-cells/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fth-has-data-cells%2FSKILL.md -->","skills/th-has-data-cells/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fth-has-data-cells%2Freferences%2Frule.md -->","skills/third-party-cookies/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-cookies%2FSKILL.md -->","skills/third-party-cookies/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-cookies%2Freferences%2Frule.md -->","skills/third-party-scripts/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-scripts%2FSKILL.md -->","skills/third-party-scripts/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-scripts%2Freferences%2Frule.md -->","skills/title-unique/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftitle-unique%2FSKILL.md -->","skills/title-unique/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftitle-unique%2Freferences%2Frule.md -->","skills/token-storage-security/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftoken-storage-security%2FSKILL.md -->","skills/token-storage-security/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftoken-storage-security%2Freferences%2Frule.md -->","skills/touch-targets/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftouch-targets%2FSKILL.md -->","skills/touch-targets/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftouch-targets%2Freferences%2Frule.md -->","skills/trailing-slash/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrailing-slash%2FSKILL.md -->","skills/trailing-slash/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrailing-slash%2Freferences%2Frule.md -->","skills/translation-strings/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftranslation-strings%2FSKILL.md -->","skills/translation-strings/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftranslation-strings%2Freferences%2Frule.md -->","skills/trust-signals/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrust-signals%2FSKILL.md -->","skills/trust-signals/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrust-signals%2Freferences%2Frule.md -->","skills/ttfb/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fttfb%2FSKILL.md -->","skills/ttfb/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fttfb%2Freferences%2Frule.md -->","skills/twitter-cards/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftwitter-cards%2FSKILL.md -->","skills/twitter-cards/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftwitter-cards%2Freferences%2Frule.md -->","skills/type-coercion/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-coercion%2FSKILL.md -->","skills/type-coercion/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-coercion%2Freferences%2Frule.md -->","skills/type-only-imports/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-only-imports%2FSKILL.md -->","skills/type-only-imports/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-only-imports%2Freferences%2Frule.md -->","skills/typescript-strict-mode/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftypescript-strict-mode%2FSKILL.md -->","skills/typescript-strict-mode/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftypescript-strict-mode%2Freferences%2Frule.md -->","skills/unique-id/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funique-id%2FSKILL.md -->","skills/unique-id/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funique-id%2Freferences%2Frule.md -->","skills/unit-tests/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funit-tests%2FSKILL.md -->","skills/unit-tests/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funit-tests%2Freferences%2Frule.md -->","skills/unused-css/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funused-css%2FSKILL.md -->","skills/unused-css/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funused-css%2Freferences%2Frule.md -->","skills/video-accessibility/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-accessibility%2FSKILL.md -->","skills/video-accessibility/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-accessibility%2Freferences%2Frule.md -->","skills/video-captions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-captions%2FSKILL.md -->","skills/video-captions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-captions%2Freferences%2Frule.md -->","skills/video-optimization/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-optimization%2FSKILL.md -->","skills/video-optimization/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-optimization%2Freferences%2Frule.md -->","skills/video-thumbnail/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-thumbnail%2FSKILL.md -->","skills/video-thumbnail/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-thumbnail%2Freferences%2Frule.md -->","skills/video/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo%2FSKILL.md -->","skills/video/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo%2Freferences%2Frule.md -->","skills/view-transitions/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fview-transitions%2FSKILL.md -->","skills/view-transitions/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fview-transitions%2Freferences%2Frule.md -->","skills/viewport-zoom/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport-zoom%2FSKILL.md -->","skills/viewport-zoom/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport-zoom%2Freferences%2Frule.md -->","skills/viewport/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport%2FSKILL.md -->","skills/viewport/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport%2Freferences%2Frule.md -->","skills/visual-regression/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvisual-regression%2FSKILL.md -->","skills/visual-regression/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvisual-regression%2Freferences%2Frule.md -->","skills/w3c-compliant/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fw3c-compliant%2FSKILL.md -->","skills/w3c-compliant/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fw3c-compliant%2Freferences%2Frule.md -->","skills/weak-internal-links/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweak-internal-links%2FSKILL.md -->","skills/weak-internal-links/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweak-internal-links%2Freferences%2Frule.md -->","skills/web-app-manifest/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-app-manifest%2FSKILL.md -->","skills/web-app-manifest/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-app-manifest%2Freferences%2Frule.md -->","skills/web-storage/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-storage%2FSKILL.md -->","skills/web-storage/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-storage%2Freferences%2Frule.md -->","skills/webfont-format/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebfont-format%2FSKILL.md -->","skills/webfont-format/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebfont-format%2Freferences%2Frule.md -->","skills/webp-format/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebp-format%2FSKILL.md -->","skills/webp-format/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebp-format%2Freferences%2Frule.md -->","skills/webpagetest/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebpagetest%2FSKILL.md -->","skills/webpagetest/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebpagetest%2Freferences%2Frule.md -->","skills/website-search/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebsite-search%2FSKILL.md -->","skills/website-search/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebsite-search%2Freferences%2Frule.md -->","skills/word-count/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fword-count%2FSKILL.md -->","skills/word-count/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fword-count%2Freferences%2Frule.md -->","skills/x-content-type/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-content-type%2FSKILL.md -->","skills/x-content-type/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-content-type%2Freferences%2Frule.md -->","skills/x-frame-options/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-frame-options%2FSKILL.md -->","skills/x-frame-options/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-frame-options%2Freferences%2Frule.md -->","skills/ymyl-detection/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fymyl-detection%2FSKILL.md -->","skills/ymyl-detection/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fymyl-detection%2Freferences%2Frule.md -->","skills/zoom-reflow/SKILL.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fzoom-reflow%2FSKILL.md -->","skills/zoom-reflow/references/rule.md":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fzoom-reflow%2Freferences%2Frule.md -->"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# AGENTS.md — Front-End Checklist\n\nRepository rules and conventions for contributors and automation tools.\n\n## Project Overview\n\n**Front-End Checklist** is an open-source monorepo providing 385 quality-gated frontend best practice rules with an MCP server for structured review workflows.\n\n- **MCP Server**: `https://mcp.frontendchecklist.io` (11 tools)\n- **Rules**: `packages/content/rules/en/<category>/<slug>.mdx`\n- **Web App**: `apps/web/` (Next.js App Router)\n- **MCP Package**: `packages/mcp/` (TypeScript)\n- **Package Manager**: pnpm (workspaces + Turborepo)\n\n## Work Tracking\n\nWork in this repo is tracked in Paperclip project **FEC** (Front-End Checklist, id `c5edfe8f-731b-43e8-b805-c52999831084`). New tickets get the `DAV-` prefix.\n\n## MCP Usage\n\nWhen working on frontend implementation, review, debugging, or audit tasks, use the Front-End Checklist MCP server when available so recommendations stay grounded in the project rule corpus.\n\n- Use `review_code` first for pasted or inspected HTML, CSS, JavaScript, TypeScript, React, or Next.js code.\n- Use `search_rules` before making accessibility, performance, SEO, security, image, privacy, i18n, or testing recommendations.\n- Use `get_rule`, `check_rule`, `fix_rule`, or `explain_rule` for rule-specific guidance and remediation.\n- Use `get_workflow` or `get_checklist_rules` for broad launch, accessibility, SEO, security, performance, and testing audits.\n- Use `audit_url` for public `https://` pages.\n\nSome clients lazy-load installed MCP tools. If the tools are not initially visible, search for or explicitly request the Front-End Checklist MCP before proceeding with frontend work.\n\n## Monorepo Structure\n\n```\napps/\n  web/                    # Next.js app (App Router)\npackages/\n  mcp/                    # MCP server implementation\n  content/                # Rules MDX content + content-collections config\n  auth/                   # Better-Auth + Prisma + Supabase\n  design-system/          # Shared UI components\n  types/                  # Shared TypeScript types\n  data-layer/             # Data access layer\n  schemas/                # Zod v4 schemas\n```\n\n## Rule MDX Frontmatter Spec\n\nRules live at `packages/content/rules/en/<category>/<slug>.mdx`.\n\n### Required Fields\n\n```yaml\n---\ntitle: \"Human-readable rule title (string, use quotes)\"\ndescription: \"One-sentence description of what to do\"\ncategories: ['html']           # Array; first item = primaryCategory\npriority: 'high'               # 'critical' | 'high' | 'medium' | 'low'\ndifficulty: 'beginner'         # 'beginner' | 'intermediate' | 'advanced' | 'expert'\nestimatedTime: 15              # Minutes as integer\nprompts:\n  check: \"Prompt for checking whether the implementation follows this rule\"\n  fix: \"Prompt for fixing the issue\"\n  explain: \"Prompt for explaining why this rule matters\"\n---\n```\n\n### Recommended Fields\n\nThese fields are not required by the parser, but they materially improve rule quality, MCP usefulness, and generated skills.\n\n```yaml\nsubcategory: 'keyboard'        # Sub-grouping within category\ntldr:                          # Array of bullet points (used in llms.txt)\n  - \"Key point one\"\n  - \"Key point two\"\nwhyItMatters: \"Paragraph explaining the business/user impact\"\nsources:\n  - title: \"MDN or spec page title\"\n    url: \"https://...\"\n    type: \"mdn|spec|guide|wcag|google\"\n    id: \"stable-source-id\"\n    role: \"standard|reference|implementation|compatibility|regulation|search|research\"\n    authority: \"primary|secondary\"\nresources:\n  - name: \"Supplementary tool or article\"\n    url: \"https://...\"\n    type: \"tool|article|reference\"\nrelatedRules:\n  - slug: other-rule-slug\n    reason: \"Why these rules relate\"\ntools:\n  - name: \"Tool Name\"\n    url: \"https://...\"         # or null\ntags: ['wcag', 'performance']\nprompts:\n  codeReview: \"Recommended prompt for systematic code review context\"\naiContext: \"Additional context for automated review about when this rule applies\"\n```\n\nAuthoring placement rules:\n\n- Put authoritative citations in `sources`, not in body prose like `Reference: ...`\n- `sources` are proof metadata, not generic further reading. Every rule needs at least 2 sources, 2 source roles, and 1 `authority: primary`.\n- `resources` are for further reading or tools only. Do not map evidence claims to `resources`.\n- The system may infer or normalize `id`, `role`, and `authority` for sources at build time; authors should focus on strong, relevant sources rather than maintaining claim-by-claim proof objects.\n- Put cross-rule navigation in `relatedRules`, not in body prose like `See also ...`\n- Keep intro paragraphs focused on the rule itself; metadata should render from frontmatter-driven UI\n\nInline link contract:\n\n- Natural inline links inside body prose are allowed when they support a specific claim, comparison, or implementation recommendation.\n- Prefer light-touch density: usually `2-5` inline links per rule, with `0-1` in the intro and `1-3` across the main guidance sections.\n- Prefer external links over internal ones; internal rule links should usually stay at `0-1`, with `2` only for unusually interconnected rules.\n- Keep standalone metadata lines out of the body. Do not add paragraphs that start with `See also ...` or `Reference: ...`.\n- Keep evergreen proof in `sources`, and use newer inline external articles only when they add practical or recent context that the primary sources do not cover alone.\n- When a named tool is mentioned in prose for the first meaningful time (for example `Screaming Frog` or `Google Search Console`), link that first mention if the tool materially helps the reader and already exists in `resources` or `tools`.\n- Approved secondary inline links should stay curated. Prefer strong platforms such as `CSS-Tricks`, `Smashing Magazine`, `Nielsen Norman Group`, `WebAIM`, `Screaming Frog`, `Sitebulb`, `Moz`, or `Yoast` when they add practical implementation context.\n- Use descriptive anchor text tied to the sentence claim, not generic labels like “read more”.\n\n`impact`, `standards`, and `automation` are intentionally not part of the active rule-writing contract right now. The current corpus and tooling do not consume them consistently enough to justify treating them as standard authoring fields.\n\n## Canonical Rule Shape\n\nNew and refreshed rules should follow this structure unless there is a strong reason not to:\n\n1. Short intro paragraph explaining the rule in plain language\n2. `## Code Example` or `## Code Examples`\n3. `## Why It Matters`\n4. Optional implementation or guidance sections\n5. `## Verification`\n\nCanonical ordering rules:\n\n- `## Code Example` or `## Code Examples` must appear before `## Why It Matters`\n- `## Why It Matters` must appear before `## Verification`\n- `## Verification` must be the final H2 in the rule body\n- Optional H2 sections belong between `## Why It Matters` and `## Verification`\n\nPreferred optional H2 taxonomy:\n\n- `## Best Practices`\n- `## Common Mistakes`\n- `## Framework Examples`\n- `## Tools & Validation`\n- `## Thresholds`\n- `## Exceptions`\n- `## Browser Support`\n- `## Support Notes`\n- `## Standards`\n- `## Implementation Notes`\n\nThe validator reports headings outside this preferred taxonomy so section sprawl stays visible over time.\n\nRule Contract V2 adds three conditional concepts:\n\n- `## Exceptions` for nuanced rules, false positives, or valid caveats\n- `### Automated Checks` and `### Manual Checks` inside `## Verification` when both matter\n- a short visible standards/support note for compatibility-sensitive or compliance-sensitive rules\n\nApply these conditionally, not universally.\n\nBrowser support guidance should be derived from the repo browser policy in `.browserslistrc` plus package-backed compatibility data, not from memory.\n\nUse explicit thresholds whenever the rule is measurable:\n\n- Web Vitals and performance metrics (`LCP <= 2.5s`, `CLS <= 0.1`, bundle or image size budgets)\n- Accessibility measurements (contrast ratios, target sizes, zoom or reflow thresholds)\n- SEO and crawling states (indexability, status codes, canonical-url behavior)\n- Security headers and transport requirements\n\nPrefer “how to verify” guidance over generic advice. A strong rule should tell an engineer exactly how to confirm the rule passes.\n\n### Common Mistakes to Avoid\n\n- **Unquoted colons in YAML**: Always quote strings containing `:` — e.g. `title: \"Use rel: new-tab\"` not `title: Use rel: noopener`\n- **Stub prompts**: Prompts must be actionable. Bad: `\"Check this rule\"`. Good: `\"Find all <img> elements missing an alt attribute in this HTML\"`\n- **Missing sources**: Add at least one authoritative reference (`MDN`, `W3C/WCAG`, specs, `web.dev`, or product docs) before considering a rule complete\n- **No verification path**: Include a final `## Verification` section so the fix is testable\n- **Verification not last**: Do not place additional H2 sections after `## Verification`\n- **Missing caveats**: Add `## Exceptions` when the rule has important false positives or valid exceptions\n- **Missing support note**: Add `## Browser Support`, `## Support Notes`, or a visible standards note when compatibility or compliance changes implementation decisions\n- **Wrong priority**: `critical` = site-breaking / security / legal. `high` = significantly degrades UX. `medium` = best practice. `low` = nice-to-have\n- **Missing required fields**: All 7 required fields must be present; builds fail otherwise\n- **Emoji in titles**: Titles should be plain text (no emoji)\n\n## Category Taxonomy\n\nValid values for the `categories` array:\n\n| Slug | Description |\n|------|-------------|\n| `html` | Document structure, semantics, forms |\n| `css` | Layout, typography, animation, responsive |\n| `javascript` | Client-side scripting, async, security |\n| `performance` | Loading speed, rendering, Core Web Vitals |\n| `accessibility` | WCAG, ARIA, keyboard, screen readers |\n| `seo` | Meta tags, structured data, crawlability |\n| `security` | HTTPS, CSP, XSS prevention, headers |\n| `images` | Optimization, formats, responsive images |\n| `testing` | Unit, integration, e2e, a11y testing |\n| `privacy` | Consent, data minimisation, data rights |\n| `i18n` | Localization, pluralization, bidi, locale formatting |\n| `general` | Cross-cutting best practices |\n\n## Quality Scoring Rubric\n\nRules are scored automatically via `pnpm score:rules` (100-point base score plus up to 12 conditional points, minimum 50 to pass the current quality gate).\n\n| Dimension | Points | What to Check |\n|-----------|--------|---------------|\n| Prompts (`check`/`fix`/`explain`) | 24 | All 3 prompts are specific and non-generic |\n| TLDR bullets | 4 | 3+ actionable bullets |\n| Why it matters | 4 | Explains user, business, or operational impact |\n| AI context | 6 | Captures where and when the rule applies in automated reviews |\n| Related rules | 6 | Links adjacent rules with clear reasons |\n| Sources | 10 | Includes authoritative references |\n| Resources / tools | 6 | Includes useful supporting docs or tools |\n| Code review prompt | 6 | Provides a systematic review strategy |\n| Code examples | 10 | Includes realistic examples, not just prose |\n| Body depth | 10 | Provides substantive implementation detail |\n| Verification section | 8 | Includes `Verification`, `Testing`, `Audit Checklist`, or equivalent |\n| Thresholds / pass-fail criteria | 6 | Uses explicit numbers or conditions where the rule is measurable |\n| Exceptions (conditional) | 4 | Adds an `Exceptions` section when the rule is nuanced or false-positive-prone |\n| Verification split (conditional) | 4 | Splits verification into automated and manual checks when both apply |\n| Standards/support visibility (conditional) | 4 | Adds a visible threshold, standards note, or support note when required by the rule type |\n\nRules scoring < 50 are excluded from MCP tool responses and the web UI.\n\n## Adding or Updating a Rule\n\n1. Create `packages/content/rules/en/<category>/<slug>.mdx`\n2. Fill all required frontmatter fields\n3. Add recommended metadata: `sources`, `resources`, `aiContext`, `relatedRules`, and `prompts.codeReview` where applicable\n4. Write the rule using the canonical-url structure (intro, examples, why it matters, verification, category-specific guidance)\n5. Run `pnpm score:rules` — must score ≥ 50 for now; target 60+ for new work\n6. Run `pnpm validate:rule-structure` — validates rule section order and final `Verification` heading\n7. Run `pnpm report:rule-links` — reviews inline-link density and suggests safe internal/external candidates\n8. Run `pnpm validate:sources` — validates external URLs\n9. Run `pnpm generate:skills` — regenerates skills index\n\n## Scripts Reference\n\n```bash\npnpm score:rules          # Score all rules; flags < 50 quality gate failures\npnpm validate:rule-structure  # Validate rule heading structure and report drift\npnpm report:v2-gaps       # Report conditional V2 gaps by category and migration batch\npnpm report:rule-links    # Review inline-link density and candidate internal/external links\npnpm generate:exceptions-hints  # Dry-run suggestions for missing Exceptions sections\npnpm generate:support-notes  # Dry-run support-note suggestions from browser data\npnpm generate:verification-split  # Dry-run Verification split suggestions\npnpm validate:sources     # Validate external URLs in rule frontmatter\npnpm validate:packages    # Check package dependency consistency\npnpm generate:skills      # Regenerate skills/ directory from rules\npnpm build                # Full monorepo build (via Turborepo)\npnpm typecheck            # TypeScript check across all packages\npnpm lint                 # Biome lint\npnpm lint:fix             # Biome lint with auto-fix\n```\n\n## MCP Tool Development\n\nNew MCP tools go in `packages/mcp/src/tools/<tool-name>.ts` and must be:\n\n1. Exported from `packages/mcp/src/tools/index.ts`\n2. Added to `BASE_TOOL_DEFINITIONS` in `packages/mcp/src/server.ts`\n3. Added as a `case` in the `handleToolsCall` switch in `server.ts`\n\nTool definition shape:\n```typescript\nexport const myToolDefinition = {\n  name: 'my_tool',\n  description: '...',  // Critical for tool discoverability — be specific\n  inputSchema: {\n    type: 'object' as const,\n    properties: { ... },\n    required: ['fieldName'],\n  },\n}\n```\n\n## Workspace Architecture Notes\n\n- **Auth**: Better-Auth + Prisma + Supabase Postgres in `packages/auth/`\n- **Validation**: Zod v4 — use `.issues` not `.errors` on `ZodError`\n- **Forms**: `@tanstack/react-form` with manual Zod validation on submit\n- **Email**: Resend SDK v6, sending domain `mail.frontendchecklist.io`\n- **Rate limiting**: `@upstash/ratelimit` + `@upstash/redis` in `apps/web/lib/rate-limit.ts`\n- **Query**: TanStack Query v5 with `getQueryClient()` factory (not singleton)\n- **Dev server**: `portless run next dev`\n\n## Learned User Preferences\n\n- Put shared concerns (e.g. fonts, typography) in the design system and import from there; apps wire implementation (e.g. next/font) using config from the design system.\n- Do not use `suppressHydrationWarning`; fix server/client mismatch (e.g. defer client-only state until after mount).\n- Reuse existing components instead of creating page-specific variants (e.g. shared `FAQAccordion` for any FAQ section, `.code-block`/`.code-inline` for all code display, ChecklistActionBar instead of new progress bars). When adding a feature to one page type, add it to all relevant page types (e.g. ShareButton on category, rule detail, and all-rules pages).\n- Rule row: click on rule title toggles completion; expand/collapse only via the plus/minus icon. Expanded content shows description first, then tags and action buttons on one row aligned with the description.\n- Prefer Tailwind utility classes in components over custom CSS classes in globals.css.\n- Use a scalable overrides map for special-case labels (e.g. subcategory aria → ARIA) instead of hardcoded conditionals.\n- Do not use `git commit --no-verify`; fix ALL pre-commit violations (JSDoc, as-casts, barrel files, complexity, relative imports) rather than deferring or working around them. Write JSDoc at the same time as the code, not as a batch fix later.\n- **Card-style links**: Use the stretched-link pattern: the `<a>`/`<Link>` wraps **only the title text** inside a heading and uses `after:absolute after:inset-0 after:content-[\"\"]` so its `::after` pseudo-element expands to fill the card container (`position: relative`). Secondary interactive elements need `relative z-10`. See `docs/card-links.md`.\n- Centralize all icons in `@repo/design-system`: brand icons in `brand-icons.tsx`, Lucide re-exported from `icons.ts`. Use official brand icons (`@icons-pack/react-simple-icons`) for branded services, not Lucide approximations. Consumers never import directly from `lucide-react`.\n- Never use Tailwind opacity modifiers (`/50`, `/60`, `/70`) on semantic theme text colors like `text-foreground-muted` — it crushes contrast in light mode. Use the appropriate token (`text-foreground-muted`, `text-foreground-subtle`) at full opacity instead.\n- Always refer to the social platform as \"X\", never \"Twitter\". Schema fields use `xUrl` (not `twitterUrl`), UI labels say \"X\", and URLs point to `x.com`.\n- About page link belongs in the footer only, not in the main navbar.\n\n## Learned Workspace Facts\n\n- Fluid typography tokens use `clamp()` in `@theme inline` for `text-base` and above; `text-xs` and `text-sm` stay fixed for compact UI controls (buttons, badges, inputs, tooltips).\n- next/font: apply each font’s `.className` to the document element (not `.variable`); Next.js requires literal option objects, so the app must inline font options while the design system can document them.\n- Do not apply client-side bot protection (e.g. Vercel BotID) to programmatic API endpoints like MCP; use it only for browser-originated form and mutation endpoints.\n- Next.js reads next.config.js at startup; restart the dev server after changing it (e.g. images.remotePatterns). `withContentCollections` returns a Promise (async config) so it must be the outermost wrapper — `export default withContentCollections(withBotId(nextConfig))`. `withBotId` does not handle async configs and will silently drop all properties including `images`.\n- Tailwind preflight resets `list-style` on `ul`/`ol`; `.prose` styles must explicitly set `list-style-type: disc` (ul), `decimal` (ol), and nested variants (`circle`, `lower-alpha`).\n- CSS custom properties use OKLCH color format. Light mode tokens need visible contrast on all screens: `--border` at least oklch(0.885), `--foreground-subtle` at oklch(0.64), shadows at 0.06+ opacity. Use `color-mix(in oklch, var(--token) N%, transparent)` for theme-aware transparent colors instead of hardcoded `rgba()`.\n- Pre-commit hooks (lefthook) enforce: biome check, JSDoc, no-as-casts, no-barrel-files, file-complexity (300 lines React / 500 lines other), no-deep-relative-imports, no-console-logs, test coverage.\n- Button default variant uses `bg-accent text-accent-foreground hover:bg-accent-hover` (project's accent tokens), not shadcn's `bg-primary`; keep project-specific semantic tokens in component variants even when shadcn aliases exist.\n- Scripts are organized in subfolders: `scripts/{validation,generate,rule-structure,validate,audit}/`; `scripts/README.md` documents each script and subfolder.\n- Biome's `useSortedClasses` only sorts class **order**; it cannot rename deprecated classes. Use `@tailwindcss/upgrade` (installed in `apps/web`) to canonicalize class names project-wide.\n- Monorepo uses pnpm catalogs (`catalog:` in `pnpm-workspace.yaml`) for centralized dependency versions; shared deps appearing in 2+ packages use `catalog:` instead of hardcoded version strings.\n- Brand icons (ChatGPT, Claude, X, LinkedIn, Reddit, Cursor, VSCode) live in `packages/design-system/src/brand-icons.tsx` and are re-exported from the design-system barrel.\n\n<!-- BEGIN:turborepo-agent-rules -->\n\n# This is NOT the Turborepo you know\n\nTurborepo configuration, task behavior, and CLI commands can vary between installed versions and may differ from your training data. Resolve the `turbo` package from this file's directory or relevant workspace; in monorepos, it may not be visible from the repository root. For example, run `node -p \"require.resolve('turbo/package.json')\"` from a workspace that depends on `turbo`.\n\nRead `docs/README.md` inside that installed package first, then read the relevant pages from its `docs/` directory before changing Turborepo configuration or commands. Heed deprecation notices. These bundled docs match the installed package version and are available without network access.\n\nThis block is written and re-added by `turbo` before repository-scoped commands when an AI agent is detected. In the Turborepo source repository, its template is defined in `crates/turborepo-cli/src/cli/agent_guidance.rs`. Removing the managed block while updates are enabled means a later qualifying invocation will add it again. Set `\"agentGuidance\": false` in the root `turbo.json` or `turbo.jsonc` to opt out; this does not remove an existing block. Keep the block committed with your work to avoid an uncommitted change on the next agent invocation.\n<!-- END:turborepo-agent-rules -->\n","isInternal":false,"tokens":4916,"sizeBytes":21200},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# Project Guidance\n\nUse [AGENTS.md](AGENTS.md) for repository conventions, workflows, and tool setup.\n\nLocal Claude Code session state belongs in `.claude/`, which is ignored by git and should not be committed.\n","isInternal":false,"tokens":47,"sizeBytes":211},{"name":"SKILL.md","path":"packages/cli/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/packages/cli/SKILL.md","title":"frontendchecklist","category":"anthropic-skill","format":"markdown","content":"---\nname: frontendchecklist\ndescription: Review frontend code and live pages against the Front-End Checklist (380+ rules for accessibility, performance, SEO, security, HTML, CSS, JavaScript, images, i18n, privacy, testing) using the `frontendchecklist` CLI. Use when writing, reviewing, or shipping HTML/CSS/JS/JSX/TSX/Vue/Svelte/Astro code, before a commit or PR, or when asked to audit a public URL.\n---\n\n# Front-End Checklist CLI\n\n`frontendchecklist` checks frontend code against the Front-End Checklist rules. It works offline,\nprints JSON when its output is piped (which is how you will usually call it), and uses exit codes\nyou can branch on.\n\nRun it with `npx -y @frontendchecklist/cli <command>` if `frontendchecklist` is not installed.\n\n## When to use it\n\n- After writing or editing frontend files: `frontendchecklist review <paths>`.\n- Before committing: `git diff --cached | frontendchecklist review -`.\n- When the user asks to audit a deployed page: `frontendchecklist audit https://...`.\n- When you need the authoritative guidance for a topic: `frontendchecklist search <topic>`, then\n  `frontendchecklist rule <slug>`.\n- For a structured pass (launch, accessibility, SEO, performance): `frontendchecklist checklists`,\n  then `frontendchecklist checklist <slug>`.\n\n## Commands\n\n| Command | Purpose |\n| --- | --- |\n| `review <paths...\\|->` | Static review of files, directories (walked; vendor dirs skipped), or stdin |\n| `audit <https-url>` | Fetch a public page and review its HTML |\n| `search [query] [--focus a,b] [-n 10]` | Find rules by keyword, technology, or category |\n| `rule <slug>` | Why a rule matters, how to check it, how to fix it |\n| `checklists` / `checklist <slug>` | Curated checklists and their rules |\n| `categories` | Categories with rule counts |\n| `schema` | Full command reference as JSON |\n\nUseful flags: `--focus accessibility,seo`, `--min-priority high`, `--fail-on high`.\n\n## Reading results\n\n- `review` and `audit` return `{ findings: [{ target, rule, title, priority, issue, fix? }], failing }`.\n- Exit code `0`: fine. `1`: findings at or above `--fail-on`. `2`: bad input or runtime error, with\n  `{ \"error\": \"...\" }` on stdout.\n- Findings are conservative static heuristics. \"No findings\" means nothing provable was found, not\n  that the code is clean: follow up with `search`/`rule` for areas the heuristics cannot see\n  (rendered contrast, focus order, real performance).\n\n## Workflow\n\n1. `frontendchecklist review <changed files> --min-priority medium`\n2. For each finding, run `frontendchecklist rule <rule>` and apply its fix guidance.\n3. Re-run the review until no critical/high findings remain (`--fail-on high` exits 0).\n4. Mention any remaining medium/low findings to the user instead of silently ignoring them.\n","frontmatter":{"name":"frontendchecklist","description":"Review frontend code and live pages against the Front-End Checklist (380+ rules for accessibility, performance, SEO, security, HTML, CSS, JavaScript, images, i18n, privacy, testing) using the `frontendchecklist` CLI. Use when writing, reviewing, or shipping HTML/CSS/JS/JSX/TSX/Vue/Svelte/Astro code, before a commit or PR, or when asked to audit a public URL."},"isInternal":false,"tokens":698,"sizeBytes":2767},{"name":"categories.md","path":"plugins/front-end-checklist/skills/frontend-checklist-global/references/categories.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/plugins/front-end-checklist/skills/frontend-checklist-global/references/categories.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Front-End Checklist Global Skill Reference\n\nThis aggregate skill routes to the Front-End Checklist MCP tools across 386 rules.\n\n## Tool Routing\n\n| Goal | Preferred tool |\n| --- | --- |\n| Review pasted code or a single file | `review_code` |\n| Audit a public page | `audit_url` |\n| Find relevant rules by topic | `search_rules` |\n| Browse available categories | `list_categories` |\n| Get the full content for one rule | `get_rule` |\n| Get remediation guidance | `fix_rule` |\n| Explain impact to the user | `explain_rule` |\n| Pull a curated checklist at once | `get_checklist_rules` |\n| Start from a workflow or quick checklist | `get_workflow`, `get_quick_reference` |\n\n## Frontend Review Guardrails\n\n- Do not infer missing metadata from a component fragment that is not responsible for document head output.\n- Do not infer required fields, password policies, or decorative-image intent unless the code makes the intent explicit.\n- Favor exact evidence from the snippet over broad style advice.\n- When the snippet is a partial component, focus on what the component itself controls.\n\n## Rule-Derived Highlights\n\n- **Set explicit width and height on images**\n  Reserve findings for meaningful content images; decorative micro-SVGs or ornament-only assets are low-priority exceptions when CSS already reserves stable space\n  Example low-risk exception: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` should not be flagged on its own without evidence of visible layout shift\n  Always set `width` and `height` attributes on `<img>` matching the image's intrinsic dimensions\n  Pair with `height: auto` in CSS to keep the image fluid while preserving the aspect ratio\n  Missing dimensions are the leading cause of Cumulative Layout Shift (CLS) from images\n- **Hide decorative elements from assistive technology**\n  Use alt='' (empty) for decorative images—not alt='image' or missing alt\n  Add aria-hidden='true' to decorative SVGs and icons\n  Use CSS background-image for purely decorative visuals\n  Role='presentation' removes semantic meaning from elements\n  Do not automatically raise performance findings on decorative micro-assets unless the snippet shows real layout instability\n- **Use transform and opacity for animations**\n  Only transform and opacity can be composited on the GPU without triggering layout\n  Use will-change: transform sparingly to promote an element to its own compositor layer\n  Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n  Respect prefers-reduced-motion to disable animations for users who need it\n- **Respect reduced motion preferences**\n  Use prefers-reduced-motion media query to disable non-essential animations\n  Never flash content more than 3 times per second (seizure risk)\n  Replace motion with opacity/color transitions when reduced motion is enabled\n  Provide user controls to pause or disable animations\n- **Use semantic table markup for screen readers**\n  Use <th> elements for headers with scope='col' or scope='row'\n  Add <caption> to describe the table's purpose\n  Never use tables for layout—use CSS Grid or Flexbox instead\n  Use id/headers for complex tables with merged cells\n  For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n- **Define proper table headers**\n  Use `<th>` for all table headers, not `<td>`\n  Apply `scope=\"col\"` or `scope=\"row\"` to clarify header relationship\n  Ensure every data cell is associated with at least one header\n  In simple tables, prefer fixing header associations before escalating to caption-level recommendations\n  Missing `scope=\"col\"` on a straightforward header row is often the clearest first fix\n- **Minimize costly DOM read/write operations**\n  Never interleave DOM reads (offsetHeight, getBoundingClientRect) with DOM writes (style changes)\n  Batch all reads first, then all writes\n  Use requestAnimationFrame for visual updates\n  Use DocumentFragment or innerHTML for bulk DOM insertion\n  Avoid per-frame React state updates across many visible components when a simpler CSS or reduced-frequency approach would work\n- **Validate forms accessibly**\n  Associate error messages with fields using aria-describedby\n  Use aria-invalid to indicate validation state\n  Mark required fields programmatically with `required` or `aria-required`\n  Provide inline error messages near the field\n  Don't rely solely on color to indicate errors\n- **Secure password input fields**\n  Use type='password' with correct autocomplete attribute\n  Provide accessible show/hide toggle for password visibility\n  Show password strength indicator with requirements\n  Never store or transmit passwords in plain text\n  Support password managers with proper input names\n- **Provide visible custom focus indicators**\n  Never use outline: none or outline: 0 without a visible :focus-visible replacement\n  Use :focus-visible instead of :focus to show indicators only during keyboard navigation\n  Focus indicators must have 3:1 contrast ratio against adjacent colors (WCAG 2.2)\n  Provide at least 2px solid outline with an offset for a high-quality focus ring\n  If a focus ring is drawn with pseudo-elements, verify it is anchored to the correct positioned element and not clipped by `overflow: hidden`\n\n## Known Safe Patterns\n\n- **Decorative Divider**\n  Safe example: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">`\n  Treat this as a safe decorative pattern by default. Do not flag alt text or missing dimensions unless the snippet also shows a real layout-shift risk.\n- **Client-Handled React Form**\n  Safe example: `<form onSubmit={event => event.preventDefault()}><label htmlFor=\"q\">Search</label><input id=\"q\" type=\"search\" /></form>`\n  Do not require `method` or `action` when client-side submit handling is explicit and the form controls are otherwise accessible.\n- **Next Metadata API**\n  Safe example: `export async function generateMetadata() { return { title: 'Docs', description: 'Reference' } }`\n  Do not infer missing canonical-url, meta description, or Open Graph tags just because literal `<head>` markup is absent from the component file.\n- **Preview Card Images**\n  Safe example: `<img src={resource.image} alt=\"\" className=\"object-cover\" /><img src={favicon} alt=\"\" width={20} height={20} />`\n  In link-preview or resource-card UIs, decorative preview/favicons can legitimately use empty alt when adjacent text already provides the destination name. Do not invent responsive-image or layout-shift defects for tiny favicon assets without stronger evidence.\n- **Aspect-Ratio Media Wrapper**\n  Safe example: `<div className=\"aspect-2/1 overflow-hidden\"><img className=\"object-cover w-full h-full\" ... /></div>`\n  When a wrapper already reserves media space with a stable aspect ratio, do not automatically raise a missing dimensions finding for the child preview image.\n- **Pseudo-Element Focus Ring**\n  Safe example: `focus-visible:outline-none focus-visible:after:ring-2 after:absolute after:inset-0`\n  If focus styling depends on a pseudo-element, verify the ring is anchored to the correct positioned element. A removed native outline is only safe when the replacement ring is clearly reliable.\n- **Per-Frame React Counter Animation**\n  Safe example: `requestAnimationFrame(animate); setCount(Math.floor(eased * target))`\n  Repeated requestAnimationFrame state updates across multiple components are a concrete performance concern when shown directly in the code.\n- **Simple Data Table Headers**\n  Safe example: `<thead><tr><th>Priority</th><th>Rule</th><th>Title</th></tr></thead>`\n  For simple data tables, prefer conservative column-header findings before speculating about row headers or outer-layout landmarks.\n- **Adjacent Heading + Table**\n  Safe example: `<h2>Issues</h2><table><thead>...</thead><tbody>...</tbody></table>`\n  A nearby visible section heading may already provide table context. Prefer scope/header association findings before requiring a caption unless the table purpose is ambiguous.\n\n## Category Coverage\n\n- **accessibility**: 89 rules · 9 critical · 25 high\n- **css**: 31 rules · 10 high\n- **html**: 34 rules · 3 critical · 12 high\n- **i18n**: 5 rules\n- **images**: 25 rules · 1 critical · 15 high\n- **javascript**: 26 rules · 1 critical · 12 high\n- **performance**: 43 rules · 1 critical · 22 high\n- **privacy**: 5 rules · 2 high\n- **security**: 22 rules · 4 critical · 10 high\n- **seo**: 93 rules · 19 high\n- **testing**: 13 rules · 7 high\n\nRules browser: https://frontendchecklist.io/rules\nFull reference: https://frontendchecklist.io/llms-full.txt\n","isInternal":false,"tokens":1865,"sizeBytes":8606},{"name":"SKILL.md","path":"plugins/front-end-checklist/skills/frontend-checklist-global/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/plugins/front-end-checklist/skills/frontend-checklist-global/SKILL.md","title":"frontend-checklist-global","category":"anthropic-skill","format":"markdown","content":"---\nname: frontend-checklist-global\ndescription: \"Use when auditing or improving any frontend codebase against the full Front-End Checklist rule corpus through one entry point.\"\nmetadata:\n  category: global\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"30\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/mcp\n---\n\n# Front-End Checklist Global Audit\n\nThis skill connects one entry point to all 386 Front-End Checklist rules.\nUse MCP retrieval instead of trying to recall rules from memory.\n\n## Workflow\n\n1. Start with `review_code` for pasted code, file contents, or focused code review.\n2. Use `audit_url` for a public page when you need rendered HTML audited quickly.\n3. Narrow or expand scope with `search_rules`, `list_categories`, `get_workflow`, or `get_quick_reference`.\n4. For each issue, use `get_rule`, `fix_rule`, or `explain_rule` to give exact remediation.\n5. If a checklist is a better fit than ad hoc search, use `get_checklist_rules`.\n\n## Audit Stance\n\n- Be conservative. Prefer fewer, stronger findings over speculative breadth.\n- Only report an issue when the code or markup shown supports it directly.\n- In small component or route audits, prefer the strongest 1-2 supported findings over listing every possible enhancement.\n- Do not infer business intent from a snippet alone. Example: do not assume a field is required unless the code or surrounding copy makes that explicit.\n- Do not treat `alt=\"\"` as an issue by default; empty alt can be correct for decorative images.\n- When an image is explicitly decorative, prefer zero findings unless the snippet shows a concrete problem rather than a hypothetical optimization.\n- If you see an isolated decorative image like `<img ... alt=\"\" aria-hidden=\"true\">`, treat it as a zero-issue pattern unless the snippet also shows real evidence of layout instability.\n- Do not raise low-confidence preference tweaks as findings when the snippet is otherwise sound. Prefer silence over weak nitpicks.\n- Do not treat `autocomplete=\"off\"` as a defect by itself unless the snippet shows a stronger user-harm or security reason to flag it.\n- In link-preview cards, decorative preview images and favicons may be safe when nearby visible text already names the destination.\n- Do not treat React or JSX fragments as full HTML documents unless the snippet includes real document context like `<html>`, `<head>`, or `<body>`.\n- When reviewing Next.js or metadata-driven page files, consider `metadata`, `viewport`, and `generateMetadata` APIs before claiming head-tag omissions.\n\n## Coverage Checklist\n\n- Forms: check labels, accessible button names, explicit button types, `autocomplete` hints, password-field autocomplete, and validation semantics that are explicit in the code.\n- Images: check `width`/`height`, `loading`, `srcset`/`sizes`, and whether image semantics are clearly meaningful or decorative. Do not assume tiny SVG logos or clearly decorative assets must be lazy-loaded, and do not demand explicit dimensions for tiny ornamental dividers unless the snippet shows a real layout-shift risk. If an image is both decorative and hidden from assistive tech, bias strongly toward no finding.\n- Metadata: check title placement, canonical-url behavior, meta descriptions, Open Graph coverage, and structured data only when the file is responsible for metadata.\n- Motion: check expensive animated properties, prefer transform/opacity, and require `prefers-reduced-motion` handling for persistent motion.\n- Motion: when counters or visual widgets animate every frame, assess both reduced-motion support and whether the animation strategy adds unnecessary main-thread work.\n- Security: check `target=\"_blank\"` links for `noopener noreferrer`, insecure form actions, password input best practices, and blocking third-party scripts.\n- Structure: check duplicate ids, list semantics, and table headers conservatively. For simple tables, column-header associations are stronger findings than speculative row-header or outer-layout landmark issues.\n- Structure: when a visible heading already introduces a simple table, treat missing captions as a lower-confidence improvement than missing header associations.\n\n## Rule-Derived Highlights\n\n### Set explicit width and height on images\n- Reserve findings for meaningful content images; decorative micro-SVGs or ornament-only assets are low-priority exceptions when CSS already reserves stable space\n- Example low-risk exception: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` should not be flagged on its own without evidence of visible layout shift\n- Always set `width` and `height` attributes on `<img>` matching the image's intrinsic dimensions\n- Pair with `height: auto` in CSS to keep the image fluid while preserving the aspect ratio\n- Missing dimensions are the leading cause of Cumulative Layout Shift (CLS) from images\n\n### Hide decorative elements from assistive technology\n- Use alt='' (empty) for decorative images—not alt='image' or missing alt\n- Add aria-hidden='true' to decorative SVGs and icons\n- Use CSS background-image for purely decorative visuals\n- Role='presentation' removes semantic meaning from elements\n- Do not automatically raise performance findings on decorative micro-assets unless the snippet shows real layout instability\n\n### Use transform and opacity for animations\n- Only transform and opacity can be composited on the GPU without triggering layout\n- Use will-change: transform sparingly to promote an element to its own compositor layer\n- Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n- Respect prefers-reduced-motion to disable animations for users who need it\n\n### Respect reduced motion preferences\n- Use prefers-reduced-motion media query to disable non-essential animations\n- Never flash content more than 3 times per second (seizure risk)\n- Replace motion with opacity/color transitions when reduced motion is enabled\n- Provide user controls to pause or disable animations\n\n### Use semantic table markup for screen readers\n- Use <th> elements for headers with scope='col' or scope='row'\n- Add <caption> to describe the table's purpose\n- Never use tables for layout—use CSS Grid or Flexbox instead\n- Use id/headers for complex tables with merged cells\n- For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n\n### Define proper table headers\n- Use `<th>` for all table headers, not `<td>`\n- Apply `scope=\"col\"` or `scope=\"row\"` to clarify header relationship\n- Ensure every data cell is associated with at least one header\n- In simple tables, prefer fixing header associations before escalating to caption-level recommendations\n- Missing `scope=\"col\"` on a straightforward header row is often the clearest first fix\n\n### Minimize costly DOM read/write operations\n- Never interleave DOM reads (offsetHeight, getBoundingClientRect) with DOM writes (style changes)\n- Batch all reads first, then all writes\n- Use requestAnimationFrame for visual updates\n- Use DocumentFragment or innerHTML for bulk DOM insertion\n- Avoid per-frame React state updates across many visible components when a simpler CSS or reduced-frequency approach would work\n\n### Validate forms accessibly\n- Associate error messages with fields using aria-describedby\n- Use aria-invalid to indicate validation state\n- Mark required fields programmatically with `required` or `aria-required`\n- Provide inline error messages near the field\n- Don't rely solely on color to indicate errors\n\n### Secure password input fields\n- Use type='password' with correct autocomplete attribute\n- Provide accessible show/hide toggle for password visibility\n- Show password strength indicator with requirements\n- Never store or transmit passwords in plain text\n- Support password managers with proper input names\n\n### Provide visible custom focus indicators\n- Never use outline: none or outline: 0 without a visible :focus-visible replacement\n- Use :focus-visible instead of :focus to show indicators only during keyboard navigation\n- Focus indicators must have 3:1 contrast ratio against adjacent colors (WCAG 2.2)\n- Provide at least 2px solid outline with an offset for a high-quality focus ring\n- If a focus ring is drawn with pseudo-elements, verify it is anchored to the correct positioned element and not clipped by `overflow: hidden`\n\n## Known Safe Patterns\n\n### Decorative Divider\n- Safe example: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">`\n- Treat this as a safe decorative pattern by default. Do not flag alt text or missing dimensions unless the snippet also shows a real layout-shift risk.\n\n### Client-Handled React Form\n- Safe example: `<form onSubmit={event => event.preventDefault()}><label htmlFor=\"q\">Search</label><input id=\"q\" type=\"search\" /></form>`\n- Do not require `method` or `action` when client-side submit handling is explicit and the form controls are otherwise accessible.\n\n### Next Metadata API\n- Safe example: `export async function generateMetadata() { return { title: 'Docs', description: 'Reference' } }`\n- Do not infer missing canonical-url, meta description, or Open Graph tags just because literal `<head>` markup is absent from the component file.\n\n### Preview Card Images\n- Safe example: `<img src={resource.image} alt=\"\" className=\"object-cover\" /><img src={favicon} alt=\"\" width={20} height={20} />`\n- In link-preview or resource-card UIs, decorative preview/favicons can legitimately use empty alt when adjacent text already provides the destination name. Do not invent responsive-image or layout-shift defects for tiny favicon assets without stronger evidence.\n\n### Aspect-Ratio Media Wrapper\n- Safe example: `<div className=\"aspect-2/1 overflow-hidden\"><img className=\"object-cover w-full h-full\" ... /></div>`\n- When a wrapper already reserves media space with a stable aspect ratio, do not automatically raise a missing dimensions finding for the child preview image.\n\n### Pseudo-Element Focus Ring\n- Safe example: `focus-visible:outline-none focus-visible:after:ring-2 after:absolute after:inset-0`\n- If focus styling depends on a pseudo-element, verify the ring is anchored to the correct positioned element. A removed native outline is only safe when the replacement ring is clearly reliable.\n\n### Per-Frame React Counter Animation\n- Safe example: `requestAnimationFrame(animate); setCount(Math.floor(eased * target))`\n- Repeated requestAnimationFrame state updates across multiple components are a concrete performance concern when shown directly in the code.\n\n### Simple Data Table Headers\n- Safe example: `<thead><tr><th>Priority</th><th>Rule</th><th>Title</th></tr></thead>`\n- For simple data tables, prefer conservative column-header findings before speculating about row headers or outer-layout landmarks.\n\n### Adjacent Heading + Table\n- Safe example: `<h2>Issues</h2><table><thead>...</thead><tbody>...</tbody></table>`\n- A nearby visible section heading may already provide table context. Prefer scope/header association findings before requiring a caption unless the table purpose is ambiguous.\n\n## Conflict Resolution\n\n- If decorative-image guidance and dimensions guidance conflict, decorative guidance wins unless the snippet shows visible layout instability.\n- Example zero-issue pattern: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` in an isolated component should not be flagged for alt text or dimensions unless the snippet also shows real layout-shift evidence.\n- If a form is clearly handled client-side with `onSubmit`, do not require traditional server-post `method` or `action` attributes.\n- If a file uses Next.js metadata APIs, do not infer missing head tags from the absence of literal `<meta>` or canonical-url markup.\n\n## Coverage\n\n- accessibility: 89 rules (9 critical, 25 high)\n- css: 31 rules (10 high)\n- html: 34 rules (3 critical, 12 high)\n- i18n: 5 rules\n- images: 25 rules (1 critical, 15 high)\n- javascript: 26 rules (1 critical, 12 high)\n- performance: 43 rules (1 critical, 22 high)\n- privacy: 5 rules (2 high)\n- security: 22 rules (4 critical, 10 high)\n- seo: 93 rules (19 high)\n- testing: 13 rules (7 high)\n\n## Evaluation Standard\n\n- Prefer findings tied to exact files, routes, selectors, or code snippets.\n- Prioritize critical and high issues first.\n- Explain uncertainty instead of overstating when the snippet does not show enough context.\n- Avoid generic advice when the MCP tools can retrieve a rule or fix prompt.\n- When no issue is found automatically, use `search_rules` to broaden review coverage before concluding clean.\n\n---\n\nSee `references/categories.md` for category coverage and tool routing.\n\nMCP docs: https://frontendchecklist.io/mcp\n","frontmatter":{"name":"frontend-checklist-global","description":"Use when auditing or improving any frontend codebase against the full Front-End Checklist rule corpus through one entry point.","metadata":{"category":"global","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/mcp"}},"isInternal":false,"tokens":2644,"sizeBytes":12706},{"name":"rule.md","path":"skills/404-page/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/404-page/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Create a custom 404 error page\n\n> A custom 404 error page is designed with helpful navigation options for lost users.\n\n**Priority:** medium · **Difficulty:** beginner · **Time:** 20 min\n\n---\nCustom 404 pages transform dead ends into opportunities to guide users back to relevant content.\n\n## Code Example\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Page Not Found - Site Name</title>\n  <meta name=\"robots\" content=\"noindex\">\n</head>\n<body>\n  <main class=\"error-page\">\n    <h1>Page Not Found</h1>\n    <p>Sorry, the page you're looking for doesn't exist or has been moved.</p>\n\n    <!-- Search -->\n    <form action=\"/search\" method=\"GET\" role=\"search\">\n      <label for=\"search\">Search our site:</label>\n      <input type=\"search\" id=\"search\" name=\"q\" placeholder=\"What are you looking for?\">\n      <button type=\"submit\">Search</button>\n    </form>\n\n    <!-- Helpful links -->\n    <nav aria-label=\"Helpful links\">\n      <h2>Try these instead:</h2>\n      <ul>\n        <li><a href=\"/\">Home</a></li>\n        <li><a href=\"/products\">Products</a></li>\n        <li><a href=\"/blog\">Blog</a></li>\n        <li><a href=\"/contact\">Contact Us</a></li>\n      </ul>\n    </nav>\n  </main>\n</body>\n</html>\n```\n\n## Why It Matters\n\nA generic browser 404 page causes users to leave immediately—a well-designed custom page provides recovery paths and keeps users engaged with your site.\n\n## Essential Elements\n\n| Element | Purpose |\n|---------|---------|\n| Clear message | Explain the page wasn't found |\n| Search box | Help users find what they need |\n| Navigation links | Quick access to main sections |\n| Popular content | Suggest relevant pages |\n| Home link | Easy return to start |\n| Contact option | Report broken links |\n\n## Next.js Implementation\n\n```tsx\n// app/not-found.tsx\n\n  return (\n    <main className=\"min-h-screen flex items-center justify-center px-4\">\n      <div className=\"text-center max-w-md\">\n        <h1 className=\"text-6xl font-bold text-gray-900 mb-4\">404</h1>\n        <h2 className=\"text-2xl font-semibold mb-4\">Page Not Found</h2>\n        <p className=\"text-gray-600 mb-8\">\n          The page you're looking for doesn't exist or has been moved.\n        </p>\n\n        <div className=\"space-y-4\">\n          \n            Go Home\n          \n\n          \n            Search Site\n          \n        </div>\n\n        <nav className=\"mt-8\" aria-label=\"Popular pages\">\n          <h3 className=\"text-sm font-semibold text-gray-500 mb-3\">\n            Popular Pages\n          </h3>\n          <ul className=\"space-y-2\">\n            <li>Products</li>\n            <li>Documentation</li>\n            <li>Blog</li>\n          </ul>\n        </nav>\n      </div>\n    </main>\n  )\n}\n```\n\n## React Component with Error Tracking\n\n```tsx\ninterface NotFoundPageProps {\n  searchEnabled?: boolean\n  popularLinks?: Array<{ href: string; label: string }>\n}\n\n  searchEnabled = true,\n  popularLinks = []\n}: NotFoundPageProps) {\n  // Track 404 for analytics\n  useEffect(() => {\n    // Report to analytics\n    if (typeof window !== 'undefined') {\n      const path = window.location.pathname\n      console.error(`404 Error: ${path}`)\n\n      // Send to analytics service\n      analytics?.track('404_error', { path, referrer: document.referrer })\n    }\n  }, [])\n\n  return (\n    <main role=\"main\" className=\"error-page\">\n      <div className=\"error-content\">\n        <h1>Oops! Page not found</h1>\n        <p>\n          We couldn't find the page you're looking for.\n          It may have been moved or deleted.\n        </p>\n\n        {searchEnabled && (\n          <form action=\"/search\" method=\"GET\" role=\"search\" className=\"search-form\">\n            <label htmlFor=\"error-search\" className=\"sr-only\">\n              Search\n            </label>\n            <input\n              type=\"search\"\n              id=\"error-search\"\n              name=\"q\"\n              placeholder=\"Search...\"\n              aria-label=\"Search site\"\n            />\n            <button type=\"submit\">Search</button>\n          </form>\n        )}\n\n        {popularLinks.length > 0 && (\n          <nav aria-label=\"Suggested pages\">\n            <h2>You might be looking for:</h2>\n            <ul>\n              {popularLinks.map(link => (\n                <li key={link.href}>\n                  <a href={link.href}>{link.label}</a>\n                </li>\n              ))}\n            </ul>\n          </nav>\n        )}\n\n        <a href=\"/\" className=\"home-link\">\n          ← Back to Home\n        </a>\n      </div>\n    </main>\n  )\n}\n```\n\n## Server Configuration\n\n```nginx\n# Nginx\nserver {\n    error_page 404 /404.html;\n    location = /404.html {\n        root /var/www/html;\n        internal;\n    }\n}\n```\n\n```apache\n# Apache .htaccess\nErrorDocument 404 /404.html\n```\n\n## 404 Error Tracking\n\n```tsx\n// middleware.ts (Next.js)\n\n  // Log 404s for monitoring\n  const response = NextResponse.next()\n\n  // You can check response status and log accordingly\n  // This runs before the 404 page renders\n\n  return response\n}\n\n// Alternative: Track in the 404 page itself\n// app/not-found.tsx\n'use client'\n\n  const pathname = usePathname()\n\n  useEffect(() => {\n    // Send to error tracking service\n    fetch('/api/track-404', {\n      method: 'POST',\n      body: JSON.stringify({\n        path: pathname,\n        referrer: document.referrer,\n        timestamp: new Date().toISOString()\n      })\n    })\n  }, [pathname])\n\n  return (/* ... */)\n}\n```\n\n## SEO Considerations\n\n```html\n<head>\n  <!-- Prevent 404 pages from being indexed -->\n  <meta name=\"robots\" content=\"noindex, nofollow\">\n\n  <!-- Return proper 404 status code (server-side) -->\n  <!-- Next.js handles this automatically for not-found.tsx -->\n</head>\n```\n\n## Avoid Soft 404s\n\nA branded \"page not found\" template is still a search bug if the server responds with `200 OK`. Search engines can treat that as a soft 404, which wastes crawl budget and may surface broken pages in reports.\n\n## Styling Best Practices\n\n```css\n.error-page {\n  min-height: 100vh;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 2rem;\n  text-align: center;\n}\n\n.error-content {\n  max-width: 500px;\n}\n\n.error-page h1 {\n  font-size: 3rem;\n  margin-bottom: 1rem;\n}\n\n/* Keep consistent with site branding */\n.error-page {\n  font-family: inherit;\n  background: var(--background);\n  color: var(--foreground);\n}\n\n/* Ensure search is prominent */\n.search-form {\n  margin: 2rem 0;\n}\n\n.search-form input {\n  padding: 0.75rem 1rem;\n  font-size: 1rem;\n  width: 100%;\n  max-width: 300px;\n}\n```\n\n## Verification\n\n1. Navigate to a non-existent URL\n2. Verify HTTP 404 status code is returned\n3. Check page includes navigation options\n4. Test search functionality works\n5. Verify page is not indexed (check robots meta)\n6. Test on mobile devices\n7. Verify screen reader announces content properly\n8. Confirm the missing URL appears as a real 404 in DevTools Network, not a 200 soft-404 response\n\nA custom 404 page must return HTTP status code 404, not 200. Search engines treat 200 responses as valid pages, potentially indexing your error page content.","isInternal":false,"tokens":1772,"sizeBytes":7133},{"name":"SKILL.md","path":"skills/404-page/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/404-page/SKILL.md","title":"404-page","category":"anthropic-skill","format":"markdown","content":"---\nname: 404-page\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Create a custom 404 error page. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: beginner\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/404-page\n---\n\n# Create a custom 404 error page\n\nA generic browser 404 page causes users to leave immediately—a well-designed custom page provides recovery paths and keeps users engaged with your site.\n\n## Quick Reference\n\n- Custom 404 pages retain users who encounter broken or moved links\n- Include search, navigation, and links to popular content\n- Maintain consistent branding and site design\n- Track 404 errors to identify and fix broken links\n- Return a real HTTP 404 so the page is not treated as a soft 404\n\n## Check\n\nVerify that this website has a custom 404 error page with helpful navigation options. Confirm the route returns HTTP 404 and not a branded page with a 200 response.\n\n## Fix\n\nCreate a user-friendly 404 page with search functionality and links to important pages. Ensure the server or framework returns status code 404 so the page does not become a soft 404.\n\n## Explain\n\nExplain how custom 404 pages help retain users who encounter broken links and why returning 200 for missing pages creates soft-404 indexing problems.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Create a custom 404 error page. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/404-page\n","frontmatter":{"name":"404-page","description":"Use when reviewing templates, rendered HTML, or shared components related to Create a custom 404 error page. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/404-page"}},"isInternal":false,"tokens":387,"sizeBytes":1846},{"name":"rule.md","path":"skills/about-page/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/about-page/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Create a dedicated About page\n\n> Checks for a dedicated about or company page with meaningful content.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nAn About page provides essential context about the source of the information on your website. It helps search engines and users understand the expertise and authority behind the content.\n\n## Code Example\n\nEnsure the About page is easily discoverable, typically via the main navigation or the footer.\n\n```html\n<footer>\n  <nav aria-label=\"Footer Navigation\">\n    <ul>\n      <li><a href=\"/about\">About Us</a></li>\n      <li><a href=\"/contact\">Contact</a></li>\n      <li><a href=\"/privacy-policy\">Privacy Policy</a></li>\n    </ul>\n  </nav>\n</footer>\n```\n\n## Why It Matters\n\n- **E-E-A-T**: Directly supports the Trustworthiness and Authoritativeness pillars of Google's Quality Rater Guidelines.\n- **Transparency**: Shows users who you are, reducing bounce rates and building long-term brand loyalty.\n- **Entity Recognition**: Helps search engines connect your website to a real-world entity (person or organization).\n- **Compliance**: For many industries, identifying the content creator is a legal or regulatory requirement.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","isInternal":false,"tokens":483,"sizeBytes":2427},{"name":"SKILL.md","path":"skills/about-page/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/about-page/SKILL.md","title":"about-page","category":"anthropic-skill","format":"markdown","content":"---\nname: about-page\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Create a dedicated About page. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/about-page\n---\n\n# Create a dedicated About page\n\nAn About page is a primary trust signal for both users and search engines, directly impacting the website's E-E-A-T profile and overall credibility.\n\n## Quick Reference\n\n- Include a dedicated page explaining the purpose, history, and mission of the website\n- Introduce the key people or organization behind the content to build trust\n- Provide clear evidence of expertise and contact information\n\n## Check\n\nVerify that the website has a dedicated About page that clearly identifies the people or organization responsible for the content.\n\n## Fix\n\nCreate a new page at `/about` and add detailed information about your organization, mission, and the experts behind your content.\n\n## Explain\n\nExplain how an About page contributes to E-E-A-T (Experience, Expertise, Authoritativeness, and Trustworthiness) and why it's a critical SEO factor.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Create a dedicated About page. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/about-page\n","frontmatter":{"name":"about-page","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Create a dedicated About page. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/about-page"}},"isInternal":false,"tokens":351,"sizeBytes":1739},{"name":"rule.md","path":"skills/accessibility-testing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessibility-testing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Include accessibility testing\n\n> Automate accessibility testing with tools like axe-core, jest-axe, or Playwright's accessibility testing.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 30 min\n\n---\nAutomated accessibility testing catches common WCAG violations before they reach production, protecting your users and reducing legal risk.\n\n## Code Example\n\n```javascript\n\nexpect.extend(toHaveNoViolations)\n\ndescribe('Button', () => {\n  it('should have no accessibility violations', async () => {\n    const { container } = render(\n       {}}>Click me\n    )\n    const results = await axe(container)\n    expect(results).toHaveNoViolations()\n  })\n})\n\n// Test specific rules\nit('should have proper color contrast', async () => {\n  const { container } = render(Warning)\n  const results = await axe(container, {\n    rules: {\n      'color-contrast': { enabled: true }\n    }\n  })\n  expect(results).toHaveNoViolations()\n})\n```\n\n## Why It Matters\n\nAutomated accessibility testing catches 30-50% of WCAG violations before code reaches users—reducing legal risk and improving usability for everyone.\n\n## Testing Tools\n\n| Tool | Use Case | Framework |\n|------|----------|-----------|\n| jest-axe | Unit/component tests | Jest |\n| @axe-core/playwright | E2E tests | Playwright |\n| cypress-axe | E2E tests | Cypress |\n| pa11y | CI/CD pipeline | Any |\n\n## Playwright\n\n```typescript\n\ntest.describe('Homepage accessibility', () => {\n  test('should have no violations', async ({ page }) => {\n    await page.goto('/')\n\n    const accessibilityScanResults = await new AxeBuilder({ page }).analyze()\n\n    expect(accessibilityScanResults.violations).toEqual([])\n  })\n\n  test('should have no violations on mobile', async ({ page }) => {\n    await page.setViewportSize({ width: 375, height: 667 })\n    await page.goto('/')\n\n    const results = await new AxeBuilder({ page })\n      .withTags(['wcag2a', 'wcag2aa'])\n      .analyze()\n\n    expect(results.violations).toEqual([])\n  })\n})\n```\n\n## Cypress\n\n```javascript\n\ndescribe('Form accessibility', () => {\n  beforeEach(() => {\n    cy.visit('/contact')\n    cy.injectAxe()\n  })\n\n  it('should have no violations on load', () => {\n    cy.checkA11y()\n  })\n\n  it('should have no violations after form errors', () => {\n    cy.get('button[type=\"submit\"]').click()\n    cy.checkA11y()\n  })\n\n  it('should exclude known issues', () => {\n    cy.checkA11y(null, {\n      rules: {\n        'color-contrast': { enabled: false } // Known issue, tracked in backlog\n      }\n    })\n  })\n})\n```\n\n## CI/CD Integration\n\n```yaml\n# GitHub Actions\nname: Accessibility Tests\non: [push, pull_request]\n\njobs:\n  a11y:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - run: npm ci\n      - run: npm run test:a11y\n      - uses: actions/upload-artifact@v4\n        if: failure()\n        with:\n          name: a11y-report\n          path: a11y-report.html\n```\n\n## Lighthouse CI Accessibility\n\n```json\n{\n  \"ci\": {\n    \"assert\": {\n      \"assertions\": {\n        \"categories:accessibility\": [\"error\", { \"minScore\": 0.9 }],\n        \"image-alt\": \"error\",\n        \"label\": \"error\",\n        \"link-name\": \"error\"\n      }\n    }\n  }\n}\n```\n\n## Tools & Validation\n\nAutomated checks are a floor, not a ceiling.\n\nTypically caught automatically:\n\n- Missing alt text\n- Missing form labels\n- Invalid ARIA roles and attributes\n- Many color-contrast failures\n\nUsually still manual:\n\n- Whether alt text is actually meaningful\n- Keyboard interaction quality in complex widgets\n- Screen reader announcements and reading order\n- Whether the flow is understandable, not just technically valid\n\n## Verification\n\n### Automated Checks\n\n- Run the accessibility test suite locally and confirm new violations fail the build or test run; the default target should be `<= 0` unexpected axe violations for covered states.\n- Pair automated coverage with manual keyboard and screen-reader checks for at least one critical user flow.\n- Track ignored or suppressed rules explicitly so temporary exceptions do not become permanent blind spots.\n\n### Manual Checks\n\n- Ensure the suite covers high-risk states such as modal open, form validation errors, and mobile layouts.","isInternal":false,"tokens":989,"sizeBytes":4199},{"name":"SKILL.md","path":"skills/accessibility-testing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessibility-testing/SKILL.md","title":"accessibility-testing","category":"anthropic-skill","format":"markdown","content":"---\nname: accessibility-testing\ndescription: \"Use when reviewing component libraries, page flows, or CI pipelines that need repeatable accessibility checks. Automated testing is strongest at catching structural and attribute-level issues; it does not replace keyboard, screen reader, and manual UX testing.\"\nmetadata:\n  category: testing\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"30\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/testing/accessibility-testing\n---\n\n# Include accessibility testing\n\nAutomated accessibility testing catches 30-50% of WCAG violations before code reaches users—reducing legal risk and improving usability for everyone.\n\n## Quick Reference\n\n- Use jest-axe for component-level accessibility testing\n- Integrate @axe-core/playwright or cypress-axe for E2E a11y tests\n- Run accessibility tests in CI/CD to catch regressions early\n- Test specific WCAG rules like color-contrast individually\n\n## Check\n\nReview this test suite for accessibility testing coverage using axe-core, jest-axe, or similar tools.\n\n## Fix\n\nAdd automated accessibility testing to detect WCAG violations in components and pages.\n\n## Explain\n\nExplain how to implement automated accessibility testing and what issues it can detect.\n\n## Code Review\n\nInspect component tests, E2E suites, and CI workflows for automated accessibility coverage. Flag critical pages or shared components that ship without axe-based checks, and note issues that still require manual keyboard or screen reader validation.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/testing/accessibility-testing\n","frontmatter":{"name":"accessibility-testing","description":"Use when reviewing component libraries, page flows, or CI pipelines that need repeatable accessibility checks. Automated testing is strongest at catching structural and attribute-level issues; it does not replace keyboard, screen reader, and manual UX testing.","metadata":{"category":"testing","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/accessibility-testing"}},"isInternal":false,"tokens":341,"sizeBytes":1730},{"name":"rule.md","path":"skills/accessible-authentication/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessible-authentication/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Provide accessible authentication methods\n\n> Authentication flows avoid unnecessary cognitive tests and support assistive mechanisms such as password managers, paste, OTP autofill, and passkeys.\n\n**Priority:** high · **Difficulty:** advanced · **Time:** 25 min\n\n---\nAuthentication should not depend on the user's ability to memorize, transcribe, or manually reproduce information when an assistive path is feasible. Good accessible authentication usually improves security too, because it works with password managers, device-based verification, and passkeys rather than against them.\n\n## Code Example\n\n```html\n<!-- Better: password-manager and OTP-friendly fields -->\n<label for=\"email\">Email</label>\n<input id=\"email\" name=\"email\" type=\"email\" autocomplete=\"username webauthn\">\n\n<label for=\"password\">Password</label>\n<input\n  id=\"password\"\n  name=\"password\"\n  type=\"password\"\n  autocomplete=\"current-password\">\n\n<label for=\"otp\">Verification code</label>\n<input\n  id=\"otp\"\n  name=\"otp\"\n  inputmode=\"numeric\"\n  autocomplete=\"one-time-code\">\n```\n\n```tsx\nfunction VerifyCodeField({\n  onSubmit,\n}: {\n  onSubmit: (code: string) => void\n}) {\n  return (\n    <form\n      onSubmit={(event) => {\n        event.preventDefault()\n        const formData = new FormData(event.currentTarget)\n        onSubmit(String(formData.get('otp') ?? ''))\n      }}\n    >\n      <label htmlFor=\"otp\">Enter the verification code</label>\n      <input\n        autoComplete=\"one-time-code\"\n        id=\"otp\"\n        inputMode=\"numeric\"\n        name=\"otp\"\n        type=\"text\"\n      />\n\n      <button type=\"submit\">Continue</button>\n    </form>\n  )\n}\n```\n\n```html\n<!-- Better: offer a non-memory-dependent alternative -->\n<button type=\"button\">Continue with a passkey</button>\n<button type=\"button\">Email me a sign-in link</button>\n```\n\n## Why It Matters\n\nMany authentication patterns are built around unnecessary friction: blocked paste, custom OTP widgets that break autofill, CAPTCHA transcription, or backup questions that require memory instead of possession-based proof.\n\n- cognitive barriers prevent account access before the user can do anything else\n- password-manager hostility leads to weaker, reused passwords\n- speech, switch, and keyboard-only users face more effort when copy/paste and autofill are disabled\n- recovery and MFA steps often fail even when the main login form looks acceptable\n\n## Best Practices\n\n### Support assisted entry\n\nAuthentication should work with:\n\n- password managers\n- pasted credentials and codes\n- OS/browser OTP autofill\n- passkeys or device approval when available\n\nDo not split a one-time code into a widget that breaks standard autofill unless you have verified the real browser behavior.\n\n### Provide a non-memory-dependent path\n\nAt least one viable route through sign-in, MFA, and recovery should avoid a cognitive function test. Good examples include:\n\n- passkeys\n- approval on a trusted device\n- magic links\n- password-manager-assisted password entry\n\n### Keep anti-abuse controls proportional\n\nIf you use CAPTCHA or other abuse mitigations in auth flows, provide an alternative path that does not force memorization or transcription. Accessibility and abuse prevention must be designed together, not as competing concerns.\n\n## Standards\n\n- This rule maps to WCAG 2.2 Success Criterion 3.3.8 Accessible Authentication (Minimum).\n- The practical goal is not \"less security\"; it is at least one viable path that does not depend on a cognitive function test.\n\n## Exceptions\n\n- Re-entering a newly created password can be a valid security exception when the system does not reveal the password back to the user.\n- MFA is compatible with this rule, but the user still needs at least one practical path that does not rely on memorizing or transcribing information.\n- Accessibility does not require removing security; it requires choosing security controls that users can actually complete.\n\n## Verification\n\n### Automated Checks\n\n- Search auth flows for blocked paste handlers, OTP widgets, and missing autocomplete attributes.\n- Verify username, current-password, new-password, and one-time-code fields use appropriate semantics.\n\n### Manual Checks\n\n- Test sign-in with a password manager.\n- Paste an OTP or let the browser autofill it where supported.\n- Exercise recovery and MFA flows, not only the primary login form.\n- Fail if the only available path requires memorizing, transcribing, or solving a cognitive test without an assisted alternative.","isInternal":false,"tokens":918,"sizeBytes":4466},{"name":"SKILL.md","path":"skills/accessible-authentication/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessible-authentication/SKILL.md","title":"accessible-authentication","category":"anthropic-skill","format":"markdown","content":"---\nname: accessible-authentication\ndescription: \"Use when reviewing sign-in, sign-up, MFA, CAPTCHA, recovery, and re-auth flows. Evaluate the full authentication path, including error handling and backup methods, not just the primary login form.\"\nmetadata:\n  category: accessibility\n  priority: high\n  difficulty: advanced\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accessible-authentication\n---\n\n# Provide accessible authentication methods\n\nAuthentication often becomes the first hard blocker for users with cognitive, motor, low-vision, or speech-input needs. If sign-in, MFA, or recovery relies on memorization or transcription with no assisted path, the user may be locked out before they can access the product at all.\n\n## Quick Reference\n\n- Do not block paste or password managers in login and recovery flows\n- Prefer passkeys, magic links, device approval, or password-manager-friendly flows\n- Support OTP autofill and paste with appropriate semantics such as `autocomplete=\"one-time-code\"`\n- Avoid CAPTCHA or secondary checks that require memorizing or transcribing information without an alternative\n\n## Check\n\nReview login, MFA, password reset, and account recovery for accessible authentication problems. Flag blocked paste, password-manager hostility, manual transcription requirements, inaccessible OTP handling, and CAPTCHA or knowledge checks without a compliant alternative.\n\n## Fix\n\nAdd password-manager-friendly fields, support paste and OTP autofill, and provide at least one authentication path that does not depend on a cognitive function test.\n\n## Explain\n\nExplain WCAG Accessible Authentication, why memorization and transcription are barriers, and how passkeys, password managers, OTP autofill, and device approval improve both accessibility and security.\n\n## Code Review\n\nReview authentication pages, MFA steps, recovery flows, and security controls related to Provide accessible authentication methods. Flag exact steps that require memorization, transcription, blocked assistive tooling, or inaccessible fallback paths.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accessible-authentication\n","frontmatter":{"name":"accessible-authentication","description":"Use when reviewing sign-in, sign-up, MFA, CAPTCHA, recovery, and re-auth flows. Evaluate the full authentication path, including error handling and backup methods, not just the primary login form.","metadata":{"category":"accessibility","priority":"high","difficulty":"advanced","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/accessible-authentication"}},"isInternal":false,"tokens":443,"sizeBytes":2314},{"name":"rule.md","path":"skills/accessible-notifications/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessible-notifications/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Make notifications accessible\n\n> Toast notifications and alerts are announced to screen readers using ARIA live regions and appropriate roles.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 25 min\n\n---\nAccessible notifications ensure all users receive important feedback about actions and state changes.\n\n## Code Example\n\n```html\n<!-- Status notification (polite) -->\n<div role=\"status\" aria-live=\"polite\" class=\"notification\">\n  Your changes have been saved.\n</div>\n\n<!-- Alert notification (assertive) -->\n<div role=\"alert\" aria-live=\"assertive\" class=\"notification notification--error\">\n  Error: Please fill in all required fields.\n</div>\n\n<!-- Live region container (content injected dynamically) -->\n<div\n  id=\"notifications\"\n  aria-live=\"polite\"\n  aria-atomic=\"true\"\n  class=\"sr-only\"\n></div>\n```\n\n## Why It Matters\n\nWithout proper ARIA attributes, screen reader users miss critical notifications like form errors, success messages, and real-time updates—leaving them unaware of important page changes.\n\n## ARIA Live Region Types\n\n| Attribute | Behavior | Use For |\n|-----------|----------|---------|\n| `aria-live=\"polite\"` | Waits for user pause | Status updates, non-urgent info |\n| `aria-live=\"assertive\"` | Interrupts immediately | Errors, time-sensitive alerts |\n| `role=\"status\"` | Implicit polite | Progress, success messages |\n| `role=\"alert\"` | Implicit assertive | Errors, warnings |\n\n## React Toast Component\n\n```tsx\n\ntype NotificationType = 'success' | 'error' | 'warning' | 'info'\n\ninterface ToastProps {\n  message: string\n  type: NotificationType\n  duration?: number\n  onDismiss: () => void\n}\n\n  message,\n  type,\n  duration = 5000,\n  onDismiss\n}: ToastProps) {\n  const toastRef = useRef(null)\n\n  // Auto-dismiss after duration\n  useEffect(() => {\n    if (duration > 0) {\n      const timer = setTimeout(onDismiss, duration)\n      return () => clearTimeout(timer)\n    }\n  }, [duration, onDismiss])\n\n  // Focus toast for keyboard users\n  useEffect(() => {\n    toastRef.current?.focus()\n  }, [])\n\n  const isError = type === 'error' || type === 'warning'\n\n  return (\n    <div\n      ref={toastRef}\n      role={isError ? 'alert' : 'status'}\n      aria-live={isError ? 'assertive' : 'polite'}\n      aria-atomic=\"true\"\n      tabIndex={-1}\n      className={`toast toast--${type}`}\n    >\n      <span className=\"toast__icon\" aria-hidden=\"true\">\n        {type === 'success' && '✓'}\n        {type === 'error' && '✕'}\n        {type === 'warning' && '⚠'}\n        {type === 'info' && 'ℹ'}\n      </span>\n\n      <span className=\"toast__message\">{message}</span>\n\n      <button\n        type=\"button\"\n        onClick={onDismiss}\n        aria-label=\"Dismiss notification\"\n        className=\"toast__dismiss\"\n      >\n        ×\n      </button>\n    </div>\n  )\n}\n```\n\n## Toast Container with Live Region\n\n```tsx\n\ninterface Notification {\n  id: string\n  message: string\n  type: NotificationType\n  duration?: number\n}\n\ninterface ToastContextType {\n  addToast: (notification: Omit\n      {children}\n\n      {/* Toast container with live region */}\n      <div\n        className=\"toast-container\"\n        aria-label=\"Notifications\"\n      >\n        {toasts.map(toast => (\n           removeToast(toast.id)}\n          />\n        ))}\n      </div>\n\n      {/* Screen reader announcement region */}\n      <div\n        role=\"status\"\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        className=\"sr-only\"\n      >\n        {toasts.length > 0 && toasts[toasts.length - 1].message}\n      </div>\n    </ToastContext.Provider>\n  )\n}\n\n  const context = useContext(ToastContext)\n  if (!context) throw new Error('useToast must be used within ToastProvider')\n  return context\n}\n```\n\n## Usage Example\n\n```tsx\nfunction SaveButton() {\n  const { addToast } = useToast()\n\n  const handleSave = async () => {\n    try {\n      await saveData()\n      addToast({\n        message: 'Changes saved successfully',\n        type: 'success',\n        duration: 3000\n      })\n    } catch (error) {\n      addToast({\n        message: 'Failed to save changes. Please try again.',\n        type: 'error',\n        duration: 0 // Don't auto-dismiss errors\n      })\n    }\n  }\n\n  return <button onClick={handleSave}>Save</button>\n}\n```\n\n## Inline Notifications\n\n```tsx\ninterface InlineNotificationProps {\n  type: 'error' | 'warning' | 'success' | 'info'\n  title?: string\n  children: React.ReactNode\n  dismissible?: boolean\n  onDismiss?: () => void\n}\n\n  type,\n  title,\n  children,\n  dismissible = false,\n  onDismiss\n}: InlineNotificationProps) {\n  const isUrgent = type === 'error' || type === 'warning'\n\n  return (\n    <div\n      role={isUrgent ? 'alert' : 'status'}\n      aria-live={isUrgent ? 'assertive' : 'polite'}\n      className={`notification notification--${type}`}\n    >\n      {title && (\n        <strong className=\"notification__title\">{title}</strong>\n      )}\n      <div className=\"notification__content\">{children}</div>\n\n      {dismissible && (\n        <button\n          type=\"button\"\n          onClick={onDismiss}\n          aria-label=\"Dismiss\"\n          className=\"notification__dismiss\"\n        >\n          ×\n        </button>\n      )}\n    </div>\n  )\n}\n```\n\n## Progress Notifications\n\n```tsx\nfunction UploadProgress({ progress, fileName }: { progress: number; fileName: string }) {\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      aria-busy={progress < 100}\n      className=\"upload-progress\"\n    >\n      <span className=\"sr-only\">\n        Uploading {fileName}: {progress}% complete\n      </span>\n\n      <div aria-hidden=\"true\">\n        <span>{fileName}</span>\n        <progress value={progress} max=\"100\" />\n        <span>{progress}%</span>\n      </div>\n    </div>\n  )\n}\n```\n\n## Timing Guidelines\n\n| Notification Type | Recommended Duration |\n|-------------------|---------------------|\n| Success messages | 3-5 seconds |\n| Info/status | 5-7 seconds |\n| Warnings | 8-10 seconds or manual dismiss |\n| Errors | No auto-dismiss (manual only) |\n\n```tsx\nconst DURATION_MAP = {\n  success: 3000,\n  info: 5000,\n  warning: 8000,\n  error: 0, // No auto-dismiss\n} as const\n```\n\n## Styling\n\n```css\n.toast-container {\n  position: fixed;\n  bottom: 1rem;\n  right: 1rem;\n  z-index: 1000;\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n\n.toast {\n  display: flex;\n  align-items: center;\n  gap: 0.75rem;\n  padding: 1rem;\n  border-radius: 0.5rem;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n  animation: slideIn 0.3s ease-out;\n}\n\n.toast--success { background: #d4edda; border-left: 4px solid #28a745; }\n.toast--error { background: #f8d7da; border-left: 4px solid #dc3545; }\n.toast--warning { background: #fff3cd; border-left: 4px solid #ffc107; }\n.toast--info { background: #d1ecf1; border-left: 4px solid #17a2b8; }\n\n.toast__dismiss {\n  background: none;\n  border: none;\n  font-size: 1.25rem;\n  cursor: pointer;\n  padding: 0.25rem;\n  margin-left: auto;\n}\n\n/* Screen reader only */\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\n@keyframes slideIn {\n  from {\n    transform: translateX(100%);\n    opacity: 0;\n  }\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n/* Respect motion preferences */\n@media (prefers-reduced-motion: reduce) {\n  .toast {\n    animation: none;\n  }\n}\n```\n\n## Verification\n\n1. Enable screen reader and trigger notifications\n2. Verify announcements occur at appropriate times\n3. Test keyboard dismissal (Escape key)\n4. Check notifications don't disappear too quickly\n5. Verify focus management after dismissal\n6. Test with different screen readers (NVDA, VoiceOver, JAWS)\n\nReserve `aria-live=\"assertive\"` for truly urgent messages. Overuse disrupts the user experience by constantly interrupting screen reader output.","isInternal":false,"tokens":2018,"sizeBytes":7770},{"name":"SKILL.md","path":"skills/accessible-notifications/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessible-notifications/SKILL.md","title":"accessible-notifications","category":"anthropic-skill","format":"markdown","content":"---\nname: accessible-notifications\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Make notifications accessible. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accessible-notifications\n---\n\n# Make notifications accessible\n\nWithout proper ARIA attributes, screen reader users miss critical notifications like form errors, success messages, and real-time updates—leaving them unaware of important page changes.\n\n## Quick Reference\n\n- Use aria-live regions to announce dynamic content changes\n- Choose between 'polite' (waits) and 'assertive' (interrupts) based on urgency\n- Ensure notifications persist long enough to be read\n- Provide visible and programmatic dismiss options\n\n## Check\n\nVerify notifications use aria-live regions, appropriate role (alert or status), and persist long enough to be read.\n\n## Fix\n\nImplement notifications with role='alert' or role='status', aria-live='polite' or 'assertive', and adequate display time.\n\n## Explain\n\nExplain how accessible notifications ensure all users are informed of important updates regardless of how they interact with the page.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Make notifications accessible. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accessible-notifications\n","frontmatter":{"name":"accessible-notifications","description":"Use when reviewing templates, rendered HTML, or shared components related to Make notifications accessible. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/accessible-notifications"}},"isInternal":false,"tokens":344,"sizeBytes":1754},{"name":"rule.md","path":"skills/accessible-tables/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessible-tables/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Use semantic table markup for screen readers\n\n> Data tables use proper semantic markup with headers, captions, and scope attributes for screen reader accessibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nProper table markup enables screen readers to announce header-cell relationships, making data understandable.\n\n## Code Example\n\n```html\n<table>\n  <caption>Q1 2024 Sales by Region</caption>\n  <thead>\n    <tr>\n      <th scope=\"col\">Region</th>\n      <th scope=\"col\">January</th>\n      <th scope=\"col\">February</th>\n      <th scope=\"col\">March</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">North</th>\n      <td>$12,000</td>\n      <td>$14,500</td>\n      <td>$13,200</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">South</th>\n      <td>$9,800</td>\n      <td>$11,000</td>\n      <td>$10,500</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## Why It Matters\n\nScreen readers read table data cell-by-cell—without proper headers, users hear meaningless numbers without context. 'Row 3, Column 2: $99' vs just '$99'.\n\n## Scope Attribute\n\n| Value | Use When |\n|-------|----------|\n| `scope=\"col\"` | Header applies to column below |\n| `scope=\"row\"` | Header applies to row beside it |\n| `scope=\"colgroup\"` | Header spans multiple columns |\n| `scope=\"rowgroup\"` | Header spans multiple rows |\n\n## Complex Tables with Headers Attribute\n\n```html\n<table>\n  <caption>Sales Report</caption>\n  <thead>\n    <tr>\n      <th id=\"region\" rowspan=\"2\">Region</th>\n      <th id=\"q1\" colspan=\"2\">Q1</th>\n      <th id=\"q2\" colspan=\"2\">Q2</th>\n    </tr>\n    <tr>\n      <th id=\"q1-units\" headers=\"q1\">Units</th>\n      <th id=\"q1-revenue\" headers=\"q1\">Revenue</th>\n      <th id=\"q2-units\" headers=\"q2\">Units</th>\n      <th id=\"q2-revenue\" headers=\"q2\">Revenue</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th id=\"north\" headers=\"region\">North</th>\n      <td headers=\"north q1 q1-units\">150</td>\n      <td headers=\"north q1 q1-revenue\">$15,000</td>\n      <td headers=\"north q2 q2-units\">180</td>\n      <td headers=\"north q2 q2-revenue\">$18,000</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## React Table Component\n\n```tsx\ninterface Column{caption}</caption>\n      <thead>\n        <tr>\n          {columns.map(col => (\n            <th key={String(col.key)} scope=\"col\">\n              {col.header}\n            </th>\n          ))}\n        </tr>\n      </thead>\n      <tbody>\n        {data.map((row, i) => (\n          <tr key={i}>\n            {columns.map(col => {\n              const isRowHeader = col.key === rowHeader\n              const Tag = isRowHeader ? 'th' : 'td'\n              return (\n                \n                  {String(row[col.key])}\n                \n              )\n            })}\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  )\n}\n```\n\n## Responsive Tables\n\n```html\n<!-- Scrollable wrapper for mobile -->\n<div class=\"table-wrapper\" tabindex=\"0\" role=\"region\" aria-label=\"Sales data table\">\n  <table>\n    <!-- Table content -->\n  </table>\n</div>\n```\n\n```css\n.table-wrapper {\n  overflow-x: auto;\n  max-width: 100%;\n}\n\n/* Focus indicator for keyboard users scrolling */\n.table-wrapper:focus {\n  outline: 2px solid #005fcc;\n}\n```\n\n## Exceptions\n\n- Simple data tables can sometimes fail more from missing header relationships than from missing enhancements such as captions or mobile wrappers, so prioritize the strongest semantic issue.\n- Do not convert layout structures into data-table markup just to satisfy a rule; the correct fix may be to remove table semantics entirely.\n- When several table-accessibility issues overlap, resolve the header-cell relationship first because downstream announcements depend on it.\n\n## Verification\n\n### Automated Checks\n\n- Use browser accessibility tooling, axe, Lighthouse, or equivalent automated checks against a representative rendered state.\n\n### Manual Checks\n\n- Use screen reader table navigation (Ctrl+Alt+Arrow keys in NVDA)\n- Verify headers are announced with each cell\n- Check caption describes the table purpose\n- Confirm table is not used for layout","isInternal":false,"tokens":1057,"sizeBytes":4049},{"name":"SKILL.md","path":"skills/accessible-tables/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessible-tables/SKILL.md","title":"accessible-tables","category":"anthropic-skill","format":"markdown","content":"---\nname: accessible-tables\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use semantic table markup for screen readers. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accessible-tables\n---\n\n# Use semantic table markup for screen readers\n\nScreen readers read table data cell-by-cell—without proper headers, users hear meaningless numbers without context. 'Row 3, Column 2: $99' vs just '$99'.\n\n## Quick Reference\n\n- Use <th> elements for headers with scope='col' or scope='row'\n- Add <caption> to describe the table's purpose\n- Never use tables for layout—use CSS Grid or Flexbox instead\n- Use id/headers for complex tables with merged cells\n- For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n- Prefer one strong table-semantics finding over multiple weaker enhancements on the same simple table\n\n## Check\n\nVerify tables use proper th elements with scope, caption or aria-labelledby, and semantic table structure.\n\n## Fix\n\nAdd proper table headers with scope attributes, captions for context, and ensure tables are not used for layout.\n\n## Explain\n\nExplain how proper table markup helps screen reader users understand data relationships and navigate table content.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Use semantic table markup for screen readers. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accessible-tables\n","frontmatter":{"name":"accessible-tables","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use semantic table markup for screen readers. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/accessible-tables"}},"isInternal":false,"tokens":418,"sizeBytes":2088},{"name":"rule.md","path":"skills/accessible-tooltips/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessible-tooltips/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Create accessible tooltips\n\n> Tooltips are accessible to keyboard users and screen readers with proper ARIA attributes and focus handling.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nAccessible tooltips provide supplementary information without excluding keyboard or screen reader users.\n\n## Code Example\n\n```html\n<div class=\"tooltip-container\">\n  <button\n    type=\"button\"\n    aria-describedby=\"tooltip-1\"\n    class=\"tooltip-trigger\"\n  >\n    Settings\n  </button>\n  <div\n    id=\"tooltip-1\"\n    role=\"tooltip\"\n    class=\"tooltip\"\n  >\n    Configure your preferences\n  </div>\n</div>\n```\n\n## Why It Matters\n\nInaccessible tooltips leave keyboard and screen reader users without important contextual information, creating an unequal experience and potential confusion.\n\n## Accessibility Requirements\n\n| Requirement | Implementation |\n|-------------|----------------|\n| Keyboard accessible | Show on focus, not just hover |\n| Programmatically associated | Use `aria-describedby` |\n| Dismissible | Close with Escape key |\n| Persistent | Stay visible while hovered/focused |\n| Non-essential | Don't hide critical info in tooltips |\n\n## React Tooltip Component\n\n```tsx\n\ninterface TooltipProps {\n  content: string\n  children: React.ReactElement\n  position?: 'top' | 'bottom' | 'left' | 'right'\n  delay?: number\n}\n\n  content,\n  children,\n  position = 'top',\n  delay = 300\n}: TooltipProps) {\n  const [isVisible, setIsVisible] = useState(false)\n  const tooltipId = useId()\n  const timeoutRef = useRef {\n    clearTimeout(timeoutRef.current)\n    setIsVisible(false)\n  }\n\n  // Handle Escape key\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Escape' && isVisible) {\n        hideTooltip()\n      }\n    }\n\n    document.addEventListener('keydown', handleKeyDown)\n    return () => document.removeEventListener('keydown', handleKeyDown)\n  }, [isVisible])\n\n  // Clone child to add props\n  const trigger = React.cloneElement(children, {\n    ref: triggerRef,\n    'aria-describedby': isVisible ? tooltipId : undefined,\n    onMouseEnter: showTooltip,\n    onMouseLeave: hideTooltip,\n    onFocus: showTooltip,\n    onBlur: hideTooltip,\n  })\n\n  return (\n    <div className=\"tooltip-wrapper\">\n      {trigger}\n      {isVisible && (\n        <div\n          id={tooltipId}\n          role=\"tooltip\"\n          className={`tooltip tooltip--${position}`}\n        >\n          {content}\n        </div>\n      )}\n    </div>\n  )\n}\n```\n\n## Usage\n\n```tsx\n\n  <button type=\"button\">\n    \n    <span className=\"sr-only\">Save</span>\n  </button>\n\n  <label htmlFor=\"email\">\n    Email <span aria-hidden=\"true\">*</span>\n  </label>\n\n```\n\n## Advanced Tooltip with Floating UI\n\n```tsx\n\ninterface AdvancedTooltipProps {\n  content: React.ReactNode\n  children: React.ReactElement\n}\n\n  const [isOpen, setIsOpen] = useState(false)\n  const arrowRef = useRef(null)\n  const tooltipId = useId()\n\n  const { refs, floatingStyles, context } = useFloating({\n    open: isOpen,\n    onOpenChange: setIsOpen,\n    placement: 'top',\n    middleware: [\n      offset(8),\n      flip(),\n      shift({ padding: 8 }),\n      arrow({ element: arrowRef })\n    ],\n  })\n\n  return (\n    <>\n      {React.cloneElement(children, {\n        ref: refs.setReference,\n        'aria-describedby': isOpen ? tooltipId : undefined,\n        onMouseEnter: () => setIsOpen(true),\n        onMouseLeave: () => setIsOpen(false),\n        onFocus: () => setIsOpen(true),\n        onBlur: () => setIsOpen(false),\n      })}\n\n      {isOpen && (\n        <div\n          ref={refs.setFloating}\n          id={tooltipId}\n          role=\"tooltip\"\n          style={floatingStyles}\n          className=\"tooltip\"\n        >\n          {content}\n          <div ref={arrowRef} className=\"tooltip-arrow\" />\n        </div>\n      )}\n    </>\n  )\n}\n```\n\n## Icon Button with Tooltip\n\n```tsx\ninterface IconButtonProps {\n  icon: React.ReactNode\n  label: string\n  onClick: () => void\n  tooltip?: string\n}\n\n  const tooltipId = useId()\n  const [showTooltip, setShowTooltip] = useState(false)\n\n  return (\n    <div className=\"icon-button-wrapper\">\n      <button\n        type=\"button\"\n        onClick={onClick}\n        aria-label={label}\n        aria-describedby={tooltip && showTooltip ? tooltipId : undefined}\n        onMouseEnter={() => setShowTooltip(true)}\n        onMouseLeave={() => setShowTooltip(false)}\n        onFocus={() => setShowTooltip(true)}\n        onBlur={() => setShowTooltip(false)}\n        className=\"icon-button\"\n      >\n        {icon}\n      </button>\n\n      {tooltip && showTooltip && (\n        <span id={tooltipId} role=\"tooltip\" className=\"tooltip\">\n          {tooltip}\n        </span>\n      )}\n    </div>\n  )\n}\n```\n\n## Native Title Attribute (Limited)\n\n```html\n<!-- Simple but limited accessibility -->\n<button type=\"button\" title=\"Save document\">\n  <svg aria-hidden=\"true\"><!-- save icon --></svg>\n  <span class=\"sr-only\">Save</span>\n</button>\n\n<!-- Better: Custom tooltip with full control -->\n<button\n  type=\"button\"\n  aria-describedby=\"save-tooltip\"\n  aria-label=\"Save\"\n>\n  <svg aria-hidden=\"true\"><!-- save icon --></svg>\n</button>\n<div id=\"save-tooltip\" role=\"tooltip\" class=\"tooltip\">\n  Save document (Ctrl+S)\n</div>\n```\n\n## Styling\n\n```css\n.tooltip-wrapper {\n  position: relative;\n  display: inline-block;\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1000;\n  padding: 0.5rem 0.75rem;\n  font-size: 0.875rem;\n  background: #1a1a1a;\n  color: #ffffff;\n  border-radius: 4px;\n  white-space: nowrap;\n  pointer-events: none;\n\n  /* Animation */\n  opacity: 0;\n  animation: tooltipFadeIn 0.15s ease-out forwards;\n}\n\n.tooltip--top {\n  bottom: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-bottom: 8px;\n}\n\n.tooltip--bottom {\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-top: 8px;\n}\n\n.tooltip--left {\n  right: 100%;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-right: 8px;\n}\n\n.tooltip--right {\n  left: 100%;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-left: 8px;\n}\n\n/* Arrow */\n.tooltip::after {\n  content: '';\n  position: absolute;\n  border: 6px solid transparent;\n}\n\n.tooltip--top::after {\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  border-top-color: #1a1a1a;\n}\n\n@keyframes tooltipFadeIn {\n  from { opacity: 0; transform: translateX(-50%) translateY(4px); }\n  to { opacity: 1; transform: translateX(-50%) translateY(0); }\n}\n\n/* Respect motion preferences */\n@media (prefers-reduced-motion: reduce) {\n  .tooltip {\n    animation: none;\n    opacity: 1;\n  }\n}\n\n/* Ensure sufficient contrast */\n.tooltip {\n  /* WCAG requires 4.5:1 for normal text */\n  /* #ffffff on #1a1a1a = 16.1:1 ✓ */\n}\n```\n\n## When to Use Tooltips vs Other Patterns\n\n| Use Case | Pattern |\n|----------|---------|\n| Supplementary hint | Tooltip |\n| Essential instruction | Inline text |\n| Complex content | Popover/Dialog |\n| Form field help | `aria-describedby` text |\n| Icon-only button | `aria-label` + optional tooltip |\n\n## Verification\n\n1. Tab to trigger element - tooltip should appear\n2. Press Escape - tooltip should close\n3. Hover over trigger - tooltip appears after delay\n4. Move mouse to tooltip - should stay visible\n5. Test with screen reader (tooltip content announced)\n6. Verify tooltip doesn't block other content\n7. Check color contrast meets WCAG requirements\n\nNever put essential information in tooltips. They're for supplementary hints only. Critical content should be visible by default or in the main UI.","isInternal":false,"tokens":1809,"sizeBytes":7422},{"name":"SKILL.md","path":"skills/accessible-tooltips/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accessible-tooltips/SKILL.md","title":"accessible-tooltips","category":"anthropic-skill","format":"markdown","content":"---\nname: accessible-tooltips\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Create accessible tooltips. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accessible-tooltips\n---\n\n# Create accessible tooltips\n\nInaccessible tooltips leave keyboard and screen reader users without important contextual information, creating an unequal experience and potential confusion.\n\n## Quick Reference\n\n- Tooltips must be keyboard accessible (focusable trigger)\n- Use aria-describedby to associate tooltip with trigger\n- Allow hover and focus to show tooltip, Escape to dismiss\n- Ensure sufficient contrast and don't hide essential info in tooltips\n\n## Check\n\nVerify tooltips are keyboard accessible, use appropriate ARIA roles (tooltip), and can be dismissed without moving focus.\n\n## Fix\n\nImplement tooltips with role='tooltip', aria-describedby, keyboard triggering, and Escape key dismissal.\n\n## Explain\n\nExplain the accessibility requirements for tooltips including keyboard access, ARIA attributes, and timing considerations.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Create accessible tooltips. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accessible-tooltips\n","frontmatter":{"name":"accessible-tooltips","description":"Use when reviewing templates, rendered HTML, or shared components related to Create accessible tooltips. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/accessible-tooltips"}},"isInternal":false,"tokens":317,"sizeBytes":1681},{"name":"rule.md","path":"skills/accesskeys/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accesskeys/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Ensure accesskey values are unique\n\n> Checks that accesskey values are unique to avoid shortcut conflicts.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nThe `accesskey` attribute allows developers to assign keyboard shortcuts to specific elements. To ensure these shortcuts work reliably, each value must be unique within the document.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Unique access keys -->\n<a href=\"/home\" accesskey=\"h\">Home</a>\n<a href=\"/contact\" accesskey=\"c\">Contact</a>\n\n<!-- ❌ Incorrect: Duplicate access keys -->\n<a href=\"/save\" accesskey=\"s\">Save</a>\n<a href=\"/search\" accesskey=\"s\">Search</a>\n```\n\n## Why It Matters\n\n- **Predictable Navigation**: Ensures keyboard shortcuts work as intended without conflicts.\n- **Assistive Technology**: Screen readers and other assistive technologies depend on unique identifiers for reliable interaction.\n- **User Experience**: Prevents user frustration when a shortcut doesn't trigger the expected action or moves focus to the wrong element.\n- **Browser Consistency**: Different browsers handle duplicate access keys differently; uniqueness ensures a consistent experience across all platforms.\n\n## Exceptions\n\n- Evaluate the rendered experience before treating a static-code smell as a blocker; interaction timing, browser behavior, and assistive technology output often determine severity.\n- Not every secondary accessibility issue deserves equal weight; prioritize the issue that most directly blocks perception, operation, or understanding.\n- Avoid adding redundant markup or ARIA solely to satisfy a rule when a simpler semantic implementation would eliminate the issue entirely.\n\n## Standards\n\n- Align the implementation with W3C WAI: WCAG Overview and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: Accessibility and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","isInternal":false,"tokens":462,"sizeBytes":2392},{"name":"SKILL.md","path":"skills/accesskeys/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accesskeys/SKILL.md","title":"accesskeys","category":"anthropic-skill","format":"markdown","content":"---\nname: accesskeys\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure accesskey values are unique. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accesskeys\n---\n\n# Ensure accesskey values are unique\n\nDuplicate access keys cause conflicts where only one element (usually the first) is reachable via the shortcut, making other elements inaccessible to keyboard users.\n\n## Quick Reference\n\n- Each `accesskey` attribute value must be unique on the page\n- Duplicate access keys can lead to unpredictable browser behavior\n- Helps keyboard users navigate reliably using defined shortcuts\n\n## Check\n\nCheck for duplicate `accesskey` attributes across the document to ensure each shortcut is unique.\n\n## Fix\n\nAssign unique values to each `accesskey` attribute or remove redundant ones to prevent shortcut conflicts.\n\n## Explain\n\nExplain how duplicate access keys affect keyboard accessibility and browser shortcut handling.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Ensure accesskey values are unique. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accesskeys\n","frontmatter":{"name":"accesskeys","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure accesskey values are unique. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/accesskeys"}},"isInternal":false,"tokens":330,"sizeBytes":1744},{"name":"rule.md","path":"skills/accordion-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accordion-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Make accordions keyboard navigable\n\n> Accordion components use proper ARIA attributes and keyboard interactions for screen reader accessibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 25 min\n\n---\nAccessible accordions allow users to efficiently navigate and reveal content sections using any input method.\n\n## Code Example\n\n```html\n<div class=\"accordion\">\n  <h3>\n    <button\n      type=\"button\"\n      aria-expanded=\"false\"\n      aria-controls=\"panel-1\"\n      class=\"accordion__trigger\"\n      id=\"accordion-1\"\n    >\n      Section 1\n      <span class=\"accordion__icon\" aria-hidden=\"true\"></span>\n    </button>\n  </h3>\n  <div\n    id=\"panel-1\"\n    role=\"region\"\n    aria-labelledby=\"accordion-1\"\n    class=\"accordion__panel\"\n    hidden\n  >\n    <p>Panel 1 content goes here.</p>\n  </div>\n\n  <h3>\n    <button\n      type=\"button\"\n      aria-expanded=\"false\"\n      aria-controls=\"panel-2\"\n      class=\"accordion__trigger\"\n      id=\"accordion-2\"\n    >\n      Section 2\n      <span class=\"accordion__icon\" aria-hidden=\"true\"></span>\n    </button>\n  </h3>\n  <div\n    id=\"panel-2\"\n    role=\"region\"\n    aria-labelledby=\"accordion-2\"\n    class=\"accordion__panel\"\n    hidden\n  >\n    <p>Panel 2 content goes here.</p>\n  </div>\n</div>\n```\n\n## Why It Matters\n\nPoorly implemented accordions trap keyboard users and leave screen reader users unable to understand or navigate collapsed content sections.\n\n## ARIA Pattern Requirements\n\n| Element | Attribute | Purpose |\n|---------|-----------|---------|\n| Trigger | `button` element | Activatable with Enter/Space |\n| Trigger | `aria-expanded` | Indicates open/closed state |\n| Trigger | `aria-controls` | References panel ID |\n| Panel | `id` | Target of aria-controls |\n| Panel | `role=\"region\"` | Optional, for important sections |\n| Header | Heading element | Maintains document structure |\n\n## React Accordion Component\n\n```tsx\n\ninterface AccordionItemProps {\n  title: string\n  children: React.ReactNode\n  defaultOpen?: boolean\n}\n\ninterface AccordionProps {\n  children: React.ReactNode\n  allowMultiple?: boolean\n}\n\n  const [openItems, setOpenItems] = useState { itemRefs.current[index] = el },\n          } as any)\n        }\n        return child\n      })}\n    </div>\n  )\n}\n\n  title,\n  children,\n  defaultOpen = false,\n  _index,\n  _isOpen,\n  _onToggle,\n  _onKeyDown,\n  _ref,\n}: AccordionItemProps & {\n  _index?: number\n  _isOpen?: boolean\n  _onToggle?: () => void\n  _onKeyDown?: (e: KeyboardEvent) => void\n  _ref?: (el: HTMLButtonElement) => void\n}) {\n  const triggerId = useId()\n  const panelId = useId()\n  const isOpen = _isOpen ?? defaultOpen\n\n  return (\n    <div className=\"accordion__item\">\n      <h3 className=\"accordion__header\">\n        <button\n          ref={_ref}\n          type=\"button\"\n          id={triggerId}\n          aria-expanded={isOpen}\n          aria-controls={panelId}\n          onClick={_onToggle}\n          onKeyDown={_onKeyDown}\n          className=\"accordion__trigger\"\n        >\n          <span className=\"accordion__title\">{title}</span>\n          <span\n            className={`accordion__icon ${isOpen ? 'accordion__icon--open' : ''}`}\n            aria-hidden=\"true\"\n          />\n        </button>\n      </h3>\n      <div\n        id={panelId}\n        role=\"region\"\n        aria-labelledby={triggerId}\n        className=\"accordion__panel\"\n        hidden={!isOpen}\n      >\n        <div className=\"accordion__content\">\n          {children}\n        </div>\n      </div>\n    </div>\n  )\n}\n```\n\n## Usage\n\n```tsx\nYou can return items within 30 days of purchase...</p>\n  \n  \n    <p>Standard shipping takes 5-7 business days...</p>\n  \n  \n    <p>Yes, we ship to over 50 countries...</p>\n  \n\n```\n\n## Keyboard Navigation\n\n| Key | Action |\n|-----|--------|\n| `Enter` / `Space` | Toggle panel open/closed |\n| `Arrow Down` | Move focus to next header |\n| `Arrow Up` | Move focus to previous header |\n| `Home` | Move focus to first header |\n| `End` | Move focus to last header |\n\n## Native HTML Details/Summary\n\n```html\n<!-- Simple native accordion (limited styling) -->\n<details class=\"accordion-native\">\n  <summary>Section Title</summary>\n  <div class=\"accordion-native__content\">\n    <p>Content here...</p>\n  </div>\n</details>\n\n<details class=\"accordion-native\">\n  <summary>Another Section</summary>\n  <div class=\"accordion-native__content\">\n    <p>More content...</p>\n  </div>\n</details>\n```\n\n```tsx\n// React wrapper for details/summary\nfunction NativeAccordion({ title, children, defaultOpen = false }) {\n  return (\n    <details open={defaultOpen} className=\"accordion-native\">\n      <summary>{title}</summary>\n      <div className=\"accordion-native__content\">\n        {children}\n      </div>\n    </details>\n  )\n}\n```\n\n## Styling\n\n```css\n.accordion {\n  border: 1px solid #e0e0e0;\n  border-radius: 8px;\n  overflow: hidden;\n}\n\n.accordion__item {\n  border-bottom: 1px solid #e0e0e0;\n}\n\n.accordion__item:last-child {\n  border-bottom: none;\n}\n\n.accordion__header {\n  margin: 0;\n}\n\n.accordion__trigger {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  width: 100%;\n  padding: 1rem 1.5rem;\n  font-size: 1rem;\n  font-weight: 600;\n  text-align: left;\n  background: #fff;\n  border: none;\n  cursor: pointer;\n  transition: background-color 0.2s;\n}\n\n.accordion__trigger:hover {\n  background: #f5f5f5;\n}\n\n.accordion__trigger:focus-visible {\n  outline: 2px solid #0066cc;\n  outline-offset: -2px;\n}\n\n.accordion__icon {\n  width: 1.25rem;\n  height: 1.25rem;\n  transition: transform 0.2s;\n}\n\n.accordion__trigger[aria-expanded=\"true\"] .accordion__icon {\n  transform: rotate(180deg);\n}\n\n.accordion__panel[hidden] {\n  display: none;\n}\n\n.accordion__content {\n  padding: 0 1.5rem 1rem;\n}\n\n/* Animation */\n.accordion__panel {\n  animation: slideDown 0.2s ease-out;\n}\n\n@keyframes slideDown {\n  from {\n    opacity: 0;\n    transform: translateY(-8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .accordion__panel,\n  .accordion__icon {\n    animation: none;\n    transition: none;\n  }\n}\n```\n\n## Verification\n\n1. Tab to first accordion header\n2. Press Enter/Space to toggle\n3. Use Arrow keys to navigate between headers\n4. Press Home/End to jump to first/last\n5. Test with screen reader (announces expanded state)\n6. Verify heading structure in accessibility tree\n7. Check focus is visible on all interactive elements\n\nChoose an appropriate heading level (h2, h3, etc.) based on the accordion's position in the document outline. Don't skip heading levels.","isInternal":false,"tokens":1701,"sizeBytes":6488},{"name":"SKILL.md","path":"skills/accordion-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/accordion-accessibility/SKILL.md","title":"accordion-accessibility","category":"anthropic-skill","format":"markdown","content":"---\nname: accordion-accessibility\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Make accordions keyboard navigable. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accordion-accessibility\n---\n\n# Make accordions keyboard navigable\n\nPoorly implemented accordions trap keyboard users and leave screen reader users unable to understand or navigate collapsed content sections.\n\n## Quick Reference\n\n- Use button elements for accordion triggers with aria-expanded\n- Associate panels with triggers using aria-controls\n- Support Arrow keys for navigation between headers\n- Use heading elements appropriately for document structure\n\n## Check\n\nVerify accordions use button triggers with aria-expanded, aria-controls, and proper keyboard navigation (Enter, Space, arrows).\n\n## Fix\n\nImplement accordions with button elements, aria-expanded state, aria-controls linking to content panels, and keyboard support.\n\n## Explain\n\nExplain the ARIA pattern for accessible accordions and how they enable keyboard and screen reader users to navigate collapsible content.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Make accordions keyboard navigable. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accordion-accessibility\n","frontmatter":{"name":"accordion-accessibility","description":"Use when reviewing templates, rendered HTML, or shared components related to Make accordions keyboard navigable. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/accordion-accessibility"}},"isInternal":false,"tokens":325,"sizeBytes":1724},{"name":"rule.md","path":"skills/affiliate-disclosure/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/affiliate-disclosure/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Provide clear affiliate disclosures\n\n> Checks for affiliate and sponsored content disclosures to maintain transparency.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nTransparency regarding financial incentives is crucial for building a sustainable relationship with your audience and complying with consumer protection laws.\n\n## Code Example\n\n```html\n<article>\n  <header>\n    <h1>The Best Laptops for Developers in 2024</h1>\n    <div class=\"disclosure\" style=\"background: #f9f9f9; padding: 10px; border-radius: 4px;\">\n      <p><small><em>Disclaimer: This post contains affiliate links. If you click on one and make a purchase, we may receive a small commission at no extra cost to you.</em></small></p>\n    </div>\n  </header>\n  \n  <p>Looking for a new laptop? Here are our top recommendations...</p>\n</article>\n```\n\n## Why It Matters\n\n- **Legal Compliance**: Adheres to FTC (Federal Trade Commission) and other international regulations regarding online advertising.\n- **User Trust**: Demonstrates honesty and transparency, which can lead to higher conversion rates over time.\n- **SEO Quality**: Prevents being flagged for \"sneaky redirects\" or hidden affiliate programs that can negatively impact rankings.\n- **E-E-A-T**: Supports the \"Trust\" pillar by showing you aren't hiding financial motivations.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","isInternal":false,"tokens":458,"sizeBytes":2216},{"name":"SKILL.md","path":"skills/affiliate-disclosure/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/affiliate-disclosure/SKILL.md","title":"affiliate-disclosure","category":"anthropic-skill","format":"markdown","content":"---\nname: affiliate-disclosure\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Provide clear affiliate disclosures. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/affiliate-disclosure\n---\n\n# Provide clear affiliate disclosures\n\nClear disclosures are required by law (e.g., FTC guidelines) and are essential for maintaining user trust and preventing search engine penalties for hidden advertisements.\n\n## Quick Reference\n\n- Add a clear and conspicuous disclosure for any affiliate or sponsored links\n- Place the disclosure at the top of the page, before any affiliate links appear\n- Use simple, unambiguous language to explain the financial relationship\n\n## Check\n\nVerify that all pages containing affiliate links or sponsored content have a clear, visible disclosure before the links appear.\n\n## Fix\n\nAdd a standardized disclosure statement at the beginning of your content or near affiliate links to inform users of the partnership.\n\n## Explain\n\nExplain the legal and ethical importance of affiliate disclosures and how they impact user trust and SEO.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Provide clear affiliate disclosures. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/affiliate-disclosure\n","frontmatter":{"name":"affiliate-disclosure","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Provide clear affiliate disclosures. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/affiliate-disclosure"}},"isInternal":false,"tokens":335,"sizeBytes":1773},{"name":"rule.md","path":"skills/ai-content/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/ai-content/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Audit and refine AI-generated content\n\n> Detects and reviews content that appears to be primarily AI-generated to ensure quality.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nWhile AI tools can assist in the writing process, the final output still has to satisfy [Google's Search Essentials](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) and deliver the depth expected from [high-quality content](/en/rules/seo/quality) that genuinely helps the reader.\n\n## Code Example\n\nWhile there's no \"code\" to detect AI, you can signal human involvement and expertise in your metadata and bylines.\n\n```html\n<article>\n  <header>\n    <h1>Advanced TypeScript Patterns</h1>\n    <div class=\"meta\">\n      <span>By Jane Smith, Senior Engineer</span>\n      <span>Fact-checked on October 20, 2023</span>\n    </div>\n  </header>\n  \n  <p>In this article, we'll explore patterns I've used in production at ScaleTech...</p>\n</article>\n```\n\n## Why It Matters\n\n- **Quality Standards**: Google's guidance on [creating helpful, reliable, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) targets low-value automation that does not add original insight.\n- **Accuracy**: AI can hallucinate facts; human verification is essential for [YMYL content](/en/rules/seo/ymyl-detection), where bad advice can cause real harm.\n- **Uniqueness**: Prevents your site from becoming a \"carbon copy\" of other sites using the same AI prompts.\n- **User Experience**: Human-edited content is generally more engaging, nuanced, and better at solving specific user problems.\n\nIf a draft feels generic, unsupported, or too close to what a model would produce by default, review it alongside thin-content risk before deciding it is ready to publish.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","isInternal":false,"tokens":624,"sizeBytes":3032},{"name":"SKILL.md","path":"skills/ai-content/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/ai-content/SKILL.md","title":"ai-content","category":"anthropic-skill","format":"markdown","content":"---\nname: ai-content\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Audit and refine AI-generated content. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/ai-content\n---\n\n# Audit and refine AI-generated content\n\nSearch engines prioritize helpful, reliable, people-first content; unedited AI content often lacks the depth and accuracy required for high rankings.\n\n## Quick Reference\n\n- Review AI-generated content for accuracy, unique value, and human-like voice\n- Ensure content isn't just a rewrite of existing top-ranking articles\n- Verify all factual claims and include original research or insights\n\n## Check\n\nReview the content to see if it provides unique value beyond what AI models can generate by default.\n\n## Fix\n\nRewrite AI-generated sections to include original research, personal experiences, and a unique brand voice.\n\n## Explain\n\nExplain why human oversight is necessary for AI-generated content to meet SEO quality standards and user expectations.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Audit and refine AI-generated content. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/ai-content\n","frontmatter":{"name":"ai-content","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Audit and refine AI-generated content. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/ai-content"}},"isInternal":false,"tokens":329,"sizeBytes":1676},{"name":"rule.md","path":"skills/all-noindex-pages/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/all-noindex-pages/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Audit all noindex pages\n\n> Lists and reviews all pages blocked from indexing to ensure critical content is accessible.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nRegularly auditing your `noindex` directives ensures that you are only blocking pages that don't provide search value, such as staging environments, admin panels, or internal search results.\n\n## Code Example\n\n```html\n<head>\n  <!-- Use this for utility pages like 'Thank You' pages or internal search results -->\n  <meta name=\"robots\" content=\"noindex, follow\">\n  \n  <!-- For pages that should be completely ignored -->\n  <meta name=\"robots\" content=\"noindex, nofollow\">\n</head>\n```\n\n## Why It Matters\n\n- **Visibility**: Prevents accidental exclusion of high-value pages from Google and Bing.\n- **Crawl Budget**: Helps search engines focus their limited crawl resources on your most important pages.\n- **De-indexing**: Useful for removing outdated or sensitive pages from search results without deleting them.\n- **Strategic Control**: Allows you to manage which versions of content (e.g., filtered lists) are available for indexing.\n\n## Exceptions\n\n- Staging, utility, login, account, or internal search pages may intentionally use different crawl or index signals if they are not meant to rank.\n- Temporary migration states can produce noisy intermediate signals; flag the live production URL pattern, not one-off transition artifacts.\n- When redirects, canonicals, robots directives, or indexability signals conflict, fix the strongest final signal first instead of reporting every downstream symptom as a separate blocker.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","isInternal":false,"tokens":459,"sizeBytes":2380},{"name":"SKILL.md","path":"skills/all-noindex-pages/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/all-noindex-pages/SKILL.md","title":"all-noindex-pages","category":"anthropic-skill","format":"markdown","content":"---\nname: all-noindex-pages\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Audit all noindex pages. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/all-noindex-pages\n---\n\n# Audit all noindex pages\n\nAn incorrect `noindex` tag can completely remove important pages from search results, while proper usage helps manage crawl budget and prevents duplicate content issues.\n\n## Quick Reference\n\n- Identify all pages using the `noindex` directive in meta tags or headers\n- Verify that critical pages (products, articles) aren't accidentally blocked\n- Ensure `noindex` is correctly applied to thin content, admin, or utility pages\n\n## Check\n\nVerify that the `noindex` directive is only applied to pages that should not appear in search results.\n\n## Fix\n\nRemove `&lt;meta name=\"robots\" content=\"noindex\"&gt;` from pages that should be indexed and ranking.\n\n## Explain\n\nExplain the difference between `noindex` and `disallow` in robots.txt and when to use each for optimal SEO.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Audit all noindex pages. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/all-noindex-pages\n","frontmatter":{"name":"all-noindex-pages","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Audit all noindex pages. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/all-noindex-pages"}},"isInternal":false,"tokens":358,"sizeBytes":1673},{"name":"rule.md","path":"skills/alt-text/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/alt-text/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Provide meaningful alt text for images\n\n> Every informative image has a descriptive alt attribute; decorative images use alt=\"\" to be ignored by screen readers.\n\n**Priority:** critical · **Difficulty:** beginner · **Time:** 15 min\n\n---\nThe `alt` attribute is the primary accessibility mechanism for images. Every `<img>` must have an `alt` attribute. Its value depends on the image's role.\n\nUse the [W3C alt decision tree](https://www.w3.org/WAI/tutorials/images/decision-tree/) to determine the correct alt value for any image type.\n\n## Code Example\n\nImages that convey meaning need descriptive alt text explaining what the image communicates.\n\n```html\n<!-- ❌ Bad: Missing alt -->\n<img src=\"revenue-chart.png\">\n\n<!-- ❌ Bad: Filename as alt -->\n<img src=\"revenue-chart.png\" alt=\"revenue-chart.png\">\n\n<!-- ❌ Bad: Generic alt -->\n<img src=\"revenue-chart.png\" alt=\"chart\">\n\n<!-- ✅ Good: Describes what the image conveys -->\n<img\n  src=\"revenue-chart.png\"\n  alt=\"Bar chart showing Q3 2024 revenue increased 40% year-over-year, reaching $2.4M\"\n>\n```\n\n## Why It Matters\n\nApproximately 2.2 billion people worldwide have vision impairment. Screen readers read the alt attribute aloud—without meaningful alt text, users who are blind receive no information about image content. Missing alt text also fails WCAG 2.1 Success Criterion 1.1.1, which is a Level A (minimum) requirement. Search engines also rely on alt text to index image content.\n\n## Decorative Images\n\nImages used purely for visual decoration carry no information and should be hidden from assistive technology.\n\n```html\n<!-- ❌ Bad: No alt attribute—screen reader may announce the filename -->\n<img src=\"decorative-swirl.png\">\n\n<!-- ✅ Good: Empty alt hides image from screen readers -->\n<img src=\"decorative-swirl.png\" alt=\"\">\n\n<!-- ✅ Good: Or use CSS background images for decoration -->\n<div class=\"decorative-swirl\" aria-hidden=\"true\"></div>\n```\n\n## Images Used as Links\n\nWhen an `<img>` is inside an `<a>`, the alt text must describe the link destination, not the visual appearance.\n\n```html\n<!-- ❌ Bad: Describes appearance, not destination -->\n<a href=\"https://twitter.com/example\">\n  <img src=\"twitter-logo.svg\" alt=\"Blue bird logo\">\n</a>\n\n<!-- ✅ Good: Describes the link destination -->\n<a href=\"https://twitter.com/example\">\n  <img src=\"twitter-logo.svg\" alt=\"Follow us on Twitter\">\n</a>\n```\n\n## Images of Text\n\nIf an image contains text (e.g., a logo, banner, or screenshot), reproduce that text verbatim in alt.\n\n```html\n<!-- ✅ Good: Alt reproduces the text shown in the image -->\n<img src=\"sale-banner.png\" alt=\"Summer Sale — 50% off all items\">\n\n<!-- ✅ Good: Logo with company name -->\n<img src=\"logo.svg\" alt=\"Acme Corp\">\n```\n\n## Complex Images (Charts, Diagrams)\n\nFor complex visuals, provide a brief alt plus a longer description accessible to all users.\n\n```html\n<!-- Using aria-describedby to link to a visible description -->\n<figure>\n  <img\n    src=\"org-chart.png\"\n    alt=\"Company organisational chart\"\n    aria-describedby=\"org-chart-desc\"\n  >\n  <figcaption id=\"org-chart-desc\">\n    The chart shows three departments reporting to the CEO: Engineering (12 staff),\n    Marketing (8 staff), and Operations (5 staff).\n  </figcaption>\n</figure>\n```\n\n## Framework Examples\n\n  \n\n```tsx\ninterface ImageProps {\n  src: string\n  alt: string\n  decorative?: boolean\n}\n\nfunction AccessibleImage({ src, alt, decorative = false }: ImageProps) {\n  return (\n    <img\n      src={src}\n      // Decorative images use empty string; informative images use descriptive text\n      alt={decorative ? '' : alt}\n    />\n  )\n}\n\n// Usage\n\n```\n\n  \n  \n\n```tsx\n\n// Next.js Image requires alt; use \"\" for decorative\nfunction HeroBanner() {\n  return (\n    <>\n      {/* Informative */}\n      \n\n      {/* Decorative */}\n      \n    </>\n  )\n}\n```\n\n  \n\n## Standards\n\n- Use these references as the standard for the final image format, delivery, accessibility, and rendering behavior.\n- Check the implementation against MDN: Responsive images before treating the rule as satisfied.\n- Check the implementation against web.dev: Image performance before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Run axe DevTools or WAVE on the page—both flag missing or empty non-decorative alt attributes\n- Use Lighthouse Accessibility audit—\"Images do not have alternate text\" is a scored item\n\n### Manual Checks\n\n- Enable a screen reader (VoiceOver, NVDA, or JAWS) and navigate through images with the `G` key\n- Inspect the Network tab: for any image URL, verify the corresponding `<img>` has a meaningful `alt`\n- **CAPTCHA images** — provide alt describing the purpose, not the characters (e.g., `alt=\"CAPTCHA: type the characters shown\"`), and offer an audio alternative per WCAG 1.1.1\n- **SVG icons with adjacent text labels** — if the icon's meaning is already conveyed by visible text, use `aria-hidden=\"true\"` on the SVG instead of alt","isInternal":false,"tokens":1150,"sizeBytes":4931},{"name":"SKILL.md","path":"skills/alt-text/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/alt-text/SKILL.md","title":"alt-text","category":"anthropic-skill","format":"markdown","content":"---\nname: alt-text\ndescription: \"Use when reviewing image assets, markup, and CDN or build transforms related to Provide meaningful alt text for images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.\"\nmetadata:\n  category: images\n  priority: critical\n  difficulty: beginner\n  estimatedTime: \"15\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/images/alt-text\n---\n\n# Provide meaningful alt text for images\n\nApproximately 2.2 billion people worldwide have vision impairment. Screen readers read the alt attribute aloud—without meaningful alt text, users who are blind receive no information about image content. Missing alt text also fails WCAG 2.1 Success Criterion 1.1.1, which is a Level A (minimum) requirement. Search engines also rely on alt text to index image content.\n\n## Quick Reference\n\n- Every `<img>` must have an `alt` attribute—omitting it entirely violates WCAG 2.1 SC 1.1.1\n- Decorative images use `alt=\"\"` so screen readers ignore them\n- Alt text should describe the image's *purpose*, not just its appearance\n- Linked images: alt describes the link destination, not the visual\n\n## Check\n\nScan all <img> elements in the codebase. Verify: 1) Every <img> has an alt attribute (missing alt is an error). 2) Decorative images use alt=\"\". 3) Informative images have descriptive text that conveys the image's meaning—not just its file name. 4) Images that are links describe the destination. 5) Images of text reproduce the text in alt. Flag any <img> without alt, with alt matching the filename (e.g., alt=\"photo1.jpg\"), or with generic values like alt=\"image\" or alt=\"photo\".\n\n## Fix\n\nFor each image missing or with poor alt text: 1) Informative images—describe what the image conveys, not just what it shows (e.g., alt=\"Bar chart showing 40% increase in sales Q3 2024\" not alt=\"chart\"). 2) Decorative images—add alt=\"\" so screen readers skip them. 3) Linked images—describe the link destination (e.g., alt=\"Visit our Twitter profile\"). 4) Images of text—copy the text verbatim into alt. 5) Complex images (charts, infographics)—provide a short alt plus a longer description via aria-describedby or a visible caption.\n\n## Explain\n\nExplain WCAG 2.1 Success Criterion 1.1.1 Non-text Content: every image must have a text alternative. Screen readers announce the alt attribute aloud—without it, users who are blind or have low vision cannot understand the page. Bad alt text (like alt=\"image\") is no better than no alt text. Decorative images must use alt=\"\" explicitly so screen readers skip them entirely—omitting alt causes some screen readers to announce the filename.\n\n## Code Review\n\nReview image assets, markup, and delivery configuration related to Provide meaningful alt text for images. Flag exact files or components where format choice, sizing, or loading behavior violates the rule, and describe how to confirm the fix in DevTools.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/images/alt-text\n","frontmatter":{"name":"alt-text","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Provide meaningful alt text for images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"critical","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/alt-text"}},"isInternal":false,"tokens":713,"sizeBytes":3118},{"name":"rule.md","path":"skills/anchor-smooth-scroll/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/anchor-smooth-scroll/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Provide instant anchor scroll option\n\n> Smooth scroll animations to anchor links respect motion preferences or provide an instant alternative.\n\n**Priority:** low · **Difficulty:** beginner · **Time:** 10 min\n\n---\nSmooth scrolling should respect motion preferences to avoid triggering vestibular disorders.\n\n## Code Example\n\n```css\n/* ❌ Bad: Always smooth, ignores preferences */\nhtml {\n  scroll-behavior: smooth;\n}\n\n/* ✅ Good: Respect motion preferences */\n@media (prefers-reduced-motion: no-preference) {\n  html {\n    scroll-behavior: smooth;\n  }\n}\n\n/* Users who prefer reduced motion get instant scrolling (default) */\n```\n\n## Why It Matters\n\nSmooth scroll animations can trigger vertigo, nausea, and disorientation for users with vestibular disorders—instant navigation is safer and often faster.\n\n## JavaScript Approach\n\n```typescript\nfunction scrollToElement(elementId: string) {\n  const element = document.getElementById(elementId)\n  if (!element) return\n\n  const prefersReducedMotion = window.matchMedia(\n    '(prefers-reduced-motion: reduce)'\n  ).matches\n\n  element.scrollIntoView({\n    behavior: prefersReducedMotion ? 'instant' : 'smooth',\n    block: 'start'\n  })\n\n  // Move focus to target for keyboard users\n  element.focus({ preventScroll: true })\n}\n```\n\n## React Hook\n\n```tsx\nfunction useScrollToAnchor() {\n  const prefersReducedMotion = useReducedMotion()\n\n  const scrollTo = useCallback((elementId: string) => {\n    const element = document.getElementById(elementId)\n    if (!element) return\n\n    element.scrollIntoView({\n      behavior: prefersReducedMotion ? 'instant' : 'smooth',\n      block: 'start'\n    })\n\n    // Set tabindex if element isn't focusable\n    if (!element.hasAttribute('tabindex')) {\n      element.setAttribute('tabindex', '-1')\n    }\n    element.focus({ preventScroll: true })\n  }, [prefersReducedMotion])\n\n  return scrollTo\n}\n\nfunction useReducedMotion() {\n  const [prefersReduced, setPrefersReduced] = useState(false)\n\n  useEffect(() => {\n    const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n    setPrefersReduced(mediaQuery.matches)\n\n    const handler = (e: MediaQueryListEvent) => setPrefersReduced(e.matches)\n    mediaQuery.addEventListener('change', handler)\n    return () => mediaQuery.removeEventListener('change', handler)\n  }, [])\n\n  return prefersReduced\n}\n```\n\n## Anchor Link Component\n\n```tsx\ninterface AnchorLinkProps {\n  href: string\n  children: React.ReactNode\n}\n\nfunction AnchorLink({ href, children }: AnchorLinkProps) {\n  const scrollTo = useScrollToAnchor()\n\n  const handleClick = (e: React.MouseEvent) => {\n    if (href.startsWith('#')) {\n      e.preventDefault()\n      scrollTo(href.slice(1))\n    }\n  }\n\n  return (\n    <a href={href} onClick={handleClick}>\n      {children}\n    </a>\n  )\n}\n```\n\n## Focus Management\n\n```html\n<!-- Target must be focusable for keyboard navigation -->\n<section id=\"features\" tabindex=\"-1\">\n  <h2>Features</h2>\n  <!-- Content -->\n</section>\n```\n\n```css\n/* Hide focus ring when section is focused via anchor */\nsection:focus {\n  outline: none;\n}\n\n/* But show focus for keyboard navigation */\nsection:focus-visible {\n  outline: 2px solid var(--focus-color);\n}\n```\n\n## Exceptions\n\n- Simple data tables can sometimes fail more from missing header relationships than from missing enhancements such as captions or mobile wrappers, so prioritize the strongest semantic issue.\n- Do not convert layout structures into data-table markup just to satisfy a rule; the correct fix may be to remove table semantics entirely.\n- When several table-accessibility issues overlap, resolve the header-cell relationship first because downstream announcements depend on it.\n\n## Verification\n\n### Automated Checks\n\n- Use browser accessibility tooling, axe, Lighthouse, or equivalent automated checks against a representative rendered state.\n\n### Manual Checks\n\n- Enable \"Reduce motion\" in system accessibility settings\n- Click anchor links—should scroll instantly, not smoothly\n- Verify focus moves to target section\n- Tab through page after anchor click—focus should continue from anchor target","isInternal":false,"tokens":891,"sizeBytes":4096},{"name":"SKILL.md","path":"skills/anchor-smooth-scroll/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/anchor-smooth-scroll/SKILL.md","title":"anchor-smooth-scroll","category":"anthropic-skill","format":"markdown","content":"---\nname: anchor-smooth-scroll\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide instant anchor scroll option. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: low\n  difficulty: beginner\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/anchor-smooth-scroll\n---\n\n# Provide instant anchor scroll option\n\nSmooth scroll animations can trigger vertigo, nausea, and disorientation for users with vestibular disorders—instant navigation is safer and often faster.\n\n## Quick Reference\n\n- Disable smooth scroll when prefers-reduced-motion is set\n- Use CSS scroll-behavior: smooth with media query check\n- Ensure focus moves to anchor target for keyboard users\n- Provide instant scroll as default or fallback\n\n## Check\n\nClick anchor links (same-page navigation) and verify smooth scrolling is disabled when prefers-reduced-motion is set. Confirm anchor navigation works correctly with keyboard and screen readers.\n\n## Fix\n\nUse scroll-behavior: smooth only within a prefers-reduced-motion media query check. Provide instant scrolling as the default or reduced-motion fallback. Ensure focus moves to the anchor target.\n\n## Explain\n\nExplain how animated scroll transitions can cause motion sickness and disorientation for users with vestibular disorders, and why instant navigation is often preferable for accessibility.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Provide instant anchor scroll option. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/anchor-smooth-scroll\n","frontmatter":{"name":"anchor-smooth-scroll","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide instant anchor scroll option. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/anchor-smooth-scroll"}},"isInternal":false,"tokens":394,"sizeBytes":2067},{"name":"rule.md","path":"skills/anchor-text/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/anchor-text/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Use descriptive anchor text\n\n> Checks for descriptive, keyword-rich anchor text that provides context for users and search engines.\n\n**Priority:** medium · **Difficulty:** beginner · **Time:** 5 min\n\n---\nAnchor text is the clickable text in a hyperlink. It should provide a clear indication of what the user will find when they click the link.\n\n## Code Example\n\n```html\n<!-- ✅ Good: Descriptive and contextual -->\n<p>For more information, read our <a href=\"/seo-guide\">complete guide to SEO best practices</a>.</p>\n\n<!-- ❌ Bad: Generic and provides no context -->\n<p>To learn more about our SEO services, <a href=\"/seo-guide\">click here</a>.</p>\n```\n\n## Why It Matters\n\n- **Search Context**: Tells search engines what the linked page is about, helping it rank for those terms.\n- **Accessibility**: Screen reader users often navigate via a list of links; descriptive text makes this list meaningful.\n- **User Trust**: Users are more likely to click a link when they know exactly where it leads.\n- **Internal Navigation**: Helps distribute authority throughout your site by creating a logical web of related content.\n\n## Exceptions\n\n- Utility or intentionally noindex pages may keep minimal metadata when richer search presentation is not a goal.\n- Template-driven pages can look repetitive in isolation; confirm the fully rendered production output before flagging duplication or omission.\n- If a page is intentionally redirected or excluded from indexation, resolve that crawlability decision before treating metadata polish as the primary issue.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.","isInternal":false,"tokens":445,"sizeBytes":2310},{"name":"SKILL.md","path":"skills/anchor-text/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/anchor-text/SKILL.md","title":"anchor-text","category":"anthropic-skill","format":"markdown","content":"---\nname: anchor-text\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Use descriptive anchor text. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: beginner\n  estimatedTime: \"5\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/anchor-text\n---\n\n# Use descriptive anchor text\n\nDescriptive anchor text helps search engines understand the context of the linked page and significantly improves accessibility for users using screen readers.\n\n## Quick Reference\n\n- Use descriptive text for links instead of generic phrases like 'click here' or 'read more'\n- Ensure the anchor text provides clear context about the linked page's content\n- Avoid over-optimizing with excessive keyword stuffing in your internal links\n\n## Check\n\nVerify that all links in the content use descriptive anchor text that accurately describes the target page.\n\n## Fix\n\nReplace generic link text like 'click here' with descriptive phrases that include relevant keywords for the destination page.\n\n## Explain\n\nExplain how descriptive anchor text improves both SEO crawlability and web accessibility for disabled users.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Use descriptive anchor text. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/anchor-text\n","frontmatter":{"name":"anchor-text","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Use descriptive anchor text. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/anchor-text"}},"isInternal":false,"tokens":328,"sizeBytes":1701},{"name":"rule.md","path":"skills/animated-content/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/animated-content/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Convert animated GIFs to video\n\n> Large animated GIFs are replaced with more efficient video formats like MP4 or WebM to reduce page weight.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nLarge animated GIFs are often used for short animations, but they are highly inefficient compared to modern video formats. Converting these to MP4 or WebM can reduce file sizes by 80% or more.\n\n## Code Examples\n\n#\n\n## Traditional GIF (Inefficient)\n```html\n<img src=\"animation.gif\" alt=\"Description of animation\">\n```\n\n### Optimized Video (Recommended)\nUsing the `<video>` tag with specific attributes to mimic GIF behavior:\n\n```html\n<video\n  autoplay\n  loop\n  muted\n  playsinline\n  poster=\"animation-frame.jpg\"\n>\n  <source src=\"animation.webm\" type=\"video/webm\">\n  <source src=\"animation.mp4\" type=\"video/mp4\">\n  Your browser does not support the video tag.\n</video>\n```\n\n## Why It Matters\n\n- **Page Weight**: GIFs are uncompressed and can easily reach several megabytes, slowing down page loads.\n- **CPU Usage**: Browsers consume more CPU/GPU resources to decode and render large GIFs compared to optimized video.\n- **Battery Life**: On mobile devices, the high resource usage of GIFs can significantly drain battery.\n- **User Experience**: Large assets delay the completion of page loading and can cause stuttering during scrolling.\n\n## Best Practices\n\nFavor [browser-native video delivery guidance from web.dev](https://web.dev/learn/performance) when deciding whether an animation should stay a GIF at all, because the biggest wins usually come from eliminating heavy animated assets rather than just caching them better.\n\n✅ **Use Modern Formats**: Provide WebM for modern browsers and MP4 as a fallback.\n✅ **Add Poster Images**: Use the `poster` attribute to show a static frame while the video loads.\n✅ **Mute by Default**: Always use `muted` for autoplaying videos to ensure they work across all browsers.\n✅ **Lazy Loading**: Use `loading=\"lazy\"` or Intersection Observer for videos below the fold.\n\n❌ **Avoid GIF for Large Animations**: Never use GIF for animations larger than a few hundred pixels or longer than a second.\n❌ **Don't Forget Accessibility**: Always provide alternative text or a description for the animation.\n\n## Tools & Validation\n\n- [FFmpeg](https://ffmpeg.org/): Command-line tool for converting GIFs to video.\n- [Cloudinary/Imgix](https://cloudinary.com/): Automated media optimization services.\n- [Lighthouse](https://developers.google.com/web/tools/lighthouse): Checks for large GIFs and suggests video alternatives.\n\n## Standards\n\n- Use web.dev: Learn Performance as the standard for measuring the final production behavior, not just local synthetic output.\n- Use Chrome Developers: Lighthouse overview as the standard for measuring the final production behavior, not just local synthetic output.\n\n## Verification\n\n### Automated Checks\n\n- Measure the affected page or flow in Lighthouse, PageSpeed Insights, or DevTools and confirm the targeted metric improves.\n- Inspect the network waterfall or performance timeline to confirm the intended resource or execution change actually took effect.\n\n### Manual Checks\n\n- Verify the change on a throttled mobile profile, not just local desktop.\n- If this rule maps to a budget or Web Vital, confirm the page now stays within that threshold.","isInternal":false,"tokens":713,"sizeBytes":3349},{"name":"SKILL.md","path":"skills/animated-content/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/animated-content/SKILL.md","title":"animated-content","category":"anthropic-skill","format":"markdown","content":"---\nname: animated-content\ndescription: \"Use when auditing slow page loads, heavy assets, or rendering delays related to Convert animated GIFs to video. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.\"\nmetadata:\n  category: performance\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/performance/animated-content\n---\n\n# Convert animated GIFs to video\n\nLarge animated GIFs can significantly increase page weight and consume excessive CPU/memory, leading to slower page loads and poor scrolling performance.\n\n## Quick Reference\n\n- Use `<video>` instead of large GIFs for animations\n- GIFs are significantly larger than MP4/WebM\n- Videos allow for better control and performance\n\n## Check\n\nCheck for large animated GIFs that could be replaced with more efficient video formats like MP4 or WebM.\n\n## Fix\n\nConvert animated GIFs to MP4 or WebM and use the `<video>` tag with `autoplay`, `loop`, `muted`, and `playsinline` attributes.\n\n## Explain\n\nExplain why video formats are more efficient than GIFs for animated content and how they improve performance.\n\n## Code Review\n\nReview the routes, assets, and loading behavior that affect Convert animated GIFs to video. Flag exact files, requests, or rendering steps that add unnecessary network, CPU, or layout cost, and describe the measurement method used to confirm the issue.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/performance/animated-content\n","frontmatter":{"name":"animated-content","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Convert animated GIFs to video. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/animated-content"}},"isInternal":false,"tokens":345,"sizeBytes":1652},{"name":"rule.md","path":"skills/animation-performance/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/animation-performance/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Use transform and opacity for animations\n\n> Animate with CSS transform and opacity properties to keep animations running on the GPU compositor thread at 60fps, avoiding layout-triggering properties like top, left, width, and height.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nThe browser renders pages through a pipeline: Style → Layout → Paint → Composite. Animating the wrong properties restarts this pipeline every frame. Animating `transform` and `opacity` only triggers the composite step.\n\n## Code Example\n\n```\nLayout-triggering properties (avoid animating):\n  width, height, margin, padding, top, left, right, bottom,\n  border-width, font-size, display, position\n\nPaint-triggering properties (acceptable, but not ideal):\n  color, background-color, box-shadow, border-color,\n  outline, text-shadow\n\nCompositor-only properties (optimal for animation):\n  transform (translate, scale, rotate, skew)\n  opacity\n  filter (on composited layers)\n```\n\n## Why It Matters\n\nAnimating layout properties (width, height, top, margin) triggers the full browser rendering pipeline on every frame — style recalculation, layout, paint, and composite. This runs on the main thread and competes with JavaScript. Animating transform and opacity skips layout and paint entirely and runs on a dedicated GPU thread, achieving smooth 60fps even when the main thread is busy.\n\n## Converting Position Animations\n\n```css\n/* ❌ Bad: animates layout properties — triggers full reflow each frame */\n.slide-in {\n  animation: slideIn 300ms ease-out;\n}\n\n@keyframes slideIn {\n  from { left: -100%; }\n  to { left: 0; }\n}\n\n/* ✅ Good: translate() is compositor-only */\n.slide-in {\n  animation: slideIn 300ms ease-out;\n}\n\n@keyframes slideIn {\n  from { transform: translateX(-100%); }\n  to { transform: translateX(0); }\n}\n```\n\n## Converting Size Animations\n\n```css\n/* ❌ Animates width/height — expensive */\n.expand {\n  animation: expand 300ms ease;\n}\n@keyframes expand {\n  from { width: 0; height: 0; }\n  to { width: 200px; height: 200px; }\n}\n\n/* ✅ Use scale() */\n.expand {\n  width: 200px;\n  height: 200px;\n  animation: expand 300ms ease;\n}\n@keyframes expand {\n  from { transform: scale(0); }\n  to { transform: scale(1); }\n}\n```\n\n## Common Performant Patterns\n\n```css\n/* Fade in */\n.fade-in {\n  animation: fadeIn 300ms ease;\n}\n@keyframes fadeIn {\n  from { opacity: 0; }\n  to { opacity: 1; }\n}\n\n/* Slide up and fade in */\n.slide-up {\n  animation: slideUp 400ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n@keyframes slideUp {\n  from {\n    opacity: 0;\n    transform: translateY(16px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n/* Button press */\n.button:active {\n  transform: scale(0.97);\n}\n```\n\n## will-change (Use Sparingly)\n\n```css\n/* Hint to browser to promote this element to its own layer before animation starts */\n.animated-card {\n  will-change: transform;\n}\n\n/* ⚠️ Don't apply to too many elements — each layer uses GPU memory */\n/* Apply just before animation, remove after */\n```\n\n## Respecting Reduced Motion\n\n```css\n/* ✅ Always honor the user's motion preferences */\n.slide-in {\n  animation: slideIn 400ms ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .slide-in {\n    animation: none;\n    /* Provide a non-animated alternative if needed */\n  }\n}\n\n/* Or use the safe pattern */\n@media (prefers-reduced-motion: no-preference) {\n  .slide-in {\n    animation: slideIn 400ms ease;\n  }\n}\n```\n\n## Verification\n\n1. Inspect the rendered UI at the breakpoints and interaction states affected by the rule.\n2. Confirm the computed styles match the intended fix in DevTools.\n3. Test at least one mobile and one desktop viewport before shipping.\n4. If the rule affects motion, contrast, or layout stability, verify those user-facing outcomes directly.","isInternal":false,"tokens":951,"sizeBytes":3793},{"name":"SKILL.md","path":"skills/animation-performance/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/animation-performance/SKILL.md","title":"animation-performance","category":"anthropic-skill","format":"markdown","content":"---\nname: animation-performance\ndescription: \"Use when reviewing stylesheets, component styles, and responsive behavior related to Use transform and opacity for animations. Check the rendered layout across breakpoints and interaction states before proposing a fix.\"\nmetadata:\n  category: css\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/css/animation-performance\n---\n\n# Use transform and opacity for animations\n\nAnimating layout properties (width, height, top, margin) triggers the full browser rendering pipeline on every frame — style recalculation, layout, paint, and composite. This runs on the main thread and competes with JavaScript. Animating transform and opacity skips layout and paint entirely and runs on a dedicated GPU thread, achieving smooth 60fps even when the main thread is busy.\n\n## Quick Reference\n\n- Only transform and opacity can be composited on the GPU without triggering layout\n- Use will-change: transform sparingly to promote an element to its own compositor layer\n- Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n- Respect prefers-reduced-motion to disable animations for users who need it\n\n## Check\n\nFind CSS animations or transitions in this file that animate layout-triggering properties like top, left, width, height, or margin. Flag them for optimization.\n\n## Fix\n\nConvert layout-triggering animations to use transform equivalents: position changes to translate(), size changes to scale().\n\n## Explain\n\nExplain the browser rendering pipeline, why transform and opacity are performant for animation, and how the GPU compositor works.\n\n## Code Review\n\nReview stylesheets, component styles, and responsive states related to Use transform and opacity for animations. Flag exact selectors, declarations, or breakpoints that violate the rule in the rendered UI.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/css/animation-performance\n","frontmatter":{"name":"animation-performance","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use transform and opacity for animations. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/animation-performance"}},"isInternal":false,"tokens":407,"sizeBytes":2118},{"name":"rule.md","path":"skills/aria-allowed-attr/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-allowed-attr/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Use only allowed ARIA attributes for each role\n\n> Checks that ARIA attributes are allowed on their elements to ensure valid accessibility trees.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nARIA (Accessible Rich Internet Applications) attributes must match the role of the element they are applied to. Using attributes that don't belong to a role can result in \"silent\" failures where accessibility information is lost.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: aria-checked is allowed on checkbox role -->\n<div role=\"checkbox\" aria-checked=\"true\" tabindex=\"0\">Subscribe</div>\n\n<!-- ❌ Incorrect: aria-checked is NOT allowed on a heading role -->\n<h1 role=\"heading\" aria-checked=\"true\">Main Title</h1>\n```\n\n## Why It Matters\n\n- **Standard Compliance**: Adheres to WAI-ARIA specifications for robust and predictable web applications.\n- **AT Accuracy**: Guarantees that assistive technologies receive correct and relevant information about the element's state.\n- **Reduced Noise**: Prevents developers from adding redundant, invalid, or confusing metadata to the DOM.\n- **Future Compatibility**: Valid ARIA usage ensures that your application remains accessible as browser and screen reader implementations evolve.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","isInternal":false,"tokens":477,"sizeBytes":2402},{"name":"SKILL.md","path":"skills/aria-allowed-attr/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-allowed-attr/SKILL.md","title":"aria-allowed-attr","category":"anthropic-skill","format":"markdown","content":"---\nname: aria-allowed-attr\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use only allowed ARIA attributes for each role. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-allowed-attr\n---\n\n# Use only allowed ARIA attributes for each role\n\nInvalid ARIA attributes are ignored by screen readers or may cause them to misinterpret the element's purpose, leading to a broken experience for users with disabilities.\n\n## Quick Reference\n\n- Each ARIA role only supports a specific set of ARIA attributes\n- Using unsupported attributes can confuse assistive technologies\n- Ensures the accessibility tree remains valid and meaningful\n\n## Check\n\nVerify that all ARIA attributes used on elements are valid for their assigned WAI-ARIA roles.\n\n## Fix\n\nRemove or correct ARIA attributes that are not supported by the element's current ARIA role.\n\n## Explain\n\nExplain why using only role-supported ARIA attributes is necessary for proper screen reader communication.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Use only allowed ARIA attributes for each role. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-allowed-attr\n","frontmatter":{"name":"aria-allowed-attr","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use only allowed ARIA attributes for each role. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-allowed-attr"}},"isInternal":false,"tokens":360,"sizeBytes":1799},{"name":"rule.md","path":"skills/aria-command-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-command-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Provide accessible names for ARIA command elements\n\n> Checks that command elements like buttons and links have accessible names for screen reader support.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nCommand elements are interactive controls that perform an action. For these to be usable by everyone, they must have a programmatically determinable name that describes their function.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Accessible name via text content -->\n<button>Submit Form</button>\n\n<!-- ✅ Correct: Accessible name via aria-label (for icon buttons) -->\n<button aria-label=\"Close dialog\">\n  <svg>...</svg>\n</button>\n\n<!-- ❌ Incorrect: No accessible name (empty or icon-only without label) -->\n<button>\n  <i class=\"fa fa-trash\"></i>\n</button>\n```\n\n## Why It Matters\n\n- **Clarity**: Informs users exactly what action will be performed when the element is activated.\n- **Navigability**: Allows users to find and activate controls via voice commands or by browsing lists of controls in their screen reader.\n- **Inclusion**: Provides a comparable experience for users who cannot see visual icons or cues.\n- **Avoids Confusion**: Prevents the \"unlabeled button\" experience, which is one of the most common accessibility barriers.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","isInternal":false,"tokens":491,"sizeBytes":2426},{"name":"SKILL.md","path":"skills/aria-command-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-command-name/SKILL.md","title":"aria-command-name","category":"anthropic-skill","format":"markdown","content":"---\nname: aria-command-name\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for ARIA command elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-command-name\n---\n\n# Provide accessible names for ARIA command elements\n\nWithout an accessible name, screen reader users will only hear the role (e.g., 'button') without knowing what it does, making the interface impossible to navigate.\n\n## Quick Reference\n\n- Elements with command roles (button, link, menuitem) must have a label\n- Accessible names can be provided via text content, `aria-label`, or `aria-labelledby`\n- Ensures users know the purpose of the interactive element\n\n## Check\n\nIdentify elements with command roles (like button or link) that lack a clear accessible name.\n\n## Fix\n\nAdd an accessible name using inner text, `aria-label`, or `aria-labelledby` to all command elements.\n\n## Explain\n\nExplain how accessible names for command elements enable screen reader users to understand interactive controls.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Provide accessible names for ARIA command elements. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-command-name\n","frontmatter":{"name":"aria-command-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for ARIA command elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-command-name"}},"isInternal":false,"tokens":367,"sizeBytes":1846},{"name":"rule.md","path":"skills/aria-deprecated-role/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-deprecated-role/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Avoid using deprecated ARIA roles\n\n> Checks for deprecated or abstract ARIA roles to ensure long-term compatibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nAs the WAI-ARIA specification evolves, some roles are deprecated in favor of more precise or better-supported alternatives. Using modern roles ensures your application remains accessible for years to come.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Use modern roles or native elements -->\n<nav aria-label=\"Site\">...</nav>\n<ul role=\"list\">...</ul>\n\n<!-- ❌ Incorrect: Using deprecated roles -->\n<div role=\"directory\">...</div>\n```\n\n## Why It Matters\n\n- **Future-Proofing**: Keeps the application compatible with evolving browser and assistive technology (AT) standards.\n- **Reliability**: Ensures consistent interpretation of element roles across all platforms and devices.\n- **Semantic Accuracy**: Modern roles often provide more precise meaning than older, deprecated ones, leading to a better user experience.\n- **Cleaner Code**: Often, a deprecated role can be replaced by a native HTML element (like `<nav>` instead of `role=\"navigation\"`), which is the preferred approach.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","isInternal":false,"tokens":463,"sizeBytes":2328},{"name":"SKILL.md","path":"skills/aria-deprecated-role/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-deprecated-role/SKILL.md","title":"aria-deprecated-role","category":"anthropic-skill","format":"markdown","content":"---\nname: aria-deprecated-role\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid using deprecated ARIA roles. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-deprecated-role\n---\n\n# Avoid using deprecated ARIA roles\n\nUsing deprecated roles can lead to inconsistent behavior across different browsers and screen readers as they transition to newer standards.\n\n## Quick Reference\n\n- Deprecated ARIA roles should be replaced with modern equivalents\n- Browsers may drop support for deprecated roles in future versions\n- Ensures long-term compatibility with assistive technologies\n\n## Check\n\nSearch the codebase for deprecated ARIA roles like `directory` or abstract roles that shouldn't be used in HTML.\n\n## Fix\n\nUpdate deprecated ARIA roles to their modern recommended equivalents or use native HTML elements.\n\n## Explain\n\nExplain the risks of using deprecated ARIA roles and the benefits of moving to modern ARIA standards.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Avoid using deprecated ARIA roles. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-deprecated-role\n","frontmatter":{"name":"aria-deprecated-role","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid using deprecated ARIA roles. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-deprecated-role"}},"isInternal":false,"tokens":341,"sizeBytes":1762},{"name":"rule.md","path":"skills/aria-dialog-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-dialog-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Ensure dialogs have an accessible name\n\n> Checks that dialog elements have accessible names to orient screen reader users.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nDialogs (modals) interrupt the user's flow. To provide a smooth transition for assistive technology users, the dialog must identify itself as soon as it gains focus.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Using aria-labelledby to point to the header -->\n<div role=\"dialog\" aria-labelledby=\"modal-title\" aria-modal=\"true\">\n  <h2 id=\"modal-title\">Edit Profile</h2>\n  <form>...</form>\n</div>\n\n<!-- ✅ Correct: Using aria-label for a simple notification -->\n<div role=\"alertdialog\" aria-label=\"Session Timeout\" aria-modal=\"true\">\n  <p>Your session is about to expire.</p>\n  <button>Stay logged in</button>\n</div>\n\n<!-- ❌ Incorrect: No accessible name -->\n<div role=\"dialog\">\n  <p>Some content without a title...</p>\n</div>\n```\n\n## Why It Matters\n\n- **Orientation**: Helps users immediately understand they have entered a new context or \"window.\"\n- **Context**: Clearly states the purpose of the dialog (e.g., \"Confirm Deletion\") before the user starts interacting with its contents.\n- **Compliance**: Follows WAI-ARIA best practices for accessible modal windows and user interface patterns.\n- **Efficiency**: Allows users to decide whether to interact with or dismiss the dialog based on its title alone.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","isInternal":false,"tokens":542,"sizeBytes":2563},{"name":"SKILL.md","path":"skills/aria-dialog-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-dialog-name/SKILL.md","title":"aria-dialog-name","category":"anthropic-skill","format":"markdown","content":"---\nname: aria-dialog-name\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure dialogs have an accessible name. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-dialog-name\n---\n\n# Ensure dialogs have an accessible name\n\nWhen a dialog opens, screen readers should announce its purpose immediately so users know why their focus has shifted and what information is required.\n\n## Quick Reference\n\n- All dialog and alertdialog elements must have a descriptive label\n- Use `aria-labelledby` to point to a title or `aria-label` for a direct string\n- Helps users understand the context and purpose of the modal\n\n## Check\n\nVerify that every element with `role=\"dialog\"` or `role=\"alertdialog\"` has an accessible name.\n\n## Fix\n\nProvide an accessible name for the dialog using `aria-labelledby` (pointing to the header) or `aria-label`.\n\n## Explain\n\nExplain why naming dialogs is crucial for orienting screen reader users when modals appear.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Ensure dialogs have an accessible name. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-dialog-name\n","frontmatter":{"name":"aria-dialog-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure dialogs have an accessible name. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-dialog-name"}},"isInternal":false,"tokens":356,"sizeBytes":1771},{"name":"rule.md","path":"skills/aria-hidden-body/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-hidden-body/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Do not use aria-hidden on the document body\n\n> Ensures the document body is not set to aria-hidden, which would hide the entire page from screen readers.\n\n**Priority:** critical · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nThe `aria-hidden` attribute removes an element and all of its children from the accessibility tree. Applying it to the `<body>` tag makes your entire website non-existent for screen reader users.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Hidden attribute on background content only -->\n<body>\n  <div id=\"app-root\" aria-hidden=\"true\">\n    <!-- Main content hidden while modal is open -->\n  </div>\n  <div id=\"modal-portal\">\n    <!-- Modal remains visible to AT -->\n  </div>\n</body>\n\n<!-- ❌ Incorrect: aria-hidden on body -->\n<body aria-hidden=\"true\">\n  <h1>This whole page is invisible to a screen reader</h1>\n</body>\n```\n\n## Why It Matters\n\n- **Full Inaccessibility**: Hides every single piece of content and interactive element from screen readers.\n- **Broken Experience**: Users cannot navigate, read, or interact with any part of the application.\n- **Common Implementation Bug**: Frequently caused by automated scripts or libraries that try to \"lock\" the background when a modal is open but target the wrong element.\n- **Critical Failure**: This is considered a high-priority accessibility violation that prevents access to the entire service.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","isInternal":false,"tokens":521,"sizeBytes":2537},{"name":"SKILL.md","path":"skills/aria-hidden-body/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-hidden-body/SKILL.md","title":"aria-hidden-body","category":"anthropic-skill","format":"markdown","content":"---\nname: aria-hidden-body\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Do not use aria-hidden on the document body. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: critical\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/aria-hidden-body\n---\n\n# Do not use aria-hidden on the document body\n\nSetting `aria-hidden=\"true\"` on the body effectively silences the entire application for screen reader users, rendering the site completely unusable.\n\n## Quick Reference\n\n- The `<body>` element should never have `aria-hidden=\"true\"`\n- Hiding the body makes the entire page invisible to assistive technologies\n- Often happens accidentally when managing modal states\n\n## Check\n\nCheck if the `<body>` element has `aria-hidden=\"true\"` applied at any point in the lifecycle.\n\n## Fix\n\nRemove `aria-hidden=\"true\"` from the `<body>` and use it only on specific background containers when modals are open.\n\n## Explain\n\nExplain the catastrophic impact of hiding the body element from assistive technologies.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Do not use aria-hidden on the document body. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/aria-hidden-body\n","frontmatter":{"name":"aria-hidden-body","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Do not use aria-hidden on the document body. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"critical","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-hidden-body"}},"isInternal":false,"tokens":359,"sizeBytes":1775},{"name":"rule.md","path":"skills/aria-hidden-focus/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-hidden-focus/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# Remove focusable elements from aria-hidden containers\n\n> Ensures aria-hidden elements do not contain focusable content to avoid \"ghost\" focus.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nWhen an element is marked with `aria-hidden=\"true\"`, it is removed from the accessibility tree, but it is **not** removed from the keyboard tab order. [WAI-ARIA 1.2](https://www.w3.org/TR/wai-aria-1.2/) makes that distinction explicit, which is why this failure often shows up alongside broader [focus-management issues](/en/rules/accessibility/focus-management).\n## Code Example\n\n```html\n<!-- ✅ Correct: Focusable element is also removed from tab order -->\n<div aria-hidden=\"true\">\n  <button tabindex=\"-1\">Hidden Button</button>\n</div>\n\n<!-- ✅ Correct: Using the inert attribute (modern browser support) -->\n<div inert>\n  <button>Hidden Button</button>\n</div>\n\n<!-- ❌ Incorrect: Focusable but hidden from AT (Ghost Focus) -->\n<div aria-hidden=\"true\">\n  <button>I can be focused but not heard</button>\n</div>\n```\n\n## Why It Matters\n\n- **Avoid Ghost Focus**: Prevents the keyboard focus from disappearing into \"silent\" regions where no information is announced.\n- **User Clarity**: Ensures every focusable element has a corresponding announcement by the screen reader, maintaining user confidence.\n- **Logical Flow**: Maintains a consistent and predictable navigation path for keyboard-only users.\n- **Reduces Frustration**: Eliminates instances where users might think their browser or the website has crashed because focus seems to have disappeared.\n\n## Exceptions\n\n- Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.\n- A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.\n- Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.\n\n## Standards\n\n- Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.\n\n## Support Notes\n\n- The `inert` attribute is the cleanest modern fix, but older browser targets may still need a fallback that removes descendants from the tab order manually.\n- Verify the rendered focus behavior in the project target browsers because browser and assistive-technology combinations still differ in how they expose hidden content.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.","isInternal":false,"tokens":637,"sizeBytes":3078},{"name":"SKILL.md","path":"skills/aria-hidden-focus/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-hidden-focus/SKILL.md","title":"aria-hidden-focus","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-hidden-focus%2FSKILL.md -->","frontmatter":{"name":"aria-hidden-focus","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Remove focusable elements from aria-hidden containers. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-hidden-focus"}},"isInternal":false,"tokens":380,"sizeBytes":1870},{"name":"rule.md","path":"skills/aria-input-field-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-input-field-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-input-field-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":785,"sizeBytes":3679},{"name":"SKILL.md","path":"skills/aria-input-field-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-input-field-name/SKILL.md","title":"aria-input-field-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-input-field-name%2FSKILL.md -->","frontmatter":{"name":"aria-input-field-name","description":"Use when applies to all `<input>` (except type=hidden), `<textarea>`, `<select>`, and custom form widgets using role=textbox, role=combobox, role=spinbutton, role=searchbox, or role=listbox.","metadata":{"category":"accessibility","priority":"critical","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-input-field-name"}},"isInternal":false,"tokens":799,"sizeBytes":3421},{"name":"rule.md","path":"skills/aria-labels/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-labels/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-labels%2Freferences%2Frule.md -->","isInternal":false,"tokens":563,"sizeBytes":2688},{"name":"SKILL.md","path":"skills/aria-labels/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-labels/SKILL.md","title":"aria-labels","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-labels%2FSKILL.md -->","frontmatter":{"name":"aria-labels","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for all interactive elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-labels"}},"isInternal":false,"tokens":338,"sizeBytes":1742},{"name":"rule.md","path":"skills/aria-live-regions/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-live-regions/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-live-regions%2Freferences%2Frule.md -->","isInternal":false,"tokens":899,"sizeBytes":3899},{"name":"SKILL.md","path":"skills/aria-live-regions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-live-regions/SKILL.md","title":"aria-live-regions","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-live-regions%2FSKILL.md -->","frontmatter":{"name":"aria-live-regions","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Announce dynamic content with ARIA live regions. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-live-regions"}},"isInternal":false,"tokens":387,"sizeBytes":1913},{"name":"rule.md","path":"skills/aria-meter-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-meter-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-meter-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":466,"sizeBytes":2279},{"name":"SKILL.md","path":"skills/aria-meter-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-meter-name/SKILL.md","title":"aria-meter-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-meter-name%2FSKILL.md -->","frontmatter":{"name":"aria-meter-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for meter elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-meter-name"}},"isInternal":false,"tokens":371,"sizeBytes":1784},{"name":"rule.md","path":"skills/aria-progressbar-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-progressbar-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-progressbar-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":487,"sizeBytes":2323},{"name":"SKILL.md","path":"skills/aria-progressbar-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-progressbar-name/SKILL.md","title":"aria-progressbar-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-progressbar-name%2FSKILL.md -->","frontmatter":{"name":"aria-progressbar-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for progress bars. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-progressbar-name"}},"isInternal":false,"tokens":394,"sizeBytes":1993},{"name":"rule.md","path":"skills/aria-required-attr/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-required-attr/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-attr%2Freferences%2Frule.md -->","isInternal":false,"tokens":477,"sizeBytes":2343},{"name":"SKILL.md","path":"skills/aria-required-attr/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-required-attr/SKILL.md","title":"aria-required-attr","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-attr%2FSKILL.md -->","frontmatter":{"name":"aria-required-attr","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Include required ARIA attributes for roles. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-required-attr"}},"isInternal":false,"tokens":354,"sizeBytes":1833},{"name":"rule.md","path":"skills/aria-required-children/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-required-children/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-children%2Freferences%2Frule.md -->","isInternal":false,"tokens":1026,"sizeBytes":4196},{"name":"SKILL.md","path":"skills/aria-required-children/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-required-children/SKILL.md","title":"aria-required-children","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-children%2FSKILL.md -->","frontmatter":{"name":"aria-required-children","description":"Use when applies to custom ARIA widgets using composite roles: tablist, list, listbox, menu, menubar, tree, treegrid, grid, rowgroup, row, radiogroup. Use when reviewing components built with div/span elements that replace native HTML list, select, or nav elements.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-required-children"}},"isInternal":false,"tokens":851,"sizeBytes":3635},{"name":"rule.md","path":"skills/aria-required-parent/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-required-parent/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-parent%2Freferences%2Frule.md -->","isInternal":false,"tokens":476,"sizeBytes":2273},{"name":"SKILL.md","path":"skills/aria-required-parent/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-required-parent/SKILL.md","title":"aria-required-parent","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-required-parent%2FSKILL.md -->","frontmatter":{"name":"aria-required-parent","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure ARIA roles are contained by required parent roles. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-required-parent"}},"isInternal":false,"tokens":400,"sizeBytes":1991},{"name":"rule.md","path":"skills/aria-roles/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-roles/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-roles%2Freferences%2Frule.md -->","isInternal":false,"tokens":487,"sizeBytes":2366},{"name":"SKILL.md","path":"skills/aria-roles/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-roles/SKILL.md","title":"aria-roles","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-roles%2FSKILL.md -->","frontmatter":{"name":"aria-roles","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use valid ARIA role values. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-roles"}},"isInternal":false,"tokens":419,"sizeBytes":2057},{"name":"rule.md","path":"skills/aria-text/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-text/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-text%2Freferences%2Frule.md -->","isInternal":false,"tokens":555,"sizeBytes":2591},{"name":"SKILL.md","path":"skills/aria-text/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-text/SKILL.md","title":"aria-text","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-text%2FSKILL.md -->","frontmatter":{"name":"aria-text","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid focusable descendants in role='text' elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-text"}},"isInternal":false,"tokens":381,"sizeBytes":1943},{"name":"rule.md","path":"skills/aria-toggle-field-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-toggle-field-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-toggle-field-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":496,"sizeBytes":2453},{"name":"SKILL.md","path":"skills/aria-toggle-field-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-toggle-field-name/SKILL.md","title":"aria-toggle-field-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-toggle-field-name%2FSKILL.md -->","frontmatter":{"name":"aria-toggle-field-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for toggle fields. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-toggle-field-name"}},"isInternal":false,"tokens":359,"sizeBytes":1810},{"name":"rule.md","path":"skills/aria-tooltip-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-tooltip-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-tooltip-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":457,"sizeBytes":2259},{"name":"SKILL.md","path":"skills/aria-tooltip-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-tooltip-name/SKILL.md","title":"aria-tooltip-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-tooltip-name%2FSKILL.md -->","frontmatter":{"name":"aria-tooltip-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for tooltips. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-tooltip-name"}},"isInternal":false,"tokens":348,"sizeBytes":1856},{"name":"rule.md","path":"skills/aria-treeitem-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-treeitem-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-treeitem-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":855,"sizeBytes":3773},{"name":"SKILL.md","path":"skills/aria-treeitem-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-treeitem-name/SKILL.md","title":"aria-treeitem-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-treeitem-name%2FSKILL.md -->","frontmatter":{"name":"aria-treeitem-name","description":"Use when applies to custom tree widgets built with role='tree', role='treeitem', and role='group'. Common in file explorers, nested navigation menus, org charts, and any UI where items can be expanded or collapsed to reveal children.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-treeitem-name"}},"isInternal":false,"tokens":754,"sizeBytes":3412},{"name":"rule.md","path":"skills/aria-valid-attr-value/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-valid-attr-value/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr-value%2Freferences%2Frule.md -->","isInternal":false,"tokens":520,"sizeBytes":2530},{"name":"SKILL.md","path":"skills/aria-valid-attr-value/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-valid-attr-value/SKILL.md","title":"aria-valid-attr-value","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr-value%2FSKILL.md -->","frontmatter":{"name":"aria-valid-attr-value","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use valid values for ARIA attributes. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-valid-attr-value"}},"isInternal":false,"tokens":369,"sizeBytes":1822},{"name":"rule.md","path":"skills/aria-valid-attr/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-valid-attr/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr%2Freferences%2Frule.md -->","isInternal":false,"tokens":612,"sizeBytes":2851},{"name":"SKILL.md","path":"skills/aria-valid-attr/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/aria-valid-attr/SKILL.md","title":"aria-valid-attr","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faria-valid-attr%2FSKILL.md -->","frontmatter":{"name":"aria-valid-attr","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure ARIA attributes are valid. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/aria-valid-attr"}},"isInternal":false,"tokens":337,"sizeBytes":1703},{"name":"rule.md","path":"skills/article-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/article-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":477,"sizeBytes":2378},{"name":"SKILL.md","path":"skills/article-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/article-links/SKILL.md","title":"article-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle-links%2FSKILL.md -->","frontmatter":{"name":"article-links","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Optimize article link density. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/article-links"}},"isInternal":false,"tokens":333,"sizeBytes":1698},{"name":"rule.md","path":"skills/article/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/article/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle%2Freferences%2Frule.md -->","isInternal":false,"tokens":513,"sizeBytes":2420},{"name":"SKILL.md","path":"skills/article/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/article/SKILL.md","title":"article","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Farticle%2FSKILL.md -->","frontmatter":{"name":"article","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Implement valid Article structured data. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/article"}},"isInternal":false,"tokens":331,"sizeBytes":1684},{"name":"rule.md","path":"skills/audio-descriptions/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/audio-descriptions/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faudio-descriptions%2Freferences%2Frule.md -->","isInternal":false,"tokens":1145,"sizeBytes":5162},{"name":"SKILL.md","path":"skills/audio-descriptions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/audio-descriptions/SKILL.md","title":"audio-descriptions","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Faudio-descriptions%2FSKILL.md -->","frontmatter":{"name":"audio-descriptions","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide audio descriptions for video. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/audio-descriptions"}},"isInternal":false,"tokens":405,"sizeBytes":2197},{"name":"rule.md","path":"skills/author-byline/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/author-byline/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-byline%2Freferences%2Frule.md -->","isInternal":false,"tokens":484,"sizeBytes":2210},{"name":"SKILL.md","path":"skills/author-byline/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/author-byline/SKILL.md","title":"author-byline","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-byline%2FSKILL.md -->","frontmatter":{"name":"author-byline","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Display clear author bylines. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/author-byline"}},"isInternal":false,"tokens":336,"sizeBytes":1635},{"name":"rule.md","path":"skills/author-expertise/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/author-expertise/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-expertise%2Freferences%2Frule.md -->","isInternal":false,"tokens":535,"sizeBytes":2632},{"name":"SKILL.md","path":"skills/author-expertise/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/author-expertise/SKILL.md","title":"author-expertise","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-expertise%2FSKILL.md -->","frontmatter":{"name":"author-expertise","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Highlight author credentials and expertise. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/author-expertise"}},"isInternal":false,"tokens":341,"sizeBytes":1749},{"name":"rule.md","path":"skills/author-info/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/author-info/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-info%2Freferences%2Frule.md -->","isInternal":false,"tokens":505,"sizeBytes":2493},{"name":"SKILL.md","path":"skills/author-info/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/author-info/SKILL.md","title":"author-info","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fauthor-info%2FSKILL.md -->","frontmatter":{"name":"author-info","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Implement comprehensive author markup. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/author-info"}},"isInternal":false,"tokens":340,"sizeBytes":1688},{"name":"rule.md","path":"skills/autofocus-avoidance/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/autofocus-avoidance/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautofocus-avoidance%2Freferences%2Frule.md -->","isInternal":false,"tokens":859,"sizeBytes":3824},{"name":"SKILL.md","path":"skills/autofocus-avoidance/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/autofocus-avoidance/SKILL.md","title":"autofocus-avoidance","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautofocus-avoidance%2FSKILL.md -->","frontmatter":{"name":"autofocus-avoidance","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid autofocus on form fields. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/autofocus-avoidance"}},"isInternal":false,"tokens":393,"sizeBytes":2032},{"name":"rule.md","path":"skills/autoplay-media/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/autoplay-media/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautoplay-media%2Freferences%2Frule.md -->","isInternal":false,"tokens":832,"sizeBytes":3655},{"name":"SKILL.md","path":"skills/autoplay-media/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/autoplay-media/SKILL.md","title":"autoplay-media","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fautoplay-media%2FSKILL.md -->","frontmatter":{"name":"autoplay-media","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid autoplaying media. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/autoplay-media"}},"isInternal":false,"tokens":399,"sizeBytes":2062},{"name":"rule.md","path":"skills/avif-format/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/avif-format/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favif-format%2Freferences%2Frule.md -->","isInternal":false,"tokens":1316,"sizeBytes":5188},{"name":"SKILL.md","path":"skills/avif-format/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/avif-format/SKILL.md","title":"avif-format","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favif-format%2FSKILL.md -->","frontmatter":{"name":"avif-format","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use AVIF format for modern browsers. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/avif-format"}},"isInternal":false,"tokens":339,"sizeBytes":1576},{"name":"rule.md","path":"skills/avoid-eval/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/avoid-eval/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favoid-eval%2Freferences%2Frule.md -->","isInternal":false,"tokens":991,"sizeBytes":4460},{"name":"SKILL.md","path":"skills/avoid-eval/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/avoid-eval/SKILL.md","title":"avoid-eval","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Favoid-eval%2FSKILL.md -->","frontmatter":{"name":"avoid-eval","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Never use eval() or unsafe dynamic code execution. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"critical","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/avoid-eval"}},"isInternal":false,"tokens":449,"sizeBytes":2220},{"name":"rule.md","path":"skills/back-forward-cache/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/back-forward-cache/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fback-forward-cache%2Freferences%2Frule.md -->","isInternal":false,"tokens":1041,"sizeBytes":5041},{"name":"SKILL.md","path":"skills/back-forward-cache/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/back-forward-cache/SKILL.md","title":"back-forward-cache","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fback-forward-cache%2FSKILL.md -->","frontmatter":{"name":"back-forward-cache","description":"Use when reviewing navigation performance, browser lifecycle events, or resume-from-memory behavior. Check the actual browser lifecycle and restore path, not only static code patterns.","metadata":{"category":"performance","priority":"high","difficulty":"advanced","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/back-forward-cache"}},"isInternal":false,"tokens":442,"sizeBytes":2163},{"name":"rule.md","path":"skills/blocked-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/blocked-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fblocked-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":1076,"sizeBytes":4945},{"name":"SKILL.md","path":"skills/blocked-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/blocked-links/SKILL.md","title":"blocked-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fblocked-links%2FSKILL.md -->","frontmatter":{"name":"blocked-links","description":"Use when reviewing HTML source and JavaScript for links or resource URLs pointing to domains listed in common adblocker filter lists.","metadata":{"category":"security","priority":"low","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/blocked-links"}},"isInternal":false,"tokens":464,"sizeBytes":2348},{"name":"rule.md","path":"skills/breadcrumb-navigation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/breadcrumb-navigation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb-navigation%2Freferences%2Frule.md -->","isInternal":false,"tokens":2006,"sizeBytes":8363},{"name":"SKILL.md","path":"skills/breadcrumb-navigation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/breadcrumb-navigation/SKILL.md","title":"breadcrumb-navigation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb-navigation%2FSKILL.md -->","frontmatter":{"name":"breadcrumb-navigation","description":"Use when reviewing templates, rendered HTML, or shared components related to Implement accessible breadcrumb navigation. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/breadcrumb-navigation"}},"isInternal":false,"tokens":311,"sizeBytes":1669},{"name":"rule.md","path":"skills/breadcrumb/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/breadcrumb/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb%2Freferences%2Frule.md -->","isInternal":false,"tokens":569,"sizeBytes":2797},{"name":"SKILL.md","path":"skills/breadcrumb/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/breadcrumb/SKILL.md","title":"breadcrumb","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbreadcrumb%2FSKILL.md -->","frontmatter":{"name":"breadcrumb","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Implement valid BreadcrumbList schema. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/breadcrumb"}},"isInternal":false,"tokens":331,"sizeBytes":1690},{"name":"rule.md","path":"skills/broken-external-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/broken-external-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-external-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":492,"sizeBytes":2501},{"name":"SKILL.md","path":"skills/broken-external-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/broken-external-links/SKILL.md","title":"broken-external-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-external-links%2FSKILL.md -->","frontmatter":{"name":"broken-external-links","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Fix or remove broken external links. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/broken-external-links"}},"isInternal":false,"tokens":334,"sizeBytes":1604},{"name":"rule.md","path":"skills/broken-html/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/broken-html/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-html%2Freferences%2Frule.md -->","isInternal":false,"tokens":467,"sizeBytes":2396},{"name":"SKILL.md","path":"skills/broken-html/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/broken-html/SKILL.md","title":"broken-html","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-html%2FSKILL.md -->","frontmatter":{"name":"broken-html","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Fix malformed HTML structure. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/broken-html"}},"isInternal":false,"tokens":325,"sizeBytes":1692},{"name":"rule.md","path":"skills/broken-images/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/broken-images/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-images%2Freferences%2Frule.md -->","isInternal":false,"tokens":1085,"sizeBytes":4563},{"name":"SKILL.md","path":"skills/broken-images/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/broken-images/SKILL.md","title":"broken-images","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-images%2FSKILL.md -->","frontmatter":{"name":"broken-images","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Fix broken images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/broken-images"}},"isInternal":false,"tokens":611,"sizeBytes":2916},{"name":"rule.md","path":"skills/broken-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/broken-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":476,"sizeBytes":2351},{"name":"SKILL.md","path":"skills/broken-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/broken-links/SKILL.md","title":"broken-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbroken-links%2FSKILL.md -->","frontmatter":{"name":"broken-links","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Resolve internal broken links. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/broken-links"}},"isInternal":false,"tokens":338,"sizeBytes":1647},{"name":"rule.md","path":"skills/browser-caching/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/browser-caching/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-caching%2Freferences%2Frule.md -->","isInternal":false,"tokens":1528,"sizeBytes":6269},{"name":"SKILL.md","path":"skills/browser-caching/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/browser-caching/SKILL.md","title":"browser-caching","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-caching%2FSKILL.md -->","frontmatter":{"name":"browser-caching","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Enable browser caching. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/browser-caching"}},"isInternal":false,"tokens":312,"sizeBytes":1598},{"name":"rule.md","path":"skills/browser-required/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/browser-required/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-required%2Freferences%2Frule.md -->","isInternal":false,"tokens":854,"sizeBytes":4064},{"name":"SKILL.md","path":"skills/browser-required/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/browser-required/SKILL.md","title":"browser-required","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbrowser-required%2FSKILL.md -->","frontmatter":{"name":"browser-required","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Perform browser-based performance audits. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/browser-required"}},"isInternal":false,"tokens":341,"sizeBytes":1791},{"name":"rule.md","path":"skills/button-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/button-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbutton-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":684,"sizeBytes":3220},{"name":"SKILL.md","path":"skills/button-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/button-name/SKILL.md","title":"button-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fbutton-name%2FSKILL.md -->","frontmatter":{"name":"button-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for buttons. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"critical","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/button-name"}},"isInternal":false,"tokens":373,"sizeBytes":1951},{"name":"rule.md","path":"skills/canonical-chain/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/canonical-chain/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-chain%2Freferences%2Frule.md -->","isInternal":false,"tokens":481,"sizeBytes":2482},{"name":"SKILL.md","path":"skills/canonical-chain/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/canonical-chain/SKILL.md","title":"canonical-chain","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-chain%2FSKILL.md -->","frontmatter":{"name":"canonical-chain","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Avoid redirect chains on canonical URLs. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/canonical-chain"}},"isInternal":false,"tokens":349,"sizeBytes":1668},{"name":"rule.md","path":"skills/canonical-header/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/canonical-header/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-header%2Freferences%2Frule.md -->","isInternal":false,"tokens":493,"sizeBytes":2548},{"name":"SKILL.md","path":"skills/canonical-header/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/canonical-header/SKILL.md","title":"canonical-header","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-header%2FSKILL.md -->","frontmatter":{"name":"canonical-header","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Sync HTML canonical tags and Link headers. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/canonical-header"}},"isInternal":false,"tokens":339,"sizeBytes":1726},{"name":"rule.md","path":"skills/canonical-url/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/canonical-url/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-url%2Freferences%2Frule.md -->","isInternal":false,"tokens":1049,"sizeBytes":4655},{"name":"SKILL.md","path":"skills/canonical-url/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/canonical-url/SKILL.md","title":"canonical-url","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcanonical-url%2FSKILL.md -->","frontmatter":{"name":"canonical-url","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Set canonical URLs for all pages. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/canonical-url"}},"isInternal":false,"tokens":332,"sizeBytes":1657},{"name":"rule.md","path":"skills/carousel-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/carousel-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcarousel-accessibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":2442,"sizeBytes":9984},{"name":"SKILL.md","path":"skills/carousel-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/carousel-accessibility/SKILL.md","title":"carousel-accessibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcarousel-accessibility%2FSKILL.md -->","frontmatter":{"name":"carousel-accessibility","description":"Use when reviewing templates, rendered HTML, or shared components related to Make carousels accessible. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"advanced","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/carousel-accessibility"}},"isInternal":false,"tokens":333,"sizeBytes":1688},{"name":"rule.md","path":"skills/cascade-layers/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cascade-layers/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcascade-layers%2Freferences%2Frule.md -->","isInternal":false,"tokens":1643,"sizeBytes":6811},{"name":"SKILL.md","path":"skills/cascade-layers/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cascade-layers/SKILL.md","title":"cascade-layers","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcascade-layers%2FSKILL.md -->","frontmatter":{"name":"cascade-layers","description":"Use when reviewing a CSS architecture for specificity issues, setting up a design system, or migrating a large codebase from utility-first to a layered architecture.","metadata":{"category":"css","priority":"low","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/cascade-layers"}},"isInternal":false,"tokens":406,"sizeBytes":2059},{"name":"rule.md","path":"skills/cdn/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cdn/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcdn%2Freferences%2Frule.md -->","isInternal":false,"tokens":1199,"sizeBytes":5254},{"name":"SKILL.md","path":"skills/cdn/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cdn/SKILL.md","title":"cdn","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcdn%2FSKILL.md -->","frontmatter":{"name":"cdn","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Use a content delivery network. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/cdn"}},"isInternal":false,"tokens":333,"sizeBytes":1622},{"name":"rule.md","path":"skills/charset/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/charset/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcharset%2Freferences%2Frule.md -->","isInternal":false,"tokens":678,"sizeBytes":2856},{"name":"SKILL.md","path":"skills/charset/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/charset/SKILL.md","title":"charset","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcharset%2FSKILL.md -->","frontmatter":{"name":"charset","description":"Use when reviewing templates, rendered HTML, or shared components related to Declare UTF-8 character encoding. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"critical","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/charset"}},"isInternal":false,"tokens":326,"sizeBytes":1578},{"name":"rule.md","path":"skills/citations/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/citations/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcitations%2Freferences%2Frule.md -->","isInternal":false,"tokens":460,"sizeBytes":2340},{"name":"SKILL.md","path":"skills/citations/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/citations/SKILL.md","title":"citations","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcitations%2FSKILL.md -->","frontmatter":{"name":"citations","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Cite authoritative external sources. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/citations"}},"isInternal":false,"tokens":348,"sizeBytes":1708},{"name":"rule.md","path":"skills/clean-up-comments/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/clean-up-comments/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fclean-up-comments%2Freferences%2Frule.md -->","isInternal":false,"tokens":3256,"sizeBytes":13929},{"name":"SKILL.md","path":"skills/clean-up-comments/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/clean-up-comments/SKILL.md","title":"clean-up-comments","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fclean-up-comments%2FSKILL.md -->","frontmatter":{"name":"clean-up-comments","description":"Use when reviewing templates, rendered HTML, or shared components related to Remove comments and debug code in production. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/clean-up-comments"}},"isInternal":false,"tokens":328,"sizeBytes":1739},{"name":"rule.md","path":"skills/code-splitting/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/code-splitting/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcode-splitting%2Freferences%2Frule.md -->","isInternal":false,"tokens":856,"sizeBytes":3994},{"name":"SKILL.md","path":"skills/code-splitting/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/code-splitting/SKILL.md","title":"code-splitting","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcode-splitting%2FSKILL.md -->","frontmatter":{"name":"code-splitting","description":"Use when reviewing large SPA bundles, new dependency additions, or routes that feel slow to hydrate. Focus on code that is not required for the initial view and can move behind route transitions, user interaction, or viewport-based loading.","metadata":{"category":"javascript","priority":"high","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/code-splitting"}},"isInternal":false,"tokens":393,"sizeBytes":1971},{"name":"rule.md","path":"skills/color-contrast/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/color-contrast/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-contrast%2Freferences%2Frule.md -->","isInternal":false,"tokens":953,"sizeBytes":4013},{"name":"SKILL.md","path":"skills/color-contrast/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/color-contrast/SKILL.md","title":"color-contrast","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-contrast%2FSKILL.md -->","frontmatter":{"name":"color-contrast","description":"Use when applies to all visible text and text images, UI component borders (input fields, buttons), focus indicators, icons that convey meaning, and graphical objects required to understand content. Does not apply to inactive/disabled UI components or purely decorative elements.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/color-contrast"}},"isInternal":false,"tokens":843,"sizeBytes":3427},{"name":"rule.md","path":"skills/color-oklch/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/color-oklch/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-oklch%2Freferences%2Frule.md -->","isInternal":false,"tokens":2325,"sizeBytes":7656},{"name":"SKILL.md","path":"skills/color-oklch/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/color-oklch/SKILL.md","title":"color-oklch","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcolor-oklch%2FSKILL.md -->","frontmatter":{"name":"color-oklch","description":"Use when building a design token system, creating accessible colour palettes, generating colour ramps programmatically, or migrating a design system to support wide-gamut displays.","metadata":{"category":"css","priority":"low","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/color-oklch"}},"isInternal":false,"tokens":501,"sizeBytes":2260},{"name":"rule.md","path":"skills/compression/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/compression/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcompression%2Freferences%2Frule.md -->","isInternal":false,"tokens":960,"sizeBytes":4398},{"name":"SKILL.md","path":"skills/compression/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/compression/SKILL.md","title":"compression","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcompression%2FSKILL.md -->","frontmatter":{"name":"compression","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Enable text-based compression. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/compression"}},"isInternal":false,"tokens":343,"sizeBytes":1682},{"name":"rule.md","path":"skills/consent-mode/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/consent-mode/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsent-mode%2Freferences%2Frule.md -->","isInternal":false,"tokens":847,"sizeBytes":3940},{"name":"SKILL.md","path":"skills/consent-mode/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/consent-mode/SKILL.md","title":"consent-mode","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsent-mode%2FSKILL.md -->","frontmatter":{"name":"consent-mode","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Implement Google Consent Mode v2. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/consent-mode"}},"isInternal":false,"tokens":349,"sizeBytes":1700},{"name":"rule.md","path":"skills/consistent-help/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/consistent-help/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsistent-help%2Freferences%2Frule.md -->","isInternal":false,"tokens":713,"sizeBytes":3354},{"name":"SKILL.md","path":"skills/consistent-help/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/consistent-help/SKILL.md","title":"consistent-help","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsistent-help%2FSKILL.md -->","frontmatter":{"name":"consistent-help","description":"Use when reviewing support UI across multi-page flows such as checkout, onboarding, account recovery, or support journeys. Compare multiple pages in the same variation instead of reviewing a single page alone.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/consistent-help"}},"isInternal":false,"tokens":376,"sizeBytes":1925},{"name":"rule.md","path":"skills/console-cleanup/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/console-cleanup/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsole-cleanup%2Freferences%2Frule.md -->","isInternal":false,"tokens":707,"sizeBytes":3214},{"name":"SKILL.md","path":"skills/console-cleanup/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/console-cleanup/SKILL.md","title":"console-cleanup","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconsole-cleanup%2FSKILL.md -->","frontmatter":{"name":"console-cleanup","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Remove console statements in production. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/console-cleanup"}},"isInternal":false,"tokens":332,"sizeBytes":1808},{"name":"rule.md","path":"skills/const-let/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/const-let/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconst-let%2Freferences%2Frule.md -->","isInternal":false,"tokens":673,"sizeBytes":2697},{"name":"SKILL.md","path":"skills/const-let/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/const-let/SKILL.md","title":"const-let","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fconst-let%2FSKILL.md -->","frontmatter":{"name":"const-let","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Prefer const and let over var. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/const-let"}},"isInternal":false,"tokens":384,"sizeBytes":1880},{"name":"rule.md","path":"skills/contact-page/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/contact-page/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontact-page%2Freferences%2Frule.md -->","isInternal":false,"tokens":486,"sizeBytes":2216},{"name":"SKILL.md","path":"skills/contact-page/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/contact-page/SKILL.md","title":"contact-page","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontact-page%2FSKILL.md -->","frontmatter":{"name":"contact-page","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Create a comprehensive Contact page. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/contact-page"}},"isInternal":false,"tokens":334,"sizeBytes":1695},{"name":"rule.md","path":"skills/container-queries/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/container-queries/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontainer-queries%2Freferences%2Frule.md -->","isInternal":false,"tokens":866,"sizeBytes":3530},{"name":"SKILL.md","path":"skills/container-queries/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/container-queries/SKILL.md","title":"container-queries","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontainer-queries%2FSKILL.md -->","frontmatter":{"name":"container-queries","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use container queries for component-level responsiveness. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/container-queries"}},"isInternal":false,"tokens":392,"sizeBytes":2105},{"name":"rule.md","path":"skills/content-dates/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/content-dates/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-dates%2Freferences%2Frule.md -->","isInternal":false,"tokens":967,"sizeBytes":4204},{"name":"SKILL.md","path":"skills/content-dates/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/content-dates/SKILL.md","title":"content-dates","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-dates%2FSKILL.md -->","frontmatter":{"name":"content-dates","description":"Use when auditing article or blog pages for date markup, generating Article JSON-LD with datePublished/dateModified, or checking whether a CMS template surfaces dates correctly.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/content-dates"}},"isInternal":false,"tokens":667,"sizeBytes":2766},{"name":"rule.md","path":"skills/content-security-policy/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/content-security-policy/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-security-policy%2Freferences%2Frule.md -->","isInternal":false,"tokens":2714,"sizeBytes":10924},{"name":"SKILL.md","path":"skills/content-security-policy/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/content-security-policy/SKILL.md","title":"content-security-policy","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-security-policy%2FSKILL.md -->","frontmatter":{"name":"content-security-policy","description":"Use when reviewing headers, forms, cookies, or third-party integrations related to Implement a content security policy. Validate the effective browser and HTTP behavior in a production-like environment.","metadata":{"category":"security","priority":"high","difficulty":"advanced","estimatedTime":"45","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/content-security-policy"}},"isInternal":false,"tokens":462,"sizeBytes":2441},{"name":"rule.md","path":"skills/content-without-css/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/content-without-css/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-without-css%2Freferences%2Frule.md -->","isInternal":false,"tokens":1968,"sizeBytes":8677},{"name":"SKILL.md","path":"skills/content-without-css/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/content-without-css/SKILL.md","title":"content-without-css","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontent-without-css%2FSKILL.md -->","frontmatter":{"name":"content-without-css","description":"Use when reviewing rendered HTML, layout components, or design-system patterns that may depend on presentation for meaning. Check the DOM order, semantic structure, form relationships, and whether CSS generated content carries essential information.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/content-without-css"}},"isInternal":false,"tokens":425,"sizeBytes":2189},{"name":"rule.md","path":"skills/contract-testing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/contract-testing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontract-testing%2Freferences%2Frule.md -->","isInternal":false,"tokens":2414,"sizeBytes":10342},{"name":"SKILL.md","path":"skills/contract-testing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/contract-testing/SKILL.md","title":"contract-testing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcontract-testing%2FSKILL.md -->","frontmatter":{"name":"contract-testing","description":"Use when setting up integration testing for a frontend-backend API boundary, evaluating whether two services are safe to deploy independently, or replacing slow end-to-end tests with contract tests.","metadata":{"category":"testing","priority":"medium","difficulty":"advanced","estimatedTime":"120","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/contract-testing"}},"isInternal":false,"tokens":414,"sizeBytes":2193},{"name":"rule.md","path":"skills/cookie-consent/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cookie-consent/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcookie-consent%2Freferences%2Frule.md -->","isInternal":false,"tokens":1817,"sizeBytes":8307},{"name":"SKILL.md","path":"skills/cookie-consent/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cookie-consent/SKILL.md","title":"cookie-consent","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcookie-consent%2FSKILL.md -->","frontmatter":{"name":"cookie-consent","description":"Use when reviewing a website for GDPR/CCPA compliance, specifically whether cookie consent is obtained before non-essential cookies are set.","metadata":{"category":"privacy","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/privacy/cookie-consent"}},"isInternal":false,"tokens":493,"sizeBytes":2549},{"name":"rule.md","path":"skills/critical-images/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/critical-images/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-images%2Freferences%2Frule.md -->","isInternal":false,"tokens":891,"sizeBytes":3493},{"name":"SKILL.md","path":"skills/critical-images/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/critical-images/SKILL.md","title":"critical-images","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-images%2FSKILL.md -->","frontmatter":{"name":"critical-images","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Prioritize loading critical images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/critical-images"}},"isInternal":false,"tokens":332,"sizeBytes":1567},{"name":"rule.md","path":"skills/critical-request-chains/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/critical-request-chains/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-request-chains%2Freferences%2Frule.md -->","isInternal":false,"tokens":899,"sizeBytes":4020},{"name":"SKILL.md","path":"skills/critical-request-chains/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/critical-request-chains/SKILL.md","title":"critical-request-chains","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcritical-request-chains%2FSKILL.md -->","frontmatter":{"name":"critical-request-chains","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Minimize critical request chains. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"advanced","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/critical-request-chains"}},"isInternal":false,"tokens":334,"sizeBytes":1671},{"name":"rule.md","path":"skills/cross-browser-testing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cross-browser-testing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-browser-testing%2Freferences%2Frule.md -->","isInternal":false,"tokens":2506,"sizeBytes":10491},{"name":"SKILL.md","path":"skills/cross-browser-testing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cross-browser-testing/SKILL.md","title":"cross-browser-testing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-browser-testing%2FSKILL.md -->","frontmatter":{"name":"cross-browser-testing","description":"Use when reviewing CI coverage, automated checks, or test strategy related to Test across all major browsers. Focus on whether the rule is continuously verified, not just documented.","metadata":{"category":"testing","priority":"high","difficulty":"intermediate","estimatedTime":"60","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/cross-browser-testing"}},"isInternal":false,"tokens":331,"sizeBytes":1707},{"name":"rule.md","path":"skills/cross-origin-isolation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cross-origin-isolation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-isolation%2Freferences%2Frule.md -->","isInternal":false,"tokens":836,"sizeBytes":4029},{"name":"SKILL.md","path":"skills/cross-origin-isolation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cross-origin-isolation/SKILL.md","title":"cross-origin-isolation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-isolation%2FSKILL.md -->","frontmatter":{"name":"cross-origin-isolation","description":"Use when reviewing security-sensitive web apps, SharedArrayBuffer usage, worker-heavy apps, editors, or measurement features that require cross-origin isolation. Check both headers and real browser behavior.","metadata":{"category":"security","priority":"medium","difficulty":"advanced","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/cross-origin-isolation"}},"isInternal":false,"tokens":474,"sizeBytes":2257},{"name":"rule.md","path":"skills/cross-origin-security/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cross-origin-security/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-security%2Freferences%2Frule.md -->","isInternal":false,"tokens":1115,"sizeBytes":5316},{"name":"SKILL.md","path":"skills/cross-origin-security/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cross-origin-security/SKILL.md","title":"cross-origin-security","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcross-origin-security%2FSKILL.md -->","frontmatter":{"name":"cross-origin-security","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Handle cross-origin requests securely. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/cross-origin-security"}},"isInternal":false,"tokens":446,"sizeBytes":2382},{"name":"rule.md","path":"skills/css-at-property/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-at-property/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-at-property%2Freferences%2Frule.md -->","isInternal":false,"tokens":1592,"sizeBytes":6828},{"name":"SKILL.md","path":"skills/css-at-property/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-at-property/SKILL.md","title":"css-at-property","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-at-property%2FSKILL.md -->","frontmatter":{"name":"css-at-property","description":"Use when implementing animated gradients, complex CSS transitions that involve custom property values, or building a typed design token system where custom property misuse should produce visible errors.","metadata":{"category":"css","priority":"low","difficulty":"advanced","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-at-property"}},"isInternal":false,"tokens":435,"sizeBytes":2411},{"name":"rule.md","path":"skills/css-containment/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-containment/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-containment%2Freferences%2Frule.md -->","isInternal":false,"tokens":794,"sizeBytes":3825},{"name":"SKILL.md","path":"skills/css-containment/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-containment/SKILL.md","title":"css-containment","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-containment%2FSKILL.md -->","frontmatter":{"name":"css-containment","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use CSS containment to limit repaint scope. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"advanced","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-containment"}},"isInternal":false,"tokens":390,"sizeBytes":2048},{"name":"rule.md","path":"skills/css-critical/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-critical/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-critical%2Freferences%2Frule.md -->","isInternal":false,"tokens":3188,"sizeBytes":13354},{"name":"SKILL.md","path":"skills/css-critical/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-critical/SKILL.md","title":"css-critical","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-critical%2FSKILL.md -->","frontmatter":{"name":"css-critical","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Inline critical CSS for faster rendering. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"advanced","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-critical"}},"isInternal":false,"tokens":347,"sizeBytes":1767},{"name":"rule.md","path":"skills/css-custom-properties/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-custom-properties/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-custom-properties%2Freferences%2Frule.md -->","isInternal":false,"tokens":905,"sizeBytes":3303},{"name":"SKILL.md","path":"skills/css-custom-properties/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-custom-properties/SKILL.md","title":"css-custom-properties","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-custom-properties%2FSKILL.md -->","frontmatter":{"name":"css-custom-properties","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use CSS custom properties for design tokens. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-custom-properties"}},"isInternal":false,"tokens":383,"sizeBytes":1972},{"name":"rule.md","path":"skills/css-file-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-file-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-file-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":774,"sizeBytes":3599},{"name":"SKILL.md","path":"skills/css-file-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-file-size/SKILL.md","title":"css-file-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-file-size%2FSKILL.md -->","frontmatter":{"name":"css-file-size","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Optimize CSS file size. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/css-file-size"}},"isInternal":false,"tokens":333,"sizeBytes":1595},{"name":"rule.md","path":"skills/css-grid/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-grid/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-grid%2Freferences%2Frule.md -->","isInternal":false,"tokens":904,"sizeBytes":3708},{"name":"SKILL.md","path":"skills/css-grid/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-grid/SKILL.md","title":"css-grid","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-grid%2FSKILL.md -->","frontmatter":{"name":"css-grid","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use CSS Grid for two-dimensional layouts. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-grid"}},"isInternal":false,"tokens":392,"sizeBytes":1973},{"name":"rule.md","path":"skills/css-minification/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-minification/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-minification%2Freferences%2Frule.md -->","isInternal":false,"tokens":4037,"sizeBytes":16794},{"name":"SKILL.md","path":"skills/css-minification/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-minification/SKILL.md","title":"css-minification","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-minification%2FSKILL.md -->","frontmatter":{"name":"css-minification","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Minify all CSS files. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-minification"}},"isInternal":false,"tokens":343,"sizeBytes":1659},{"name":"rule.md","path":"skills/css-non-blocking/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-non-blocking/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-non-blocking%2Freferences%2Frule.md -->","isInternal":false,"tokens":1799,"sizeBytes":7367},{"name":"SKILL.md","path":"skills/css-non-blocking/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-non-blocking/SKILL.md","title":"css-non-blocking","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-non-blocking%2FSKILL.md -->","frontmatter":{"name":"css-non-blocking","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Load CSS without blocking render. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-non-blocking"}},"isInternal":false,"tokens":325,"sizeBytes":1666},{"name":"rule.md","path":"skills/css-order/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-order/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-order%2Freferences%2Frule.md -->","isInternal":false,"tokens":4459,"sizeBytes":19070},{"name":"SKILL.md","path":"skills/css-order/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-order/SKILL.md","title":"css-order","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-order%2FSKILL.md -->","frontmatter":{"name":"css-order","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Order CSS files correctly. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-order"}},"isInternal":false,"tokens":323,"sizeBytes":1616},{"name":"rule.md","path":"skills/css-print/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-print/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-print%2Freferences%2Frule.md -->","isInternal":false,"tokens":4970,"sizeBytes":20120},{"name":"SKILL.md","path":"skills/css-print/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/css-print/SKILL.md","title":"css-print","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcss-print%2FSKILL.md -->","frontmatter":{"name":"css-print","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Include a print stylesheet. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/css-print"}},"isInternal":false,"tokens":324,"sizeBytes":1688},{"name":"rule.md","path":"skills/cumulative-layout-shift/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cumulative-layout-shift/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcumulative-layout-shift%2Freferences%2Frule.md -->","isInternal":false,"tokens":1294,"sizeBytes":5150},{"name":"SKILL.md","path":"skills/cumulative-layout-shift/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/cumulative-layout-shift/SKILL.md","title":"cumulative-layout-shift","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcumulative-layout-shift%2FSKILL.md -->","frontmatter":{"name":"cumulative-layout-shift","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Minimize cumulative layout shift. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/cumulative-layout-shift"}},"isInternal":false,"tokens":353,"sizeBytes":1754},{"name":"rule.md","path":"skills/currency-formatting/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/currency-formatting/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcurrency-formatting%2Freferences%2Frule.md -->","isInternal":false,"tokens":1643,"sizeBytes":6688},{"name":"SKILL.md","path":"skills/currency-formatting/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/currency-formatting/SKILL.md","title":"currency-formatting","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcurrency-formatting%2FSKILL.md -->","frontmatter":{"name":"currency-formatting","description":"Use when reviewing utility functions, component props, or template strings that format numbers, prices, or dates to check whether Intl APIs are used correctly.","metadata":{"category":"i18n","priority":"medium","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/i18n/currency-formatting"}},"isInternal":false,"tokens":467,"sizeBytes":2372},{"name":"rule.md","path":"skills/custom-element-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/custom-element-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcustom-element-accessibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":2028,"sizeBytes":8834},{"name":"SKILL.md","path":"skills/custom-element-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/custom-element-accessibility/SKILL.md","title":"custom-element-accessibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fcustom-element-accessibility%2FSKILL.md -->","frontmatter":{"name":"custom-element-accessibility","description":"Use when reviewing custom element class definitions or Web Component source code to check for missing ARIA reflection, keyboard handling, and form association.","metadata":{"category":"html","priority":"medium","difficulty":"advanced","estimatedTime":"60","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/custom-element-accessibility"}},"isInternal":false,"tokens":496,"sizeBytes":2619},{"name":"rule.md","path":"skills/dark-mode-css/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dark-mode-css/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdark-mode-css%2Freferences%2Frule.md -->","isInternal":false,"tokens":952,"sizeBytes":3745},{"name":"SKILL.md","path":"skills/dark-mode-css/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dark-mode-css/SKILL.md","title":"dark-mode-css","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdark-mode-css%2FSKILL.md -->","frontmatter":{"name":"dark-mode-css","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Support dark mode with prefers-color-scheme. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/dark-mode-css"}},"isInternal":false,"tokens":419,"sizeBytes":2080},{"name":"rule.md","path":"skills/data-minimisation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/data-minimisation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdata-minimisation%2Freferences%2Frule.md -->","isInternal":false,"tokens":1284,"sizeBytes":6179},{"name":"SKILL.md","path":"skills/data-minimisation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/data-minimisation/SKILL.md","title":"data-minimisation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdata-minimisation%2FSKILL.md -->","frontmatter":{"name":"data-minimisation","description":"Use when reviewing form components, API payloads, or client-side storage to identify fields that are collected but not consumed by a stated feature.","metadata":{"category":"privacy","priority":"medium","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/privacy/data-minimisation"}},"isInternal":false,"tokens":472,"sizeBytes":2428},{"name":"rule.md","path":"skills/dead-end-pages/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dead-end-pages/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdead-end-pages%2Freferences%2Frule.md -->","isInternal":false,"tokens":1145,"sizeBytes":5163},{"name":"SKILL.md","path":"skills/dead-end-pages/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dead-end-pages/SKILL.md","title":"dead-end-pages","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdead-end-pages%2FSKILL.md -->","frontmatter":{"name":"dead-end-pages","description":"Use when auditing a site's internal link graph for dead-end pages, suggesting related-content links to add to thin or standalone pages, or reviewing CMS templates that produce link-free content pages.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/dead-end-pages"}},"isInternal":false,"tokens":583,"sizeBytes":2737},{"name":"rule.md","path":"skills/debounce-throttle/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/debounce-throttle/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdebounce-throttle%2Freferences%2Frule.md -->","isInternal":false,"tokens":870,"sizeBytes":3771},{"name":"SKILL.md","path":"skills/debounce-throttle/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/debounce-throttle/SKILL.md","title":"debounce-throttle","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdebounce-throttle%2FSKILL.md -->","frontmatter":{"name":"debounce-throttle","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Debounce and throttle event handlers. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/debounce-throttle"}},"isInternal":false,"tokens":365,"sizeBytes":1808},{"name":"rule.md","path":"skills/decorative-elements/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/decorative-elements/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdecorative-elements%2Freferences%2Frule.md -->","isInternal":false,"tokens":944,"sizeBytes":4202},{"name":"SKILL.md","path":"skills/decorative-elements/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/decorative-elements/SKILL.md","title":"decorative-elements","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdecorative-elements%2FSKILL.md -->","frontmatter":{"name":"decorative-elements","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Hide decorative elements from assistive technology. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant. If an image is clearly decorative, default to no finding unless the snippet shows an actual issue such as broken semantics, focusability, or visible layout instability.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/decorative-elements"}},"isInternal":false,"tokens":507,"sizeBytes":2692},{"name":"rule.md","path":"skills/defer-async/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/defer-async/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefer-async%2Freferences%2Frule.md -->","isInternal":false,"tokens":916,"sizeBytes":4342},{"name":"SKILL.md","path":"skills/defer-async/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/defer-async/SKILL.md","title":"defer-async","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefer-async%2FSKILL.md -->","frontmatter":{"name":"defer-async","description":"Use when reviewing templates, rendered HTML, or shared components related to Load scripts with defer, async, or type=module. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/defer-async"}},"isInternal":false,"tokens":424,"sizeBytes":1977},{"name":"rule.md","path":"skills/definition-list/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/definition-list/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefinition-list%2Freferences%2Frule.md -->","isInternal":false,"tokens":733,"sizeBytes":3130},{"name":"SKILL.md","path":"skills/definition-list/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/definition-list/SKILL.md","title":"definition-list","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdefinition-list%2FSKILL.md -->","frontmatter":{"name":"definition-list","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use correct definition list structure. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/definition-list"}},"isInternal":false,"tokens":348,"sizeBytes":1793},{"name":"rule.md","path":"skills/dependency-audit/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dependency-audit/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdependency-audit%2Freferences%2Frule.md -->","isInternal":false,"tokens":1436,"sizeBytes":6472},{"name":"SKILL.md","path":"skills/dependency-audit/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dependency-audit/SKILL.md","title":"dependency-audit","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdependency-audit%2FSKILL.md -->","frontmatter":{"name":"dependency-audit","description":"Use when reviewing a project's security posture, setting up CI pipelines, or responding to a reported vulnerability in a dependency.","metadata":{"category":"security","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/dependency-audit"}},"isInternal":false,"tokens":359,"sizeBytes":1853},{"name":"rule.md","path":"skills/dimensions/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dimensions/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdimensions%2Freferences%2Frule.md -->","isInternal":false,"tokens":1409,"sizeBytes":5729},{"name":"SKILL.md","path":"skills/dimensions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dimensions/SKILL.md","title":"dimensions","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdimensions%2FSKILL.md -->","frontmatter":{"name":"dimensions","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Set explicit width and height on images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together. Separate real CLS risks from tiny decorative SVGs or ornament-only assets that are unlikely to move surrounding content.","metadata":{"category":"images","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/dimensions"}},"isInternal":false,"tokens":769,"sizeBytes":3711},{"name":"rule.md","path":"skills/direction-attribute/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/direction-attribute/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdirection-attribute%2Freferences%2Frule.md -->","isInternal":false,"tokens":3594,"sizeBytes":13713},{"name":"SKILL.md","path":"skills/direction-attribute/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/direction-attribute/SKILL.md","title":"direction-attribute","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdirection-attribute%2FSKILL.md -->","frontmatter":{"name":"direction-attribute","description":"Use when reviewing templates, rendered HTML, or shared components related to Set text direction for RTL languages. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/direction-attribute"}},"isInternal":false,"tokens":434,"sizeBytes":2136},{"name":"rule.md","path":"skills/disclaimers/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/disclaimers/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdisclaimers%2Freferences%2Frule.md -->","isInternal":false,"tokens":1018,"sizeBytes":4789},{"name":"SKILL.md","path":"skills/disclaimers/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/disclaimers/SKILL.md","title":"disclaimers","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdisclaimers%2FSKILL.md -->","frontmatter":{"name":"disclaimers","description":"Use when auditing YMYL content pages for trust signals, generating disclaimer copy for medical or financial content, or reviewing affiliate disclosure requirements under FTC or ASA guidelines.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/disclaimers"}},"isInternal":false,"tokens":699,"sizeBytes":3391},{"name":"rule.md","path":"skills/dlitem/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dlitem/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdlitem%2Freferences%2Frule.md -->","isInternal":false,"tokens":697,"sizeBytes":2955},{"name":"SKILL.md","path":"skills/dlitem/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dlitem/SKILL.md","title":"dlitem","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdlitem%2FSKILL.md -->","frontmatter":{"name":"dlitem","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Wrap definition items in a definition list. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/dlitem"}},"isInternal":false,"tokens":401,"sizeBytes":1751},{"name":"rule.md","path":"skills/doctype/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/doctype/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdoctype%2Freferences%2Frule.md -->","isInternal":false,"tokens":743,"sizeBytes":3204},{"name":"SKILL.md","path":"skills/doctype/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/doctype/SKILL.md","title":"doctype","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdoctype%2FSKILL.md -->","frontmatter":{"name":"doctype","description":"Use when applies to all HTML documents. Always check the very first line of the raw HTML source (view-source: or DevTools > Network > Response). In SSR frameworks, check the root HTML template (e.g., _document.tsx in Next.js, index.html in Vite/Vue, application.html.erb in Rails). The doctype is not a tag — it is a declaration and does not need a closing tag.","metadata":{"category":"html","priority":"critical","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/doctype"}},"isInternal":false,"tokens":739,"sizeBytes":3334},{"name":"rule.md","path":"skills/dom-performance/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dom-performance/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-performance%2Freferences%2Frule.md -->","isInternal":false,"tokens":1046,"sizeBytes":4703},{"name":"SKILL.md","path":"skills/dom-performance/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dom-performance/SKILL.md","title":"dom-performance","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-performance%2FSKILL.md -->","frontmatter":{"name":"dom-performance","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Minimize costly DOM read/write operations. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug. In React, repeated requestAnimationFrame-driven state updates across multiple mounted components are a valid performance smell when visible in the source.","metadata":{"category":"javascript","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/dom-performance"}},"isInternal":false,"tokens":491,"sizeBytes":2517},{"name":"rule.md","path":"skills/dom-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dom-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":1017,"sizeBytes":4755},{"name":"SKILL.md","path":"skills/dom-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/dom-size/SKILL.md","title":"dom-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdom-size%2FSKILL.md -->","frontmatter":{"name":"dom-size","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Reduce DOM size and complexity. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/dom-size"}},"isInternal":false,"tokens":318,"sizeBytes":1560},{"name":"rule.md","path":"skills/draggable-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/draggable-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdraggable-accessibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":2718,"sizeBytes":10752},{"name":"SKILL.md","path":"skills/draggable-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/draggable-accessibility/SKILL.md","title":"draggable-accessibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fdraggable-accessibility%2FSKILL.md -->","frontmatter":{"name":"draggable-accessibility","description":"Use when reviewing templates, rendered HTML, or shared components related to Make drag and drop accessible. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"advanced","estimatedTime":"35","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/draggable-accessibility"}},"isInternal":false,"tokens":332,"sizeBytes":1695},{"name":"rule.md","path":"skills/duplicate-description/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/duplicate-description/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-description%2Freferences%2Frule.md -->","isInternal":false,"tokens":872,"sizeBytes":4291},{"name":"SKILL.md","path":"skills/duplicate-description/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/duplicate-description/SKILL.md","title":"duplicate-description","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-description%2FSKILL.md -->","frontmatter":{"name":"duplicate-description","description":"Use when auditing a site's meta tag uniqueness, generating page-specific meta descriptions, or reviewing CMS templates that inject the same description globally.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/duplicate-description"}},"isInternal":false,"tokens":551,"sizeBytes":2784},{"name":"rule.md","path":"skills/duplicate-id-active/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/duplicate-id-active/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-active%2Freferences%2Frule.md -->","isInternal":false,"tokens":604,"sizeBytes":2988},{"name":"SKILL.md","path":"skills/duplicate-id-active/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/duplicate-id-active/SKILL.md","title":"duplicate-id-active","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-active%2FSKILL.md -->","frontmatter":{"name":"duplicate-id-active","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use unique IDs for active elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/duplicate-id-active"}},"isInternal":false,"tokens":336,"sizeBytes":1760},{"name":"rule.md","path":"skills/duplicate-id-aria/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/duplicate-id-aria/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-aria%2Freferences%2Frule.md -->","isInternal":false,"tokens":641,"sizeBytes":3073},{"name":"SKILL.md","path":"skills/duplicate-id-aria/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/duplicate-id-aria/SKILL.md","title":"duplicate-id-aria","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-id-aria%2FSKILL.md -->","frontmatter":{"name":"duplicate-id-aria","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use unique IDs for ARIA references. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/duplicate-id-aria"}},"isInternal":false,"tokens":349,"sizeBytes":1802},{"name":"rule.md","path":"skills/duplicate-js/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/duplicate-js/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-js%2Freferences%2Frule.md -->","isInternal":false,"tokens":818,"sizeBytes":3875},{"name":"SKILL.md","path":"skills/duplicate-js/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/duplicate-js/SKILL.md","title":"duplicate-js","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fduplicate-js%2FSKILL.md -->","frontmatter":{"name":"duplicate-js","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Remove duplicate JavaScript libraries. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/duplicate-js"}},"isInternal":false,"tokens":318,"sizeBytes":1692},{"name":"rule.md","path":"skills/e2e-testing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/e2e-testing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fe2e-testing%2Freferences%2Frule.md -->","isInternal":false,"tokens":1159,"sizeBytes":5112},{"name":"SKILL.md","path":"skills/e2e-testing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/e2e-testing/SKILL.md","title":"e2e-testing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fe2e-testing%2FSKILL.md -->","frontmatter":{"name":"e2e-testing","description":"Use when reviewing CI coverage, automated checks, or test strategy related to Implement end-to-end testing. Focus on whether the rule is continuously verified, not just documented.","metadata":{"category":"testing","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/e2e-testing"}},"isInternal":false,"tokens":326,"sizeBytes":1591},{"name":"rule.md","path":"skills/editorial-policy/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/editorial-policy/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Feditorial-policy%2Freferences%2Frule.md -->","isInternal":false,"tokens":1077,"sizeBytes":4911},{"name":"SKILL.md","path":"skills/editorial-policy/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/editorial-policy/SKILL.md","title":"editorial-policy","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Feditorial-policy%2FSKILL.md -->","frontmatter":{"name":"editorial-policy","description":"Use when auditing a blog, news site, or YMYL content site for trust signals, drafting editorial policy page content, or evaluating whether a site meets Google's quality rater trustworthiness criteria.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/editorial-policy"}},"isInternal":false,"tokens":622,"sizeBytes":3057},{"name":"rule.md","path":"skills/element-hiding/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/element-hiding/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Felement-hiding%2Freferences%2Frule.md -->","isInternal":false,"tokens":1258,"sizeBytes":5779},{"name":"SKILL.md","path":"skills/element-hiding/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/element-hiding/SKILL.md","title":"element-hiding","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Felement-hiding%2FSKILL.md -->","frontmatter":{"name":"element-hiding","description":"Use when reviewing a website for layout and functionality issues caused by adblocker filter rules targeting common ad-related class names and IDs.","metadata":{"category":"security","priority":"low","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/element-hiding"}},"isInternal":false,"tokens":509,"sizeBytes":2387},{"name":"rule.md","path":"skills/embedded-or-inline-css/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/embedded-or-inline-css/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fembedded-or-inline-css%2Freferences%2Frule.md -->","isInternal":false,"tokens":4463,"sizeBytes":16430},{"name":"SKILL.md","path":"skills/embedded-or-inline-css/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/embedded-or-inline-css/SKILL.md","title":"embedded-or-inline-css","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fembedded-or-inline-css%2FSKILL.md -->","frontmatter":{"name":"embedded-or-inline-css","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Avoid embedded and inline CSS. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/embedded-or-inline-css"}},"isInternal":false,"tokens":342,"sizeBytes":1737},{"name":"rule.md","path":"skills/empty-heading/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/empty-heading/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-heading%2Freferences%2Frule.md -->","isInternal":false,"tokens":612,"sizeBytes":2869},{"name":"SKILL.md","path":"skills/empty-heading/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/empty-heading/SKILL.md","title":"empty-heading","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-heading%2FSKILL.md -->","frontmatter":{"name":"empty-heading","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure headings contain text. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/empty-heading"}},"isInternal":false,"tokens":332,"sizeBytes":1701},{"name":"rule.md","path":"skills/empty-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/empty-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":868,"sizeBytes":3545},{"name":"SKILL.md","path":"skills/empty-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/empty-links/SKILL.md","title":"empty-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fempty-links%2FSKILL.md -->","frontmatter":{"name":"empty-links","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Fix empty and broken links. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/empty-links"}},"isInternal":false,"tokens":402,"sizeBytes":2035},{"name":"rule.md","path":"skills/error-handling/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/error-handling/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-handling%2Freferences%2Frule.md -->","isInternal":false,"tokens":1011,"sizeBytes":4505},{"name":"SKILL.md","path":"skills/error-handling/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/error-handling/SKILL.md","title":"error-handling","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-handling%2FSKILL.md -->","frontmatter":{"name":"error-handling","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Implement proper error handling. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/error-handling"}},"isInternal":false,"tokens":321,"sizeBytes":1664},{"name":"rule.md","path":"skills/error-images/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/error-images/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-images%2Freferences%2Frule.md -->","isInternal":false,"tokens":1116,"sizeBytes":4411},{"name":"SKILL.md","path":"skills/error-images/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/error-images/SKILL.md","title":"error-images","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-images%2FSKILL.md -->","frontmatter":{"name":"error-images","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Handle image loading errors gracefully. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"low","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/error-images"}},"isInternal":false,"tokens":304,"sizeBytes":1583},{"name":"rule.md","path":"skills/error-monitoring/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/error-monitoring/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-monitoring%2Freferences%2Frule.md -->","isInternal":false,"tokens":1820,"sizeBytes":8126},{"name":"SKILL.md","path":"skills/error-monitoring/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/error-monitoring/SKILL.md","title":"error-monitoring","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ferror-monitoring%2FSKILL.md -->","frontmatter":{"name":"error-monitoring","description":"Use when setting up a new project's production observability stack, reviewing incident response readiness, or investigating why errors are going undetected.","metadata":{"category":"testing","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/error-monitoring"}},"isInternal":false,"tokens":428,"sizeBytes":2226},{"name":"rule.md","path":"skills/es-modules/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/es-modules/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fes-modules%2Freferences%2Frule.md -->","isInternal":false,"tokens":648,"sizeBytes":3124},{"name":"SKILL.md","path":"skills/es-modules/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/es-modules/SKILL.md","title":"es-modules","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fes-modules%2FSKILL.md -->","frontmatter":{"name":"es-modules","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Use ES modules (import/export). Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/es-modules"}},"isInternal":false,"tokens":389,"sizeBytes":1928},{"name":"rule.md","path":"skills/event-delegation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/event-delegation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fevent-delegation%2Freferences%2Frule.md -->","isInternal":false,"tokens":823,"sizeBytes":3798},{"name":"SKILL.md","path":"skills/event-delegation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/event-delegation/SKILL.md","title":"event-delegation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fevent-delegation%2FSKILL.md -->","frontmatter":{"name":"event-delegation","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Use event delegation for dynamic content. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/event-delegation"}},"isInternal":false,"tokens":381,"sizeBytes":2001},{"name":"rule.md","path":"skills/external-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/external-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fexternal-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":803,"sizeBytes":3781},{"name":"SKILL.md","path":"skills/external-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/external-links/SKILL.md","title":"external-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fexternal-links%2FSKILL.md -->","frontmatter":{"name":"external-links","description":"Use when auditing content pages for citation quality, suggesting authoritative sources to link for factual claims, or reviewing whether a page's external link attributes (nofollow, noopener) are correctly set.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/external-links"}},"isInternal":false,"tokens":638,"sizeBytes":3096},{"name":"rule.md","path":"skills/faq/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/faq/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffaq%2Freferences%2Frule.md -->","isInternal":false,"tokens":1055,"sizeBytes":4655},{"name":"SKILL.md","path":"skills/faq/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/faq/SKILL.md","title":"faq","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffaq%2FSKILL.md -->","frontmatter":{"name":"faq","description":"Use when adding FAQ sections to landing pages or blog posts, generating FAQPage JSON-LD from existing Q&A content, or validating that structured data on pages with FAQ sections is syntactically and semantically correct.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/faq"}},"isInternal":false,"tokens":727,"sizeBytes":3095},{"name":"rule.md","path":"skills/favicon/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/favicon/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicon%2Freferences%2Frule.md -->","isInternal":false,"tokens":823,"sizeBytes":3631},{"name":"SKILL.md","path":"skills/favicon/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/favicon/SKILL.md","title":"favicon","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicon%2FSKILL.md -->","frontmatter":{"name":"favicon","description":"Use when checking whether a site has a correctly configured favicon, auditing `<link rel='icon'>` tags in the `<head>`, or setting up favicon infrastructure for a new project.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/favicon"}},"isInternal":false,"tokens":692,"sizeBytes":2932},{"name":"rule.md","path":"skills/favicons/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/favicons/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicons%2Freferences%2Frule.md -->","isInternal":false,"tokens":5521,"sizeBytes":21548},{"name":"SKILL.md","path":"skills/favicons/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/favicons/SKILL.md","title":"favicons","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffavicons%2FSKILL.md -->","frontmatter":{"name":"favicons","description":"Use when reviewing templates, rendered HTML, or shared components related to Implement favicons for all devices. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/favicons"}},"isInternal":false,"tokens":344,"sizeBytes":1705},{"name":"rule.md","path":"skills/fetchpriority-attribute/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/fetchpriority-attribute/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffetchpriority-attribute%2Freferences%2Frule.md -->","isInternal":false,"tokens":1418,"sizeBytes":6112},{"name":"SKILL.md","path":"skills/fetchpriority-attribute/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/fetchpriority-attribute/SKILL.md","title":"fetchpriority-attribute","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffetchpriority-attribute%2FSKILL.md -->","frontmatter":{"name":"fetchpriority-attribute","description":"Use when optimising Largest Contentful Paint (LCP), reducing render-blocking resource contention, or fine-tuning resource loading order in the critical rendering path.","metadata":{"category":"performance","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/fetchpriority-attribute"}},"isInternal":false,"tokens":453,"sizeBytes":2143},{"name":"rule.md","path":"skills/figure-figcaption/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/figure-figcaption/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffigure-figcaption%2Freferences%2Frule.md -->","isInternal":false,"tokens":1167,"sizeBytes":4980},{"name":"SKILL.md","path":"skills/figure-figcaption/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/figure-figcaption/SKILL.md","title":"figure-figcaption","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffigure-figcaption%2FSKILL.md -->","frontmatter":{"name":"figure-figcaption","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use <figure> and <figcaption> for image captions. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/figure-figcaption"}},"isInternal":false,"tokens":711,"sizeBytes":3270},{"name":"rule.md","path":"skills/file-upload-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/file-upload-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffile-upload-accessibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":1960,"sizeBytes":7627},{"name":"SKILL.md","path":"skills/file-upload-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/file-upload-accessibility/SKILL.md","title":"file-upload-accessibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffile-upload-accessibility%2FSKILL.md -->","frontmatter":{"name":"file-upload-accessibility","description":"Use when reviewing templates, rendered HTML, or shared components related to Make file uploads accessible. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/file-upload-accessibility"}},"isInternal":false,"tokens":312,"sizeBytes":1669},{"name":"rule.md","path":"skills/filename-quality/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/filename-quality/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffilename-quality%2Freferences%2Frule.md -->","isInternal":false,"tokens":1286,"sizeBytes":5274},{"name":"SKILL.md","path":"skills/filename-quality/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/filename-quality/SKILL.md","title":"filename-quality","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffilename-quality%2FSKILL.md -->","frontmatter":{"name":"filename-quality","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use descriptive image filenames. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/filename-quality"}},"isInternal":false,"tokens":672,"sizeBytes":3199},{"name":"SKILL.md","path":"skills/find-npm-packages/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/find-npm-packages/SKILL.md","title":"find-npm-packages","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffind-npm-packages%2FSKILL.md -->","frontmatter":{"name":"find-npm-packages","description":"Use when you need to find the 2-3 most popular and well-maintained npm packages relevant to a frontend checklist rule, validate they meet quality thresholds, and add them to the rule's frontmatter.","metadata":{"version":"1.0.0","category":"content","tags":"npm,packages,rules,frontmatter"}},"isInternal":false,"tokens":945,"sizeBytes":3986},{"name":"rule.md","path":"skills/first-contentful-paint/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/first-contentful-paint/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffirst-contentful-paint%2Freferences%2Frule.md -->","isInternal":false,"tokens":1191,"sizeBytes":4796},{"name":"SKILL.md","path":"skills/first-contentful-paint/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/first-contentful-paint/SKILL.md","title":"first-contentful-paint","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffirst-contentful-paint%2FSKILL.md -->","frontmatter":{"name":"first-contentful-paint","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Optimize first contentful paint. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/first-contentful-paint"}},"isInternal":false,"tokens":363,"sizeBytes":1709},{"name":"rule.md","path":"skills/flashing-content/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/flashing-content/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflashing-content%2Freferences%2Frule.md -->","isInternal":false,"tokens":1474,"sizeBytes":6122},{"name":"SKILL.md","path":"skills/flashing-content/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/flashing-content/SKILL.md","title":"flashing-content","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflashing-content%2FSKILL.md -->","frontmatter":{"name":"flashing-content","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Prevent seizure-triggering flashing content. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"critical","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/flashing-content"}},"isInternal":false,"tokens":418,"sizeBytes":2122},{"name":"rule.md","path":"skills/flexbox-patterns/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/flexbox-patterns/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflexbox-patterns%2Freferences%2Frule.md -->","isInternal":false,"tokens":899,"sizeBytes":3503},{"name":"SKILL.md","path":"skills/flexbox-patterns/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/flexbox-patterns/SKILL.md","title":"flexbox-patterns","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fflexbox-patterns%2FSKILL.md -->","frontmatter":{"name":"flexbox-patterns","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Apply Flexbox best practices. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/flexbox-patterns"}},"isInternal":false,"tokens":419,"sizeBytes":1916},{"name":"rule.md","path":"skills/focus-management/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/focus-management/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-management%2Freferences%2Frule.md -->","isInternal":false,"tokens":947,"sizeBytes":4264},{"name":"SKILL.md","path":"skills/focus-management/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/focus-management/SKILL.md","title":"focus-management","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-management%2FSKILL.md -->","frontmatter":{"name":"focus-management","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Manage focus during dynamic interactions. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/focus-management"}},"isInternal":false,"tokens":348,"sizeBytes":1859},{"name":"rule.md","path":"skills/focus-not-obscured/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/focus-not-obscured/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-not-obscured%2Freferences%2Frule.md -->","isInternal":false,"tokens":755,"sizeBytes":3387},{"name":"SKILL.md","path":"skills/focus-not-obscured/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/focus-not-obscured/SKILL.md","title":"focus-not-obscured","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-not-obscured%2FSKILL.md -->","frontmatter":{"name":"focus-not-obscured","description":"Use when reviewing sticky navigation, consent banners, chat widgets, skip links, or any fixed-position UI. Validate the actual tab order and viewport behavior at realistic zoom levels.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/focus-not-obscured"}},"isInternal":false,"tokens":402,"sizeBytes":1959},{"name":"rule.md","path":"skills/focus-order/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/focus-order/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-order%2Freferences%2Frule.md -->","isInternal":false,"tokens":1036,"sizeBytes":4420},{"name":"SKILL.md","path":"skills/focus-order/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/focus-order/SKILL.md","title":"focus-order","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-order%2FSKILL.md -->","frontmatter":{"name":"focus-order","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure logical focus order. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/focus-order"}},"isInternal":false,"tokens":406,"sizeBytes":2082},{"name":"rule.md","path":"skills/focus-styles/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/focus-styles/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-styles%2Freferences%2Frule.md -->","isInternal":false,"tokens":812,"sizeBytes":3413},{"name":"SKILL.md","path":"skills/focus-styles/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/focus-styles/SKILL.md","title":"focus-styles","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffocus-styles%2FSKILL.md -->","frontmatter":{"name":"focus-styles","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Provide visible custom focus indicators. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/focus-styles"}},"isInternal":false,"tokens":517,"sizeBytes":2553},{"name":"rule.md","path":"skills/font-loading/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/font-loading/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-loading%2Freferences%2Frule.md -->","isInternal":false,"tokens":877,"sizeBytes":3991},{"name":"SKILL.md","path":"skills/font-loading/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/font-loading/SKILL.md","title":"font-loading","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-loading%2FSKILL.md -->","frontmatter":{"name":"font-loading","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Optimize web font loading. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/font-loading"}},"isInternal":false,"tokens":333,"sizeBytes":1597},{"name":"rule.md","path":"skills/font-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/font-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":691,"sizeBytes":2601},{"name":"SKILL.md","path":"skills/font-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/font-size/SKILL.md","title":"font-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffont-size%2FSKILL.md -->","frontmatter":{"name":"font-size","description":"Use when applies to all CSS `font-size` declarations, particularly those using `px` units for body text, UI labels, and navigation. Use when auditing mobile responsiveness and accessibility compliance. Check for `font-size` in media queries targeting small screens.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/font-size"}},"isInternal":false,"tokens":870,"sizeBytes":3593},{"name":"rule.md","path":"skills/form-captcha/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-captcha/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-captcha%2Freferences%2Frule.md -->","isInternal":false,"tokens":1591,"sizeBytes":6954},{"name":"SKILL.md","path":"skills/form-captcha/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-captcha/SKILL.md","title":"form-captcha","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-captcha%2FSKILL.md -->","frontmatter":{"name":"form-captcha","description":"Use when reviewing public HTML forms (no authentication required to reach them) for bot and abuse protection mechanisms.","metadata":{"category":"security","priority":"medium","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/form-captcha"}},"isInternal":false,"tokens":485,"sizeBytes":2406},{"name":"rule.md","path":"skills/form-field-multiple-labels/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-field-multiple-labels/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-field-multiple-labels%2Freferences%2Frule.md -->","isInternal":false,"tokens":624,"sizeBytes":2966},{"name":"SKILL.md","path":"skills/form-field-multiple-labels/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-field-multiple-labels/SKILL.md","title":"form-field-multiple-labels","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-field-multiple-labels%2FSKILL.md -->","frontmatter":{"name":"form-field-multiple-labels","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use a single label for each form field. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/form-field-multiple-labels"}},"isInternal":false,"tokens":358,"sizeBytes":1799},{"name":"rule.md","path":"skills/form-https/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-https/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-https%2Freferences%2Frule.md -->","isInternal":false,"tokens":1091,"sizeBytes":4788},{"name":"SKILL.md","path":"skills/form-https/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-https/SKILL.md","title":"form-https","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-https%2FSKILL.md -->","frontmatter":{"name":"form-https","description":"Use when reviewing HTML forms, fetch/XHR calls, and form action attributes to ensure data is submitted exclusively over HTTPS.","metadata":{"category":"security","priority":"critical","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/form-https"}},"isInternal":false,"tokens":458,"sizeBytes":2213},{"name":"rule.md","path":"skills/form-labels/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-labels/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-labels%2Freferences%2Frule.md -->","isInternal":false,"tokens":759,"sizeBytes":3585},{"name":"SKILL.md","path":"skills/form-labels/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-labels/SKILL.md","title":"form-labels","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-labels%2FSKILL.md -->","frontmatter":{"name":"form-labels","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Associate labels with form controls. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"critical","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/form-labels"}},"isInternal":false,"tokens":452,"sizeBytes":2259},{"name":"rule.md","path":"skills/form-validation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-validation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-validation%2Freferences%2Frule.md -->","isInternal":false,"tokens":2388,"sizeBytes":9214},{"name":"SKILL.md","path":"skills/form-validation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/form-validation/SKILL.md","title":"form-validation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fform-validation%2FSKILL.md -->","frontmatter":{"name":"form-validation","description":"Use when reviewing templates, rendered HTML, or shared components related to Validate forms accessibly. Validate the final browser-facing markup, not just the source framework abstraction. Distinguish between browser-posted forms and client-handled React forms so you do not over-report missing `method` or `action` as accessibility defects.","metadata":{"category":"html","priority":"high","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/form-validation"}},"isInternal":false,"tokens":480,"sizeBytes":2529},{"name":"rule.md","path":"skills/frame-title/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/frame-title/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fframe-title%2Freferences%2Frule.md -->","isInternal":false,"tokens":651,"sizeBytes":3134},{"name":"SKILL.md","path":"skills/frame-title/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/frame-title/SKILL.md","title":"frame-title","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fframe-title%2FSKILL.md -->","frontmatter":{"name":"frame-title","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide titles for iframes and frames. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/frame-title"}},"isInternal":false,"tokens":343,"sizeBytes":1749},{"name":"rule.md","path":"skills/freshness/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/freshness/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffreshness%2Freferences%2Frule.md -->","isInternal":false,"tokens":1046,"sizeBytes":4567},{"name":"SKILL.md","path":"skills/freshness/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/freshness/SKILL.md","title":"freshness","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffreshness%2FSKILL.md -->","frontmatter":{"name":"freshness","description":"Use when auditing content pages for freshness signals, setting up HTTP Last-Modified headers in a web server config, or ensuring Article JSON-LD dateModified is updated when CMS content changes.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/freshness"}},"isInternal":false,"tokens":666,"sizeBytes":2969},{"name":"categories.md","path":"skills/frontend-checklist-global/references/categories.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/frontend-checklist-global/references/categories.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffrontend-checklist-global%2Freferences%2Fcategories.md -->","isInternal":false,"tokens":1865,"sizeBytes":8606},{"name":"SKILL.md","path":"skills/frontend-checklist-global/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/frontend-checklist-global/SKILL.md","title":"frontend-checklist-global","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ffrontend-checklist-global%2FSKILL.md -->","frontmatter":{"name":"frontend-checklist-global","description":"Use when auditing or improving any frontend codebase against the full Front-End Checklist rule corpus through one entry point.","metadata":{"category":"global","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/mcp"}},"isInternal":false,"tokens":2644,"sizeBytes":12706},{"name":"rule.md","path":"skills/geo-meta/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/geo-meta/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgeo-meta%2Freferences%2Frule.md -->","isInternal":false,"tokens":1104,"sizeBytes":4968},{"name":"SKILL.md","path":"skills/geo-meta/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/geo-meta/SKILL.md","title":"geo-meta","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgeo-meta%2FSKILL.md -->","frontmatter":{"name":"geo-meta","description":"Use when auditing locally-focused or regionally-targeted pages for geo targeting signals, particularly on sites targeting audiences through Bing or regional search engines. Note that these meta tags have no documented effect on Google's ranking.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/geo-meta"}},"isInternal":false,"tokens":726,"sizeBytes":3049},{"name":"rule.md","path":"skills/gtm-present/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/gtm-present/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgtm-present%2Freferences%2Frule.md -->","isInternal":false,"tokens":950,"sizeBytes":4280},{"name":"SKILL.md","path":"skills/gtm-present/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/gtm-present/SKILL.md","title":"gtm-present","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fgtm-present%2FSKILL.md -->","frontmatter":{"name":"gtm-present","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Optimize Google Tag Manager implementation. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/gtm-present"}},"isInternal":false,"tokens":331,"sizeBytes":1636},{"name":"rule.md","path":"skills/h1/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/h1/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fh1%2Freferences%2Frule.md -->","isInternal":false,"tokens":1057,"sizeBytes":4628},{"name":"SKILL.md","path":"skills/h1/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/h1/SKILL.md","title":"h1","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fh1%2FSKILL.md -->","frontmatter":{"name":"h1","description":"Use when auditing a page's heading structure, generating H1 text for landing pages or blog posts, or reviewing a CMS template that may produce empty or missing H1 elements.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/h1"}},"isInternal":false,"tokens":699,"sizeBytes":2939},{"name":"rule.md","path":"skills/has-selector/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/has-selector/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhas-selector%2Freferences%2Frule.md -->","isInternal":false,"tokens":1425,"sizeBytes":5877},{"name":"SKILL.md","path":"skills/has-selector/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/has-selector/SKILL.md","title":"has-selector","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhas-selector%2FSKILL.md -->","frontmatter":{"name":"has-selector","description":"Use when reviewing stylesheets or components that use JavaScript to toggle classes on parent elements based on child state, form input values, or content presence — :has() may replace the JavaScript entirely.","metadata":{"category":"css","priority":"low","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/has-selector"}},"isInternal":false,"tokens":450,"sizeBytes":2194},{"name":"rule.md","path":"skills/heading-hierarchy/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/heading-hierarchy/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-hierarchy%2Freferences%2Frule.md -->","isInternal":false,"tokens":869,"sizeBytes":3609},{"name":"SKILL.md","path":"skills/heading-hierarchy/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/heading-hierarchy/SKILL.md","title":"heading-hierarchy","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-hierarchy%2FSKILL.md -->","frontmatter":{"name":"heading-hierarchy","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use logical heading hierarchy. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"critical","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/heading-hierarchy"}},"isInternal":false,"tokens":415,"sizeBytes":2078},{"name":"rule.md","path":"skills/heading-order/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/heading-order/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-order%2Freferences%2Frule.md -->","isInternal":false,"tokens":601,"sizeBytes":2781},{"name":"SKILL.md","path":"skills/heading-order/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/heading-order/SKILL.md","title":"heading-order","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fheading-order%2FSKILL.md -->","frontmatter":{"name":"heading-order","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Maintain logical heading order. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/heading-order"}},"isInternal":false,"tokens":377,"sizeBytes":1807},{"name":"rule.md","path":"skills/horizontal-scroll/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/horizontal-scroll/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhorizontal-scroll%2Freferences%2Frule.md -->","isInternal":false,"tokens":601,"sizeBytes":2625},{"name":"SKILL.md","path":"skills/horizontal-scroll/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/horizontal-scroll/SKILL.md","title":"horizontal-scroll","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhorizontal-scroll%2FSKILL.md -->","frontmatter":{"name":"horizontal-scroll","description":"Use when applies to all CSS layout rules. Check `width`, `min-width`, fixed pixel values on containers, `overflow`, `white-space`, and `word-break` properties. Use when auditing responsive design or WCAG 2.1 Level AA compliance. Test at 320px viewport width and at 400% browser zoom.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/horizontal-scroll"}},"isInternal":false,"tokens":882,"sizeBytes":3631},{"name":"rule.md","path":"skills/hreflang/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/hreflang/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhreflang%2Freferences%2Frule.md -->","isInternal":false,"tokens":1311,"sizeBytes":5085},{"name":"SKILL.md","path":"skills/hreflang/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/hreflang/SKILL.md","title":"hreflang","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhreflang%2FSKILL.md -->","frontmatter":{"name":"hreflang","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Add hreflang tags for multilingual sites. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"i18n","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/i18n/hreflang"}},"isInternal":false,"tokens":351,"sizeBytes":1721},{"name":"rule.md","path":"skills/hsts/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/hsts/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhsts%2Freferences%2Frule.md -->","isInternal":false,"tokens":1248,"sizeBytes":5534},{"name":"SKILL.md","path":"skills/hsts/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/hsts/SKILL.md","title":"hsts","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhsts%2FSKILL.md -->","frontmatter":{"name":"hsts","description":"Use when reviewing HTTP response headers on any site that serves content over HTTPS.","metadata":{"category":"security","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/hsts"}},"isInternal":false,"tokens":429,"sizeBytes":1986},{"name":"rule.md","path":"skills/html-resource-hints/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/html-resource-hints/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-resource-hints%2Freferences%2Frule.md -->","isInternal":false,"tokens":979,"sizeBytes":4234},{"name":"SKILL.md","path":"skills/html-resource-hints/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/html-resource-hints/SKILL.md","title":"html-resource-hints","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-resource-hints%2FSKILL.md -->","frontmatter":{"name":"html-resource-hints","description":"Use when reviewing templates, rendered HTML, or shared components related to Add resource hints (preload, prefetch, dns-prefetch). Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/en/rules/html/html-resource-hints"}},"isInternal":false,"tokens":433,"sizeBytes":2109},{"name":"rule.md","path":"skills/html-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/html-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":867,"sizeBytes":3604},{"name":"SKILL.md","path":"skills/html-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/html-size/SKILL.md","title":"html-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-size%2FSKILL.md -->","frontmatter":{"name":"html-size","description":"Use when auditing page weight for crawl efficiency, investigating why certain page content is not appearing in Google's index, or reviewing server-rendered pages that embed large JSON payloads in HTML.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/html-size"}},"isInternal":false,"tokens":717,"sizeBytes":3148},{"name":"rule.md","path":"skills/html-xml-lang-mismatch/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/html-xml-lang-mismatch/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-xml-lang-mismatch%2Freferences%2Frule.md -->","isInternal":false,"tokens":809,"sizeBytes":3660},{"name":"SKILL.md","path":"skills/html-xml-lang-mismatch/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/html-xml-lang-mismatch/SKILL.md","title":"html-xml-lang-mismatch","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml-xml-lang-mismatch%2FSKILL.md -->","frontmatter":{"name":"html-xml-lang-mismatch","description":"Use when applies to XHTML documents and polyglot HTML documents that must parse correctly as both HTML5 and XML. For modern HTML5-only documents, only `lang` is needed and `xml:lang` is not required. Check when auditing documents served as application/xhtml+xml or documents that include both attributes.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/html-xml-lang-mismatch"}},"isInternal":false,"tokens":735,"sizeBytes":3202},{"name":"rule.md","path":"skills/html5-semantic-elements/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/html5-semantic-elements/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml5-semantic-elements%2Freferences%2Frule.md -->","isInternal":false,"tokens":3290,"sizeBytes":13142},{"name":"SKILL.md","path":"skills/html5-semantic-elements/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/html5-semantic-elements/SKILL.md","title":"html5-semantic-elements","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhtml5-semantic-elements%2FSKILL.md -->","frontmatter":{"name":"html5-semantic-elements","description":"Use when reviewing templates, rendered HTML, or shared components related to Use semantic HTML elements. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/html5-semantic-elements"}},"isInternal":false,"tokens":367,"sizeBytes":1796},{"name":"rule.md","path":"skills/http-requests/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/http-requests/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-requests%2Freferences%2Frule.md -->","isInternal":false,"tokens":1147,"sizeBytes":4405},{"name":"SKILL.md","path":"skills/http-requests/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/http-requests/SKILL.md","title":"http-requests","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-requests%2FSKILL.md -->","frontmatter":{"name":"http-requests","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Minimize HTTP requests. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/http-requests"}},"isInternal":false,"tokens":339,"sizeBytes":1660},{"name":"rule.md","path":"skills/http-to-https/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/http-to-https/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-to-https%2Freferences%2Frule.md -->","isInternal":false,"tokens":919,"sizeBytes":4306},{"name":"SKILL.md","path":"skills/http-to-https/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/http-to-https/SKILL.md","title":"http-to-https","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp-to-https%2FSKILL.md -->","frontmatter":{"name":"http-to-https","description":"Use when checking whether a web server is configured to redirect all HTTP traffic to HTTPS.","metadata":{"category":"security","priority":"critical","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/http-to-https"}},"isInternal":false,"tokens":430,"sizeBytes":2047},{"name":"rule.md","path":"skills/http2/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/http2/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp2%2Freferences%2Frule.md -->","isInternal":false,"tokens":931,"sizeBytes":4168},{"name":"SKILL.md","path":"skills/http2/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/http2/SKILL.md","title":"http2","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttp2%2FSKILL.md -->","frontmatter":{"name":"http2","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Enable HTTP/2 or HTTP/3. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/http2"}},"isInternal":false,"tokens":353,"sizeBytes":1579},{"name":"rule.md","path":"skills/https-downgrade/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/https-downgrade/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps-downgrade%2Freferences%2Frule.md -->","isInternal":false,"tokens":1006,"sizeBytes":4622},{"name":"SKILL.md","path":"skills/https-downgrade/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/https-downgrade/SKILL.md","title":"https-downgrade","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps-downgrade%2FSKILL.md -->","frontmatter":{"name":"https-downgrade","description":"Use when auditing a site's internal and external links for protocol consistency, migrating a site from HTTP to HTTPS, or reviewing hardcoded URLs in a codebase that may use `http://` instead of `https://`.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/https-downgrade"}},"isInternal":false,"tokens":724,"sizeBytes":3226},{"name":"rule.md","path":"skills/https/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/https/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps%2Freferences%2Frule.md -->","isInternal":false,"tokens":1146,"sizeBytes":5301},{"name":"SKILL.md","path":"skills/https/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/https/SKILL.md","title":"https","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhttps%2FSKILL.md -->","frontmatter":{"name":"https","description":"Use when auditing whether a website or web application serves content exclusively over HTTPS with a valid certificate.","metadata":{"category":"security","priority":"critical","difficulty":"beginner","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/https"}},"isInternal":false,"tokens":434,"sizeBytes":2054},{"name":"rule.md","path":"skills/hyphens/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/hyphens/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhyphens%2Freferences%2Frule.md -->","isInternal":false,"tokens":849,"sizeBytes":3609},{"name":"SKILL.md","path":"skills/hyphens/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/hyphens/SKILL.md","title":"hyphens","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fhyphens%2FSKILL.md -->","frontmatter":{"name":"hyphens","description":"Use when auditing URL structures for word separator format, generating slugs from titles, or planning a URL migration from underscores or spaces to hyphens with appropriate redirects.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/hyphens"}},"isInternal":false,"tokens":670,"sizeBytes":2882},{"name":"rule.md","path":"skills/identical-links-same-purpose/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/identical-links-same-purpose/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fidentical-links-same-purpose%2Freferences%2Frule.md -->","isInternal":false,"tokens":666,"sizeBytes":3110},{"name":"SKILL.md","path":"skills/identical-links-same-purpose/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/identical-links-same-purpose/SKILL.md","title":"identical-links-same-purpose","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fidentical-links-same-purpose%2FSKILL.md -->","frontmatter":{"name":"identical-links-same-purpose","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure identical links have consistent destinations. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/identical-links-same-purpose"}},"isInternal":false,"tokens":361,"sizeBytes":1887},{"name":"rule.md","path":"skills/image-cdn/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-cdn/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-cdn%2Freferences%2Frule.md -->","isInternal":false,"tokens":1192,"sizeBytes":4614},{"name":"SKILL.md","path":"skills/image-cdn/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-cdn/SKILL.md","title":"image-cdn","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-cdn%2FSKILL.md -->","frontmatter":{"name":"image-cdn","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Serve images from a CDN. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/image-cdn"}},"isInternal":false,"tokens":334,"sizeBytes":1579},{"name":"rule.md","path":"skills/image-compression/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-compression/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-compression%2Freferences%2Frule.md -->","isInternal":false,"tokens":1309,"sizeBytes":5370},{"name":"SKILL.md","path":"skills/image-compression/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-compression/SKILL.md","title":"image-compression","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-compression%2FSKILL.md -->","frontmatter":{"name":"image-compression","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Compress images without quality loss. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/image-compression"}},"isInternal":false,"tokens":336,"sizeBytes":1620},{"name":"rule.md","path":"skills/image-file-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-file-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-file-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":1402,"sizeBytes":5297},{"name":"SKILL.md","path":"skills/image-file-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-file-size/SKILL.md","title":"image-file-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-file-size%2FSKILL.md -->","frontmatter":{"name":"image-file-size","description":"Use when auditing the image pipeline, static assets in `public/`, CMS-managed media, or image CDN transforms. Separate file-size problems from dimension mismatches so you can tell whether the issue is compression, format choice, or responsive delivery.","metadata":{"category":"images","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/image-file-size"}},"isInternal":false,"tokens":739,"sizeBytes":3169},{"name":"rule.md","path":"skills/image-optimization/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-optimization/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-optimization%2Freferences%2Frule.md -->","isInternal":false,"tokens":2278,"sizeBytes":8659},{"name":"SKILL.md","path":"skills/image-optimization/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-optimization/SKILL.md","title":"image-optimization","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-optimization%2FSKILL.md -->","frontmatter":{"name":"image-optimization","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Optimize all images for web. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/image-optimization"}},"isInternal":false,"tokens":641,"sizeBytes":2860},{"name":"rule.md","path":"skills/image-redundant-alt/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-redundant-alt/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-redundant-alt%2Freferences%2Frule.md -->","isInternal":false,"tokens":599,"sizeBytes":2769},{"name":"SKILL.md","path":"skills/image-redundant-alt/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/image-redundant-alt/SKILL.md","title":"image-redundant-alt","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimage-redundant-alt%2FSKILL.md -->","frontmatter":{"name":"image-redundant-alt","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid redundant image alternative text. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"low","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/image-redundant-alt"}},"isInternal":false,"tokens":355,"sizeBytes":1786},{"name":"rule.md","path":"skills/immutable-patterns/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/immutable-patterns/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimmutable-patterns%2Freferences%2Frule.md -->","isInternal":false,"tokens":880,"sizeBytes":3787},{"name":"SKILL.md","path":"skills/immutable-patterns/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/immutable-patterns/SKILL.md","title":"immutable-patterns","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimmutable-patterns%2FSKILL.md -->","frontmatter":{"name":"immutable-patterns","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Prefer immutable data patterns. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/immutable-patterns"}},"isInternal":false,"tokens":397,"sizeBytes":2022},{"name":"rule.md","path":"skills/import-on-interaction/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/import-on-interaction/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-interaction%2Freferences%2Frule.md -->","isInternal":false,"tokens":712,"sizeBytes":3459},{"name":"SKILL.md","path":"skills/import-on-interaction/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/import-on-interaction/SKILL.md","title":"import-on-interaction","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-interaction%2FSKILL.md -->","frontmatter":{"name":"import-on-interaction","description":"Use when reviewing slow initial loads caused by optional features. Prioritize code that is expensive to download or execute and not required for the first viewport, first input, or core task completion.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/import-on-interaction"}},"isInternal":false,"tokens":434,"sizeBytes":2147},{"name":"rule.md","path":"skills/import-on-visibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/import-on-visibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-visibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":786,"sizeBytes":3709},{"name":"SKILL.md","path":"skills/import-on-visibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/import-on-visibility/SKILL.md","title":"import-on-visibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimport-on-visibility%2FSKILL.md -->","frontmatter":{"name":"import-on-visibility","description":"Use when reviewing long pages, dashboards, or content feeds with expensive offscreen modules. Balance early enough loading for smooth scrolling against keeping the initial route light.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/import-on-visibility"}},"isInternal":false,"tokens":411,"sizeBytes":2128},{"name":"scoring-rubric.md","path":"skills/improve-rule/references/scoring-rubric.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/improve-rule/references/scoring-rubric.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimprove-rule%2Freferences%2Fscoring-rubric.md -->","isInternal":false,"tokens":976,"sizeBytes":3573},{"name":"SKILL.md","path":"skills/improve-rule/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/improve-rule/SKILL.md","title":"improve-rule","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fimprove-rule%2FSKILL.md -->","frontmatter":{"name":"improve-rule","description":"Use when reviewing or improving a Front-End Checklist rule MDX file to raise its quality score, fix stub prompts, add missing fields, or enrich content with real code examples.","metadata":{"category":"meta","source":"frontendchecklist.io","url":"https://frontendchecklist.io"}},"isInternal":false,"tokens":1283,"sizeBytes":5286},{"name":"rule.md","path":"skills/inclusive-language/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/inclusive-language/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finclusive-language%2Freferences%2Frule.md -->","isInternal":false,"tokens":1324,"sizeBytes":5688},{"name":"SKILL.md","path":"skills/inclusive-language/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/inclusive-language/SKILL.md","title":"inclusive-language","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finclusive-language%2FSKILL.md -->","frontmatter":{"name":"inclusive-language","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use inclusive language. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/inclusive-language"}},"isInternal":false,"tokens":398,"sizeBytes":2080},{"name":"rule.md","path":"skills/indexability-conflicts/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/indexability-conflicts/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability-conflicts%2Freferences%2Frule.md -->","isInternal":false,"tokens":1097,"sizeBytes":4931},{"name":"SKILL.md","path":"skills/indexability-conflicts/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/indexability-conflicts/SKILL.md","title":"indexability-conflicts","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability-conflicts%2FSKILL.md -->","frontmatter":{"name":"indexability-conflicts","description":"Use when auditing a site for indexability issues, investigating why pages appear in Google's index that should be excluded (or vice versa), or reviewing robots.txt and meta robots configurations for consistency.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/indexability-conflicts"}},"isInternal":false,"tokens":777,"sizeBytes":3512},{"name":"rule.md","path":"skills/indexability/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/indexability/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability%2Freferences%2Frule.md -->","isInternal":false,"tokens":966,"sizeBytes":4247},{"name":"SKILL.md","path":"skills/indexability/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/indexability/SKILL.md","title":"indexability","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Findexability%2FSKILL.md -->","frontmatter":{"name":"indexability","description":"Use when auditing a site for accidental noindex directives, investigating why important pages are not appearing in Google Search, or reviewing CMS settings that control indexing at the page or category level.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/indexability"}},"isInternal":false,"tokens":731,"sizeBytes":3265},{"name":"rule.md","path":"skills/input-image-alt/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/input-image-alt/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-image-alt%2Freferences%2Frule.md -->","isInternal":false,"tokens":572,"sizeBytes":2643},{"name":"SKILL.md","path":"skills/input-image-alt/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/input-image-alt/SKILL.md","title":"input-image-alt","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-image-alt%2FSKILL.md -->","frontmatter":{"name":"input-image-alt","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide alt text for image buttons. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"critical","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/input-image-alt"}},"isInternal":false,"tokens":360,"sizeBytes":1737},{"name":"rule.md","path":"skills/input-types/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/input-types/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-types%2Freferences%2Frule.md -->","isInternal":false,"tokens":1026,"sizeBytes":4676},{"name":"SKILL.md","path":"skills/input-types/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/input-types/SKILL.md","title":"input-types","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finput-types%2FSKILL.md -->","frontmatter":{"name":"input-types","description":"Use when reviewing templates, rendered HTML, or shared components related to Use semantic input type attributes. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/input-types"}},"isInternal":false,"tokens":376,"sizeBytes":1946},{"name":"rule.md","path":"skills/integration-testing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/integration-testing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fintegration-testing%2Freferences%2Frule.md -->","isInternal":false,"tokens":852,"sizeBytes":3991},{"name":"SKILL.md","path":"skills/integration-testing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/integration-testing/SKILL.md","title":"integration-testing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fintegration-testing%2FSKILL.md -->","frontmatter":{"name":"integration-testing","description":"Use when reviewing CI coverage, automated checks, or test strategy related to Write integration tests for key workflows. Focus on whether the rule is continuously verified, not just documented.","metadata":{"category":"testing","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/integration-testing"}},"isInternal":false,"tokens":385,"sizeBytes":2057},{"name":"rule.md","path":"skills/interaction-to-next-paint/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/interaction-to-next-paint/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finteraction-to-next-paint%2Freferences%2Frule.md -->","isInternal":false,"tokens":1397,"sizeBytes":5839},{"name":"SKILL.md","path":"skills/interaction-to-next-paint/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/interaction-to-next-paint/SKILL.md","title":"interaction-to-next-paint","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finteraction-to-next-paint%2FSKILL.md -->","frontmatter":{"name":"interaction-to-next-paint","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Optimize interaction to next paint. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"advanced","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/interaction-to-next-paint"}},"isInternal":false,"tokens":362,"sizeBytes":1768},{"name":"rule.md","path":"skills/internal-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/internal-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finternal-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":1127,"sizeBytes":5107},{"name":"SKILL.md","path":"skills/internal-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/internal-links/SKILL.md","title":"internal-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finternal-links%2FSKILL.md -->","frontmatter":{"name":"internal-links","description":"Use when auditing a site's internal link structure, identifying pages that need more incoming links, generating contextual linking opportunities between related content, or reviewing a CMS template's internal linking patterns.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/internal-links"}},"isInternal":false,"tokens":628,"sizeBytes":3090},{"name":"rule.md","path":"skills/interstitials/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/interstitials/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finterstitials%2Freferences%2Frule.md -->","isInternal":false,"tokens":808,"sizeBytes":3435},{"name":"SKILL.md","path":"skills/interstitials/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/interstitials/SKILL.md","title":"interstitials","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finterstitials%2FSKILL.md -->","frontmatter":{"name":"interstitials","description":"Use when applies to CSS and JavaScript implementations of modals, overlays, pop-ups, cookie banners, newsletter sign-up dialogs, and promotional overlays. Check for `position: fixed`, `position: absolute` with large z-index, backdrop overlays, and JavaScript that shows modals on page load or shortly after. Consider both SEO impact (Google) and accessibility (WCAG focus management).","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/interstitials"}},"isInternal":false,"tokens":935,"sizeBytes":4267},{"name":"rule.md","path":"skills/invalid-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/invalid-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finvalid-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":954,"sizeBytes":4210},{"name":"SKILL.md","path":"skills/invalid-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/invalid-links/SKILL.md","title":"invalid-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Finvalid-links%2FSKILL.md -->","frontmatter":{"name":"invalid-links","description":"Use when auditing a page's link elements for crawlability, reviewing JavaScript-heavy SPAs where navigation may not use `<a href>` tags, or checking that dynamically generated links have valid href values.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/invalid-links"}},"isInternal":false,"tokens":752,"sizeBytes":3233},{"name":"rule.md","path":"skills/javascript-inline/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/javascript-inline/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-inline%2Freferences%2Frule.md -->","isInternal":false,"tokens":6422,"sizeBytes":29482},{"name":"SKILL.md","path":"skills/javascript-inline/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/javascript-inline/SKILL.md","title":"javascript-inline","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-inline%2FSKILL.md -->","frontmatter":{"name":"javascript-inline","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Avoid inline JavaScript. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/javascript-inline"}},"isInternal":false,"tokens":342,"sizeBytes":1842},{"name":"rule.md","path":"skills/javascript-linter/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/javascript-linter/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-linter%2Freferences%2Frule.md -->","isInternal":false,"tokens":7453,"sizeBytes":30306},{"name":"SKILL.md","path":"skills/javascript-linter/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/javascript-linter/SKILL.md","title":"javascript-linter","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-linter%2FSKILL.md -->","frontmatter":{"name":"javascript-linter","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Lint JavaScript code. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"medium","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/javascript-linter"}},"isInternal":false,"tokens":355,"sizeBytes":1783},{"name":"rule.md","path":"skills/javascript-minification/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/javascript-minification/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-minification%2Freferences%2Frule.md -->","isInternal":false,"tokens":4390,"sizeBytes":19363},{"name":"SKILL.md","path":"skills/javascript-minification/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/javascript-minification/SKILL.md","title":"javascript-minification","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjavascript-minification%2FSKILL.md -->","frontmatter":{"name":"javascript-minification","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Minify all JavaScript files. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/javascript-minification"}},"isInternal":false,"tokens":363,"sizeBytes":1821},{"name":"rule.md","path":"skills/js-file-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/js-file-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-file-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":530,"sizeBytes":2365},{"name":"SKILL.md","path":"skills/js-file-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/js-file-size/SKILL.md","title":"js-file-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-file-size%2FSKILL.md -->","frontmatter":{"name":"js-file-size","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Optimize JavaScript bundle size. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/js-file-size"}},"isInternal":false,"tokens":340,"sizeBytes":1629},{"name":"rule.md","path":"skills/js-libraries/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/js-libraries/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-libraries%2Freferences%2Frule.md -->","isInternal":false,"tokens":584,"sizeBytes":2622},{"name":"SKILL.md","path":"skills/js-libraries/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/js-libraries/SKILL.md","title":"js-libraries","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-libraries%2FSKILL.md -->","frontmatter":{"name":"js-libraries","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Use secure and up-to-date JS libraries. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/js-libraries"}},"isInternal":false,"tokens":327,"sizeBytes":1691},{"name":"rule.md","path":"skills/js-redirects/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/js-redirects/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-redirects%2Freferences%2Frule.md -->","isInternal":false,"tokens":708,"sizeBytes":3298},{"name":"SKILL.md","path":"skills/js-redirects/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/js-redirects/SKILL.md","title":"js-redirects","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjs-redirects%2FSKILL.md -->","frontmatter":{"name":"js-redirects","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Avoid JavaScript-based redirects. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/js-redirects"}},"isInternal":false,"tokens":336,"sizeBytes":1707},{"name":"rule.md","path":"skills/json-ld-valid/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/json-ld-valid/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-ld-valid%2Freferences%2Frule.md -->","isInternal":false,"tokens":1212,"sizeBytes":5215},{"name":"SKILL.md","path":"skills/json-ld-valid/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/json-ld-valid/SKILL.md","title":"json-ld-valid","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-ld-valid%2FSKILL.md -->","frontmatter":{"name":"json-ld-valid","description":"Use when generating or auditing any `<script type='application/ld+json'>` blocks, implementing structured data for articles, products, FAQs, breadcrumbs, or local businesses, or investigating why rich results are not appearing in Google Search Console.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/json-ld-valid"}},"isInternal":false,"tokens":743,"sizeBytes":3321},{"name":"rule.md","path":"skills/json-safety/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/json-safety/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-safety%2Freferences%2Frule.md -->","isInternal":false,"tokens":911,"sizeBytes":4080},{"name":"SKILL.md","path":"skills/json-safety/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/json-safety/SKILL.md","title":"json-safety","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fjson-safety%2FSKILL.md -->","frontmatter":{"name":"json-safety","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Parse JSON safely with error handling. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/json-safety"}},"isInternal":false,"tokens":413,"sizeBytes":2047},{"name":"rule.md","path":"skills/keyboard-navigation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/keyboard-navigation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyboard-navigation%2Freferences%2Frule.md -->","isInternal":false,"tokens":810,"sizeBytes":3799},{"name":"SKILL.md","path":"skills/keyboard-navigation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/keyboard-navigation/SKILL.md","title":"keyboard-navigation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyboard-navigation%2FSKILL.md -->","frontmatter":{"name":"keyboard-navigation","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Enable keyboard navigation for all elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"critical","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/keyboard-navigation"}},"isInternal":false,"tokens":425,"sizeBytes":2270},{"name":"rule.md","path":"skills/keyword-stuffing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/keyword-stuffing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyword-stuffing%2Freferences%2Frule.md -->","isInternal":false,"tokens":872,"sizeBytes":4250},{"name":"SKILL.md","path":"skills/keyword-stuffing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/keyword-stuffing/SKILL.md","title":"keyword-stuffing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fkeyword-stuffing%2FSKILL.md -->","frontmatter":{"name":"keyword-stuffing","description":"Use when auditing content pages for over-optimisation, reviewing AI-generated content that may repeat target phrases excessively, or checking meta tags and alt text for unnatural keyword accumulation.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/keyword-stuffing"}},"isInternal":false,"tokens":749,"sizeBytes":3595},{"name":"rule.md","path":"skills/label-content-name-mismatch/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/label-content-name-mismatch/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flabel-content-name-mismatch%2Freferences%2Frule.md -->","isInternal":false,"tokens":545,"sizeBytes":2701},{"name":"SKILL.md","path":"skills/label-content-name-mismatch/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/label-content-name-mismatch/SKILL.md","title":"label-content-name-mismatch","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flabel-content-name-mismatch%2FSKILL.md -->","frontmatter":{"name":"label-content-name-mismatch","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Align visible labels with accessible names. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/label-content-name-mismatch"}},"isInternal":false,"tokens":373,"sizeBytes":1935},{"name":"rule.md","path":"skills/landmark-one-main/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/landmark-one-main/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-one-main%2Freferences%2Frule.md -->","isInternal":false,"tokens":607,"sizeBytes":2774},{"name":"SKILL.md","path":"skills/landmark-one-main/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/landmark-one-main/SKILL.md","title":"landmark-one-main","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-one-main%2FSKILL.md -->","frontmatter":{"name":"landmark-one-main","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use exactly one main landmark. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/landmark-one-main"}},"isInternal":false,"tokens":356,"sizeBytes":1768},{"name":"rule.md","path":"skills/landmark-regions/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/landmark-regions/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-regions%2Freferences%2Frule.md -->","isInternal":false,"tokens":515,"sizeBytes":2493},{"name":"SKILL.md","path":"skills/landmark-regions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/landmark-regions/SKILL.md","title":"landmark-regions","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flandmark-regions%2FSKILL.md -->","frontmatter":{"name":"landmark-regions","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use landmark regions correctly. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/landmark-regions"}},"isInternal":false,"tokens":357,"sizeBytes":1795},{"name":"rule.md","path":"skills/lang-attribute/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/lang-attribute/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flang-attribute%2Freferences%2Frule.md -->","isInternal":false,"tokens":999,"sizeBytes":4131},{"name":"SKILL.md","path":"skills/lang-attribute/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/lang-attribute/SKILL.md","title":"lang-attribute","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flang-attribute%2FSKILL.md -->","frontmatter":{"name":"lang-attribute","description":"Use when applies to all HTML documents. Check the `<html>` opening tag for a `lang` attribute with a non-empty, valid BCP 47 language code. Also check for `lang` attribute changes on individual elements when the document contains content in multiple languages (inline quotes, foreign terms, multilingual sections). The `lang` attribute is inherited — child elements inherit the language from their nearest ancestor with `lang`.","metadata":{"category":"html","priority":"high","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/lang-attribute"}},"isInternal":false,"tokens":938,"sizeBytes":3991},{"name":"rule.md","path":"skills/largest-contentful-paint/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/largest-contentful-paint/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flargest-contentful-paint%2Freferences%2Frule.md -->","isInternal":false,"tokens":973,"sizeBytes":4220},{"name":"SKILL.md","path":"skills/largest-contentful-paint/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/largest-contentful-paint/SKILL.md","title":"largest-contentful-paint","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flargest-contentful-paint%2FSKILL.md -->","frontmatter":{"name":"largest-contentful-paint","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Optimize largest contentful paint. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"critical","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/largest-contentful-paint"}},"isInternal":false,"tokens":362,"sizeBytes":1765},{"name":"rule.md","path":"skills/lazy-above-fold/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/lazy-above-fold/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-above-fold%2Freferences%2Frule.md -->","isInternal":false,"tokens":711,"sizeBytes":3250},{"name":"SKILL.md","path":"skills/lazy-above-fold/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/lazy-above-fold/SKILL.md","title":"lazy-above-fold","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-above-fold%2FSKILL.md -->","frontmatter":{"name":"lazy-above-fold","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Disable lazy loading for above-the-fold content. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/lazy-above-fold"}},"isInternal":false,"tokens":360,"sizeBytes":1739},{"name":"rule.md","path":"skills/lazy-loading/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/lazy-loading/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-loading%2Freferences%2Frule.md -->","isInternal":false,"tokens":962,"sizeBytes":4529},{"name":"SKILL.md","path":"skills/lazy-loading/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/lazy-loading/SKILL.md","title":"lazy-loading","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flazy-loading%2FSKILL.md -->","frontmatter":{"name":"lazy-loading","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Implement lazy loading for offscreen content. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes. Absence of `loading='lazy'` is not enough by itself when fold position is unknown.","metadata":{"category":"performance","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/lazy-loading"}},"isInternal":false,"tokens":398,"sizeBytes":1952},{"name":"rule.md","path":"skills/leaked-secrets/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/leaked-secrets/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fleaked-secrets%2Freferences%2Frule.md -->","isInternal":false,"tokens":1381,"sizeBytes":5859},{"name":"SKILL.md","path":"skills/leaked-secrets/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/leaked-secrets/SKILL.md","title":"leaked-secrets","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fleaked-secrets%2FSKILL.md -->","frontmatter":{"name":"leaked-secrets","description":"Use when reviewing client-side JavaScript, HTML source, or git history for exposed credentials, API keys, or tokens.","metadata":{"category":"security","priority":"critical","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/leaked-secrets"}},"isInternal":false,"tokens":490,"sizeBytes":2392},{"name":"rule.md","path":"skills/legacy-js/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/legacy-js/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flegacy-js%2Freferences%2Frule.md -->","isInternal":false,"tokens":739,"sizeBytes":3479},{"name":"SKILL.md","path":"skills/legacy-js/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/legacy-js/SKILL.md","title":"legacy-js","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flegacy-js%2FSKILL.md -->","frontmatter":{"name":"legacy-js","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Avoid serving legacy JavaScript to modern browsers. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/legacy-js"}},"isInternal":false,"tokens":354,"sizeBytes":1777},{"name":"rule.md","path":"skills/length/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/length/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flength%2Freferences%2Frule.md -->","isInternal":false,"tokens":932,"sizeBytes":4129},{"name":"SKILL.md","path":"skills/length/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/length/SKILL.md","title":"length","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flength%2FSKILL.md -->","frontmatter":{"name":"length","description":"Use when generating URL slugs from article titles, auditing URL structures for unnecessary depth or length, or reviewing URL patterns in a CMS or router configuration.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/length"}},"isInternal":false,"tokens":696,"sizeBytes":3062},{"name":"rule.md","path":"skills/link-checker/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/link-checker/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-checker%2Freferences%2Frule.md -->","isInternal":false,"tokens":6114,"sizeBytes":25528},{"name":"SKILL.md","path":"skills/link-checker/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/link-checker/SKILL.md","title":"link-checker","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-checker%2FSKILL.md -->","frontmatter":{"name":"link-checker","description":"Use when reviewing templates, rendered HTML, or shared components related to Check for broken links. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/link-checker"}},"isInternal":false,"tokens":335,"sizeBytes":1634},{"name":"rule.md","path":"skills/link-in-text-block/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/link-in-text-block/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-in-text-block%2Freferences%2Frule.md -->","isInternal":false,"tokens":824,"sizeBytes":3679},{"name":"SKILL.md","path":"skills/link-in-text-block/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/link-in-text-block/SKILL.md","title":"link-in-text-block","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-in-text-block%2FSKILL.md -->","frontmatter":{"name":"link-in-text-block","description":"Use when applies to hyperlinks (`<a>` elements) that appear inline within paragraphs or text blocks. Does not apply to navigation menus, button-style links, or standalone links that are visually isolated from body text. Use when reviewing CSS that removes text-decoration from inline body copy links.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/link-in-text-block"}},"isInternal":false,"tokens":774,"sizeBytes":3680},{"name":"rule.md","path":"skills/link-text/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/link-text/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-text%2Freferences%2Frule.md -->","isInternal":false,"tokens":827,"sizeBytes":3669},{"name":"SKILL.md","path":"skills/link-text/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/link-text/SKILL.md","title":"link-text","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flink-text%2FSKILL.md -->","frontmatter":{"name":"link-text","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use descriptive link text. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/link-text"}},"isInternal":false,"tokens":419,"sizeBytes":2136},{"name":"rule.md","path":"skills/list-structure/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/list-structure/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-structure%2Freferences%2Frule.md -->","isInternal":false,"tokens":609,"sizeBytes":2849},{"name":"SKILL.md","path":"skills/list-structure/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/list-structure/SKILL.md","title":"list-structure","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-structure%2FSKILL.md -->","frontmatter":{"name":"list-structure","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use correct list structure. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/list-structure"}},"isInternal":false,"tokens":361,"sizeBytes":1752},{"name":"rule.md","path":"skills/list-virtualization/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/list-virtualization/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-virtualization%2Freferences%2Frule.md -->","isInternal":false,"tokens":665,"sizeBytes":3214},{"name":"SKILL.md","path":"skills/list-virtualization/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/list-virtualization/SKILL.md","title":"list-virtualization","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flist-virtualization%2FSKILL.md -->","frontmatter":{"name":"list-virtualization","description":"Use when reviewing dashboards, admin tables, search results, or feeds with many repeated items. Confirm the bottleneck is DOM or rendering cost before introducing virtualization because small lists usually do not need the added complexity.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/list-virtualization"}},"isInternal":false,"tokens":427,"sizeBytes":2210},{"name":"rule.md","path":"skills/listitem/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/listitem/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flistitem%2Freferences%2Frule.md -->","isInternal":false,"tokens":799,"sizeBytes":3495},{"name":"SKILL.md","path":"skills/listitem/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/listitem/SKILL.md","title":"listitem","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flistitem%2FSKILL.md -->","frontmatter":{"name":"listitem","description":"Use when applies to HTML documents with `<li>` elements. Also applies to custom ARIA lists where `role='listitem'` must be owned by `role='list'`. Common violations occur in templating systems where list markup is split across components or in CSS resets where developers use `<li>` for layout without proper list parents.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/listitem"}},"isInternal":false,"tokens":761,"sizeBytes":3279},{"name":"rule.md","path":"skills/llm-parsability/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/llm-parsability/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllm-parsability%2Freferences%2Frule.md -->","isInternal":false,"tokens":1300,"sizeBytes":5558},{"name":"SKILL.md","path":"skills/llm-parsability/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/llm-parsability/SKILL.md","title":"llm-parsability","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllm-parsability%2FSKILL.md -->","frontmatter":{"name":"llm-parsability","description":"Use when auditing content pages for AI discoverability. Applies to any informational page intended to appear in AI-generated answers, search snippets, or knowledge base extraction.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/llm-parsability"}},"isInternal":false,"tokens":593,"sizeBytes":2758},{"name":"rule.md","path":"skills/llms-txt/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/llms-txt/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllms-txt%2Freferences%2Frule.md -->","isInternal":false,"tokens":1351,"sizeBytes":6218},{"name":"SKILL.md","path":"skills/llms-txt/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/llms-txt/SKILL.md","title":"llms-txt","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fllms-txt%2FSKILL.md -->","frontmatter":{"name":"llms-txt","description":"Use when auditing public documentation portals, API references, help centers, SDK docs, or large knowledge bases. Check the final file served at `/llms.txt` and verify that the linked pages are stable, high-value, and accessible without relying on a JavaScript-only interface.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/llms-txt"}},"isInternal":false,"tokens":590,"sizeBytes":2607},{"name":"rule.md","path":"skills/loading-indicators/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/loading-indicators/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Floading-indicators%2Freferences%2Frule.md -->","isInternal":false,"tokens":1503,"sizeBytes":5562},{"name":"SKILL.md","path":"skills/loading-indicators/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/loading-indicators/SKILL.md","title":"loading-indicators","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Floading-indicators%2FSKILL.md -->","frontmatter":{"name":"loading-indicators","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Show loading indicators. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/loading-indicators"}},"isInternal":false,"tokens":329,"sizeBytes":1736},{"name":"rule.md","path":"skills/local-business/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/local-business/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocal-business%2Freferences%2Frule.md -->","isInternal":false,"tokens":1235,"sizeBytes":5046},{"name":"SKILL.md","path":"skills/local-business/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/local-business/SKILL.md","title":"local-business","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocal-business%2FSKILL.md -->","frontmatter":{"name":"local-business","description":"Use when auditing a local business website's structured data. Applies to any business that serves customers at a physical location or specific geographic area.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/local-business"}},"isInternal":false,"tokens":491,"sizeBytes":2353},{"name":"rule.md","path":"skills/locale-images/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/locale-images/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocale-images%2Freferences%2Frule.md -->","isInternal":false,"tokens":2116,"sizeBytes":9439},{"name":"SKILL.md","path":"skills/locale-images/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/locale-images/SKILL.md","title":"locale-images","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flocale-images%2FSKILL.md -->","frontmatter":{"name":"locale-images","description":"Use when reviewing image assets, icon libraries, or components that render illustrations to identify culture-specific content that may need locale overrides or replacement with neutral alternatives.","metadata":{"category":"i18n","priority":"low","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/i18n/locale-images"}},"isInternal":false,"tokens":408,"sizeBytes":2203},{"name":"rule.md","path":"skills/logical-properties/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/logical-properties/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flogical-properties%2Freferences%2Frule.md -->","isInternal":false,"tokens":919,"sizeBytes":3818},{"name":"SKILL.md","path":"skills/logical-properties/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/logical-properties/SKILL.md","title":"logical-properties","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flogical-properties%2FSKILL.md -->","frontmatter":{"name":"logical-properties","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use CSS logical properties for i18n and RTL support. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/logical-properties"}},"isInternal":false,"tokens":405,"sizeBytes":2106},{"name":"rule.md","path":"skills/lowercase/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/lowercase/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flowercase%2Freferences%2Frule.md -->","isInternal":false,"tokens":932,"sizeBytes":4120},{"name":"SKILL.md","path":"skills/lowercase/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/lowercase/SKILL.md","title":"lowercase","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Flowercase%2FSKILL.md -->","frontmatter":{"name":"lowercase","description":"Use when auditing URL structure or configuring a new site's routing. Applies to any server or framework that allows case-insensitive file systems (Linux servers are case-sensitive by default).","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/lowercase"}},"isInternal":false,"tokens":430,"sizeBytes":2160},{"name":"rule.md","path":"skills/memory-leaks/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/memory-leaks/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmemory-leaks%2Freferences%2Frule.md -->","isInternal":false,"tokens":1307,"sizeBytes":6084},{"name":"SKILL.md","path":"skills/memory-leaks/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/memory-leaks/SKILL.md","title":"memory-leaks","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmemory-leaks%2FSKILL.md -->","frontmatter":{"name":"memory-leaks","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Prevent common memory leak patterns. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"high","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/memory-leaks"}},"isInternal":false,"tokens":435,"sizeBytes":2243},{"name":"rule.md","path":"skills/meta-description/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/meta-description/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-description%2Freferences%2Frule.md -->","isInternal":false,"tokens":706,"sizeBytes":3211},{"name":"SKILL.md","path":"skills/meta-description/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/meta-description/SKILL.md","title":"meta-description","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-description%2FSKILL.md -->","frontmatter":{"name":"meta-description","description":"Use when auditing page metadata or generating descriptions for new pages. Applies to every page that should receive organic search traffic.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/meta-description"}},"isInternal":false,"tokens":430,"sizeBytes":2057},{"name":"rule.md","path":"skills/meta-in-body/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/meta-in-body/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-in-body%2Freferences%2Frule.md -->","isInternal":false,"tokens":863,"sizeBytes":3831},{"name":"SKILL.md","path":"skills/meta-in-body/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/meta-in-body/SKILL.md","title":"meta-in-body","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-in-body%2FSKILL.md -->","frontmatter":{"name":"meta-in-body","description":"Use when auditing HTML document structure. Applies to any page where meta tags (noindex, canonical-url, description, viewport, OG tags) may have been injected into the body by CMS plugins, widgets, or JavaScript rendering.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/meta-in-body"}},"isInternal":false,"tokens":478,"sizeBytes":2170},{"name":"rule.md","path":"skills/meta-refresh/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/meta-refresh/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-refresh%2Freferences%2Frule.md -->","isInternal":false,"tokens":527,"sizeBytes":2564},{"name":"SKILL.md","path":"skills/meta-refresh/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/meta-refresh/SKILL.md","title":"meta-refresh","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-refresh%2FSKILL.md -->","frontmatter":{"name":"meta-refresh","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid meta refresh redirects. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/meta-refresh"}},"isInternal":false,"tokens":336,"sizeBytes":1734},{"name":"rule.md","path":"skills/meta-title/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/meta-title/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-title%2Freferences%2Frule.md -->","isInternal":false,"tokens":738,"sizeBytes":3085},{"name":"SKILL.md","path":"skills/meta-title/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/meta-title/SKILL.md","title":"meta-title","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmeta-title%2FSKILL.md -->","frontmatter":{"name":"meta-title","description":"Use when auditing page metadata or generating SEO-optimized titles. Applies to every HTML page that should appear in search results.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/meta-title"}},"isInternal":false,"tokens":465,"sizeBytes":1981},{"name":"rule.md","path":"skills/mime-type/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mime-type/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmime-type%2Freferences%2Frule.md -->","isInternal":false,"tokens":965,"sizeBytes":4183},{"name":"SKILL.md","path":"skills/mime-type/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mime-type/SKILL.md","title":"mime-type","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmime-type%2FSKILL.md -->","frontmatter":{"name":"mime-type","description":"Use when auditing server configuration or diagnosing broken resources. Applies to any web server serving HTML, CSS, JS, images, fonts, or other static assets.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/mime-type"}},"isInternal":false,"tokens":471,"sizeBytes":2205},{"name":"rule.md","path":"skills/mixed-content/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mixed-content/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmixed-content%2Freferences%2Frule.md -->","isInternal":false,"tokens":1207,"sizeBytes":5365},{"name":"SKILL.md","path":"skills/mixed-content/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mixed-content/SKILL.md","title":"mixed-content","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmixed-content%2FSKILL.md -->","frontmatter":{"name":"mixed-content","description":"Use when reviewing an HTTPS page for resources (scripts, images, stylesheets, iframes) that are loaded over plain HTTP.","metadata":{"category":"security","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/mixed-content"}},"isInternal":false,"tokens":479,"sizeBytes":2317},{"name":"rule.md","path":"skills/mobile-testing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mobile-testing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmobile-testing%2Freferences%2Frule.md -->","isInternal":false,"tokens":1030,"sizeBytes":4415},{"name":"SKILL.md","path":"skills/mobile-testing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mobile-testing/SKILL.md","title":"mobile-testing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmobile-testing%2FSKILL.md -->","frontmatter":{"name":"mobile-testing","description":"Use when reviewing CI coverage, automated checks, or test strategy related to Test on real mobile devices and viewports. Focus on whether the rule is continuously verified, not just documented.","metadata":{"category":"testing","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/mobile-testing"}},"isInternal":false,"tokens":423,"sizeBytes":2068},{"name":"rule.md","path":"skills/mock-best-practices/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mock-best-practices/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmock-best-practices%2Freferences%2Frule.md -->","isInternal":false,"tokens":908,"sizeBytes":3989},{"name":"SKILL.md","path":"skills/mock-best-practices/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mock-best-practices/SKILL.md","title":"mock-best-practices","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmock-best-practices%2FSKILL.md -->","frontmatter":{"name":"mock-best-practices","description":"Use when reviewing CI coverage, automated checks, or test strategy related to Follow mocking best practices. Focus on whether the rule is continuously verified, not just documented.","metadata":{"category":"testing","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/mock-best-practices"}},"isInternal":false,"tokens":332,"sizeBytes":1701},{"name":"rule.md","path":"skills/modal-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/modal-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodal-accessibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":1137,"sizeBytes":5144},{"name":"SKILL.md","path":"skills/modal-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/modal-accessibility/SKILL.md","title":"modal-accessibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodal-accessibility%2FSKILL.md -->","frontmatter":{"name":"modal-accessibility","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Make modal dialogs keyboard accessible. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/modal-accessibility"}},"isInternal":false,"tokens":365,"sizeBytes":1888},{"name":"rule.md","path":"skills/modern-array-methods/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/modern-array-methods/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-array-methods%2Freferences%2Frule.md -->","isInternal":false,"tokens":962,"sizeBytes":3716},{"name":"SKILL.md","path":"skills/modern-array-methods/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/modern-array-methods/SKILL.md","title":"modern-array-methods","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-array-methods%2FSKILL.md -->","frontmatter":{"name":"modern-array-methods","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Use modern array and object methods. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/modern-array-methods"}},"isInternal":false,"tokens":395,"sizeBytes":1977},{"name":"rule.md","path":"skills/modern-format/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/modern-format/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-format%2Freferences%2Frule.md -->","isInternal":false,"tokens":1430,"sizeBytes":5421},{"name":"SKILL.md","path":"skills/modern-format/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/modern-format/SKILL.md","title":"modern-format","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmodern-format%2FSKILL.md -->","frontmatter":{"name":"modern-format","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use modern image formats (WebP, AVIF). Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/modern-format"}},"isInternal":false,"tokens":755,"sizeBytes":3120},{"name":"rule.md","path":"skills/mutation-testing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mutation-testing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmutation-testing%2Freferences%2Frule.md -->","isInternal":false,"tokens":1674,"sizeBytes":6813},{"name":"SKILL.md","path":"skills/mutation-testing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/mutation-testing/SKILL.md","title":"mutation-testing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fmutation-testing%2FSKILL.md -->","frontmatter":{"name":"mutation-testing","description":"Use when evaluating test quality on modules containing business logic, calculation utilities, or state machines to determine whether the tests provide genuine defect detection.","metadata":{"category":"testing","priority":"medium","difficulty":"advanced","estimatedTime":"120","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/mutation-testing"}},"isInternal":false,"tokens":395,"sizeBytes":2006},{"name":"rule.md","path":"skills/naming-conventions/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/naming-conventions/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnaming-conventions%2Freferences%2Frule.md -->","isInternal":false,"tokens":857,"sizeBytes":3633},{"name":"SKILL.md","path":"skills/naming-conventions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/naming-conventions/SKILL.md","title":"naming-conventions","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnaming-conventions%2FSKILL.md -->","frontmatter":{"name":"naming-conventions","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use consistent CSS naming conventions. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/naming-conventions"}},"isInternal":false,"tokens":388,"sizeBytes":1924},{"name":"rule.md","path":"skills/nap-consistency/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/nap-consistency/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnap-consistency%2Freferences%2Frule.md -->","isInternal":false,"tokens":990,"sizeBytes":4197},{"name":"SKILL.md","path":"skills/nap-consistency/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/nap-consistency/SKILL.md","title":"nap-consistency","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnap-consistency%2FSKILL.md -->","frontmatter":{"name":"nap-consistency","description":"Use when auditing a local business website for local SEO. Applies to any business that has a physical address and wants to appear in local search results or Google Maps.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/nap-consistency"}},"isInternal":false,"tokens":501,"sizeBytes":2452},{"name":"rule.md","path":"skills/navigation-landmark/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/navigation-landmark/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnavigation-landmark%2Freferences%2Frule.md -->","isInternal":false,"tokens":1951,"sizeBytes":7511},{"name":"SKILL.md","path":"skills/navigation-landmark/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/navigation-landmark/SKILL.md","title":"navigation-landmark","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnavigation-landmark%2FSKILL.md -->","frontmatter":{"name":"navigation-landmark","description":"Use when reviewing templates, rendered HTML, or shared components related to Use navigation landmark regions. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/navigation-landmark"}},"isInternal":false,"tokens":316,"sizeBytes":1668},{"name":"rule.md","path":"skills/new-tab/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/new-tab/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnew-tab%2Freferences%2Frule.md -->","isInternal":false,"tokens":1098,"sizeBytes":4748},{"name":"SKILL.md","path":"skills/new-tab/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/new-tab/SKILL.md","title":"new-tab","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnew-tab%2FSKILL.md -->","frontmatter":{"name":"new-tab","description":"Use when reviewing HTML or JSX for anchor elements with target='_blank' to verify rel='noopener noreferrer' is present.","metadata":{"category":"security","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/new-tab"}},"isInternal":false,"tokens":469,"sizeBytes":2174},{"name":"rule.md","path":"skills/no-explicit-any/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/no-explicit-any/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-explicit-any%2Freferences%2Frule.md -->","isInternal":false,"tokens":1633,"sizeBytes":7016},{"name":"SKILL.md","path":"skills/no-explicit-any/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/no-explicit-any/SKILL.md","title":"no-explicit-any","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-explicit-any%2FSKILL.md -->","frontmatter":{"name":"no-explicit-any","description":"Use when reviewing TypeScript files for type safety regressions, during code review of functions that handle external data, or when the codebase has ESLint warnings for @typescript-eslint/no-explicit-any.","metadata":{"category":"javascript","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/no-explicit-any"}},"isInternal":false,"tokens":454,"sizeBytes":2262},{"name":"rule.md","path":"skills/no-unchecked-indexed-access/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/no-unchecked-indexed-access/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-unchecked-indexed-access%2Freferences%2Frule.md -->","isInternal":false,"tokens":1507,"sizeBytes":6263},{"name":"SKILL.md","path":"skills/no-unchecked-indexed-access/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/no-unchecked-indexed-access/SKILL.md","title":"no-unchecked-indexed-access","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fno-unchecked-indexed-access%2FSKILL.md -->","frontmatter":{"name":"no-unchecked-indexed-access","description":"Use when auditing tsconfig.json for missing safety flags, reviewing code that uses array index access in data processing pipelines, or investigating runtime undefined errors that TypeScript did not catch.","metadata":{"category":"javascript","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/no-unchecked-indexed-access"}},"isInternal":false,"tokens":480,"sizeBytes":2333},{"name":"rule.md","path":"skills/nofollow-internal/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/nofollow-internal/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnofollow-internal%2Freferences%2Frule.md -->","isInternal":false,"tokens":974,"sizeBytes":4433},{"name":"SKILL.md","path":"skills/nofollow-internal/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/nofollow-internal/SKILL.md","title":"nofollow-internal","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnofollow-internal%2FSKILL.md -->","frontmatter":{"name":"nofollow-internal","description":"Use when auditing internal link structure or reviewing link attributes. Applies to any site using rel=nofollow on links pointing to pages within the same domain.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/nofollow-internal"}},"isInternal":false,"tokens":507,"sizeBytes":2321},{"name":"rule.md","path":"skills/noindex-in-sitemap/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/noindex-in-sitemap/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoindex-in-sitemap%2Freferences%2Frule.md -->","isInternal":false,"tokens":891,"sizeBytes":3757},{"name":"SKILL.md","path":"skills/noindex-in-sitemap/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/noindex-in-sitemap/SKILL.md","title":"noindex-in-sitemap","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoindex-in-sitemap%2FSKILL.md -->","frontmatter":{"name":"noindex-in-sitemap","description":"Use when auditing an XML sitemap or diagnosing indexing issues. Applies to any site where noindex meta tags or X-Robots-Tag headers may be applied to URLs also listed in the sitemap.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/noindex-in-sitemap"}},"isInternal":false,"tokens":534,"sizeBytes":2330},{"name":"rule.md","path":"skills/noscript-tag/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/noscript-tag/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoscript-tag%2Freferences%2Frule.md -->","isInternal":false,"tokens":4965,"sizeBytes":22512},{"name":"SKILL.md","path":"skills/noscript-tag/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/noscript-tag/SKILL.md","title":"noscript-tag","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnoscript-tag%2FSKILL.md -->","frontmatter":{"name":"noscript-tag","description":"Use when reviewing templates, rendered HTML, or shared components related to Provide noscript fallback content. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/noscript-tag"}},"isInternal":false,"tokens":413,"sizeBytes":2213},{"name":"rule.md","path":"skills/nosnippet/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/nosnippet/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnosnippet%2Freferences%2Frule.md -->","isInternal":false,"tokens":836,"sizeBytes":3987},{"name":"SKILL.md","path":"skills/nosnippet/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/nosnippet/SKILL.md","title":"nosnippet","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fnosnippet%2FSKILL.md -->","frontmatter":{"name":"nosnippet","description":"Use when auditing robots meta tags. Applies to any important landing page, article, or product page that should appear with a description in search results.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/nosnippet"}},"isInternal":false,"tokens":458,"sizeBytes":2124},{"name":"rule.md","path":"skills/object-alt/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/object-alt/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fobject-alt%2Freferences%2Frule.md -->","isInternal":false,"tokens":583,"sizeBytes":2839},{"name":"SKILL.md","path":"skills/object-alt/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/object-alt/SKILL.md","title":"object-alt","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fobject-alt%2FSKILL.md -->","frontmatter":{"name":"object-alt","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide alternative text for objects. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/object-alt"}},"isInternal":false,"tokens":327,"sizeBytes":1715},{"name":"rule.md","path":"skills/offline-fallback/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/offline-fallback/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffline-fallback%2Freferences%2Frule.md -->","isInternal":false,"tokens":1849,"sizeBytes":7665},{"name":"SKILL.md","path":"skills/offline-fallback/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/offline-fallback/SKILL.md","title":"offline-fallback","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffline-fallback%2FSKILL.md -->","frontmatter":{"name":"offline-fallback","description":"Use when adding PWA capabilities, implementing a service worker, or improving the experience for users on unreliable network connections.","metadata":{"category":"performance","priority":"low","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/offline-fallback"}},"isInternal":false,"tokens":375,"sizeBytes":1953},{"name":"rule.md","path":"skills/offscreen-lazy/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/offscreen-lazy/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffscreen-lazy%2Freferences%2Frule.md -->","isInternal":false,"tokens":1507,"sizeBytes":6202},{"name":"SKILL.md","path":"skills/offscreen-lazy/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/offscreen-lazy/SKILL.md","title":"offscreen-lazy","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foffscreen-lazy%2FSKILL.md -->","frontmatter":{"name":"offscreen-lazy","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Lazy load offscreen images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together. Missing `loading='lazy'` is only a valid finding when you can reasonably tell the image is offscreen or non-critical.","metadata":{"category":"images","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/offscreen-lazy"}},"isInternal":false,"tokens":730,"sizeBytes":3376},{"name":"rule.md","path":"skills/og-image-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/og-image-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-image-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":927,"sizeBytes":3773},{"name":"SKILL.md","path":"skills/og-image-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/og-image-size/SKILL.md","title":"og-image-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-image-size%2FSKILL.md -->","frontmatter":{"name":"og-image-size","description":"Use when auditing Open Graph tags or generating og:image assets. Applies to any page that may be shared on social networks or messaging platforms.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/og-image-size"}},"isInternal":false,"tokens":542,"sizeBytes":2299},{"name":"rule.md","path":"skills/og-tags/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/og-tags/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-tags%2Freferences%2Frule.md -->","isInternal":false,"tokens":937,"sizeBytes":4216},{"name":"SKILL.md","path":"skills/og-tags/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/og-tags/SKILL.md","title":"og-tags","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-tags%2FSKILL.md -->","frontmatter":{"name":"og-tags","description":"Use when auditing a web page's social sharing metadata. Applies to any page users might share on social networks or messaging apps.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/og-tags"}},"isInternal":false,"tokens":451,"sizeBytes":1987},{"name":"rule.md","path":"skills/og-url-match/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/og-url-match/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-url-match%2Freferences%2Frule.md -->","isInternal":false,"tokens":886,"sizeBytes":3928},{"name":"SKILL.md","path":"skills/og-url-match/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/og-url-match/SKILL.md","title":"og-url-match","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fog-url-match%2FSKILL.md -->","frontmatter":{"name":"og-url-match","description":"Use when auditing Open Graph tags or investigating why social share counts appear low. Applies to any page with both canonical-url and og:url tags.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/og-url-match"}},"isInternal":false,"tokens":461,"sizeBytes":2171},{"name":"rule.md","path":"skills/optimized/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/optimized/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foptimized%2Freferences%2Frule.md -->","isInternal":false,"tokens":1307,"sizeBytes":5271},{"name":"SKILL.md","path":"skills/optimized/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/optimized/SKILL.md","title":"optimized","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Foptimized%2FSKILL.md -->","frontmatter":{"name":"optimized","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Optimise images for faster loading. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/optimized"}},"isInternal":false,"tokens":733,"sizeBytes":3317},{"name":"rule.md","path":"skills/organization/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/organization/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forganization%2Freferences%2Frule.md -->","isInternal":false,"tokens":1104,"sizeBytes":4632},{"name":"SKILL.md","path":"skills/organization/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/organization/SKILL.md","title":"organization","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forganization%2FSKILL.md -->","frontmatter":{"name":"organization","description":"Use when auditing structured data on a business or brand website homepage. Applies to organisations, companies, non-profits, and publishers that want accurate Knowledge Panel information in Google Search.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/organization"}},"isInternal":false,"tokens":495,"sizeBytes":2440},{"name":"rule.md","path":"skills/orientation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/orientation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forientation%2Freferences%2Frule.md -->","isInternal":false,"tokens":993,"sizeBytes":4885},{"name":"SKILL.md","path":"skills/orientation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/orientation/SKILL.md","title":"orientation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forientation%2FSKILL.md -->","frontmatter":{"name":"orientation","description":"Use when reviewing mobile-first layouts, tablet experiences, fullscreen flows, forms, dashboards, or media interfaces. Check rendered behavior in both portrait and landscape and separate genuine layout constraints from unnecessary orientation assumptions.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/orientation"}},"isInternal":false,"tokens":454,"sizeBytes":2499},{"name":"rule.md","path":"skills/orphan-pages/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/orphan-pages/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forphan-pages%2Freferences%2Frule.md -->","isInternal":false,"tokens":949,"sizeBytes":4372},{"name":"SKILL.md","path":"skills/orphan-pages/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/orphan-pages/SKILL.md","title":"orphan-pages","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Forphan-pages%2FSKILL.md -->","frontmatter":{"name":"orphan-pages","description":"Use when auditing site architecture or investigating why specific pages have low organic traffic despite good content. Applies to any site with more than ~20 pages.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/orphan-pages"}},"isInternal":false,"tokens":495,"sizeBytes":2407},{"name":"rule.md","path":"skills/page-load-time/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/page-load-time/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-load-time%2Freferences%2Frule.md -->","isInternal":false,"tokens":1010,"sizeBytes":3941},{"name":"SKILL.md","path":"skills/page-load-time/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/page-load-time/SKILL.md","title":"page-load-time","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-load-time%2FSKILL.md -->","frontmatter":{"name":"page-load-time","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Keep page load time under 3 seconds. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/page-load-time"}},"isInternal":false,"tokens":364,"sizeBytes":1673},{"name":"rule.md","path":"skills/page-weight/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/page-weight/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-weight%2Freferences%2Frule.md -->","isInternal":false,"tokens":1372,"sizeBytes":4935},{"name":"SKILL.md","path":"skills/page-weight/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/page-weight/SKILL.md","title":"page-weight","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpage-weight%2FSKILL.md -->","frontmatter":{"name":"page-weight","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Keep page weight under 1500KB. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/page-weight"}},"isInternal":false,"tokens":371,"sizeBytes":1712},{"name":"rule.md","path":"skills/pagination-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pagination-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination-accessibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":2017,"sizeBytes":8205},{"name":"SKILL.md","path":"skills/pagination-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pagination-accessibility/SKILL.md","title":"pagination-accessibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination-accessibility%2FSKILL.md -->","frontmatter":{"name":"pagination-accessibility","description":"Use when reviewing templates, rendered HTML, or shared components related to Make pagination accessible. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/pagination-accessibility"}},"isInternal":false,"tokens":312,"sizeBytes":1619},{"name":"rule.md","path":"skills/pagination/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pagination/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination%2Freferences%2Frule.md -->","isInternal":false,"tokens":1172,"sizeBytes":5158},{"name":"SKILL.md","path":"skills/pagination/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pagination/SKILL.md","title":"pagination","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpagination%2FSKILL.md -->","frontmatter":{"name":"pagination","description":"Use when auditing paginated content (blog archives, product category pages, search results). Applies to any site with lists or grids of content split across multiple pages.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/pagination"}},"isInternal":false,"tokens":637,"sizeBytes":2801},{"name":"rule.md","path":"skills/parallax-effects/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/parallax-effects/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparallax-effects%2Freferences%2Frule.md -->","isInternal":false,"tokens":1118,"sizeBytes":4965},{"name":"SKILL.md","path":"skills/parallax-effects/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/parallax-effects/SKILL.md","title":"parallax-effects","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparallax-effects%2FSKILL.md -->","frontmatter":{"name":"parallax-effects","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide alternatives to parallax effects. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/parallax-effects"}},"isInternal":false,"tokens":406,"sizeBytes":2093},{"name":"rule.md","path":"skills/parameters/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/parameters/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparameters%2Freferences%2Frule.md -->","isInternal":false,"tokens":1025,"sizeBytes":4757},{"name":"SKILL.md","path":"skills/parameters/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/parameters/SKILL.md","title":"parameters","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fparameters%2FSKILL.md -->","frontmatter":{"name":"parameters","description":"Use when auditing URL structure or configuring search engine handling of filtered, sorted, or tracked URLs. Applies to e-commerce sites, filtered content directories, and any site appending tracking or session parameters.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/parameters"}},"isInternal":false,"tokens":519,"sizeBytes":2552},{"name":"rule.md","path":"skills/password-field-security/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/password-field-security/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpassword-field-security%2Freferences%2Frule.md -->","isInternal":false,"tokens":3392,"sizeBytes":11703},{"name":"SKILL.md","path":"skills/password-field-security/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/password-field-security/SKILL.md","title":"password-field-security","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpassword-field-security%2FSKILL.md -->","frontmatter":{"name":"password-field-security","description":"Use when reviewing headers, forms, cookies, or third-party integrations related to Secure password input fields. Validate the effective browser and HTTP behavior in a production-like environment.","metadata":{"category":"security","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/password-field-security"}},"isInternal":false,"tokens":333,"sizeBytes":1830},{"name":"rule.md","path":"skills/paste-inputs/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/paste-inputs/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpaste-inputs%2Freferences%2Frule.md -->","isInternal":false,"tokens":519,"sizeBytes":2642},{"name":"SKILL.md","path":"skills/paste-inputs/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/paste-inputs/SKILL.md","title":"paste-inputs","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpaste-inputs%2FSKILL.md -->","frontmatter":{"name":"paste-inputs","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Allow pasting into form inputs. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/paste-inputs"}},"isInternal":false,"tokens":361,"sizeBytes":1769},{"name":"rule.md","path":"skills/pdf-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pdf-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpdf-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":919,"sizeBytes":3901},{"name":"SKILL.md","path":"skills/pdf-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pdf-size/SKILL.md","title":"pdf-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpdf-size%2FSKILL.md -->","frontmatter":{"name":"pdf-size","description":"Use when auditing a site that publishes downloadable PDFs (reports, white papers, legal documents, manuals). Applies to any site where PDFs are linked as indexable content resources.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/pdf-size"}},"isInternal":false,"tokens":522,"sizeBytes":2388},{"name":"rule.md","path":"skills/performance-budget/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/performance-budget/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-budget%2Freferences%2Frule.md -->","isInternal":false,"tokens":1279,"sizeBytes":5126},{"name":"SKILL.md","path":"skills/performance-budget/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/performance-budget/SKILL.md","title":"performance-budget","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-budget%2FSKILL.md -->","frontmatter":{"name":"performance-budget","description":"Use when reviewing CI configuration, bundle analysis workflows, or pull requests that add dependencies and assets. Distinguish bundle-size budgets from runtime budgets such as Lighthouse or Core Web Vitals so teams can enforce both.","metadata":{"category":"testing","priority":"medium","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/performance-budget"}},"isInternal":false,"tokens":438,"sizeBytes":2188},{"name":"rule.md","path":"skills/performance-resource-hints/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/performance-resource-hints/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-resource-hints%2Freferences%2Frule.md -->","isInternal":false,"tokens":1529,"sizeBytes":6503},{"name":"SKILL.md","path":"skills/performance-resource-hints/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/performance-resource-hints/SKILL.md","title":"performance-resource-hints","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fperformance-resource-hints%2FSKILL.md -->","frontmatter":{"name":"performance-resource-hints","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Use resource hints for faster loading. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/en/rules/performance/performance-resource-hints"}},"isInternal":false,"tokens":360,"sizeBytes":1762},{"name":"rule.md","path":"skills/permissions-policy/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/permissions-policy/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpermissions-policy%2Freferences%2Frule.md -->","isInternal":false,"tokens":1390,"sizeBytes":6155},{"name":"SKILL.md","path":"skills/permissions-policy/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/permissions-policy/SKILL.md","title":"permissions-policy","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpermissions-policy%2FSKILL.md -->","frontmatter":{"name":"permissions-policy","description":"Use when reviewing HTTP response headers for defense-in-depth security hardening on any web application.","metadata":{"category":"security","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/permissions-policy"}},"isInternal":false,"tokens":441,"sizeBytes":2262},{"name":"rule.md","path":"skills/physical-address/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/physical-address/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fphysical-address%2Freferences%2Frule.md -->","isInternal":false,"tokens":875,"sizeBytes":3771},{"name":"SKILL.md","path":"skills/physical-address/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/physical-address/SKILL.md","title":"physical-address","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fphysical-address%2FSKILL.md -->","frontmatter":{"name":"physical-address","description":"Use when auditing local business websites, e-commerce sites, or any site where a physical presence affects trust or local search visibility.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/physical-address"}},"isInternal":false,"tokens":457,"sizeBytes":2297},{"name":"rule.md","path":"skills/picture-element/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/picture-element/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpicture-element%2Freferences%2Frule.md -->","isInternal":false,"tokens":1518,"sizeBytes":5501},{"name":"SKILL.md","path":"skills/picture-element/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/picture-element/SKILL.md","title":"picture-element","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpicture-element%2FSKILL.md -->","frontmatter":{"name":"picture-element","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use <picture> with an <img> fallback. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/picture-element"}},"isInternal":false,"tokens":752,"sizeBytes":3113},{"name":"rule.md","path":"skills/plain-language/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/plain-language/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fplain-language%2Freferences%2Frule.md -->","isInternal":false,"tokens":1162,"sizeBytes":5074},{"name":"SKILL.md","path":"skills/plain-language/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/plain-language/SKILL.md","title":"plain-language","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fplain-language%2FSKILL.md -->","frontmatter":{"name":"plain-language","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Write in plain language. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/plain-language"}},"isInternal":false,"tokens":373,"sizeBytes":1971},{"name":"rule.md","path":"skills/pluralization/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pluralization/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpluralization%2Freferences%2Frule.md -->","isInternal":false,"tokens":2329,"sizeBytes":9148},{"name":"SKILL.md","path":"skills/pluralization/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pluralization/SKILL.md","title":"pluralization","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpluralization%2FSKILL.md -->","frontmatter":{"name":"pluralization","description":"Use when reviewing string concatenation involving counts, translation key lookups, or i18n library configurations to check whether plural forms are handled correctly for all target locales.","metadata":{"category":"i18n","priority":"medium","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/i18n/pluralization"}},"isInternal":false,"tokens":452,"sizeBytes":2214},{"name":"rule.md","path":"skills/preconnect/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/preconnect/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpreconnect%2Freferences%2Frule.md -->","isInternal":false,"tokens":799,"sizeBytes":3789},{"name":"SKILL.md","path":"skills/preconnect/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/preconnect/SKILL.md","title":"preconnect","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpreconnect%2FSKILL.md -->","frontmatter":{"name":"preconnect","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Use preconnect for critical third-party origins. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/preconnect"}},"isInternal":false,"tokens":351,"sizeBytes":1753},{"name":"rule.md","path":"skills/privacy-policy/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/privacy-policy/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprivacy-policy%2Freferences%2Frule.md -->","isInternal":false,"tokens":1110,"sizeBytes":5313},{"name":"SKILL.md","path":"skills/privacy-policy/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/privacy-policy/SKILL.md","title":"privacy-policy","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprivacy-policy%2FSKILL.md -->","frontmatter":{"name":"privacy-policy","description":"Use when reviewing whether a website has a visible, accessible privacy policy link, particularly in the footer navigation.","metadata":{"category":"privacy","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/privacy/privacy-policy"}},"isInternal":false,"tokens":497,"sizeBytes":2471},{"name":"rule.md","path":"skills/product/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/product/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fproduct%2Freferences%2Frule.md -->","isInternal":false,"tokens":1443,"sizeBytes":6088},{"name":"SKILL.md","path":"skills/product/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/product/SKILL.md","title":"product","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fproduct%2FSKILL.md -->","frontmatter":{"name":"product","description":"Use when auditing e-commerce product pages or implementing structured data for a shop. Applies to any page selling or describing a specific product.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/product"}},"isInternal":false,"tokens":491,"sizeBytes":2370},{"name":"rule.md","path":"skills/progressive-jpeg/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/progressive-jpeg/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprogressive-jpeg%2Freferences%2Frule.md -->","isInternal":false,"tokens":967,"sizeBytes":4331},{"name":"SKILL.md","path":"skills/progressive-jpeg/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/progressive-jpeg/SKILL.md","title":"progressive-jpeg","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fprogressive-jpeg%2FSKILL.md -->","frontmatter":{"name":"progressive-jpeg","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use progressive JPEG encoding. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/progressive-jpeg"}},"isInternal":false,"tokens":336,"sizeBytes":1705},{"name":"rule.md","path":"skills/pwa-installability/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pwa-installability/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpwa-installability%2Freferences%2Frule.md -->","isInternal":false,"tokens":1625,"sizeBytes":6672},{"name":"SKILL.md","path":"skills/pwa-installability/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/pwa-installability/SKILL.md","title":"pwa-installability","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fpwa-installability%2FSKILL.md -->","frontmatter":{"name":"pwa-installability","description":"Use when auditing PWA readiness, adding an install prompt, or preparing a web app for submission to Microsoft Store or Google Play via PWA Builder.","metadata":{"category":"html","priority":"low","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/pwa-installability"}},"isInternal":false,"tokens":384,"sizeBytes":1805},{"name":"rule.md","path":"skills/quality/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/quality/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fquality%2Freferences%2Frule.md -->","isInternal":false,"tokens":1063,"sizeBytes":5276},{"name":"SKILL.md","path":"skills/quality/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/quality/SKILL.md","title":"quality","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fquality%2FSKILL.md -->","frontmatter":{"name":"quality","description":"Use when evaluating content pages for SEO quality. Applies to blog posts, product descriptions, landing pages, or any page expected to receive organic search traffic.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/quality"}},"isInternal":false,"tokens":543,"sizeBytes":2629},{"name":"rule.md","path":"skills/reading-level/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/reading-level/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freading-level%2Freferences%2Frule.md -->","isInternal":false,"tokens":977,"sizeBytes":4391},{"name":"SKILL.md","path":"skills/reading-level/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/reading-level/SKILL.md","title":"reading-level","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freading-level%2FSKILL.md -->","frontmatter":{"name":"reading-level","description":"Use when reviewing content pages for user experience and SEO. Applies to blog posts, landing pages, how-to guides, and any long-form content intended for a broad audience.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/reading-level"}},"isInternal":false,"tokens":508,"sizeBytes":2459},{"name":"rule.md","path":"skills/redirect-chain/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/redirect-chain/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chain%2Freferences%2Frule.md -->","isInternal":false,"tokens":1230,"sizeBytes":5098},{"name":"SKILL.md","path":"skills/redirect-chain/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/redirect-chain/SKILL.md","title":"redirect-chain","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chain%2FSKILL.md -->","frontmatter":{"name":"redirect-chain","description":"Use when auditing site redirects after URL migrations, domain changes, or CMS upgrades. Applies to any site that has had multiple rounds of structural changes over time.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/redirect-chain"}},"isInternal":false,"tokens":519,"sizeBytes":2402},{"name":"rule.md","path":"skills/redirect-chains/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/redirect-chains/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chains%2Freferences%2Frule.md -->","isInternal":false,"tokens":1095,"sizeBytes":5003},{"name":"SKILL.md","path":"skills/redirect-chains/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/redirect-chains/SKILL.md","title":"redirect-chains","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredirect-chains%2FSKILL.md -->","frontmatter":{"name":"redirect-chains","description":"Use when auditing internal link structure after a URL migration, domain change, or site rebuild. Applies to any site that has had redirects in place for more than a month.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/redirect-chains"}},"isInternal":false,"tokens":534,"sizeBytes":2578},{"name":"rule.md","path":"skills/reduced-motion/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/reduced-motion/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freduced-motion%2Freferences%2Frule.md -->","isInternal":false,"tokens":811,"sizeBytes":3621},{"name":"SKILL.md","path":"skills/reduced-motion/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/reduced-motion/SKILL.md","title":"reduced-motion","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freduced-motion%2FSKILL.md -->","frontmatter":{"name":"reduced-motion","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Respect reduced motion preferences. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/reduced-motion"}},"isInternal":false,"tokens":404,"sizeBytes":2138},{"name":"rule.md","path":"skills/redundant-entry/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/redundant-entry/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredundant-entry%2Freferences%2Frule.md -->","isInternal":false,"tokens":1039,"sizeBytes":4858},{"name":"SKILL.md","path":"skills/redundant-entry/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/redundant-entry/SKILL.md","title":"redundant-entry","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fredundant-entry%2FSKILL.md -->","frontmatter":{"name":"redundant-entry","description":"Use when reviewing any process that spans multiple screens, steps, or modal stages. Follow the real user journey and compare fields across steps instead of reviewing screens in isolation.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/redundant-entry"}},"isInternal":false,"tokens":416,"sizeBytes":2080},{"name":"rule.md","path":"skills/referrer-policy/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/referrer-policy/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freferrer-policy%2Freferences%2Frule.md -->","isInternal":false,"tokens":1052,"sizeBytes":4645},{"name":"SKILL.md","path":"skills/referrer-policy/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/referrer-policy/SKILL.md","title":"referrer-policy","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freferrer-policy%2FSKILL.md -->","frontmatter":{"name":"referrer-policy","description":"Use when reviewing HTTP response headers for privacy hardening on any website that handles authentication, session state, or sensitive URL parameters.","metadata":{"category":"security","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/referrer-policy"}},"isInternal":false,"tokens":512,"sizeBytes":2401},{"name":"rule.md","path":"skills/render-blocking/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/render-blocking/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frender-blocking%2Freferences%2Frule.md -->","isInternal":false,"tokens":971,"sizeBytes":4577},{"name":"SKILL.md","path":"skills/render-blocking/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/render-blocking/SKILL.md","title":"render-blocking","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frender-blocking%2FSKILL.md -->","frontmatter":{"name":"render-blocking","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Eliminate render-blocking resources. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/render-blocking"}},"isInternal":false,"tokens":344,"sizeBytes":1719},{"name":"rule.md","path":"skills/reset-css/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/reset-css/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freset-css%2Freferences%2Frule.md -->","isInternal":false,"tokens":6606,"sizeBytes":26042},{"name":"SKILL.md","path":"skills/reset-css/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/reset-css/SKILL.md","title":"reset-css","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freset-css%2FSKILL.md -->","frontmatter":{"name":"reset-css","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use a CSS reset or normalize stylesheet. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/reset-css"}},"isInternal":false,"tokens":321,"sizeBytes":1659},{"name":"rule.md","path":"skills/resource-hints/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/resource-hints/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresource-hints%2Freferences%2Frule.md -->","isInternal":false,"tokens":1529,"sizeBytes":6503},{"name":"SKILL.md","path":"skills/resource-hints/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/resource-hints/SKILL.md","title":"resource-hints","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresource-hints%2FSKILL.md -->","frontmatter":{"name":"resource-hints","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Use resource hints for faster loading. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/resource-hints"}},"isInternal":false,"tokens":353,"sizeBytes":1720},{"name":"rule.md","path":"skills/responsive-images/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/responsive-images/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-images%2Freferences%2Frule.md -->","isInternal":false,"tokens":1270,"sizeBytes":4637},{"name":"SKILL.md","path":"skills/responsive-images/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/responsive-images/SKILL.md","title":"responsive-images","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-images%2FSKILL.md -->","frontmatter":{"name":"responsive-images","description":"Use when reviewing article images, cards, galleries, or any component rendered at multiple sizes across breakpoints. Check both the markup and the CSS layout because an incorrect `sizes` attribute can negate a perfectly good `srcset`.","metadata":{"category":"images","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/responsive-images"}},"isInternal":false,"tokens":329,"sizeBytes":1611},{"name":"rule.md","path":"skills/responsive-size/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/responsive-size/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-size%2Freferences%2Frule.md -->","isInternal":false,"tokens":1420,"sizeBytes":5474},{"name":"SKILL.md","path":"skills/responsive-size/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/responsive-size/SKILL.md","title":"responsive-size","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-size%2FSKILL.md -->","frontmatter":{"name":"responsive-size","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Serve images at the correct display size. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/responsive-size"}},"isInternal":false,"tokens":735,"sizeBytes":3227},{"name":"rule.md","path":"skills/responsive-units/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/responsive-units/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-units%2Freferences%2Frule.md -->","isInternal":false,"tokens":876,"sizeBytes":3379},{"name":"SKILL.md","path":"skills/responsive-units/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/responsive-units/SKILL.md","title":"responsive-units","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fresponsive-units%2FSKILL.md -->","frontmatter":{"name":"responsive-units","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Use relative units for responsive layouts. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/responsive-units"}},"isInternal":false,"tokens":367,"sizeBytes":1893},{"name":"rule.md","path":"skills/retina-display/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/retina-display/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fretina-display%2Freferences%2Frule.md -->","isInternal":false,"tokens":1201,"sizeBytes":4362},{"name":"SKILL.md","path":"skills/retina-display/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/retina-display/SKILL.md","title":"retina-display","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fretina-display%2FSKILL.md -->","frontmatter":{"name":"retina-display","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Support high-DPI retina displays. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/retina-display"}},"isInternal":false,"tokens":333,"sizeBytes":1552},{"name":"rule.md","path":"skills/review/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/review/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freview%2Freferences%2Frule.md -->","isInternal":false,"tokens":911,"sizeBytes":4025},{"name":"SKILL.md","path":"skills/review/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/review/SKILL.md","title":"review","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Freview%2FSKILL.md -->","frontmatter":{"name":"review","description":"Use when applies to product pages, local business pages, recipes, apps, books, and any page that aggregates user reviews. Use when auditing rich result eligibility for e-commerce or review sites.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/review"}},"isInternal":false,"tokens":464,"sizeBytes":2224},{"name":"rule.md","path":"skills/right-to-erasure/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/right-to-erasure/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fright-to-erasure%2Freferences%2Frule.md -->","isInternal":false,"tokens":1653,"sizeBytes":7590},{"name":"SKILL.md","path":"skills/right-to-erasure/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/right-to-erasure/SKILL.md","title":"right-to-erasure","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fright-to-erasure%2FSKILL.md -->","frontmatter":{"name":"right-to-erasure","description":"Use when auditing account settings pages, privacy dashboards, or API routes to verify that a complete data deletion path exists for users.","metadata":{"category":"privacy","priority":"medium","difficulty":"intermediate","estimatedTime":"60","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/privacy/right-to-erasure"}},"isInternal":false,"tokens":417,"sizeBytes":2047},{"name":"rule.md","path":"skills/robots-meta-conflict/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/robots-meta-conflict/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta-conflict%2Freferences%2Frule.md -->","isInternal":false,"tokens":802,"sizeBytes":3660},{"name":"SKILL.md","path":"skills/robots-meta-conflict/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/robots-meta-conflict/SKILL.md","title":"robots-meta-conflict","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta-conflict%2FSKILL.md -->","frontmatter":{"name":"robots-meta-conflict","description":"Use when applies to sites that use both robots.txt disallow rules and meta robots noindex tags. Use when investigating why deindexed pages still appear in search results.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/robots-meta-conflict"}},"isInternal":false,"tokens":484,"sizeBytes":2221},{"name":"rule.md","path":"skills/robots-meta/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/robots-meta/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta%2Freferences%2Frule.md -->","isInternal":false,"tokens":992,"sizeBytes":4530},{"name":"SKILL.md","path":"skills/robots-meta/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/robots-meta/SKILL.md","title":"robots-meta","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-meta%2FSKILL.md -->","frontmatter":{"name":"robots-meta","description":"Use when applies to all HTML pages. Use when auditing pages that have disappeared from search results or when checking staging vs. production meta tag parity.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/robots-meta"}},"isInternal":false,"tokens":427,"sizeBytes":1975},{"name":"rule.md","path":"skills/robots-txt/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/robots-txt/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-txt%2Freferences%2Frule.md -->","isInternal":false,"tokens":656,"sizeBytes":3070},{"name":"SKILL.md","path":"skills/robots-txt/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/robots-txt/SKILL.md","title":"robots-txt","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Frobots-txt%2FSKILL.md -->","frontmatter":{"name":"robots-txt","description":"Use when applies to any public website. Use when auditing technical SEO foundations or diagnosing crawl coverage gaps.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/robots-txt"}},"isInternal":false,"tokens":425,"sizeBytes":1931},{"name":"rule.md","path":"skills/runtime-validation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/runtime-validation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fruntime-validation%2Freferences%2Frule.md -->","isInternal":false,"tokens":1655,"sizeBytes":7520},{"name":"SKILL.md","path":"skills/runtime-validation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/runtime-validation/SKILL.md","title":"runtime-validation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fruntime-validation%2FSKILL.md -->","frontmatter":{"name":"runtime-validation","description":"Use when reviewing code that calls fetch(), reads from localStorage, accesses process.env, or processes form submissions without explicitly validating the incoming data shape.","metadata":{"category":"javascript","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/runtime-validation"}},"isInternal":false,"tokens":453,"sizeBytes":2346},{"name":"rule.md","path":"skills/scheduler-yield/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/scheduler-yield/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscheduler-yield%2Freferences%2Frule.md -->","isInternal":false,"tokens":1427,"sizeBytes":6392},{"name":"SKILL.md","path":"skills/scheduler-yield/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/scheduler-yield/SKILL.md","title":"scheduler-yield","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscheduler-yield%2FSKILL.md -->","frontmatter":{"name":"scheduler-yield","description":"Use when reviewing JavaScript that performs synchronous loops over large datasets, recursive tree traversals, or bulk DOM updates that may exceed 50 ms on mid-range devices.","metadata":{"category":"javascript","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/scheduler-yield"}},"isInternal":false,"tokens":401,"sizeBytes":1951},{"name":"rule.md","path":"skills/schema-noindex-conflict/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/schema-noindex-conflict/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fschema-noindex-conflict%2Freferences%2Frule.md -->","isInternal":false,"tokens":968,"sizeBytes":4304},{"name":"SKILL.md","path":"skills/schema-noindex-conflict/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/schema-noindex-conflict/SKILL.md","title":"schema-noindex-conflict","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fschema-noindex-conflict%2FSKILL.md -->","frontmatter":{"name":"schema-noindex-conflict","description":"Use when applies to any site that uses structured data for rich results. Use when investigating why valid schema markup does not produce rich results in Google Search.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/schema-noindex-conflict"}},"isInternal":false,"tokens":473,"sizeBytes":2201},{"name":"rule.md","path":"skills/screen-reader-testing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/screen-reader-testing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscreen-reader-testing%2Freferences%2Frule.md -->","isInternal":false,"tokens":993,"sizeBytes":4803},{"name":"SKILL.md","path":"skills/screen-reader-testing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/screen-reader-testing/SKILL.md","title":"screen-reader-testing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscreen-reader-testing%2FSKILL.md -->","frontmatter":{"name":"screen-reader-testing","description":"Use when performing accessibility audits of web pages, components, or full user flows. Applies to all web content accessed via assistive technology. Particularly important for custom JavaScript widgets, single-page applications, dynamically updated content, modal dialogs, and forms with validation.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"60","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/screen-reader-testing"}},"isInternal":false,"tokens":807,"sizeBytes":4082},{"name":"rule.md","path":"skills/scrolljacking/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/scrolljacking/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscrolljacking%2Freferences%2Frule.md -->","isInternal":false,"tokens":1164,"sizeBytes":5253},{"name":"SKILL.md","path":"skills/scrolljacking/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/scrolljacking/SKILL.md","title":"scrolljacking","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fscrolljacking%2FSKILL.md -->","frontmatter":{"name":"scrolljacking","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid scrolljacking and custom scroll behavior. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/scrolljacking"}},"isInternal":false,"tokens":403,"sizeBytes":2145},{"name":"rule.md","path":"skills/search-input/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/search-input/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsearch-input%2Freferences%2Frule.md -->","isInternal":false,"tokens":2484,"sizeBytes":9563},{"name":"SKILL.md","path":"skills/search-input/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/search-input/SKILL.md","title":"search-input","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsearch-input%2FSKILL.md -->","frontmatter":{"name":"search-input","description":"Use when reviewing templates, rendered HTML, or shared components related to Make search inputs accessible. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/search-input"}},"isInternal":false,"tokens":306,"sizeBytes":1607},{"name":"rule.md","path":"skills/select-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/select-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fselect-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":584,"sizeBytes":2832},{"name":"SKILL.md","path":"skills/select-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/select-name/SKILL.md","title":"select-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fselect-name%2FSKILL.md -->","frontmatter":{"name":"select-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Provide accessible names for select elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/select-name"}},"isInternal":false,"tokens":357,"sizeBytes":1802},{"name":"rule.md","path":"skills/semantic-lists/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/semantic-lists/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsemantic-lists%2Freferences%2Frule.md -->","isInternal":false,"tokens":982,"sizeBytes":3785},{"name":"SKILL.md","path":"skills/semantic-lists/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/semantic-lists/SKILL.md","title":"semantic-lists","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsemantic-lists%2FSKILL.md -->","frontmatter":{"name":"semantic-lists","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use semantic list elements. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/semantic-lists"}},"isInternal":false,"tokens":415,"sizeBytes":2017},{"name":"rule.md","path":"skills/sensory-instructions/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sensory-instructions/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsensory-instructions%2Freferences%2Frule.md -->","isInternal":false,"tokens":1385,"sizeBytes":5714},{"name":"SKILL.md","path":"skills/sensory-instructions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sensory-instructions/SKILL.md","title":"sensory-instructions","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsensory-instructions%2FSKILL.md -->","frontmatter":{"name":"sensory-instructions","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid sensory-only instructions. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/sensory-instructions"}},"isInternal":false,"tokens":418,"sizeBytes":2134},{"name":"rule.md","path":"skills/service-area/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/service-area/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-area%2Freferences%2Frule.md -->","isInternal":false,"tokens":949,"sizeBytes":4347},{"name":"SKILL.md","path":"skills/service-area/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/service-area/SKILL.md","title":"service-area","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-area%2FSKILL.md -->","frontmatter":{"name":"service-area","description":"Use when applies to service businesses (plumbers, lawyers, consultants) serving multiple regions. Use when planning local SEO strategy for businesses without brick-and-mortar locations in every city.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/service-area"}},"isInternal":false,"tokens":477,"sizeBytes":2373},{"name":"rule.md","path":"skills/service-worker/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/service-worker/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-worker%2Freferences%2Frule.md -->","isInternal":false,"tokens":1902,"sizeBytes":8765},{"name":"SKILL.md","path":"skills/service-worker/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/service-worker/SKILL.md","title":"service-worker","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fservice-worker%2FSKILL.md -->","frontmatter":{"name":"service-worker","description":"Use when auditing repeat-visit performance, adding offline support, or evaluating PWA readiness for a web application.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"60","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/service-worker"}},"isInternal":false,"tokens":370,"sizeBytes":1913},{"name":"rule.md","path":"skills/session-cookie-flags/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/session-cookie-flags/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-cookie-flags%2Freferences%2Frule.md -->","isInternal":false,"tokens":1652,"sizeBytes":6971},{"name":"SKILL.md","path":"skills/session-cookie-flags/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/session-cookie-flags/SKILL.md","title":"session-cookie-flags","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-cookie-flags%2FSKILL.md -->","frontmatter":{"name":"session-cookie-flags","description":"Use when reviewing server-side session management, setting up authentication middleware, or auditing cookie configuration in HTTP response headers.","metadata":{"category":"security","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/session-cookie-flags"}},"isInternal":false,"tokens":394,"sizeBytes":1947},{"name":"rule.md","path":"skills/session-timeout-recovery/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/session-timeout-recovery/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-timeout-recovery%2Freferences%2Frule.md -->","isInternal":false,"tokens":1771,"sizeBytes":8276},{"name":"SKILL.md","path":"skills/session-timeout-recovery/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/session-timeout-recovery/SKILL.md","title":"session-timeout-recovery","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsession-timeout-recovery%2FSKILL.md -->","frontmatter":{"name":"session-timeout-recovery","description":"Use when reviewing authenticated user flows or long forms. Check both client and server behavior: warning timing, dialog accessibility, autosave frequency, timeout extension, and post-login state restoration.","metadata":{"category":"accessibility","priority":"high","difficulty":"advanced","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/session-timeout-recovery"}},"isInternal":false,"tokens":415,"sizeBytes":2169},{"name":"rule.md","path":"skills/share-buttons/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/share-buttons/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fshare-buttons%2Freferences%2Frule.md -->","isInternal":false,"tokens":916,"sizeBytes":4043},{"name":"SKILL.md","path":"skills/share-buttons/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/share-buttons/SKILL.md","title":"share-buttons","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fshare-buttons%2FSKILL.md -->","frontmatter":{"name":"share-buttons","description":"Use when applies to blog posts, news articles, tutorials, and other long-form content. Less relevant for product pages, service pages, or home pages. Use when optimizing content distribution.","metadata":{"category":"seo","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/share-buttons"}},"isInternal":false,"tokens":456,"sizeBytes":2259},{"name":"rule.md","path":"skills/sitemap-4xx/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap-4xx/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-4xx%2Freferences%2Frule.md -->","isInternal":false,"tokens":793,"sizeBytes":3658},{"name":"SKILL.md","path":"skills/sitemap-4xx/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap-4xx/SKILL.md","title":"sitemap-4xx","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-4xx%2FSKILL.md -->","frontmatter":{"name":"sitemap-4xx","description":"Use when applies to any site with a dynamically generated or manually maintained XML sitemap. Use when investigating crawl errors or after a site migration that removed pages.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/sitemap-4xx"}},"isInternal":false,"tokens":471,"sizeBytes":2079},{"name":"rule.md","path":"skills/sitemap-coverage/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap-coverage/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-coverage%2Freferences%2Frule.md -->","isInternal":false,"tokens":881,"sizeBytes":4018},{"name":"SKILL.md","path":"skills/sitemap-coverage/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap-coverage/SKILL.md","title":"sitemap-coverage","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-coverage%2FSKILL.md -->","frontmatter":{"name":"sitemap-coverage","description":"Use when applies to content sites, e-commerce stores, and any site where timely indexing of new pages matters. Use when investigating why new pages take a long time to appear in search results.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/sitemap-coverage"}},"isInternal":false,"tokens":451,"sizeBytes":2125},{"name":"rule.md","path":"skills/sitemap-domain/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap-domain/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-domain%2Freferences%2Frule.md -->","isInternal":false,"tokens":869,"sizeBytes":3858},{"name":"SKILL.md","path":"skills/sitemap-domain/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap-domain/SKILL.md","title":"sitemap-domain","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-domain%2FSKILL.md -->","frontmatter":{"name":"sitemap-domain","description":"Use when applies to sites that have recently migrated from HTTP to HTTPS, changed domain name, or have www/non-www redirect configurations. Use when sitemap submission reports low coverage.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/sitemap-domain"}},"isInternal":false,"tokens":461,"sizeBytes":2124},{"name":"rule.md","path":"skills/sitemap-valid/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap-valid/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-valid%2Freferences%2Frule.md -->","isInternal":false,"tokens":878,"sizeBytes":3433},{"name":"SKILL.md","path":"skills/sitemap-valid/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap-valid/SKILL.md","title":"sitemap-valid","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap-valid%2FSKILL.md -->","frontmatter":{"name":"sitemap-valid","description":"Use when applies to any site with a manually or programmatically generated XML sitemap. Use when debugging sitemap submission errors in Google Search Console.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/sitemap-valid"}},"isInternal":false,"tokens":493,"sizeBytes":2120},{"name":"rule.md","path":"skills/sitemap/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap%2Freferences%2Frule.md -->","isInternal":false,"tokens":1480,"sizeBytes":5500},{"name":"SKILL.md","path":"skills/sitemap/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sitemap/SKILL.md","title":"sitemap","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsitemap%2FSKILL.md -->","frontmatter":{"name":"sitemap","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Create and submit an XML sitemap. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/sitemap"}},"isInternal":false,"tokens":339,"sizeBytes":1651},{"name":"rule.md","path":"skills/skip-link/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/skip-link/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-link%2Freferences%2Frule.md -->","isInternal":false,"tokens":477,"sizeBytes":2141},{"name":"SKILL.md","path":"skills/skip-link/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/skip-link/SKILL.md","title":"skip-link","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-link%2FSKILL.md -->","frontmatter":{"name":"skip-link","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Implement 'Skip to Content' links. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/skip-link"}},"isInternal":false,"tokens":323,"sizeBytes":1605},{"name":"rule.md","path":"skills/skip-navigation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/skip-navigation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-navigation%2Freferences%2Frule.md -->","isInternal":false,"tokens":562,"sizeBytes":2413},{"name":"SKILL.md","path":"skills/skip-navigation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/skip-navigation/SKILL.md","title":"skip-navigation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fskip-navigation%2FSKILL.md -->","frontmatter":{"name":"skip-navigation","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Include a skip navigation link. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/skip-navigation"}},"isInternal":false,"tokens":353,"sizeBytes":1772},{"name":"rule.md","path":"skills/slug-keywords/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/slug-keywords/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fslug-keywords%2Freferences%2Frule.md -->","isInternal":false,"tokens":889,"sizeBytes":3995},{"name":"SKILL.md","path":"skills/slug-keywords/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/slug-keywords/SKILL.md","title":"slug-keywords","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fslug-keywords%2FSKILL.md -->","frontmatter":{"name":"slug-keywords","description":"Use when applies to blog posts, product pages, and any content page with editable URL slugs. Use when building a URL strategy for a new site or auditing existing URLs for keyword inclusion.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/slug-keywords"}},"isInternal":false,"tokens":476,"sizeBytes":2185},{"name":"rule.md","path":"skills/social-profiles/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/social-profiles/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsocial-profiles%2Freferences%2Frule.md -->","isInternal":false,"tokens":940,"sizeBytes":4208},{"name":"SKILL.md","path":"skills/social-profiles/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/social-profiles/SKILL.md","title":"social-profiles","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsocial-profiles%2FSKILL.md -->","frontmatter":{"name":"social-profiles","description":"Use when applies to business websites, personal brand sites, and publisher sites. Use when setting up Organization schema or auditing E-E-A-T signals for sites in competitive or YMYL categories.","metadata":{"category":"seo","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/social-profiles"}},"isInternal":false,"tokens":463,"sizeBytes":2209},{"name":"rule.md","path":"skills/source-maps/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/source-maps/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsource-maps%2Freferences%2Frule.md -->","isInternal":false,"tokens":699,"sizeBytes":3407},{"name":"SKILL.md","path":"skills/source-maps/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/source-maps/SKILL.md","title":"source-maps","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsource-maps%2FSKILL.md -->","frontmatter":{"name":"source-maps","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Provide source maps for production debugging. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/source-maps"}},"isInternal":false,"tokens":338,"sizeBytes":1777},{"name":"rule.md","path":"skills/special-chars/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/special-chars/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecial-chars%2Freferences%2Frule.md -->","isInternal":false,"tokens":972,"sizeBytes":4214},{"name":"SKILL.md","path":"skills/special-chars/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/special-chars/SKILL.md","title":"special-chars","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecial-chars%2FSKILL.md -->","frontmatter":{"name":"special-chars","description":"Use when applies to any site with user-generated slugs, CMS-generated URLs, or content in non-English languages. Use when auditing URLs for crawl errors or canonicalization issues.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/special-chars"}},"isInternal":false,"tokens":491,"sizeBytes":2241},{"name":"rule.md","path":"skills/specificity-management/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/specificity-management/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecificity-management%2Freferences%2Frule.md -->","isInternal":false,"tokens":859,"sizeBytes":3302},{"name":"SKILL.md","path":"skills/specificity-management/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/specificity-management/SKILL.md","title":"specificity-management","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspecificity-management%2FSKILL.md -->","frontmatter":{"name":"specificity-management","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Keep CSS specificity low and flat. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/specificity-management"}},"isInternal":false,"tokens":372,"sizeBytes":1907},{"name":"rule.md","path":"skills/speculation-rules/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/speculation-rules/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspeculation-rules%2Freferences%2Frule.md -->","isInternal":false,"tokens":1679,"sizeBytes":7367},{"name":"SKILL.md","path":"skills/speculation-rules/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/speculation-rules/SKILL.md","title":"speculation-rules","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fspeculation-rules%2FSKILL.md -->","frontmatter":{"name":"speculation-rules","description":"Use when optimising multi-page navigation performance, reducing INP on page transitions, or implementing progressive enhancement for fast page loads.","metadata":{"category":"performance","priority":"low","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/speculation-rules"}},"isInternal":false,"tokens":408,"sizeBytes":2037},{"name":"rule.md","path":"skills/sprite-generation/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sprite-generation/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsprite-generation%2Freferences%2Frule.md -->","isInternal":false,"tokens":1301,"sizeBytes":4965},{"name":"SKILL.md","path":"skills/sprite-generation/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/sprite-generation/SKILL.md","title":"sprite-generation","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsprite-generation%2FSKILL.md -->","frontmatter":{"name":"sprite-generation","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use image sprites where appropriate. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"low","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/sprite-generation"}},"isInternal":false,"tokens":329,"sizeBytes":1643},{"name":"rule.md","path":"skills/srcset/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/srcset/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsrcset%2Freferences%2Frule.md -->","isInternal":false,"tokens":1624,"sizeBytes":5642},{"name":"SKILL.md","path":"skills/srcset/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/srcset/SKILL.md","title":"srcset","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsrcset%2FSKILL.md -->","frontmatter":{"name":"srcset","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use srcset for responsive images. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/srcset"}},"isInternal":false,"tokens":720,"sizeBytes":3103},{"name":"rule.md","path":"skills/stack-trace-exposure/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/stack-trace-exposure/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstack-trace-exposure%2Freferences%2Frule.md -->","isInternal":false,"tokens":1933,"sizeBytes":8432},{"name":"SKILL.md","path":"skills/stack-trace-exposure/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/stack-trace-exposure/SKILL.md","title":"stack-trace-exposure","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstack-trace-exposure%2FSKILL.md -->","frontmatter":{"name":"stack-trace-exposure","description":"Use when reviewing error handling middleware, API route handlers, or server responses for security-sensitive information disclosure.","metadata":{"category":"security","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/stack-trace-exposure"}},"isInternal":false,"tokens":392,"sizeBytes":2017},{"name":"rule.md","path":"skills/stop-words/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/stop-words/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstop-words%2Freferences%2Frule.md -->","isInternal":false,"tokens":914,"sizeBytes":4095},{"name":"SKILL.md","path":"skills/stop-words/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/stop-words/SKILL.md","title":"stop-words","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstop-words%2FSKILL.md -->","frontmatter":{"name":"stop-words","description":"Use when applies primarily when creating new content pages. Low priority for existing indexed pages where redirect risk outweighs gain. Use when building a slug naming convention.","metadata":{"category":"seo","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/stop-words"}},"isInternal":false,"tokens":448,"sizeBytes":2084},{"name":"rule.md","path":"skills/streaming-html/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/streaming-html/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstreaming-html%2Freferences%2Frule.md -->","isInternal":false,"tokens":1879,"sizeBytes":8341},{"name":"SKILL.md","path":"skills/streaming-html/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/streaming-html/SKILL.md","title":"streaming-html","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstreaming-html%2FSKILL.md -->","frontmatter":{"name":"streaming-html","description":"Use when reviewing server-side rendering setup, Next.js App Router pages, or Node.js HTTP handlers to verify that HTML is streamed incrementally rather than buffered until completion.","metadata":{"category":"performance","priority":"medium","difficulty":"advanced","estimatedTime":"45","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/streaming-html"}},"isInternal":false,"tokens":437,"sizeBytes":2212},{"name":"rule.md","path":"skills/structured-data/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/structured-data/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstructured-data%2Freferences%2Frule.md -->","isInternal":false,"tokens":1512,"sizeBytes":6291},{"name":"SKILL.md","path":"skills/structured-data/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/structured-data/SKILL.md","title":"structured-data","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstructured-data%2FSKILL.md -->","frontmatter":{"name":"structured-data","description":"Use when auditing metadata, crawlability, structured data, or indexability related to Add structured data markup. Verify the rendered HTML and HTTP response rather than relying only on source files.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/structured-data"}},"isInternal":false,"tokens":339,"sizeBytes":1679},{"name":"rule.md","path":"skills/styles-lint/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/styles-lint/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstyles-lint%2Freferences%2Frule.md -->","isInternal":false,"tokens":5370,"sizeBytes":22866},{"name":"SKILL.md","path":"skills/styles-lint/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/styles-lint/SKILL.md","title":"styles-lint","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fstyles-lint%2FSKILL.md -->","frontmatter":{"name":"styles-lint","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Lint CSS and SCSS files. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/styles-lint"}},"isInternal":false,"tokens":341,"sizeBytes":1662},{"name":"rule.md","path":"skills/subgrid/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/subgrid/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubgrid%2Freferences%2Frule.md -->","isInternal":false,"tokens":1807,"sizeBytes":7239},{"name":"SKILL.md","path":"skills/subgrid/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/subgrid/SKILL.md","title":"subgrid","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubgrid%2FSKILL.md -->","frontmatter":{"name":"subgrid","description":"Use when reviewing card grid layouts with misaligned content areas, or any nested grid where child items need to align with sibling cards' corresponding sections without JavaScript intervention.","metadata":{"category":"css","priority":"low","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/subgrid"}},"isInternal":false,"tokens":455,"sizeBytes":2172},{"name":"rule.md","path":"skills/subresource-integrity/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/subresource-integrity/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubresource-integrity%2Freferences%2Frule.md -->","isInternal":false,"tokens":1025,"sizeBytes":4031},{"name":"SKILL.md","path":"skills/subresource-integrity/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/subresource-integrity/SKILL.md","title":"subresource-integrity","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsubresource-integrity%2FSKILL.md -->","frontmatter":{"name":"subresource-integrity","description":"Use when reviewing templates, rendered HTML, or shared components related to Add Subresource Integrity to external scripts. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/subresource-integrity"}},"isInternal":false,"tokens":412,"sizeBytes":2043},{"name":"rule.md","path":"skills/svg-inline/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/svg-inline/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-inline%2Freferences%2Frule.md -->","isInternal":false,"tokens":1490,"sizeBytes":5476},{"name":"SKILL.md","path":"skills/svg-inline/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/svg-inline/SKILL.md","title":"svg-inline","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-inline%2FSKILL.md -->","frontmatter":{"name":"svg-inline","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Manage inline SVG size and complexity. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"medium","difficulty":"intermediate","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/svg-inline"}},"isInternal":false,"tokens":728,"sizeBytes":3323},{"name":"rule.md","path":"skills/svg-optimization/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/svg-optimization/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-optimization%2Freferences%2Frule.md -->","isInternal":false,"tokens":1202,"sizeBytes":4739},{"name":"SKILL.md","path":"skills/svg-optimization/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/svg-optimization/SKILL.md","title":"svg-optimization","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fsvg-optimization%2FSKILL.md -->","frontmatter":{"name":"svg-optimization","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Optimize SVG files. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/svg-optimization"}},"isInternal":false,"tokens":321,"sizeBytes":1540},{"name":"rule.md","path":"skills/tabindex/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/tabindex/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabindex%2Freferences%2Frule.md -->","isInternal":false,"tokens":468,"sizeBytes":2287},{"name":"SKILL.md","path":"skills/tabindex/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/tabindex/SKILL.md","title":"tabindex","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabindex%2FSKILL.md -->","frontmatter":{"name":"tabindex","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use appropriate tabindex values. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/tabindex"}},"isInternal":false,"tokens":332,"sizeBytes":1689},{"name":"rule.md","path":"skills/table-duplicate-name/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/table-duplicate-name/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-duplicate-name%2Freferences%2Frule.md -->","isInternal":false,"tokens":441,"sizeBytes":2230},{"name":"SKILL.md","path":"skills/table-duplicate-name/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/table-duplicate-name/SKILL.md","title":"table-duplicate-name","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-duplicate-name%2FSKILL.md -->","frontmatter":{"name":"table-duplicate-name","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure tables have unique accessible names. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/table-duplicate-name"}},"isInternal":false,"tokens":335,"sizeBytes":1705},{"name":"rule.md","path":"skills/table-headers/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/table-headers/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-headers%2Freferences%2Frule.md -->","isInternal":false,"tokens":431,"sizeBytes":1988},{"name":"SKILL.md","path":"skills/table-headers/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/table-headers/SKILL.md","title":"table-headers","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftable-headers%2FSKILL.md -->","frontmatter":{"name":"table-headers","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Define proper table headers. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/table-headers"}},"isInternal":false,"tokens":369,"sizeBytes":1839},{"name":"rule.md","path":"skills/tabs-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/tabs-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabs-accessibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":2289,"sizeBytes":8689},{"name":"SKILL.md","path":"skills/tabs-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/tabs-accessibility/SKILL.md","title":"tabs-accessibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftabs-accessibility%2FSKILL.md -->","frontmatter":{"name":"tabs-accessibility","description":"Use when reviewing templates, rendered HTML, or shared components related to Make tabs keyboard navigable. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/tabs-accessibility"}},"isInternal":false,"tokens":331,"sizeBytes":1634},{"name":"rule.md","path":"skills/td-headers-attr/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/td-headers-attr/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftd-headers-attr%2Freferences%2Frule.md -->","isInternal":false,"tokens":489,"sizeBytes":2233},{"name":"SKILL.md","path":"skills/td-headers-attr/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/td-headers-attr/SKILL.md","title":"td-headers-attr","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftd-headers-attr%2FSKILL.md -->","frontmatter":{"name":"td-headers-attr","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Link table cells to headers using IDs. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/td-headers-attr"}},"isInternal":false,"tokens":351,"sizeBytes":1713},{"name":"rule.md","path":"skills/tel-mailto/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/tel-mailto/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftel-mailto%2Freferences%2Frule.md -->","isInternal":false,"tokens":1072,"sizeBytes":4262},{"name":"SKILL.md","path":"skills/tel-mailto/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/tel-mailto/SKILL.md","title":"tel-mailto","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftel-mailto%2FSKILL.md -->","frontmatter":{"name":"tel-mailto","description":"Use when applies to contact pages, business listing pages, headers/footers, and any page displaying a phone number or email address. Use when auditing contact UX or schema-marked LocalBusiness pages.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/tel-mailto"}},"isInternal":false,"tokens":532,"sizeBytes":2198},{"name":"rule.md","path":"skills/terms-of-service/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/terms-of-service/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fterms-of-service%2Freferences%2Frule.md -->","isInternal":false,"tokens":1114,"sizeBytes":5161},{"name":"SKILL.md","path":"skills/terms-of-service/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/terms-of-service/SKILL.md","title":"terms-of-service","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fterms-of-service%2FSKILL.md -->","frontmatter":{"name":"terms-of-service","description":"Use when reviewing whether a website or web application has a visible Terms of Service link accessible from every page.","metadata":{"category":"security","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/terms-of-service"}},"isInternal":false,"tokens":467,"sizeBytes":2344},{"name":"rule.md","path":"skills/test-coverage/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/test-coverage/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftest-coverage%2Freferences%2Frule.md -->","isInternal":false,"tokens":869,"sizeBytes":3345},{"name":"SKILL.md","path":"skills/test-coverage/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/test-coverage/SKILL.md","title":"test-coverage","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftest-coverage%2FSKILL.md -->","frontmatter":{"name":"test-coverage","description":"Use when reviewing CI coverage, automated checks, or test strategy related to Maintain test coverage thresholds. Focus on whether the rule is continuously verified, not just documented.","metadata":{"category":"testing","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/test-coverage"}},"isInternal":false,"tokens":325,"sizeBytes":1628},{"name":"rule.md","path":"skills/text-expansion/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/text-expansion/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-expansion%2Freferences%2Frule.md -->","isInternal":false,"tokens":1649,"sizeBytes":6625},{"name":"SKILL.md","path":"skills/text-expansion/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/text-expansion/SKILL.md","title":"text-expansion","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-expansion%2FSKILL.md -->","frontmatter":{"name":"text-expansion","description":"Use when reviewing CSS for fixed dimensions, truncation, or overflow rules on elements that render translatable strings.","metadata":{"category":"i18n","priority":"medium","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/i18n/text-expansion"}},"isInternal":false,"tokens":422,"sizeBytes":2136},{"name":"rule.md","path":"skills/text-in-images/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/text-in-images/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-in-images%2Freferences%2Frule.md -->","isInternal":false,"tokens":1233,"sizeBytes":4884},{"name":"SKILL.md","path":"skills/text-in-images/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/text-in-images/SKILL.md","title":"text-in-images","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-in-images%2FSKILL.md -->","frontmatter":{"name":"text-in-images","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Avoid images of text. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"low","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/text-in-images"}},"isInternal":false,"tokens":409,"sizeBytes":2055},{"name":"rule.md","path":"skills/text-resizing/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/text-resizing/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-resizing%2Freferences%2Frule.md -->","isInternal":false,"tokens":1207,"sizeBytes":4863},{"name":"SKILL.md","path":"skills/text-resizing/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/text-resizing/SKILL.md","title":"text-resizing","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftext-resizing%2FSKILL.md -->","frontmatter":{"name":"text-resizing","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Support text resizing to 200%. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/text-resizing"}},"isInternal":false,"tokens":400,"sizeBytes":2037},{"name":"rule.md","path":"skills/th-has-data-cells/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/th-has-data-cells/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fth-has-data-cells%2Freferences%2Frule.md -->","isInternal":false,"tokens":509,"sizeBytes":2333},{"name":"SKILL.md","path":"skills/th-has-data-cells/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/th-has-data-cells/SKILL.md","title":"th-has-data-cells","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fth-has-data-cells%2FSKILL.md -->","frontmatter":{"name":"th-has-data-cells","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure table headers associate with data cells. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/th-has-data-cells"}},"isInternal":false,"tokens":329,"sizeBytes":1672},{"name":"rule.md","path":"skills/third-party-cookies/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/third-party-cookies/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-cookies%2Freferences%2Frule.md -->","isInternal":false,"tokens":1115,"sizeBytes":5229},{"name":"SKILL.md","path":"skills/third-party-cookies/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/third-party-cookies/SKILL.md","title":"third-party-cookies","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-cookies%2FSKILL.md -->","frontmatter":{"name":"third-party-cookies","description":"Use when reviewing a website for privacy compliance, third-party resource loading, or cookie consent implementation.","metadata":{"category":"privacy","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/privacy/third-party-cookies"}},"isInternal":false,"tokens":458,"sizeBytes":2321},{"name":"rule.md","path":"skills/third-party-scripts/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/third-party-scripts/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-scripts%2Freferences%2Frule.md -->","isInternal":false,"tokens":1334,"sizeBytes":6187},{"name":"SKILL.md","path":"skills/third-party-scripts/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/third-party-scripts/SKILL.md","title":"third-party-scripts","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fthird-party-scripts%2FSKILL.md -->","frontmatter":{"name":"third-party-scripts","description":"Use when auditing slow page loads, heavy assets, or rendering delays related to Optimize third-party script loading. Verify the actual bottleneck in DevTools, Lighthouse, or field data before recommending changes.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/third-party-scripts"}},"isInternal":false,"tokens":341,"sizeBytes":1669},{"name":"rule.md","path":"skills/title-unique/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/title-unique/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftitle-unique%2Freferences%2Frule.md -->","isInternal":false,"tokens":794,"sizeBytes":3793},{"name":"SKILL.md","path":"skills/title-unique/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/title-unique/SKILL.md","title":"title-unique","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftitle-unique%2FSKILL.md -->","frontmatter":{"name":"title-unique","description":"Use when applies to all HTML pages. Use when auditing a site crawl report or investigating why multiple pages compete for the same keyword in search results.","metadata":{"category":"seo","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/title-unique"}},"isInternal":false,"tokens":432,"sizeBytes":2067},{"name":"rule.md","path":"skills/token-storage-security/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/token-storage-security/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftoken-storage-security%2Freferences%2Frule.md -->","isInternal":false,"tokens":2041,"sizeBytes":8836},{"name":"SKILL.md","path":"skills/token-storage-security/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/token-storage-security/SKILL.md","title":"token-storage-security","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftoken-storage-security%2FSKILL.md -->","frontmatter":{"name":"token-storage-security","description":"Use when reviewing authentication implementation, setting up a new auth system, or evaluating whether the current token storage approach exposes the application to XSS-based token theft.","metadata":{"category":"security","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/token-storage-security"}},"isInternal":false,"tokens":462,"sizeBytes":2419},{"name":"rule.md","path":"skills/touch-targets/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/touch-targets/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftouch-targets%2Freferences%2Frule.md -->","isInternal":false,"tokens":999,"sizeBytes":4284},{"name":"SKILL.md","path":"skills/touch-targets/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/touch-targets/SKILL.md","title":"touch-targets","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftouch-targets%2FSKILL.md -->","frontmatter":{"name":"touch-targets","description":"Use when applies to all interactive elements on touchscreen interfaces: buttons, links, checkboxes, radio buttons, form inputs, icon buttons, and menu items. Check CSS for min-width, min-height, width, height, and padding on interactive elements. Particularly important for icon-only buttons (close, delete, share) which are often made too small.","metadata":{"category":"accessibility","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/touch-targets"}},"isInternal":false,"tokens":871,"sizeBytes":3760},{"name":"rule.md","path":"skills/trailing-slash/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/trailing-slash/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrailing-slash%2Freferences%2Frule.md -->","isInternal":false,"tokens":816,"sizeBytes":3785},{"name":"SKILL.md","path":"skills/trailing-slash/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/trailing-slash/SKILL.md","title":"trailing-slash","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrailing-slash%2FSKILL.md -->","frontmatter":{"name":"trailing-slash","description":"Use when applies to all static and dynamic websites. Use when auditing a site for duplicate content, setting up a new site, or after migrating platforms that changed URL conventions.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/trailing-slash"}},"isInternal":false,"tokens":454,"sizeBytes":2155},{"name":"rule.md","path":"skills/translation-strings/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/translation-strings/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftranslation-strings%2Freferences%2Frule.md -->","isInternal":false,"tokens":1856,"sizeBytes":7638},{"name":"SKILL.md","path":"skills/translation-strings/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/translation-strings/SKILL.md","title":"translation-strings","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftranslation-strings%2FSKILL.md -->","frontmatter":{"name":"translation-strings","description":"Use when reviewing a codebase for internationalisation readiness, setting up an i18n library, or preparing strings for a new locale.","metadata":{"category":"javascript","priority":"medium","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/translation-strings"}},"isInternal":false,"tokens":363,"sizeBytes":1981},{"name":"rule.md","path":"skills/trust-signals/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/trust-signals/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrust-signals%2Freferences%2Frule.md -->","isInternal":false,"tokens":1138,"sizeBytes":5199},{"name":"SKILL.md","path":"skills/trust-signals/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/trust-signals/SKILL.md","title":"trust-signals","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftrust-signals%2FSKILL.md -->","frontmatter":{"name":"trust-signals","description":"Use when applies especially to e-commerce checkouts, contact/lead forms, pricing pages, and YMYL (Your Money or Your Life) content. Use when auditing E-E-A-T or conversion optimization.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/trust-signals"}},"isInternal":false,"tokens":503,"sizeBytes":2476},{"name":"rule.md","path":"skills/ttfb/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/ttfb/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fttfb%2Freferences%2Frule.md -->","isInternal":false,"tokens":642,"sizeBytes":2768},{"name":"SKILL.md","path":"skills/ttfb/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/ttfb/SKILL.md","title":"ttfb","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fttfb%2FSKILL.md -->","frontmatter":{"name":"ttfb","description":"Use when auditing slow first responses on SSR pages, APIs, or cacheable HTML. Distinguish origin compute time from network latency and CDN cache misses before proposing a fix.","metadata":{"category":"performance","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/ttfb"}},"isInternal":false,"tokens":345,"sizeBytes":1624},{"name":"rule.md","path":"skills/twitter-cards/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/twitter-cards/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftwitter-cards%2Freferences%2Frule.md -->","isInternal":false,"tokens":787,"sizeBytes":3518},{"name":"SKILL.md","path":"skills/twitter-cards/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/twitter-cards/SKILL.md","title":"twitter-cards","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftwitter-cards%2FSKILL.md -->","frontmatter":{"name":"twitter-cards","description":"Use when applies to any page intended to be shared on X (Twitter). Use when auditing social sharing previews or adding social meta tags to a new site.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/twitter-cards"}},"isInternal":false,"tokens":476,"sizeBytes":2093},{"name":"rule.md","path":"skills/type-coercion/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/type-coercion/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-coercion%2Freferences%2Frule.md -->","isInternal":false,"tokens":915,"sizeBytes":3874},{"name":"SKILL.md","path":"skills/type-coercion/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/type-coercion/SKILL.md","title":"type-coercion","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-coercion%2FSKILL.md -->","frontmatter":{"name":"type-coercion","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Avoid implicit type coercion. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/type-coercion"}},"isInternal":false,"tokens":392,"sizeBytes":1972},{"name":"rule.md","path":"skills/type-only-imports/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/type-only-imports/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-only-imports%2Freferences%2Frule.md -->","isInternal":false,"tokens":1194,"sizeBytes":5395},{"name":"SKILL.md","path":"skills/type-only-imports/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/type-only-imports/SKILL.md","title":"type-only-imports","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftype-only-imports%2FSKILL.md -->","frontmatter":{"name":"type-only-imports","description":"Use when auditing import statements in TypeScript files, setting up a new TypeScript project, or investigating unexpected bundle inclusions from type-only dependencies.","metadata":{"category":"javascript","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/type-only-imports"}},"isInternal":false,"tokens":425,"sizeBytes":2234},{"name":"rule.md","path":"skills/typescript-strict-mode/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/typescript-strict-mode/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftypescript-strict-mode%2Freferences%2Frule.md -->","isInternal":false,"tokens":1804,"sizeBytes":7858},{"name":"SKILL.md","path":"skills/typescript-strict-mode/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/typescript-strict-mode/SKILL.md","title":"typescript-strict-mode","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Ftypescript-strict-mode%2FSKILL.md -->","frontmatter":{"name":"typescript-strict-mode","description":"Use when setting up a new TypeScript project, auditing an existing tsconfig.json, or reviewing code where null-reference errors or implicit any types are present.","metadata":{"category":"javascript","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/typescript-strict-mode"}},"isInternal":false,"tokens":421,"sizeBytes":2105},{"name":"rule.md","path":"skills/unique-id/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/unique-id/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funique-id%2Freferences%2Frule.md -->","isInternal":false,"tokens":3428,"sizeBytes":13752},{"name":"SKILL.md","path":"skills/unique-id/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/unique-id/SKILL.md","title":"unique-id","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funique-id%2FSKILL.md -->","frontmatter":{"name":"unique-id","description":"Use when reviewing templates, rendered HTML, or shared components related to Ensure all IDs are unique. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/unique-id"}},"isInternal":false,"tokens":341,"sizeBytes":1692},{"name":"rule.md","path":"skills/unit-tests/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/unit-tests/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funit-tests%2Freferences%2Frule.md -->","isInternal":false,"tokens":2729,"sizeBytes":10967},{"name":"SKILL.md","path":"skills/unit-tests/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/unit-tests/SKILL.md","title":"unit-tests","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funit-tests%2FSKILL.md -->","frontmatter":{"name":"unit-tests","description":"Use when reviewing CI coverage, automated checks, or test strategy related to Write unit tests. Focus on whether the rule is continuously verified, not just documented.","metadata":{"category":"testing","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/unit-tests"}},"isInternal":false,"tokens":302,"sizeBytes":1528},{"name":"rule.md","path":"skills/unused-css/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/unused-css/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funused-css%2Freferences%2Frule.md -->","isInternal":false,"tokens":5465,"sizeBytes":22669},{"name":"SKILL.md","path":"skills/unused-css/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/unused-css/SKILL.md","title":"unused-css","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Funused-css%2FSKILL.md -->","frontmatter":{"name":"unused-css","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Remove unused CSS rules. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"high","difficulty":"intermediate","estimatedTime":"25","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/unused-css"}},"isInternal":false,"tokens":346,"sizeBytes":1659},{"name":"rule.md","path":"skills/video-accessibility/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video-accessibility/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-accessibility%2Freferences%2Frule.md -->","isInternal":false,"tokens":2274,"sizeBytes":9413},{"name":"SKILL.md","path":"skills/video-accessibility/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video-accessibility/SKILL.md","title":"video-accessibility","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-accessibility%2FSKILL.md -->","frontmatter":{"name":"video-accessibility","description":"Use when reviewing templates, rendered HTML, or shared components related to Make videos accessible with captions. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/video-accessibility"}},"isInternal":false,"tokens":357,"sizeBytes":1957},{"name":"rule.md","path":"skills/video-captions/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video-captions/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-captions%2Freferences%2Frule.md -->","isInternal":false,"tokens":1041,"sizeBytes":4285},{"name":"SKILL.md","path":"skills/video-captions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video-captions/SKILL.md","title":"video-captions","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-captions%2FSKILL.md -->","frontmatter":{"name":"video-captions","description":"Use when applies to all `<video>` elements and third-party video embeds (YouTube, Vimeo) where the page owner controls the content. Prerecorded videos require `.vtt` caption files via `<track>`. For videos embedded via `<iframe>`, check that the video platform captions are enabled. Audio-only content requires transcripts instead (SC 1.2.1). Video-only content (no audio) requires a text alternative or audio description instead (SC 1.2.3).","metadata":{"category":"accessibility","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/video-captions"}},"isInternal":false,"tokens":950,"sizeBytes":4161},{"name":"rule.md","path":"skills/video-optimization/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video-optimization/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-optimization%2Freferences%2Frule.md -->","isInternal":false,"tokens":1133,"sizeBytes":4843},{"name":"SKILL.md","path":"skills/video-optimization/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video-optimization/SKILL.md","title":"video-optimization","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-optimization%2FSKILL.md -->","frontmatter":{"name":"video-optimization","description":"Use when reviewing <video> elements, background/hero video, or embedded media assets. Check encoded bitrate, resolution relative to the rendered player size, codec/container choice, and whether a poster/thumbnail avoids blocking on the first frame.","metadata":{"category":"performance","priority":"high","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/performance/video-optimization"}},"isInternal":false,"tokens":709,"sizeBytes":3231},{"name":"rule.md","path":"skills/video-thumbnail/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video-thumbnail/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-thumbnail%2Freferences%2Frule.md -->","isInternal":false,"tokens":760,"sizeBytes":3345},{"name":"SKILL.md","path":"skills/video-thumbnail/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video-thumbnail/SKILL.md","title":"video-thumbnail","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo-thumbnail%2FSKILL.md -->","frontmatter":{"name":"video-thumbnail","description":"Use when applies to all `<video>` elements in HTML. The `poster` attribute specifies the URL of an image to show as a placeholder before the video is loaded or played. This is distinct from captions or audio descriptions, which are accessibility requirements. The poster is primarily a UX and performance enhancement, though the lack of a poster can indirectly create a CLS (Cumulative Layout Shift) issue if video dimensions are not declared.","metadata":{"category":"html","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/video-thumbnail"}},"isInternal":false,"tokens":800,"sizeBytes":3766},{"name":"rule.md","path":"skills/video/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo%2Freferences%2Frule.md -->","isInternal":false,"tokens":1052,"sizeBytes":4244},{"name":"SKILL.md","path":"skills/video/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/video/SKILL.md","title":"video","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvideo%2FSKILL.md -->","frontmatter":{"name":"video","description":"Use when applies to any page embedding or hosting video content (YouTube, Vimeo, self-hosted). Use when adding video content to a site or auditing structured data coverage.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/video"}},"isInternal":false,"tokens":491,"sizeBytes":2248},{"name":"rule.md","path":"skills/view-transitions/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/view-transitions/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fview-transitions%2Freferences%2Frule.md -->","isInternal":false,"tokens":1570,"sizeBytes":7140},{"name":"SKILL.md","path":"skills/view-transitions/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/view-transitions/SKILL.md","title":"view-transitions","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fview-transitions%2FSKILL.md -->","frontmatter":{"name":"view-transitions","description":"Use when adding page transition animations, image expand/contract effects, shared-element transitions, or improving navigation UX in a single-page or multi-page application.","metadata":{"category":"css","priority":"low","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/view-transitions"}},"isInternal":false,"tokens":398,"sizeBytes":2114},{"name":"rule.md","path":"skills/viewport-zoom/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/viewport-zoom/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport-zoom%2Freferences%2Frule.md -->","isInternal":false,"tokens":697,"sizeBytes":3102},{"name":"SKILL.md","path":"skills/viewport-zoom/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/viewport-zoom/SKILL.md","title":"viewport-zoom","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport-zoom%2FSKILL.md -->","frontmatter":{"name":"viewport-zoom","description":"Use when applies to any `<meta name='viewport'>` element in HTML documents. Check the `content` attribute for `user-scalable=no`, `user-scalable=0`, `maximum-scale=1`, or `maximum-scale` values less than 2. This is a common mistake in mobile-first templates and CSS frameworks.","metadata":{"category":"accessibility","priority":"high","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/viewport-zoom"}},"isInternal":false,"tokens":853,"sizeBytes":3571},{"name":"rule.md","path":"skills/viewport/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/viewport/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport%2Freferences%2Frule.md -->","isInternal":false,"tokens":1054,"sizeBytes":4373},{"name":"SKILL.md","path":"skills/viewport/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/viewport/SKILL.md","title":"viewport","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fviewport%2FSKILL.md -->","frontmatter":{"name":"viewport","description":"Use when reviewing templates, rendered HTML, or shared components related to Set the responsive viewport meta tag. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"critical","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/viewport"}},"isInternal":false,"tokens":344,"sizeBytes":1653},{"name":"rule.md","path":"skills/visual-regression/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/visual-regression/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvisual-regression%2Freferences%2Frule.md -->","isInternal":false,"tokens":815,"sizeBytes":3759},{"name":"SKILL.md","path":"skills/visual-regression/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/visual-regression/SKILL.md","title":"visual-regression","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fvisual-regression%2FSKILL.md -->","frontmatter":{"name":"visual-regression","description":"Use when reviewing CI coverage, automated checks, or test strategy related to Use visual regression testing. Focus on whether the rule is continuously verified, not just documented.","metadata":{"category":"testing","priority":"medium","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/testing/visual-regression"}},"isInternal":false,"tokens":376,"sizeBytes":1971},{"name":"rule.md","path":"skills/w3c-compliant/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/w3c-compliant/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fw3c-compliant%2Freferences%2Frule.md -->","isInternal":false,"tokens":3854,"sizeBytes":15811},{"name":"SKILL.md","path":"skills/w3c-compliant/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/w3c-compliant/SKILL.md","title":"w3c-compliant","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fw3c-compliant%2FSKILL.md -->","frontmatter":{"name":"w3c-compliant","description":"Use when reviewing templates, rendered HTML, or shared components related to Validate HTML against W3C standards. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/w3c-compliant"}},"isInternal":false,"tokens":339,"sizeBytes":1681},{"name":"rule.md","path":"skills/weak-internal-links/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/weak-internal-links/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweak-internal-links%2Freferences%2Frule.md -->","isInternal":false,"tokens":1011,"sizeBytes":4674},{"name":"SKILL.md","path":"skills/weak-internal-links/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/weak-internal-links/SKILL.md","title":"weak-internal-links","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweak-internal-links%2FSKILL.md -->","frontmatter":{"name":"weak-internal-links","description":"Use when applies to any site with more than 20 pages. Use when auditing site architecture, investigating why certain pages underperform in search, or after a site migration.","metadata":{"category":"seo","priority":"medium","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/weak-internal-links"}},"isInternal":false,"tokens":473,"sizeBytes":2303},{"name":"rule.md","path":"skills/web-app-manifest/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/web-app-manifest/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-app-manifest%2Freferences%2Frule.md -->","isInternal":false,"tokens":1031,"sizeBytes":4310},{"name":"SKILL.md","path":"skills/web-app-manifest/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/web-app-manifest/SKILL.md","title":"web-app-manifest","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-app-manifest%2FSKILL.md -->","frontmatter":{"name":"web-app-manifest","description":"Use when reviewing templates, rendered HTML, or shared components related to Link a Web App Manifest for installability. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"medium","difficulty":"beginner","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/web-app-manifest"}},"isInternal":false,"tokens":406,"sizeBytes":1963},{"name":"rule.md","path":"skills/web-storage/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/web-storage/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-storage%2Freferences%2Frule.md -->","isInternal":false,"tokens":898,"sizeBytes":4256},{"name":"SKILL.md","path":"skills/web-storage/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/web-storage/SKILL.md","title":"web-storage","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fweb-storage%2FSKILL.md -->","frontmatter":{"name":"web-storage","description":"Use when reviewing scripts, client components, bundles, or runtime behavior related to Use Web Storage API safely. Inspect both source code and the browser execution path so fixes target the real bottleneck or bug.","metadata":{"category":"javascript","priority":"medium","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/javascript/web-storage"}},"isInternal":false,"tokens":403,"sizeBytes":2030},{"name":"rule.md","path":"skills/webfont-format/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/webfont-format/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebfont-format%2Freferences%2Frule.md -->","isInternal":false,"tokens":5449,"sizeBytes":21395},{"name":"SKILL.md","path":"skills/webfont-format/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/webfont-format/SKILL.md","title":"webfont-format","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebfont-format%2FSKILL.md -->","frontmatter":{"name":"webfont-format","description":"Use when reviewing stylesheets, component styles, and responsive behavior related to Optimize web font formats. Check the rendered layout across breakpoints and interaction states before proposing a fix.","metadata":{"category":"css","priority":"medium","difficulty":"intermediate","estimatedTime":"20","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/css/webfont-format"}},"isInternal":false,"tokens":343,"sizeBytes":1672},{"name":"rule.md","path":"skills/webp-format/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/webp-format/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebp-format%2Freferences%2Frule.md -->","isInternal":false,"tokens":1307,"sizeBytes":4904},{"name":"SKILL.md","path":"skills/webp-format/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/webp-format/SKILL.md","title":"webp-format","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebp-format%2FSKILL.md -->","frontmatter":{"name":"webp-format","description":"Use when reviewing image assets, markup, and CDN or build transforms related to Use WebP format with fallbacks. Check encoded size, rendered size, loading strategy, and above-the-fold impact together.","metadata":{"category":"images","priority":"high","difficulty":"beginner","estimatedTime":"15","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/images/webp-format"}},"isInternal":false,"tokens":340,"sizeBytes":1541},{"name":"rule.md","path":"skills/webpagetest/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/webpagetest/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebpagetest%2Freferences%2Frule.md -->","isInternal":false,"tokens":6943,"sizeBytes":30099},{"name":"SKILL.md","path":"skills/webpagetest/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/webpagetest/SKILL.md","title":"webpagetest","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebpagetest%2FSKILL.md -->","frontmatter":{"name":"webpagetest","description":"Use when reviewing templates, rendered HTML, or shared components related to Analyze performance with WebPageTest. Validate the final browser-facing markup, not just the source framework abstraction.","metadata":{"category":"html","priority":"high","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/html/webpagetest"}},"isInternal":false,"tokens":340,"sizeBytes":1723},{"name":"rule.md","path":"skills/website-search/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/website-search/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebsite-search%2Freferences%2Frule.md -->","isInternal":false,"tokens":841,"sizeBytes":3893},{"name":"SKILL.md","path":"skills/website-search/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/website-search/SKILL.md","title":"website-search","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fwebsite-search%2FSKILL.md -->","frontmatter":{"name":"website-search","description":"Use when applies to sites with internal site search functionality. Use when optimizing branded search result appearance or adding structured data for the first time.","metadata":{"category":"seo","priority":"low","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/website-search"}},"isInternal":false,"tokens":479,"sizeBytes":2223},{"name":"rule.md","path":"skills/word-count/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/word-count/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fword-count%2Freferences%2Frule.md -->","isInternal":false,"tokens":1134,"sizeBytes":5275},{"name":"SKILL.md","path":"skills/word-count/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/word-count/SKILL.md","title":"word-count","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fword-count%2FSKILL.md -->","frontmatter":{"name":"word-count","description":"Use when applies to key landing pages, blog posts, product pages, and any page targeting competitive queries. Use when diagnosing poor rankings or after a Google Helpful Content update.","metadata":{"category":"seo","priority":"medium","difficulty":"beginner","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/word-count"}},"isInternal":false,"tokens":464,"sizeBytes":2310},{"name":"rule.md","path":"skills/x-content-type/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/x-content-type/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-content-type%2Freferences%2Frule.md -->","isInternal":false,"tokens":1009,"sizeBytes":4504},{"name":"SKILL.md","path":"skills/x-content-type/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/x-content-type/SKILL.md","title":"x-content-type","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-content-type%2FSKILL.md -->","frontmatter":{"name":"x-content-type","description":"Use when auditing HTTP response headers on any web server or CDN for security hardening.","metadata":{"category":"security","priority":"high","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/x-content-type"}},"isInternal":false,"tokens":457,"sizeBytes":2054},{"name":"rule.md","path":"skills/x-frame-options/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/x-frame-options/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-frame-options%2Freferences%2Frule.md -->","isInternal":false,"tokens":1144,"sizeBytes":5183},{"name":"SKILL.md","path":"skills/x-frame-options/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/x-frame-options/SKILL.md","title":"x-frame-options","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fx-frame-options%2FSKILL.md -->","frontmatter":{"name":"x-frame-options","description":"Use when reviewing HTTP response headers for clickjacking protection on any web application with authenticated user actions.","metadata":{"category":"security","priority":"high","difficulty":"beginner","estimatedTime":"5","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/security/x-frame-options"}},"isInternal":false,"tokens":487,"sizeBytes":2194},{"name":"rule.md","path":"skills/ymyl-detection/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/ymyl-detection/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fymyl-detection%2Freferences%2Frule.md -->","isInternal":false,"tokens":1358,"sizeBytes":5954},{"name":"SKILL.md","path":"skills/ymyl-detection/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/ymyl-detection/SKILL.md","title":"ymyl-detection","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fymyl-detection%2FSKILL.md -->","frontmatter":{"name":"ymyl-detection","description":"Use when applies to any site in health, medicine, finance, law, safety, news, or similar fields. Use when auditing content quality for sites in YMYL categories or investigating why high-quality-seeming content underperforms.","metadata":{"category":"seo","priority":"high","difficulty":"intermediate","estimatedTime":"10","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/seo/ymyl-detection"}},"isInternal":false,"tokens":531,"sizeBytes":2497},{"name":"rule.md","path":"skills/zoom-reflow/references/rule.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/zoom-reflow/references/rule.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fzoom-reflow%2Freferences%2Frule.md -->","isInternal":false,"tokens":1192,"sizeBytes":4586},{"name":"SKILL.md","path":"skills/zoom-reflow/SKILL.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/skills/zoom-reflow/SKILL.md","title":"zoom-reflow","category":"anthropic-skill","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=skills%2Fzoom-reflow%2FSKILL.md -->","frontmatter":{"name":"zoom-reflow","description":"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Support content reflow at 400% zoom. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.","metadata":{"category":"accessibility","priority":"critical","difficulty":"intermediate","estimatedTime":"30","source":"frontendchecklist.io","url":"https://frontendchecklist.io/rules/accessibility/zoom-reflow"}},"isInternal":false,"tokens":434,"sizeBytes":2121},{"name":"marketplace.json","path":".agents/plugins/marketplace.json","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/.agents/plugins/marketplace.json","title":"front-end-checklist","category":"marketplace","format":"json","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=.agents%2Fplugins%2Fmarketplace.json -->","frontmatter":{"name":"front-end-checklist","interface":{"displayName":"Front-End Checklist"},"plugins":[{"name":"front-end-checklist","source":{"source":"local","path":"./plugins/front-end-checklist"},"policy":{"installation":"AVAILABLE","authentication":"ON_INSTALL"},"category":"Developer Tools"}]},"isInternal":false,"tokens":105,"sizeBytes":409},{"name":"marketplace.json","path":".claude-plugin/marketplace.json","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/.claude-plugin/marketplace.json","title":"front-end-checklist","category":"marketplace","format":"json","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=.claude-plugin%2Fmarketplace.json -->","frontmatter":{"name":"front-end-checklist","owner":{"name":"David Dias","url":"https://thedaviddias.com"},"metadata":{"description":"Official Front-End Checklist plugin: the remote MCP server plus the global audit skill."},"plugins":[{"name":"front-end-checklist","source":"./plugins/front-end-checklist","description":"Review frontend code and live pages against 386 quality-gated rules for accessibility, performance, SEO, security, and HTML/CSS/JS best practices.","category":"development","homepage":"https://frontendchecklist.io/mcp"}]},"isInternal":false,"tokens":158,"sizeBytes":623},{"name":"README.md","path":"packages/analytics/README.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/packages/analytics/README.md","title":"analytics Documentation","category":"plugin-manifest","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Fanalytics%2FREADME.md -->","isInternal":false,"tokens":1193,"sizeBytes":5635},{"name":"README.md","path":"packages/cli/README.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/packages/cli/README.md","title":"cli Documentation","category":"plugin-manifest","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Fcli%2FREADME.md -->","isInternal":false,"tokens":606,"sizeBytes":2448},{"name":"README.md","path":"packages/rules/README.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/packages/rules/README.md","title":"rules Documentation","category":"plugin-manifest","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=packages%2Frules%2FREADME.md -->","isInternal":false,"tokens":120,"sizeBytes":545},{"name":"plugin.json","path":"plugins/front-end-checklist/.claude-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/plugins/front-end-checklist/.claude-plugin/plugin.json","title":"front-end-checklist","category":"plugin-manifest","format":"json","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2F.claude-plugin%2Fplugin.json -->","frontmatter":{"name":"front-end-checklist","version":"2.0.1","description":"Review frontend code and live pages against 386 quality-gated rules for accessibility, performance, SEO, security, and HTML/CSS/JS best practices.","author":{"name":"David Dias","url":"https://thedaviddias.com"},"homepage":"https://frontendchecklist.io/mcp","privacyPolicyUrl":"https://frontendchecklist.io/privacy","termsOfServiceUrl":"https://frontendchecklist.io/terms","supportUrl":"https://github.com/thedaviddias/Front-End-Checklist/issues","documentationUrl":"https://frontendchecklist.io/mcp","repository":"https://github.com/thedaviddias/Front-End-Checklist","license":"MIT","keywords":["frontend","accessibility","performance","seo","security","code-review","audit","mcp"]},"isInternal":false,"tokens":243,"sizeBytes":854},{"name":"plugin.json","path":"plugins/front-end-checklist/.codex-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/plugins/front-end-checklist/.codex-plugin/plugin.json","title":"front-end-checklist","category":"plugin-manifest","format":"json","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2F.codex-plugin%2Fplugin.json -->","frontmatter":{"name":"front-end-checklist","version":"2.0.1","description":"Review frontend code and live pages against 386 quality-gated rules for accessibility, performance, SEO, security, and HTML/CSS/JS best practices.","author":{"name":"David Dias","url":"https://thedaviddias.com"},"homepage":"https://frontendchecklist.io/mcp","repository":"https://github.com/thedaviddias/Front-End-Checklist","license":"MIT","keywords":["frontend","accessibility","performance","seo","security","code-review","audit","mcp"],"skills":"./skills/","mcpServers":"./.mcp.json","interface":{"displayName":"Front-End Checklist","shortDescription":"Audit frontend code and pages","longDescription":"Review frontend source and public HTTPS pages using quality-gated Front-End Checklist guidance for accessibility, performance, SEO, security, and modern web development. Static checks return supported findings and rule references; they do not execute JavaScript, measure Web Vitals, or certify WCAG compliance. MCP tools are read-only; your agent can apply suggested changes with your permission.","developerName":"David Dias","category":"Developer Tools","capabilities":["Read"],"websiteURL":"https://frontendchecklist.io/mcp","privacyPolicyURL":"https://frontendchecklist.io/privacy","termsOfServiceURL":"https://frontendchecklist.io/terms","defaultPrompt":["Review this component with the Front-End Checklist","Audit https://example.com for accessibility and SEO issues","Run the launch checklist before we ship"],"composerIcon":"./assets/logo.png","logo":"./assets/logo.png","brandColor":"#047857","supportURL":"https://github.com/thedaviddias/Front-End-Checklist/issues","brandColorDark":"#34D399"},"extensions":{"com.openai":{"review":{"demo_recording_url":"https://cloud.lab.coolio.cloud/index.php/s/dfqcAPTziF7ofy4","test_cases":{"positive":[{"description":"Review an unlabeled form","prompt":"Review this HTML with Front-End Checklist: <form><input type=\"email\" id=\"email\"><button type=\"submit\">Subscribe</button></form>","tools_triggered":"review_code","expected_behavior":"Identify the missing accessible label and return actionable rule guidance; do not claim a complete accessibility audit."},{"description":"Retrieve a rule","prompt":"Use Front-End Checklist to explain the alt-text rule and how to verify it.","tools_triggered":"get_rule","expected_behavior":"Return the alt-text rule, verification guidance, sources and decorative-image caveats."},{"description":"Find performance guidance","prompt":"Search Front-End Checklist for Largest Contentful Paint guidance.","tools_triggered":"search_rules","expected_behavior":"Return relevant rules and their slugs; do not invent measured performance results."},{"description":"Load a launch workflow","prompt":"Get the Front-End Checklist workflow for a pre-launch audit.","tools_triggered":"get_workflow","expected_behavior":"Return an available ordered launch workflow; use available slugs, do not invent one."},{"description":"Audit a public page","prompt":"Audit https://example.com with Front-End Checklist.","tools_triggered":"audit_url","expected_behavior":"Fetch the public page and return static HTML findings or a clear fetch error; do not claim browser execution."}],"negative":[{"description":"Private-network audit is unsupported","prompt":"Use Front-End Checklist to audit https://127.0.0.1/admin.","expected_behavior":"Refuse private-network fetching or return the tool safety error; offer review_code with user-provided sanitized source."},{"description":"Account data is unavailable","prompt":"Use Front-End Checklist to show another user's private checklist progress.","expected_behavior":"Explain that no account-data tool exists; do not invent data or attempt access."},{"description":"Certification is unsupported","prompt":"Use Front-End Checklist to certify that this snippet is fully WCAG compliant: <button>Save</button>.","expected_behavior":"Explain the limits of static checks and suggest browser, keyboard and assistive-technology verification; do not certify compliance."}]},"commerce":false,"commerce_description":"The MCP plugin does not sell products or process payments."},"publication":{"release_notes":"Initial plugin package with the hosted Front-End Checklist MCP, one global audit skill, and reviewer test cases."}}}},"isInternal":false,"tokens":1146,"sizeBytes":5342},{"name":"README.md","path":"plugins/front-end-checklist/README.md","rawUrl":"https://raw.githubusercontent.com/thedaviddias/Front-End-Checklist/HEAD/plugins/front-end-checklist/README.md","title":"front-end-checklist Documentation","category":"plugin-manifest","format":"markdown","content":"<!-- Skill available on-demand via /api/skills/thedaviddias/Front-End-Checklist?path=plugins%2Ffront-end-checklist%2FREADME.md -->","isInternal":false,"tokens":663,"sizeBytes":2816}],"systemPromptSnippet":"<yakaai_skills repo=\"thedaviddias/Front-End-Checklist\">\n<!-- File: AGENTS.md (Tokens: ~4916 | Category: root-instruction) -->\n# AGENTS.md — Front-End Checklist\n\nRepository rules and conventions for contributors and automation tools.\n\n## Project Overview\n\n**Front-End Checklist** is an open-source monorepo providing 385 quality-gated frontend best practice rules with an MCP server for structured review workflows.\n\n- **MCP Server**: `https://mcp.frontendchecklist.io` (11 tools)\n- **Rules**: `packages/content/rules/en/<category>/<slug>.mdx`\n- **Web App**: `apps/web/` (Next.js App Router)\n- **MCP Package**: `packages/mcp/` (TypeScript)\n- **Package Manager**: pnpm (workspaces + Turborepo)\n\n## Work Tracking\n\nWork in this repo is tracked in Paperclip project **FEC** (Front-End Checklist, id `c5edfe8f-731b-43e8-b805-c52999831084`). New tickets get the `DAV-` prefix.\n\n## MCP Usage\n\nWhen working on frontend implementation, review, debugging, or audit tasks, use the Front-End Checklist MCP server when available so recommendations stay grounded in the project rule corpus.\n\n- Use `review_code` first for pasted or inspected HTML, CSS, JavaScript, TypeScript, React, or Next.js code.\n- Use `search_rules` before making accessibility, performance, SEO, security, image, privacy, i18n, or testing recommendations.\n- Use `get_rule`, `check_rule`, `fix_rule`, or `explain_rule` for rule-specific guidance and remediation.\n- Use `get_workflow` or `get_checklist_rules` for broad launch, accessibility, SEO, security, performance, and testing audits.\n- Use `audit_url` for public `https://` pages.\n\nSome clients lazy-load installed MCP tools. If the tools are not initially visible, search for or explicitly request the Front-End Checklist MCP before proceeding with frontend work.\n\n## Monorepo Structure\n\n```\napps/\n  web/                    # Next.js app (App Router)\npackages/\n  mcp/                    # MCP server implementation\n  content/                # Rules MDX content + content-collections config\n  auth/                   # Better-Auth + Prisma + Supabase\n  design-system/          # Shared UI components\n  types/                  # Shared TypeScript types\n  data-layer/             # Data access layer\n  schemas/                # Zod v4 schemas\n```\n\n## Rule MDX Frontmatter Spec\n\nRules live at `packages/content/rules/en/<category>/<slug>.mdx`.\n\n### Required Fields\n\n```yaml\n---\ntitle: \"Human-readable rule title (string, use quotes)\"\ndescription: \"One-sentence description of what to do\"\ncategories: ['html']           # Array; first item = primaryCategory\npriority: 'high'               # 'critical' | 'high' | 'medium' | 'low'\ndifficulty: 'beginner'         # 'beginner' | 'intermediate' | 'advanced' | 'expert'\nestimatedTime: 15              # Minutes as integer\nprompts:\n  check: \"Prompt for checking whether the implementation follows this rule\"\n  fix: \"Prompt for fixing the issue\"\n  explain: \"Prompt for explaining why this rule matters\"\n---\n```\n\n### Recommended Fields\n\nThese fields are not required by the parser, but they materially improve rule quality, MCP usefulness, and generated skills.\n\n```yaml\nsubcategory: 'keyboard'        # Sub-grouping within category\ntldr:                          # Array of bullet points (used in llms.txt)\n  - \"Key point one\"\n  - \"Key point two\"\nwhyItMatters: \"Paragraph explaining the business/user impact\"\nsources:\n  - title: \"MDN or spec page title\"\n    url: \"https://...\"\n    type: \"mdn|spec|guide|wcag|google\"\n    id: \"stable-source-id\"\n    role: \"standard|reference|implementation|compatibility|regulation|search|research\"\n    authority: \"primary|secondary\"\nresources:\n  - name: \"Supplementary tool or article\"\n    url: \"https://...\"\n    type: \"tool|article|reference\"\nrelatedRules:\n  - slug: other-rule-slug\n    reason: \"Why these rules relate\"\ntools:\n  - name: \"Tool Name\"\n    url: \"https://...\"         # or null\ntags: ['wcag', 'performance']\nprompts:\n  codeReview: \"Recommended prompt for systematic code review context\"\naiContext: \"Additional context for automated review about when this rule applies\"\n```\n\nAuthoring placement rules:\n\n- Put authoritative citations in `sources`, not in body prose like `Reference: ...`\n- `sources` are proof metadata, not generic further reading. Every rule needs at least 2 sources, 2 source roles, and 1 `authority: primary`.\n- `resources` are for further reading or tools only. Do not map evidence claims to `resources`.\n- The system may infer or normalize `id`, `role`, and `authority` for sources at build time; authors should focus on strong, relevant sources rather than maintaining claim-by-claim proof objects.\n- Put cross-rule navigation in `relatedRules`, not in body prose like `See also ...`\n- Keep intro paragraphs focused on the rule itself; metadata should render from frontmatter-driven UI\n\nInline link contract:\n\n- Natural inline links inside body prose are allowed when they support a specific claim, comparison, or implementation recommendation.\n- Prefer light-touch density: usually `2-5` inline links per rule, with `0-1` in the intro and `1-3` across the main guidance sections.\n- Prefer external links over internal ones; internal rule links should usually stay at `0-1`, with `2` only for unusually interconnected rules.\n- Keep standalone metadata lines out of the body. Do not add paragraphs that start with `See also ...` or `Reference: ...`.\n- Keep evergreen proof in `sources`, and use newer inline external articles only when they add practical or recent context that the primary sources do not cover alone.\n- When a named tool is mentioned in prose for the first meaningful time (for example `Screaming Frog` or `Google Search Console`), link that first mention if the tool materially helps the reader and already exists in `resources` or `tools`.\n- Approved secondary inline links should stay curated. Prefer strong platforms such as `CSS-Tricks`, `Smashing Magazine`, `Nielsen Norman Group`, `WebAIM`, `Screaming Frog`, `Sitebulb`, `Moz`, or `Yoast` when they add practical implementation context.\n- Use descriptive anchor text tied to the sentence claim, not generic labels like “read more”.\n\n`impact`, `standards`, and `automation` are intentionally not part of the active rule-writing contract right now. The current corpus and tooling do not consume them consistently enough to justify treating them as standard authoring fields.\n\n## Canonical Rule Shape\n\nNew and refreshed rules should follow this structure unless there is a strong reason not to:\n\n1. Short intro paragraph explaining the rule in plain language\n2. `## Code Example` or `## Code Examples`\n3. `## Why It Matters`\n4. Optional implementation or guidance sections\n5. `## Verification`\n\nCanonical ordering rules:\n\n- `## Code Example` or `## Code Examples` must appear before `## Why It Matters`\n- `## Why It Matters` must appear before `## Verification`\n- `## Verification` must be the final H2 in the rule body\n- Optional H2 sections belong between `## Why It Matters` and `## Verification`\n\nPreferred optional H2 taxonomy:\n\n- `## Best Practices`\n- `## Common Mistakes`\n- `## Framework Examples`\n- `## Tools & Validation`\n- `## Thresholds`\n- `## Exceptions`\n- `## Browser Support`\n- `## Support Notes`\n- `## Standards`\n- `## Implementation Notes`\n\nThe validator reports headings outside this preferred taxonomy so section sprawl stays visible over time.\n\nRule Contract V2 adds three conditional concepts:\n\n- `## Exceptions` for nuanced rules, false positives, or valid caveats\n- `### Automated Checks` and `### Manual Checks` inside `## Verification` when both matter\n- a short visible standards/support note for compatibility-sensitive or compliance-sensitive rules\n\nApply these conditionally, not universally.\n\nBrowser support guidance should be derived from the repo browser policy in `.browserslistrc` plus package-backed compatibility data, not from memory.\n\nUse explicit thresholds whenever the rule is measurable:\n\n- Web Vitals and performance metrics (`LCP <= 2.5s`, `CLS <= 0.1`, bundle or image size budgets)\n- Accessibility measurements (contrast ratios, target sizes, zoom or reflow thresholds)\n- SEO and crawling states (indexability, status codes, canonical-url behavior)\n- Security headers and transport requirements\n\nPrefer “how to verify” guidance over generic advice. A strong rule should tell an engineer exactly how to confirm the rule passes.\n\n### Common Mistakes to Avoid\n\n- **Unquoted colons in YAML**: Always quote strings containing `:` — e.g. `title: \"Use rel: new-tab\"` not `title: Use rel: noopener`\n- **Stub prompts**: Prompts must be actionable. Bad: `\"Check this rule\"`. Good: `\"Find all <img> elements missing an alt attribute in this HTML\"`\n- **Missing sources**: Add at least one authoritative reference (`MDN`, `W3C/WCAG`, specs, `web.dev`, or product docs) before considering a rule complete\n- **No verification path**: Include a final `## Verification` section so the fix is testable\n- **Verification not last**: Do not place additional H2 sections after `## Verification`\n- **Missing caveats**: Add `## Exceptions` when the rule has important false positives or valid exceptions\n- **Missing support note**: Add `## Browser Support`, `## Support Notes`, or a visible standards note when compatibility or compliance changes implementation decisions\n- **Wrong priority**: `critical` = site-breaking / security / legal. `high` = significantly degrades UX. `medium` = best practice. `low` = nice-to-have\n- **Missing required fields**: All 7 required fields must be present; builds fail otherwise\n- **Emoji in titles**: Titles should be plain text (no emoji)\n\n## Category Taxonomy\n\nValid values for the `categories` array:\n\n| Slug | Description |\n|------|-------------|\n| `html` | Document structure, semantics, forms |\n| `css` | Layout, typography, animation, responsive |\n| `javascript` | Client-side scripting, async, security |\n| `performance` | Loading speed, rendering, Core Web Vitals |\n| `accessibility` | WCAG, ARIA, keyboard, screen readers |\n| `seo` | Meta tags, structured data, crawlability |\n| `security` | HTTPS, CSP, XSS prevention, headers |\n| `images` | Optimization, formats, responsive images |\n| `testing` | Unit, integration, e2e, a11y testing |\n| `privacy` | Consent, data minimisation, data rights |\n| `i18n` | Localization, pluralization, bidi, locale formatting |\n| `general` | Cross-cutting best practices |\n\n## Quality Scoring Rubric\n\nRules are scored automatically via `pnpm score:rules` (100-point base score plus up to 12 conditional points, minimum 50 to pass the current quality gate).\n\n| Dimension | Points | What to Check |\n|-----------|--------|---------------|\n| Prompts (`check`/`fix`/`explain`) | 24 | All 3 prompts are specific and non-generic |\n| TLDR bullets | 4 | 3+ actionable bullets |\n| Why it matters | 4 | Explains user, business, or operational impact |\n| AI context | 6 | Captures where and when the rule applies in automated reviews |\n| Related rules | 6 | Links adjacent rules with clear reasons |\n| Sources | 10 | Includes authoritative references |\n| Resources / tools | 6 | Includes useful supporting docs or tools |\n| Code review prompt | 6 | Provides a systematic review strategy |\n| Code examples | 10 | Includes realistic examples, not just prose |\n| Body depth | 10 | Provides substantive implementation detail |\n| Verification section | 8 | Includes `Verification`, `Testing`, `Audit Checklist`, or equivalent |\n| Thresholds / pass-fail criteria | 6 | Uses explicit numbers or conditions where the rule is measurable |\n| Exceptions (conditional) | 4 | Adds an `Exceptions` section when the rule is nuanced or false-positive-prone |\n| Verification split (conditional) | 4 | Splits verification into automated and manual checks when both apply |\n| Standards/support visibility (conditional) | 4 | Adds a visible threshold, standards note, or support note when required by the rule type |\n\nRules scoring < 50 are excluded from MCP tool responses and the web UI.\n\n## Adding or Updating a Rule\n\n1. Create `packages/content/rules/en/<category>/<slug>.mdx`\n2. Fill all required frontmatter fields\n3. Add recommended metadata: `sources`, `resources`, `aiContext`, `relatedRules`, and `prompts.codeReview` where applicable\n4. Write the rule using the canonical-url structure (intro, examples, why it matters, verification, category-specific guidance)\n5. Run `pnpm score:rules` — must score ≥ 50 for now; target 60+ for new work\n6. Run `pnpm validate:rule-structure` — validates rule section order and final `Verification` heading\n7. Run `pnpm report:rule-links` — reviews inline-link density and suggests safe internal/external candidates\n8. Run `pnpm validate:sources` — validates external URLs\n9. Run `pnpm generate:skills` — regenerates skills index\n\n## Scripts Reference\n\n```bash\npnpm score:rules          # Score all rules; flags < 50 quality gate failures\npnpm validate:rule-structure  # Validate rule heading structure and report drift\npnpm report:v2-gaps       # Report conditional V2 gaps by category and migration batch\npnpm report:rule-links    # Review inline-link density and candidate internal/external links\npnpm generate:exceptions-hints  # Dry-run suggestions for missing Exceptions sections\npnpm generate:support-notes  # Dry-run support-note suggestions from browser data\npnpm generate:verification-split  # Dry-run Verification split suggestions\npnpm validate:sources     # Validate external URLs in rule frontmatter\npnpm validate:packages    # Check package dependency consistency\npnpm generate:skills      # Regenerate skills/ directory from rules\npnpm build                # Full monorepo build (via Turborepo)\npnpm typecheck            # TypeScript check across all packages\npnpm lint                 # Biome lint\npnpm lint:fix             # Biome lint with auto-fix\n```\n\n## MCP Tool Development\n\nNew MCP tools go in `packages/mcp/src/tools/<tool-name>.ts` and must be:\n\n1. Exported from `packages/mcp/src/tools/index.ts`\n2. Added to `BASE_TOOL_DEFINITIONS` in `packages/mcp/src/server.ts`\n3. Added as a `case` in the `handleToolsCall` switch in `server.ts`\n\nTool definition shape:\n```typescript\nexport const myToolDefinition = {\n  name: 'my_tool',\n  description: '...',  // Critical for tool discoverability — be specific\n  inputSchema: {\n    type: 'object' as const,\n    properties: { ... },\n    required: ['fieldName'],\n  },\n}\n```\n\n## Workspace Architecture Notes\n\n- **Auth**: Better-Auth + Prisma + Supabase Postgres in `packages/auth/`\n- **Validation**: Zod v4 — use `.issues` not `.errors` on `ZodError`\n- **Forms**: `@tanstack/react-form` with manual Zod validation on submit\n- **Email**: Resend SDK v6, sending domain `mail.frontendchecklist.io`\n- **Rate limiting**: `@upstash/ratelimit` + `@upstash/redis` in `apps/web/lib/rate-limit.ts`\n- **Query**: TanStack Query v5 with `getQueryClient()` factory (not singleton)\n- **Dev server**: `portless run next dev`\n\n## Learned User Preferences\n\n- Put shared concerns (e.g. fonts, typography) in the design system and import from there; apps wire implementation (e.g. next/font) using config from the design system.\n- Do not use `suppressHydrationWarning`; fix server/client mismatch (e.g. defer client-only state until after mount).\n- Reuse existing components instead of creating page-specific variants (e.g. shared `FAQAccordion` for any FAQ section, `.code-block`/`.code-inline` for all code display, ChecklistActionBar instead of new progress bars). When adding a feature to one page type, add it to all relevant page types (e.g. ShareButton on category, rule detail, and all-rules pages).\n- Rule row: click on rule title toggles completion; expand/collapse only via the plus/minus icon. Expanded content shows description first, then tags and action buttons on one row aligned with the description.\n- Prefer Tailwind utility classes in components over custom CSS classes in globals.css.\n- Use a scalable overrides map for special-case labels (e.g. subcategory aria → ARIA) instead of hardcoded conditionals.\n- Do not use `git commit --no-verify`; fix ALL pre-commit violations (JSDoc, as-casts, barrel files, complexity, relative imports) rather than deferring or working around them. Write JSDoc at the same time as the code, not as a batch fix later.\n- **Card-style links**: Use the stretched-link pattern: the `<a>`/`<Link>` wraps **only the title text** inside a heading and uses `after:absolute after:inset-0 after:content-[\"\"]` so its `::after` pseudo-element expands to fill the card container (`position: relative`). Secondary interactive elements need `relative z-10`. See `docs/card-links.md`.\n- Centralize all icons in `@repo/design-system`: brand icons in `brand-icons.tsx`, Lucide re-exported from `icons.ts`. Use official brand icons (`@icons-pack/react-simple-icons`) for branded services, not Lucide approximations. Consumers never import directly from `lucide-react`.\n- Never use Tailwind opacity modifiers (`/50`, `/60`, `/70`) on semantic theme text colors like `text-foreground-muted` — it crushes contrast in light mode. Use the appropriate token (`text-foreground-muted`, `text-foreground-subtle`) at full opacity instead.\n- Always refer to the social platform as \"X\", never \"Twitter\". Schema fields use `xUrl` (not `twitterUrl`), UI labels say \"X\", and URLs point to `x.com`.\n- About page link belongs in the footer only, not in the main navbar.\n\n## Learned Workspace Facts\n\n- Fluid typography tokens use `clamp()` in `@theme inline` for `text-base` and above; `text-xs` and `text-sm` stay fixed for compact UI controls (buttons, badges, inputs, tooltips).\n- next/font: apply each font’s `.className` to the document element (not `.variable`); Next.js requires literal option objects, so the app must inline font options while the design system can document them.\n- Do not apply client-side bot protection (e.g. Vercel BotID) to programmatic API endpoints like MCP; use it only for browser-originated form and mutation endpoints.\n- Next.js reads next.config.js at startup; restart the dev server after changing it (e.g. images.remotePatterns). `withContentCollections` returns a Promise (async config) so it must be the outermost wrapper — `export default withContentCollections(withBotId(nextConfig))`. `withBotId` does not handle async configs and will silently drop all properties including `images`.\n- Tailwind preflight resets `list-style` on `ul`/`ol`; `.prose` styles must explicitly set `list-style-type: disc` (ul), `decimal` (ol), and nested variants (`circle`, `lower-alpha`).\n- CSS custom properties use OKLCH color format. Light mode tokens need visible contrast on all screens: `--border` at least oklch(0.885), `--foreground-subtle` at oklch(0.64), shadows at 0.06+ opacity. Use `color-mix(in oklch, var(--token) N%, transparent)` for theme-aware transparent colors instead of hardcoded `rgba()`.\n- Pre-commit hooks (lefthook) enforce: biome check, JSDoc, no-as-casts, no-barrel-files, file-complexity (300 lines React / 500 lines other), no-deep-relative-imports, no-console-logs, test coverage.\n- Button default variant uses `bg-accent text-accent-foreground hover:bg-accent-hover` (project's accent tokens), not shadcn's `bg-primary`; keep project-specific semantic tokens in component variants even when shadcn aliases exist.\n- Scripts are organized in subfolders: `scripts/{validation,generate,rule-structure,validate,audit}/`; `scripts/README.md` documents each script and subfolder.\n- Biome's `useSortedClasses` only sorts class **order**; it cannot rename deprecated classes. Use `@tailwindcss/upgrade` (installed in `apps/web`) to canonicalize class names project-wide.\n- Monorepo uses pnpm catalogs (`catalog:` in `pnpm-workspace.yaml`) for centralized dependency versions; shared deps appearing in 2+ packages use `catalog:` instead of hardcoded version strings.\n- Brand icons (ChatGPT, Claude, X, LinkedIn, Reddit, Cursor, VSCode) live in `packages/design-system/src/brand-icons.tsx` and are re-exported from the design-system barrel.\n\n<!-- BEGIN:turborepo-agent-rules -->\n\n# This is NOT the Turborepo you know\n\nTurborepo configuration, task behavior, and CLI commands can vary between installed versions and may differ from your training data. Resolve the `turbo` package from this file's directory or relevant workspace; in monorepos, it may not be visible from the repository root. For example, run `node -p \"require.resolve('turbo/package.json')\"` from a workspace that depends on `turbo`.\n\nRead `docs/README.md` inside that installed package first, then read the relevant pages from its `docs/` directory before changing Turborepo configuration or commands. Heed deprecation notices. These bundled docs match the installed package version and are available without network access.\n\nThis block is written and re-added by `turbo` before repository-scoped commands when an AI agent is detected. In the Turborepo source repository, its template is defined in `crates/turborepo-cli/src/cli/agent_guidance.rs`. Removing the managed block while updates are enabled means a later qualifying invocation will add it again. Set `\"agentGuidance\": false` in the root `turbo.json` or `turbo.jsonc` to opt out; this does not remove an existing block. Keep the block committed with your work to avoid an uncommitted change on the next agent invocation.\n<!-- END:turborepo-agent-rules -->\n\n<!-- File: CLAUDE.md (Tokens: ~47 | Category: claude-rule) -->\n# Project Guidance\n\nUse [AGENTS.md](AGENTS.md) for repository conventions, workflows, and tool setup.\n\nLocal Claude Code session state belongs in `.claude/`, which is ignored by git and should not be committed.\n\n<!-- File: packages/cli/SKILL.md (Tokens: ~698 | Category: anthropic-skill) -->\n---\nname: frontendchecklist\ndescription: Review frontend code and live pages against the Front-End Checklist (380+ rules for accessibility, performance, SEO, security, HTML, CSS, JavaScript, images, i18n, privacy, testing) using the `frontendchecklist` CLI. Use when writing, reviewing, or shipping HTML/CSS/JS/JSX/TSX/Vue/Svelte/Astro code, before a commit or PR, or when asked to audit a public URL.\n---\n\n# Front-End Checklist CLI\n\n`frontendchecklist` checks frontend code against the Front-End Checklist rules. It works offline,\nprints JSON when its output is piped (which is how you will usually call it), and uses exit codes\nyou can branch on.\n\nRun it with `npx -y @frontendchecklist/cli <command>` if `frontendchecklist` is not installed.\n\n## When to use it\n\n- After writing or editing frontend files: `frontendchecklist review <paths>`.\n- Before committing: `git diff --cached | frontendchecklist review -`.\n- When the user asks to audit a deployed page: `frontendchecklist audit https://...`.\n- When you need the authoritative guidance for a topic: `frontendchecklist search <topic>`, then\n  `frontendchecklist rule <slug>`.\n- For a structured pass (launch, accessibility, SEO, performance): `frontendchecklist checklists`,\n  then `frontendchecklist checklist <slug>`.\n\n## Commands\n\n| Command | Purpose |\n| --- | --- |\n| `review <paths...\\|->` | Static review of files, directories (walked; vendor dirs skipped), or stdin |\n| `audit <https-url>` | Fetch a public page and review its HTML |\n| `search [query] [--focus a,b] [-n 10]` | Find rules by keyword, technology, or category |\n| `rule <slug>` | Why a rule matters, how to check it, how to fix it |\n| `checklists` / `checklist <slug>` | Curated checklists and their rules |\n| `categories` | Categories with rule counts |\n| `schema` | Full command reference as JSON |\n\nUseful flags: `--focus accessibility,seo`, `--min-priority high`, `--fail-on high`.\n\n## Reading results\n\n- `review` and `audit` return `{ findings: [{ target, rule, title, priority, issue, fix? }], failing }`.\n- Exit code `0`: fine. `1`: findings at or above `--fail-on`. `2`: bad input or runtime error, with\n  `{ \"error\": \"...\" }` on stdout.\n- Findings are conservative static heuristics. \"No findings\" means nothing provable was found, not\n  that the code is clean: follow up with `search`/`rule` for areas the heuristics cannot see\n  (rendered contrast, focus order, real performance).\n\n## Workflow\n\n1. `frontendchecklist review <changed files> --min-priority medium`\n2. For each finding, run `frontendchecklist rule <rule>` and apply its fix guidance.\n3. Re-run the review until no critical/high findings remain (`--fail-on high` exits 0).\n4. Mention any remaining medium/low findings to the user instead of silently ignoring them.\n\n<!-- File: plugins/front-end-checklist/skills/frontend-checklist-global/references/categories.md (Tokens: ~1865 | Category: anthropic-skill) -->\n# Front-End Checklist Global Skill Reference\n\nThis aggregate skill routes to the Front-End Checklist MCP tools across 386 rules.\n\n## Tool Routing\n\n| Goal | Preferred tool |\n| --- | --- |\n| Review pasted code or a single file | `review_code` |\n| Audit a public page | `audit_url` |\n| Find relevant rules by topic | `search_rules` |\n| Browse available categories | `list_categories` |\n| Get the full content for one rule | `get_rule` |\n| Get remediation guidance | `fix_rule` |\n| Explain impact to the user | `explain_rule` |\n| Pull a curated checklist at once | `get_checklist_rules` |\n| Start from a workflow or quick checklist | `get_workflow`, `get_quick_reference` |\n\n## Frontend Review Guardrails\n\n- Do not infer missing metadata from a component fragment that is not responsible for document head output.\n- Do not infer required fields, password policies, or decorative-image intent unless the code makes the intent explicit.\n- Favor exact evidence from the snippet over broad style advice.\n- When the snippet is a partial component, focus on what the component itself controls.\n\n## Rule-Derived Highlights\n\n- **Set explicit width and height on images**\n  Reserve findings for meaningful content images; decorative micro-SVGs or ornament-only assets are low-priority exceptions when CSS already reserves stable space\n  Example low-risk exception: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` should not be flagged on its own without evidence of visible layout shift\n  Always set `width` and `height` attributes on `<img>` matching the image's intrinsic dimensions\n  Pair with `height: auto` in CSS to keep the image fluid while preserving the aspect ratio\n  Missing dimensions are the leading cause of Cumulative Layout Shift (CLS) from images\n- **Hide decorative elements from assistive technology**\n  Use alt='' (empty) for decorative images—not alt='image' or missing alt\n  Add aria-hidden='true' to decorative SVGs and icons\n  Use CSS background-image for purely decorative visuals\n  Role='presentation' removes semantic meaning from elements\n  Do not automatically raise performance findings on decorative micro-assets unless the snippet shows real layout instability\n- **Use transform and opacity for animations**\n  Only transform and opacity can be composited on the GPU without triggering layout\n  Use will-change: transform sparingly to promote an element to its own compositor layer\n  Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n  Respect prefers-reduced-motion to disable animations for users who need it\n- **Respect reduced motion preferences**\n  Use prefers-reduced-motion media query to disable non-essential animations\n  Never flash content more than 3 times per second (seizure risk)\n  Replace motion with opacity/color transitions when reduced motion is enabled\n  Provide user controls to pause or disable animations\n- **Use semantic table markup for screen readers**\n  Use <th> elements for headers with scope='col' or scope='row'\n  Add <caption> to describe the table's purpose\n  Never use tables for layout—use CSS Grid or Flexbox instead\n  Use id/headers for complex tables with merged cells\n  For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n- **Define proper table headers**\n  Use `<th>` for all table headers, not `<td>`\n  Apply `scope=\"col\"` or `scope=\"row\"` to clarify header relationship\n  Ensure every data cell is associated with at least one header\n  In simple tables, prefer fixing header associations before escalating to caption-level recommendations\n  Missing `scope=\"col\"` on a straightforward header row is often the clearest first fix\n- **Minimize costly DOM read/write operations**\n  Never interleave DOM reads (offsetHeight, getBoundingClientRect) with DOM writes (style changes)\n  Batch all reads first, then all writes\n  Use requestAnimationFrame for visual updates\n  Use DocumentFragment or innerHTML for bulk DOM insertion\n  Avoid per-frame React state updates across many visible components when a simpler CSS or reduced-frequency approach would work\n- **Validate forms accessibly**\n  Associate error messages with fields using aria-describedby\n  Use aria-invalid to indicate validation state\n  Mark required fields programmatically with `required` or `aria-required`\n  Provide inline error messages near the field\n  Don't rely solely on color to indicate errors\n- **Secure password input fields**\n  Use type='password' with correct autocomplete attribute\n  Provide accessible show/hide toggle for password visibility\n  Show password strength indicator with requirements\n  Never store or transmit passwords in plain text\n  Support password managers with proper input names\n- **Provide visible custom focus indicators**\n  Never use outline: none or outline: 0 without a visible :focus-visible replacement\n  Use :focus-visible instead of :focus to show indicators only during keyboard navigation\n  Focus indicators must have 3:1 contrast ratio against adjacent colors (WCAG 2.2)\n  Provide at least 2px solid outline with an offset for a high-quality focus ring\n  If a focus ring is drawn with pseudo-elements, verify it is anchored to the correct positioned element and not clipped by `overflow: hidden`\n\n## Known Safe Patterns\n\n- **Decorative Divider**\n  Safe example: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">`\n  Treat this as a safe decorative pattern by default. Do not flag alt text or missing dimensions unless the snippet also shows a real layout-shift risk.\n- **Client-Handled React Form**\n  Safe example: `<form onSubmit={event => event.preventDefault()}><label htmlFor=\"q\">Search</label><input id=\"q\" type=\"search\" /></form>`\n  Do not require `method` or `action` when client-side submit handling is explicit and the form controls are otherwise accessible.\n- **Next Metadata API**\n  Safe example: `export async function generateMetadata() { return { title: 'Docs', description: 'Reference' } }`\n  Do not infer missing canonical-url, meta description, or Open Graph tags just because literal `<head>` markup is absent from the component file.\n- **Preview Card Images**\n  Safe example: `<img src={resource.image} alt=\"\" className=\"object-cover\" /><img src={favicon} alt=\"\" width={20} height={20} />`\n  In link-preview or resource-card UIs, decorative preview/favicons can legitimately use empty alt when adjacent text already provides the destination name. Do not invent responsive-image or layout-shift defects for tiny favicon assets without stronger evidence.\n- **Aspect-Ratio Media Wrapper**\n  Safe example: `<div className=\"aspect-2/1 overflow-hidden\"><img className=\"object-cover w-full h-full\" ... /></div>`\n  When a wrapper already reserves media space with a stable aspect ratio, do not automatically raise a missing dimensions finding for the child preview image.\n- **Pseudo-Element Focus Ring**\n  Safe example: `focus-visible:outline-none focus-visible:after:ring-2 after:absolute after:inset-0`\n  If focus styling depends on a pseudo-element, verify the ring is anchored to the correct positioned element. A removed native outline is only safe when the replacement ring is clearly reliable.\n- **Per-Frame React Counter Animation**\n  Safe example: `requestAnimationFrame(animate); setCount(Math.floor(eased * target))`\n  Repeated requestAnimationFrame state updates across multiple components are a concrete performance concern when shown directly in the code.\n- **Simple Data Table Headers**\n  Safe example: `<thead><tr><th>Priority</th><th>Rule</th><th>Title</th></tr></thead>`\n  For simple data tables, prefer conservative column-header findings before speculating about row headers or outer-layout landmarks.\n- **Adjacent Heading + Table**\n  Safe example: `<h2>Issues</h2><table><thead>...</thead><tbody>...</tbody></table>`\n  A nearby visible section heading may already provide table context. Prefer scope/header association findings before requiring a caption unless the table purpose is ambiguous.\n\n## Category Coverage\n\n- **accessibility**: 89 rules · 9 critical · 25 high\n- **css**: 31 rules · 10 high\n- **html**: 34 rules · 3 critical · 12 high\n- **i18n**: 5 rules\n- **images**: 25 rules · 1 critical · 15 high\n- **javascript**: 26 rules · 1 critical · 12 high\n- **performance**: 43 rules · 1 critical · 22 high\n- **privacy**: 5 rules · 2 high\n- **security**: 22 rules · 4 critical · 10 high\n- **seo**: 93 rules · 19 high\n- **testing**: 13 rules · 7 high\n\nRules browser: https://frontendchecklist.io/rules\nFull reference: https://frontendchecklist.io/llms-full.txt\n\n<!-- File: plugins/front-end-checklist/skills/frontend-checklist-global/SKILL.md (Tokens: ~2644 | Category: anthropic-skill) -->\n---\nname: frontend-checklist-global\ndescription: \"Use when auditing or improving any frontend codebase against the full Front-End Checklist rule corpus through one entry point.\"\nmetadata:\n  category: global\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"30\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/mcp\n---\n\n# Front-End Checklist Global Audit\n\nThis skill connects one entry point to all 386 Front-End Checklist rules.\nUse MCP retrieval instead of trying to recall rules from memory.\n\n## Workflow\n\n1. Start with `review_code` for pasted code, file contents, or focused code review.\n2. Use `audit_url` for a public page when you need rendered HTML audited quickly.\n3. Narrow or expand scope with `search_rules`, `list_categories`, `get_workflow`, or `get_quick_reference`.\n4. For each issue, use `get_rule`, `fix_rule`, or `explain_rule` to give exact remediation.\n5. If a checklist is a better fit than ad hoc search, use `get_checklist_rules`.\n\n## Audit Stance\n\n- Be conservative. Prefer fewer, stronger findings over speculative breadth.\n- Only report an issue when the code or markup shown supports it directly.\n- In small component or route audits, prefer the strongest 1-2 supported findings over listing every possible enhancement.\n- Do not infer business intent from a snippet alone. Example: do not assume a field is required unless the code or surrounding copy makes that explicit.\n- Do not treat `alt=\"\"` as an issue by default; empty alt can be correct for decorative images.\n- When an image is explicitly decorative, prefer zero findings unless the snippet shows a concrete problem rather than a hypothetical optimization.\n- If you see an isolated decorative image like `<img ... alt=\"\" aria-hidden=\"true\">`, treat it as a zero-issue pattern unless the snippet also shows real evidence of layout instability.\n- Do not raise low-confidence preference tweaks as findings when the snippet is otherwise sound. Prefer silence over weak nitpicks.\n- Do not treat `autocomplete=\"off\"` as a defect by itself unless the snippet shows a stronger user-harm or security reason to flag it.\n- In link-preview cards, decorative preview images and favicons may be safe when nearby visible text already names the destination.\n- Do not treat React or JSX fragments as full HTML documents unless the snippet includes real document context like `<html>`, `<head>`, or `<body>`.\n- When reviewing Next.js or metadata-driven page files, consider `metadata`, `viewport`, and `generateMetadata` APIs before claiming head-tag omissions.\n\n## Coverage Checklist\n\n- Forms: check labels, accessible button names, explicit button types, `autocomplete` hints, password-field autocomplete, and validation semantics that are explicit in the code.\n- Images: check `width`/`height`, `loading`, `srcset`/`sizes`, and whether image semantics are clearly meaningful or decorative. Do not assume tiny SVG logos or clearly decorative assets must be lazy-loaded, and do not demand explicit dimensions for tiny ornamental dividers unless the snippet shows a real layout-shift risk. If an image is both decorative and hidden from assistive tech, bias strongly toward no finding.\n- Metadata: check title placement, canonical-url behavior, meta descriptions, Open Graph coverage, and structured data only when the file is responsible for metadata.\n- Motion: check expensive animated properties, prefer transform/opacity, and require `prefers-reduced-motion` handling for persistent motion.\n- Motion: when counters or visual widgets animate every frame, assess both reduced-motion support and whether the animation strategy adds unnecessary main-thread work.\n- Security: check `target=\"_blank\"` links for `noopener noreferrer`, insecure form actions, password input best practices, and blocking third-party scripts.\n- Structure: check duplicate ids, list semantics, and table headers conservatively. For simple tables, column-header associations are stronger findings than speculative row-header or outer-layout landmark issues.\n- Structure: when a visible heading already introduces a simple table, treat missing captions as a lower-confidence improvement than missing header associations.\n\n## Rule-Derived Highlights\n\n### Set explicit width and height on images\n- Reserve findings for meaningful content images; decorative micro-SVGs or ornament-only assets are low-priority exceptions when CSS already reserves stable space\n- Example low-risk exception: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` should not be flagged on its own without evidence of visible layout shift\n- Always set `width` and `height` attributes on `<img>` matching the image's intrinsic dimensions\n- Pair with `height: auto` in CSS to keep the image fluid while preserving the aspect ratio\n- Missing dimensions are the leading cause of Cumulative Layout Shift (CLS) from images\n\n### Hide decorative elements from assistive technology\n- Use alt='' (empty) for decorative images—not alt='image' or missing alt\n- Add aria-hidden='true' to decorative SVGs and icons\n- Use CSS background-image for purely decorative visuals\n- Role='presentation' removes semantic meaning from elements\n- Do not automatically raise performance findings on decorative micro-assets unless the snippet shows real layout instability\n\n### Use transform and opacity for animations\n- Only transform and opacity can be composited on the GPU without triggering layout\n- Use will-change: transform sparingly to promote an element to its own compositor layer\n- Prefer CSS transitions and animations over JavaScript animation libraries for simple effects\n- Respect prefers-reduced-motion to disable animations for users who need it\n\n### Respect reduced motion preferences\n- Use prefers-reduced-motion media query to disable non-essential animations\n- Never flash content more than 3 times per second (seizure risk)\n- Replace motion with opacity/color transitions when reduced motion is enabled\n- Provide user controls to pause or disable animations\n\n### Use semantic table markup for screen readers\n- Use <th> elements for headers with scope='col' or scope='row'\n- Add <caption> to describe the table's purpose\n- Never use tables for layout—use CSS Grid or Flexbox instead\n- Use id/headers for complex tables with merged cells\n- For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n\n### Define proper table headers\n- Use `<th>` for all table headers, not `<td>`\n- Apply `scope=\"col\"` or `scope=\"row\"` to clarify header relationship\n- Ensure every data cell is associated with at least one header\n- In simple tables, prefer fixing header associations before escalating to caption-level recommendations\n- Missing `scope=\"col\"` on a straightforward header row is often the clearest first fix\n\n### Minimize costly DOM read/write operations\n- Never interleave DOM reads (offsetHeight, getBoundingClientRect) with DOM writes (style changes)\n- Batch all reads first, then all writes\n- Use requestAnimationFrame for visual updates\n- Use DocumentFragment or innerHTML for bulk DOM insertion\n- Avoid per-frame React state updates across many visible components when a simpler CSS or reduced-frequency approach would work\n\n### Validate forms accessibly\n- Associate error messages with fields using aria-describedby\n- Use aria-invalid to indicate validation state\n- Mark required fields programmatically with `required` or `aria-required`\n- Provide inline error messages near the field\n- Don't rely solely on color to indicate errors\n\n### Secure password input fields\n- Use type='password' with correct autocomplete attribute\n- Provide accessible show/hide toggle for password visibility\n- Show password strength indicator with requirements\n- Never store or transmit passwords in plain text\n- Support password managers with proper input names\n\n### Provide visible custom focus indicators\n- Never use outline: none or outline: 0 without a visible :focus-visible replacement\n- Use :focus-visible instead of :focus to show indicators only during keyboard navigation\n- Focus indicators must have 3:1 contrast ratio against adjacent colors (WCAG 2.2)\n- Provide at least 2px solid outline with an offset for a high-quality focus ring\n- If a focus ring is drawn with pseudo-elements, verify it is anchored to the correct positioned element and not clipped by `overflow: hidden`\n\n## Known Safe Patterns\n\n### Decorative Divider\n- Safe example: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">`\n- Treat this as a safe decorative pattern by default. Do not flag alt text or missing dimensions unless the snippet also shows a real layout-shift risk.\n\n### Client-Handled React Form\n- Safe example: `<form onSubmit={event => event.preventDefault()}><label htmlFor=\"q\">Search</label><input id=\"q\" type=\"search\" /></form>`\n- Do not require `method` or `action` when client-side submit handling is explicit and the form controls are otherwise accessible.\n\n### Next Metadata API\n- Safe example: `export async function generateMetadata() { return { title: 'Docs', description: 'Reference' } }`\n- Do not infer missing canonical-url, meta description, or Open Graph tags just because literal `<head>` markup is absent from the component file.\n\n### Preview Card Images\n- Safe example: `<img src={resource.image} alt=\"\" className=\"object-cover\" /><img src={favicon} alt=\"\" width={20} height={20} />`\n- In link-preview or resource-card UIs, decorative preview/favicons can legitimately use empty alt when adjacent text already provides the destination name. Do not invent responsive-image or layout-shift defects for tiny favicon assets without stronger evidence.\n\n### Aspect-Ratio Media Wrapper\n- Safe example: `<div className=\"aspect-2/1 overflow-hidden\"><img className=\"object-cover w-full h-full\" ... /></div>`\n- When a wrapper already reserves media space with a stable aspect ratio, do not automatically raise a missing dimensions finding for the child preview image.\n\n### Pseudo-Element Focus Ring\n- Safe example: `focus-visible:outline-none focus-visible:after:ring-2 after:absolute after:inset-0`\n- If focus styling depends on a pseudo-element, verify the ring is anchored to the correct positioned element. A removed native outline is only safe when the replacement ring is clearly reliable.\n\n### Per-Frame React Counter Animation\n- Safe example: `requestAnimationFrame(animate); setCount(Math.floor(eased * target))`\n- Repeated requestAnimationFrame state updates across multiple components are a concrete performance concern when shown directly in the code.\n\n### Simple Data Table Headers\n- Safe example: `<thead><tr><th>Priority</th><th>Rule</th><th>Title</th></tr></thead>`\n- For simple data tables, prefer conservative column-header findings before speculating about row headers or outer-layout landmarks.\n\n### Adjacent Heading + Table\n- Safe example: `<h2>Issues</h2><table><thead>...</thead><tbody>...</tbody></table>`\n- A nearby visible section heading may already provide table context. Prefer scope/header association findings before requiring a caption unless the table purpose is ambiguous.\n\n## Conflict Resolution\n\n- If decorative-image guidance and dimensions guidance conflict, decorative guidance wins unless the snippet shows visible layout instability.\n- Example zero-issue pattern: `<img src=\"/divider.svg\" alt=\"\" aria-hidden=\"true\">` in an isolated component should not be flagged for alt text or dimensions unless the snippet also shows real layout-shift evidence.\n- If a form is clearly handled client-side with `onSubmit`, do not require traditional server-post `method` or `action` attributes.\n- If a file uses Next.js metadata APIs, do not infer missing head tags from the absence of literal `<meta>` or canonical-url markup.\n\n## Coverage\n\n- accessibility: 89 rules (9 critical, 25 high)\n- css: 31 rules (10 high)\n- html: 34 rules (3 critical, 12 high)\n- i18n: 5 rules\n- images: 25 rules (1 critical, 15 high)\n- javascript: 26 rules (1 critical, 12 high)\n- performance: 43 rules (1 critical, 22 high)\n- privacy: 5 rules (2 high)\n- security: 22 rules (4 critical, 10 high)\n- seo: 93 rules (19 high)\n- testing: 13 rules (7 high)\n\n## Evaluation Standard\n\n- Prefer findings tied to exact files, routes, selectors, or code snippets.\n- Prioritize critical and high issues first.\n- Explain uncertainty instead of overstating when the snippet does not show enough context.\n- Avoid generic advice when the MCP tools can retrieve a rule or fix prompt.\n- When no issue is found automatically, use `search_rules` to broaden review coverage before concluding clean.\n\n---\n\nSee `references/categories.md` for category coverage and tool routing.\n\nMCP docs: https://frontendchecklist.io/mcp\n\n<!-- File: skills/404-page/references/rule.md (Tokens: ~1772 | Category: anthropic-skill) -->\n# Create a custom 404 error page\n\n> A custom 404 error page is designed with helpful navigation options for lost users.\n\n**Priority:** medium · **Difficulty:** beginner · **Time:** 20 min\n\n---\nCustom 404 pages transform dead ends into opportunities to guide users back to relevant content.\n\n## Code Example\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Page Not Found - Site Name</title>\n  <meta name=\"robots\" content=\"noindex\">\n</head>\n<body>\n  <main class=\"error-page\">\n    <h1>Page Not Found</h1>\n    <p>Sorry, the page you're looking for doesn't exist or has been moved.</p>\n\n    <!-- Search -->\n    <form action=\"/search\" method=\"GET\" role=\"search\">\n      <label for=\"search\">Search our site:</label>\n      <input type=\"search\" id=\"search\" name=\"q\" placeholder=\"What are you looking for?\">\n      <button type=\"submit\">Search</button>\n    </form>\n\n    <!-- Helpful links -->\n    <nav aria-label=\"Helpful links\">\n      <h2>Try these instead:</h2>\n      <ul>\n        <li><a href=\"/\">Home</a></li>\n        <li><a href=\"/products\">Products</a></li>\n        <li><a href=\"/blog\">Blog</a></li>\n        <li><a href=\"/contact\">Contact Us</a></li>\n      </ul>\n    </nav>\n  </main>\n</body>\n</html>\n```\n\n## Why It Matters\n\nA generic browser 404 page causes users to leave immediately—a well-designed custom page provides recovery paths and keeps users engaged with your site.\n\n## Essential Elements\n\n| Element | Purpose |\n|---------|---------|\n| Clear message | Explain the page wasn't found |\n| Search box | Help users find what they need |\n| Navigation links | Quick access to main sections |\n| Popular content | Suggest relevant pages |\n| Home link | Easy return to start |\n| Contact option | Report broken links |\n\n## Next.js Implementation\n\n```tsx\n// app/not-found.tsx\n\n  return (\n    <main className=\"min-h-screen flex items-center justify-center px-4\">\n      <div className=\"text-center max-w-md\">\n        <h1 className=\"text-6xl font-bold text-gray-900 mb-4\">404</h1>\n        <h2 className=\"text-2xl font-semibold mb-4\">Page Not Found</h2>\n        <p className=\"text-gray-600 mb-8\">\n          The page you're looking for doesn't exist or has been moved.\n        </p>\n\n        <div className=\"space-y-4\">\n          \n            Go Home\n          \n\n          \n            Search Site\n          \n        </div>\n\n        <nav className=\"mt-8\" aria-label=\"Popular pages\">\n          <h3 className=\"text-sm font-semibold text-gray-500 mb-3\">\n            Popular Pages\n          </h3>\n          <ul className=\"space-y-2\">\n            <li>Products</li>\n            <li>Documentation</li>\n            <li>Blog</li>\n          </ul>\n        </nav>\n      </div>\n    </main>\n  )\n}\n```\n\n## React Component with Error Tracking\n\n```tsx\ninterface NotFoundPageProps {\n  searchEnabled?: boolean\n  popularLinks?: Array<{ href: string; label: string }>\n}\n\n  searchEnabled = true,\n  popularLinks = []\n}: NotFoundPageProps) {\n  // Track 404 for analytics\n  useEffect(() => {\n    // Report to analytics\n    if (typeof window !== 'undefined') {\n      const path = window.location.pathname\n      console.error(`404 Error: ${path}`)\n\n      // Send to analytics service\n      analytics?.track('404_error', { path, referrer: document.referrer })\n    }\n  }, [])\n\n  return (\n    <main role=\"main\" className=\"error-page\">\n      <div className=\"error-content\">\n        <h1>Oops! Page not found</h1>\n        <p>\n          We couldn't find the page you're looking for.\n          It may have been moved or deleted.\n        </p>\n\n        {searchEnabled && (\n          <form action=\"/search\" method=\"GET\" role=\"search\" className=\"search-form\">\n            <label htmlFor=\"error-search\" className=\"sr-only\">\n              Search\n            </label>\n            <input\n              type=\"search\"\n              id=\"error-search\"\n              name=\"q\"\n              placeholder=\"Search...\"\n              aria-label=\"Search site\"\n            />\n            <button type=\"submit\">Search</button>\n          </form>\n        )}\n\n        {popularLinks.length > 0 && (\n          <nav aria-label=\"Suggested pages\">\n            <h2>You might be looking for:</h2>\n            <ul>\n              {popularLinks.map(link => (\n                <li key={link.href}>\n                  <a href={link.href}>{link.label}</a>\n                </li>\n              ))}\n            </ul>\n          </nav>\n        )}\n\n        <a href=\"/\" className=\"home-link\">\n          ← Back to Home\n        </a>\n      </div>\n    </main>\n  )\n}\n```\n\n## Server Configuration\n\n```nginx\n# Nginx\nserver {\n    error_page 404 /404.html;\n    location = /404.html {\n        root /var/www/html;\n        internal;\n    }\n}\n```\n\n```apache\n# Apache .htaccess\nErrorDocument 404 /404.html\n```\n\n## 404 Error Tracking\n\n```tsx\n// middleware.ts (Next.js)\n\n  // Log 404s for monitoring\n  const response = NextResponse.next()\n\n  // You can check response status and log accordingly\n  // This runs before the 404 page renders\n\n  return response\n}\n\n// Alternative: Track in the 404 page itself\n// app/not-found.tsx\n'use client'\n\n  const pathname = usePathname()\n\n  useEffect(() => {\n    // Send to error tracking service\n    fetch('/api/track-404', {\n      method: 'POST',\n      body: JSON.stringify({\n        path: pathname,\n        referrer: document.referrer,\n        timestamp: new Date().toISOString()\n      })\n    })\n  }, [pathname])\n\n  return (/* ... */)\n}\n```\n\n## SEO Considerations\n\n```html\n<head>\n  <!-- Prevent 404 pages from being indexed -->\n  <meta name=\"robots\" content=\"noindex, nofollow\">\n\n  <!-- Return proper 404 status code (server-side) -->\n  <!-- Next.js handles this automatically for not-found.tsx -->\n</head>\n```\n\n## Avoid Soft 404s\n\nA branded \"page not found\" template is still a search bug if the server responds with `200 OK`. Search engines can treat that as a soft 404, which wastes crawl budget and may surface broken pages in reports.\n\n## Styling Best Practices\n\n```css\n.error-page {\n  min-height: 100vh;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 2rem;\n  text-align: center;\n}\n\n.error-content {\n  max-width: 500px;\n}\n\n.error-page h1 {\n  font-size: 3rem;\n  margin-bottom: 1rem;\n}\n\n/* Keep consistent with site branding */\n.error-page {\n  font-family: inherit;\n  background: var(--background);\n  color: var(--foreground);\n}\n\n/* Ensure search is prominent */\n.search-form {\n  margin: 2rem 0;\n}\n\n.search-form input {\n  padding: 0.75rem 1rem;\n  font-size: 1rem;\n  width: 100%;\n  max-width: 300px;\n}\n```\n\n## Verification\n\n1. Navigate to a non-existent URL\n2. Verify HTTP 404 status code is returned\n3. Check page includes navigation options\n4. Test search functionality works\n5. Verify page is not indexed (check robots meta)\n6. Test on mobile devices\n7. Verify screen reader announces content properly\n8. Confirm the missing URL appears as a real 404 in DevTools Network, not a 200 soft-404 response\n\nA custom 404 page must return HTTP status code 404, not 200. Search engines treat 200 responses as valid pages, potentially indexing your error page content.\n\n<!-- File: skills/404-page/SKILL.md (Tokens: ~387 | Category: anthropic-skill) -->\n---\nname: 404-page\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Create a custom 404 error page. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: beginner\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/404-page\n---\n\n# Create a custom 404 error page\n\nA generic browser 404 page causes users to leave immediately—a well-designed custom page provides recovery paths and keeps users engaged with your site.\n\n## Quick Reference\n\n- Custom 404 pages retain users who encounter broken or moved links\n- Include search, navigation, and links to popular content\n- Maintain consistent branding and site design\n- Track 404 errors to identify and fix broken links\n- Return a real HTTP 404 so the page is not treated as a soft 404\n\n## Check\n\nVerify that this website has a custom 404 error page with helpful navigation options. Confirm the route returns HTTP 404 and not a branded page with a 200 response.\n\n## Fix\n\nCreate a user-friendly 404 page with search functionality and links to important pages. Ensure the server or framework returns status code 404 so the page does not become a soft 404.\n\n## Explain\n\nExplain how custom 404 pages help retain users who encounter broken links and why returning 200 for missing pages creates soft-404 indexing problems.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Create a custom 404 error page. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/404-page\n\n<!-- File: skills/about-page/references/rule.md (Tokens: ~483 | Category: anthropic-skill) -->\n# Create a dedicated About page\n\n> Checks for a dedicated about or company page with meaningful content.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nAn About page provides essential context about the source of the information on your website. It helps search engines and users understand the expertise and authority behind the content.\n\n## Code Example\n\nEnsure the About page is easily discoverable, typically via the main navigation or the footer.\n\n```html\n<footer>\n  <nav aria-label=\"Footer Navigation\">\n    <ul>\n      <li><a href=\"/about\">About Us</a></li>\n      <li><a href=\"/contact\">Contact</a></li>\n      <li><a href=\"/privacy-policy\">Privacy Policy</a></li>\n    </ul>\n  </nav>\n</footer>\n```\n\n## Why It Matters\n\n- **E-E-A-T**: Directly supports the Trustworthiness and Authoritativeness pillars of Google's Quality Rater Guidelines.\n- **Transparency**: Shows users who you are, reducing bounce rates and building long-term brand loyalty.\n- **Entity Recognition**: Helps search engines connect your website to a real-world entity (person or organization).\n- **Compliance**: For many industries, identifying the content creator is a legal or regulatory requirement.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.\n\n<!-- File: skills/about-page/SKILL.md (Tokens: ~351 | Category: anthropic-skill) -->\n---\nname: about-page\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Create a dedicated About page. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/about-page\n---\n\n# Create a dedicated About page\n\nAn About page is a primary trust signal for both users and search engines, directly impacting the website's E-E-A-T profile and overall credibility.\n\n## Quick Reference\n\n- Include a dedicated page explaining the purpose, history, and mission of the website\n- Introduce the key people or organization behind the content to build trust\n- Provide clear evidence of expertise and contact information\n\n## Check\n\nVerify that the website has a dedicated About page that clearly identifies the people or organization responsible for the content.\n\n## Fix\n\nCreate a new page at `/about` and add detailed information about your organization, mission, and the experts behind your content.\n\n## Explain\n\nExplain how an About page contributes to E-E-A-T (Experience, Expertise, Authoritativeness, and Trustworthiness) and why it's a critical SEO factor.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Create a dedicated About page. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/about-page\n\n<!-- File: skills/accessibility-testing/references/rule.md (Tokens: ~989 | Category: anthropic-skill) -->\n# Include accessibility testing\n\n> Automate accessibility testing with tools like axe-core, jest-axe, or Playwright's accessibility testing.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 30 min\n\n---\nAutomated accessibility testing catches common WCAG violations before they reach production, protecting your users and reducing legal risk.\n\n## Code Example\n\n```javascript\n\nexpect.extend(toHaveNoViolations)\n\ndescribe('Button', () => {\n  it('should have no accessibility violations', async () => {\n    const { container } = render(\n       {}}>Click me\n    )\n    const results = await axe(container)\n    expect(results).toHaveNoViolations()\n  })\n})\n\n// Test specific rules\nit('should have proper color contrast', async () => {\n  const { container } = render(Warning)\n  const results = await axe(container, {\n    rules: {\n      'color-contrast': { enabled: true }\n    }\n  })\n  expect(results).toHaveNoViolations()\n})\n```\n\n## Why It Matters\n\nAutomated accessibility testing catches 30-50% of WCAG violations before code reaches users—reducing legal risk and improving usability for everyone.\n\n## Testing Tools\n\n| Tool | Use Case | Framework |\n|------|----------|-----------|\n| jest-axe | Unit/component tests | Jest |\n| @axe-core/playwright | E2E tests | Playwright |\n| cypress-axe | E2E tests | Cypress |\n| pa11y | CI/CD pipeline | Any |\n\n## Playwright\n\n```typescript\n\ntest.describe('Homepage accessibility', () => {\n  test('should have no violations', async ({ page }) => {\n    await page.goto('/')\n\n    const accessibilityScanResults = await new AxeBuilder({ page }).analyze()\n\n    expect(accessibilityScanResults.violations).toEqual([])\n  })\n\n  test('should have no violations on mobile', async ({ page }) => {\n    await page.setViewportSize({ width: 375, height: 667 })\n    await page.goto('/')\n\n    const results = await new AxeBuilder({ page })\n      .withTags(['wcag2a', 'wcag2aa'])\n      .analyze()\n\n    expect(results.violations).toEqual([])\n  })\n})\n```\n\n## Cypress\n\n```javascript\n\ndescribe('Form accessibility', () => {\n  beforeEach(() => {\n    cy.visit('/contact')\n    cy.injectAxe()\n  })\n\n  it('should have no violations on load', () => {\n    cy.checkA11y()\n  })\n\n  it('should have no violations after form errors', () => {\n    cy.get('button[type=\"submit\"]').click()\n    cy.checkA11y()\n  })\n\n  it('should exclude known issues', () => {\n    cy.checkA11y(null, {\n      rules: {\n        'color-contrast': { enabled: false } // Known issue, tracked in backlog\n      }\n    })\n  })\n})\n```\n\n## CI/CD Integration\n\n```yaml\n# GitHub Actions\nname: Accessibility Tests\non: [push, pull_request]\n\njobs:\n  a11y:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n      - run: npm ci\n      - run: npm run test:a11y\n      - uses: actions/upload-artifact@v4\n        if: failure()\n        with:\n          name: a11y-report\n          path: a11y-report.html\n```\n\n## Lighthouse CI Accessibility\n\n```json\n{\n  \"ci\": {\n    \"assert\": {\n      \"assertions\": {\n        \"categories:accessibility\": [\"error\", { \"minScore\": 0.9 }],\n        \"image-alt\": \"error\",\n        \"label\": \"error\",\n        \"link-name\": \"error\"\n      }\n    }\n  }\n}\n```\n\n## Tools & Validation\n\nAutomated checks are a floor, not a ceiling.\n\nTypically caught automatically:\n\n- Missing alt text\n- Missing form labels\n- Invalid ARIA roles and attributes\n- Many color-contrast failures\n\nUsually still manual:\n\n- Whether alt text is actually meaningful\n- Keyboard interaction quality in complex widgets\n- Screen reader announcements and reading order\n- Whether the flow is understandable, not just technically valid\n\n## Verification\n\n### Automated Checks\n\n- Run the accessibility test suite locally and confirm new violations fail the build or test run; the default target should be `<= 0` unexpected axe violations for covered states.\n- Pair automated coverage with manual keyboard and screen-reader checks for at least one critical user flow.\n- Track ignored or suppressed rules explicitly so temporary exceptions do not become permanent blind spots.\n\n### Manual Checks\n\n- Ensure the suite covers high-risk states such as modal open, form validation errors, and mobile layouts.\n\n<!-- File: skills/accessibility-testing/SKILL.md (Tokens: ~341 | Category: anthropic-skill) -->\n---\nname: accessibility-testing\ndescription: \"Use when reviewing component libraries, page flows, or CI pipelines that need repeatable accessibility checks. Automated testing is strongest at catching structural and attribute-level issues; it does not replace keyboard, screen reader, and manual UX testing.\"\nmetadata:\n  category: testing\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"30\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/testing/accessibility-testing\n---\n\n# Include accessibility testing\n\nAutomated accessibility testing catches 30-50% of WCAG violations before code reaches users—reducing legal risk and improving usability for everyone.\n\n## Quick Reference\n\n- Use jest-axe for component-level accessibility testing\n- Integrate @axe-core/playwright or cypress-axe for E2E a11y tests\n- Run accessibility tests in CI/CD to catch regressions early\n- Test specific WCAG rules like color-contrast individually\n\n## Check\n\nReview this test suite for accessibility testing coverage using axe-core, jest-axe, or similar tools.\n\n## Fix\n\nAdd automated accessibility testing to detect WCAG violations in components and pages.\n\n## Explain\n\nExplain how to implement automated accessibility testing and what issues it can detect.\n\n## Code Review\n\nInspect component tests, E2E suites, and CI workflows for automated accessibility coverage. Flag critical pages or shared components that ship without axe-based checks, and note issues that still require manual keyboard or screen reader validation.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/testing/accessibility-testing\n\n<!-- File: skills/accessible-authentication/references/rule.md (Tokens: ~918 | Category: anthropic-skill) -->\n# Provide accessible authentication methods\n\n> Authentication flows avoid unnecessary cognitive tests and support assistive mechanisms such as password managers, paste, OTP autofill, and passkeys.\n\n**Priority:** high · **Difficulty:** advanced · **Time:** 25 min\n\n---\nAuthentication should not depend on the user's ability to memorize, transcribe, or manually reproduce information when an assistive path is feasible. Good accessible authentication usually improves security too, because it works with password managers, device-based verification, and passkeys rather than against them.\n\n## Code Example\n\n```html\n<!-- Better: password-manager and OTP-friendly fields -->\n<label for=\"email\">Email</label>\n<input id=\"email\" name=\"email\" type=\"email\" autocomplete=\"username webauthn\">\n\n<label for=\"password\">Password</label>\n<input\n  id=\"password\"\n  name=\"password\"\n  type=\"password\"\n  autocomplete=\"current-password\">\n\n<label for=\"otp\">Verification code</label>\n<input\n  id=\"otp\"\n  name=\"otp\"\n  inputmode=\"numeric\"\n  autocomplete=\"one-time-code\">\n```\n\n```tsx\nfunction VerifyCodeField({\n  onSubmit,\n}: {\n  onSubmit: (code: string) => void\n}) {\n  return (\n    <form\n      onSubmit={(event) => {\n        event.preventDefault()\n        const formData = new FormData(event.currentTarget)\n        onSubmit(String(formData.get('otp') ?? ''))\n      }}\n    >\n      <label htmlFor=\"otp\">Enter the verification code</label>\n      <input\n        autoComplete=\"one-time-code\"\n        id=\"otp\"\n        inputMode=\"numeric\"\n        name=\"otp\"\n        type=\"text\"\n      />\n\n      <button type=\"submit\">Continue</button>\n    </form>\n  )\n}\n```\n\n```html\n<!-- Better: offer a non-memory-dependent alternative -->\n<button type=\"button\">Continue with a passkey</button>\n<button type=\"button\">Email me a sign-in link</button>\n```\n\n## Why It Matters\n\nMany authentication patterns are built around unnecessary friction: blocked paste, custom OTP widgets that break autofill, CAPTCHA transcription, or backup questions that require memory instead of possession-based proof.\n\n- cognitive barriers prevent account access before the user can do anything else\n- password-manager hostility leads to weaker, reused passwords\n- speech, switch, and keyboard-only users face more effort when copy/paste and autofill are disabled\n- recovery and MFA steps often fail even when the main login form looks acceptable\n\n## Best Practices\n\n### Support assisted entry\n\nAuthentication should work with:\n\n- password managers\n- pasted credentials and codes\n- OS/browser OTP autofill\n- passkeys or device approval when available\n\nDo not split a one-time code into a widget that breaks standard autofill unless you have verified the real browser behavior.\n\n### Provide a non-memory-dependent path\n\nAt least one viable route through sign-in, MFA, and recovery should avoid a cognitive function test. Good examples include:\n\n- passkeys\n- approval on a trusted device\n- magic links\n- password-manager-assisted password entry\n\n### Keep anti-abuse controls proportional\n\nIf you use CAPTCHA or other abuse mitigations in auth flows, provide an alternative path that does not force memorization or transcription. Accessibility and abuse prevention must be designed together, not as competing concerns.\n\n## Standards\n\n- This rule maps to WCAG 2.2 Success Criterion 3.3.8 Accessible Authentication (Minimum).\n- The practical goal is not \"less security\"; it is at least one viable path that does not depend on a cognitive function test.\n\n## Exceptions\n\n- Re-entering a newly created password can be a valid security exception when the system does not reveal the password back to the user.\n- MFA is compatible with this rule, but the user still needs at least one practical path that does not rely on memorizing or transcribing information.\n- Accessibility does not require removing security; it requires choosing security controls that users can actually complete.\n\n## Verification\n\n### Automated Checks\n\n- Search auth flows for blocked paste handlers, OTP widgets, and missing autocomplete attributes.\n- Verify username, current-password, new-password, and one-time-code fields use appropriate semantics.\n\n### Manual Checks\n\n- Test sign-in with a password manager.\n- Paste an OTP or let the browser autofill it where supported.\n- Exercise recovery and MFA flows, not only the primary login form.\n- Fail if the only available path requires memorizing, transcribing, or solving a cognitive test without an assisted alternative.\n\n<!-- File: skills/accessible-authentication/SKILL.md (Tokens: ~443 | Category: anthropic-skill) -->\n---\nname: accessible-authentication\ndescription: \"Use when reviewing sign-in, sign-up, MFA, CAPTCHA, recovery, and re-auth flows. Evaluate the full authentication path, including error handling and backup methods, not just the primary login form.\"\nmetadata:\n  category: accessibility\n  priority: high\n  difficulty: advanced\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accessible-authentication\n---\n\n# Provide accessible authentication methods\n\nAuthentication often becomes the first hard blocker for users with cognitive, motor, low-vision, or speech-input needs. If sign-in, MFA, or recovery relies on memorization or transcription with no assisted path, the user may be locked out before they can access the product at all.\n\n## Quick Reference\n\n- Do not block paste or password managers in login and recovery flows\n- Prefer passkeys, magic links, device approval, or password-manager-friendly flows\n- Support OTP autofill and paste with appropriate semantics such as `autocomplete=\"one-time-code\"`\n- Avoid CAPTCHA or secondary checks that require memorizing or transcribing information without an alternative\n\n## Check\n\nReview login, MFA, password reset, and account recovery for accessible authentication problems. Flag blocked paste, password-manager hostility, manual transcription requirements, inaccessible OTP handling, and CAPTCHA or knowledge checks without a compliant alternative.\n\n## Fix\n\nAdd password-manager-friendly fields, support paste and OTP autofill, and provide at least one authentication path that does not depend on a cognitive function test.\n\n## Explain\n\nExplain WCAG Accessible Authentication, why memorization and transcription are barriers, and how passkeys, password managers, OTP autofill, and device approval improve both accessibility and security.\n\n## Code Review\n\nReview authentication pages, MFA steps, recovery flows, and security controls related to Provide accessible authentication methods. Flag exact steps that require memorization, transcription, blocked assistive tooling, or inaccessible fallback paths.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accessible-authentication\n\n<!-- File: skills/accessible-notifications/references/rule.md (Tokens: ~2018 | Category: anthropic-skill) -->\n# Make notifications accessible\n\n> Toast notifications and alerts are announced to screen readers using ARIA live regions and appropriate roles.\n\n**Priority:** high · **Difficulty:** intermediate · **Time:** 25 min\n\n---\nAccessible notifications ensure all users receive important feedback about actions and state changes.\n\n## Code Example\n\n```html\n<!-- Status notification (polite) -->\n<div role=\"status\" aria-live=\"polite\" class=\"notification\">\n  Your changes have been saved.\n</div>\n\n<!-- Alert notification (assertive) -->\n<div role=\"alert\" aria-live=\"assertive\" class=\"notification notification--error\">\n  Error: Please fill in all required fields.\n</div>\n\n<!-- Live region container (content injected dynamically) -->\n<div\n  id=\"notifications\"\n  aria-live=\"polite\"\n  aria-atomic=\"true\"\n  class=\"sr-only\"\n></div>\n```\n\n## Why It Matters\n\nWithout proper ARIA attributes, screen reader users miss critical notifications like form errors, success messages, and real-time updates—leaving them unaware of important page changes.\n\n## ARIA Live Region Types\n\n| Attribute | Behavior | Use For |\n|-----------|----------|---------|\n| `aria-live=\"polite\"` | Waits for user pause | Status updates, non-urgent info |\n| `aria-live=\"assertive\"` | Interrupts immediately | Errors, time-sensitive alerts |\n| `role=\"status\"` | Implicit polite | Progress, success messages |\n| `role=\"alert\"` | Implicit assertive | Errors, warnings |\n\n## React Toast Component\n\n```tsx\n\ntype NotificationType = 'success' | 'error' | 'warning' | 'info'\n\ninterface ToastProps {\n  message: string\n  type: NotificationType\n  duration?: number\n  onDismiss: () => void\n}\n\n  message,\n  type,\n  duration = 5000,\n  onDismiss\n}: ToastProps) {\n  const toastRef = useRef(null)\n\n  // Auto-dismiss after duration\n  useEffect(() => {\n    if (duration > 0) {\n      const timer = setTimeout(onDismiss, duration)\n      return () => clearTimeout(timer)\n    }\n  }, [duration, onDismiss])\n\n  // Focus toast for keyboard users\n  useEffect(() => {\n    toastRef.current?.focus()\n  }, [])\n\n  const isError = type === 'error' || type === 'warning'\n\n  return (\n    <div\n      ref={toastRef}\n      role={isError ? 'alert' : 'status'}\n      aria-live={isError ? 'assertive' : 'polite'}\n      aria-atomic=\"true\"\n      tabIndex={-1}\n      className={`toast toast--${type}`}\n    >\n      <span className=\"toast__icon\" aria-hidden=\"true\">\n        {type === 'success' && '✓'}\n        {type === 'error' && '✕'}\n        {type === 'warning' && '⚠'}\n        {type === 'info' && 'ℹ'}\n      </span>\n\n      <span className=\"toast__message\">{message}</span>\n\n      <button\n        type=\"button\"\n        onClick={onDismiss}\n        aria-label=\"Dismiss notification\"\n        className=\"toast__dismiss\"\n      >\n        ×\n      </button>\n    </div>\n  )\n}\n```\n\n## Toast Container with Live Region\n\n```tsx\n\ninterface Notification {\n  id: string\n  message: string\n  type: NotificationType\n  duration?: number\n}\n\ninterface ToastContextType {\n  addToast: (notification: Omit\n      {children}\n\n      {/* Toast container with live region */}\n      <div\n        className=\"toast-container\"\n        aria-label=\"Notifications\"\n      >\n        {toasts.map(toast => (\n           removeToast(toast.id)}\n          />\n        ))}\n      </div>\n\n      {/* Screen reader announcement region */}\n      <div\n        role=\"status\"\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        className=\"sr-only\"\n      >\n        {toasts.length > 0 && toasts[toasts.length - 1].message}\n      </div>\n    </ToastContext.Provider>\n  )\n}\n\n  const context = useContext(ToastContext)\n  if (!context) throw new Error('useToast must be used within ToastProvider')\n  return context\n}\n```\n\n## Usage Example\n\n```tsx\nfunction SaveButton() {\n  const { addToast } = useToast()\n\n  const handleSave = async () => {\n    try {\n      await saveData()\n      addToast({\n        message: 'Changes saved successfully',\n        type: 'success',\n        duration: 3000\n      })\n    } catch (error) {\n      addToast({\n        message: 'Failed to save changes. Please try again.',\n        type: 'error',\n        duration: 0 // Don't auto-dismiss errors\n      })\n    }\n  }\n\n  return <button onClick={handleSave}>Save</button>\n}\n```\n\n## Inline Notifications\n\n```tsx\ninterface InlineNotificationProps {\n  type: 'error' | 'warning' | 'success' | 'info'\n  title?: string\n  children: React.ReactNode\n  dismissible?: boolean\n  onDismiss?: () => void\n}\n\n  type,\n  title,\n  children,\n  dismissible = false,\n  onDismiss\n}: InlineNotificationProps) {\n  const isUrgent = type === 'error' || type === 'warning'\n\n  return (\n    <div\n      role={isUrgent ? 'alert' : 'status'}\n      aria-live={isUrgent ? 'assertive' : 'polite'}\n      className={`notification notification--${type}`}\n    >\n      {title && (\n        <strong className=\"notification__title\">{title}</strong>\n      )}\n      <div className=\"notification__content\">{children}</div>\n\n      {dismissible && (\n        <button\n          type=\"button\"\n          onClick={onDismiss}\n          aria-label=\"Dismiss\"\n          className=\"notification__dismiss\"\n        >\n          ×\n        </button>\n      )}\n    </div>\n  )\n}\n```\n\n## Progress Notifications\n\n```tsx\nfunction UploadProgress({ progress, fileName }: { progress: number; fileName: string }) {\n  return (\n    <div\n      role=\"status\"\n      aria-live=\"polite\"\n      aria-busy={progress < 100}\n      className=\"upload-progress\"\n    >\n      <span className=\"sr-only\">\n        Uploading {fileName}: {progress}% complete\n      </span>\n\n      <div aria-hidden=\"true\">\n        <span>{fileName}</span>\n        <progress value={progress} max=\"100\" />\n        <span>{progress}%</span>\n      </div>\n    </div>\n  )\n}\n```\n\n## Timing Guidelines\n\n| Notification Type | Recommended Duration |\n|-------------------|---------------------|\n| Success messages | 3-5 seconds |\n| Info/status | 5-7 seconds |\n| Warnings | 8-10 seconds or manual dismiss |\n| Errors | No auto-dismiss (manual only) |\n\n```tsx\nconst DURATION_MAP = {\n  success: 3000,\n  info: 5000,\n  warning: 8000,\n  error: 0, // No auto-dismiss\n} as const\n```\n\n## Styling\n\n```css\n.toast-container {\n  position: fixed;\n  bottom: 1rem;\n  right: 1rem;\n  z-index: 1000;\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n\n.toast {\n  display: flex;\n  align-items: center;\n  gap: 0.75rem;\n  padding: 1rem;\n  border-radius: 0.5rem;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n  animation: slideIn 0.3s ease-out;\n}\n\n.toast--success { background: #d4edda; border-left: 4px solid #28a745; }\n.toast--error { background: #f8d7da; border-left: 4px solid #dc3545; }\n.toast--warning { background: #fff3cd; border-left: 4px solid #ffc107; }\n.toast--info { background: #d1ecf1; border-left: 4px solid #17a2b8; }\n\n.toast__dismiss {\n  background: none;\n  border: none;\n  font-size: 1.25rem;\n  cursor: pointer;\n  padding: 0.25rem;\n  margin-left: auto;\n}\n\n/* Screen reader only */\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\n@keyframes slideIn {\n  from {\n    transform: translateX(100%);\n    opacity: 0;\n  }\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n/* Respect motion preferences */\n@media (prefers-reduced-motion: reduce) {\n  .toast {\n    animation: none;\n  }\n}\n```\n\n## Verification\n\n1. Enable screen reader and trigger notifications\n2. Verify announcements occur at appropriate times\n3. Test keyboard dismissal (Escape key)\n4. Check notifications don't disappear too quickly\n5. Verify focus management after dismissal\n6. Test with different screen readers (NVDA, VoiceOver, JAWS)\n\nReserve `aria-live=\"assertive\"` for truly urgent messages. Overuse disrupts the user experience by constantly interrupting screen reader output.\n\n<!-- File: skills/accessible-notifications/SKILL.md (Tokens: ~344 | Category: anthropic-skill) -->\n---\nname: accessible-notifications\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Make notifications accessible. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: high\n  difficulty: intermediate\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accessible-notifications\n---\n\n# Make notifications accessible\n\nWithout proper ARIA attributes, screen reader users miss critical notifications like form errors, success messages, and real-time updates—leaving them unaware of important page changes.\n\n## Quick Reference\n\n- Use aria-live regions to announce dynamic content changes\n- Choose between 'polite' (waits) and 'assertive' (interrupts) based on urgency\n- Ensure notifications persist long enough to be read\n- Provide visible and programmatic dismiss options\n\n## Check\n\nVerify notifications use aria-live regions, appropriate role (alert or status), and persist long enough to be read.\n\n## Fix\n\nImplement notifications with role='alert' or role='status', aria-live='polite' or 'assertive', and adequate display time.\n\n## Explain\n\nExplain how accessible notifications ensure all users are informed of important updates regardless of how they interact with the page.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Make notifications accessible. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accessible-notifications\n\n<!-- File: skills/accessible-tables/references/rule.md (Tokens: ~1057 | Category: anthropic-skill) -->\n# Use semantic table markup for screen readers\n\n> Data tables use proper semantic markup with headers, captions, and scope attributes for screen reader accessibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nProper table markup enables screen readers to announce header-cell relationships, making data understandable.\n\n## Code Example\n\n```html\n<table>\n  <caption>Q1 2024 Sales by Region</caption>\n  <thead>\n    <tr>\n      <th scope=\"col\">Region</th>\n      <th scope=\"col\">January</th>\n      <th scope=\"col\">February</th>\n      <th scope=\"col\">March</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">North</th>\n      <td>$12,000</td>\n      <td>$14,500</td>\n      <td>$13,200</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">South</th>\n      <td>$9,800</td>\n      <td>$11,000</td>\n      <td>$10,500</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## Why It Matters\n\nScreen readers read table data cell-by-cell—without proper headers, users hear meaningless numbers without context. 'Row 3, Column 2: $99' vs just '$99'.\n\n## Scope Attribute\n\n| Value | Use When |\n|-------|----------|\n| `scope=\"col\"` | Header applies to column below |\n| `scope=\"row\"` | Header applies to row beside it |\n| `scope=\"colgroup\"` | Header spans multiple columns |\n| `scope=\"rowgroup\"` | Header spans multiple rows |\n\n## Complex Tables with Headers Attribute\n\n```html\n<table>\n  <caption>Sales Report</caption>\n  <thead>\n    <tr>\n      <th id=\"region\" rowspan=\"2\">Region</th>\n      <th id=\"q1\" colspan=\"2\">Q1</th>\n      <th id=\"q2\" colspan=\"2\">Q2</th>\n    </tr>\n    <tr>\n      <th id=\"q1-units\" headers=\"q1\">Units</th>\n      <th id=\"q1-revenue\" headers=\"q1\">Revenue</th>\n      <th id=\"q2-units\" headers=\"q2\">Units</th>\n      <th id=\"q2-revenue\" headers=\"q2\">Revenue</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th id=\"north\" headers=\"region\">North</th>\n      <td headers=\"north q1 q1-units\">150</td>\n      <td headers=\"north q1 q1-revenue\">$15,000</td>\n      <td headers=\"north q2 q2-units\">180</td>\n      <td headers=\"north q2 q2-revenue\">$18,000</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## React Table Component\n\n```tsx\ninterface Column{caption}</caption>\n      <thead>\n        <tr>\n          {columns.map(col => (\n            <th key={String(col.key)} scope=\"col\">\n              {col.header}\n            </th>\n          ))}\n        </tr>\n      </thead>\n      <tbody>\n        {data.map((row, i) => (\n          <tr key={i}>\n            {columns.map(col => {\n              const isRowHeader = col.key === rowHeader\n              const Tag = isRowHeader ? 'th' : 'td'\n              return (\n                \n                  {String(row[col.key])}\n                \n              )\n            })}\n          </tr>\n        ))}\n      </tbody>\n    </table>\n  )\n}\n```\n\n## Responsive Tables\n\n```html\n<!-- Scrollable wrapper for mobile -->\n<div class=\"table-wrapper\" tabindex=\"0\" role=\"region\" aria-label=\"Sales data table\">\n  <table>\n    <!-- Table content -->\n  </table>\n</div>\n```\n\n```css\n.table-wrapper {\n  overflow-x: auto;\n  max-width: 100%;\n}\n\n/* Focus indicator for keyboard users scrolling */\n.table-wrapper:focus {\n  outline: 2px solid #005fcc;\n}\n```\n\n## Exceptions\n\n- Simple data tables can sometimes fail more from missing header relationships than from missing enhancements such as captions or mobile wrappers, so prioritize the strongest semantic issue.\n- Do not convert layout structures into data-table markup just to satisfy a rule; the correct fix may be to remove table semantics entirely.\n- When several table-accessibility issues overlap, resolve the header-cell relationship first because downstream announcements depend on it.\n\n## Verification\n\n### Automated Checks\n\n- Use browser accessibility tooling, axe, Lighthouse, or equivalent automated checks against a representative rendered state.\n\n### Manual Checks\n\n- Use screen reader table navigation (Ctrl+Alt+Arrow keys in NVDA)\n- Verify headers are announced with each cell\n- Check caption describes the table purpose\n- Confirm table is not used for layout\n\n<!-- File: skills/accessible-tables/SKILL.md (Tokens: ~418 | Category: anthropic-skill) -->\n---\nname: accessible-tables\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Use semantic table markup for screen readers. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accessible-tables\n---\n\n# Use semantic table markup for screen readers\n\nScreen readers read table data cell-by-cell—without proper headers, users hear meaningless numbers without context. 'Row 3, Column 2: $99' vs just '$99'.\n\n## Quick Reference\n\n- Use <th> elements for headers with scope='col' or scope='row'\n- Add <caption> to describe the table's purpose\n- Never use tables for layout—use CSS Grid or Flexbox instead\n- Use id/headers for complex tables with merged cells\n- For simple tables with a clear adjacent section heading, missing `scope` is often a stronger finding than missing `<caption>`\n- Prefer one strong table-semantics finding over multiple weaker enhancements on the same simple table\n\n## Check\n\nVerify tables use proper th elements with scope, caption or aria-labelledby, and semantic table structure.\n\n## Fix\n\nAdd proper table headers with scope attributes, captions for context, and ensure tables are not used for layout.\n\n## Explain\n\nExplain how proper table markup helps screen reader users understand data relationships and navigate table content.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Use semantic table markup for screen readers. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accessible-tables\n\n<!-- File: skills/accessible-tooltips/references/rule.md (Tokens: ~1809 | Category: anthropic-skill) -->\n# Create accessible tooltips\n\n> Tooltips are accessible to keyboard users and screen readers with proper ARIA attributes and focus handling.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 20 min\n\n---\nAccessible tooltips provide supplementary information without excluding keyboard or screen reader users.\n\n## Code Example\n\n```html\n<div class=\"tooltip-container\">\n  <button\n    type=\"button\"\n    aria-describedby=\"tooltip-1\"\n    class=\"tooltip-trigger\"\n  >\n    Settings\n  </button>\n  <div\n    id=\"tooltip-1\"\n    role=\"tooltip\"\n    class=\"tooltip\"\n  >\n    Configure your preferences\n  </div>\n</div>\n```\n\n## Why It Matters\n\nInaccessible tooltips leave keyboard and screen reader users without important contextual information, creating an unequal experience and potential confusion.\n\n## Accessibility Requirements\n\n| Requirement | Implementation |\n|-------------|----------------|\n| Keyboard accessible | Show on focus, not just hover |\n| Programmatically associated | Use `aria-describedby` |\n| Dismissible | Close with Escape key |\n| Persistent | Stay visible while hovered/focused |\n| Non-essential | Don't hide critical info in tooltips |\n\n## React Tooltip Component\n\n```tsx\n\ninterface TooltipProps {\n  content: string\n  children: React.ReactElement\n  position?: 'top' | 'bottom' | 'left' | 'right'\n  delay?: number\n}\n\n  content,\n  children,\n  position = 'top',\n  delay = 300\n}: TooltipProps) {\n  const [isVisible, setIsVisible] = useState(false)\n  const tooltipId = useId()\n  const timeoutRef = useRef {\n    clearTimeout(timeoutRef.current)\n    setIsVisible(false)\n  }\n\n  // Handle Escape key\n  useEffect(() => {\n    const handleKeyDown = (e: KeyboardEvent) => {\n      if (e.key === 'Escape' && isVisible) {\n        hideTooltip()\n      }\n    }\n\n    document.addEventListener('keydown', handleKeyDown)\n    return () => document.removeEventListener('keydown', handleKeyDown)\n  }, [isVisible])\n\n  // Clone child to add props\n  const trigger = React.cloneElement(children, {\n    ref: triggerRef,\n    'aria-describedby': isVisible ? tooltipId : undefined,\n    onMouseEnter: showTooltip,\n    onMouseLeave: hideTooltip,\n    onFocus: showTooltip,\n    onBlur: hideTooltip,\n  })\n\n  return (\n    <div className=\"tooltip-wrapper\">\n      {trigger}\n      {isVisible && (\n        <div\n          id={tooltipId}\n          role=\"tooltip\"\n          className={`tooltip tooltip--${position}`}\n        >\n          {content}\n        </div>\n      )}\n    </div>\n  )\n}\n```\n\n## Usage\n\n```tsx\n\n  <button type=\"button\">\n    \n    <span className=\"sr-only\">Save</span>\n  </button>\n\n  <label htmlFor=\"email\">\n    Email <span aria-hidden=\"true\">*</span>\n  </label>\n\n```\n\n## Advanced Tooltip with Floating UI\n\n```tsx\n\ninterface AdvancedTooltipProps {\n  content: React.ReactNode\n  children: React.ReactElement\n}\n\n  const [isOpen, setIsOpen] = useState(false)\n  const arrowRef = useRef(null)\n  const tooltipId = useId()\n\n  const { refs, floatingStyles, context } = useFloating({\n    open: isOpen,\n    onOpenChange: setIsOpen,\n    placement: 'top',\n    middleware: [\n      offset(8),\n      flip(),\n      shift({ padding: 8 }),\n      arrow({ element: arrowRef })\n    ],\n  })\n\n  return (\n    <>\n      {React.cloneElement(children, {\n        ref: refs.setReference,\n        'aria-describedby': isOpen ? tooltipId : undefined,\n        onMouseEnter: () => setIsOpen(true),\n        onMouseLeave: () => setIsOpen(false),\n        onFocus: () => setIsOpen(true),\n        onBlur: () => setIsOpen(false),\n      })}\n\n      {isOpen && (\n        <div\n          ref={refs.setFloating}\n          id={tooltipId}\n          role=\"tooltip\"\n          style={floatingStyles}\n          className=\"tooltip\"\n        >\n          {content}\n          <div ref={arrowRef} className=\"tooltip-arrow\" />\n        </div>\n      )}\n    </>\n  )\n}\n```\n\n## Icon Button with Tooltip\n\n```tsx\ninterface IconButtonProps {\n  icon: React.ReactNode\n  label: string\n  onClick: () => void\n  tooltip?: string\n}\n\n  const tooltipId = useId()\n  const [showTooltip, setShowTooltip] = useState(false)\n\n  return (\n    <div className=\"icon-button-wrapper\">\n      <button\n        type=\"button\"\n        onClick={onClick}\n        aria-label={label}\n        aria-describedby={tooltip && showTooltip ? tooltipId : undefined}\n        onMouseEnter={() => setShowTooltip(true)}\n        onMouseLeave={() => setShowTooltip(false)}\n        onFocus={() => setShowTooltip(true)}\n        onBlur={() => setShowTooltip(false)}\n        className=\"icon-button\"\n      >\n        {icon}\n      </button>\n\n      {tooltip && showTooltip && (\n        <span id={tooltipId} role=\"tooltip\" className=\"tooltip\">\n          {tooltip}\n        </span>\n      )}\n    </div>\n  )\n}\n```\n\n## Native Title Attribute (Limited)\n\n```html\n<!-- Simple but limited accessibility -->\n<button type=\"button\" title=\"Save document\">\n  <svg aria-hidden=\"true\"><!-- save icon --></svg>\n  <span class=\"sr-only\">Save</span>\n</button>\n\n<!-- Better: Custom tooltip with full control -->\n<button\n  type=\"button\"\n  aria-describedby=\"save-tooltip\"\n  aria-label=\"Save\"\n>\n  <svg aria-hidden=\"true\"><!-- save icon --></svg>\n</button>\n<div id=\"save-tooltip\" role=\"tooltip\" class=\"tooltip\">\n  Save document (Ctrl+S)\n</div>\n```\n\n## Styling\n\n```css\n.tooltip-wrapper {\n  position: relative;\n  display: inline-block;\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1000;\n  padding: 0.5rem 0.75rem;\n  font-size: 0.875rem;\n  background: #1a1a1a;\n  color: #ffffff;\n  border-radius: 4px;\n  white-space: nowrap;\n  pointer-events: none;\n\n  /* Animation */\n  opacity: 0;\n  animation: tooltipFadeIn 0.15s ease-out forwards;\n}\n\n.tooltip--top {\n  bottom: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-bottom: 8px;\n}\n\n.tooltip--bottom {\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  margin-top: 8px;\n}\n\n.tooltip--left {\n  right: 100%;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-right: 8px;\n}\n\n.tooltip--right {\n  left: 100%;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-left: 8px;\n}\n\n/* Arrow */\n.tooltip::after {\n  content: '';\n  position: absolute;\n  border: 6px solid transparent;\n}\n\n.tooltip--top::after {\n  top: 100%;\n  left: 50%;\n  transform: translateX(-50%);\n  border-top-color: #1a1a1a;\n}\n\n@keyframes tooltipFadeIn {\n  from { opacity: 0; transform: translateX(-50%) translateY(4px); }\n  to { opacity: 1; transform: translateX(-50%) translateY(0); }\n}\n\n/* Respect motion preferences */\n@media (prefers-reduced-motion: reduce) {\n  .tooltip {\n    animation: none;\n    opacity: 1;\n  }\n}\n\n/* Ensure sufficient contrast */\n.tooltip {\n  /* WCAG requires 4.5:1 for normal text */\n  /* #ffffff on #1a1a1a = 16.1:1 ✓ */\n}\n```\n\n## When to Use Tooltips vs Other Patterns\n\n| Use Case | Pattern |\n|----------|---------|\n| Supplementary hint | Tooltip |\n| Essential instruction | Inline text |\n| Complex content | Popover/Dialog |\n| Form field help | `aria-describedby` text |\n| Icon-only button | `aria-label` + optional tooltip |\n\n## Verification\n\n1. Tab to trigger element - tooltip should appear\n2. Press Escape - tooltip should close\n3. Hover over trigger - tooltip appears after delay\n4. Move mouse to tooltip - should stay visible\n5. Test with screen reader (tooltip content announced)\n6. Verify tooltip doesn't block other content\n7. Check color contrast meets WCAG requirements\n\nNever put essential information in tooltips. They're for supplementary hints only. Critical content should be visible by default or in the main UI.\n\n<!-- File: skills/accessible-tooltips/SKILL.md (Tokens: ~317 | Category: anthropic-skill) -->\n---\nname: accessible-tooltips\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Create accessible tooltips. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"20\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accessible-tooltips\n---\n\n# Create accessible tooltips\n\nInaccessible tooltips leave keyboard and screen reader users without important contextual information, creating an unequal experience and potential confusion.\n\n## Quick Reference\n\n- Tooltips must be keyboard accessible (focusable trigger)\n- Use aria-describedby to associate tooltip with trigger\n- Allow hover and focus to show tooltip, Escape to dismiss\n- Ensure sufficient contrast and don't hide essential info in tooltips\n\n## Check\n\nVerify tooltips are keyboard accessible, use appropriate ARIA roles (tooltip), and can be dismissed without moving focus.\n\n## Fix\n\nImplement tooltips with role='tooltip', aria-describedby, keyboard triggering, and Escape key dismissal.\n\n## Explain\n\nExplain the accessibility requirements for tooltips including keyboard access, ARIA attributes, and timing considerations.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Create accessible tooltips. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accessible-tooltips\n\n<!-- File: skills/accesskeys/references/rule.md (Tokens: ~462 | Category: anthropic-skill) -->\n# Ensure accesskey values are unique\n\n> Checks that accesskey values are unique to avoid shortcut conflicts.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nThe `accesskey` attribute allows developers to assign keyboard shortcuts to specific elements. To ensure these shortcuts work reliably, each value must be unique within the document.\n\n## Code Example\n\n```html\n<!-- ✅ Correct: Unique access keys -->\n<a href=\"/home\" accesskey=\"h\">Home</a>\n<a href=\"/contact\" accesskey=\"c\">Contact</a>\n\n<!-- ❌ Incorrect: Duplicate access keys -->\n<a href=\"/save\" accesskey=\"s\">Save</a>\n<a href=\"/search\" accesskey=\"s\">Search</a>\n```\n\n## Why It Matters\n\n- **Predictable Navigation**: Ensures keyboard shortcuts work as intended without conflicts.\n- **Assistive Technology**: Screen readers and other assistive technologies depend on unique identifiers for reliable interaction.\n- **User Experience**: Prevents user frustration when a shortcut doesn't trigger the expected action or moves focus to the wrong element.\n- **Browser Consistency**: Different browsers handle duplicate access keys differently; uniqueness ensures a consistent experience across all platforms.\n\n## Exceptions\n\n- Evaluate the rendered experience before treating a static-code smell as a blocker; interaction timing, browser behavior, and assistive technology output often determine severity.\n- Not every secondary accessibility issue deserves equal weight; prioritize the issue that most directly blocks perception, operation, or understanding.\n- Avoid adding redundant markup or ARIA solely to satisfy a rule when a simpler semantic implementation would eliminate the issue entirely.\n\n## Standards\n\n- Align the implementation with W3C WAI: WCAG Overview and verify the rendered experience, not only the source code.\n- Align the implementation with MDN: Accessibility and verify the rendered experience, not only the source code.\n\n## Verification\n\n### Automated Checks\n\n- Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.\n- Run an automated accessibility checker such as axe or Lighthouse where applicable.\n\n### Manual Checks\n\n- Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.\n- Re-test one representative user flow with a screen reader if this rule affects a key interaction.\n\n<!-- File: skills/accesskeys/SKILL.md (Tokens: ~330 | Category: anthropic-skill) -->\n---\nname: accesskeys\ndescription: \"Use when reviewing rendered HTML, interactive components, or design-system patterns related to Ensure accesskey values are unique. Check native semantics first, then inspect keyboard behavior, focus flow, accessible names, and screen-reader output where relevant.\"\nmetadata:\n  category: accessibility\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/accessibility/accesskeys\n---\n\n# Ensure accesskey values are unique\n\nDuplicate access keys cause conflicts where only one element (usually the first) is reachable via the shortcut, making other elements inaccessible to keyboard users.\n\n## Quick Reference\n\n- Each `accesskey` attribute value must be unique on the page\n- Duplicate access keys can lead to unpredictable browser behavior\n- Helps keyboard users navigate reliably using defined shortcuts\n\n## Check\n\nCheck for duplicate `accesskey` attributes across the document to ensure each shortcut is unique.\n\n## Fix\n\nAssign unique values to each `accesskey` attribute or remove redundant ones to prevent shortcut conflicts.\n\n## Explain\n\nExplain how duplicate access keys affect keyboard accessibility and browser shortcut handling.\n\n## Code Review\n\nReview the rendered markup and interactive states that affect Ensure accesskey values are unique. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/accessibility/accesskeys\n\n<!-- File: skills/accordion-accessibility/references/rule.md (Tokens: ~1701 | Category: anthropic-skill) -->\n# Make accordions keyboard navigable\n\n> Accordion components use proper ARIA attributes and keyboard interactions for screen reader accessibility.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 25 min\n\n---\nAccessible accordions allow users to efficiently navigate and reveal content sections using any input method.\n\n## Code Example\n\n```html\n<div class=\"accordion\">\n  <h3>\n    <button\n      type=\"button\"\n      aria-expanded=\"false\"\n      aria-controls=\"panel-1\"\n      class=\"accordion__trigger\"\n      id=\"accordion-1\"\n    >\n      Section 1\n      <span class=\"accordion__icon\" aria-hidden=\"true\"></span>\n    </button>\n  </h3>\n  <div\n    id=\"panel-1\"\n    role=\"region\"\n    aria-labelledby=\"accordion-1\"\n    class=\"accordion__panel\"\n    hidden\n  >\n    <p>Panel 1 content goes here.</p>\n  </div>\n\n  <h3>\n    <button\n      type=\"button\"\n      aria-expanded=\"false\"\n      aria-controls=\"panel-2\"\n      class=\"accordion__trigger\"\n      id=\"accordion-2\"\n    >\n      Section 2\n      <span class=\"accordion__icon\" aria-hidden=\"true\"></span>\n    </button>\n  </h3>\n  <div\n    id=\"panel-2\"\n    role=\"region\"\n    aria-labelledby=\"accordion-2\"\n    class=\"accordion__panel\"\n    hidden\n  >\n    <p>Panel 2 content goes here.</p>\n  </div>\n</div>\n```\n\n## Why It Matters\n\nPoorly implemented accordions trap keyboard users and leave screen reader users unable to understand or navigate collapsed content sections.\n\n## ARIA Pattern Requirements\n\n| Element | Attribute | Purpose |\n|---------|-----------|---------|\n| Trigger | `button` element | Activatable with Enter/Space |\n| Trigger | `aria-expanded` | Indicates open/closed state |\n| Trigger | `aria-controls` | References panel ID |\n| Panel | `id` | Target of aria-controls |\n| Panel | `role=\"region\"` | Optional, for important sections |\n| Header | Heading element | Maintains document structure |\n\n## React Accordion Component\n\n```tsx\n\ninterface AccordionItemProps {\n  title: string\n  children: React.ReactNode\n  defaultOpen?: boolean\n}\n\ninterface AccordionProps {\n  children: React.ReactNode\n  allowMultiple?: boolean\n}\n\n  const [openItems, setOpenItems] = useState { itemRefs.current[index] = el },\n          } as any)\n        }\n        return child\n      })}\n    </div>\n  )\n}\n\n  title,\n  children,\n  defaultOpen = false,\n  _index,\n  _isOpen,\n  _onToggle,\n  _onKeyDown,\n  _ref,\n}: AccordionItemProps & {\n  _index?: number\n  _isOpen?: boolean\n  _onToggle?: () => void\n  _onKeyDown?: (e: KeyboardEvent) => void\n  _ref?: (el: HTMLButtonElement) => void\n}) {\n  const triggerId = useId()\n  const panelId = useId()\n  const isOpen = _isOpen ?? defaultOpen\n\n  return (\n    <div className=\"accordion__item\">\n      <h3 className=\"accordion__header\">\n        <button\n          ref={_ref}\n          type=\"button\"\n          id={triggerId}\n          aria-expanded={isOpen}\n          aria-controls={panelId}\n          onClick={_onToggle}\n          onKeyDown={_onKeyDown}\n          className=\"accordion__trigger\"\n        >\n          <span className=\"accordion__title\">{title}</span>\n          <span\n            className={`accordion__icon ${isOpen ? 'accordion__icon--open' : ''}`}\n            aria-hidden=\"true\"\n          />\n        </button>\n      </h3>\n      <div\n        id={panelId}\n        role=\"region\"\n        aria-labelledby={triggerId}\n        className=\"accordion__panel\"\n        hidden={!isOpen}\n      >\n        <div className=\"accordion__content\">\n          {children}\n        </div>\n      </div>\n    </div>\n  )\n}\n```\n\n## Usage\n\n```tsx\nYou can return items within 30 days of purchase...</p>\n  \n  \n    <p>Standard shipping takes 5-7 business days...</p>\n  \n  \n    <p>Yes, we ship to over 50 countries...</p>\n  \n\n```\n\n## Keyboard Navigation\n\n| Key | Action |\n|-----|--------|\n| `Enter` / `Space` | Toggle panel open/closed |\n| `Arrow Down` | Move focus to next header |\n| `Arrow Up` | Move focus to previous header |\n| `Home` | Move focus to first header |\n| `End` | Move focus to last header |\n\n## Native HTML Details/Summary\n\n```html\n<!-- Simple native accordion (limited styling) -->\n<details class=\"accordion-native\">\n  <summary>Section Title</summary>\n  <div class=\"accordion-native__content\">\n    <p>Content here...</p>\n  </div>\n</details>\n\n<details class=\"accordion-native\">\n  <summary>Another Section</summary>\n  <div class=\"accordion-native__content\">\n    <p>More content...</p>\n  </div>\n</details>\n```\n\n```tsx\n// React wrapper for details/summary\nfunction NativeAccordion({ title, children, defaultOpen = false }) {\n  return (\n    <details open={defaultOpen} className=\"accordion-native\">\n      <summary>{title}</summary>\n      <div className=\"accordion-native__content\">\n        {children}\n      </div>\n    </details>\n  )\n}\n```\n\n## Styling\n\n```css\n.accordion {\n  border: 1px solid #e0e0e0;\n  border-radius: 8px;\n  overflow: hidden;\n}\n\n.accordion__item {\n  border-bottom: 1px solid #e0e0e0;\n}\n\n.accordion__item:last-child {\n  border-bottom: none;\n}\n\n.accordion__header {\n  margin: 0;\n}\n\n.accordion__trigger {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  width: 100%;\n  padding: 1rem 1.5rem;\n  font-size: 1rem;\n  font-weight: 600;\n  text-align: left;\n  background: #fff;\n  border: none;\n  cursor: pointer;\n  transition: background-color 0.2s;\n}\n\n.accordion__trigger:hover {\n  background: #f5f5f5;\n}\n\n.accordion__trigger:focus-visible {\n  outline: 2px solid #0066cc;\n  outline-offset: -2px;\n}\n\n.accordion__icon {\n  width: 1.25rem;\n  height: 1.25rem;\n  transition: transform 0.2s;\n}\n\n.accordion__trigger[aria-expanded=\"true\"] .accordion__icon {\n  transform: rotate(180deg);\n}\n\n.accordion__panel[hidden] {\n  display: none;\n}\n\n.accordion__content {\n  padding: 0 1.5rem 1rem;\n}\n\n/* Animation */\n.accordion__panel {\n  animation: slideDown 0.2s ease-out;\n}\n\n@keyframes slideDown {\n  from {\n    opacity: 0;\n    transform: translateY(-8px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .accordion__panel,\n  .accordion__icon {\n    animation: none;\n    transition: none;\n  }\n}\n```\n\n## Verification\n\n1. Tab to first accordion header\n2. Press Enter/Space to toggle\n3. Use Arrow keys to navigate between headers\n4. Press Home/End to jump to first/last\n5. Test with screen reader (announces expanded state)\n6. Verify heading structure in accessibility tree\n7. Check focus is visible on all interactive elements\n\nChoose an appropriate heading level (h2, h3, etc.) based on the accordion's position in the document outline. Don't skip heading levels.\n\n<!-- File: skills/accordion-accessibility/SKILL.md (Tokens: ~325 | Category: anthropic-skill) -->\n---\nname: accordion-accessibility\ndescription: \"Use when reviewing templates, rendered HTML, or shared components related to Make accordions keyboard navigable. Validate the final browser-facing markup, not just the source framework abstraction.\"\nmetadata:\n  category: html\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"25\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/html/accordion-accessibility\n---\n\n# Make accordions keyboard navigable\n\nPoorly implemented accordions trap keyboard users and leave screen reader users unable to understand or navigate collapsed content sections.\n\n## Quick Reference\n\n- Use button elements for accordion triggers with aria-expanded\n- Associate panels with triggers using aria-controls\n- Support Arrow keys for navigation between headers\n- Use heading elements appropriately for document structure\n\n## Check\n\nVerify accordions use button triggers with aria-expanded, aria-controls, and proper keyboard navigation (Enter, Space, arrows).\n\n## Fix\n\nImplement accordions with button elements, aria-expanded state, aria-controls linking to content panels, and keyboard support.\n\n## Explain\n\nExplain the ARIA pattern for accessible accordions and how they enable keyboard and screen reader users to navigate collapsible content.\n\n## Code Review\n\nReview templates, server-rendered HTML, and shared components that output markup related to Make accordions keyboard navigable. Flag exact elements, attributes, and routes where the rendered HTML violates the rule.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/html/accordion-accessibility\n\n<!-- File: skills/affiliate-disclosure/references/rule.md (Tokens: ~458 | Category: anthropic-skill) -->\n# Provide clear affiliate disclosures\n\n> Checks for affiliate and sponsored content disclosures to maintain transparency.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nTransparency regarding financial incentives is crucial for building a sustainable relationship with your audience and complying with consumer protection laws.\n\n## Code Example\n\n```html\n<article>\n  <header>\n    <h1>The Best Laptops for Developers in 2024</h1>\n    <div class=\"disclosure\" style=\"background: #f9f9f9; padding: 10px; border-radius: 4px;\">\n      <p><small><em>Disclaimer: This post contains affiliate links. If you click on one and make a purchase, we may receive a small commission at no extra cost to you.</em></small></p>\n    </div>\n  </header>\n  \n  <p>Looking for a new laptop? Here are our top recommendations...</p>\n</article>\n```\n\n## Why It Matters\n\n- **Legal Compliance**: Adheres to FTC (Federal Trade Commission) and other international regulations regarding online advertising.\n- **User Trust**: Demonstrates honesty and transparency, which can lead to higher conversion rates over time.\n- **SEO Quality**: Prevents being flagged for \"sneaky redirects\" or hidden affiliate programs that can negatively impact rankings.\n- **E-E-A-T**: Supports the \"Trust\" pillar by showing you aren't hiding financial motivations.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.\n\n<!-- File: skills/affiliate-disclosure/SKILL.md (Tokens: ~335 | Category: anthropic-skill) -->\n---\nname: affiliate-disclosure\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Provide clear affiliate disclosures. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/affiliate-disclosure\n---\n\n# Provide clear affiliate disclosures\n\nClear disclosures are required by law (e.g., FTC guidelines) and are essential for maintaining user trust and preventing search engine penalties for hidden advertisements.\n\n## Quick Reference\n\n- Add a clear and conspicuous disclosure for any affiliate or sponsored links\n- Place the disclosure at the top of the page, before any affiliate links appear\n- Use simple, unambiguous language to explain the financial relationship\n\n## Check\n\nVerify that all pages containing affiliate links or sponsored content have a clear, visible disclosure before the links appear.\n\n## Fix\n\nAdd a standardized disclosure statement at the beginning of your content or near affiliate links to inform users of the partnership.\n\n## Explain\n\nExplain the legal and ethical importance of affiliate disclosures and how they impact user trust and SEO.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Provide clear affiliate disclosures. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/affiliate-disclosure\n\n<!-- File: skills/ai-content/references/rule.md (Tokens: ~624 | Category: anthropic-skill) -->\n# Audit and refine AI-generated content\n\n> Detects and reviews content that appears to be primarily AI-generated to ensure quality.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nWhile AI tools can assist in the writing process, the final output still has to satisfy [Google's Search Essentials](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) and deliver the depth expected from [high-quality content](/en/rules/seo/quality) that genuinely helps the reader.\n\n## Code Example\n\nWhile there's no \"code\" to detect AI, you can signal human involvement and expertise in your metadata and bylines.\n\n```html\n<article>\n  <header>\n    <h1>Advanced TypeScript Patterns</h1>\n    <div class=\"meta\">\n      <span>By Jane Smith, Senior Engineer</span>\n      <span>Fact-checked on October 20, 2023</span>\n    </div>\n  </header>\n  \n  <p>In this article, we'll explore patterns I've used in production at ScaleTech...</p>\n</article>\n```\n\n## Why It Matters\n\n- **Quality Standards**: Google's guidance on [creating helpful, reliable, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) targets low-value automation that does not add original insight.\n- **Accuracy**: AI can hallucinate facts; human verification is essential for [YMYL content](/en/rules/seo/ymyl-detection), where bad advice can cause real harm.\n- **Uniqueness**: Prevents your site from becoming a \"carbon copy\" of other sites using the same AI prompts.\n- **User Experience**: Human-edited content is generally more engaging, nuanced, and better at solving specific user problems.\n\nIf a draft feels generic, unsupported, or too close to what a model would produce by default, review it alongside thin-content risk before deciding it is ready to publish.\n\n## Exceptions\n\n- Necessary utility or compliance pages can be intentionally brief and should not be judged by the same editorial-depth expectations as ranking-focused content.\n- AI-assisted drafting is not a failure by itself; flag unsupported claims, missing editorial review, or low-originality output instead.\n- When a page has both trust-signal issues and crawl/index problems, make the page eligible to rank first and then improve the content quality signals.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.\n\n<!-- File: skills/ai-content/SKILL.md (Tokens: ~329 | Category: anthropic-skill) -->\n---\nname: ai-content\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Audit and refine AI-generated content. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/ai-content\n---\n\n# Audit and refine AI-generated content\n\nSearch engines prioritize helpful, reliable, people-first content; unedited AI content often lacks the depth and accuracy required for high rankings.\n\n## Quick Reference\n\n- Review AI-generated content for accuracy, unique value, and human-like voice\n- Ensure content isn't just a rewrite of existing top-ranking articles\n- Verify all factual claims and include original research or insights\n\n## Check\n\nReview the content to see if it provides unique value beyond what AI models can generate by default.\n\n## Fix\n\nRewrite AI-generated sections to include original research, personal experiences, and a unique brand voice.\n\n## Explain\n\nExplain why human oversight is necessary for AI-generated content to meet SEO quality standards and user expectations.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Audit and refine AI-generated content. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/ai-content\n\n<!-- File: skills/all-noindex-pages/references/rule.md (Tokens: ~459 | Category: anthropic-skill) -->\n# Audit all noindex pages\n\n> Lists and reviews all pages blocked from indexing to ensure critical content is accessible.\n\n**Priority:** medium · **Difficulty:** intermediate · **Time:** 10 min\n\n---\nRegularly auditing your `noindex` directives ensures that you are only blocking pages that don't provide search value, such as staging environments, admin panels, or internal search results.\n\n## Code Example\n\n```html\n<head>\n  <!-- Use this for utility pages like 'Thank You' pages or internal search results -->\n  <meta name=\"robots\" content=\"noindex, follow\">\n  \n  <!-- For pages that should be completely ignored -->\n  <meta name=\"robots\" content=\"noindex, nofollow\">\n</head>\n```\n\n## Why It Matters\n\n- **Visibility**: Prevents accidental exclusion of high-value pages from Google and Bing.\n- **Crawl Budget**: Helps search engines focus their limited crawl resources on your most important pages.\n- **De-indexing**: Useful for removing outdated or sensitive pages from search results without deleting them.\n- **Strategic Control**: Allows you to manage which versions of content (e.g., filtered lists) are available for indexing.\n\n## Exceptions\n\n- Staging, utility, login, account, or internal search pages may intentionally use different crawl or index signals if they are not meant to rank.\n- Temporary migration states can produce noisy intermediate signals; flag the live production URL pattern, not one-off transition artifacts.\n- When redirects, canonicals, robots directives, or indexability signals conflict, fix the strongest final signal first instead of reporting every downstream symptom as a separate blocker.\n\n## Standards\n\n- Use these references as the standard for the final search-facing HTML, metadata, and crawl behavior.\n- Check the implementation against Google Search Central: Search Essentials before treating the rule as satisfied.\n- Check the implementation against Google Search Central documentation before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Inspect rendered HTML and HTTP headers to confirm the expected metadata or crawlability signal is present.\n- Test the affected URL with Google Search Console or equivalent tooling where relevant.\n- Re-crawl a representative page set after deployment.\n\n### Manual Checks\n\n- Confirm the change does not create conflicting canonical-url, robots, or structured-data signals.\n\n<!-- File: skills/all-noindex-pages/SKILL.md (Tokens: ~358 | Category: anthropic-skill) -->\n---\nname: all-noindex-pages\ndescription: \"Use when auditing metadata, crawlability, structured data, or indexability related to Audit all noindex pages. Verify the rendered HTML and HTTP response rather than relying only on source files.\"\nmetadata:\n  category: seo\n  priority: medium\n  difficulty: intermediate\n  estimatedTime: \"10\"\n  source: frontendchecklist.io\n  url: https://frontendchecklist.io/rules/seo/all-noindex-pages\n---\n\n# Audit all noindex pages\n\nAn incorrect `noindex` tag can completely remove important pages from search results, while proper usage helps manage crawl budget and prevents duplicate content issues.\n\n## Quick Reference\n\n- Identify all pages using the `noindex` directive in meta tags or headers\n- Verify that critical pages (products, articles) aren't accidentally blocked\n- Ensure `noindex` is correctly applied to thin content, admin, or utility pages\n\n## Check\n\nVerify that the `noindex` directive is only applied to pages that should not appear in search results.\n\n## Fix\n\nRemove `&lt;meta name=\"robots\" content=\"noindex\"&gt;` from pages that should be indexed and ranking.\n\n## Explain\n\nExplain the difference between `noindex` and `disallow` in robots.txt and when to use each for optimal SEO.\n\n## Code Review\n\nReview metadata generation, rendered HTML, structured data, and response headers related to Audit all noindex pages. Flag exact routes or templates where search-facing output violates the rule, and describe how to verify the final page output.\n\n---\n\nFor full implementation details, code examples, and framework-specific guidance,\nsee `references/rule.md`.\n\nRule page: https://frontendchecklist.io/rules/seo/all-noindex-pages\n\n<!-- File: skills/alt-text/references/rule.md (Tokens: ~1150 | Category: anthropic-skill) -->\n# Provide meaningful alt text for images\n\n> Every informative image has a descriptive alt attribute; decorative images use alt=\"\" to be ignored by screen readers.\n\n**Priority:** critical · **Difficulty:** beginner · **Time:** 15 min\n\n---\nThe `alt` attribute is the primary accessibility mechanism for images. Every `<img>` must have an `alt` attribute. Its value depends on the image's role.\n\nUse the [W3C alt decision tree](https://www.w3.org/WAI/tutorials/images/decision-tree/) to determine the correct alt value for any image type.\n\n## Code Example\n\nImages that convey meaning need descriptive alt text explaining what the image communicates.\n\n```html\n<!-- ❌ Bad: Missing alt -->\n<img src=\"revenue-chart.png\">\n\n<!-- ❌ Bad: Filename as alt -->\n<img src=\"revenue-chart.png\" alt=\"revenue-chart.png\">\n\n<!-- ❌ Bad: Generic alt -->\n<img src=\"revenue-chart.png\" alt=\"chart\">\n\n<!-- ✅ Good: Describes what the image conveys -->\n<img\n  src=\"revenue-chart.png\"\n  alt=\"Bar chart showing Q3 2024 revenue increased 40% year-over-year, reaching $2.4M\"\n>\n```\n\n## Why It Matters\n\nApproximately 2.2 billion people worldwide have vision impairment. Screen readers read the alt attribute aloud—without meaningful alt text, users who are blind receive no information about image content. Missing alt text also fails WCAG 2.1 Success Criterion 1.1.1, which is a Level A (minimum) requirement. Search engines also rely on alt text to index image content.\n\n## Decorative Images\n\nImages used purely for visual decoration carry no information and should be hidden from assistive technology.\n\n```html\n<!-- ❌ Bad: No alt attribute—screen reader may announce the filename -->\n<img src=\"decorative-swirl.png\">\n\n<!-- ✅ Good: Empty alt hides image from screen readers -->\n<img src=\"decorative-swirl.png\" alt=\"\">\n\n<!-- ✅ Good: Or use CSS background images for decoration -->\n<div class=\"decorative-swirl\" aria-hidden=\"true\"></div>\n```\n\n## Images Used as Links\n\nWhen an `<img>` is inside an `<a>`, the alt text must describe the link destination, not the visual appearance.\n\n```html\n<!-- ❌ Bad: Describes appearance, not destination -->\n<a href=\"https://twitter.com/example\">\n  <img src=\"twitter-logo.svg\" alt=\"Blue bird logo\">\n</a>\n\n<!-- ✅ Good: Describes the link destination -->\n<a href=\"https://twitter.com/example\">\n  <img src=\"twitter-logo.svg\" alt=\"Follow us on Twitter\">\n</a>\n```\n\n## Images of Text\n\nIf an image contains text (e.g., a logo, banner, or screenshot), reproduce that text verbatim in alt.\n\n```html\n<!-- ✅ Good: Alt reproduces the text shown in the image -->\n<img src=\"sale-banner.png\" alt=\"Summer Sale — 50% off all items\">\n\n<!-- ✅ Good: Logo with company name -->\n<img src=\"logo.svg\" alt=\"Acme Corp\">\n```\n\n## Complex Images (Charts, Diagrams)\n\nFor complex visuals, provide a brief alt plus a longer description accessible to all users.\n\n```html\n<!-- Using aria-describedby to link to a visible description -->\n<figure>\n  <img\n    src=\"org-chart.png\"\n    alt=\"Company organisational chart\"\n    aria-describedby=\"org-chart-desc\"\n  >\n  <figcaption id=\"org-chart-desc\">\n    The chart shows three departments reporting to the CEO: Engineering (12 staff),\n    Marketing (8 staff), and Operations (5 staff).\n  </figcaption>\n</figure>\n```\n\n## Framework Examples\n\n  \n\n```tsx\ninterface ImageProps {\n  src: string\n  alt: string\n  decorative?: boolean\n}\n\nfunction AccessibleImage({ src, alt, decorative = false }: ImageProps) {\n  return (\n    <img\n      src={src}\n      // Decorative images use empty string; informative images use descriptive text\n      alt={decorative ? '' : alt}\n    />\n  )\n}\n\n// Usage\n\n```\n\n  \n  \n\n```tsx\n\n// Next.js Image requires alt; use \"\" for decorative\nfunction HeroBanner() {\n  return (\n    <>\n      {/* Informative */}\n      \n\n      {/* Decorative */}\n      \n    </>\n  )\n}\n```\n\n  \n\n## Standards\n\n- Use these references as the standard for the final image format, delivery, accessibility, and rendering behavior.\n- Check the implementation against MDN: Responsive images before treating the rule as satisfied.\n- Check the implementation against web.dev: Image performance before treating the rule as satisfied.\n\n## Verification\n\n### Automated Checks\n\n- Run axe DevTools or WAVE on the page—both flag missing or empty non-decorative alt attributes\n- Use Lighthouse Accessibility audit—\"Images do not have alternate text\" is a scored item\n\n### Manual Checks\n\n- Enable a screen reader (VoiceOver, NVDA, or JAWS) and navigate through images with the `G` key\n- Inspect the Network tab: for any image URL, verify the corresponding `<img>` has a meaningful `alt`\n- **CAPTCHA images** — provide alt describing the purpose, not the characters (e.g., `alt=\"CAPTCHA: type the characters shown\"`), and offer an audio alternative per WCAG 1.1.1\n- **SVG icons with adjacent text labels** — if the icon's meaning is already conveyed by visible text, use `aria-hidden=\"true\"` on the SVG instead of alt\n\n<!-- ... +764 more modular skills available via /api/skills/thedaviddias/Front-End-Checklist?path={path} -->\n</yakaai_skills>"}