Skip to content

feat: P5/P6 components : table, context menu, carousel, stepper and 12 more - #4

Merged
Shewart merged 9 commits into
mainfrom
feat/p5-p6-components
Oct 6, 2026
Merged

Shewart merged 9 commits into
mainfrom
feat/p5-p6-components

Conversation

@Shewart

@Shewart Shewart commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Second component pass for MAUI: the remaining data-display and advanced tiers from the
roadmap, plus the form and utility components ShellUI Blazor already has. 16 components and a
wrap layout, two Windows crashes fixed, and a full Android pass.

New components (76 → 92 in the registry)

  • Data display: table, carousel, stat-card, timeline, kbd
  • Navigation: stepper, tree-view, link-card
  • Overlays: context-menu (opens at the pointer on right-click, long-press on touch)
  • Forms: toggle-group, number-input, tag-input, multi-select
  • Utility / layout: copy-button, aspect-ratio, wrap-layout

Each family ships as one template (table holds Table, TableHeader, TableRow, TableHead and
TableCell) rather than one template per part.

Fixes

Windows

  • Icons: generate-icons.py now converts every arc to Bézier curves. MAUI's Windows shape
    renderer could not draw the small arcs in the activity icon and the failure took the app down.
  • Demo: shows one category at a time (Buttons, Forms, Feedback, Overlays, Navigation, Data)
    with a fixed header. A single page holding every component exceeded WinUI's 250 layout
    passes and crashed at startup. Documented under "Long pages on Windows" in COMPONENTS.md.

Android

  • Popups (combobox, time picker, …) had an empty strip at the top the height of the status bar.
  • The overlay layer now always wraps the page content; with a Grid page root the status-bar
    strip was drawn over the page header.
  • Long-press now opens the context menu.
  • Toasts were offset twice from the bottom.
  • Tag input keeps the keyboard open after adding a tag and is 40dp tall like other inputs.
  • Tree view's expanded rows had no chevron.

Shared

  • ShellPortal popups can open at a point inside their anchor (AnchorPoint).

Testing

  • dotnet build ShellUI.Native.slnx — 0 warnings, 0 errors (Windows and Android targets)
  • dotnet test — 488 passed
  • Android (Pixel 7 / API 34 emulator): every new component exercised; overlays, back-to-close
    and the previous PR's open items re-checked in light and dark.
  • Windows: every new component rendered; table, context menu, carousel, stepper, toggle
    group, multi select, tree view and copy button clicked through.

Not verified

  • Number input and tag input on Windows: rendering only (both exercised on Android).
  • Link card: opening a Url not exercised on either platform.
  • Carousel auto-play.
  • iOS / Mac Catalyst: not run.

Follow-ups

  • resizable, navbar, sidebar (P6.4–P6.6)
  • date-range-picker, file-upload, command palette, menubar
  • Escape-to-close on Mac Catalyst
  • iOS pass

- table: header, rows with hover / selection / tap, caption, and sideways
  scrolling below a minimum width. Columns are Grid widths shared by every row.
- context-menu: opens at the pointer on right-click and under the trigger on
  long-press; items take an icon, a shortcut hint and a destructive style.
- carousel: swipe, arrow buttons, dots, loop and auto-play.
- stepper: numbered steps with active / completed states, per-step content and
  built-in Previous / Next / Confirm navigation.
- ShellPortal popups can open at a point inside their anchor (AnchorPoint).
- Demo sections, docs and roadmap updated; DEVELOPMENT_PLAN records Phase 1c/1d
  as merged (PR #3) and opens Phase 1e.
Found on a Pixel 7 / API 34 emulator pass over the last three batches:

- Popups (combobox, time picker, ...) were first laid out under the status
  bar, got padded for it, and kept that padding after being moved. They now
  start inside the safe area.
- Long-press did not open the context menu: the trigger's own gesture handling
  took the touch stream first. The listener now sits on the trigger content.
- The toast stack opts out of automatic safe-area padding, so it is no longer
  offset twice from the bottom.
MAUI on Windows cannot draw some elliptical arcs: the radius-0.25 arcs in the
"activity" icon made the Win2D shape renderer throw from its draw callback,
which takes the whole app down. generate-icons.py now rewrites every arc as
cubic Beziers, so icon paths only use M, L, C and Z and draw the same way on
every platform.
…t-card, timeline and wrap-layout


- toggle-group: a row of toggles with single or multiple selection.
- number-input: decimal field with - / + buttons, clamped to min / max.
- tag-input: chips with remove; Enter, comma or semicolon commits a tag.
- kbd: keyboard key hint.
- stat-card: metric with trend pill, description and icon.
- timeline: dot or icon markers joined by a line.
- wrap-layout: wrapping layout that measures each child once per pass
  (used by tag-input and the demo's button rows).
A single page holding every component needs more layout passes on Windows
than WinUI allows (250), so the demo crashed at startup once the newest
sections were added. The header now stays put with a category switcher
(Buttons, Forms, Feedback, Overlays, Navigation, Data) and only the selected
group is laid out. Button rows use WrapLayout; adds sections for the new
components.
… and height


- ShellPortal always wraps the page content, even when it is already a Grid.
  Adopting a Grid root put the layer inside its safe-area padding, so the
  status-bar strip was drawn over the page header.
- tag-input: adding a tag with Enter keeps the field focused and the soft
  keyboard open, and the field is 40dp tall like other inputs (Android gave
  the text field a 44dp minimum).

Found on a Pixel 7 / API 34 emulator pass over toggle-group, number-input,
tag-input, stat-card and timeline.
… and aspect-ratio


- multi-select: searchable select for several options; picks show as
  removable chips in the trigger and the panel stays open while picking.
- tree-view: nested expandable rows with selection.
- copy-button: copies text to the clipboard and confirms with a check.
- link-card: tappable card with icon, title and description; can open a URL.
- aspect-ratio: keeps content at a fixed width / height ratio.

Demo sections and docs included. Run on Windows and on a Pixel 7 / API 34
emulator.
@github-actions github-actions Bot added documentation Improvements or additions to documentation templates examples labels Oct 6, 2026
@Shewart
Shewart merged commit 10e9c11 into main Oct 6, 2026
6 of 14 checks passed
@Shewart
Shewart deleted the feat/p5-p6-components branch October 6, 2026 08:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation examples templates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant