Files
GroundedHelper/frontend/design.md
alvocool 4b71257429 Add groups with shared goals, objectives and chat; drop the water tracker
Groups let people keep each other honest: create one or join with a
six-letter invite code. Each group has shared goals split into measurable
objectives (km, sessions, words) that every member logs toward, a
leaderboard of kept rate and streak with nudges, and a group chat where
check-ins and nudges appear as cards beside the talk. The open chat polls
for new messages.

Reached from a new Groups tab (Training moves into the day rail), a Home
"Your groups" rail that opens the chat, and a Group tile in the add sheet.
Mock mode seeds two groups, a joinable one and members who reply.

The water tracker is removed; it did not fit the app. Bottom sheets are
now square app-wide via the theme.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KhQh614DMeYoQEH9SoMRUw
2026-11-03 11:46:41 +03:00

112 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Grounded — Design Language
Reference: an airy fitness-app look. Sage mist drifting into cream behind
everything (`AmbientBackground`), frosted glass for controls and floating
chrome (`GlassSurface`, `glassCircle`), ink type with a soft grey second
tone, painted landscapes instead of photography (`SceneArt`), a floating
glass tab bar with a dark square action button (`FloatingNav`), and one lime
spark on night-green for the primary control.
## Building blocks (`designs/`)
| Piece | Use |
|---|---|
| `AmbientBackground` | The backdrop for every light screen. |
| `GlassSurface` / `glassCircle` | Frosted panels and square controls; `onDark` over a scene or tinted stage. |
| `SceneArt` | Painted sky, sun and ridges with an optional figure glyph. Palettes come from `scenePalette(kind)`, `goalScene(accent)`, `classScene(class)`; seed with `sceneSeed(title)` so an item always wears the same picture. |
| `DotDigits` | The dotted clock in the routine player. |
| `FloatingNav` | Home's tab bar; the selected tab is a filled night block. The side action button is optional. |
| `GroundedMark` | The logo, drawn — a lime sun on a ground line under two arcs. The launcher PNGs in `assets/icons/` were rendered from the same geometry. |
Cards are image-led where an item has a kind (routines, goals, tasks): scene on
top or as a thumbnail, white type over the shaded lower half, three light
numbers along the bottom. Greetings are two-tone: Medium ink, then Regular
`colorInkSoft`. Primary buttons are square night bars with a lime icon.
`Sheet` is light (ambient) by default; passing `chrome`, `banner` or
`scene` gives a tinted stage with white type. Home, Routines and the player
build their own layouts from the same pieces.
The sections below describe the original record-style type scale, which still
applies to labels and metrics.
## Type — General Sans
| Role | Family | Size | Use |
|---|---|---|---|
| Display | `TextType.Light` | 30–44 | Screen titles. Always light, never bold. |
| Title | `TextType.Bold` | 17–20 | Card and section titles. |
| Body | `TextType.Regular` | 13–14, `height: 1.5` | Descriptions, copy. |
| Label | `TextType.Bold` | 10–11, `letterSpacing: 0.8–1.2`, uppercase, `colorGrey2` | Metadata above a value. |
| Metric | `TextType.Bold` | 24–34 | Debt score, counts. |
The label/value pair is the core unit: a tiny grey all-caps label sitting
directly above a large dark value. Used everywhere numbers appear.
## Geometry
- No rounded corners anywhere: sheets, cards, chips, buttons, fields, tiles and portraits are all square (`BorderRadius.zero`). Only small status dots, glows, the sun, progress rings and the breathing circle stay round.
- Screen padding `20` horizontal. Card padding `16`. Section gap `28`.
- Hairlines at `colorDivider` (black 7%), borders at `colorBorder` (black 8%).
- One soft shadow only: `0 4 18 rgba(0,0,0,0.03)`. No coloured glows.
## Colour
Near-black ink (`colorPrimaryDark #141414`) on warm off-white
(`colorPrimaryLight #EDEEEA`), with a single green accent (`colorPrimary
#2F6F4E`). Enforcement tiers own the rest of the palette:
| Standing | Colour |
|---|---|
| Good | green `#2F6F4E` |
| Warned | amber `#C98A04` |
| Grounded | rust `#B5442F` |
| Lockdown | oxblood `#7A1F14` |
The tier colour is used consistently — header, chip, meter, queue accent — so
the standing is legible without reading the word.
## Structure
Every screen is: black `headerBar` (back, title, action) → white sheet with a
square top edge → `sectionHeader` (label + light display title) → content.
## Rules
- Display titles are Light. Bold is for labels and metrics only.
- Numbers get a label above them, never beside them.
- Chips carry state, never actions.
- One primary button per screen; everything else is outlined or text.
- Empty states are plain. An empty overdue queue is good news, not a party.
## Home
Home opens on a deep forest header block (`colorHeaderTop` → `colorHeaderBottom`):
greeting and avatar, a Today / Weekly toggle, a seven-day streak panel ending
today (a leaf on every kept day, kept = 80%+), then the numbers. Today shows
minutes held against planned, a ring with + that opens the "Add to today"
sheet, the plan as thumbnails, the report-card letter as the Score, and one
bar per commitment class. Weekly swaps in the week's average, a bar per day
and the class completion rates. Below the block, on the light ambient
surface: the rest of the day. Bars on the dark block use the `colorBar*` tokens.
## Groups
`see/group/`: people keeping each other honest. A group has members, shared
goals and a chat.
- **Shared goals** are split into **objectives** with a number and a unit
(200 km, 40 runs, 30,000 words). Every member logs toward them; the card
shows the group total, your share and a night **Log** button. Like
personal goals, they carry no debt.
- **Leaderboard** ranks members by kept rate over the last 7 days, with
streak, last check-in (red "quiet" after 24h) and a nudge button.
- **Chat** keeps the work and the talk together: plain messages are square
bubbles (yours in night, others white with the author's colour), while
check-ins (green bar) and nudges (amber bar) are cards in the thread.
The open chat polls every 4 seconds.
- Members are drawn by `memberAvatar` / `avatarStack`
(`designs/MemberAvatar.dart`): square painted portraits with the initial.
- Groups are reached from the nav (Groups tab), the Home "Your groups" rail
(tap opens the chat) and the add sheet.