You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: SKILLS/shiny-controls/SKILL.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -821,10 +821,10 @@ Every control below is available on **both** MAUI and Blazor. The feature set (p
821
821
The library contains:
822
822
-**TableView**: A pure MAUI settings-style TableView with 14 cell types, cascading styles, sections, drag-sort reordering, and full MVVM/binding support
823
823
-**DataGrid** (MAUI + Blazor): A feature-rich data grid modeled on MudBlazor. Blazor is a generic `DataGrid<TItem>` rendering an HTML `<table>` with child `PropertyColumn`/`TemplateColumn`; MAUI is a pure cross-platform composite (`shiny:DataGrid` + `DataGridColumn`/`DataGridTemplateColumn`, items as `object`) built on a `Grid` header + virtualized `CollectionView` (no native handlers). Sorting (single/multi), filtering (menu/row/toolbar), grouping + aggregates, single/multi selection w/ checkboxes, inline editing (cell/form), paging, virtualization, column resize/reorder, sticky header, `ServerData` delegate, density/striped/bordered/hover. See datagrid.md
824
-
-**Spreadsheet** (MAUI + Blazor WASM): `SpreadsheetView` opens, renders and edits real `.xlsx` workbooks. A shared host-agnostic kernel (`Shiny.Controls.Office.Shared`) owns the OOXML package, a transactional undo stack and a formula engine (~80 functions, dependency-ordered recalculation, circular-reference detection); a shared SkiaSharp painter (`Shiny.Controls.Office.Skia`) draws the grid for both hosts, so MAUI and Blazor are literally the same renderer. Virtualized grid over 1,048,576 rows, frozen panes, merged cells, column/row resize, range selection, in-cell editing via a native `Entry`/`<input>`. Edits are surgical: an unmodified workbook saves byte-identical, and macros, tracked changes, pivot caches and custom XML survive untouched. MAUI requires `UseShinyOffice()` (SkiaSharp plus, on `net10.0-macos`, the AppKit canvas SkiaSharp does not ship); Blazor is WASM-only. Row/column insert-delete is deliberately not implemented. See spreadsheet.md
824
+
- **Spreadsheet** (MAUI + Blazor WASM): `SpreadsheetView` opens, renders and edits real `.xlsx` workbooks. A shared host-agnostic kernel (`Shiny.Controls.Office.Shared`) owns the OOXML package, a transactional undo stack and a formula engine (~80 functions, dependency-ordered recalculation, circular-reference detection); a shared SkiaSharp painter (`Shiny.Controls.Office.Skia`) draws the grid for both hosts, so MAUI and Blazor are literally the same renderer. Virtualized grid over 1,048,576 rows, frozen panes, merged cells, column/row resize, range selection, in-cell editing via a native `Entry`/`<input>`. Edits are surgical: an unmodified workbook saves byte-identical, and macros, tracked changes, pivot caches and custom XML survive untouched. MAUI requires `UseShinyOffice()` (SkiaSharp plus, on `net10.0-macos`, the AppKit canvas SkiaSharp does not ship); Blazor is WASM-only. Row/column insert-delete is deliberately not implemented. **Find** is on the Home tab of all three Office toolbars — a box, a `3/12` readout and previous/next arrows over a shared `IFindController`; the spreadsheet searches cell text as the formula bar shows it (formula first, then literal), the active sheet only unless `SearchAllSheets` is set. See spreadsheet.md
825
825
-**Document & Slide Viewers** (MAUI + Blazor WASM): `DocumentView` renders `.docx`, `SlideView` renders `.pptx`, both **read-only** and both in the same packages as the spreadsheet. Word **reflows** to the control's width rather than paginating — no pages, headers or footers by design — with the full style chain resolved (doc defaults → named style with its whole `basedOn` ancestry → direct formatting), lists numbered from `numbering.xml`, tables with spans/merges/shading, inline images, plus an outline for navigation. PowerPoint **scales** its fixed-size artboards rather than reflowing, with shapes resolved through slide → layout → master (a title placeholder usually carries text and nothing else), ~20 preset geometries, gradient fills, theme colours with lumMod/lumOff/shade/tint applied, per-level text styles, notes, and a thumbnail-grid mode. Both preserve the package untouched and report what they could not draw via `UnsupportedFeatureCollector`. See document-viewer.md
826
-
- **Document Editor** (MAUI + Blazor WASM): two controls — `DocumentEditor` is the lone editing surface, `DocumentEditorView` wraps it in formatting chrome. Edits are surgical on the OOXML runs (runs are split only at the boundaries an edit needs and never rebuilt, so language, proofing state and revision marks survive), with a transactional undo stack, caret and selection over the shared text layout, and typing/Enter/Backspace/formatting/alignment. Both toolbars are built from the same core pickers — FontPickerButton, FontSizePickerButton and ColorPickerButton exist on both hosts; only the bar around them differs (MAUI lays out a row of primitives because it has no toolbar control, Blazor composes ShinyToolbar with the item row as its own flex container, which is what keeps the items off the text baseline and aligned). Blazor keyboard input is complete (via `beforeinput`, so IME and dictation work); **MAUI has no portable key-down event**, so physical keys route through `HandleKey`. **Spell check** uses the platform's own dictionary on MAUI — UITextChecker, NSSpellChecker, Android text services, Windows `ISpellChecker` — registered automatically, with a red wavy underline and a right-click/long-press menu offering corrections, Ignore and Add to dictionary (which writes to the user's real dictionary); the browser exposes no such API so Blazor defaults to none and takes an app-supplied `ISpellChecker`, overridable per control or globally via `SpellCheckers.Default` on either host. See document-editor.md
827
-
- **Slide Editor** (MAUI + Blazor WASM): two controls — `SlideEditor` is the lone editing surface, `SlideEditorView` wraps it in an editing toolbar. Two gestures carry the whole design: a single click selects a shape and draws a dashed frame with eight resize handles (drag body to move, handle to resize); a double-click puts a caret inside that shape's text and the frame turns solid. Typing is deliberately dropped while a shape is merely selected — `Controller.IsEditingText` gates it. Only shapes the slide itself owns are selectable; layout/master shapes and group children are skipped, because dragging one would move it across every slide using that layout. Edits are surgical on the DrawingML runs, and `a:rPr` children are a *sequence* — out-of-order properties make PowerPoint call the file corrupt rather than repair it. The text layout inside a shape is shared with the painter so caret and glyphs cannot drift. `SetFontSize`/`CaretFormat.FontSize` are in points, not the model's pixels. Not implemented: soft line breaks, table-cell and grouped-shape editing, adding/reordering slides, rotation handles. See slide-editor.md
826
+
- **Document Editor** (MAUI + Blazor WASM): two controls — `DocumentEditor` is the lone editing surface, `DocumentEditorView` wraps it in formatting chrome. Edits are surgical on the OOXML runs (runs are split only at the boundaries an edit needs and never rebuilt, so language, proofing state and revision marks survive), with a transactional undo stack, caret and selection over the shared text layout, and typing/Enter/Backspace/formatting/alignment. Both toolbars are built from the same core pickers — FontPickerButton, FontSizePickerButton and ColorPickerButton exist on both hosts; only the bar around them differs (MAUI lays out a row of primitives because it has no toolbar control, Blazor composes ShinyToolbar with the item row as its own flex container, which is what keeps the items off the text baseline and aligned). Blazor keyboard input is complete (via `beforeinput`, so IME and dictation work); **MAUI has no portable key-down event**, so physical keys route through `HandleKey`. **Spell check** uses the platform's own dictionary on MAUI — UITextChecker, NSSpellChecker, Android text services, Windows `ISpellChecker` — registered automatically, with a red wavy underline and a right-click/long-press menu offering corrections, Ignore and Add to dictionary (which writes to the user's real dictionary); the browser exposes no such API so Blazor defaults to none and takes an app-supplied `ISpellChecker`, overridable per control or globally via `SpellCheckers.Default` on either host. **Find** is on the Home tab — a box, a `3/12` readout and previous/next arrows (`OfficeFindBar` over `IFindController`, shared with the slide and spreadsheet editors). Setting `Find.Query` searches and steps onto the first hit at or after the caret and selects it; next/previous wrap; paragraphs only, because a caret position is a block and an offset and a table cell has neither. See document-editor.md
827
+
- **Slide Editor** (MAUI + Blazor WASM): two controls — `SlideEditor` is the lone editing surface, `SlideEditorView` wraps it in an editing toolbar. Two gestures carry the whole design: a single click selects a shape and draws a dashed frame with eight resize handles (drag body to move, handle to resize); a double-click puts a caret inside that shape's text and the frame turns solid. Typing is deliberately dropped while a shape is merely selected — `Controller.IsEditingText` gates it. Only shapes the slide itself owns are selectable; layout/master shapes and group children are skipped, because dragging one would move it across every slide using that layout. Edits are surgical on the DrawingML runs, and `a:rPr` children are a *sequence* — out-of-order properties make PowerPoint call the file corrupt rather than repair it. The text layout inside a shape is shared with the painter so caret and glyphs cannot drift. `SetFontSize`/`CaretFormat.FontSize` are in points, not the model's pixels. **Find** is on the Home tab, over the same shared `IFindController`: a deck search spans every slide, opens the one it lands on, selects the shape and selects the matched word, and searches only `IsEditable` shapes — a hit in a layout or master shape would count the company name once per slide. Not implemented: soft line breaks, table-cell and grouped-shape editing, adding/reordering slides, rotation handles, replace. See slide-editor.md
828
828
- **TreeView**: Hierarchical tree with lazy-loaded branches (`ChildrenLoader` for per-node async, `RootLoader` for async root), `ChildrenSelector` for sync data, `HasChildrenSelector`/`CanExpandSelector`/`CanSelectSelector` predicates, configurable `ExpandedIcon`/`CollapsedIcon`/`RetryIcon` (ImageSource on MAUI, RenderFragment slots on Blazor), single/multi selection with two-way `SelectedItem`/`SelectedItems` (multi-select renders a checkbox per row — `ShowSelectionCheckBoxes` to turn it off — and switching modes clears the selection), events + ICommand mirrors for `ItemSelected`/`ItemExpanded`/`ItemCollapsed`/`LoadFailed`/`ItemDropped`, indent + guide lines, drag/drop reorder with above/below/into drop positions and visual drop indicators (event-only — never mutates your data; native HTML5 drag via JS interop on Blazor for Safari/Firefox support, pan-gesture fallback on Catalyst/AppKit/GTK4), programmatic API (`ExpandAll`/`ExpandAllAsync` — both materialize every sync branch and cap at a `maxDepth` of 32 — plus `CollapseAll`/`Expand`/`Collapse`/`SelectAll`/`DeselectAll`/`SetBranchSelected`/`Refresh`/`ReloadAsync` with state preservation/`FindNode`), and keyboard navigation on Blazor
829
829
-**FloatingPanel + OverlayHost**: A floating panel overlay system (MAUI only). Panels slide from bottom or top with configurable detents, header peek when closed, backdrop dimming, and feedback. Multiple panels coexist without blocking touches. Use with `OverlayHost` (manual Grid setup) or `ShinyContentPage` (convenience ContentPage with built-in overlay). Blazor uses `SheetView` with CSS-based overlays instead
830
830
-**Expander & Accordion** (MAUI + Blazor): A disclosure panel — header plus content that animates in beneath or above it — and the accordion list that coordinates a stack of them. `Animation` is a flags enum (`Fade`/`Slide`/`Height`) so the effects combine; `SlideFrom` aims the slide at any of the four edges and `ExpandDirection` opens the panel down or up. Two-way `IsExpanded`, cancelable `Expanding`/`Collapsing`, `LoadContentOnDemand`, a rotating or swapping indicator on either edge, and full border/radius/fill/padding/separator control that falls back to the theme. `Accordion` adds `SelectionMode` Single/Multiple, `AllowCollapseAll`, a two-way `ExpandedIndex`, `ExpandAll`/`CollapseAll`, `ItemsSource` with header/content templates (MAUI) or a plain `@foreach` (Blazor), and motion/chrome defaults that reach every item that did not set them itself. On MAUI `Height` measures and animates a clipped panel; on Blazor it is a CSS `grid-template-rows` transition with no JS. See expander.md
0 commit comments