Shiny.Controls.Office.Skia
1.2.0-beta-0013
Prefix Reserved
dotnet add package Shiny.Controls.Office.Skia --version 1.2.0-beta-0013
NuGet\Install-Package Shiny.Controls.Office.Skia -Version 1.2.0-beta-0013
<PackageReference Include="Shiny.Controls.Office.Skia" Version="1.2.0-beta-0013" />
<PackageVersion Include="Shiny.Controls.Office.Skia" Version="1.2.0-beta-0013" />
<PackageReference Include="Shiny.Controls.Office.Skia" />
paket add Shiny.Controls.Office.Skia --version 1.2.0-beta-0013
#r "nuget: Shiny.Controls.Office.Skia, 1.2.0-beta-0013"
#:package Shiny.Controls.Office.Skia@1.2.0-beta-0013
#addin nuget:?package=Shiny.Controls.Office.Skia&version=1.2.0-beta-0013&prerelease
#tool nuget:?package=Shiny.Controls.Office.Skia&version=1.2.0-beta-0013&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). 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 — 42 animated icons that run on a timer, on hover, on tap or on command — ship in the core packages on both hosts. 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, 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 |
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) |
| 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 |
| 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 | 42 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
- Shiny.Controls.Office.Shared (>= 1.2.0-beta-0013)
- SkiaSharp (>= 4.151.1)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Shiny.Controls.Office.Skia:
| Package | Downloads |
|---|---|
|
Shiny.Blazor.Controls.Office
Spreadsheet viewer and editor for Blazor WebAssembly, rendering .xlsx on a SkiaSharp canvas. |
|
|
Shiny.Maui.Controls.Office
Spreadsheet, document and slide viewers and editors for .NET MAUI, rendering .xlsx, .docx and .pptx on a SkiaSharp canvas. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.0-beta-0013 | 0 | 8/28/2026 |
| 1.2.0-beta-0012 | 0 | 8/28/2026 |
| 1.2.0-beta-0011 | 0 | 8/28/2026 |
| 1.2.0-beta-0010 | 29 | 8/28/2026 |
| 1.2.0-beta-0009 | 41 | 8/28/2026 |
| 1.2.0-beta-0008 | 34 | 8/27/2026 |
| 1.2.0-beta-0007 | 51 | 8/26/2026 |
| 1.2.0-beta-0006 | 39 | 8/26/2026 |
| 1.2.0-beta-0005 | 46 | 8/26/2026 |
| 1.2.0-beta-0004 | 48 | 8/26/2026 |
| 1.2.0-beta-0001 | 73 | 8/24/2026 |