3.6 KiB
Design Guide
All UI code must reference tokens from lib/widgets/theme.dart (AppTokens)
rather than hard-coding values. Any new token belongs here first.
Color
Seed
AppTokens.seed=#3F51B5(indigo). Both the light and dark schemes are derived from this seed viaColorScheme.fromSeed.
Tracker palette
Each tracker chooses an accent color from AppTokens.trackerPalette. The
accent is applied to progress bars, the checked-chapter fill, and the header
stats. The palette (10 colors) is tuned to remain legible on both light and
dark surfaces:
| Color | Hex |
|---|---|
| Indigo | #3F51B5 |
| Blue | #1E88E5 |
| Teal | #00897B |
| Green | #43A047 |
| Amber | #FDD835 |
| Orange | #FB8C00 |
| Red | #E53935 |
| Pink | #D81B60 |
| Purple | #8E24AA |
| Brown | #6D4C41 |
Usage rules
- Never use raw
Color(0x…)orColors.redoutside oftheme.dartor the palette constant. Pull fromTheme.of(context).colorSchemeor pass the tracker accent through. - Inactive surfaces (unread chapters, progress bar track) use
colorScheme.surfaceContainerHigh/surfaceContainerHighest. - Destructive actions use
colorScheme.error.
Typography
Use the Material 3 text theme. Reach for:
displaySmall— hero progress percentages on the Stats screen.headlineMedium— progress percentage on the Tracker header.titleLarge/titleMedium— screen-level and card titles.titleSmall— list-item titles (e.g. book names).bodyMedium— body copy, stat values.labelMedium/labelSmall— compact counters, section metadata.
Weight overrides are allowed (FontWeight.w500 / w600 / w700) but font
family and sizes must come from the theme.
Spacing
8pt grid, defined in AppTokens:
| Token | Value |
|---|---|
spaceXS |
4 |
spaceS |
8 |
spaceM |
12 |
spaceL |
16 |
spaceXL |
24 |
spaceXXL |
32 |
Screen padding defaults to spaceL. Inner card padding defaults to spaceL.
Gaps between related widgets use spaceS–spaceM; gaps between distinct
sections use spaceXL.
Radius
| Token | Value |
|---|---|
radiusS |
8 |
radiusM |
12 |
radiusL |
16 |
Cards: radiusM. Chapter cells: radiusM. Pill chips: radiusL. Buttons:
radiusS.
Components
TrackerTile— card on the home list. Shows dot + name + percent pill- progress bar.
BookTile— list row on the Tracker screen. Shows leading status badge, book name, inline progress bar, andread / totalcounter.ProgressBar— thin rounded linear indicator with a tracker accent color on top of thesurfaceContainerHighesttrack.ProgressPill— percent chip tinted with the accent color at 15% alpha.- Chapter cell (
book_screen.dart) — square tile, accent-filled when read; tap toggles.
Layout conventions
- Home, Tracker, and Stats screens each own a single
Scaffoldwith a contextualAppBar. - Long scrollable lists always use
ListView.separatedwith a thinoutlineVariantdivider. Books within a testament are grouped under a_SectionHeader. - Destructive confirmations (delete, reset) use a standard
AlertDialogwith an error-tinted confirm button.
Theming
AppTheme.light() / AppTheme.dark() build from a Material 3
ColorScheme.fromSeed. Component themes (AppBarTheme, CardThemeData,
ListTileThemeData, DividerThemeData, FilledButtonThemeData,
ProgressIndicatorThemeData) are centralized so individual widgets stay
declarative.