feat: card tilt toggle (per-member, synced) #80

Merged
nalum merged 3 commits from feat/card-tilt-toggle into main 2026-08-16 12:38:02 +00:00
Owner

Closes #48. Stacks on #79 (#60) — base is feat/sync-ui-preferences; merge that first.

Some members find the pinned-note tilt harder to read. This adds a per-member opt-out that straightens every card. It rides the synced flatten_cards field from #60, so the choice follows a member across devices. Default stays tilted — this is an opt-out.

What changed

  • web: one --tilt-on multiplier gates every card rotation; html[data-flatten-cards="true"] zeroes it, flattening the whole board regardless of screen width. The raw rotations that ignored --tilt-scale (sign-in note, me-menu keyframes) now route through it too. Toggle in Settings → Appearance and a step in the first-login tour, both applying live.
  • android: flatten_cards gains a home in ThemePref and rides pullTheme/pushTheme; tiltAngle() returns 0 when set, gated through a LocalFlattenCards the theme provides. Settings gets a Tilted/Straight chip beside Motion; the tour reuses that section, so onboarding offers it too. This closes the ADR-0029 note that Android rendered no tilt.
  • docs: frontend-plan.html records flat as a supported mode and the one-switch mechanism on each surface.

Surface parity (rule 1)

Web and Android both honor the preference. MCP and CLI render no cards.

Verification

  • make check green (Go + web build + web/android i18n).
  • Android module compiles.
  • Live deploy: served CSS carries :root{--tilt-on:1} / html[data-flatten-cards=true]{--tilt-on:0} and every rotation multiplies by var(--tilt-on,1); flatten_cards round-trips through the live settings write.

🤖 Generated with Claude Code

Closes #48. Stacks on #79 (#60) — base is `feat/sync-ui-preferences`; merge that first. Some members find the pinned-note tilt harder to read. This adds a per-member opt-out that straightens every card. It rides the synced `flatten_cards` field from #60, so the choice follows a member across devices. Default stays tilted — this is an opt-out. ## What changed - **web**: one `--tilt-on` multiplier gates every card rotation; `html[data-flatten-cards="true"]` zeroes it, flattening the whole board regardless of screen width. The raw rotations that ignored `--tilt-scale` (sign-in note, me-menu keyframes) now route through it too. Toggle in Settings → Appearance and a step in the first-login tour, both applying live. - **android**: `flatten_cards` gains a home in `ThemePref` and rides `pullTheme`/`pushTheme`; `tiltAngle()` returns 0 when set, gated through a `LocalFlattenCards` the theme provides. Settings gets a Tilted/Straight chip beside Motion; the tour reuses that section, so onboarding offers it too. This closes the ADR-0029 note that Android rendered no tilt. - **docs**: `frontend-plan.html` records flat as a supported mode and the one-switch mechanism on each surface. ## Surface parity (rule 1) Web and Android both honor the preference. MCP and CLI render no cards. ## Verification - `make check` green (Go + web build + web/android i18n). - Android module compiles. - Live deploy: served CSS carries `:root{--tilt-on:1}` / `html[data-flatten-cards=true]{--tilt-on:0}` and every rotation multiplies by `var(--tilt-on,1)`; `flatten_cards` round-trips through the live settings write. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Some members find the pinned-note tilt harder to read. Add an opt-out that
straightens every card. A single --tilt-on multiplier gates every rotation;
zeroing it once flattens the whole board, and because the wide-screen
--tilt-scale halver only ever sets --tilt-scale, one flag flattens
regardless of screen width. Routed the raw rotate uses (sign-in note, the
me-menu note keyframes) through it too, so nothing is left tilted. The
choice rides the synced flatten_cards field (ADR-0029, #60): a toggle in
Settings' appearance sheet and a step in the first-login tour, both applying
live. Default stays tilted — this is an opt-out.
Give Android the card-tilt opt-out the web now carries (#48). flatten_cards
gains a home in ThemePref and rides pullTheme/pushTheme like motion;
tiltAngle() returns 0 when it is set, gated through a LocalFlattenCards the
theme provides — the render half of the web's --tilt-on switch. The Settings
appearance section gets a Tilted/Straight chip beside Motion, and because the
first-login tour reuses that section, the choice is offered during onboarding
too. Closes the ADR-0029 note that Android rendered no tilt. Default stays
tilted.
docs(frontend): record card-tilt flat as a supported mode
All checks were successful
check / commits (pull_request) Successful in 7s
check / web (pull_request) Successful in 1m42s
check / go (pull_request) Successful in 2m42s
check / report (pull_request) Successful in 4s
android / build (pull_request) Successful in 5m55s
android / report (pull_request) Successful in 4s
f0b9154d0a
The frontend canon documented the tilt as fixed visual identity. #48 makes
flat a first-class per-member mode, so record it: the synced flatten_cards
preference, where it is toggled (Settings and the tour), and the one-switch
mechanism on each surface (the web's --tilt-on multiplier, Android's zeroed
tiltAngle). Default stays tilted (rule 5).

Test report

Suite Tests Result Skipped
Unit 1330 ✅ pass 1
Integration 83 ✅ pass —

Coverage: 27.7%

Updated by the check workflow · commit fe821cbb3f

<!-- ci-test-report --> ## Test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit | 1330 | ✅ pass | 1 | | Integration | 83 | ✅ pass | — | **Coverage:** 27.7% <sub>Updated by the check workflow · commit fe821cbb3f10b6b6fa0c5e71759e1f436a2d739a</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) 31 ✅ pass 0

Updated by the android workflow · commit fe821cbb3f

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | 31 | ✅ pass | 0 | <sub>Updated by the android workflow · commit fe821cbb3f10b6b6fa0c5e71759e1f436a2d739a</sub>
nalum force-pushed feat/card-tilt-toggle from f0b9154d0a
All checks were successful
check / commits (pull_request) Successful in 7s
check / web (pull_request) Successful in 1m42s
check / go (pull_request) Successful in 2m42s
check / report (pull_request) Successful in 4s
android / build (pull_request) Successful in 5m55s
android / report (pull_request) Successful in 4s
to fe821cbb3f
Some checks failed
check / commits (pull_request) Successful in 8s
check / go (pull_request) Successful in 2m57s
check / web (pull_request) Successful in 1m37s
android / build (pull_request) Successful in 6m22s
check / report (pull_request) Successful in 3s
android / report (pull_request) Successful in 3s
android / report (push) Has been cancelled
check / go (push) Has been cancelled
check / report (push) Has been cancelled
check / web (push) Has been cancelled
tag / tag (push) Has been cancelled
android / build (push) Has been cancelled
check / commits (push) Has been cancelled
2026-08-14 23:12:47 +00:00
Compare
nalum changed target branch from feat/sync-ui-preferences to main 2026-08-16 12:37:55 +00:00
nalum merged commit fe821cbb3f into main 2026-08-16 12:38:02 +00:00
nalum deleted branch feat/card-tilt-toggle 2026-08-16 12:38:02 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
eagraiclainne/app!80
No description provided.