8000 feat(app): monochrome design system drawn from the product mark by shroominic · Pull Request #122 · shroominic/OpenGlucose · GitHub
[go: up one dir, main page]

Skip to content

feat(app): monochrome design system drawn from the product mark - #122

Open
shroominic wants to merge 2 commits into
mainfrom
feature/monochrome-design
Open

shroominic wants to merge 2 commits into
mainfrom
feature/monochrome-design

Conversation

@shroominic
Copy link
Copy Markdown
Owner

Summary

  • add openhealth/lib/src/theme/og_theme.dart as the single source of colour, radius, and component shape
  • replace the accent palette with tokens across every app surface, removing roughly 200 literal colour values
  • carry glucose state with contrast, weight, and shape instead of hue, so it survives a greyscale or dimmed screen
  • draw the product mark in code and make its cutout square the one status glyph
  • record the choice in ADR 0005 with screenshot evidence

Presentation only. Sensor behaviour, Bluetooth pairing, stored readings, exports, Health integration, and privacy controls are unchanged.

Why

The interface had grown teal, cream, amber, and coral accents that each screen redefined locally, so one visual change had to be repeated in every widget and drifted between surfaces.

The palette also carried meaning. A reading was in range because it was teal and out of range because it was amber or coral. People read glucose quickly, often outdoors, sometimes on a dimmed or greyscale screen, and about one in twelve men has a colour-vision difference. Hue alone is a fragile carrier for that state.

Design

One ink (#0A0A0A), one paper (#FFFFFF), and a four-step grey ramp, taken from the app mark: a black disc with a white rounded-square cutout.

  • Filled means present. Live, in range, or improved on last week.
  • Hollow means attention. Warming up, waiting, out of range, or worse than last week.
  • Inversion means importance. Demo and sample notices become white on an ink bar.

The chart follows the same rule: an ink trace over a grey target band, with solid in-range dots and hollow out-of-range rings.

Screenshots

Dashboard History and patterns Settings
Sensor lifecycle Onboarding Target range

Captured from the deterministic demo driver in a release web build at a 430x932 viewport. The readings are simulated and no sensor or health data appears.

Verification

  • make check from a clean worktree, through the pre-push hook
  • 285 app tests plus the package suites
  • one test failure was fixed in the code, not the test: the ink notice bar had uppercased a localized string, so it now renders the label verbatim

Two presentation defects found while reviewing the screenshots are also fixed here: the large Settings title rendered at body size, and the settings section labels were centred by a Column default.

Scope and exclusions

  • no iOS, macOS, or Android device evidence in this change
  • platform launch screens and app icons keep their current assets
  • a dark theme becomes a token-level change but is not part of this PR

Risk

R1 UI change. It touches accessibility by removing hue as the sole carrier of range state, so raise it to R2 if you want dedicated contrast tests before merge.

🤖 Generated with Claude Code

shroominic and others added 2 commits September 16, 2026 18:50
The interface carried roughly 200 literal colour values spread across
every widget, and it used hue to say whether a reading was in range.
Glucose is read quickly, often outdoors and sometimes on a dimmed or
greyscale screen, so hue alone is a fragile carrier for that state.

Add openhealth/lib/src/theme/og_theme.dart as the single source of
colour, radius, and component shape: one ink, one paper, and a four-step
grey ramp taken from the product mark. Feature code now references
tokens and declares no literal colours.

Carry state with contrast, weight, and shape instead. The mark's cutout
square becomes the one status glyph, filled when a reading is live, in
range, or improved and hollow when it needs attention. Demo and sample
banners invert to ink. The chart draws an ink trace over a grey target
band with solid in-range dots and hollow out-of-range rings, so range
survives a greyscale screen.

Presentation only. Sensor behaviour, pairing, stored readings, exports,
Health integration, and privacy controls are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Add ADR 0005 for a cross-cutting visual choice: one token set, and
glucose state carried by contrast, weight, and shape so it survives a
greyscale or dimmed screen. Record the alternatives, including keeping
colour for range state, and the review controls the decision needs.

Capture the six reviewed surfaces in docs/design/monochrome. They come
from the deterministic demo driver, so the readings are simulated and no
sensor or health data appears.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

0