Run this before merging UI work or cutting a release. Each item maps back to a sub-skill if it fails.
How to Use
- Open every screen at default window size and at compact (640 px wide) and wide (1600+ px).
- Toggle
RequestedThemeVariantbetween Light and Dark. - Tab through every screen with the keyboard only.
- Run a screen reader on the main flows (Narrator on Win, VoiceOver on macOS).
- Profile a session with Avalonia DevTools (
F12) for layout/render issues (12.x: needs theAvaloniaUI.DiagnosticsSupportpackage +AttachDeveloperTools(); 11.x:Avalonia.Diagnostics+AttachDevTools()). - Tick each box. If anything fails → fix → re-run from the top.
Design Tokens & Theming → design-system
- No hard-coded color hex values in any view (all via
DynamicResource) - No magic spacing numbers — every
Margin/Paddingreferences the spacing scale - No magic font sizes — every
FontSizereferences the type scale - Both
LightandDarktheme dictionaries provided for every semantic brush - App responds correctly when OS theme changes at runtime
- One accent color, used consistently
- Text/background pairs verified ≥4.5:1 in both themes
- Disabled states use a token, not arbitrary opacity
Theme Library → themes
- Exactly one base theme imported (no Fluent + Material conflict)
- Theme NuGets at a version that supports the Avalonia version in use (see compatibility table in
themes) - No app code depends on internal theme NuGet brush keys (only via own semantic tokens)
- Custom title bar / SukiWindow / chrome behaves on Win, macOS, Linux (12.0+:
WindowDecorations/WindowDrawnDecorations, noSystemDecorations/ExtendClientAreaChromeHints)
Component Quality → components
- All buttons use shared classes (
primary/secondary/ghost/danger/icon) - Icon-only buttons have ≥36×36 hit area (desktop) or 44×44 (touch)
- Cards use the shared
Border.cardstyle — no per-view ad-hoc cards - Forms have visible labels (not placeholder-only);
PlaceholderText(12.0+) /Watermark(11.x) per project version, no obsoleteWatermarkin 12 - Form errors render inline, not only in a top banner
- Destructive actions confirmed via dialog or use
dangerclass - Empty states show icon + headline + description + CTA
- Loading states use skeleton or progress indicator (not spinner alone for >1s)
- Toasts auto-dismiss in 3–5s and are not focus-stealing
- No "click here" — link/button labels describe their action
Motion → motion
- Hover/press feedback ≤150 ms
- Page transitions 200–300 ms with easing
- No
Width/Height/Marginanimation - All
Transitionsdeclarations have explicitEasing - Exit animations ~70% of enter duration
- At most 2–3 concurrent animations per visible screen
- Reduced-motion path tested (durations → zero)
- Looping animations used sparingly and only on small elements
- 12.0+: animations that must run while hidden set
PlaybackBehavior="Always"; no removedCubicBezierEasing(useSplineEasing)
Accessibility → accessibility
- Every icon-only button has
AutomationProperties.Name - Every form input is associated with a
LabeledByor visible<TextBlock>label - Required fields marked with
AutomationProperties.IsRequiredForForm - Tab order matches visual reading order
- Focus ring visible (not removed) on every interactive element
- No information conveyed by color alone (icon/text always paired)
- Live regions (
AutomationProperties.LiveSetting) on toast / status updates - Screen reader reads each main screen meaningfully
- Verified at OS DPI 100/150/200%
- Verified in Windows High Contrast (or platform equivalent)
- All keyboard shortcuts present on macOS as
Cmdand Windows asCtrl - No
MaxLinestruncation without tooltip access to full text
Layout & Responsive → layout-patterns
- No fixed-pixel layout that breaks at 800-px window width
- Long-form text capped with
MaxWidth(~720 px reading width) - Long lists use
VirtualizingStackPanel/ItemsRepeater - Single vertical scroll per view (no nested scroll regions)
-
MinWidth/MinHeightonWindowset to a reasonable floor (e.g., 800×600) - Sidebar collapses or overlays on compact widths
- Right panel hidden on compact widths
- Page padding scales (24+ desktop / 16 compact)
- Cards reflow (UniformGrid columns / WrapPanel) at narrow widths
Icons & Imagery → icons-imagery
- Single icon family across the app
- Icon sizes from the size scale token, never magic numbers
- Icons square (
Width == Height) - Icon
Foreground/StrokeBrushbound to a semantic token - No emoji used as a structural icon
- Brand logo is the official asset, correct proportions
- App icons supplied at all required sizes (Win ICO, macOS ICNS, Linux PNG set)
- PNG raster images compressed
- Network images loaded asynchronously with placeholder
Performance
- Compiled bindings enabled: on by default since Avalonia 12.0 (
AvaloniaUseCompiledBindingsByDefault); opt-in in 11.x (set the property totrueor usex:CompileBindings). Every{Binding}hasx:DataTypein 12 - No
INotifyPropertyChangedstorms — verify with Avalonia DevTools - No allocation in
Render()overrides - Lists ≥100 items virtualized
- Images >256 px load via async loader and dispose properly
- Scroll stays at 60 fps on a mid-tier machine (12.1+: apps render at monitor refresh rate on X11/Windows non-default modes — check CPU/GPU at 120/144 Hz)
- First-window-shown < 1s after launch (cold start)
- No console warnings (
avalonia: WARN ...) in release build
Platform Parity
- Built and tested on Windows
- Built and tested on macOS
- Built and tested on Linux (X11 and Wayland if applicable). Wayland: via XWayland by default; native Wayland (12.1+, experimental, opt-in via
Avalonia.Wayland+.UseWayland();UsePlatformDetect()does not pick it) only if you enable it explicitly - Linux screen reader (Orca) checked — needs Avalonia 12.0+ (AT-SPI2)
- Tested on Avalonia.Mobile (Android/iOS) if app targets mobile
- Tested on WASM (browser) if app targets web
- Title bar/menu behavior correct per platform (macOS app-menu, Windows custom chrome)
- File dialogs use
IStorageProvider(cross-platform) — not WinFormsOpenFileDialog - Fonts render correctly on all platforms (static
.ttf/.otffiles with fallbacks; variable-font axes are not supported; Type 1 fonts unsupported in 12) - Keyboard shortcuts match platform conventions (
Cmdon macOS)
Final Polish
- No XAML warnings in build output
-
App.axamlStyles ordered: theme → tokens → app styles - Unused styles / resources removed
- All
x:Namedeclarations are intentional and used - Localization-ready: no English strings hard-coded if app is multi-language (use
Resx/Avalonia.Localization) - Designer-mode preview works (
d:DesignWidth/d:DesignHeightvalid) - No
MessageBox.Showleft in production code (useIDialogService/ FluentAvalonia ContentDialog)
Sign-off Template
✅ Visual Quality (tokens, themes, theme-variant tested both modes)
✅ Component Quality (shared styles, no ad-hoc)
✅ Motion (timing, easing, reduced-motion path)
✅ Accessibility (a11y props, keyboard, contrast, screen reader)
✅ Layout & Responsive (compact / wide tested)
✅ Icons & Imagery (single family, semantic colors)
✅ Performance (60 fps scroll, virtualized lists)
✅ Platform Parity (Win/macOS/Linux at minimum)
✅ Final Polish (no warnings, no leftover strings)
Reviewer: ____________ Date: ____________
If any item is ❌, link the relevant sub-skill in the PR review and request changes.