Colour-blind safe palette and a no-colour-alone rule (#56) #86
No reviewers
Labels
No labels
area:companion
area:docs
area:shared
area:tooling
area:watchapp
blocker
kind:chore
kind:feature
kind:spike
kind:test
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
robert/PedalPebble!86
Loading…
Reference in a new issue
No description provided.
Delete branch "area/colour-palette"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements #56 ("Colour-blind safe palette and a no-colour-alone rule").
This gates #59 (the HERO1/HERO2/QUAD/GRID6 template renderer) — #83/#85 both explicitly deferred
real visual template work to #59, which needs this palette to exist first.
What's here
watchapp/src/c/palette.h— namedGColorconstants (neutrals, staleness grey tying into D44,and five semantic accent colours), aliased from the SDK's own
gcolor_definitions.h, not inventedhex values.
docs/DESIGN.md— new section 7 (Colour): palette source, the no-colour-alone rule restated witha per-feature intent table, CVD reasoning, contrast, and how to use
gcolor_legible_over().docs/DECISIONS.md— a small correction under D24: gabbro is 64 colours, not just "colour"(verified by diffing its
gcolor_definitions.hagainst emery's — byte-for-byte identical).No visual change today
Grepped the tree: nothing under
watchapp/src/c/sets aGColoranywhere. Every currentTextLayerdraws with the system default (black on white). This PR is pure infrastructure — zero effect until
#59 (and later #54, off-route state, HR zones, GPS quality, speed source) start consuming it.
Verified vs. reasoned (the project's own convention, see docs/TEAM.md)
Verified:
~/.local/share/pebble-sdk/SDKs/4.33.1/sdk-core/pebble/{emery,gabbro}/include/gcolor_definitions.h,byte-for-byte identical between the two platforms.
basaltis also 64-colour, confirmed against current docs atdeveloper.rebble.io.
gcolor_legible_over(GColor8)exists — confirmed both in currentdeveloper.repebble.com docs and by
grepping the installed SDK's
pebble.h(GColor8 gcolor_legible_over(GColor8 background_color);).spec text at w3c.github.io.
palette.h's comments — computed (not guessed) via the standard WCAGrelative-luminance formula against each colour's exact SDK RGB values.
pebble build— actually run, clean, for gabbro/emery/basalt, withpalette.htemporarily#included intomain.cto force real compilation underarm-none-eabi-gcc(then reverted; thebuild is unaffected either way — identical heap-free figures).
Reasoned, explicitly not simulator-verified (no CVD simulator available in this sandbox):
colour-vision-deficiency confusion-axis reasoning — protanopia/deuteranopia collapse red-green,
tritanopia collapses blue-yellow. Response is structural: green is not used for any semantic/stateful
colour at all, so the red/green pairing the issue calls out can't arise by accident. Section 7.3 is
explicit about where this is honestly weakest (the blue→violet HR-zone step), which is exactly why
the no-colour-alone rule is a requirement, not a nicety.
Explicitly NOT verified, flagged as needing Robert's physical devices (both emery and gabbro are
in hand per this session's memory): direct-sunlight legibility of these swatches on the actual
e-paper. Searched for official Pebble/Rebble contrast-in-sunlight documentation and found none —
only general, non-Pebble-specific e-paper reflectivity claims, which section 7.4 is explicit about
not treating as if they were a measured figure. The WCAG contrast numbers are a real computation, but
they assume an emissive sRGB display; e-paper reflectance under direct sun is a physical property no
formula run on RGB channel values can establish.
Acceptance criteria (from #56)
tritanopia (reasoned, not simulator-verified — see above)
pairing table
state at all
— documented intent per feature (all future UI, none implemented yet, per the issue's own
scope note)
WCAG contrast instead, flagged explicitly as not a substitute, needs Robert's physical watches
watchapp/src/c/palette.hhttps://claude.ai/code/session_01DAoXbRmJUf2uxNYBfdAXPt