Skip to main content

max / goingson

Mobile UX improvements, monthly review, maintainability splits Phase 2 Calendar Views: Day/Week/Month pills under Time tab. Heat-map calendar with day tap summary sheet, monthly goals (form modal), reflection auto-save, project pulse, completion streaks, pattern detection. Migration 034, 5 Tauri commands, 5 core unit tests. Maintainability splits: task commands, sync service, day planning, updater, and navigation all split into focused submodules. Mobile touch: auto-grow textareas, pull-to-refresh on reviews, swipe nav between Day/Week/Month, nav dial sub-view expansion via long-press. Fix navigateToDay bug (setDate → state.set).
Co-Authored-By
Claude Opus 4.6 <noreply@anthropic.com>
Author: Max J. <87768334+MaxJMath@users.noreply.github.com> · 2026-04-07 21:10 UTC
Commit: 7fd322177aeabaa9bcc5f9ce01af0b899c168c5b
Parent: 4e918b4
107 files changed, +11449 insertions, -4064 deletions
M Cargo.lock +2 -25
@@ -154,8 +154,8 @@
154 154 dependencies = [
155 155 "compression-codecs",
156 156 "compression-core",
157 - "futures-io",
158 157 "pin-project-lite",
158 + "tokio",
159 159 ]
160 160
161 161 [[package]]
@@ -180,7 +180,6 @@
180 180 dependencies = [
181 181 "async-channel 2.5.0",
182 182 "async-compression",
183 - "async-std",
184 183 "base64 0.22.1",
185 184 "bytes",
186 185 "chrono",
@@ -193,6 +192,7 @@
193 192 "self_cell",
194 193 "stop-token",
195 194 "thiserror 1.0.69",
195 + "tokio",
196 196 ]
197 197
198 198 [[package]]
@@ -271,28 +271,6 @@
271 271 "windows-sys 0.61.2",
272 272 ]
273 273
274 - [[package]]
275 - name = "async-std"
276 - version = "1.13.2"
277 - source = "registry+https://github.com/rust-lang/crates.io-index"
278 - checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b"
279 - dependencies = [
280 - "async-channel 1.9.0",
281 - "async-io",
282 - "async-lock",
283 - "async-process",
284 - "crossbeam-utils",
285 - "futures-channel",
286 - "futures-core",
287 - "futures-io",
288 - "memchr",
289 - "once_cell",
290 - "pin-project-lite",
291 - "pin-utils",
292 - "slab",
293 - "wasm-bindgen-futures",
294 - ]
295 -
296 274 [[package]]
297 275 name = "async-task"
298 276 version = "4.7.1"
@@ -6337,7 +6315,6 @@
6337 6315 dependencies = [
6338 6316 "bytes",
6339 6317 "futures-core",
6340 - "futures-io",
6341 6318 "futures-sink",
6342 6319 "pin-project-lite",
6343 6320 "tokio",
M Cargo.toml +2 -2
@@ -33,9 +33,9 @@
33 33 argon2 = "0.5"
34 34
35 35 # Email integration
36 - async-imap = "0.11"
36 + async-imap = { version = "0.11", default-features = false, features = ["runtime-tokio"] }
37 37 tokio-native-tls = "0.3"
38 - tokio-util = { version = "0.7", features = ["compat"] }
38 + tokio-util = "0.7"
39 39 futures = "0.3"
40 40 mailparse = "0.16"
41 41 lettre = { version = "0.11", default-features = false, features = ["tokio1", "tokio1-native-tls", "smtp-transport", "builder"] }
@@ -48,7 +48,7 @@
48 48 │ └── plugin-runtime/ # Rhai plugin system
49 49 ├── src-tauri/ # Tauri desktop app (single-user)
50 50 └── migrations/
51 - └── sqlite/ # SQLite schema migrations (32 files)
51 + └── sqlite/ # SQLite schema migrations (33 files)
52 52 ```
53 53
54 54 ## Crate Dependencies
@@ -119,7 +119,7 @@
119 119
120 120 ## Database Layer (`crates/db-sqlite/`)
121 121
122 - SQLite persistence for the desktop app. Single-user, local storage. 32 migrations in `migrations/sqlite/`.
122 + SQLite persistence for the desktop app. Single-user, local storage. 33 migrations in `migrations/sqlite/`.
123 123
124 124 ```
125 125 src/
@@ -205,7 +205,7 @@
205 205
206 206 ## Frontend Architecture (Tauri Desktop)
207 207
208 - The desktop frontend uses vanilla JavaScript organized under the `GoingsOn` global namespace. 39 source files + 2 test files.
208 + The desktop frontend uses vanilla JavaScript organized under the `GoingsOn` global namespace. 42 source files + 2 test files.
209 209
210 210 ### Namespace Organization
211 211
@@ -151,7 +151,7 @@
151 151
152 152 ## Action Items
153 153
154 - Outstanding work tracked in `docs/apps/go/todo/todo.md`.
154 + Outstanding work tracked in `docs/todo/todo.md`.
155 155
156 156 ### Resolved (sixth audit — pre-launch skeptical lens)
157 157 15. ~~**[MUST-FIX]** Wire up `Validate::validate()` in the command layer~~ -- Done (wired into command layer)
@@ -176,7 +176,7 @@
176 176 13. ~~**[Docs]** Add `//!` docs to `smtp_client.rs`~~ -- done
177 177 14. ~~**[Frontend]** Add section markers to `styles.css`~~ -- 60 numbered sections with TOC
178 178
179 - New items filed in `docs/apps/go/todo/todo.md`:
179 + New items filed in `docs/todo/todo.md`:
180 180 - ~~Add unit tests for JMAP module (854 LOC, 0 tests)~~ -- 73 tests added
181 181 - ~~Add tests for OAuth callback server (309 LOC, 0 tests)~~ -- 59 tests added
182 182 - ~~Add tests for plugin registry hot-reload (300 LOC, 2 tests)~~ -- 32 tests added
@@ -224,150 +224,4 @@
224 224
225 225 ---
226 226
227 - ## Changes Since Last Audit
228 -
229 - **Previous audit:** 2026-03-16 (seventh audit, Run 6)
230 -
231 - ### Eleventh audit (2026-03-28, Run 12 cross-project)
232 - - **Test count:** ~734 (686 Rust + 48 JS). 0 clippy warnings. 0 failures.
233 - - **Grade:** A (maintained). v0.3.0.
234 - - **Code change:** Kanban board fix — invalid task status now silently dropped instead of crashing. Minor but correct.
235 - - **Dependency advisory:** async-std unmaintained (RUSTSEC-2025-0052, warning) — upstream via async-imap, no alternative available.
236 - - **Mandatory surprise:** None. Previous surprises (dead Validate trait, format!() SQL safety) both resolved.
237 - - **No new findings.** All previous items remain resolved.
238 -
239 - ### Tenth audit (2026-03-18, Run 9 cross-project)
240 - - **Test count:** 725 (677 Rust + 48 JS). 0 clippy warnings. 0 failures.
241 - - **Grade:** A (maintained). v0.3.0.
242 - - **Release build:** macOS DMG signed+notarized, verified with codesign + spctl.
243 - - **No new findings.** All previous items remain resolved. Validate trait wired. Sync engine safe. All cold spots closed.
244 - - **Mandatory surprise:** None. Previous surprises (dead Validate trait, format!() SQL safety) both resolved.
245 -
246 - ### Post-Run 8 fixes (2026-03-17)
247 - - **Clippy:** Fixed 8 warnings across 5 files: `approx_constant` (api.rs), `bool_assert_comparison` (api.rs ×2, registry.rs ×2), `unnecessary_get_then_check` (registry.rs ×2), `items_after_test_module` (imap_client.rs, jmap/email.rs, jmap/session.rs)
248 - - **Deps:** `time` crate bumped 0.3.46 → 0.3.47 (fixes RUSTSEC-2026-0009 stack exhaustion DoS)
249 -
250 - **Earlier audit:** 2026-03-11 (fifth audit)
251 -
252 - ### Concurrency Upgrade (2026-03-13)
253 - - **Concurrency:** A- -> A
254 - - Coordinated shutdown via CancellationToken for 4 async schedulers + AtomicBool for db_watcher threads. All background tasks now stop cleanly on app exit via RunEvent::Exit handler.
255 -
256 - ### Observability Upgrade (2026-03-13)
257 - - **Observability:** A- -> A
258 - - Added 195 `#[instrument(skip_all)]` annotations across 28 files
259 - - Coverage: all 144 Tauri commands (20 command files), 40 MCP tool implementation methods (5 impl files), 3 email_sync background functions, plus existing state/notifications instrumentation
260 - - `use tracing::instrument;` import added to each file
261 - - `cargo check --workspace` passes clean
262 -
263 - ### Adversarial Test Audit (2026-03-13)
264 -
265 - **Test count:** 648 -> 658 (+10 tests)
266 -
267 - Key changes:
268 - - **CRITICAL fix:** Weekly review timeline used `created_at` instead of `completed_at` — timeline showed task creation dates, not completion dates. Fixed in both repository query and test assertions.
269 - - **HIGH fix:** Completed/deleted tasks could be snoozed — added status check at repository level to reject snoozing non-pending/non-started tasks.
270 - - **HIGH fix:** Recurring task completion copied stale urgency from overdue parent — now recalculates urgency with fresh `calculate_urgency()` call instead of inheriting parent's inflated urgency score.
271 - - **HIGH fix:** MCP `create_task` skipped validation — added `new_task.validate()` call to enforce length limits, tag validation, and duration range checks.
272 - - **API improvement:** Search now returns `(Vec<SearchResultItem>, usize)` tuple for accurate total counts, enabling proper pagination UI.
273 -
274 - All fixes committed with test coverage. Zero regressions detected.
275 -
276 - ### Seventh audit (2026-03-16, Run 6 cross-project)
277 - - **Test count:** 658 -> 725 (+67 tests, 677 Rust + 48 JS)
278 - - **Grade:** A (maintained). No new findings above LOW.
279 - - **Rust LOC:** 44,007 (up from ~39K)
280 - - **Mandatory surprise:** ApiError system in commands/error.rs — machine-readable ErrorCode enum, 3 extension traits (OptionNotFound, OptionApiError, ResultApiError), full CoreError->ApiError conversion — Impressive
281 - - **Previous items verified:** All previous remediated items confirmed intact.
282 -
283 - ### Sixth audit (2026-03-13, pre-launch skeptical lens)
284 - - **Grade:** A -> A- -> A. Two must-fix findings found and resolved.
285 - - **Test count:** 485 -> 648 (+163 tests)
286 - - **New findings:** Validate trait never called in production (dead code), open_email_in_browser XSS, ImapClient::new() legacy constructor, email_repo expect in production.
287 - - **Mandatory surprise:** Dead Validate trait — genuine issue, now resolved.
288 - - **Previous items verified:** All 14 prior remediated items confirmed intact.
289 -
290 - **Post-audit remediation (2026-03-13):**
291 - - Grade: A- -> A. Both must-fix items resolved.
292 - - Validate trait wired into command layer (no longer dead code)
293 - - Email HTML sanitization added (CSP + script stripping)
294 - - ImapClient::new() removed, .expect() replaced with .ok_or(), LIMIT/OFFSET parameterized
295 - - All 4 cold spots resolved: JMAP (73 tests), OAuth (59 tests), plugin registry (32 tests), LLM typed errors
296 - - Test count: 485 -> 648 (+163 tests)
297 -
298 - ### What improved (fifth audit)
299 - - Test count: 435 -> 485 (+50 tests)
300 - - Sync service now has 21 unit tests (was 6) covering FK-ordered upsert/delete, trigger suppression, column whitelists, push/pull logic
301 - - Mobile port advanced: iOS simulator running, touch gestures wired, interaction wiring complete
302 - - MCP tool count: 16 -> 41 tools
303 - - Codebase grew from ~35K to 39,183 Rust LOC while maintaining quality
304 -
305 - ### What regressed
306 - - Nothing. All previous fixes remain in place. Zero clippy warnings. Zero test failures.
307 -
308 - ### New issues found (all resolved post-audit)
309 - - ~~JMAP module (854 LOC) has zero tests~~ -- 73 tests added
310 - - ~~OAuth callback server (309 LOC) has zero tests~~ -- 59 tests added
311 - - ~~Plugin registry hot-reload (300 LOC) has only 2 tests~~ -- 32 tests added
312 - - ~~LLM integration uses `Result<String, String>` instead of typed errors~~ -- typed LlmError enum added
313 - - `applying_remote` flag should be verified cleared on startup for crash recovery (cross-project finding from audiofiles audit)
314 - - Sync engine `format!()` SQL pattern is safe but lacks documentation explaining why
315 -
316 - ### Still open (2 items)
317 - - OAuth token manager tests (token refresh flows, keychain storage)
318 - - Full IMAP client integration tests (MIME parsing and folder ops -- pure function helpers tested)
319 - - ~~JS frontend has no automated tests~~ -- 48 JS tests added (AppStateManager, utils, PaginationManager, SelectionManager)
320 -
321 - ### Resolved
322 - - ~~Move `notify-debouncer-mini` to workspace deps~~ -- confirmed already in workspace deps (`Cargo.toml:68`)
323 - - ~~Add explicit timeouts to JMAP/OAuth/IMAP clients~~ -- 30s/15s request + 10s connect timeouts added
324 -
325 - ---
326 -
327 - ## Audit History
328 -
329 - ### First audit (2026-02-27)
330 - - Initial review. 234 tests. Grade: A-. Found body_preview UTF-8 issue (later confirmed safe), list_completed_between bug, stats query concern (later confirmed efficient).
331 -
332 - ### Second audit (2026-02-28)
333 - - Fixed tag search bug. Added 30 tests (contact_repo, search_repo). 289 tests. Grade: A-.
334 -
335 - ### Third audit (2026-02-28)
336 - - Theme system rewrite. Minor findings (smtp_client docs, notify-debouncer-mini). Grade: A-.
337 -
338 - ### Fourth audit (2026-03-01)
339 - - Full fresh audit. MCP tests added, list_completed_between fixed, 49 new tests. Grade: A- -> A. Found sync_service, IMAP, OAuth token manager, plugin API, CSS, sql_column() issues.
340 -
341 - ### Cleanup phase (2026-03-02)
342 - - All fourth-audit findings resolved. +97 tests (435 total). Sync service typed errors, sql_column() relocated, CSS sections, SMTP docs, plugin API tests, IMAP helper tests.
343 -
344 - ### Type safety phase (2026-03-02)
345 - - 11 entity ID newtypes. Stringly-typed fields replaced with enums. Type Safety: A- -> A.
346 -
347 - ### Fifth audit (2026-03-11)
348 - - Full fresh audit. 485 tests. Grade: A (maintained). Mobile port near-complete. New cold spots: JMAP (0 tests), OAuth callback (0 tests), plugin registry (2 tests), LLM string errors. Mandatory surprise: sync engine format!() SQL safety.
349 -
350 - ### Sixth audit (2026-03-13)
351 - - Pre-launch skeptical lens. 648 tests. Grade: A- -> A (post-remediation). Found dead Validate trait and email HTML XSS (both must-fix, both resolved same day). All 4 cold spots from fifth audit resolved. +163 tests.
352 -
353 - ---
354 -
355 - ## Documentation Review
356 -
357 - **Last reviewed:** 2026-03-04 (first doc audit)
358 -
359 - ### Overall Doc Grade: B+
360 -
361 - Good coverage of architecture and style guide. CLAUDE.md GO section is thorough and accurate. No public-facing docs to worry about. Main gaps: description.md is a placeholder, and MCP_test.md is test scaffolding that could be removed.
362 -
363 - ### Document Heatmap
364 -
365 - | Document | Status | Last Verified | Notes |
366 - |----------|:------:|:-------------:|-------|
367 - | CLAUDE.md (GO section) | Current | 2026-03-04 | Accurate to codebase |
368 - | docs/ARCHITECTURE.md | Current | 2026-03-04 | Accurate to codebase |
369 - | docs/STYLEGUIDE.md | Current | 2026-03-04 | Skeubrute design system |
370 - | docs/description.md | Placeholder | 2026-03-04 | Intentional placeholder |
371 - | docs/competition.md | Current | 2026-03-04 | Competitive analysis |
372 - | docs/human_testing.md | Current | 2026-03-04 | Manual QA checklist |
373 - | docs/MCP_test.md | Low priority | 2026-03-04 | Test artifact, may not need to persist |
227 + See [audit_history.md](./audit_history.md) for full chronological audit log.
M docs/styleguide.md +124 -140
@@ -1,15 +1,15 @@
1 1 # GoingsOn Style Guide
2 2
3 - ## Design Language: Skeubrute
3 + ## Design Language: Neobrute
4 4
5 - GoingsOn uses **Skeubrute**, a design system that combines **strong neobrutalism** with **abstract skeuomorphism**.
5 + GoingsOn uses **Neobrute**, a clean neobrutalism design system inspired by [neobrutalism.dev](https://www.neobrutalism.dev/).
6 6
7 7 ### Core Philosophy
8 8
9 - - **Neobrutalism**: Bold 3px borders, hard-edged offset shadows (4px), high contrast
10 - - **Skeuomorphism**: Paper textures, embossed text effects, tactile button states, realistic depth
11 -
12 - The result is an interface that feels like physical paper and buttons while maintaining a bold, modern aesthetic.
9 + - **Bold and high-contrast**: Black borders, black text, crisp offset shadows with zero blur
10 + - **Blue-dominant palette**: Primary actions use bright blue, yellow reserved for warnings/status
11 + - **Cards have presence**: 4px offset shadows on all cards and containers, hover lift on clickable cards
12 + - **Sans-serif headings**: System sans-serif at weight 700 for all headings
13 13
14 14 ---
15 15
@@ -19,28 +19,28 @@
19 19
20 20 | Variable | Hex | Usage |
21 21 |----------|-----|-------|
22 - | `--bg-primary` | `#E8F4F8` | Page background |
23 - | `--bg-secondary` | `#D4EBF2` | Secondary surfaces, hover states |
24 - | `--bg-tertiary` | `#C0E2EC` | Tertiary surfaces |
22 + | `--bg-primary` | `#E0E4FA` | Page background (lavender-blue) |
23 + | `--bg-secondary` | `#CDD3F0` | Secondary surfaces, hover states |
24 + | `--bg-tertiary` | `#BAC2E6` | Tertiary surfaces |
25 25 | `--bg-card` | `#FFFFFF` | Cards, modals, inputs |
26 26
27 27 ### Text Colors
28 28
29 29 | Variable | Hex | Usage |
30 30 |----------|-----|-------|
31 - | `--text-primary` | `#1B365D` | Headings, primary text |
32 - | `--text-secondary` | `#3D5A80` | Body text, descriptions |
33 - | `--text-muted` | `#6B8CAE` | Captions, hints, disabled |
31 + | `--text-primary` | `#000000` | Headings, primary text |
32 + | `--text-secondary` | `#2D2D2D` | Body text, descriptions |
33 + | `--text-muted` | `#6B6B6B` | Captions, hints, disabled |
34 34
35 35 ### Accent Colors
36 36
37 37 | Variable | Hex | Usage |
38 38 |----------|-----|-------|
39 - | `--accent-yellow` | `#F7D154` | Primary actions, active states, focus |
39 + | `--accent-blue` | `#6196FF` | **Primary actions**, active states, focus, buttons |
40 + | `--accent-yellow` | `#F7D154` | Warnings, snooze, medium priority, "on hold" status |
40 41 | `--accent-green` | `#5CB85C` | Success, active status, tasks |
41 - | `--accent-blue` | `#1B365D` | Borders, info, emails |
42 42 | `--accent-purple` | `#7B68EE` | Recurrence, essays, special |
43 - | `--accent-red` | `#DC3545` | Errors, high priority, warnings |
43 + | `--accent-red` | `#DC3545` | Errors, high priority, danger |
44 44 | `--accent-cyan` | `#17A2B8` | Info, side projects, completed |
45 45
46 46 ---
@@ -52,7 +52,7 @@
52 52 The GoingsOn wordmark uses **Reglo Bold** with the following specifications:
53 53
54 54 - **Font**: Reglo Bold
55 - - **Color**: `--text-primary` (#1B365D) on light backgrounds
55 + - **Color**: `--text-primary` (#000000) on light backgrounds
56 56 - **Alternate**: White on dark backgrounds
57 57 - **Letter-spacing**: -0.02em (slightly tightened)
58 58
@@ -61,18 +61,18 @@
61 61 The compact logo displays **"GO"** in Reglo Bold, centered within a neobrutalist container:
62 62
63 63 ```
64 - ┌─────────────────┐
65 - │ │
66 - │ GO │
67 - │ │
68 - └─────────────────┘
64 + +-----------------+
65 + | |
66 + | GO |
67 + | |
68 + +-----------------+
69 69 ```
70 70
71 71 **Specifications:**
72 - - **Background**: `--accent-yellow` (#F7D154)
73 - - **Text**: `--text-primary` (#1B365D)
74 - - **Border**: 3px solid `--border-color` (#1B365D)
75 - - **Border Radius**: `--radius-sm` (6px)
72 + - **Background**: `--accent-blue` (#6196FF)
73 + - **Text**: `--text-on-accent` (#FFFFFF)
74 + - **Border**: 2px solid `--border-color` (#000000)
75 + - **Border Radius**: `--radius-sm` (5px)
76 76 - **Shadow**: 2px 2px 0 `--border-color` (neobrutalist offset)
77 77
78 78 **Files:**
@@ -121,16 +121,16 @@
121 121 ### Semantic Aliases
122 122
123 123 - `--font-display`: Uses `Reglo` for logo and hero headings
124 - - `--font-heading`: Uses `--font-serif` for titles and headings
124 + - `--font-heading`: Uses `--font-sans` for titles and headings
125 125 - `--font-body`: Uses `--font-sans` for body text
126 126
127 127 ### Type Scale
128 128
129 129 | Element | Size | Weight | Font |
130 130 |---------|------|--------|------|
131 - | Page Title | 1.75rem | 700 | Serif |
132 - | Card Title | 1.1rem | 700 | Serif |
133 - | Modal Title | 1.25rem | 700 | Serif |
131 + | Page Title | 1.75rem | 700 | Sans |
132 + | Card Title | 1.1rem | 700 | Sans |
133 + | Modal Title | 1.25rem | 700 | Sans |
134 134 | Body | 1rem | 400 | Sans |
135 135 | Small | 0.875rem | 400 | Sans |
136 136 | Caption | 0.75rem | 600 | Sans |
@@ -158,7 +158,7 @@
158 158
159 159 | Element | Width |
160 160 |---------|-------|
161 - | Cards, Buttons, Modals | 3px (`--border-width`) |
161 + | Cards, Buttons, Modals | 2px (`--border-width`) |
162 162 | Inputs, Badges, Tags | 2px |
163 163 | Dividers | 2px |
164 164
@@ -166,12 +166,16 @@
166 166
167 167 | Variable | Value | Usage |
168 168 |----------|-------|-------|
169 - | `--radius-sm` | 6px | Buttons, badges, inputs |
170 - | `--radius-md` | 12px | Cards, filter bars |
171 - | `--radius-lg` | 16px | Modals |
169 + | `--radius-xs` | 3px | Scrollbars, tiny elements |
170 + | `--radius-sm` | 5px | Buttons, badges, inputs |
171 + | `--radius-md` | 5px | Cards, filter bars (uniform with buttons) |
172 + | `--radius-lg` | 10px | Modals |
173 + | `--radius-xl` | 20px | Pills |
172 174
173 175 ### Shadow System
174 176
177 + All shadows use **zero blur** for crisp neobrutalist edges:
178 +
175 179 ```css
176 180 /* Shadow utilities */
177 181 .shadow-sm { box-shadow: 2px 2px 0 var(--border-color); }
@@ -183,65 +187,23 @@
183 187
184 188 ### Offset Shadow Values
185 189
186 - | Element | Shadow Offset |
187 - |---------|---------------|
188 - | Cards | 4px (with stacked paper effect) |
189 - | Buttons | 4px |
190 - | Modals | 8px |
191 - | Small buttons | 2-3px |
192 - | Inputs | Inset deboss |
193 -
194 - ---
195 -
196 - ## Skeuomorphic Effects
197 -
198 - ### Paper Texture
199 -
200 - Cards have a subtle SVG noise pattern for a paper-like feel:
201 -
202 - ```css
203 - .card {
204 - background-image: var(--texture-paper);
205 - }
206 - ```
207 -
208 - ### Embossed Text
209 -
210 - Headings use subtle text shadows to create a pressed-in effect:
211 -
212 - ```css
213 - .card-title, .modal-title, .page-title {
214 - text-shadow: var(--emboss-light), var(--emboss-dark);
215 - }
216 - ```
217 -
218 - Where:
219 - - `--emboss-light`: `1px 1px 0 rgba(255, 255, 255, 0.5)`
220 - - `--emboss-dark`: `-1px -1px 0 rgba(0, 0, 0, 0.08)`
221 -
222 - ### Debossed Inputs
223 -
224 - Form inputs have an inset shadow for a carved-in feel:
225 -
226 - ```css
227 - .form-input {
228 - box-shadow: var(--deboss);
229 - }
230 - /* --deboss: inset 1px 1px 2px rgba(0,0,0,0.08), inset -1px -1px 0 rgba(255,255,255,0.5) */
231 - ```
232 -
233 - ### Tactile Buttons
234 -
235 - Buttons have a gradient overlay for a 3D, pressable feel:
236 -
237 - ```css
238 - .btn {
239 - background-image: var(--btn-gradient);
240 - }
241 - .btn:active {
242 - background-image: var(--btn-gradient-pressed);
243 - }
244 - ```
190 + | Element | Shadow Offset | Hover Lift |
191 + |---------|---------------|------------|
192 + | Cards (project) | 4px | Yes (-2px translate) |
193 + | Dashboard items | 4px | Yes |
194 + | Kanban cards | 4px | Yes |
195 + | Saved views | 4px | Yes |
196 + | Tables (task, event, data) | 4px | No |
197 + | Email list | 4px | No |
198 + | Filter bar | 4px | No |
199 + | Stat cards | 4px | No |
200 + | Review sections/cards | 4px | No |
201 + | Milestone cards | 4px | No |
202 + | Buttons (default) | none | No |
203 + | Buttons (primary/danger) | 4px | Yes |
204 + | Modals | 8px | No |
205 + | Dropdowns/Context menus | 3-6px | No |
206 + | Inputs | none | No |
245 207
246 208 ---
247 209
@@ -250,7 +212,7 @@
250 212 ### Buttons
251 213
252 214 ```html
253 - <!-- Primary button (yellow background) -->
215 + <!-- Primary button (blue background, white text) -->
254 216 <button class="btn btn-primary">Action</button>
255 217
256 218 <!-- Secondary button (light background) -->
@@ -260,10 +222,15 @@
260 222 <button class="btn btn-sm">Small</button>
261 223 ```
262 224
263 - **States:**
225 + **States (default `.btn`):**
226 + - **Default**: Flat (border only, no shadow)
227 + - **Hover**: Background changes to `--bg-secondary`
228 + - **Active**: Background changes to `--bg-tertiary`
229 +
230 + **States (`.btn-primary`, `.btn-danger`):**
264 231 - **Default**: 4px offset shadow
265 232 - **Hover**: Lifts up (-2px, -2px), shadow increases
266 - - **Active/Pressed**: Pushes down (2px, 2px), shadow disappears
233 + - **Active**: Pushes down (1px, 1px), shadow shrinks
267 234
268 235 ### Cards
269 236
@@ -281,9 +248,9 @@
281 248 ```
282 249
283 250 Cards have:
284 - - Paper texture background
285 - - Stacked paper shadow effect (two-layer shadow)
286 - - Lift on hover
251 + - White background with 4px offset shadow
252 + - Hover: lifts up (-2px), shadow grows, bg shifts to `--bg-secondary`
253 + - Touch devices: no hover transform
287 254
288 255 ### Badges & Tags
289 256
@@ -328,7 +295,7 @@
328 295 </div>
329 296 ```
330 297
331 - **Focus state**: Yellow ring (3px) around the input
298 + **Focus state**: Blue ring (2px) around the input
332 299
333 300 ### Modals
334 301
@@ -348,7 +315,7 @@
348 315
349 316 Modals have:
350 317 - 8px offset shadow
351 - - 16px border radius
318 + - 10px border radius
352 319 - Semi-transparent overlay
353 320
354 321 ### Tables
@@ -369,9 +336,10 @@
369 336 ```
370 337
371 338 Features:
339 + - 4px offset shadow on container
372 340 - Uppercase, letter-spaced headers
373 341 - Hover state on rows
374 - - Selected state (yellow background)
342 + - Selected state (blue tint background)
375 343
376 344 ### Empty & Error States
377 345
@@ -395,23 +363,26 @@
395 363 | Type | Duration | Easing |
396 364 |------|----------|--------|
397 365 | Hover effects | 0.1s - 0.15s | ease |
398 - | Transform (lift/press) | 0.1s | ease |
366 + | Transform (lift/press) | 0.15s | ease |
399 367 | Focus rings | instant | - |
400 368
401 369 ### Hover Lift Effect
402 370
371 + Reserved for clickable cards (`.card`, `.dashboard-item`, `.kanban-card`, `.saved-view-item`), `.btn-primary`, `.btn-danger`, modals, dropdowns, mobile nav:
372 +
403 373 ```css
404 - .hover-lift {
405 - transition: transform 0.15s ease, box-shadow 0.15s ease;
406 - }
407 - .hover-lift:hover {
374 + .card:hover {
408 375 transform: translate(-2px, -2px);
376 + box-shadow: 6px 6px 0 var(--border-color);
409 377 }
410 - .hover-lift:active {
411 - transform: translate(2px, 2px);
378 + .btn-primary:active {
379 + transform: translate(1px, 1px);
380 + box-shadow: 1px 1px 0 var(--border-color);
412 381 }
413 382 ```
414 383
384 + Static containers (tables, filter bars, stat cards, review sections) have shadow but no hover lift.
385 +
415 386 ---
416 387
417 388 ## Accessibility
@@ -423,7 +394,7 @@
423 394 ```css
424 395 .btn:focus-visible,
425 396 .form-input:focus-visible {
426 - outline: 3px solid var(--accent-yellow);
397 + outline: 3px solid var(--accent-blue);
427 398 outline-offset: 2px;
428 399 }
429 400 ```
@@ -439,9 +410,9 @@
439 410 ### Color Contrast
440 411
441 412 All text colors meet WCAG AA standards against their backgrounds:
442 - - Primary text on card: 8.5:1
443 - - Secondary text on card: 5.2:1
444 - - Muted text on card: 3.8:1
413 + - Primary text (#000000) on card (#FFFFFF): 21:1
414 + - Secondary text (#2D2D2D) on card (#FFFFFF): 14.7:1
415 + - Muted text (#6B6B6B) on card (#FFFFFF): 5.7:1
445 416
446 417 ---
447 418
@@ -449,24 +420,24 @@
449 420
450 421 ```
451 422 src-tauri/frontend/
452 - ├── css/
453 - │ └── styles.css # All styles (design system + components)
454 - ├── fonts/
455 - │ └── Reglo-Bold.woff2 # Display font
456 - ├── js/
457 - │ ├── goingson.js # Namespace root (window.GoingsOn)
458 - │ ├── api.js # Tauri IPC abstraction
459 - │ ├── state.js # Centralized state + pub/sub
460 - │ ├── utils.js # HTML escaping, validation, debounce
461 - │ ├── components.js # Modal, toast, form modal, confirm dialog
462 - │ ├── navigation.js # View switching, sidebar
463 - │ ├── tasks.js # Task list, CRUD, rendering
464 - │ ├── projects.js # Project list, detail view
465 - │ ├── events.js # Event list, CRUD
466 - │ ├── emails.js # Email list, threading
467 - │ ├── settings.js # Settings, LLM config, export
468 - │ └── app.js # App initialization, menu listeners
469 - └── index.html # Entry point (no inline styles)
423 + +-- css/
424 + | +-- styles.css # All styles (design system + components)
425 + +-- fonts/
426 + | +-- Reglo-Bold.woff2 # Display font
427 + +-- js/
428 + | +-- goingson.js # Namespace root (window.GoingsOn)
429 + | +-- api.js # Tauri IPC abstraction
430 + | +-- state.js # Centralized state + pub/sub
431 + | +-- utils.js # HTML escaping, validation, debounce
432 + | +-- components.js # Modal, toast, form modal, confirm dialog
433 + | +-- navigation.js # View switching, sidebar
434 + | +-- tasks.js # Task list, CRUD, rendering
435 + | +-- projects.js # Project list, detail view
436 + | +-- events.js # Event list, CRUD
437 + | +-- emails.js # Email list, threading
438 + | +-- settings.js # Settings, LLM config, export
439 + | +-- app.js # App initialization, menu listeners
440 + +-- index.html # Entry point (no inline styles)
470 441 ```
471 442
472 443 See `ARCHITECTURE.md` (in this folder) for the full JS file listing and namespace organization.
@@ -480,9 +451,9 @@
480 451 ### Pattern: `.block-element`
481 452
482 453 ```
483 - .component → Block (card, modal, btn, form)
484 - .component-part → Element within block (card-header, modal-title)
485 - .component-modifier → Variant (btn-primary, btn-sm)
454 + .component -> Block (card, modal, btn, form)
455 + .component-part -> Element within block (card-header, modal-title)
456 + .component-modifier -> Variant (btn-primary, btn-sm)
486 457 ```
487 458
488 459 ### Examples
@@ -556,18 +527,31 @@
556 527
557 528 ### Element Standards
558 529
559 - | Element | Border | Radius | Shadow |
560 - |---------|--------|--------|--------|
561 - | Cards | 3px | 12px | 4px offset + stacked |
562 - | Buttons | 3px | 8px | 4px offset |
563 - | Inputs | 2px | 8px | inset deboss |
564 - | Badges/Tags | 2px | 6px | none |
565 - | Modals | 3px | 16px | 8px offset |
530 + | Element | Border | Radius | Shadow | Hover Lift |
531 + |---------|--------|--------|--------|------------|
532 + | Cards | 2px | 5px | 4px offset | Yes |
533 + | Dashboard items | 2px | - | 4px offset | Yes |
534 + | Kanban cards | 2px | - | 4px offset | Yes |
535 + | Saved views | 2px | 5px | 4px offset | Yes |
536 + | Tables (task, event) | 2px | 10px | 4px offset | No |
537 + | Email list | 2px | 5px | 4px offset | No |
538 + | Filter bar | 2px | 5px | 4px offset | No |
539 + | Stat cards | 2px | - | 4px offset | No |
540 + | Review sections/cards | 2px | 5px | 4px offset | No |
541 + | Milestone cards | 2px | 5px | 4px offset | No |
542 + | Buttons (default) | 2px | 5px | none | No |
543 + | Buttons (primary/danger) | 2px | 5px | 4px offset | Yes |
544 + | Inputs | 2px | 5px | none | No |
545 + | Badges/Tags | 2px | 5px | none | No |
546 + | Modals | 2px | 10px | 8px offset | No |
547 + | Dropdowns | 2px | 5px | 3px offset | No |
548 + | Context menus | 2px | 5px | 6px offset | No |
566 549
567 550 ### Color Usage
568 551
569 552 | Context | Background | Border |
570 553 |---------|------------|--------|
554 + | Primary action | blue | black |
571 555 | Success | green 20% mix | green |
572 556 | Warning | yellow 20% mix | yellow |
573 557 | Error | red 20% mix | red |
M docs/todo/todo.md +152 -49
A CHANGELOG.md +30