···141141Apply via `ThemeMode` on `MaterialApp`. Use `HydratedBloc` or a `SettingsCubit`
142142that reads/writes the preference.
143143144144-### 2. Custom Themes — Oxocarbon
144144+### 2. Custom Themes
145145+146146+Ship built-in theme palettes. Each theme provides a dark and light variant.
147147+Persist the user's theme choice in the Drift `settings` table. Expose each
148148+via factory constructors (e.g. `CatppuccinTheme.dark()`).
145149146146-Ship two built-in themes derived from the Oxocarbon palette (IBM Carbon
147147-inspired):
150150+#### Oxocarbon (IBM Carbon inspired)
148151149152**Dark**:
150153···190193191194Map these tokens to a `ThemeData` / `ColorScheme` and expose a
192195`OxocarbonTheme.dark()` / `OxocarbonTheme.light()` factory.
196196+197197+#### Catppuccin
198198+199199+A community-driven pastel theme. Use **Mocha** (dark) and **Latte** (light).
200200+201201+**Mocha (Dark)**:
202202+203203+| Token | Hex | Role |
204204+| --------- | --------- | --------------------------- |
205205+| base | `#1e1e2e` | Background |
206206+| mantle | `#181825` | Surface / card |
207207+| surface0 | `#313244` | Selection / divider |
208208+| surface1 | `#45475a` | Muted text |
209209+| subtext0 | `#a6adc8` | Secondary text |
210210+| text | `#cdd6f4` | Primary text |
211211+| lavender | `#b4befe` | Primary accent |
212212+| blue | `#89b4fa` | Blue accent |
213213+| sapphire | `#74c7ec` | Cyan highlight |
214214+| green | `#a6e3a1` | Green / success |
215215+| red | `#f38ba8` | Red / error |
216216+| peach | `#fab387` | Orange / warning |
217217+| mauve | `#cba6f7` | Purple accent |
218218+| pink | `#f5c2e7` | Pink accent |
219219+| rosewater | `#f5e0dc` | Warm highlight |
220220+221221+**Latte (Light)**:
222222+223223+| Token | Hex | Role |
224224+| --------- | --------- | --------------------------- |
225225+| base | `#eff1f5` | Background |
226226+| mantle | `#e6e9ef` | Surface / card |
227227+| surface0 | `#ccd0da` | Selection / divider |
228228+| surface1 | `#bcc0cc` | Muted text |
229229+| subtext0 | `#6c6f85` | Secondary text |
230230+| text | `#4c4f69` | Primary text |
231231+| lavender | `#7287fd` | Primary accent |
232232+| blue | `#1e66f5` | Blue accent |
233233+| sapphire | `#209fb5` | Cyan highlight |
234234+| green | `#40a02b` | Green / success |
235235+| red | `#d20f39` | Red / error |
236236+| peach | `#fe640b` | Orange / warning |
237237+| mauve | `#8839ef` | Purple accent |
238238+| pink | `#ea76cb` | Pink accent |
239239+| rosewater | `#dc8a78` | Warm highlight |
240240+241241+Map to `CatppuccinTheme.dark()` / `CatppuccinTheme.light()`.
242242+243243+#### Nord
244244+245245+An arctic, north-bluish palette inspired by the polar night and aurora
246246+borealis.
247247+248248+**Polar Night (Dark)**:
249249+250250+| Token | Hex | Role |
251251+| ------- | --------- | --------------------------- |
252252+| nord0 | `#2e3440` | Background |
253253+| nord1 | `#3b4252` | Surface / card |
254254+| nord2 | `#434c5e` | Selection / divider |
255255+| nord3 | `#4c566a` | Muted text |
256256+| nord4 | `#d8dee9` | Secondary text |
257257+| nord5 | `#e5e9f0` | Primary text |
258258+| nord6 | `#eceff4` | Bright text |
259259+| nord7 | `#8fbcbb` | Teal accent |
260260+| nord8 | `#88c0d0` | Cyan / primary accent |
261261+| nord9 | `#81a1c1` | Blue accent |
262262+| nord10 | `#5e81ac` | Deep blue |
263263+| nord11 | `#bf616a` | Red / error |
264264+| nord12 | `#d08770` | Orange / warning |
265265+| nord13 | `#ebcb8b` | Yellow |
266266+| nord14 | `#a3be8c` | Green / success |
267267+| nord15 | `#b48ead` | Purple accent |
268268+269269+**Snow Storm (Light)**:
270270+271271+| Token | Hex | Role |
272272+| ------- | --------- | --------------------------- |
273273+| nord0 | `#eceff4` | Background |
274274+| nord1 | `#e5e9f0` | Surface / card |
275275+| nord2 | `#d8dee9` | Selection / divider |
276276+| nord3 | `#4c566a` | Primary text |
277277+| nord4 | `#434c5e` | Secondary text |
278278+| nord5 | `#3b4252` | Subheading text |
279279+| nord6 | `#2e3440` | Bright / heading text |
280280+| nord7 | `#8fbcbb` | Teal accent |
281281+| nord8 | `#88c0d0` | Cyan / primary accent |
282282+| nord9 | `#81a1c1` | Blue accent |
283283+| nord10 | `#5e81ac` | Deep blue |
284284+| nord11 | `#bf616a` | Red / error |
285285+| nord12 | `#d08770` | Orange / warning |
286286+| nord13 | `#ebcb8b` | Yellow |
287287+| nord14 | `#a3be8c` | Green / success |
288288+| nord15 | `#b48ead` | Purple accent |
289289+290290+Map to `NordTheme.dark()` / `NordTheme.light()`.
291291+292292+#### Rosé Pine
293293+294294+An all-natural pine theme with muted, elegant tones.
295295+296296+**Main (Dark)**:
297297+298298+| Token | Hex | Role |
299299+| -------------- | --------- | --------------------------- |
300300+| base | `#191724` | Background |
301301+| surface | `#1f1d2e` | Surface / card |
302302+| overlay | `#26233a` | Selection / divider |
303303+| muted | `#6e6a86` | Muted text |
304304+| subtle | `#908caa` | Secondary text |
305305+| text | `#e0def4` | Primary text |
306306+| love | `#eb6f92` | Red / error |
307307+| gold | `#f6c177` | Yellow / warning |
308308+| rose | `#ebbcba` | Rose accent (primary) |
309309+| pine | `#31748f` | Teal / deep accent |
310310+| foam | `#9ccfd8` | Cyan highlight |
311311+| iris | `#c4a7e7` | Purple accent |
312312+313313+**Dawn (Light)**:
314314+315315+| Token | Hex | Role |
316316+| -------------- | --------- | --------------------------- |
317317+| base | `#faf4ed` | Background |
318318+| surface | `#fffaf3` | Surface / card |
319319+| overlay | `#f2e9e1` | Selection / divider |
320320+| muted | `#9893a5` | Muted text |
321321+| subtle | `#797593` | Secondary text |
322322+| text | `#575279` | Primary text |
323323+| love | `#b4637a` | Red / error |
324324+| gold | `#ea9d34` | Yellow / warning |
325325+| rose | `#d7827e` | Rose accent (primary) |
326326+| pine | `#286983` | Teal / deep accent |
327327+| foam | `#56949f` | Cyan highlight |
328328+| iris | `#907aa9` | Purple accent |
329329+330330+Map to `RosePineTheme.dark()` / `RosePineTheme.light()`.
193331194332## Development
195333
+7-1
docs/tasks/phase-1.md
···3030- [ ] `SettingsCubit` backed by Drift — theme mode preference (system / light / dark)
3131- [ ] Oxocarbon Dark `ThemeData` / `ColorScheme`
3232- [ ] Oxocarbon Light `ThemeData` / `ColorScheme`
3333-- [ ] Theme picker in settings screen
3333+- [ ] Catppuccin Mocha (Dark) `ThemeData` / `ColorScheme`
3434+- [ ] Catppuccin Latte (Light) `ThemeData` / `ColorScheme`
3535+- [ ] Nord Polar Night (Dark) `ThemeData` / `ColorScheme`
3636+- [ ] Nord Snow Storm (Light) `ThemeData` / `ColorScheme`
3737+- [ ] Rosé Pine Main (Dark) `ThemeData` / `ColorScheme`
3838+- [ ] Rosé Pine Dawn (Light) `ThemeData` / `ColorScheme`
3939+- [ ] Theme picker in settings screen (all 4 palettes × 2 variants + system)
3440- [ ] Respect system theme when set to "system"
35413642## M4 — Dev Scripts
+31
justfile
···11+# Format all Dart files
22+format:
33+ dart format lib test
44+55+alias fmt := format
66+77+# Run static analysis
88+lint:
99+ flutter analyze
1010+1111+# Test with failures only to focus on failures and hanging tests
1212+test-quiet *paths='':
1313+ flutter test {{ paths }} --reporter=failures-only --fail-fast --timeout=120s
1414+1515+# Run all tests
1616+test *paths='':
1717+ flutter test {{ paths }} --fail-fast --timeout=120s
1818+1919+generate:
2020+ dart run build_runner build --delete-conflicting-outputs
2121+2222+# Run code gen
2323+gen: generate format
2424+2525+# Run format, lint, and test
2626+check: format lint test
2727+2828+find-comments:
2929+ rg -n --pcre2 '^\s*//(?![!/])' -g '*.dart' -g '!*.g.dart' -g '!*.freezed.dart'
3030+3131+alias cmt := find-comments