Skip to main content
Wallpapers are Sundial’s decorative background system — used behind cards, list tiles, and hero surfaces. The model is a sealed class hierarchy in components/ash_wallpaper.dart rendered by the AshWallpaper widget:

SolidWallpaper

A flat, single-color wallpaper built on the brand colors. Introduced to replace gradients with solid brand colors as part of removing gradients from the app. Palettes: Factories:

ImageWallpaper

A single remote image by URL, cached via cached_network_image. Reach for it only when the artwork is supplied by the backend — it’s the one wallpaper type whose content isn’t decided in code.
Props: imageSrc (required), scale (default 1.0), alignment (default center), fadeInDuration (default 500 ms). While loading (or on error) the wallpaper shows a surfaceBg placeholder. It has exactly one use in the app today: the feature intro modal header, whose image URL arrives from the server.
The pattern bank is gone (July 29, 2026). ImageWallpaper used to also serve a bank of 26 hand-drawn pattern PNGs through .pattern(image:) and .random(random:) factories. The five surfaces still on those patterns moved to SolidWallpaper(ReferenceColors.lavender) (#1412), then both factories and the pattern-bank plumbing were deleted (#1413).For a decorative brand background, use SolidWallpaper — don’t reintroduce a remote image for decoration.

VectorWallpaper

Blurred gradient “blobs” over a background color — the most atmospheric option. Each named constructor is a fruit/persona theme with a bgColor and three blob colors whose positions/sizes are deterministically randomized from a string seed:
home
apple
blackberry
blueberry
cherry
dragonfruit
grape
orange
peach
pear
plum
(Approximate CSS previews — the app renders soft blurred blobs at deterministic seeded positions.) VectorWallpaper.lerp(a, b, t) interpolates two vector wallpapers — background color and each blob — enabling animated wallpaper transitions.
Vector wallpaper colors are intentionally off-token — vivid one-off values for atmosphere, not part of the reference ramps.

Legibility rule

Content over a wallpaper must stay readable. The convention (implemented in StyledListTile):
  • Solid wallpapers — dark sand-12 ink (contentOnBrand), no scrim; the brand colors are light enough. Secondary lines take contentOnBrandSecondary, the alpha ink.
  • Image/vector wallpapers — force a dark-brightness subtree via ThemeOverride and add a bottom gradient scrim, so light text sits on a darkened backdrop.
The AshWallpaper widget’s default scrim is surfaceBg at 50% alpha; pass a custom scrim (or blur) as needed. See AshWallpaper for the rendering API.