# svelte-vitals > Your SvelteKit app's code health, checked before it ships. Statically, no browser — SEO, performance, correctness, security, architecture, accessibility. ## Docs - [svelte-vitals](https://oekazuma.github.io/svelte-vitals): Your SvelteKit app's code health, checked before it ships. Statically, no browser. Covers SEO, Performance, Correctness, Security, Architecture, and Accessibility. ## Guides ### Getting started - [Getting started](https://oekazuma.github.io/svelte-vitals/guides/getting-started): Install svelte-vitals and run your first health check in seconds. - [Choosing a package](https://oekazuma.github.io/svelte-vitals/guides/choosing-a-package): Which svelte-vitals package to use, and when to combine them. CLI, Vite plugin, GitHub Action, or Agent Skills. ### CLI & setup - [CLI reference](https://oekazuma.github.io/svelte-vitals/guides/cli): Complete reference for all svelte-vitals command-line flags. - [svelte-vitals install](https://oekazuma.github.io/svelte-vitals/guides/install): Set up the Vite integration, Cursor rules, the config file, and CI. - [Config file](https://oekazuma.github.io/svelte-vitals/guides/configuration): Configure svelte-vitals once with svelte-vitals.config, instead of repeating flags. ### Vite integration - [Plugin mode](https://oekazuma.github.io/svelte-vitals/guides/plugin-mode): Integrate svelte-vitals into vite build to analyze prerendered HTML at build time. - [Live dashboard](https://oekazuma.github.io/svelte-vitals/guides/dev-dashboard): A live, filterable code-health dashboard during `vite dev`. Enabled by default, no build step needed. ### AI agents - [Agent Skills](https://oekazuma.github.io/svelte-vitals/guides/agent-skills): Slash-command skills that teach Claude Code, Cursor, and Codex how to derive a config file for a project adopting svelte-vitals, how to run a project-wide improvement audit, and the rules themselves. ### Reporting & CI - [Reporters](https://oekazuma.github.io/svelte-vitals/guides/reporters): Choose how svelte-vitals formats and outputs its findings. - [Health score](https://oekazuma.github.io/svelte-vitals/guides/health-report): Understand the weighted Health score and use --min-health as a CI gate. - [CI integration](https://oekazuma.github.io/svelte-vitals/guides/ci): Gate pull requests on svelte-vitals findings with a generated GitHub Actions workflow. ## Rules - [Rules](https://oekazuma.github.io/svelte-vitals/rules): Every check svelte-vitals runs, grouped by category. ### SEO - [SEO](https://oekazuma.github.io/svelte-vitals/rules/seo): Every SEO rule svelte-vitals runs. - [seo/canonical-url · Canonical URL](https://oekazuma.github.io/svelte-vitals/rules/seo/canonical-url): Every route should include a tag. - [seo/charset · Character encoding](https://oekazuma.github.io/svelte-vitals/rules/seo/charset): The page should declare a character encoding with . - [seo/description-length · Description length](https://oekazuma.github.io/svelte-vitals/rules/seo/description-length): The meta description should be 70–160 characters. - [seo/description-presence · Description presence](https://oekazuma.github.io/svelte-vitals/rules/seo/description-presence): Every route should include a . - [seo/duplicate-description · Duplicate description](https://oekazuma.github.io/svelte-vitals/rules/seo/duplicate-description): Each route should have a unique meta description. - [seo/duplicate-title · Duplicate title](https://oekazuma.github.io/svelte-vitals/rules/seo/duplicate-title): Each route should have a unique . - [seo/heading-level-skip · Heading order](https://oekazuma.github.io/svelte-vitals/rules/seo/heading-level-skip): Heading levels should not be skipped. - [seo/hreflang · hreflang validity](https://oekazuma.github.io/svelte-vitals/rules/seo/hreflang): hreflang alternates should use valid codes; x-default is recommended for selector/redirect pages. - [seo/html-lang · <html lang>](https://oekazuma.github.io/svelte-vitals/rules/seo/html-lang): Your project's app.html should set the lang attribute on <html>. - [seo/image-alt · Image alt text](https://oekazuma.github.io/svelte-vitals/rules/seo/image-alt): Every <img> should have an alt attribute. - [seo/indexability · Indexability](https://oekazuma.github.io/svelte-vitals/rules/seo/indexability): A route should not be accidentally set to noindex. - [seo/json-ld · JSON-LD structured data](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld): Every route should include JSON-LD structured data. - [seo/json-ld-date-format · JSON-LD date format](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-date-format): Date properties in JSON-LD should be ISO-8601. - [seo/json-ld-deprecated-type · Deprecated structured-data type](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-deprecated-type): Some schema types had their Google rich result dropped or restricted. - [seo/json-ld-placeholder · JSON-LD placeholder text](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-placeholder): JSON-LD should not contain unreplaced placeholder text. - [seo/json-ld-relative-url · JSON-LD relative URL](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-relative-url): URLs in JSON-LD should be absolute. - [seo/json-ld-required-props · JSON-LD required properties](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-required-props): A recognized @type should include the properties its rich result requires. - [seo/json-ld-validity · JSON-LD validity](https://oekazuma.github.io/svelte-vitals/rules/seo/json-ld-validity): A page's JSON-LD must be valid JSON with @context and @type. - [seo/og-description · Open Graph description](https://oekazuma.github.io/svelte-vitals/rules/seo/og-description): Every route should include an og:description. - [seo/og-image · Open Graph image](https://oekazuma.github.io/svelte-vitals/rules/seo/og-image): Every route should include a <meta property="og:image"> tag. - [seo/og-title · Open Graph title](https://oekazuma.github.io/svelte-vitals/rules/seo/og-title): Every route should include a <meta property="og:title"> tag. - [seo/og-url · Open Graph URL](https://oekazuma.github.io/svelte-vitals/rules/seo/og-url): Every route should include an og:url with its canonical address. - [seo/robots-txt · robots.txt](https://oekazuma.github.io/svelte-vitals/rules/seo/robots-txt): Your project should provide a robots.txt file. - [seo/single-h1 · Heading hierarchy](https://oekazuma.github.io/svelte-vitals/rules/seo/single-h1): Each page should have exactly one <h1>. - [seo/sitemap-in-robots · Sitemap referenced in robots.txt](https://oekazuma.github.io/svelte-vitals/rules/seo/sitemap-in-robots): robots.txt should point crawlers at your sitemap. - [seo/sitemap-xml · sitemap.xml](https://oekazuma.github.io/svelte-vitals/rules/seo/sitemap-xml): Your project should provide a sitemap.xml file. - [seo/ssr-disabled · SSR disabled](https://oekazuma.github.io/svelte-vitals/rules/seo/ssr-disabled): export const ssr = false makes a route's content invisible to non-JS crawlers and slower to first paint. - [seo/title-length · Title length](https://oekazuma.github.io/svelte-vitals/rules/seo/title-length): The document title should be 30–60 characters. - [seo/title-presence · Title presence](https://oekazuma.github.io/svelte-vitals/rules/seo/title-presence): Every route should resolve a non-empty <title>. - [seo/twitter-card · Twitter Card](https://oekazuma.github.io/svelte-vitals/rules/seo/twitter-card): Pages should declare a twitter:card for rich sharing on X/Twitter. - [seo/viewport · Viewport](https://oekazuma.github.io/svelte-vitals/rules/seo/viewport): Pages should declare a responsive viewport meta tag. ### Performance - [Performance](https://oekazuma.github.io/svelte-vitals/rules/performance): Every Performance rule svelte-vitals runs. - [performance/font-preload-crossorigin · Font preload missing crossorigin](https://oekazuma.github.io/svelte-vitals/rules/performance/font-preload-crossorigin): A font preload must set crossorigin so the preloaded file is actually used. - [performance/heavy-import · Heavy dependency import](https://oekazuma.github.io/svelte-vitals/rules/performance/heavy-import): Avoid importing large, non-tree-shakeable packages. - [performance/iframe-loading · Iframe loading attribute](https://oekazuma.github.io/svelte-vitals/rules/performance/iframe-loading): An offscreen iframe eagerly loads an entire third-party document of scripts, fonts and media, usually costing more than an offscreen image; loading="lazy" defers it. - [performance/image-dimensions · Image dimensions](https://oekazuma.github.io/svelte-vitals/rules/performance/image-dimensions): Every <img> should have explicit width and height attributes. - [performance/image-loading-hint · Image loading hint](https://oekazuma.github.io/svelte-vitals/rules/performance/image-loading-hint): Every <img> should have an explicit loading attribute. - [performance/lcp-image · LCP image eager loading](https://oekazuma.github.io/svelte-vitals/rules/performance/lcp-image): The first (likely LCP) image should not be lazy-loaded. - [performance/load-waterfall · Load waterfall](https://oekazuma.github.io/svelte-vitals/rules/performance/load-waterfall): Dependent sequential awaits in a universal load cost a network round trip from the browser per hop. - [performance/minify-disabled · Minification disabled](https://oekazuma.github.io/svelte-vitals/rules/performance/minify-disabled): A build.minify:false left in vite.config ships unminified JS/CSS to production. - [performance/namespace-import · Namespace import](https://oekazuma.github.io/svelte-vitals/rules/performance/namespace-import): Prefer named imports over import * as for tree-shaking. - [performance/preconnect · Preconnect third-party origin](https://oekazuma.github.io/svelte-vitals/rules/performance/preconnect): Preconnect to third-party origins used by the page. - [performance/preload-missing-as · Preload missing as](https://oekazuma.github.io/svelte-vitals/rules/performance/preload-missing-as): Every <link rel="preload"> should declare an as attribute. - [performance/render-blocking-script · Render-blocking script](https://oekazuma.github.io/svelte-vitals/rules/performance/render-blocking-script): A head <script src> should not block parsing. - [performance/responsive-image · Responsive image](https://oekazuma.github.io/svelte-vitals/rules/performance/responsive-image): Large images should provide a srcset. - [performance/sequential-awaits · Sequential independent awaits](https://oekazuma.github.io/svelte-vitals/rules/performance/sequential-awaits): Awaits that don't use each other's results still run one after another; start them together. - [performance/state-raw · Raw state opportunity](https://oekazuma.github.io/svelte-vitals/rules/performance/state-raw): Object/array $state that is only ever reassigned pays for deep reactivity it never uses; $state.raw skips the proxy. ### Correctness - [Correctness](https://oekazuma.github.io/svelte-vitals/rules/correctness): Every Correctness rule svelte-vitals runs. - [correctness/autoplay-muted · Autoplay video without muted](https://oekazuma.github.io/svelte-vitals/rules/correctness/autoplay-muted): Browsers block autoplay with audio, and a blocked autoplay does not error, so a <video autoplay> without muted silently never starts playing for real visitors. - [correctness/base-path-navigation · Root-relative navigation under a base path](https://oekazuma.github.io/svelte-vitals/rules/correctness/base-path-navigation): A hardcoded root-relative link resolves against the domain root, not kit.paths.base, so under a base path it lands outside the app and 404s in production. - [correctness/checkable-bind-value · bind:value on a checkable input](https://oekazuma.github.io/svelte-vitals/rules/correctness/checkable-bind-value): bind:value on a checkbox or radio input binds the DOM value property, which checkbox/radio interaction never changes, so the bound state silently never updates. - [correctness/each-index-key · Index used as each key](https://oekazuma.github.io/svelte-vitals/rules/correctness/each-index-key): Keying an {#each} block by its index gives items position-based identity, the same bug as no key, only masked. - [correctness/each-key · Keyed each block](https://oekazuma.github.io/svelte-vitals/rules/correctness/each-key): An {#each} block over dynamic data should have a key. - [correctness/effect-as-derived · Effect used to derive state](https://oekazuma.github.io/svelte-vitals/rules/correctness/effect-as-derived): Use $derived instead of an $effect that only assigns state. - [correctness/effect-as-onmount · Effect used as onMount](https://oekazuma.github.io/svelte-vitals/rules/correctness/effect-as-onmount): An $effect that reads no reactive value belongs in an event handler, {@attach}, or onMount instead. - [correctness/instance-browser-global · Browser global during component initialisation](https://oekazuma.github.io/svelte-vitals/rules/correctness/instance-browser-global): A component's instance script runs on the server during SSR, so window/document reads at its top level crash the render. - [correctness/nonreactive-builtin-state · Non-reactive built-in in $state](https://oekazuma.github.io/svelte-vitals/rules/correctness/nonreactive-builtin-state): A plain Map, Set, Date, URL, or URLSearchParams in $state is not proxied, so its mutations are invisible to reactivity and the UI silently stops updating. - [correctness/orphan-effect · Orphan $effect](https://oekazuma.github.io/svelte-vitals/rules/correctness/orphan-effect): An $effect created outside component initialisation throws effect_orphan at runtime. - [correctness/orphan-lifecycle · Lifecycle call outside component initialisation](https://oekazuma.github.io/svelte-vitals/rules/correctness/orphan-lifecycle): onMount, getContext and friends called outside component initialisation throw lifecycle_outside_component at runtime. - [correctness/prop-mutation · Mutated non-bindable prop](https://oekazuma.github.io/svelte-vitals/rules/correctness/prop-mutation): Don't mutate a prop from $props() unless it is declared $bindable. - [correctness/server-browser-global · Browser global in server module code](https://oekazuma.github.io/svelte-vitals/rules/correctness/server-browser-global): window, document, localStorage accessed in module scope or a load/handler crash SSR with a ReferenceError. - [correctness/stale-prop-derivation · Stale prop derivation](https://oekazuma.github.io/svelte-vitals/rules/correctness/stale-prop-derivation): A value computed from a prop without $derived is evaluated once, so the UI silently stops tracking the parent. - [correctness/unmutated-state · Unmutated $state](https://oekazuma.github.io/svelte-vitals/rules/correctness/unmutated-state): Use const (or $state.raw) for a $state that is never mutated. ### Security - [Security](https://oekazuma.github.io/svelte-vitals/rules/security): Every Security rule svelte-vitals runs. - [security/handler-state-write · Handler writes imported state](https://oekazuma.github.io/svelte-vitals/rules/security/handler-state-write): A load function or action writes to imported module state, shared across all requests on the server. - [security/javascript-url · javascript: URL](https://oekazuma.github.io/svelte-vitals/rules/security/javascript-url): Avoid javascript: URLs in attributes. - [security/raw-html · Raw HTML render](https://oekazuma.github.io/svelte-vitals/rules/security/raw-html): Sanitize the value; {@html} renders unescaped HTML. - [security/server-module-state · Server module-scope state](https://oekazuma.github.io/svelte-vitals/rules/security/server-module-state): A module-scope variable in a Kit route or hooks file is reassigned from a function, shared across all requests on the server. - [security/shared-state-import · Shared runes-state import on the server](https://oekazuma.github.io/svelte-vitals/rules/security/shared-state-import): A Kit server/universal file imports a .svelte.ts module holding module-scope $state, one shared instance per server process. ### Architecture - [Architecture](https://oekazuma.github.io/svelte-vitals/rules/architecture): Every Architecture rule svelte-vitals runs. - [architecture/component-size · Component size](https://oekazuma.github.io/svelte-vitals/rules/architecture/component-size): Very large components should be split up. - [architecture/directory-naming · Directory naming](https://oekazuma.github.io/svelte-vitals/rules/architecture/directory-naming): A directory should be named in the casing its location declares. - [architecture/doc-link-target · Documentation link target](https://oekazuma.github.io/svelte-vitals/rules/architecture/doc-link-target): A documentation link written in a comment must still point at something that exists. - [architecture/private-scope-import · Private-scope import](https://oekazuma.github.io/svelte-vitals/rules/architecture/private-scope-import): A unit inside a private directory should not be imported from outside it. - [architecture/prop-count · Prop count](https://oekazuma.github.io/svelte-vitals/rules/architecture/prop-count): Components taking many props are doing too much. - [architecture/reserved-directory-names · Reserved directory names](https://oekazuma.github.io/svelte-vitals/rules/architecture/reserved-directory-names): A directory's subdirectories should only take names declared for that position. - [architecture/reserved-name-placement · Reserved name placement](https://oekazuma.github.io/svelte-vitals/rules/architecture/reserved-name-placement): A reserved directory name may appear only in the places declared for it. - [architecture/route-component-import · Route component import](https://oekazuma.github.io/svelte-vitals/rules/architecture/route-component-import): A SvelteKit route entry is rendered by the framework, not imported by other components. - [architecture/unit-entry-file · Unit entry file](https://oekazuma.github.io/svelte-vitals/rules/architecture/unit-entry-file): A directory declared to be a unit should contain a file named after it. ### A11y - [Accessibility](https://oekazuma.github.io/svelte-vitals/rules/a11y): Every Accessibility rule svelte-vitals runs. - [a11y/abbr-title · Abbreviation without an expansion](https://oekazuma.github.io/svelte-vitals/rules/a11y/abbr-title): An <abbr> without a title gives readers no expansion. Visual users get no tooltip and assistive technology has nothing to expand. - [a11y/accessible-name · Interactive element has no accessible name](https://oekazuma.github.io/svelte-vitals/rules/a11y/accessible-name): A button, link, image button, or iframe needs a way to compute its accessible name. - [a11y/aria-hidden-focus · Focusable element hidden by aria-hidden](https://oekazuma.github.io/svelte-vitals/rules/a11y/aria-hidden-focus): A keyboard-focusable element must not be hidden from assistive technology with aria-hidden="true". - [a11y/deprecated-aria · Deprecated ARIA role or attribute](https://oekazuma.github.io/svelte-vitals/rules/a11y/deprecated-aria): A role or aria-* attribute ARIA 1.3 has deprecated, globally or on the role it sits on, still works today and is no longer defined there. - [a11y/deprecated-attr · Deprecated HTML attribute](https://oekazuma.github.io/svelte-vitals/rules/a11y/deprecated-attr): An attribute the HTML spec data marks deprecated on this element has its behavior defined by legacy compatibility, not by the standard. - [a11y/deprecated-element · Obsolete HTML element](https://oekazuma.github.io/svelte-vitals/rules/a11y/deprecated-element): An element in the HTML standard's obsolete-features list is non-conforming and has a conforming replacement. - [a11y/disallowed-aria-props · ARIA attribute not allowed on this role](https://oekazuma.github.io/svelte-vitals/rules/a11y/disallowed-aria-props): An aria-* attribute the element's role does not support is ignored; one the role prohibits, such as a name on a bare div, is a name that is not exposed. - [a11y/disallowed-element · Disallowed element](https://oekazuma.github.io/svelte-vitals/rules/a11y/disallowed-element): Reports every occurrence of the elements a project declares it does not want, and nothing until something is declared. - [a11y/doctype · Doctype](https://oekazuma.github.io/svelte-vitals/rules/a11y/doctype): src/app.html should open with <!doctype html>. - [a11y/duplicate-landmark · Duplicate landmark](https://oekazuma.github.io/svelte-vitals/rules/a11y/duplicate-landmark): A route should have at most one main, banner, and contentinfo landmark. - [a11y/id-duplication · Id duplication](https://oekazuma.github.io/svelte-vitals/rules/a11y/id-duplication): Every id in a route should be unique. - [a11y/interactive-nesting · Interactive element nested in an interactive element](https://oekazuma.github.io/svelte-vitals/rules/a11y/interactive-nesting): An interactive element should not sit inside another interactive element. - [a11y/invalid-aria-value · Invalid ARIA attribute value](https://oekazuma.github.io/svelte-vitals/rules/a11y/invalid-aria-value): An aria-* attribute's value should match the type the WAI-ARIA spec defines for it. - [a11y/invalid-role · Invalid ARIA role](https://oekazuma.github.io/svelte-vitals/rules/a11y/invalid-role): A role attribute should name a concrete WAI-ARIA role, not a typo or an abstract role. - [a11y/label-has-control · <label> has no associated control](https://oekazuma.github.io/svelte-vitals/rules/a11y/label-has-control): A label needs a for attribute or a wrapped control to be associated with the field it names. - [a11y/no-accesskey · Accesskey attribute](https://oekazuma.github.io/svelte-vitals/rules/a11y/no-accesskey): The accesskey attribute assigns a page-level shortcut key whose actual combination varies by browser and OS, is undiscoverable, and conflicts with assistive-technology bindings. - [a11y/no-autofocus · Autofocus outside a dialog](https://oekazuma.github.io/svelte-vitals/rules/a11y/no-autofocus): autofocus moves focus on page load without the user asking, so screen reader users lose the page context they were building and keyboard users are dropped mid-page. - [a11y/no-duplicate-dt · Duplicate <dt> names in a <dl>](https://oekazuma.github.io/svelte-vitals/rules/a11y/no-duplicate-dt): Within a single dl element there should not be more than one dt element for each name; a duplicated term usually means two descriptions were meant to share one dt. - [a11y/no-missing-id-ref · No missing id reference](https://oekazuma.github.io/svelte-vitals/rules/a11y/no-missing-id-ref): An id reference should point to an id that exists somewhere in the composed route. - [a11y/pattern-title · Pattern input without a format description](https://oekazuma.github.io/svelte-vitals/rules/a11y/pattern-title): When an input has a pattern, the spec says authors should include a title describing the expected format; without it a failed submit tells the user only that the value is wrong. - [a11y/permitted-contents · Permitted contents](https://oekazuma.github.io/svelte-vitals/rules/a11y/permitted-contents): Every element must be permitted content of its parent, per the HTML content models. - [a11y/placeholder-label-option · Missing placeholder label option](https://oekazuma.github.io/svelte-vitals/rules/a11y/placeholder-label-option): A required, single-selection select needs an empty first option so users can't submit it unchanged. - [a11y/positive-tabindex · Positive tabindex](https://oekazuma.github.io/svelte-vitals/rules/a11y/positive-tabindex): A tabindex above 0 puts the element ahead of every naturally-ordered element on the page, so a single tabindex="1" reorders keyboard navigation globally. - [a11y/require-datetime · Missing datetime attribute](https://oekazuma.github.io/svelte-vitals/rules/a11y/require-datetime): A time element's text should be machine-readable, or a datetime attribute should supply the machine-readable value. - [a11y/required-aria-props · Missing required ARIA props](https://oekazuma.github.io/svelte-vitals/rules/a11y/required-aria-props): A role that requires state or property attributes needs them present, unless native host semantics already supply them. - [a11y/required-element · Required element](https://oekazuma.github.io/svelte-vitals/rules/a11y/required-element): Every route must contain the elements a project declares, judged on the composed route, so a layout's <main> counts. - [a11y/top-level-landmark · Top-level landmark](https://oekazuma.github.io/svelte-vitals/rules/a11y/top-level-landmark): A banner, main, complementary, or contentinfo landmark should not be nested inside another landmark. - [a11y/unknown-aria-attribute · Unknown ARIA attribute](https://oekazuma.github.io/svelte-vitals/rules/a11y/unknown-aria-attribute): An aria-* attribute should name a real WAI-ARIA attribute, not a typo. - [a11y/unverified-id-ref · Unverified id reference](https://oekazuma.github.io/svelte-vitals/rules/a11y/unverified-id-ref): Opt-in: flags id references that cannot be verified on routes whose composition is not fully resolved. - [a11y/use-list · Bullet text should be a list](https://oekazuma.github.io/svelte-vitals/rules/a11y/use-list): A bullet character typed into plain text should be a real list element instead. ## 日本語 ### Docs - [svelte-vitals](https://oekazuma.github.io/svelte-vitals/ja): SvelteKit アプリのコードヘルスを、リリース前に。静的解析だけ、ブラウザ不要。SEO、Performance、Correctness、Security、Architecture、Accessibility の6カテゴリを診断します。 ### Guides #### はじめに - [はじめに](https://oekazuma.github.io/svelte-vitals/ja/guides/getting-started): svelte-vitals をインストールして、数秒で最初のヘルスチェックを実行しましょう。 - [パッケージの選び方](https://oekazuma.github.io/svelte-vitals/ja/guides/choosing-a-package): svelte-vitals のどのパッケージ(CLI、Vite プラグイン、GitHub Action、Agent Skills)をいつ使い、どう組み合わせるか。 #### CLI・セットアップ - [CLI リファレンス](https://oekazuma.github.io/svelte-vitals/ja/guides/cli): svelte-vitals のすべてのコマンドラインフラグの完全なリファレンス。 - [svelte-vitals install](https://oekazuma.github.io/svelte-vitals/ja/guides/install): Vite との連携、Cursor rules、設定ファイル、CI をセットアップする。 - [設定ファイル](https://oekazuma.github.io/svelte-vitals/ja/guides/configuration): 毎回フラグを指定する代わりに、svelte-vitals.config で一度だけ設定します。 #### Vite連携 - [プラグインモード](https://oekazuma.github.io/svelte-vitals/ja/guides/plugin-mode): ビルド時にプリレンダリングされた HTML を分析するために svelte-vitals を vite build に統合します。 - [ライブダッシュボード](https://oekazuma.github.io/svelte-vitals/ja/guides/dev-dashboard): `vite dev` 中に動作する、フィルタ可能なライブのコード健全性ダッシュボード。デフォルトで有効、ビルド不要。 #### AIエージェント - [Agent Skills](https://oekazuma.github.io/svelte-vitals/ja/guides/agent-skills): Claude Code、Cursor、Codex に svelte-vitals 導入時の設定ファイルを導出させ、プロジェクト全体の改善監査を実行させ、ルールそのものを教えるスラッシュコマンドのスキル。 #### レポート・CI - [レポーター](https://oekazuma.github.io/svelte-vitals/ja/guides/reporters): svelte-vitals が検出結果をフォーマットして出力する方法を選択します。 - [Health スコア](https://oekazuma.github.io/svelte-vitals/ja/guides/health-report): 重み付き Health スコアの仕組みと、--min-health を CI ゲートとして使う方法。 - [CI 連携](https://oekazuma.github.io/svelte-vitals/ja/guides/ci): 生成された GitHub Actions ワークフローで、svelte-vitals の検出結果に基づいてプルリクエストをゲートします。 ### Rules - [ルール](https://oekazuma.github.io/svelte-vitals/ja/rules): svelte-vitals が行うチェックの一覧。カテゴリ別にまとめています。 #### SEO - [SEO](https://oekazuma.github.io/svelte-vitals/ja/rules/seo): svelte-vitals の SEO ルール一覧。 - [seo/canonical-url · Canonical URL](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/canonical-url): すべてのルートに <link rel="canonical"> タグを含めるべきです。 - [seo/charset · 文字エンコーディング](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/charset): 文字エンコーディングは <meta charset> で宣言します。 - [seo/description-length · 説明文の長さ](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/description-length): meta description は 70〜160 文字に収めましょう。 - [seo/description-presence · ディスクリプションの存在](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/description-presence): すべてのルートに <meta name="description"> が必要です。 - [seo/duplicate-description · 説明文の重複](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/duplicate-description): meta description はルートごとに違う内容にしましょう。 - [seo/duplicate-title · タイトルの重複](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/duplicate-title): <title> はルートごとに違う内容にしましょう。 - [seo/heading-level-skip · 見出しの順序](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/heading-level-skip): 見出しのレベルは飛ばさずに使いましょう。 - [seo/hreflang · hreflang の妥当性](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/hreflang): hreflang の alternate には有効なコードを使いましょう。x-default はセレクター・リダイレクトページで推奨されます。 - [seo/html-lang · <html lang>](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/html-lang): app.html の <html> に lang 属性を設定しましょう。 - [seo/image-alt · 画像の alt テキスト](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/image-alt): <img> には alt 属性を付けます。 - [seo/indexability · インデックス可否](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/indexability): ルートが誤って noindex になっていないか確認します。 - [seo/json-ld · JSON-LD 構造化データ](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/json-ld): どのルートにも JSON-LD 構造化データを入れましょう。 - [seo/json-ld-date-format · JSON-LD の日付形式](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/json-ld-date-format): JSON-LD の日付プロパティは ISO-8601 形式で書きます。 - [seo/json-ld-deprecated-type · 非推奨の構造化データ型](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/json-ld-deprecated-type): 一部のスキーマ型は、Google のリッチリザルトが廃止または制限されました。 - [seo/json-ld-placeholder · JSON-LD のプレースホルダ](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/json-ld-placeholder): JSON-LD にプレースホルダのまま残っている値がないか確認します。 - [seo/json-ld-relative-url · JSON-LD の相対 URL](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/json-ld-relative-url): JSON-LD の URL は絶対 URL で書きます。 - [seo/json-ld-required-props · JSON-LD の必須プロパティ](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/json-ld-required-props): 認識できる @type には、リッチリザルトに必要なプロパティを揃えましょう。 - [seo/json-ld-validity · JSON-LD の妥当性](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/json-ld-validity): ページの JSON-LD は、@context と @type を備えた妥当な JSON である必要があります。 - [seo/og-description · Open Graph description](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/og-description): og:description はどのルートにも入れましょう。 - [seo/og-image · Open Graph 画像](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/og-image): <meta property="og:image"> タグはどのルートにも必要です。 - [seo/og-title · Open Graph タイトル](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/og-title): <meta property="og:title"> タグはどのルートにも必要です。 - [seo/og-url · Open Graph URL](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/og-url): og:url には、そのページの正規アドレスを入れましょう。 - [seo/robots-txt · robots.txt](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/robots-txt): プロジェクトに robots.txt を用意しましょう。 - [seo/single-h1 · 見出し階層](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/single-h1): <h1> は 1 ページにつき 1 つだけにしましょう。 - [seo/sitemap-in-robots · robots.txt の sitemap 参照](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/sitemap-in-robots): robots.txt から sitemap の場所をクローラーに伝えましょう。 - [seo/sitemap-xml · sitemap.xml](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/sitemap-xml): プロジェクトに sitemap.xml を用意しましょう。 - [seo/ssr-disabled · SSR の無効化](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/ssr-disabled): export const ssr = false にすると、JS を実行しないクローラーからコンテンツが見えなくなり、初回描画も遅くなります。 - [seo/title-length · タイトルの長さ](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/title-length): <title> は 30〜60 文字に収めましょう。 - [seo/title-presence · タイトルの存在](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/title-presence): どのルートでも <title> が空にならないようにしましょう。 - [seo/twitter-card · Twitter Card](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/twitter-card): X/Twitter で大きなカード表示にするため、twitter:card を宣言しましょう。 - [seo/viewport · ビューポート](https://oekazuma.github.io/svelte-vitals/ja/rules/seo/viewport): レスポンシブ表示のための viewport メタタグを宣言しましょう。 #### Performance - [Performance](https://oekazuma.github.io/svelte-vitals/ja/rules/performance): svelte-vitals の Performance ルール一覧。 - [performance/font-preload-crossorigin · フォント preload に crossorigin がない](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/font-preload-crossorigin): crossorigin を指定しないと、preload したフォントは使われません。 - [performance/heavy-import · 重い依存の import](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/heavy-import): サイズが大きく、ツリーシェイクも効かないパッケージの import は避けましょう。 - [performance/iframe-loading · iframe の loading 属性](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/iframe-loading): 画面外の iframe は、スクリプト・フォント・メディアを含むサードパーティのドキュメント全体を先読みし、画面外の画像より高くつくのが普通です。loading="lazy" で遅延できます。 - [performance/image-dimensions · 画像のサイズ指定](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/image-dimensions): <img> には width と height を明示します。 - [performance/image-loading-hint · 画像の読み込みヒント](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/image-loading-hint): <img> には loading 属性を明示します。 - [performance/lcp-image · LCP 画像の遅延読み込み](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/lcp-image): LCP になりそうな最初の画像は、遅延読み込みにしないでください。 - [performance/load-waterfall · Load waterfall](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/load-waterfall): universal load で依存関係のある await が数珠つなぎになると、1 ホップごとにブラウザからのネットワーク往復が発生します。 - [performance/minify-disabled · Minification disabled](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/minify-disabled): vite.config に build.minify:false が残っていると、ミニファイされていない JS/CSS がそのまま本番に配信されます。 - [performance/namespace-import · namespace import](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/namespace-import): ツリーシェイクを効かせるため、import * as ではなく名前付き import を使いましょう。 - [performance/preconnect · サードパーティオリジンへの preconnect](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/preconnect): ページが使うサードパーティのオリジンには、あらかじめ preconnect しておきましょう。 - [performance/preload-missing-as · preload に as がない](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/preload-missing-as): <link rel="preload"> には as 属性を指定します。 - [performance/render-blocking-script · レンダリングをブロックするスクリプト](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/render-blocking-script): head の <script src> で HTML の解析を止めないようにしましょう。 - [performance/responsive-image · レスポンシブ画像](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/responsive-image): 大きな画像には srcset を用意しましょう。 - [performance/sequential-awaits · Sequential independent awaits](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/sequential-awaits): 互いの結果を使わない await の逐次実行は無駄です。同時に開始しましょう。 - [performance/state-raw · Raw state opportunity](https://oekazuma.github.io/svelte-vitals/ja/rules/performance/state-raw): 再代入しかしないオブジェクト・配列の $state には、一度も使わない深いリアクティビティのコストがかかり続けます。$state.raw ならプロキシを省けます。 #### Correctness - [Correctness](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness): svelte-vitals の Correctness ルール一覧。 - [correctness/autoplay-muted · muted なしの自動再生ビデオ](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/autoplay-muted): ブラウザは音声付きの自動再生をブロックし、ブロックされてもエラーになりません。muted のない <video autoplay> は実際の訪問者の前で静かに再生されないままです。 - [correctness/base-path-navigation · Root-relative navigation under a base path](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/base-path-navigation): ルート相対リンクをハードコードすると kit.paths.base ではなくドメインのルートを指すため、base path の配下ではアプリの外に出てしまい、本番で 404 になります。 - [correctness/checkable-bind-value · bind:value on a checkable input](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/checkable-bind-value): checkbox や radio の bind:value は DOM の value プロパティを見るため、チェックを切り替えても値が更新されません。 - [correctness/each-index-key · Index used as each key](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/each-index-key): {#each} のキーに index を使うと、要素の同一性が位置で決まります。キーを付けないのと同じバグが、見えにくい形で起こります。 - [correctness/each-key · キー付き each ブロック](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/each-key): 動的なデータを回す {#each} にはキーを付けましょう。 - [correctness/effect-as-derived · 状態の導出に effect を使用](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/effect-as-derived): 状態を代入するだけの $effect は $derived に置き換えましょう。 - [correctness/effect-as-onmount · onMount 代わりの $effect](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/effect-as-onmount): reactive 値を読まない $effect は、イベントハンドラ、{@attach}、onMount のいずれかで書くべきです。 - [correctness/instance-browser-global · コンポーネント初期化中の browser global](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/instance-browser-global): インスタンススクリプトは SSR 時にサーバーでも実行されるため、トップレベルで window や document を参照するとレンダリングが落ちます。 - [correctness/nonreactive-builtin-state · Non-reactive built-in in $state](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/nonreactive-builtin-state): $state に入れた素の Map・Set・Date・URL・URLSearchParams はプロキシされないため、中身を変えても検知されず、気づかないうちに UI が更新されなくなります。 - [correctness/orphan-effect · 孤立した $effect](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/orphan-effect): コンポーネント初期化の外で作られた $effect はランタイムで effect_orphan エラーになります。 - [correctness/orphan-lifecycle · コンポーネント初期化外での lifecycle 呼び出し](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/orphan-lifecycle): onMount や getContext などをコンポーネント初期化の外で呼ぶと、ランタイムで lifecycle_outside_component エラーになります。 - [correctness/prop-mutation · 非 bindable prop の変異](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/prop-mutation): $bindable を宣言していない $props() の値は書き換えないでください。 - [correctness/server-browser-global · サーバー実行モジュールコードでの browser global](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/server-browser-global): モジュールスコープや load・ハンドラで window や document、localStorage を参照すると、SSR が ReferenceError で落ちます。 - [correctness/stale-prop-derivation · Stale prop derivation](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/stale-prop-derivation): $derived を使わずに prop から計算した値は一度しか評価されず、気づかないうちに親の変更へ追従しなくなります。 - [correctness/unmutated-state · 変更されない $state](https://oekazuma.github.io/svelte-vitals/ja/rules/correctness/unmutated-state): 一度も変更しない $state は、const(または $state.raw)で十分です。 #### Security - [Security](https://oekazuma.github.io/svelte-vitals/ja/rules/security): svelte-vitals の Security ルール一覧。 - [security/handler-state-write · handler から import した状態への書き込み](https://oekazuma.github.io/svelte-vitals/ja/rules/security/handler-state-write): load 関数や action が、import したモジュールの状態に書き込んでいます。サーバーではこの状態を全リクエストで共有します。 - [security/javascript-url · javascript: URL](https://oekazuma.github.io/svelte-vitals/ja/rules/security/javascript-url): 属性に javascript: URL を使わないでください。 - [security/raw-html · 生 HTML のレンダリング](https://oekazuma.github.io/svelte-vitals/ja/rules/security/raw-html): {@html} は HTML をエスケープせずに描画します。値は必ずサニタイズしてください。 - [security/server-module-state · サーバーのモジュールスコープ状態](https://oekazuma.github.io/svelte-vitals/ja/rules/security/server-module-state): ルートや hooks のファイルで、モジュールスコープの変数を関数の中から再代入しています。サーバーではこの変数を全リクエストで共有します。 - [security/shared-state-import · サーバーからの共有 runes 状態の import](https://oekazuma.github.io/svelte-vitals/ja/rules/security/shared-state-import): server / universal ファイルが、モジュールスコープに $state を持つ .svelte.ts を import しています。サーバープロセスでは 1 つのインスタンスを全リクエストで共有します。 #### Architecture - [Architecture](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture): svelte-vitals の Architecture ルール一覧。 - [architecture/component-size · コンポーネントサイズ](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/component-size): 大きくなりすぎたコンポーネントは分割しましょう。 - [architecture/directory-naming · ディレクトリの命名](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/directory-naming): ディレクトリは、その場所に宣言した記法で名付けるべきです。 - [architecture/doc-link-target · ドキュメントリンクのリンク先](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/doc-link-target): コメントに書かれたドキュメントリンクは、実在する何かを指し続けている必要があります。 - [architecture/private-scope-import · プライベートスコープの import](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/private-scope-import): プライベートなディレクトリ内のユニットを、その外から import すべきではありません。 - [architecture/prop-count · プロップ数](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/prop-count): props が多すぎるコンポーネントは、担っている責務も多すぎます。 - [architecture/reserved-directory-names · 予約ディレクトリ名](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/reserved-directory-names): ディレクトリの直下に置ける名前は、その位置に宣言した名前だけにすべきです。 - [architecture/reserved-name-placement · 予約名の配置](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/reserved-name-placement): 予約ディレクトリ名は、その名前について宣言した場所にしか現れてはいけません。 - [architecture/route-component-import · ルートコンポーネントの import](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/route-component-import): SvelteKit のルートエントリはフレームワークが描画するものであり、他のコンポーネントから import するものではありません。 - [architecture/unit-entry-file · ユニットのエントリファイル](https://oekazuma.github.io/svelte-vitals/ja/rules/architecture/unit-entry-file): ユニットとして宣言したディレクトリには、同名のファイルを置くべきです。 #### A11y - [Accessibility](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y): svelte-vitals の Accessibility ルール一覧。 - [a11y/abbr-title · 展開のない略語](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/abbr-title): title のない <abbr> は読者に展開形を提供しません。晴眼ユーザーにはツールチップが出ず、支援技術には展開するものがありません。 - [a11y/accessible-name · アクセシブルネームのない操作要素](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/accessible-name): ボタン・リンク・画像ボタン・iframe には、アクセシブルネームを算出できる手がかりが必要です。 - [a11y/aria-hidden-focus · aria-hidden がフォーカス可能な要素を隠している](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/aria-hidden-focus): キーボードでフォーカスできる要素を aria-hidden="true" で支援技術から隠してはいけません。 - [a11y/deprecated-aria · 非推奨の ARIA role または属性](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/deprecated-aria): ARIA 1.3 が全体として、または置かれた role 上で非推奨にした role や aria-* 属性は、いまも動くが、そこではもう定義されていません。 - [a11y/deprecated-attr · 非推奨の HTML 属性](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/deprecated-attr): HTML spec データがその要素で非推奨と記す属性は、標準ではなくレガシー互換によって挙動が決まっています。 - [a11y/deprecated-element · 廃止された HTML 要素](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/deprecated-element): HTML 標準の obsolete features に挙げられた要素は非適合であり、適合する代替要素があります。 - [a11y/disallowed-aria-props · この role では許されない ARIA 属性](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/disallowed-aria-props): 要素の role が対応しない aria-* 属性は無視され、role が禁止する属性、たとえば素の div への名前付けは、公開されない名前になります。 - [a11y/disallowed-element · 禁止された要素](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/disallowed-element): プロジェクトが「使わない」と宣言した要素の出現をすべて報告します。宣言するまでは何もしません。 - [a11y/doctype · doctype がない](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/doctype): src/app.html の先頭は <!doctype html> で始めましょう。 - [a11y/duplicate-landmark · ランドマークの重複](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/duplicate-landmark): 1つのルートに main・banner・contentinfo ランドマークはそれぞれ1つまでにしましょう。 - [a11y/id-duplication · id の重複](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/id-duplication): ルート内の id はすべて一意にしましょう。 - [a11y/interactive-nesting · 操作要素の中に操作要素がネストしている](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/interactive-nesting): インタラクティブな要素を、別のインタラクティブな要素の内側に置いてはいけません。 - [a11y/invalid-aria-value · 不正な ARIA 属性値](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/invalid-aria-value): aria-* 属性の値は、その属性に WAI-ARIA 仕様が定める型と一致させます。 - [a11y/invalid-role · 不正な ARIA ロール](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/invalid-role): role 属性には、タイポでも抽象ロールでもない、具体的な WAI-ARIA ロールを指定します。 - [a11y/label-has-control · `<label>` に関連付けられたコントロールがない](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/label-has-control): label をフィールドと関連付けるには for 属性かラップされたコントロールが必要です。 - [a11y/no-accesskey · accesskey 属性](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/no-accesskey): accesskey 属性はページレベルのショートカットキーを割り当てますが、実際のキーの組み合わせはブラウザと OS によって異なり、ユーザーには発見できず、支援技術のキーバインドと衝突します。 - [a11y/no-autofocus · ダイアログ外の autofocus](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/no-autofocus): autofocus はページ読み込み時にユーザーの意図と無関係にフォーカスを移動させます。スクリーンリーダーのユーザーは組み立てていたページの文脈を失い、キーボードのユーザーはページの途中に放り出されます。 - [a11y/no-duplicate-dt · <dl> 内の <dt> 名の重複](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/no-duplicate-dt): 1つの dl 要素の中で、同じ名前の dt 要素は複数あるべきではありません。重複した用語はたいてい、2つの説明が1つの dt を共有するはずだったコピペミスです。 - [a11y/no-missing-id-ref · id参照切れ](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/no-missing-id-ref): id参照は、合成後のルートのどこかに存在する id を指している必要があります。 - [a11y/pattern-title · 形式の説明がない pattern 入力欄](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/pattern-title): input に pattern を指定するときは、期待する形式を説明する title を含めるべきと仕様が述べています。それがないと、送信に失敗しても「値が違う」ことしか伝わりません。 - [a11y/permitted-contents · 許可されたコンテンツ](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/permitted-contents): すべての要素は、HTML のコンテンツモデル上、親要素に許可されたコンテンツでなければなりません。 - [a11y/placeholder-label-option · プレースホルダーの option がない](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/placeholder-label-option): required かつ単一選択の select には、値を選ばせずに送信できてしまわないよう空の先頭 option が必要です。 - [a11y/positive-tabindex · 正の tabindex](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/positive-tabindex): 0 より大きい tabindex はその要素をページ内の自然順のすべての要素より前に置き、たった1つの tabindex="1" がページ全体のキーボードナビゲーション順を組み替えてしまいます。 - [a11y/require-datetime · `datetime` 属性がない](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/require-datetime): time 要素のテキストは機械可読であるか、datetime 属性で機械可読な値を補う必要があります。 - [a11y/required-aria-props · 必須の ARIA プロパティがない](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/required-aria-props): state や property 属性を要求するロールには、ネイティブなホスト要素のセマンティクスで代替されない限り、それらの属性が必要です。 - [a11y/required-element · 必須要素](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/required-element): すべてのルートがプロジェクトの宣言する要素を含まなければなりません。合成されたルートで判定するので、レイアウトの <main> も数えます。 - [a11y/top-level-landmark · ランドマークがトップレベルにない](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/top-level-landmark): banner・main・complementary・contentinfo ランドマークは、他のランドマークの内側に置いてはいけません。 - [a11y/unknown-aria-attribute · 未知の ARIA 属性](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/unknown-aria-attribute): aria-* 属性には、タイポではない実在の WAI-ARIA 属性名を指定します。 - [a11y/unverified-id-ref · 未検証の id 参照](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/unverified-id-ref): オプトイン: 合成が完全には解決していないルート上で、検証できない id 参照を検出します。 - [a11y/use-list · 箇条書きテキストはリストにすべき](https://oekazuma.github.io/svelte-vitals/ja/rules/a11y/use-list): プレーンテキストに入力された行頭記号は、本物のリスト要素に置き換えるべきです。