Skip to content

a11y(2.4.6): guard DrawerContent against empty <h2> when title is omitted#3595

Open
rosanusi wants to merge 1 commit into
mainfrom
wcag/2.4.6-drawer-content-empty-title
Open

a11y(2.4.6): guard DrawerContent against empty <h2> when title is omitted#3595
rosanusi wants to merge 1 commit into
mainfrom
wcag/2.4.6-drawer-content-empty-title

Conversation

@rosanusi

Copy link
Copy Markdown
Contributor

Summary

DrawerContent defaulted title to '' and unconditionally rendered <h2>{title}</h2>. When a consumer omitted the prop (two cloud consumers do), the DOM contained an empty heading — no accessible name, failing WCAG 2.4.6 (Headings and Labels, AA) and 4.1.2 (Name, Role, Value).

Fix: wrap the title-wrapper div in {#if title || $$slots['subtitle']} and the <h2> in {#if title}. The element is only emitted when content exists; the subtitle slot continues to render independently.

What changes

-<div class="title-wrapper {position}">
-  <h2>{title}</h2>
-  {#if $$slots['subtitle']}
-    ...
-  {/if}
-</div>
+{#if title || $$slots['subtitle']}
+  <div class="title-wrapper {position}">
+    {#if title}
+      <h2>{title}</h2>
+    {/if}
+    {#if $$slots['subtitle']}
+      ...
+    {/if}
+  </div>
+{/if}

Impact

  • Consumers that pass title= (all 9 existing correct usages): no change in rendered output.
  • Consumers that omit title (the two cloud gaps): empty <h2> removed.
  • Subtitle-only usage: the wrapper still renders when only a subtitle slot is provided.

Test plan

  • Open any drawer that passes a title (Manage Capacity, Bulk Add, Task Queue Fairness, Activity Options, Configure Headers, Keyboard Shortcuts). Confirm <h2> still renders with correct text.
  • Open a drawer with only a subtitle slot (if any). Confirm the wrapper renders but no <h2>.
  • axe-core: no empty heading violations on any drawer.
  • Storybook visual regression: drawer story shows correct layout.

References

A11y-Audit-Ref: 2.4.6-cloud-drawer-content-empty-title

🤖 Generated with Claude Code

…tted

DrawerContent always rendered <h2>{title}</h2> even when title was '' (the
default), producing an empty heading that fails WCAG 2.4.6 (Headings and
Labels, AA) and 4.1.2 (Name, Role, Value).

Wrap the title-wrapper div in {#if title || $$slots['subtitle']} and the <h2>
in {#if title} so the element is only emitted when content exists. The
subtitle slot continues to render independently. Consumers that pass title=
are unaffected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
holocene Ready Ready Preview, Comment Jun 24, 2026 2:56pm

Request Review

@github-actions github-actions Bot added a11y Accessibility audit PR a11y:broken-ref A11y-Audit-Ref slug not in manifest labels Jun 24, 2026
@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Accessibility triage

Unknown slugs in manifest:

  • 2.4.6-cloud-drawer-content-empty-title

Either the slug is misspelled, or the entry has not been authored yet. Audit team: add the entry to scripts/a11y/manifest.yml (or correct the slug here).


See DT-4048 for the triage system design.

@rosanusi rosanusi marked this pull request as ready for review June 25, 2026 15:13
@rosanusi rosanusi requested a review from a team as a code owner June 25, 2026 15:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a11y:broken-ref A11y-Audit-Ref slug not in manifest a11y Accessibility audit PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant