Skip to content
Welcome to our documentation!

BottomSheet

A bottom sheet overlay that slides up from the bottom of the screen with configurable snap positions (detents), backdrop dimming, pan gestures, and automatic keyboard handling.

  • NuGet downloads for Shiny.Maui.Controls
  • NuGet downloads for Shiny.Blazor.Controls
Frameworks
.NET MAUI
Blazor
ClosedOpen
ClosedOpen
<shiny:BottomSheetView IsOpen="{Binding IsSheetOpen, Mode=TwoWay}">
<VerticalStackLayout Padding="20" Spacing="10">
<Label Text="Sheet Content" FontSize="18" FontAttributes="Bold" />
<Label Text="Drag the handle or tap the backdrop to close." />
<Button Text="Close" Command="{Binding CloseSheetCommand}" />
</VerticalStackLayout>
</shiny:BottomSheetView>
<ContentPage>
<Grid>
<!-- Main page content -->
<ScrollView>
<VerticalStackLayout>
<Button Text="Open Sheet" Command="{Binding OpenCommand}" />
</VerticalStackLayout>
</ScrollView>
<!-- Bottom sheet overlays on top -->
<shiny:BottomSheetView IsOpen="{Binding IsOpen, Mode=TwoWay}">
<Label Text="Sheet content" />
</shiny:BottomSheetView>
</Grid>
</ContentPage>
PropertyTypeDefaultDescription
IsOpenboolfalseShow/hide the sheet (TwoWay bindable)
SheetContentView?nullContent displayed in the sheet (ContentProperty)
DetentsObservableCollection<DetentValue>Quarter, Half, FullSnap positions as ratios of available height
SheetBackgroundColorColorWhiteBackground of the sheet panel
HandleColorColorGreyDrag handle indicator color
SheetCornerRadiusdouble16Top corner radius
HasBackdropbooltrueShow dimming backdrop behind the sheet
CloseOnBackdropTapbooltrueTap backdrop to close
AnimationDurationdouble250Animation speed in ms
ExpandOnInputFocusbooltrueAuto-expand when an input is focused
IsLockedboolfalsePrevents swipe, pan, and backdrop tap dismiss; sheet can only be controlled programmatically
FitContentboolfalseMeasures content and auto-computes a single detent to fit it

Predefined snap points:

Static PropertyRatioDescription
DetentValue.Quarter0.2525% height
DetentValue.Half0.5050% height
DetentValue.ThreeQuarters0.7575% height
DetentValue.Full1.0Full height

Custom detent: new DetentValue(0.33) for 33%.

<shiny:BottomSheetView IsOpen="{Binding IsOpen, Mode=TwoWay}"
SheetBackgroundColor="#1E1E1E"
HandleColor="#888888"
SheetCornerRadius="24">
<shiny:BottomSheetView.Detents>
<shiny:DetentValue Ratio="0.33" />
<shiny:DetentValue Ratio="0.66" />
<shiny:DetentValue Ratio="1.0" />
</shiny:BottomSheetView.Detents>
<VerticalStackLayout Padding="20">
<Label Text="Custom Sheet" TextColor="White" />
</VerticalStackLayout>
</shiny:BottomSheetView>
EventArgsDescription
OpenedEventArgsSheet finished opening
ClosedEventArgsSheet finished closing
DetentChangedDetentValueSheet snapped to a different detent
  • Pan gesture — Drag up/down between detents; swipe past the lowest to close
  • Keyboard handling — Auto-expands when an Entry/Editor is focused, restores on dismiss
  • ScrollView integration — Scroll enabled only at the highest detent; disabled at lower detents for pan
  • Backdrop — Semi-transparent overlay that dims proportionally to sheet position
  • Locked mode — When IsLocked="True", the drag handle is hidden, pan gestures are disabled, and backdrop tap is ignored. The sheet can only be opened/closed via binding. Ideal for signature capture, selectors, or confirmation dialogs.
  • Fit content — When FitContent="True", the sheet measures its content and auto-computes a single detent to fit it, ignoring the Detents collection.
<!-- Signature capture: locked + auto-sized -->
<shiny:BottomSheetView IsOpen="{Binding IsSignatureOpen}"
IsLocked="True"
FitContent="True"
HasBackdrop="True"
SheetCornerRadius="20">
<VerticalStackLayout Padding="20" Spacing="15">
<Label Text="Draw your signature" FontSize="18" FontAttributes="Bold" />
<!-- signature content -->
<Button Text="Done" Command="{Binding DoneCommand}" />
</VerticalStackLayout>
</shiny:BottomSheetView>
claude plugin marketplace add shinyorg/skills
claude plugin install shiny-controls@shiny

Coming soon — Copilot plugin install instructions will be added here.

View shiny-controls Plugin