Logo FS-Skia-UI

Controls Gallery Demo Spec — Overview & Shell

Goal

Build a complete, multi-page demonstration application — the Controls Gallery — that exercises every control in the FS.Skia.UI catalog, drives them with real pointer and keyboard input, and renders them under a single, cohesive, attractive color palette. This overview defines the shared application shell, the navigation model, the palette, and the pointer interaction contract that every page spec in this folder depends on. Each page spec (01-… through 10-…) covers one category of controls and inherits everything defined here.

Scope

The gallery must demonstrate all 52 supported controls from src/Controls/Catalog.fs, distributed across ten content pages:

Page

Spec

Controls demonstrated

Display & Typography

01-display-and-typography.md

text-block, rich-text, label, image, icon, separator, badge

Buttons & Commands

02-buttons-and-commands.md

button, icon-button, toggle-button, split-button

Text & Numeric Input

03-text-and-numeric-input.md

text-box, text-area, numeric-input, slider, date-picker, time-picker

Selection & Toggles

04-selection-and-toggles.md

check-box, radio-group, switch, list-box, multi-select-list, combo-box, color-picker

Data & Collections

05-data-and-collections.md

list-view, tree-view, data-grid

Layout & Containers

06-layout-and-containers.md

stack, grid, dock, wrap, border, panel, scroll-viewer, split-view

Navigation & Menus

07-navigation-and-menus.md

tabs, menu, context-menu, toolbar

Overlays & Feedback

08-overlays-and-feedback.md

tooltip, dialog, overlay, toast, progress-bar, spinner, validation-message

Charts & Graphs

09-charts-and-graphs.md

line-chart, bar-chart, pie-chart, scatter-plot, graph-view

Pointer Playground & Custom

10-pointer-playground-and-custom.md

custom-control plus the full pointer-event surface

Every catalog control must appear on exactly one page and be reachable by navigation from the shell.

User Experience

The app opens to the Display & Typography page with the navigation rail selected on that entry and the Light palette active. The user moves between pages by clicking entries in a persistent left navigation rail (or via keyboard), and every page presents its controls live and interactive — clickable, hoverable, editable — rather than as static screenshots. A top app bar carries the gallery title, a theme toggle, and an accent-palette selector. A bottom status strip narrates the most recent pointer and focus activity so behavior is legible in both interactive use and captured evidence. The experience must be readable, fast to understand, and deterministic under a seed.

Application Shell

The shell is a Dock (or equivalent) composition with four fixed regions that persist across every page:

Navigation is driven by a single ActivePage field in the model; the content region renders match model.ActivePage with …. No page may alter the dimensions of the bar, rail, or status strip.

Color Palette

The gallery ships one cohesive palette — Indigo & Teal on Slate — expressed through the Theme record (Foreground, Background, Accent, Danger, Muted) and the DTCG design-token source (src/Controls/design-tokens.tokens.json, typed surface DesignTokens.Light / DesignTokens.Dark). Accent overrides apply through Theme.withAccent; density through Theme.withDensity.

Light theme

Role

Hex

Usage

Canvas / background

#F6F7F9

Window and content backdrop

Surface

#FFFFFF

Cards, panels, input fields

Surface raised

#EEF1F5

App bar, nav rail, headers

Foreground

#1B2330

Primary text

Foreground muted

#5B6675

Secondary text, captions

Border / divider

#DCE1E8

Separators, field borders

Accent / primary

#4F46E5

Primary actions, selection

Accent hover

#4338CA

Hovered primary actions

Accent soft

#EEF0FE

Selected-row and tint fills

Secondary

#0EA5E9

Secondary emphasis

Success

#15A34A

Valid / positive state

Warning

#E8930C

Caution state

Danger

#DC2626

Destructive actions, errors

Focus ring

#6366F1

2px keyboard-focus outline

Dark theme

Role

Hex

Canvas / background

#0E131A

Surface

#19212C

Surface raised

#222C39

Foreground

#E7ECF3

Foreground muted

#9AA7B6

Border / divider

#2C3744

Accent / primary

#818CF8

Accent hover

#A5B4FC

Secondary

#38BDF8

Success

#4ADE80

Warning

#FBBF24

Danger

#F87171

Accent-palette variants

The accent selector swaps only the accent triad, keeping neutrals constant:

Categorical series palette (charts & multi-value controls)

An ordered, colorblind-aware sequence reused by every chart, the color picker swatches, and any multi-series control:

  1. Indigo #4F46E5
  2. Teal #14B8A6
  3. Amber #F59E0B
  4. Rose #F43F5E
  5. Sky #0EA5E9
  6. Violet #8B5CF6

Pointer-state visual mapping

Every interactive control must express these pointer states using palette roles, consistently across all pages:

All color choices must satisfy the theme's ContrastRequiredRatio (WCAG AA) for text and essential UI against their background.

Pointer & Mouse Interaction Contract

Every page consumes the framework pointer pipeline (src/Controls/Pointer.fsi), which raises PointerInteraction values the gallery folds into messages:

Each PointerInteraction the gallery handles must be reflected in the status strip as kind · controlId · (x, y) so pointer behavior is observable without a debugger. Pointer coordinates honor the active PixelSnapPolicy and LayoutResult.

Keyboard Contract

Pointer and keyboard must stay reconciled on every page:

Data Model

The shell model tracks at minimum:

Visual Requirements

App State

Track at minimum: active page; theme mode and accent; pointer state; focused control id; last pointer interaction; last message; random seed; and each page's own sub-model as defined in its spec.

Determinism and Evidence

Acceptance Criteria

Out of Scope

Type something to start searching.