Skip to content
SkillCodex
Menu

Bottom sheet

Bottom sheet

A mobile-oriented surface attached to the bottom edge that can open to stable heights and may support dragging.

Try the component
Context, sources and actions
Sources and revision
Updated
Version
v1.0.26 · r2
Sources
5 sources
Status
Published
Read the sources

You may have searched for: a panel that comes up from the bottom on mobiledrag this sheet higher to see morea phone panel with a grab handle

All phrasings
Save and share

Recognize

Edge-attached surfaces

Try it

Should the surface stay persistent, enter from a side edge, or rise from the bottom?

Bottom sheet

Shared trial context

A workspace places supporting navigation or controls along a screen edge while the main task stays in context.

Bottom sheet

Mission

Bottom sheet

On mobile, open Filters, move the sheet between half and full height by drag or buttons, enable In stock, and apply it.

12 results

Office furniture

  • Compact desk

    In stock

  • Adjustable chair

    Made to order

Live result

The 12 office furniture results are visible. The filter sheet is closed.

Step 1 of 3

Try

Try the component. Your live result appears just above. Move on at your own pace.

Behavior and edge case
What to observe
The temporary mobile sheet is attached to the bottom at half height, keeps the same furniture results visible behind it, and can snap to full height.
Edge case
Keyboard users can expand, collapse, apply the availability filter, and close without relying on dragging.

What this example shows

Bottom sheet is bottom-anchored and may be draggable; Drawer uses a defined side edge, while Sidebar remains part of the persistent layout.

Which fits your need?

Bottom sheet

Showing place details over a mobile map

Drawer

Editing filters without leaving results

Which component will you use here?
Difference and sources

Bottom sheet is bottom-anchored and may be draggable; Drawer uses a defined side edge, while Sidebar remains part of the persistent layout.

Read the sources

    Parts of the specimen

    Select a numbered marker on the schematic, or use the list below, to see its role. The schematic shows the concept's representative state.

    Backdrop

    The layer that separates a modal surface from inactive page content.

    Position in the atlas

    Relationship map

    Locate the chapter, neighboring concepts, and the next useful decision.

    • Chapter

      Edge-attached surfaces

      Bottom sheet belongs to this comparison group.

    • Do not confuse

      Drawer

      Choose Bottom sheet if the action is compact, especially on mobile, and benefits from staying above the content. Choose Drawer if the panel is more structured and enters from the left or right.

      Compare this pair
    • Do not confuse

      Sidebar

      Choose Bottom sheet if the surface appears for a one-off task, especially on mobile, then goes away. Choose Sidebar if navigation must stay visible and persistent in the workspace.

      Compare this pair
    • Next step

      Compare the concepts in the chapter before choosing an implementation.

      Open the chapter

    In your own words

    Understand

    What people describe

    Documented aliases: sheet, mobile sheet, draggable sheet

    • a panel that comes up from the bottom on mobile
    • drag this sheet higher to see more
    • a phone panel with a grab handle
    • show quick actions above the bottom edge
    • a map details card I can pull up
    • a bottom panel with half and full heights

    Choose

    Use it when

    • Showing place details over a mobile map
    • Offering a compact mobile action or selection surface

    Avoid it when

    • Desktop side placement is the defining behavior
    • Dragging is the only way to reach content or close

    Compare

    Compare similar concepts

    Platform equivalents

    The same interaction can have a different name or contract on each platform. Check the mapping before choosing an API.

    • HTML

      No direct primitive

      No direct primitive

      HTML has no bottom-sheet element; dialog semantics and touch gestures require an authored composition.

      Verified
    • WAI-ARIA APG

      No direct primitive

      No direct primitive

      APG has no bottom-sheet pattern; use dialog semantics when modal and keep placement separate from role.

      Verified
    • Radix UI

      No direct primitive

      No direct primitive

      Radix has no drag-aware bottom-sheet primitive; Dialog alone does not supply detents or swipe gestures.

      Verified
    • shadcn/ui

      Direct

      Drawer

      shadcn/ui docs 2026-09-03

      The Drawer recipe uses a Vaul-backed bottom presentation with drag and dismissal behavior.

      Verified Official documentation
    • Material UI

      No direct primitive

      No direct primitive

      Material UI core has no BottomSheet component; a SwipeableDrawer anchored to bottom is a composition, not an exact primitive.

      Verified
    • SwiftUI

      Partial

      .sheet + .presentationDetents

      SwiftUI documentation 2026-09

      Detents give a sheet partial heights; exact drag, background interaction, and compact adaptation stay configurable.

      Verified Official documentation
    • Jetpack Compose

      Direct

      ModalBottomSheet

      Android Developers 2026-08

      ModalBottomSheet supplies an anchored modal surface, sheet state, drag behavior, and explicit removal after hiding.

      Verified Official documentation
    • Flutter

      Direct

      showModalBottomSheet<T>()

      Flutter API docs 2026-09

      The function presents a modal Material bottom sheet with barrier, drag, dismissal, and sizing options.

      Verified Official documentation

    Impact profile

    Measured implementation costs and operating constraints for this SkillCodex specimen. A missing evaluation is never treated as free.

    Rendering
    Client
    Lazy weight
    25 kB-gzip
    Measured ·
    Environment
    macOS 26.6.2; Node 24.19.0; pnpm 10.34.5; Next.js 16.3.0 Turbopack; Chromium 140
    Method
    Sum of gzip -9 bytes for the lazy files of module 79748 in .next/server/app/(en)/term/[slug]/page/react-loadable-manifest.json after pnpm build:local at c9f1299.
    Low-end devices
    Fine
    Measured ·
    Environment
    macOS 26.6.2; Node 24.19.0; pnpm 10.34.5; Next.js 16.3.0 Turbopack; Chromium 140
    Method
    Loaded the 390 x 844 term route in isolated Chromium with 6x CPU throttling and reduced motion, then exercised the first state change; failures are recorded as non-blocking warnings.
    CPU / GPU
    Vaul and React drive a DOM sheet with transform-based dragging; no canvas or WebGL path is present.
    Measured ·
    Environment
    macOS 26.6.2; Node 24.19.0; pnpm 10.34.5; Next.js 16.3.0 Turbopack; Chromium 140
    Method
    Static source inspection of the target lab module plus an interaction on the isolated Chromium verification route; checked DOM/React work and absence of canvas or WebGL.
    Reduced motion
    The global reduced-motion contract collapses animation and transition durations; the same states and controls remain available.
    Measured ·
    Environment
    macOS 26.6.2; Node 24.19.0; pnpm 10.34.5; Next.js 16.3.0 Turbopack; Chromium 140
    Method
    Inspected src/app/globals.css prefers-reduced-motion rules and repeated the target interaction with reducedMotion=reduce in Chromium.
    Static fallback
    Without JavaScript, the term route stays on its localized Loading fallback; the profile and initial specimen are not revealed.
    Measured ·
    Environment
    macOS 26.6.2; Node 24.19.0; pnpm 10.34.5; Next.js 16.3.0 Turbopack; Chromium 140
    Method
    Loaded all ten prerendered routes from a local next start build in Chromium with JavaScript disabled; each HTTP 200 remained on the localized Loading fallback, so the profile and specimen were not revealed.
    Server rendering
    Hydrates
    Measured ·
    Environment
    macOS 26.6.2; Node 24.19.0; pnpm 10.34.5; Next.js 16.3.0 Turbopack; Chromium 140
    Method
    Inspected the prerendered route response, then loaded the same route with JavaScript enabled and exercised the hydrated client specimen.
    Maintenance
    Stable
    Dependencies

    Good fit

    • Short mobile actions or choices that stay close to the current context.

    Avoid when

    • Long forms, desktop-first workflows or content needing a stable URL.

    Verification checklist

    Try these actions in the lab, then check the same behaviours in your agent’s result. Adapt the example names to your interface.

    1. 1. Do this

      Open the sheet, expand it and reduce its height using its buttons rather than dragging.

      Expected result

      The bottom-anchored panel changes height, and its content and close control remain reachable without a drag gesture.

    2. 2. Do this

      Apply a filter, reopen the sheet, change the draft and cancel.

      Expected result

      The last applied result remains in place; closing without applying does not commit the new draft.

    3. 3. Do this

      Cycle through the sheet with Tab, then close it with Escape.

      Expected result

      The modal version keeps focus inside while open; after closing, focus returns to its opening control.

    Full contract
    1. 1The surface is visibly anchored to the bottom
    2. 2Every drag action has a button or keyboard equivalent
    3. 3Snap points reveal meaningful stable states
    4. 4Keyboard alternatives and focus restoration are verified

    Understand → Recognize → Choose → Compare

    Pack for your agent

    Pre-written instructions to paste into your agent. Copying executes nothing.

    Implement correctly

    Build Bottom sheet without breaking its behavior

    # Implement Bottom sheet in your agent
    
    ## Objective
    Implement Bottom sheet for this verified behavior: A mobile-oriented surface attached to the bottom edge that can open to stable heights and may support dragging.
    
    ## Prerequisites
    - Inspect the repository, design system, and existing tests first.
    - Preserve unrelated changes and keep the file scope bounded.
    - Confirm that Bottom sheet matches the need before writing code.
    
    ## Required behavior
    - Touch dragging moves the sheet between stable heights while controls remain keyboard operable.
    - While modal, keyboard focus stays inside the surface until it closes.
    - Escape closes the temporary surface and returns focus to a sensible control.
    
    ## States to cover
    - Sheet closed
    - Sheet at half height
    - Sheet at full height
    
    ## Accessibility
    - ARIA role: dialog[aria-modal=true]
    - The primary control or named region for Bottom sheet has a stable accessible name from visible text or an explicit programmatic label; placeholder text and tooltips are not names.
    - Focus enters the modal sheet, remains inside, and returns to the Filters opener after closing.
    - Close control, Escape, and a downward gesture past the documented threshold dismiss; accidental small drags snap back.
    - The sheet title, current modal state, expanded state, and loading changes are available without relying on motion.
    - Tab reaches all controls
    - Buttons provide expand and collapse alternatives
    - Escape closes the modal sheet
    
    ## When not to use
    - Desktop side placement is the defining behavior
    - Dragging is the only way to reach content or close
    
    ## Acceptance criteria
    - The surface is visibly anchored to the bottom
    - Every drag action has a button or keyboard equivalent
    - Snap points reveal meaningful stable states
    - Keyboard alternatives and focus restoration are verified
    
    ## Guardrails
    - Show the proposed changes before any external action.
    - Do not publish, send, delete, pay for, or change remote state without explicit authorization.
    - Preserve unrelated changes and stop if the scope becomes ambiguous.
    
    ## Output format
    - Outcome or verdict.
    - Files or actions involved.
    - Checks run and observable evidence.
    - Remaining blockers or limitations.
    
    • vaul
    • Requires · Access to the repository, design system, and tests
    Why it works
    • The need is tied to canonical behavior before any technical choice.
    • States, accessibility, and non-goals prevent a merely visual implementation.
    • Acceptance criteria and the output format make verification observable.

    Try next

    Verify Bottom sheet on a real journey

    # Verify Bottom sheet after implementation
    
    ## Objective
    Audit the Bottom sheet implementation against its behavior, states, and accessibility requirements without changing it automatically.
    
    ## Checks
    - Replay the smallest representative journey.
    - Check keyboard behavior, focus, accessible name, and announcements.
    - Tie each gap to a specific acceptance criterion.
    
    ## Guardrails
    - Show the proposed changes before any external action.
    - Do not publish, send, delete, pay for, or change remote state without explicit authorization.
    - Preserve unrelated changes and stop if the scope becomes ambiguous.
    
    ## Output format
    - Outcome or verdict.
    - Files or actions involved.
    - Checks run and observable evidence.
    - Remaining blockers or limitations.
    

    sha256:e3fcddd7f60ab0511a667cc45879e149c6e7dcf397c40d464934047eedc9563a

    Diagnose a problem

    Find and fix the Bottom sheet defect

    # Debug Bottom sheet in your agent
    
    ## Observed symptom
    [DESCRIBE THE SYMPTOM HERE]
    
    ## Observable checks
    - Reproduce the issue with the smallest relevant journey.
    - Compare behavior with the documented states and transitions for Bottom sheet.
    - Verify keyboard behavior, focus, accessible name, and announcements.
    
    ## Possible causes
    - The chosen primitive does not match the expected behavior.
    - A state, transition, or focus return is missing.
    - A neighboring component captures an event or hides an accessible signal.
    
    ## Bounded corrections
    - Fix the reproduced cause without recreating neighboring components.
    - Preserve the public contract and add a focused regression test.
    - Do not install dependencies or change remote state without authorization.
    
    ## Final verification
    - The surface is visibly anchored to the bottom
    - Every drag action has a button or keyboard equivalent
    - Snap points reveal meaningful stable states
    - Keyboard alternatives and focus restoration are verified
    
    ## Guardrails
    - Show the proposed changes before any external action.
    - Do not publish, send, delete, pay for, or change remote state without explicit authorization.
    - Preserve unrelated changes and stop if the scope becomes ambiguous.
    
    ## Output format
    - Outcome or verdict.
    - Files or actions involved.
    - Checks run and observable evidence.
    - Remaining blockers or limitations.
    
    • vaul
    • Requires · Access to the repository, design system, and tests
    Why it works
    • The explicit symptom prevents starting from an assumed fix.
    • Checks separate behavior, accessibility, and neighboring interference.
    • The fix stays bounded and must produce regression evidence.

    Try next

    Lock in the Bottom sheet fix

    # Prevent the Bottom sheet regression
    
    ## Objective
    Turn the reproduced cause into a focused regression test and compare Bottom sheet with neighboring concepts before widening the fix.
    
    ## Checks
    - Prove that the test fails before the fix.
    - Prove that it passes after the bounded fix.
    - Verify that no neighboring component changed behavior.
    
    ## Guardrails
    - Show the proposed changes before any external action.
    - Do not publish, send, delete, pay for, or change remote state without explicit authorization.
    - Preserve unrelated changes and stop if the scope becomes ambiguous.
    
    ## Output format
    - Outcome or verdict.
    - Files or actions involved.
    - Checks run and observable evidence.
    - Remaining blockers or limitations.
    

    sha256:c67a8f949157834f95120a8af3ec4cb7e578c3a9f51e6cd0e71357e3465c2a98

    Full entry, saving and provenance

    Pre-written instruction by SkillCodex — your request is neither sent nor used to adapt this text; no content is generated, and copying executes nothing.

    Pack digest: sha256:ac2ff4bc230f67daac8600e8464b7f9e3a12dcb7e78775dc15ffb96c6187832e

    In code

    TechnologyPrimitiveVersionCaveat
    vaul

    Drawer

    vaul@1.1.2Vaul supplies drag and snap behavior for this mobile surface; it is not a generic replacement for Dialog, Drawer, or Sidebar.

    Technical details

    Behaviors

    • Drag between snap points

      Touch dragging moves the sheet between stable heights while controls remain keyboard operable.

    • Contain focus

      While modal, keyboard focus stays inside the surface until it closes.

    • Dismiss with Escape

      Escape closes the temporary surface and returns focus to a sensible control.

    States

    • Sheet closed

      Sheet closed

    • Sheet at half height

      Sheet at half height

    • Sheet at full height

      Sheet at full height

    State transitions

    • Sheet closed → Sheet at half height

      The Filters trigger opens the sheet at its initial half-height snap point.

    • Sheet at half height → Sheet at full height

      An upward drag or the Expand button moves the sheet to its full-height snap point.

    • Sheet at full height → Sheet at half height

      A downward drag or the Collapse button returns the sheet to half height.

    • Sheet at half height → Sheet closed

      Apply commits the filter, or Escape discards its draft; both close the half-height sheet and restore focus to Filters.

    • Sheet at full height → Sheet closed

      Apply commits the filter, or Escape discards its draft; both close the full-height sheet and restore focus to Filters.

    Test scenarios

    Context
    An office-furniture results page shows the same Compact desk and Adjustable chair list while people filter availability and navigate categories without leaving the results.
    Mission
    On mobile, open Filters, move the sheet between half and full height by drag or buttons, enable In stock, and apply it.
    Primary state
    The temporary mobile sheet is attached to the bottom at half height, keeps the same furniture results visible behind it, and can snap to full height.
    Edge case
    Keyboard users can expand, collapse, apply the availability filter, and close without relying on dragging.

    Visual signals

    • Surface attached to the bottom edge
    • Rounded top edge or drag handle
    • Several meaningful visible heights

    Behavioral signals

    • Touch drag changes snap point
    • Keyboard controls work without dragging
    • May become modal at expanded states

    Accessibility

    Role
    dialog[aria-modal=true]
    Accessible name
    The primary control or named region for Bottom sheet has a stable accessible name from visible text or an explicit programmatic label; placeholder text and tooltips are not names.
    Focus
    Focus enters the modal sheet, remains inside, and returns to the Filters opener after closing.
    Dismissal
    Close control, Escape, and a downward gesture past the documented threshold dismiss; accidental small drags snap back.
    Scroll
    The page behind the surface stays fixed. Long content scrolls inside the panel, and touch dragging does not steal scrolling from nested content.
    Announcement
    The sheet title, current modal state, expanded state, and loading changes are available without relying on motion.
    Keyboard
    • Tab reaches all controls
    • Buttons provide expand and collapse alternatives
    • Escape closes the modal sheet

    Bindings

    Open the HTML, ARIA, Radix, and shadcn matrix
    • Drawer

      implementationKind
      specialized
      nativeElement
      Not applicable
      ariaPattern
      dialog when modal
      radixPrimitive
      Not applicable
      shadcnRecipe
      Drawer (Radix backend)
      runtimeDependency
      vaul@1.1.2
      packageName
      vaul
      exportName
      Drawer
      exactVersion
      1.1.2
      status
      exception
      sourceId
      source-ui-vaul-drawer
      deprecationStatus
      active
      replacement
      Not applicable
      validFrom
      Not applicable
      validUntil
      Not applicable

      Equivalence caveat: Vaul supplies drag and snap behavior for this mobile surface; it is not a generic replacement for Dialog, Drawer, or Sidebar.

      Verify binding source

    Sources

    • Vaul: Drawer Documentation
      sourceId
      source-ui-vaul-drawer
      kind
      documentation
      canonicalUrl
      https://vaul.emilkowal.ski/getting-started
      publisher
      Emil Kowalski
      sourceRevision
      http-etag:W/"6b8da0fa2ad3af9f4a94fec100a1ccc6"
      consultedAt
      2026-07-19
      license
      Not stated
      contentDigest
      sha256:42069ca59d32282b4e3fe6800b3014b8a03c8a302fb90129e09d31981bdaf05e
      status
      verified

      Claim covered: Bottom sheet: documented parts, state APIs, interaction behavior, and implementation limits for Vaul Drawer.

    • WAI-ARIA APG: Dialog Modal Pattern
      sourceId
      source-ui-aria-dialog-modal
      kind
      documentation
      canonicalUrl
      https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/
      publisher
      W3C WAI
      sourceRevision
      http-last-modified:2026-07-09T07:07:35Z
      consultedAt
      2026-07-19
      license
      Not stated
      contentDigest
      sha256:4282d2eeb383c717ba41f52f0db1643fb3eb9acc33fa3879ef817e27c162453e
      status
      verified

      Claim covered: Bottom sheet: informative APG guidance for the modal dialog pattern: roles, states, relationships, and keyboard interaction.

    • WAI-ARIA 1.2: Roles Model
      sourceId
      source-ui-wai-aria-roles
      kind
      standard
      canonicalUrl
      https://www.w3.org/TR/wai-aria-1.2/#roles
      publisher
      W3C WAI
      sourceRevision
      W3C-REC-wai-aria-1.2-20230606
      consultedAt
      2026-07-19
      license
      Not stated
      contentDigest
      sha256:c0fea16fc747779569ab754d2d25bca3e2b7e8a673b8ef5362aeb9ebc73a4849
      status
      verified

      Claim covered: Bottom sheet: normative ARIA role definitions and constraints for the stated accessible role.

    • WCAG 2.2: Focus Appearance
      sourceId
      source-ui-wcag-understanding-focus-appearance
      kind
      documentation
      canonicalUrl
      https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html
      publisher
      W3C WAI
      sourceRevision
      http-last-modified:2026-07-02T10:07:49Z
      consultedAt
      2026-07-19
      license
      Not stated
      contentDigest
      sha256:fdcf316a1f0e3cc758eda9618322d132862124ff0a3f3b1a3acbf20daf804ff0
      status
      verified

      Claim covered: Bottom sheet: informative WCAG guidance for evaluating visible keyboard focus appearance.

    • WHATWG HTML: The button element
      sourceId
      source-ui-html-button
      kind
      standard
      canonicalUrl
      https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element
      publisher
      WHATWG
      sourceRevision
      http-last-modified:2026-07-19T13:52:46Z
      consultedAt
      2026-07-19
      license
      Not stated
      contentDigest
      sha256:418a8f9ce1e8690c6d458121120b0b3b7cd907aa92b2101b85f82f7e02d5ac2f
      status
      verified

      Claim covered: Bottom sheet: normative native semantics, states, attributes, and browser behavior for button.