Skip to content

Establish a deliberate colour system for the UI #469

Description

@richardthe3rd

Summary

Colour is used as a visual signal in several places, but not as one coherent system. As of #468 there are now two category-colour code paths that can drift, plus scattered hardcoded status colours, and none of the accent colours derive from the theme seed (so they don't adapt to dark mode or per-festival theming). Worth a deliberate pass on how colour is used across the app.

Current state

  • CategoryColorHelper (lib/utils/category_color_helper.dart) now has two methods that both map a category to a colour:
    • getCategoryColor(context, category) — theme-aware, used for chips/badges.
    • getAccentColor(category) — a fixed hand-picked palette (amber/red/green/…), used for the drink list card and the Similar Drinks carousel left edges.
      These can assign the same category different colours.
  • Availability has its own colour logic (_AvailabilityChip in lib/widgets/drink_card.dart, plus the hero availability row), and there's a hardcoded "tasted" green (0xFF2E7D32 / 0xFF4CAF50) duplicated between the drink card's status badge and the carousel mini-card's status icon.
  • The fixed accent palette isn't derived from appSeedColor (lib/app_theme.dart), so it doesn't shift for dark mode or a per-festival theme.

What to think about

  • Consolidate category colours into one source of truth — fold the two CategoryColorHelper methods together, or clearly separate "accent" vs "chip" roles so they can't diverge.
  • Decide colour-as-signal usage deliberately across category / availability / personal status (tasted, want-to-try): a small documented palette rather than scattered hex constants.
  • How category/status colours interplay with dark mode and per-festival theming (see Per-festival themes and user theme selection #40) — theme-derived vs a stable fixed set.
  • Keep accessibility intact: colour stays supplementary (never the sole signal), with contrast checked in both light and dark themes.

Related

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions