Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions docs/analysis/2026-09-08-night-palette-candidates/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Night palette candidate checkpoint

This numeric evidence package supports the maintainer choice requested in [issue #2009](https://github.com/Chris0Jeky/Taskdeck/issues/2009). It does not select or adopt a palette. The shipped primary ink value stays exact, all accent and status tokens stay exact, and the 3:1 non-text boundary target is reported as an aspiration rather than a release gate.

The package compares the current night palette with three warm directions:

- **A. Walnut outline** adds the clearest improvement with the smallest surface change.
- **B. Open folio** lightens the page substrate around recessed dark cards, reducing page-scale primary-ink contrast.
- **C. Cedar layers** makes cards rise from a dark substrate and gives the strongest surface hierarchy.

[Measured palette data](./contrast-summary.md) contains the issue comparison table, method, and complete CSV matrix. The [rendered token receipt](./rendered-token-measurements.json) records browser-computed values at the real render roots, selected Paper mode, viewport, PNG dimensions, and the synthetic fixture identifiers. The [local contact sheet](./harness/contact-sheet.html) compares the full-resolution Home, Today, and Review captures at 1440 by 1000.

The capture harness uses the repository Playwright fixture helpers with one synthetic Mock user, board, and pending capture proposal. The user selection is explicit: each page navigation seeds `td.paper.mode.v2` with `paper` or `paper-night`; the harness does not infer a theme from computed colors. The fixed capture title is `Night palette proof`, while generated user, board, capture, and proposal IDs remain in the receipt for traceability. No real data or remote provider was used.

The current night baseline keeps the shipped behavior. It records a real parity finding on Review: the body is selected as `paper-night`, but `PaperReviewView` mounts a static `.paper` root, so its inner surface computes the shipped light tokens. Candidate Review rows are clearly experimental comparisons: the harness applies the full night token set plus the selected `palettes.json` surface overrides to the real `.paper` root with page-local CSS only. This makes the candidate surfaces comparable without claiming a production fix or palette adoption. Home and Today inherit the selected body scope directly.

The harness asserts the Playwright page viewport and PNG IHDR dimensions are both exactly 1440 by 1000, verifies selected candidate values on the document and actual surface roots, and checks that populated app text is present before each capture. Its source is retained under [`harness/`](./harness/); the disposable Mock database and server state are excluded from delivery.

## Source binding

The screenshots were rendered from application base `64508d3e2f2d9dc8f8ea9aa5e9eb4539173ccb08`. The candidate measurements and palette inputs were saved at `209d5af1c5758f10305e4fe68b28f44602807dcb` before this evidence package was integrated. The later `origin/main` merge into this branch is integration context only; it does not imply a recapture or change the source binding of these screenshots and measurements.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"category","pair","Current night","A. Walnut outline","B. Open folio","C. Cedar layers"
"foreground / surface","--ink / --paper","14.88","14.36","12.44","14.46"
"foreground / surface","--ink / --paper-2","15.32","14.85","13.33","14.94"
"foreground / surface","--ink / --paper-card","13.96","13.22","13.96","12.44"
"foreground / surface","--ink / --paper-edge","13.86","12.50","10.29","11.49"
"foreground / surface","--ink-deep / --paper","17.02","16.42","14.22","16.54"
"foreground / surface","--ink-deep / --paper-2","17.52","16.99","15.24","17.09"
"foreground / surface","--ink-deep / --paper-card","15.96","15.12","15.96","14.22"
"foreground / surface","--ink-deep / --paper-edge","15.84","14.29","11.77","13.14"
"foreground / surface","--ink-2 / --paper","10.29","9.93","8.60","10.00"
"foreground / surface","--ink-2 / --paper-2","10.59","10.27","9.22","10.33"
"foreground / surface","--ink-2 / --paper-card","9.65","9.14","9.65","8.60"
"foreground / surface","--ink-2 / --paper-edge","9.58","8.64","7.12","7.95"
"foreground / surface","--mute / --paper","5.90","5.70","4.93","5.73"
"foreground / surface","--mute / --paper-2","6.07","5.89","5.29","5.92"
"foreground / surface","--mute / --paper-card","5.54","5.24","5.54","4.93"
"foreground / surface","--mute / --paper-edge","5.49","4.96","4.08","4.56"
"foreground / surface","--faint / --paper","5.11","4.93","4.62","5.37"
"foreground / surface","--faint / --paper-2","5.26","5.10","4.95","5.55"
"foreground / surface","--faint / --paper-card","4.79","4.54","5.19","4.62"
"foreground / surface","--faint / --paper-edge","4.75","4.29","3.82","4.27"
"foreground / surface","--whisper / --paper","1.58","1.94","2.25","2.38"
"foreground / surface","--whisper / --paper-2","1.63","2.01","2.41","2.46"
"foreground / surface","--whisper / --paper-card","1.48","1.79","2.52","2.05"
"foreground / surface","--whisper / --paper-edge","1.47","1.69","1.86","1.89"
"foreground / surface","--ember / --paper","5.45","5.26","4.56","5.30"
"foreground / surface","--ember / --paper-2","5.61","5.44","4.88","5.47"
"foreground / surface","--ember / --paper-card","5.11","4.84","5.11","4.56"
"foreground / surface","--ember / --paper-edge","5.07","4.58","3.77","4.21"
"foreground / surface","--ember-deep / --paper","3.66","3.53","3.06","3.56"
"foreground / surface","--ember-deep / --paper-2","3.77","3.65","3.28","3.67"
"foreground / surface","--ember-deep / --paper-card","3.43","3.25","3.43","3.06"
"foreground / surface","--ember-deep / --paper-edge","3.41","3.07","2.53","2.83"
"foreground / surface","--ember-ink / --paper","10.83","10.45","9.05","10.52"
"foreground / surface","--ember-ink / --paper-2","11.14","10.81","9.70","10.87"
"foreground / surface","--ember-ink / --paper-card","10.16","9.62","10.16","9.05"
"foreground / surface","--ember-ink / --paper-edge","10.08","9.09","7.49","8.36"
"foreground / surface","--applied / --paper","7.51","7.25","6.28","7.30"
"foreground / surface","--applied / --paper-2","7.73","7.49","6.73","7.54"
"foreground / surface","--applied / --paper-card","7.04","6.67","7.04","6.28"
"foreground / surface","--applied / --paper-edge","6.99","6.31","5.19","5.80"
"foreground / surface","--overdue / --paper","7.11","6.86","5.94","6.91"
"foreground / surface","--overdue / --paper-2","7.32","7.09","6.37","7.14"
"foreground / surface","--overdue / --paper-card","6.67","6.31","6.67","5.94"
"foreground / surface","--overdue / --paper-edge","6.62","5.97","4.92","5.49"
"foreground / surface","--line / --paper","1.23","3.33","2.89","3.91"
"foreground / surface","--line / --paper-2","1.26","3.45","3.09","4.04"
"foreground / surface","--line / --paper-card","1.15","3.07","3.24","3.37"
"foreground / surface","--line / --paper-edge","1.14","2.90","2.39","3.11"
"foreground / surface","--line-soft / --paper","1.12","1.87","1.62","2.22"
"foreground / surface","--line-soft / --paper-2","1.15","1.93","1.74","2.30"
"foreground / surface","--line-soft / --paper-card","1.05","1.72","1.82","1.91"
"foreground / surface","--line-soft / --paper-edge","1.04","1.63","1.34","1.77"
"surface hierarchy","--paper-card / --paper","1.07","1.09","1.12","1.16"
"surface hierarchy","--paper-card / --paper-2","1.10","1.12","1.05","1.20"
"surface hierarchy","--paper-edge / --paper","1.07","1.15","1.21","1.26"
"control text","--td-on-ember / --ember","5.49","5.49","5.49","5.49"
"control text","--td-on-ember / brightness(1.1) --ember","6.58","6.58","6.58","6.58"
"status text","--ember-ink / --ember-tint","9.53","9.53","9.53","9.53"
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Measured palette data

Generated by measure-contrast.mjs from the shipped .paper-night token block and [palettes.json](./palettes.json).

The calculation is the same WCAG sRGB relative-luminance formula used by the existing frontend contrast specs. Ratios are rounded to two decimals for presentation; assertions use unrounded values. The 3:1 boundary figure is characterized for comparison and is not treated as an acceptance gate.

## Issue measures

| Measure | Current night | A. Walnut outline | B. Open folio | C. Cedar layers |
| --- | ---: | ---: | ---: | ---: |
| Boundary | 1.15:1 | 3.07:1 | 3.24:1 | 3.37:1 |
| Soft boundary | 1.05:1 | 1.72:1 | 1.82:1 | 1.91:1 |
| Boundary on substrate | 1.23:1 | 3.33:1 | 2.89:1 | 3.91:1 |
| Card step | 1.07:1 | 1.09:1 | 1.12:1 | 1.16:1 |
| Card step on paper 2 | 1.10:1 | 1.12:1 | 1.05:1 | 1.20:1 |
| Whisper on card | 1.48:1 | 1.79:1 | 2.52:1 | 2.05:1 |
| Primary ink on substrate | 14.88:1 | 14.36:1 | 12.44:1 | 14.46:1 |
| Primary ink on card | 13.96:1 | 13.22:1 | 13.96:1 | 12.44:1 |
| Secondary ink on card | 9.65:1 | 9.14:1 | 9.65:1 | 8.60:1 |
| Muted ink on card | 5.54:1 | 5.24:1 | 5.54:1 | 4.93:1 |
| Faint ink on card | 4.79:1 | 4.54:1 | 5.19:1 | 4.62:1 |

Only --faint changes outside the surface and boundary group, in Open folio and Cedar layers. That small lift keeps faint text at or above 4.5:1 on their brighter surfaces. --ink, the rest of the ink ladder, and every accent and status token remain exactly at the shipped values.

The complete foreground-by-surface matrix, surface hierarchy measures, CTA base and hover checks, and error-tint pairing are in [contrast-matrix.csv](./contrast-matrix.csv).
Loading
Loading