Shiny.Controls.Keyframe.Shared
1.3.0-beta-0014
Prefix Reserved
See the version list below for details.
dotnet add package Shiny.Controls.Keyframe.Shared --version 1.3.0-beta-0014
NuGet\Install-Package Shiny.Controls.Keyframe.Shared -Version 1.3.0-beta-0014
<PackageReference Include="Shiny.Controls.Keyframe.Shared" Version="1.3.0-beta-0014" />
<PackageVersion Include="Shiny.Controls.Keyframe.Shared" Version="1.3.0-beta-0014" />
<PackageReference Include="Shiny.Controls.Keyframe.Shared" />
paket add Shiny.Controls.Keyframe.Shared --version 1.3.0-beta-0014
#r "nuget: Shiny.Controls.Keyframe.Shared, 1.3.0-beta-0014"
#:package Shiny.Controls.Keyframe.Shared@1.3.0-beta-0014
#addin nuget:?package=Shiny.Controls.Keyframe.Shared&version=1.3.0-beta-0014&prerelease
#tool nuget:?package=Shiny.Controls.Keyframe.Shared&version=1.3.0-beta-0014&prerelease
Shiny Controls
A rich, ready-to-use UI controls library for both .NET MAUI and Blazor. One package per host covers TableView, DataGrid (with detail/breakdown rows and a TreeDataGrid hierarchy mode), TreeView, Scheduler, FloatingPanel/OverlayHost, DurationPicker, FrostedGlassView, Toast, Dialogs (owned, animated alert/confirm/prompt/action-sheet), Fab/FabMenu, ShinyToolbar/ShinyTabBar (Blazor), SplashScreen (Blazor), PillView, BadgeView, SecurityPin, PasswordStrength (a password field with a live strength meter, a rule checklist and a pluggable scorer), Captcha (Blazor — one component over a built-in local challenge plus reCAPTCHA, hCaptcha and Turnstile), SignaturePad, ShinyImage, ImageViewer, ImageEditor, MediaPickerButton, ChatView, ColorPicker, FontPicker, Slider, ProgressBar (with an animated, bidirectional fill), ProgressLine (the thin page-edge loading line, docked clear of the nav and tab bars and drivable from code), Overlay/LoadingOverlay, SkeletonView, Expander/Accordion (a disclosure panel whose fade, slide and height reveals combine and are aimed at any of the four edges, and the accordion list that coordinates a stack of them), AutoCompleteEntry, CountryPicker, AddressEntry, TextEntry, CarouselGallery, ParallaxCollectionView, StaggeredGrid, VirtualizedGrid, and StateView/Wizard (named branches switched by one string, and a multi-step flow built on them with a pointed progress bar, per-step validity gates and conditional steps), plus a TimelineView — a vertical rail of markers with arbitrary, self-sizing content beside each one, an active position (or all-active) driving which part of the rail is filled, and optional content on the far side of the rail. Walkthrough and Tooltip round that out: a guided tour that dims the page and cuts an animated spotlight around one control at a time — steps declared together in order, advancing on a command, on a tap of the highlighted control, or on a timer, with a RememberRunKey so onboarding runs once — and the themed tooltip bubble underneath it, which wraps its target or points at one, auto-flips to whichever side has room, and is drawn above the page so nothing can clip it. A Flyout — a side panel that slides in from either edge, rests as a narrow icon rail instead of a full panel, and either pushes the content aside or floats over it — replaces MAUI's FlyoutPage and, unlike it, works inside Shell. On MAUI there is also a ShinyNavigationPage — a real NavigationPage, with everything that implies, whose drawn bar carries toolbar items on the left as well as the right, plus an overflow menu, badges and an iOS-style collapsing large title. Blazor additionally gets layout primitives — VStack/HStack, a responsive Grid/Row/Column, and an AppLayout application shell whose left/right panels collapse to hidden, a toolbar rail or fully shown, drag-resize between a min and max, keep their own scroll regions, and can persist and auto-collapse when the shell gets narrow. Motion Icons — 111 animated icons that run on a timer, on hover, on tap or on command — ship in the core packages on both hosts, as does an Office-style Ribbon (tabs over titled command groups, with contextual tabs, split and menu buttons, a quick access row, a collapsing body, groups that fold into buttons when the window narrows, and a Simplified one-row mode for phones — which is what the ImageEditor's toolbar is built from). Sliders come in single-value (Slider) and two-thumb range (RangeSlider) flavors. Markdown, Mermaid Diagrams, Barcodes (1D + 2D, QR codes), Keyframe animation (declarative XAML timelines with seekable, reversible playback), and a cross-platform CameraView (preview, photo/video capture, a pluggable effects pipeline for colour/comic/sketch/blur looks, face masks and AI stylization, plus a pluggable frame-analysis pipeline for barcode/face/motion/OCR/structured-documents) ship as separate add-on packages per host, Office viewers and editors — a Spreadsheet (SpreadsheetView) that opens, renders and edits real .xlsx workbooks, with an optional formatting toolbar carrying the usual bold/italic/colour controls plus the spreadsheet-only ones: cell fill, number formats, decimal places, whole-column formatting and AutoSum, a .docx editor in two controls — DocumentEditor (the lone surface) and DocumentEditorView (the same plus formatting chrome), with spell check drawn from the platform's own dictionary on MAUI and replaceable on both hosts — a .pptx editor in two more — SlideEditor and SlideEditorView — where a click selects a shape to move or resize and a double-click puts a caret in its text, both editors sharing one gallery of twenty preset shapes plus tables, pictures and text highlighting, and both accepting an image dragged in from the desktop, a OneNote-style free-form Notebook in two more — NotebookEditor and NotebookEditorView — an unbounded scrolling page you can write anywhere on, draw over with a pressure-sensitive pen, highlighter, point-or-stroke eraser and lasso, and fill with the same shapes, pictures and rich text as the other editors, organised into sections and pages and saved to a .shinynote zip, plus read-only DocumentView (.docx, reflowed rather than paginated) and SlideView (.pptx, fitted artboards or a thumbnail grid, with placeholders resolved through layout and master) — a virtualized SkiaSharp grid shared verbatim by both hosts, over a document kernel with a transactional undo stack and a formula engine, editing the OOXML package surgically so an untouched workbook saves byte-identical — and a cross-platform MediaElement (local + remote audio/video with a themed, per-element-toggleable transport bar, background audio with OS lock-screen controls, and Picture-in-Picture) ship as separate add-on packages per host. Quick Entry — an assistant-style prompt popup (PromptView) summoned over whatever the user is looking at, with an optional Siri-style screen-edge glow — ships in the core packages on both hosts and works everywhere as an in-app overlay; on desktop it can instead open as a borderless always-on-top OS window over other applications, which is what the Shiny.Maui.Controls.Desktop add-on adds. That add-on also carries the desktop-only system tray / status-bar icon, Visual-Studio-style docking, global hotkeys (Windows, macOS AppKit, MacCatalyst, and Linux), and window-level file drop — files dragged from Finder / Explorer onto anywhere in the app window, including on top of a BlazorWebView, which MAUI's own DropGestureRecognizer cannot see; Blazor has the same service over the whole browser window in its core package. On the web there is no separate add-on: Blazor docking and the touch / kiosk on-screen keyboard both ship in the main Shiny.Blazor.Controls package.
Getting Started
.NET MAUI
dotnet add package Shiny.Maui.Controls
Register in your MauiProgram.cs:
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseShinyControls();
Add the XAML namespace:
xmlns:shiny="http://shiny.net/maui/controls"
For Markdown controls (separate package):
dotnet add package Shiny.Maui.Controls.Markdown
xmlns:md="http://shiny.net/maui/markdown"
For Mermaid Diagrams (separate package):
dotnet add package Shiny.Maui.Controls.MermaidDiagrams
xmlns:diagram="http://shiny.net/maui/diagrams"
For Barcodes & QR codes (separate package):
dotnet add package Shiny.Maui.Controls.Barcodes
xmlns:bc="http://shiny.net/maui/barcodes"
<bc:QRCodeView Value="https://shinylib.net" Size="300" />
<bc:BarcodeView Value="5901234123457" Format="Ean13" />
Supported formats: QR Code, Aztec, Data Matrix, PDF417, Code 128/39/93, Codabar, EAN-8/13, UPC-A/E, ITF. Output is rendered as PNG via a pure-managed encoder (no SkiaSharp / System.Drawing dependency). Need an SVG string? Call BarcodeRenderer.RenderSvg(...) directly.
For Keyframe animation (separate package):
dotnet add package Shiny.Maui.Controls.Keyframe
xmlns:kf="http://shiny.net/maui/keyframe"
For the CameraView (separate package — iOS, Android, Windows, macOS AppKit, Blazor):
dotnet add package Shiny.Maui.Controls.Camera
builder
.UseShinyControls()
.UseShinyCamera();
xmlns:cam="http://shiny.net/maui/camera"
<cam:CameraView Facing="Back" Filter="None" />
For the MediaElement (separate package — iOS, Android, Windows, macOS AppKit, Linux GTK4, Blazor):
dotnet add package Shiny.Maui.Controls.MediaElement
builder
.UseShinyControls()
.UseShinyMediaElement();
xmlns:media="http://shiny.net/maui/media"
<media:MediaElement Source="https://example.com/clip.mp4" AutoPlay="True" />
The full feature set — effects, analyzers, recording, orientation, AI — is in CameraView.
Blazor
dotnet add package Shiny.Blazor.Controls
dotnet add package Shiny.Blazor.Controls.Markdown # optional
dotnet add package Shiny.Blazor.Controls.MermaidDiagrams # optional
dotnet add package Shiny.Blazor.Controls.Barcodes # optional
Add the @using directives — typically in _Imports.razor:
@using Shiny.Blazor.Controls
@using Shiny.Blazor.Controls.Cells
@using Shiny.Blazor.Controls.Sections
@using Shiny.Blazor.Controls.Scheduler
@using Shiny.Blazor.Controls.Markdown
@using Shiny.Blazor.Controls.MermaidDiagrams
@using Shiny.Blazor.Controls.Barcodes
@using Shiny.Controls.Barcodes
Most controls need no DI registration at all — drop the component into any .razor page and its
scoped CSS and JS module come along with it. A handful are driven by a service (Toast, Dialogs, the
splash screen, the walkthrough store, Docking and the on-screen keyboard), and one call covers all
of them, mirroring MAUI's UseShinyControls():
using Shiny.Blazor.Controls;
builder.Services.AddShinyControls();
With optional configuration, again shaped like the MAUI side:
builder.Services.AddShinyControls(cfg => cfg
.ConfigureDialogs(o => o.DefaultAnimation = DialogAnimation.Zoom)
.ConfigureKeyboard(o => o.HeightPx = 320)
.UseHttpImageDownloader() // ShinyImage through your HttpClient (optional)
.AddDockPanel<ExplorerPanel>("explorer", "Explorer", "📁")
);
Every individual AddShinyToast() / AddShinyDialogs() / AddShinySplashScreen() /
AddShinyWalkthrough() / AddShinyDocking() / AddShinyOnScreenKeyboard() call still exists, and
all registrations are TryAdd, so the two styles compose in either order. Register à la carte when
you want to keep the WASM payload tight; to replace an implementation, use a SetCustom* method or
register your own first — first registration wins.
All of these services are scoped, not singleton: they hold per-user UI state. Under WebAssembly the two lifetimes are identical, but on Blazor Server a singleton would show one user's toast, dialog or keyboard to every connected user.
MAUI → Blazor quick reference
| MAUI (XAML) | Blazor (Razor) |
|---|---|
<shiny:TableView> with <shiny:TableRoot> |
<TableView> (no TableRoot wrapper) |
<shiny:TreeView> — ExpandedIcon/CollapsedIcon are ImageSource |
<TreeView TItem="…"> — icons are RenderFragment slots; adds keyboard navigation |
<shiny:PillView> |
<Pill> |
<shiny:BadgeView Text="…"> (wraps Content) |
<BadgeView Text="…"> (wraps ChildContent) |
<shiny:FloatingPanel> in <shiny:OverlayHost> |
<SheetView> with <SheetContent> child (Blazor uses CSS overlay) |
Value="{Binding Pin}" (TwoWay) |
@bind-Value="pin" |
IsOpen="{Binding IsOpen, Mode=TwoWay}" |
@bind-IsOpen="isOpen" |
Command="{Binding DoCommand}" |
OnClick="DoAsync" / Clicked="DoAsync" |
Color type (e.g. Colors.Blue) |
CSS color string (e.g. "#2196F3") |
Fab.Icon="add.png" (ImageSource) |
<Fab Icon="+"> (inline text/SVG string) |
shiny:CarouselGallery |
<CarouselGallery> — PeekAreaInsets → PeekAmount; adds ShowIndicators |
shiny:ParallaxCollectionView |
<ParallaxList> — HeaderTemplate → HeroTemplate; Blazor uses a JS scroll listener for the transform |
shiny:StaggeredGrid |
<StaggeredGrid> — ItemSelectedCommand → ItemSelected EventCallback |
shiny:VirtualizedGrid |
<VirtualizedGrid> — CellPadding → individual padding props; adds EnableVirtualization, GroupedItems |
ItemTemplate as DataTemplate |
ItemTemplate as RenderFragment<object> |
IToaster.ShowAsync(text, cfg => {}) (DI) |
IToastService.ShowAsync(text, cfg => {}) (DI + <ToastHost />) |
IDialogService.Confirm(...) (DI; auto-attaches) |
IDialogService.Confirm(...) (DI + <DialogHost />) |
<shiny:DataGrid> + <shiny:DataGridColumn PropertyName="..."/> (items as object) |
<DataGrid TItem="T"> + <PropertyColumn Property="x => x..."/> (generic, RenderFragment templates) |
<shiny:TextEntry> |
<TextEntry> |
<shiny:Overlay> in <shiny:ShinyContentPage.Panels> |
<Overlay> (wraps ChildContent; custom content in <OverlayContent> slot) |
<shiny:LoadingOverlay> in <shiny:ShinyContentPage.Panels> |
<LoadingOverlay> (wraps ChildContent) |
<shiny:ProgressBar> |
<ProgressBar> |
<shiny:ProgressLine> |
<ProgressLine> + <ProgressLineHost> |
<MauiSplashScreen> (native, build-time) |
SplashScreen — index.html markup + splash.js, driven by ISplashScreen / <SplashScreenHost /> |
ISchedulerEventProvider is identical across both hosts.
Controls
Every control has its own page under docs/controls/. Start with
Styling & theming — implicit styles, what a theme pack changes beyond
colour, and why appearance properties default to -1 rather than a real value.
Office
| Control | |
|---|---|
| Spreadsheet | Open, render and edit real .xlsx — virtualized SkiaSharp grid, formula engine, formatting toolbar |
| Document & Slide Viewers | Read-only .docx reflowed to the control's width, and .pptx as fitted artboards |
| Document Editor | A .docx editor — typing, styles, inline objects, page margins, platform spell check |
| Slide Editor | A .pptx editor — click a shape to move or resize it, double-click for a caret in its text |
| Notebook | A OneNote-style free-form canvas — write anywhere, draw over it, shapes and pictures, sections and pages |
Collections & grids
| Control | |
|---|---|
| DataGrid | Sorting, filtering, grouping, aggregates, selection, inline editing, paging, virtualization |
| TreeDataGrid | The DataGrid in hierarchy mode — nested rows with lazy loading per level |
| TableView | Settings-style table with 14 cell types, sections, cascading styles and drag-sort |
| TreeView | Hierarchical tree with lazy loading, drag/drop reorder and selection predicates |
| VirtualizedGrid | Grouped grid with sticky headers, virtualization and load-more |
| StaggeredGrid | Pinterest-style masonry layout with variable-height items |
| ParallaxCollectionView | A list with a hero header that translates, collapses and fades as it scrolls |
| CarouselGallery | Netflix-style carousel with snap-to-center, scale transforms and peek insets |
| Carousel | Embla-style drag carousel for Blazor — looping, autoplay, thumbnails, scroll-linked effects |
Layout & overlays
| Control | |
|---|---|
| Layout & AppLayout | VStack/HStack, a responsive 12-column grid, and an app shell with collapsible panels (Blazor) |
| FloatingPanel + OverlayHost | Draggable bottom/top panel with detents, header peek and backdrop management (MAUI) |
| Flyout | Side panel that rests as an icon rail and pushes or floats over content (MAUI) |
| TabbedPage & TabBar | Tabs with motion icons, badges, transitions and a raised centre button (MAUI) |
| NavigationPage | Toolbar items on the left as well as the right, overflow, badges, large title (MAUI) |
| ShinyToolbar & ShinyTabBar | Screen-docked action toolbar and mobile-style tab bar (Blazor) |
| Ribbon | Office-style tabbed command bar — groups, contextual tabs, collapse and overflow (desktop + Blazor) |
| Modal | A modal window with focus trap, scroll lock, drag, resize and maximize (Blazor) |
| Overlay & LoadingOverlay | Full-screen overlay with a custom template or a built-in loading mode |
| Expander & Accordion | Disclosure panel whose fade/slide/height reveals combine, plus the accordion that stacks them |
| StateView & Wizard | Named branches switched by one string, and the multi-step flow built on them |
| Timeline | Vertical rail of markers with arbitrary content beside each one, and an active position |
| Quick Entry | Assistant-style prompt popup over whatever the user is looking at, with a screen-edge glow |
| Fab & FabMenu | Floating action button and the expanding multi-action menu |
| FrostedGlassView | Native blur — UIVisualEffectView, RenderEffect, backdrop-filter |
Input
| Control | |
|---|---|
| ShinyButton | A real working state, success/error states, and leading/trailing icon slots |
| TextEntry | Floating placeholder, tool slots, validation hints, character count, keyboard accessory |
| AutoCompleteEntry | Debounced search with dropdown suggestions and custom item templates |
| CountryPicker | Country search with flag emoji, name and dial code |
| AddressEntry | Address search with geocoding and structured results |
| ColorPicker | Spectrum, hue bar, opacity slider, hex input and preview swatch |
| FontPicker | Family and size pickers, each font previewed in its own typeface |
| Slider | Cold-to-hot gradient track, blended thumb and tooltip |
| RangeSlider | Two thumbs, per-thumb tooltips and min/max gap constraints |
| SecurityPin | PIN entry with individually rendered cells and optional masking |
| PasswordStrength | Live strength meter, rule checklist and a pluggable async scorer |
| Captcha | A local challenge, reCAPTCHA, hCaptcha or Turnstile behind one component (Blazor) |
| SignaturePad | Signature capture on a canvas with PNG export |
| MediaPickerButton | Add photos from gallery or camera, re-encoded and capped, shown in a carousel |
| DurationPicker | Duration picker in a floating panel, with min/max and interval constraints |
Display & media
| Control | |
|---|---|
| ShinyImage | Remote image loading with placeholder, progress ring, caching, and SVG on MAUI |
| ImageViewer | Full-screen overlay with pinch, pan and double-tap zoom |
| ImageEditor | Crop, rotate, draw, shapes, text annotations, undo/redo and export |
| CameraView | Preview, photo/video capture, an effects pipeline, and pluggable frame analyzers |
| MediaElement | Local and remote audio/video, background playback with lock-screen controls, and PiP |
| ChatView | Provider-driven chat UI — bubbles, typing, paging, reactions, attachments, composer |
| Scheduler | Calendar grid, agenda timeline and event list over one provider interface |
| Markdown | Native markdown renderer and an editor with a formatting toolbar and live preview |
| Mermaid Diagrams | Native Mermaid flowcharts — no WebView, AOT-compatible on MAUI |
| Barcodes & QR Codes | Pure-managed 1D/2D barcode and QR rendering across 13 symbologies |
| Keyframe Animation | Declarative XAML timelines that seek, reverse and export deterministically (MAUI) |
| Motion Icons | 111 animated icons driven by a timer, hover, tap, appearance or a command |
Status & feedback
| Control | |
|---|---|
| Toast | Code-invoked toasts with a queue, auto-dismiss, spinner and progress bar |
| Dialogs | Owned, animated alert / confirm / prompt / action sheet — never the native one |
| ProgressBar | Gradient fill with a Vista-style shimmer, determinate and indeterminate |
| ProgressLine | The thin page-edge loading line, docked clear of the nav and tab bars |
| BadgeView | Content-wrapping corner badge with text, dot, count overflow and pulse |
| PillView | Status pills and chips with preset themes and accessible contrast |
| SplashScreen | A boot splash that paints before Blazor starts (Blazor) |
Guidance
| Control | |
|---|---|
| Walkthrough | Dim the page and cut an animated spotlight around one control at a time |
| Tooltip | Themed bubble that wraps or points at a target and auto-flips to whichever side has room |
Desktop
| Control | |
|---|---|
| Desktop add-on | Tray icon, docking, desktop Quick Entry and global hotkeys — plus the on-screen keyboard |
| File Drop | Files dropped anywhere on the window, including over a BlazorWebView |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Maui.Graphics (>= 10.0.90)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Shiny.Controls.Keyframe.Shared:
| Package | Downloads |
|---|---|
|
Shiny.Maui.Controls
Shiny Controls for Blazor and .NET MAUI - Makes your UI shine beautifully with complex controls for free |
|
|
Shiny.Maui.Controls.Keyframe
Declarative keyframe animation for .NET MAUI — XAML timelines with CSS easing syntax, seekable/reversible playback, storyboards, and a drawable scene view. |
|
|
Shiny.Maui.Controls.Keyframe.Export
Deterministic offscreen frame export for Shiny Keyframe scenes — lazily yielded frames rendered through Skia, plus a pure-managed GIF encoder. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.3.0-beta-0015 | 0 | 9/1/2026 |
| 1.3.0-beta-0014 | 0 | 9/1/2026 |
| 1.3.0-beta-0013 | 0 | 9/1/2026 |
| 1.3.0-beta-0012 | 95 | 8/31/2026 |
| 1.3.0-beta-0011 | 75 | 8/31/2026 |
| 1.3.0-beta-0010 | 88 | 8/30/2026 |
| 1.3.0-beta-0009 | 86 | 8/30/2026 |
| 1.3.0-beta-0005 | 99 | 8/30/2026 |
| 1.3.0-beta-0004 | 97 | 8/30/2026 |
| 1.3.0-beta-0002 | 103 | 8/30/2026 |
| 1.3.0-beta-0001 | 121 | 8/29/2026 |
| 1.2.0 | 137 | 8/29/2026 |
| 1.2.0-beta-0014 | 125 | 8/28/2026 |
| 1.2.0-beta-0013 | 128 | 8/28/2026 |
| 1.2.0-beta-0012 | 124 | 8/28/2026 |
| 1.2.0-beta-0011 | 125 | 8/28/2026 |
| 1.2.0-beta-0010 | 139 | 8/28/2026 |
| 1.2.0-beta-0009 | 142 | 8/28/2026 |
| 1.2.0-beta-0008 | 135 | 8/27/2026 |
| 1.2.0-beta-0007 | 168 | 8/26/2026 |