Introducing AI Conversations: Natural Language Interaction for Your Apps! Learn More
CarouselGallery
A Netflix-style horizontal carousel that snaps the focused item to center, scales adjacent items down, and reveals a configurable peek of the next and previous items. Native handlers provide smooth, performant scrolling on each platform.
Frameworks
.NET MAUI
Blazor
Features
Section titled “Features”- Snap-to-Center — Items snap to the center of the viewport on scroll end, ensuring the focused item is always fully visible. Control snapping behavior via
SnapCount. - Free Scroll — Set
SnapCount="0"for Netflix-style free scrolling with no snap behavior. Items decelerate naturally without locking to a position. - Scale Transforms — The focused item renders at
FocusedItemScalewhile all other items render atUnfocusedItemScale, providing a clear visual hierarchy. - Peek Insets —
PeekAreaInsets(MAUI) orPeekAmount(Blazor) reveals the edges of adjacent items, communicating that the list is scrollable. - Infinite Looping — Set
IsInfinite="true"to loop the item list continuously. - Position Tracking —
CurrentPositionis a two-way bindable property that reflects and controls the active index. - Native Handlers — Android:
RecyclerViewwith snap helper; iOS:UICollectionViewwith centered flow layout; Windows:ItemsRepeaterwith scroll snap; Blazor: CSSscroll-snap-type.
AI Skill
Section titled “AI Skill”Step 1 — Add the marketplace:
claude plugin marketplace add shinyorg/skills Step 2 — Install plugins:
claude plugin install shiny-client@shiny claude plugin install shiny-maui@shiny claude plugin install controls@shiny claude plugin install shiny-mediator@shiny claude plugin install shiny-data@shiny claude plugin install shiny-aspire@shiny claude plugin install shiny-extensions@shiny Step 1 — Add the marketplace:
copilot plugin marketplace add https://github.com/shinyorg/skills Step 2 — Install plugins:
copilot plugin install shiny-client@shiny copilot plugin install shiny-maui@shiny copilot plugin install controls@shiny copilot plugin install shiny-mediator@shiny copilot plugin install shiny-data@shiny copilot plugin install shiny-aspire@shiny copilot plugin install shiny-extensions@shiny Quick Start
Section titled “Quick Start”.NET MAUI
Section titled “.NET MAUI”<shiny:CarouselGallery ItemsSource="{Binding Movies}" CurrentPosition="{Binding SelectedIndex, Mode=TwoWay}" ItemWidth="280" ItemHeight="180" FocusedItemScale="1.0" UnfocusedItemScale="0.8" PeekAreaInsets="40" ItemSpacing="12" ItemSelectedCommand="{Binding SelectMovieCommand}"> <shiny:CarouselGallery.ItemTemplate> <DataTemplate> <Border StrokeShape="{RoundRectangle CornerRadius=12}"> <Image Source="{Binding Thumbnail}" Aspect="AspectFill" /> </Border> </DataTemplate> </shiny:CarouselGallery.ItemTemplate></shiny:CarouselGallery>Blazor
Section titled “Blazor”<CarouselGallery Items="movies" @bind-CurrentPosition="selectedIndex" ItemWidth="300" ItemHeight="200" FocusedItemScale="1.0" UnfocusedItemScale="0.85" PeekAmount="40" ItemSpacing="16" ShowIndicators="true" ItemSelected="OnMovieSelected"> <ItemTemplate Context="movie"> <div class="card"> <img src="@movie.Thumbnail" alt="@movie.Title" /> </div> </ItemTemplate></CarouselGallery>
@code { List<Movie> movies = []; int selectedIndex = 0;
void OnMovieSelected(Movie movie) { }}Properties
Section titled “Properties”| Property | MAUI Type | Blazor Type | Default | Description |
|---|---|---|---|---|
| ItemsSource / Items | IEnumerable | IReadOnlyList<TItem> | — | Collection of items to display |
| ItemTemplate | DataTemplate | RenderFragment<TItem> | — | Template for each carousel item |
| ItemWidth | double | double | — / 300 | Width of each item in px |
| ItemHeight | double | double | — / 200 | Height of each item in px |
| ItemSpacing | double | double | — / 16 | Spacing between items in px |
| FocusedItemScale | double | double | 1.0 | Scale applied to the centered/focused item |
| UnfocusedItemScale | double | double | 0.8 / 0.85 | Scale applied to non-focused items |
| PeekAreaInsets / PeekAmount | Thickness | double | — / 40 | Inset that reveals edges of adjacent items |
| CurrentPosition | int | int | 0 | Index of the currently focused item (TwoWay) |
| IsInfinite | bool | — | false | Loop items infinitely (MAUI only) |
| SnapCount | int | int | 1 | Number of items to snap into view. Set to 0 for free-scroll (Netflix-style) with no snapping |
| ShowIndicators | — | bool | true | Show dot position indicators (Blazor only) |
Events & Commands
Section titled “Events & Commands”MAUI:
PositionChangedCommand(ICommand) — Fired whenCurrentPositionchanges; parameter is the new indexItemSelectedCommand(ICommand) — Fired when the user taps a focused item; parameter is the selected item
Blazor:
ItemSelected(EventCallback<TItem>) — Fired when the user clicks/taps an item
Behavior
Section titled “Behavior”- Scrolling past the last item when
IsInfiniteisfalsestops at the boundary PeekAreaInsets/PeekAmountclip the outer items to hint at scrollability without requiring a full item to be visible- Changing
CurrentPositionprogrammatically animates the carousel to the target item - Scale transforms animate smoothly during scroll so intermediate positions show a continuous scale blend
- When
SnapCountis0, items scroll freely without snapping;CurrentPositionstill tracks the closest-to-center item