Skip to main content

max / goingson

Add task status tokens with at-a-glance commit indicator Introduce a general status-token abstraction on tasks: a typed marker (kind + reference) whose colour-mapped state drives an at-a-glance dot on the task row. The first kind is `commit` — a repo-qualified `<repo>@<shortsha>` reference that is Pending (amber) until pushed and Complete (green) once pushed; a task with no tokens stays neutral. At most one token per task is primary (the one that resolved it). New `task_status_tokens` table (deterministic UUID v5 ids in (task_id, kind, reference) for idempotent, sync-safe upserts), wired through core model, repository, sync changelog/whitelist/order, and backup/restore. go-mcp `complete_task`/`update_task` commit args record commit-kind tokens; a `status_tokens` projection is exposed. Frontend: a colour dot on rows that have tokens, and a commits manager modal (add a ref, toggle pushed, toggle primary, remove) reachable from the dot or a Commits button in Manage Subtasks. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-15 00:16 UTC
Commit: 67690474cf7fe8f8e192177f3ddb2015cbe45db4
Parent: 98c2e47
29 files changed, +1079 insertions, -21 deletions
M Cargo.lock +2
@@ -2755,6 +2755,7 @@ dependencies = [
2755 2755 "serde_json",
2756 2756 "thiserror 2.0.18",
2757 2757 "tokio",
2758 + "tokio-stream",
2758 2759 "tower",
2759 2760 "tower-http",
2760 2761 "tracing",
@@ -6371,6 +6372,7 @@ dependencies = [
6371 6372 "futures-core",
6372 6373 "pin-project-lite",
6373 6374 "tokio",
6375 + "tokio-util",
6374 6376 ]
6375 6377
6376 6378 [[package]]
@@ -25,6 +25,8 @@ pub struct RestoreResult {
25 25 pub emails_restored: usize,
26 26 /// Number of subtasks restored.
27 27 pub subtasks_restored: usize,
28 + /// Number of status tokens restored.
29 + pub status_tokens_restored: usize,
28 30 /// Number of annotations restored.
29 31 pub annotations_restored: usize,
30 32 /// Number of contacts restored.
@@ -129,6 +129,7 @@ define_uuid_id!(
129 129 AnnotationId,
130 130 AttachmentId,
131 131 SubtaskId,
132 + StatusTokenId,
132 133 TimeSessionId,
133 134 ContactEmailId,
134 135 ContactPhoneId,
@@ -63,7 +63,7 @@ pub use id_types::{
63 63 AnnotationId, AttachmentId, ContactEmailId, ContactId, ContactPhoneId, CustomFieldId,
64 64 DailyNoteId, EmailAccountId, EmailId, EventId, MilestoneId, MonthlyGoalId,
65 65 MonthlyReflectionId, ProjectId, SavedViewId, SocialHandleId,
66 - SubtaskId, SyncAccountId, TaskId, TimeSessionId, UserId, WeeklyReviewId,
66 + StatusTokenId, SubtaskId, SyncAccountId, TaskId, TimeSessionId, UserId, WeeklyReviewId,
67 67 };
68 68 pub use models::{
69 69 Annotation, Attachment, BackupSettings, BlockType, CssClass, DailyNote, DbValue, Email, EmailAccount,
@@ -74,7 +74,8 @@ pub use models::{
74 74 Project, ParseableEnum, ProjectStatus, ProjectType, Recurrence, RecurrenceRule, MonthlySpec,
75 75 SavedView, SortDirection,
76 76 SyncAccount,
77 - PositiveMinutes, SortField, Subtask, Task, TaskFilterQuery, TaskSortColumn, TaskStatus, TimeSession,
77 + PositiveMinutes, SortField, StatusToken, Subtask, Task, TaskFilterQuery, TaskSortColumn, TaskStatus, TimeSession,
78 + TokenState, TOKEN_KIND_COMMIT,
78 79 TimeSummaryPanel, TimeSummaryProject, TimeTrackingSummary, roll_up_time_summary,
79 80 UpdateEvent, UpdateProject, UpdateTask, User,
80 81 ViewFilters, ViewType, WeeklyReview,
@@ -13,7 +13,7 @@ use strum_macros::EnumString;
13 13 use crate::constants::{
14 14 DAYS_THRESHOLD_SHORT_FORMAT, URGENCY_HIGH_THRESHOLD, URGENCY_MEDIUM_THRESHOLD,
15 15 };
16 - use crate::id_types::{TaskId, ProjectId, MilestoneId, ContactId, EmailId, AnnotationId, SubtaskId};
16 + use crate::id_types::{TaskId, ProjectId, MilestoneId, ContactId, EmailId, AnnotationId, SubtaskId, StatusTokenId};
17 17 use super::time_session::TimeSession;
18 18 use super::shared::{CssClass, DbValue, ParseableEnum, Recurrence, RecurrenceRule, SortDirection};
19 19
@@ -174,6 +174,94 @@ pub struct Subtask {
174 174 pub position: i32,
175 175 }
176 176
177 + /// The kind identifier for a `commit` status token: a repo-qualified
178 + /// `<repo>@<shortsha>` reference that is `Pending` until pushed, `Complete` once
179 + /// pushed. The first — and today only — [`StatusToken`] kind.
180 + pub const TOKEN_KIND_COMMIT: &str = "commit";
181 +
182 + /// Fixed namespace UUID for GoingsOn status-token ids (generated once, never
183 + /// changes). See [`StatusToken::deterministic_id`].
184 + const GOINGSON_STATUS_TOKEN_NS: uuid::Uuid = uuid::Uuid::from_bytes([
185 + 0x2f, 0x9d, 0x4a, 0x61, 0xb3, 0x0c, 0x5e, 0x72,
186 + 0x8a, 0x1f, 0x6c, 0x4d, 0x0b, 0xe5, 0x93, 0x27,
187 + ]);
188 +
189 + /// The colour-mapped state of a [`StatusToken`]. A task with no tokens reads as
190 + /// neutral; a token is `Pending` (amber) or `Complete` (green). Each token kind
191 + /// interprets these in its own domain — for `commit`, `Pending` = recorded but not
192 + /// pushed, `Complete` = pushed.
193 + #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default, EnumString)]
194 + pub enum TokenState {
195 + /// Work-in-progress (amber). E.g. a commit that has not been pushed.
196 + #[strum(serialize = "Pending")]
197 + #[default]
198 + Pending,
199 + /// Done (green). E.g. a commit that has been pushed.
200 + #[strum(serialize = "Complete")]
201 + Complete,
202 + }
203 +
204 + impl TokenState {
205 + /// Returns the stored/display string (`"Pending"` / `"Complete"`).
206 + pub fn as_str(&self) -> &'static str {
207 + match self {
208 + TokenState::Pending => "Pending",
209 + TokenState::Complete => "Complete",
210 + }
211 + }
212 + }
213 +
214 + impl ParseableEnum for TokenState {}
215 +
216 + impl DbValue for TokenState {
217 + fn db_value(&self) -> &'static str {
218 + self.as_str()
219 + }
220 + }
221 +
222 + /// A typed at-a-glance marker attached to a task, driving its colour indicator.
223 + ///
224 + /// A task carries an ordered list of these; at most one may be `is_primary`, the
225 + /// token that resolved the task. `kind` routes the domain (e.g. [`TOKEN_KIND_COMMIT`])
226 + /// and `reference` is that domain's value — for a commit, the repo-qualified
227 + /// `<repo>@<shortsha>`, since a bare short SHA is not unique across the ecosystem's
228 + /// repos. `state` is the generic, colour-mapped [`TokenState`].
229 + ///
230 + /// The row id is deterministic in `(task_id, kind, reference)` (UUID v5), so
231 + /// recording the same token twice — on one device or across devices — converges to a
232 + /// single row through the sync changelog's id-keyed upsert.
233 + #[derive(Debug, Clone, Serialize, Deserialize)]
234 + #[serde(rename_all = "camelCase")]
235 + pub struct StatusToken {
236 + /// Deterministic identifier (UUID v5 of `<task_id>:<kind>:<reference>`).
237 + pub id: StatusTokenId,
238 + /// Parent task ID.
239 + #[serde(skip_serializing)]
240 + pub task_id: TaskId,
241 + /// Token kind, e.g. [`TOKEN_KIND_COMMIT`].
242 + pub kind: String,
243 + /// The kind's value; for `commit`, a `<repo>@<shortsha>` reference.
244 + pub reference: String,
245 + /// Colour-mapped state.
246 + pub state: TokenState,
247 + /// Whether this is the token that resolved the task (at most one per task).
248 + pub is_primary: bool,
249 + /// Display/append order (lower = earlier).
250 + #[serde(rename = "sortOrder")]
251 + pub position: i32,
252 + }
253 +
254 + impl StatusToken {
255 + /// The deterministic row id for a `(task_id, kind, reference)` triple.
256 + ///
257 + /// Keeping this pure and content-derived is what lets two devices record the
258 + /// same token independently and still collapse to one row on sync.
259 + pub fn deterministic_id(task_id: TaskId, kind: &str, reference: &str) -> StatusTokenId {
260 + let key = format!("{task_id}:{kind}:{reference}");
261 + StatusTokenId::from(uuid::Uuid::new_v5(&GOINGSON_STATUS_TOKEN_NS, key.as_bytes()))
262 + }
263 + }
264 +
177 265 /// A task representing work to be done.
178 266 ///
179 267 /// Tasks can be associated with a project, have due dates, recurrence patterns,
@@ -230,6 +318,8 @@ pub struct Task {
230 318 pub annotations: Vec<Annotation>,
231 319 /// Checklist items.
232 320 pub subtasks: Vec<Subtask>,
321 + /// Status tokens (ordered); the `is_primary` one resolved the task.
322 + pub status_tokens: Vec<StatusToken>,
233 323 /// Estimated duration in minutes (user-provided).
234 324 pub estimated_minutes: Option<i32>,
235 325 /// Cached total actual tracked minutes across all sessions.
@@ -365,6 +455,29 @@ impl Task {
365 455 self.source_email_id.is_some()
366 456 }
367 457
458 + /// Returns true if the task has any status tokens.
459 + pub fn has_status_tokens(&self) -> bool {
460 + !self.status_tokens.is_empty()
461 + }
462 +
463 + /// Returns the primary token (the one that resolved the task), if flagged.
464 + pub fn primary_token(&self) -> Option<&StatusToken> {
465 + self.status_tokens.iter().find(|t| t.is_primary)
466 + }
467 +
468 + /// Rolls the task's tokens up to a single at-a-glance state for the indicator:
469 + /// `"neutral"` (no tokens), `"complete"` (every token `Complete`), or
470 + /// `"pending"` (at least one token still `Pending`).
471 + pub fn status_token_summary(&self) -> &'static str {
472 + if self.status_tokens.is_empty() {
473 + "neutral"
474 + } else if self.status_tokens.iter().all(|t| t.state == TokenState::Complete) {
475 + "complete"
476 + } else {
477 + "pending"
478 + }
479 + }
480 +
368 481 /// Returns true if the task is currently snoozed (snoozed_until is in the future).
369 482 pub fn is_snoozed(&self) -> bool {
370 483 self.snoozed_until
@@ -760,6 +873,7 @@ mod tests {
760 873 scheduled_duration: None,
761 874 annotations: Vec::new(),
762 875 subtasks: Vec::new(),
876 + status_tokens: Vec::new(),
763 877 estimated_minutes: None,
764 878 actual_minutes: 0,
765 879 active_session: None,
@@ -949,6 +1063,61 @@ mod tests {
949 1063 assert_eq!(t.project_name_or_empty(), "Website");
950 1064 }
951 1065
1066 + fn token(t: &Task, reference: &str, state: TokenState, primary: bool, pos: i32) -> StatusToken {
1067 + StatusToken {
1068 + id: StatusToken::deterministic_id(t.id, TOKEN_KIND_COMMIT, reference),
1069 + task_id: t.id,
1070 + kind: TOKEN_KIND_COMMIT.to_string(),
1071 + reference: reference.to_string(),
1072 + state,
1073 + is_primary: primary,
1074 + position: pos,
1075 + }
1076 + }
1077 +
1078 + #[test]
1079 + fn status_token_deterministic_id_is_stable_and_content_derived() {
1080 + let tid = TaskId::new();
1081 + let a = StatusToken::deterministic_id(tid, "commit", "deox@7c236fca8");
1082 + let b = StatusToken::deterministic_id(tid, "commit", "deox@7c236fca8");
1083 + assert_eq!(a, b, "same task+kind+ref must yield the same id");
1084 + assert_ne!(a, StatusToken::deterministic_id(tid, "commit", "deox@a19f0011"), "ref differs");
1085 + assert_ne!(a, StatusToken::deterministic_id(tid, "attachment", "deox@7c236fca8"), "kind differs");
1086 + assert_ne!(a, StatusToken::deterministic_id(TaskId::new(), "commit", "deox@7c236fca8"), "task differs");
1087 + assert_eq!(a.as_uuid().get_version_num(), 5);
1088 + }
1089 +
1090 + #[test]
1091 + fn primary_token_finds_the_flagged_one() {
1092 + let mut t = task();
1093 + assert!(!t.has_status_tokens());
1094 + assert!(t.primary_token().is_none());
1095 + t.status_tokens = vec![
1096 + token(&t, "deox@aaa", TokenState::Pending, false, 0),
1097 + token(&t, "deox@bbb", TokenState::Complete, true, 1),
1098 + ];
1099 + assert!(t.has_status_tokens());
1100 + assert_eq!(t.primary_token().map(|c| c.reference.as_str()), Some("deox@bbb"));
1101 + }
1102 +
1103 + #[test]
1104 + fn status_token_summary_rolls_up_states() {
1105 + let mut t = task();
1106 + assert_eq!(t.status_token_summary(), "neutral");
1107 + t.status_tokens = vec![token(&t, "deox@aaa", TokenState::Pending, false, 0)];
1108 + assert_eq!(t.status_token_summary(), "pending");
1109 + t.status_tokens = vec![
1110 + token(&t, "deox@aaa", TokenState::Complete, false, 0),
1111 + token(&t, "deox@bbb", TokenState::Pending, true, 1),
1112 + ];
1113 + assert_eq!(t.status_token_summary(), "pending", "any pending keeps the rollup pending");
1114 + t.status_tokens = vec![
1115 + token(&t, "deox@aaa", TokenState::Complete, false, 0),
1116 + token(&t, "deox@bbb", TokenState::Complete, true, 1),
1117 + ];
1118 + assert_eq!(t.status_token_summary(), "complete", "all complete rolls up complete");
1119 + }
1120 +
952 1121 #[test]
953 1122 fn recurrence_and_source_flags() {
954 1123 let mut t = task();
@@ -9,7 +9,7 @@ use std::collections::HashSet;
9 9 use crate::id_types::{
10 10 AnnotationId, AttachmentId, ContactEmailId, ContactId, ContactPhoneId, CustomFieldId,
11 11 EmailAccountId, EmailId, EventId, MilestoneId, ProjectId, SavedViewId,
12 - SocialHandleId, SubtaskId, SyncAccountId, TaskId, UserId,
12 + SocialHandleId, StatusTokenId, SubtaskId, SyncAccountId, TaskId, UserId,
13 13 };
14 14 use uuid::Uuid;
15 15
@@ -21,8 +21,8 @@ use crate::error::CoreError;
21 21 use crate::models::{
22 22 Annotation, Attachment, Email, EmailAccount, EmailAuthType, EmailThread, Event,
23 23 FolderSyncState, NewAttachment, NewEmail, NewEmailWithTracking, NewEvent, NewProject,
24 - NewSavedView, NewTask, PositiveMinutes, Project, SavedView, Subtask, Task, TaskFilterQuery, TimeSession,
25 - TimeTrackingSummary, UpdateTask, User,
24 + NewSavedView, NewTask, PositiveMinutes, Project, SavedView, StatusToken, Subtask, Task, TaskFilterQuery, TimeSession,
25 + TimeTrackingSummary, TokenState, UpdateTask, User,
26 26 };
27 27
28 28 /// Convenience type alias for repository operation results.
@@ -112,6 +112,23 @@ pub trait TaskAnnotations: Send + Sync {
112 112 /// features where Phase 2 is a full task linked as a subtask of Phase 1.
113 113 /// The linked subtask's completion status syncs with the linked task's status.
114 114 async fn add_subtask_link(&self, task_id: TaskId, user_id: UserId, linked_task_id: TaskId) -> Result<Option<Subtask>>;
115 +
116 + /// Gets all status tokens on a task, in append order.
117 + async fn get_status_tokens_for_task(&self, task_id: TaskId) -> Result<Vec<StatusToken>>;
118 +
119 + /// Records (upserts) a status token on a task, returning it.
120 + ///
121 + /// The token id is deterministic in `(task_id, kind, reference)`, so recording
122 + /// the same token twice is idempotent — a re-record updates its `state` and
123 + /// `is_primary` in place rather than duplicating. When `is_primary` is true this
124 + /// becomes the task's primary token and any prior primary flag on the task is
125 + /// cleared (at most one primary per task). Returns `None` if the task is missing
126 + /// or not owned.
127 + async fn record_status_token(&self, task_id: TaskId, user_id: UserId, kind: &str, reference: &str, state: TokenState, is_primary: bool) -> Result<Option<StatusToken>>;
128 +
129 + /// Deletes a status token by id, scoped to the user's own tasks. Returns
130 + /// whether a row was removed.
131 + async fn delete_status_token(&self, token_id: StatusTokenId, user_id: UserId) -> Result<bool>;
115 132 }
116 133
117 134 /// Scheduling and triage state: snooze, waiting, focus, time-block schedule,
@@ -482,6 +482,7 @@ mod tests {
482 482 scheduled_duration: None,
483 483 annotations: vec![],
484 484 subtasks: vec![],
485 + status_tokens: vec![],
485 486 created_at,
486 487 completed_at: Some(completed_at),
487 488 is_focus: false,
@@ -11,6 +11,7 @@ mod project_repo;
11 11 pub mod restore;
12 12 mod annotation_repo;
13 13 mod subtask_repo;
14 + mod status_token_repo;
14 15 mod task_repo;
15 16 mod task_repo_state;
16 17 pub(crate) mod time_session_repo;
@@ -32,6 +32,7 @@ pub const BACKUP_TABLES: &[&str] = &[
32 32 "tasks",
33 33 "annotations",
34 34 "subtasks",
35 + "task_status_tokens",
35 36 "events",
36 37 "emails",
37 38 "contacts",
@@ -245,6 +246,29 @@ async fn restore_tasks_with_children(
245 246 result.subtasks_restored += 1;
246 247 }
247 248 }
249 +
250 + // Status tokens -- preserve kind, state, is_primary, position, and the
251 + // deterministic id verbatim.
252 + for token in &task.status_tokens {
253 + let c = sqlx::query(
254 + "INSERT OR IGNORE INTO task_status_tokens (id, task_id, kind, reference, state, is_primary, position) \
255 + VALUES (?, ?, ?, ?, ?, ?, ?)",
256 + )
257 + .bind(token.id.to_string())
258 + .bind(task.id.to_string())
259 + .bind(&token.kind)
260 + .bind(&token.reference)
261 + .bind(token.state.db_value())
262 + .bind(if token.is_primary { 1 } else { 0 })
263 + .bind(token.position)
264 + .execute(&mut **tx)
265 + .await
266 + .map_err(CoreError::database)?
267 + .rows_affected();
268 + if c > 0 {
269 + result.status_tokens_restored += 1;
270 + }
271 + }
248 272 }
249 273
250 274 // Second pass: linked subtasks, now that all task rows exist. Verbatim and
@@ -0,0 +1,197 @@
1 + //! Status-token repository methods for SqliteTaskRepository.
2 + //!
3 + //! A task carries an ordered list of status tokens (typed at-a-glance markers); at
4 + //! most one is the `is_primary`, the token that resolved it. Token ids are
5 + //! deterministic in `(task_id, kind, reference)` (see
6 + //! [`StatusToken::deterministic_id`]), so recording a token is idempotent — locally
7 + //! via `ON CONFLICT(id)` and across devices via the sync changelog's id-keyed upsert.
8 +
9 + use sqlx::SqlitePool;
10 + use std::collections::HashMap;
11 +
12 + use goingson_core::{CoreError, DbValue, ParseableEnum, Result, StatusToken, StatusTokenId, TaskId, TokenState, UserId};
13 +
14 + use crate::utils::{bind_placeholders, parse_uuid};
15 +
16 + /// Row struct for task_status_tokens from SQLite.
17 + #[derive(Debug, Clone, sqlx::FromRow)]
18 + pub(crate) struct StatusTokenRow {
19 + pub id: String,
20 + pub task_id: String,
21 + pub kind: String,
22 + pub reference: String,
23 + pub state: String,
24 + pub is_primary: i32,
25 + pub position: i32,
26 + }
27 +
28 + impl TryFrom<StatusTokenRow> for StatusToken {
29 + type Error = CoreError;
30 +
31 + fn try_from(row: StatusTokenRow) -> std::result::Result<Self, Self::Error> {
32 + Ok(StatusToken {
33 + id: parse_uuid(&row.id)?.into(),
34 + task_id: parse_uuid(&row.task_id)?.into(),
35 + kind: row.kind,
36 + reference: row.reference,
37 + state: TokenState::from_str_or_default(&row.state),
38 + is_primary: row.is_primary != 0,
39 + position: row.position,
40 + })
41 + }
42 + }
43 +
44 + /// Batch-fetch status tokens for multiple tasks by their IDs.
45 + pub(crate) async fn get_tokens_for_tasks(
46 + pool: &SqlitePool,
47 + task_ids: &[String],
48 + ) -> Result<HashMap<TaskId, Vec<StatusToken>>> {
49 + if task_ids.is_empty() {
50 + return Ok(HashMap::new());
51 + }
52 +
53 + let query = format!(
54 + r#"
55 + SELECT id, task_id, kind, reference, state, is_primary, position
56 + FROM task_status_tokens
57 + WHERE task_id IN ({})
58 + ORDER BY position ASC, created_at ASC
59 + "#,
60 + bind_placeholders(task_ids.len())
61 + );
62 +
63 + let mut q = sqlx::query_as::<_, StatusTokenRow>(&query);
64 + for id in task_ids {
65 + q = q.bind(id);
66 + }
67 +
68 + let rows = q.fetch_all(pool).await.map_err(CoreError::database)?;
69 +
70 + let mut map: HashMap<TaskId, Vec<StatusToken>> = HashMap::new();
71 + for row in rows {
72 + let token = StatusToken::try_from(row)?;
73 + map.entry(token.task_id).or_default().push(token);
74 + }
75 +
76 + Ok(map)
77 + }
78 +
79 + /// Get all status tokens for a single task, in append order.
80 + pub(crate) async fn get_tokens_for_task(
81 + pool: &SqlitePool,
82 + task_id: TaskId,
83 + ) -> Result<Vec<StatusToken>> {
84 + let rows = sqlx::query_as::<_, StatusTokenRow>(
85 + r#"
86 + SELECT id, task_id, kind, reference, state, is_primary, position
87 + FROM task_status_tokens
88 + WHERE task_id = ?
89 + ORDER BY position ASC, created_at ASC
90 + "#,
91 + )
92 + .bind(task_id.to_string())
93 + .fetch_all(pool)
94 + .await
95 + .map_err(CoreError::database)?;
96 +
97 + rows.into_iter().map(StatusToken::try_from).collect()
98 + }
99 +
100 + /// Record (upsert) a status token on a task (verifies task ownership).
101 + ///
102 + /// Idempotent in `(task_id, kind, reference)` via the deterministic id: a re-record
103 + /// updates `state`/`is_primary` in place. When `is_primary` is set, any prior primary
104 + /// flag on the task is cleared first so at most one token is ever primary. Returns
105 + /// `None` when the task is missing or not owned by `user_id`.
106 + pub(crate) async fn record_token(
107 + pool: &SqlitePool,
108 + task_id: TaskId,
109 + user_id: UserId,
110 + kind: &str,
111 + reference: &str,
112 + state: TokenState,
113 + is_primary: bool,
114 + ) -> Result<Option<StatusToken>> {
115 + let mut tx = pool.begin().await.map_err(CoreError::database)?;
116 +
117 + let task_exists: (i64,) =
118 + sqlx::query_as("SELECT COUNT(*) FROM tasks WHERE id = ? AND user_id = ?")
119 + .bind(task_id.to_string())
120 + .bind(user_id.to_string())
121 + .fetch_one(&mut *tx)
122 + .await
123 + .map_err(CoreError::database)?;
124 + if task_exists.0 == 0 {
125 + return Ok(None);
126 + }
127 +
128 + // At most one primary per task: clear the flag on every other token first. The
129 + // deterministic id below means the current token, if it already exists, is the
130 + // one row this WHERE would also touch — harmless, its flag is set by the upsert.
131 + if is_primary {
132 + sqlx::query("UPDATE task_status_tokens SET is_primary = 0 WHERE task_id = ? AND is_primary = 1")
133 + .bind(task_id.to_string())
134 + .execute(&mut *tx)
135 + .await
136 + .map_err(CoreError::database)?;
137 + }
138 +
139 + let id = StatusToken::deterministic_id(task_id, kind, reference);
140 + let primary_int = i32::from(is_primary);
141 +
142 + // Insert with the next position, or, if this token was already recorded, keep its
143 + // position and update state/is_primary. Position is assigned inside the statement
144 + // so a concurrent record can't race the MAX (SQLite serializes writers).
145 + let (position,): (i32,) = sqlx::query_as(
146 + r#"
147 + INSERT INTO task_status_tokens (id, task_id, kind, reference, state, is_primary, position)
148 + SELECT ?, ?, ?, ?, ?, ?, COALESCE(MAX(position), -1) + 1 FROM task_status_tokens WHERE task_id = ?
149 + ON CONFLICT(id) DO UPDATE SET state = excluded.state, is_primary = excluded.is_primary
150 + RETURNING position
151 + "#,
152 + )
153 + .bind(id.to_string())
154 + .bind(task_id.to_string())
155 + .bind(kind)
156 + .bind(reference)
157 + .bind(state.db_value())
158 + .bind(primary_int)
159 + .bind(task_id.to_string())
160 + .fetch_one(&mut *tx)
161 + .await
162 + .map_err(CoreError::database)?;
163 +
164 + tx.commit().await.map_err(CoreError::database)?;
165 +
166 + Ok(Some(StatusToken {
167 + id,
168 + task_id,
169 + kind: kind.to_string(),
170 + reference: reference.to_string(),
171 + state,
172 + is_primary,
173 + position,
174 + }))
175 + }
176 +
177 + /// Delete a status token by id, scoped to the user's own tasks.
178 + pub(crate) async fn delete_token(
179 + pool: &SqlitePool,
180 + token_id: StatusTokenId,
181 + user_id: UserId,
182 + ) -> Result<bool> {
183 + let result = sqlx::query(
184 + r#"
185 + DELETE FROM task_status_tokens
186 + WHERE id = ?
187 + AND task_id IN (SELECT id FROM tasks WHERE user_id = ?)
188 + "#,
189 + )
190 + .bind(token_id.to_string())
191 + .bind(user_id.to_string())
192 + .execute(pool)
193 + .await
194 + .map_err(CoreError::database)?;
195 +
196 + Ok(result.rows_affected() > 0)
197 + }
@@ -15,15 +15,16 @@ use sqlx::SqlitePool;
15 15 use goingson_core::{
16 16 calculate_urgency, AnnotationId, Annotation, ContactId, CoreError, DbValue, MilestoneId, NewTask,
17 17 ParseableEnum, Priority, PositiveMinutes, ProjectId, Recurrence, Result, SortDirection, SubtaskId,
18 - Subtask, Task, TaskAnnotations, TaskCrud, TaskFilterQuery, TaskId, TaskScheduling,
18 + StatusToken, StatusTokenId, Subtask, Task, TaskAnnotations, TaskCrud, TaskFilterQuery, TaskId, TaskScheduling,
19 19 TaskSortColumn, TaskStatus, TaskTimeTracking, TimeSession,
20 - TimeTrackingSummary, UpdateTask, UserId,
20 + TimeTrackingSummary, TokenState, UpdateTask, UserId,
21 21 };
22 22
23 23 use crate::utils::{bind_placeholders, format_datetime, format_datetime_now, format_datetime_opt, parse_datetime, parse_tags, parse_uuid, parse_uuid_opt};
24 24
25 25 use super::annotation_repo;
26 26 use super::subtask_repo;
27 + use super::status_token_repo;
27 28 use super::task_repo_state;
28 29 use super::time_session_repo;
29 30
@@ -91,7 +92,7 @@ pub(crate) struct TaskRowWithProject {
91 92 }
92 93
93 94 impl TaskRowWithProject {
94 - fn into_task(self, annotations: Vec<Annotation>, subtasks: Vec<Subtask>) -> Result<Task> {
95 + fn into_task(self, annotations: Vec<Annotation>, subtasks: Vec<Subtask>, status_tokens: Vec<StatusToken>) -> Result<Task> {
95 96 Ok(Task {
96 97 id: parse_uuid(&self.id)?.into(),
97 98 project_id: parse_uuid_opt(self.project_id.as_deref())?.map(Into::into),
@@ -122,6 +123,7 @@ impl TaskRowWithProject {
122 123 active_session: None,
123 124 annotations,
124 125 subtasks,
126 + status_tokens,
125 127 created_at: parse_datetime(&self.created_at)?,
126 128 completed_at: self.completed_at.as_ref().map(|s| parse_datetime(s)).transpose()?,
127 129 is_focus: self.is_focus != 0,
@@ -162,6 +164,7 @@ pub(crate) async fn rows_to_tasks(pool: &SqlitePool, rows: Vec<TaskRowWithProjec
162 164 let task_ids: Vec<String> = rows.iter().map(|r| r.id.clone()).collect();
163 165 let annotations_map = annotation_repo::get_annotations_for_tasks(pool, &task_ids).await?;
164 166 let subtasks_map = subtask_repo::get_subtasks_for_tasks(pool, &task_ids).await?;
167 + let tokens_map = status_token_repo::get_tokens_for_tasks(pool, &task_ids).await?;
165 168 let active_sessions = time_session_repo::get_active_sessions_for_tasks(pool, &task_ids).await?;
166 169
167 170 let mut tasks = Vec::with_capacity(rows.len());
@@ -169,7 +172,8 @@ pub(crate) async fn rows_to_tasks(pool: &SqlitePool, rows: Vec<TaskRowWithProjec
169 172 let id: TaskId = parse_uuid(&row.id)?.into();
170 173 let annotations = annotations_map.get(&id).cloned().unwrap_or_default();
171 174 let subtasks = subtasks_map.get(&id).cloned().unwrap_or_default();
172 - let mut task = row.into_task(annotations, subtasks)?;
175 + let status_tokens = tokens_map.get(&id).cloned().unwrap_or_default();
176 + let mut task = row.into_task(annotations, subtasks, status_tokens)?;
173 177 task.active_session = active_sessions.get(&id).cloned();
174 178 tasks.push(task);
175 179 }
@@ -236,8 +240,9 @@ pub(crate) async fn get_task_by_id(pool: &SqlitePool, id: TaskId, user_id: UserI
236 240 Some(row) => {
237 241 let annotations = annotation_repo::get_annotations_for_task(pool, id).await?;
238 242 let subtasks = subtask_repo::get_subtasks_for_task(pool, id).await?;
243 + let status_tokens = status_token_repo::get_tokens_for_task(pool, id).await?;
239 244 let active_sessions = time_session_repo::get_active_sessions_for_tasks(pool, std::slice::from_ref(&row.id)).await?;
240 - let mut task = row.into_task(annotations, subtasks)?;
245 + let mut task = row.into_task(annotations, subtasks, status_tokens)?;
241 246 task.active_session = active_sessions.get(&task.id).cloned();
242 247 Ok(Some(task))
243 248 }
@@ -929,6 +934,23 @@ impl TaskAnnotations for SqliteTaskRepository {
929 934 &linked_task.status,
930 935 ).await
931 936 }
937 +
938 + // ---- Status tokens (delegated to status_token_repo) ----
939 +
940 + #[tracing::instrument(skip_all)]
941 + async fn get_status_tokens_for_task(&self, task_id: TaskId) -> Result<Vec<StatusToken>> {
942 + status_token_repo::get_tokens_for_task(&self.pool, task_id).await
943 + }
944 +
945 + #[tracing::instrument(skip_all)]
946 + async fn record_status_token(&self, task_id: TaskId, user_id: UserId, kind: &str, reference: &str, state: TokenState, is_primary: bool) -> Result<Option<StatusToken>> {
947 + status_token_repo::record_token(&self.pool, task_id, user_id, kind, reference, state, is_primary).await
948 + }
949 +
950 + #[tracing::instrument(skip_all)]
951 + async fn delete_status_token(&self, token_id: StatusTokenId, user_id: UserId) -> Result<bool> {
952 + status_token_repo::delete_token(&self.pool, token_id, user_id).await
953 + }
932 954 }
933 955
934 956 #[async_trait]
@@ -0,0 +1,141 @@
1 + //! Integration tests for status-token methods on SqliteTaskRepository.
2 +
3 + mod common;
4 +
5 + use goingson_core::{StatusToken, TaskAnnotations, TaskCrud, TaskId, TaskStatus, TokenState, TOKEN_KIND_COMMIT};
6 + use goingson_db_sqlite::SqliteTaskRepository;
7 +
8 + const COMMIT: &str = TOKEN_KIND_COMMIT;
9 +
10 + #[tokio::test]
11 + async fn record_token_appends_and_reads_back() {
12 + let pool = common::setup_test_db().await;
13 + let user_id = common::create_test_user(&pool).await;
14 + let task_id = common::create_test_task(&pool, user_id).await;
15 + let repo = SqliteTaskRepository::new(pool);
16 +
17 + let t = repo
18 + .record_status_token(task_id, user_id, COMMIT, "deox@7c236fca8", TokenState::Pending, false)
19 + .await
20 + .expect("record")
21 + .expect("some");
22 + assert_eq!(t.task_id, task_id);
23 + assert_eq!(t.kind, COMMIT);
24 + assert_eq!(t.reference, "deox@7c236fca8");
25 + assert_eq!(t.state, TokenState::Pending);
26 + assert!(!t.is_primary);
27 + assert_eq!(t.position, 0);
28 +
29 + let tokens = repo.get_status_tokens_for_task(task_id).await.expect("get");
30 + assert_eq!(tokens.len(), 1);
31 + assert_eq!(tokens[0].id, t.id);
32 + }
33 +
34 + #[tokio::test]
35 + async fn record_token_is_idempotent_in_task_kind_ref() {
36 + let pool = common::setup_test_db().await;
37 + let user_id = common::create_test_user(&pool).await;
38 + let task_id = common::create_test_task(&pool, user_id).await;
39 + let repo = SqliteTaskRepository::new(pool);
40 +
41 + let a = repo.record_status_token(task_id, user_id, COMMIT, "deox@aaa", TokenState::Pending, false).await.unwrap().unwrap();
42 + // Re-record the same token, flipping state to Complete (e.g. it was pushed).
43 + let b = repo.record_status_token(task_id, user_id, COMMIT, "deox@aaa", TokenState::Complete, false).await.unwrap().unwrap();
44 + assert_eq!(a.id, b.id, "same (task, kind, ref) collapses to one deterministic id");
45 +
46 + let tokens = repo.get_status_tokens_for_task(task_id).await.unwrap();
47 + assert_eq!(tokens.len(), 1, "no duplicate row on re-record");
48 + assert_eq!(tokens[0].state, TokenState::Complete, "state updated in place");
49 + assert_eq!(tokens[0].position, 0);
50 + }
51 +
52 + #[tokio::test]
53 + async fn record_token_preserves_append_order() {
54 + let pool = common::setup_test_db().await;
55 + let user_id = common::create_test_user(&pool).await;
56 + let task_id = common::create_test_task(&pool, user_id).await;
57 + let repo = SqliteTaskRepository::new(pool);
58 +
59 + repo.record_status_token(task_id, user_id, COMMIT, "deox@one", TokenState::Pending, false).await.unwrap();
60 + repo.record_status_token(task_id, user_id, COMMIT, "deox@two", TokenState::Pending, false).await.unwrap();
61 + repo.record_status_token(task_id, user_id, COMMIT, "deox@three", TokenState::Pending, false).await.unwrap();
62 +
63 + let tokens = repo.get_status_tokens_for_task(task_id).await.unwrap();
64 + let refs: Vec<&str> = tokens.iter().map(|t| t.reference.as_str()).collect();
65 + assert_eq!(refs, vec!["deox@one", "deox@two", "deox@three"]);
66 + }
67 +
68 + #[tokio::test]
69 + async fn primary_flag_is_exclusive_and_can_promote_existing() {
70 + let pool = common::setup_test_db().await;
71 + let user_id = common::create_test_user(&pool).await;
72 + let task_id = common::create_test_task(&pool, user_id).await;
73 + let repo = SqliteTaskRepository::new(pool);
74 +
75 + repo.record_status_token(task_id, user_id, COMMIT, "deox@one", TokenState::Pending, false).await.unwrap();
76 + repo.record_status_token(task_id, user_id, COMMIT, "deox@two", TokenState::Pending, false).await.unwrap();
77 + repo.record_status_token(task_id, user_id, COMMIT, "deox@three", TokenState::Complete, true).await.unwrap();
78 +
79 + let commits = repo.get_status_tokens_for_task(task_id).await.unwrap();
80 + let primaries: Vec<&str> = commits.iter().filter(|t| t.is_primary).map(|t| t.reference.as_str()).collect();
81 + assert_eq!(primaries, vec!["deox@three"], "exactly one primary");
82 +
83 + // Promote an existing token to primary; the prior primary flag clears.
84 + repo.record_status_token(task_id, user_id, COMMIT, "deox@one", TokenState::Pending, true).await.unwrap();
85 + let commits = repo.get_status_tokens_for_task(task_id).await.unwrap();
86 + let primary_refs: Vec<&str> = commits.iter().filter(|t| t.is_primary).map(|t| t.reference.as_str()).collect();
87 + assert_eq!(primary_refs, vec!["deox@one"], "primary moved, still exactly one");
88 + assert_eq!(commits.len(), 3, "promotion did not add a row");
89 + }
90 +
91 + #[tokio::test]
92 + async fn delete_token_removes_only_that_token() {
93 + let pool = common::setup_test_db().await;
94 + let user_id = common::create_test_user(&pool).await;
95 + let task_id = common::create_test_task(&pool, user_id).await;
96 + let repo = SqliteTaskRepository::new(pool);
97 +
98 + let keep = repo.record_status_token(task_id, user_id, COMMIT, "deox@keep", TokenState::Pending, false).await.unwrap().unwrap();
99 + let drop = repo.record_status_token(task_id, user_id, COMMIT, "deox@drop", TokenState::Pending, false).await.unwrap().unwrap();
100 +
101 + let removed = repo.delete_status_token(drop.id, user_id).await.unwrap();
102 + assert!(removed);
103 +
104 + let tokens = repo.get_status_tokens_for_task(task_id).await.unwrap();
105 + assert_eq!(tokens.len(), 1);
106 + assert_eq!(tokens[0].id, keep.id);
107 +
108 + // Deleting an unknown token is a no-op, not an error.
109 + assert!(!repo.delete_status_token(StatusToken::deterministic_id(task_id, COMMIT, "deox@nope"), user_id).await.unwrap());
110 + }
111 +
112 + #[tokio::test]
113 + async fn record_token_rejects_unknown_or_unowned_task() {
114 + let pool = common::setup_test_db().await;
115 + let user_id = common::create_test_user(&pool).await;
116 + let repo = SqliteTaskRepository::new(pool);
117 +
118 + let missing = repo
119 + .record_status_token(TaskId::new(), user_id, COMMIT, "deox@x", TokenState::Pending, false)
120 + .await
121 + .expect("no error");
122 + assert!(missing.is_none(), "recording against a missing task returns None");
123 + }
124 +
125 + #[tokio::test]
126 + async fn tokens_load_onto_the_task_with_rollup() {
127 + let pool = common::setup_test_db().await;
128 + let user_id = common::create_test_user(&pool).await;
129 + let task_id = common::create_test_task(&pool, user_id).await;
130 + let repo = SqliteTaskRepository::new(pool);
131 +
132 + repo.record_status_token(task_id, user_id, COMMIT, "deox@one", TokenState::Complete, false).await.unwrap();
133 + repo.record_status_token(task_id, user_id, COMMIT, "deox@two", TokenState::Pending, true).await.unwrap();
134 +
135 + let task = repo.get_by_id(task_id, user_id).await.unwrap().unwrap();
136 + assert_eq!(task.status_tokens.len(), 2);
137 + assert_eq!(task.primary_token().map(|t| t.reference.as_str()), Some("deox@two"));
138 + assert_eq!(task.status_token_summary(), "pending", "a pending token keeps rollup pending");
139 + // status is unaffected by recording tokens
140 + assert_ne!(task.status, TaskStatus::Completed);
141 + }
@@ -106,5 +106,13 @@ pub fn task_row(t: &Task) -> Value {
106 106 "tags": t.tags,
107 107 "project": t.project_name,
108 108 "project_id": t.project_id.map(|p: ProjectId| p.to_string()),
109 + "status_tokens": t.status_tokens.iter()
110 + .map(|k| json!({
111 + "kind": k.kind,
112 + "reference": k.reference,
113 + "state": k.state.as_str(),
114 + "primary": k.is_primary,
115 + }))
116 + .collect::<Vec<_>>(),
109 117 })
110 118 }
@@ -142,6 +142,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
142 142 let config = ServeConfig {
143 143 projection,
144 144 grants: Some(grants),
145 + resources: None,
145 146 };
146 147
147 148 if args.stdio {
@@ -12,7 +12,8 @@ use async_trait::async_trait;
12 12 use goingson_core::repository::{ProjectRepository, TaskAnnotations, TaskCrud};
13 13 use goingson_core::models::ParseableEnum;
14 14 use goingson_core::{
15 - NewProject, NewTask, ProjectId, ProjectStatus, ProjectType, Task, TaskStatus, UpdateTask,
15 + NewProject, NewTask, ProjectId, ProjectStatus, ProjectType, Task, TaskStatus, TokenState,
16 + UpdateTask, TOKEN_KIND_COMMIT,
16 17 };
17 18 use kberg::{Error, Result, Tool, ToolCallResult, ToolKind};
18 19 use serde_json::{Value, json};
@@ -341,7 +342,7 @@ impl Tool for UpdateTaskTool {
341 342 "update_task"
342 343 }
343 344 fn description(&self) -> &str {
344 - "Update fields of an existing task. Only the fields you pass change; the rest keep their current values. Accepts `description`, `priority`, `due`, `status` (Pending|Started|Completed), `tags`, `project`."
345 + "Update fields of an existing task. Only the fields you pass change; the rest keep their current values. Accepts `description`, `priority`, `due`, `status` (Pending|Started|Completed), `tags`, `project`, and `commit`. `commit` appends an advancing commit to the task's commit list, repo-qualified as `<repo>@<shortsha>` (e.g. `deox@7c236fca8`); use `complete_task` to record the closing commit."
345 346 }
346 347 fn kind(&self) -> ToolKind {
347 348 ToolKind::Write(caps::task_update())
@@ -356,7 +357,8 @@ impl Tool for UpdateTaskTool {
356 357 "due": { "type": "string" },
357 358 "status": { "type": "string" },
358 359 "tags": { "type": "array", "items": { "type": "string" } },
359 - "project": { "type": "string" }
360 + "project": { "type": "string" },
361 + "commit": { "type": "string" }
360 362 },
361 363 "required": ["id"]
362 364 })
@@ -407,6 +409,21 @@ impl Tool for UpdateTaskTool {
407 409 message: format!("task {id} vanished during update"),
408 410 })?;
409 411
412 + // Record an advancing commit (if given) as a non-primary Pending token after
413 + // the field update, then re-read so the returned row reflects it. Idempotent
414 + // via the deterministic token id.
415 + if let Some(commit) = args.get("commit").and_then(Value::as_str).map(str::trim).filter(|s| !s.is_empty()) {
416 + repo.record_status_token(id, self.0.user_id, TOKEN_KIND_COMMIT, commit, TokenState::Pending, false)
417 + .await
418 + .map_err(|e| fail(self.name(), e))?;
419 + let refreshed = repo
420 + .get_by_id(id, self.0.user_id)
421 + .await
422 + .map_err(|e| fail(self.name(), e))?
423 + .unwrap_or(updated);
424 + return Ok(ToolCallResult::text(serde_json::to_string(&task_row(&refreshed)).unwrap()));
425 + }
426 +
410 427 Ok(ToolCallResult::text(serde_json::to_string(&task_row(&updated)).unwrap()))
411 428 }
412 429 }
@@ -419,7 +436,7 @@ impl Tool for CompleteTask {
419 436 "complete_task"
420 437 }
421 438 fn description(&self) -> &str {
422 - "Mark a task complete by id."
439 + "Mark a task complete by id. Optional `commit` records the closing commit, repo-qualified as `<repo>@<shortsha>` (e.g. `deox@7c236fca8`); it is appended to the task's commit list and flagged as the closer."
423 440 }
424 441 fn kind(&self) -> ToolKind {
425 442 ToolKind::Write(caps::task_complete())
@@ -427,15 +444,17 @@ impl Tool for CompleteTask {
427 444 fn input_schema(&self) -> Value {
428 445 json!({
429 446 "type": "object",
430 - "properties": { "id": { "type": "string" } },
447 + "properties": {
448 + "id": { "type": "string" },
449 + "commit": { "type": "string" }
450 + },
431 451 "required": ["id"]
432 452 })
433 453 }
434 454 async fn call(&self, args: Value) -> Result<ToolCallResult> {
435 455 let id = parse_task_id(self.name(), req_str(self.name(), &args, "id")?)?;
436 - let completed = self
437 - .0
438 - .tasks()
456 + let repo = self.0.tasks();
457 + repo
439 458 .complete(id, self.0.user_id)
440 459 .await
441 460 .map_err(|e| fail(self.name(), e))?
@@ -443,6 +462,24 @@ impl Tool for CompleteTask {
443 462 tool: self.name().to_string(),
444 463 message: format!("no task with id {id}"),
445 464 })?;
465 +
466 + // Record the closing commit (if given) as the primary status token before
467 + // re-reading, so the returned row carries it. A freshly-made commit is not
468 + // yet pushed, so it starts Pending. Idempotent via the deterministic token id.
469 + if let Some(commit) = args.get("commit").and_then(Value::as_str).map(str::trim).filter(|s| !s.is_empty()) {
470 + repo.record_status_token(id, self.0.user_id, TOKEN_KIND_COMMIT, commit, TokenState::Pending, true)
471 + .await
472 + .map_err(|e| fail(self.name(), e))?;
473 + }
474 +
475 + let completed = repo
476 + .get_by_id(id, self.0.user_id)
477 + .await
478 + .map_err(|e| fail(self.name(), e))?
479 + .ok_or_else(|| Error::ToolFailed {
480 + tool: self.name().to_string(),
481 + message: format!("task {id} vanished after completion"),
482 + })?;
446 483 Ok(ToolCallResult::text(serde_json::to_string(&task_row(&completed)).unwrap()))
447 484 }
448 485 }
@@ -0,0 +1,75 @@
1 + -- Task status tokens: at-a-glance provenance/state markers attached to a task.
2 + --
3 + -- A status token is a typed marker whose `state` maps to a colour indicator on the
4 + -- task (neutral when a task has none, amber for `Pending`, green for `Complete`). The
5 + -- first `kind` is `commit` — a repo-qualified `<repo>@<shortsha>` reference (e.g.
6 + -- `deox@7c236fca8`, bare short SHAs are not unique across the ecosystem's repos) that
7 + -- is `Pending` until pushed and `Complete` once pushed. The abstraction is
8 + -- deliberately general so later kinds (e.g. `attachment`) register alongside it. At
9 + -- most one token per task may be `is_primary` — the one that resolved the task.
10 + --
11 + -- Row ids are deterministic (UUID v5 of `<task_id>:<kind>:<reference>`, see
12 + -- core::models::task::StatusToken::deterministic_id), so recording the same token
13 + -- twice — locally or from two devices — collapses to one row through the sync
14 + -- changelog's ON CONFLICT(id) apply. That is why there is no UNIQUE(task_id, kind,
15 + -- reference) index: such an index would raise a constraint the id-keyed upsert cannot
16 + -- absorb when a second device's row (new id, same triple) arrives on pull.
17 +
18 + CREATE TABLE task_status_tokens (
19 + id TEXT PRIMARY KEY NOT NULL,
20 + task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
21 + kind TEXT NOT NULL,
22 + reference TEXT NOT NULL,
23 + state TEXT NOT NULL DEFAULT 'Pending',
24 + is_primary INTEGER NOT NULL DEFAULT 0,
25 + position INTEGER NOT NULL DEFAULT 0,
26 + created_at TEXT NOT NULL DEFAULT (datetime('now'))
27 + );
28 +
29 + CREATE INDEX idx_task_status_tokens_task_id ON task_status_tokens(task_id);
30 +
31 + -- ── sync triggers (id, task_id, kind, reference, state, is_primary, position, created_at) ──
32 + -- Emitted json_object keys must equal the apply-side SYNCED_COLUMNS whitelist for
33 + -- `task_status_tokens`; the trigger-vs-whitelist round-trip test keeps the two in step.
34 +
35 + CREATE TRIGGER IF NOT EXISTS sync_trg_task_status_tokens_insert
36 + AFTER INSERT ON task_status_tokens
37 + WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
38 + BEGIN
39 + INSERT INTO sync_changelog (table_name, op, row_id, data)
40 + VALUES ('task_status_tokens', 'INSERT', NEW.id, json_object(
41 + 'id', NEW.id,
42 + 'task_id', NEW.task_id,
43 + 'kind', NEW.kind,
44 + 'reference', NEW.reference,
45 + 'state', NEW.state,
46 + 'is_primary', NEW.is_primary,
47 + 'position', NEW.position,
48 + 'created_at', NEW.created_at
49 + ));
50 + END;
51 +
52 + CREATE TRIGGER IF NOT EXISTS sync_trg_task_status_tokens_update
53 + AFTER UPDATE ON task_status_tokens
54 + WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
55 + BEGIN
56 + INSERT INTO sync_changelog (table_name, op, row_id, data)
57 + VALUES ('task_status_tokens', 'UPDATE', NEW.id, json_object(
58 + 'id', NEW.id,
59 + 'task_id', NEW.task_id,
60 + 'kind', NEW.kind,
61 + 'reference', NEW.reference,
62 + 'state', NEW.state,
63 + 'is_primary', NEW.is_primary,
64 + 'position', NEW.position,
65 + 'created_at', NEW.created_at
66 + ));
67 + END;
68 +
69 + CREATE TRIGGER IF NOT EXISTS sync_trg_task_status_tokens_delete
70 + AFTER DELETE ON task_status_tokens
71 + WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
72 + BEGIN
73 + INSERT INTO sync_changelog (table_name, op, row_id, data)
74 + VALUES ('task_status_tokens', 'DELETE', OLD.id, NULL);
75 + END;
@@ -4178,6 +4178,77 @@ kbd {
4178 4178 color: var(--content-on-action);
4179 4179 }
4180 4180
4181 + /* Status-token indicator dot (task row) + commits-manager rows.
4182 + Colour rolls a task's tokens up at a glance: neutral (no tokens),
4183 + pending/amber (e.g. a commit not pushed), complete/green (all pushed). */
4184 + .token-dot {
4185 + -webkit-appearance: none;
4186 + appearance: none;
4187 + display: inline-block;
4188 + width: 0.6rem;
4189 + height: 0.6rem;
4190 + padding: 0;
4191 + line-height: 0;
4192 + border-radius: 50%;
4193 + border: var(--border-width-sm) solid var(--border);
4194 + background: var(--content-muted);
4195 + cursor: pointer;
4196 + vertical-align: middle;
4197 + flex: none;
4198 + }
4199 +
4200 + .token-dot--neutral {
4201 + background: transparent;
4202 + border-color: var(--content-muted);
4203 + opacity: 0.5;
4204 + }
4205 +
4206 + .token-dot--pending {
4207 + background: var(--warning);
4208 + }
4209 +
4210 + .token-dot--complete {
4211 + background: var(--success);
4212 + }
4213 +
4214 + .token-dot:focus-visible {
4215 + outline: var(--border-width-sm) solid var(--focus-ring);
4216 + outline-offset: 2px;
4217 + }
4218 +
4219 + .token-item {
4220 + display: flex;
4221 + align-items: center;
4222 + gap: 0.4rem;
4223 + padding: 0.35rem 0;
4224 + border-bottom: var(--border-width-sm) solid var(--border);
4225 + }
4226 +
4227 + .token-item .token-dot {
4228 + cursor: default;
4229 + }
4230 +
4231 + .token-ref {
4232 + font-family: var(--font-mono);
4233 + font-size: 0.8rem;
4234 + word-break: break-all;
4235 + }
4236 +
4237 + .token-ref--primary {
4238 + font-weight: 700;
4239 + }
4240 +
4241 + .token-primary-tag {
4242 + font-family: inherit;
4243 + font-size: 0.6rem;
4244 + text-transform: uppercase;
4245 + letter-spacing: 0.03em;
4246 + padding: 0.05rem 0.3rem;
4247 + border: var(--border-width-sm) solid var(--border);
4248 + background: var(--success);
4249 + color: var(--content-on-action);
4250 + }
4251 +
4181 4252 /* Clickable task rows */
4182 4253 .task-row-clickable {
4183 4254 cursor: pointer;
@@ -1 +1 @@
1 - @font-face{font-family:Reglo;src:url('../fonts/Reglo-Bold.woff2') format('woff2');font-weight:700;font-style:normal;font-display:swap}*,::after,::before{box-sizing:border-box;margin:0;padding:0}:root{--timeline-slot-h:12px;--surface-page:#E0E4FA;--surface-raised:#FFFFFF;--surface-sunken:#BAC2E6;--surface-overlay:#CDD3F0;--content:#000000;--content-secondary:#2D2D2D;--content-muted:#6B6B6B;--content-on-action:#000000;--action:#6196FF;--action-hover:#70a6ff;--danger:#DC3545;--success:#5CB85C;--warning:#F7D154;--info:#17A2B8;--border:#000000;--border-strong:#000000;--focus-ring:#6196ff;--hover-surface:#bac2e6;--category-one:#DC3545;--category-two:#5CB85C;--category-three:#6196FF;--category-four:#F7D154;--category-five:#7B68EE;--category-six:#17A2B8;--overlay:rgba(1, 1, 8, 0.5);--border-width:2px;--border-width-sm:2px;--shadow-offset-xs:1px;--shadow-offset-md:3px;--shadow-offset:4px;--shadow-offset-lg:6px;--shadow-offset-xl:8px;--shadow-brutal-xs:var(--shadow-offset-xs) var(--shadow-offset-xs) 0 var(--border);--shadow-brutal-md:var(--shadow-offset-md) var(--shadow-offset-md) 0 var(--border);--shadow-brutal-lg:var(--shadow-offset-lg) var(--shadow-offset-lg) 0 var(--border);--shadow-brutal-xl:var(--shadow-offset-xl) var(--shadow-offset-xl) 0 var(--border);--radius-xs:3px;--radius-sm:5px;--radius-md:5px;--radius-lg:10px;--radius-xl:20px;--radius-full:50%;--width-container:1400px;--width-modal:560px;--width-sidebar:280px;--space-1:0.25rem;--space-2:0.5rem;--space-3:0.75rem;--space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--font-sans:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;--font-serif:Georgia,'Times New Roman',serif;--font-mono:'SF Mono','Consolas','Liberation Mono',monospace;--font-display:'Reglo',var(--font-serif);--font-heading:var(--font-sans);--font-body:var(--font-sans);--font-size-xxs:0.65rem;--font-size-xs:0.7rem;--font-size-sm:0.75rem;--font-size-md:0.8rem;--font-size-base:0.875rem;--font-size-lg:1rem;--font-size-xl:1.1rem;--font-size-2xl:1.25rem;--font-size-3xl:1.5rem;--font-size-4xl:1.75rem;--line-height-tight:1.25;--line-height-normal:1.5;--line-height-relaxed:1.75;--transition-fast:0.1s;--transition-normal:0.15s;--transition-slow:0.3s;--overlay-color:color-mix(in srgb, var(--content) 60%, transparent)}html{font-size:16px}.flex-1{flex:1}.row{display:flex}.text-sm-secondary{font-size:.875rem;color:var(--content-secondary)}.text-xs-secondary{font-size:.75rem;color:var(--content-secondary)}.text-accent-red{color:var(--danger)}.mb-1{margin-bottom:1rem}.mb-2{margin-bottom:var(--space-2)}.form-select--compact{width:auto;min-width:120px}.settings-divider{margin-top:1.5rem;padding-top:1.5rem;border-top:2px solid var(--border)}.settings-heading{margin-bottom:1rem;font-family:var(--font-heading)}.settings-desc{font-size:.875rem;color:var(--content-secondary);margin-bottom:1rem}.subtask-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;background:var(--surface-overlay);border-radius:4px;margin-bottom:.5rem}.subtask-item--linked{background:var(--surface-sunken);border-left:var(--border-width) solid var(--action)}.subtask-checkbox{cursor:pointer;width:18px;height:18px}.subtask-checkbox-disabled{cursor:not-allowed;width:18px;height:18px;opacity:.5}.subtask-text-done{text-decoration:line-through;opacity:.6}body{font-family:var(--font-sans);background-color:var(--surface-page);color:var(--content);line-height:1.6;height:100vh;overflow:hidden;display:flex;flex-direction:column}.badge,.btn,.mobile-tab,.mobile-tab-bar,.mobile-tab-create,.tab,.tab-icon,.tab-label,.tab-navigation,.tag,.toggle-switch,button,label{-webkit-user-select:none;user-select:none}.selectable,[contenteditable=true],input,textarea{-webkit-user-select:text;user-select:text}.ui-mode-desktop .app-header{background:var(--surface-raised);border-bottom:var(--border-width) solid var(--border);padding:.75rem 1.5rem;display:flex;justify-content:space-between;align-items:center}.ui-mode-desktop .header-content{display:flex;align-items:center;gap:.75rem}.ui-mode-desktop .header-actions{display:flex;align-items:center;gap:.5rem}.ui-mode-desktop .app-title{font-family:var(--font-display);font-size:1.75rem;font-weight:700;color:var(--content);letter-spacing:-.02em}.ui-mode-desktop .app-subtitle{font-size:.875rem;color:var(--content-muted);font-weight:500;line-height:1}.mobile-view-title{display:none}.ui-mode-desktop .tab-navigation{display:flex;justify-content:center;gap:.5rem}.ui-mode-desktop .tab{display:flex;align-items:center;gap:.5rem;padding:.75rem 1.25rem;text-decoration:none;color:var(--content);background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);font-weight:600;transition:background-color .15s ease}.ui-mode-desktop .tab:hover{background:var(--surface-overlay)}.ui-mode-desktop .tab.active{background-color:var(--action);color:var(--content-on-action);box-shadow:var(--shadow-brutal-xs)}.ui-mode-desktop .tab-icon{font-size:1.1rem}.ui-mode-desktop .tab-label{font-weight:600;font-size:.9rem}.ui-mode-desktop .tab.tab-right{margin-left:auto}.tab-group .subview.hidden{display:none}.ui-mode-desktop .pill-nav{display:flex;align-items:center;gap:var(--space-1);padding:0;margin-bottom:1rem;min-height:2rem}.ui-mode-desktop .pill{padding:var(--space-1) var(--space-3);border-radius:var(--radius-xl);border:var(--border-width-sm) solid var(--border);background:var(--surface-raised);font-family:var(--font-sans);font-size:var(--font-size-sm);font-weight:600;cursor:pointer;transition:background-color var(--transition-fast)}.ui-mode-desktop .pill:hover{background:var(--surface-sunken)}.ui-mode-desktop .pill.active{background:var(--content);color:var(--surface-raised);border-color:var(--content);box-shadow:var(--shadow-brutal-xs)}.main-content{flex:1;max-width:var(--width-container);width:100%;margin:0 auto;padding:1.5rem 1.75rem 2rem}.page-header{display:flex;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem}.page-title{font-family:var(--font-heading);font-size:1.75rem;font-weight:700;color:var(--content)}.tab-group{position:relative}.tab-group>.subview>.page-header{position:absolute;top:0;right:0;margin:0;z-index:1}.tab-group .page-header .page-title{display:none}#day-plan-view>.page-header,#project-dashboard-view>.page-header{position:static;margin-bottom:1rem}#project-dashboard-view .page-title{display:block}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.625rem 1.25rem;border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);font-size:.9rem;font-weight:600;cursor:pointer;transition:background-color .15s ease,transform .1s ease,box-shadow .1s ease;text-decoration:none;background:var(--surface-raised);color:var(--content);box-shadow:var(--shadow-brutal-xs)}.btn:hover{background:var(--surface-overlay);transform:translate(-1px,-1px);box-shadow:var(--shadow-offset-md) var(--shadow-offset-md) 0 var(--border)}.btn:active{background:var(--surface-sunken);transform:translate(1px,1px);box-shadow:none}.btn:disabled{background:0 0;color:var(--content-muted);border-color:var(--content-muted);cursor:not-allowed;box-shadow:none}.btn:disabled:hover{background:0 0;transform:none;box-shadow:none}.btn-primary{background-color:var(--action);color:var(--content-on-action)}.btn-primary:hover{background-color:color-mix(in srgb,var(--action) 85%,#000)}.btn-primary:active{background-color:color-mix(in srgb,var(--action) 70%,#000)}.btn-secondary{background-color:var(--surface-overlay);color:var(--content)}.btn-danger{background-color:var(--danger);color:var(--content-on-action)}.btn-danger:hover{background-color:color-mix(in srgb,var(--danger) 85%,#000)}.btn-danger:active{background-color:color-mix(in srgb,var(--danger) 70%,#000)}.btn-sm{padding:.375rem .75rem;font-size:.8rem}.cards-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:1.25rem}.card{background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);padding:1.25rem;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border);transition:transform .15s ease,box-shadow .15s ease,background-color .15s ease;cursor:pointer}.card:hover{background-color:var(--surface-overlay);transform:translate(-2px,-2px);box-shadow:calc(var(--shadow-offset) + 2px) calc(var(--shadow-offset) + 2px) 0 var(--border)}.card--list-item{padding:.75rem;border-radius:0;margin-bottom:.5rem}.card--shell{padding:0;cursor:default;display:flex;flex-direction:column;overflow:hidden}.card--shell:hover{background-color:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.card--muted{background:var(--surface-overlay);border:none;box-shadow:none;cursor:default}.card--muted:hover{background:var(--surface-overlay);transform:none;box-shadow:none}.card--static{cursor:default}.card--static:hover{background-color:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.75rem}.card-title{font-family:var(--font-heading);font-size:1.1rem;font-weight:700;color:var(--content)}.card-description{font-size:.9rem;color:var(--content-secondary);margin-bottom:1rem}.markdown-content{font-size:.9rem;color:var(--content-secondary);line-height:1.5}.markdown-content p{margin:0 0 .5em 0}.markdown-content p:last-child{margin-bottom:0}.markdown-content ol,.markdown-content ul{margin:0 0 .5em 1.5em;padding:0}.markdown-content code{background:var(--surface-sunken);padding:.1em .3em;border-radius:3px;font-size:.85em}.markdown-content pre{background:var(--surface-sunken);padding:.5em;border-radius:4px;overflow-x:auto;margin:0 0 .5em 0}.markdown-content pre code{background:0 0;padding:0}.markdown-content a{color:var(--action)}.markdown-content blockquote{border-left:3px solid var(--border);margin:0 0 .5em 0;padding-left:.75em;color:var(--content-secondary)}.markdown-content h1,.markdown-content h2,.markdown-content h3{margin:.5em 0 .25em 0;font-size:1em;font-weight:600;color:var(--content)}.markdown-content table{border-collapse:collapse;margin:.5em 0}.markdown-content td,.markdown-content th{border:1px solid var(--border);padding:.25em .5em}.markdown-content img{max-width:100%}.card-meta{display:flex;gap:.5rem;flex-wrap:wrap}.badge,.tag{display:inline-flex;align-items:center;padding:.25rem .625rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);font-size:.8125rem;font-weight:600;background:var(--surface-raised);color:var(--content)}.badge[data-color=green],.tag[data-color=green]{background-color:color-mix(in srgb,var(--category-two) 20%,var(--surface-raised));border-color:var(--category-two)}.badge[data-color=yellow],.tag[data-color=yellow]{background-color:color-mix(in srgb,var(--category-four) 20%,var(--surface-raised));border-color:var(--category-four)}.badge[data-color=red],.tag[data-color=red]{background-color:color-mix(in srgb,var(--category-one) 20%,var(--surface-raised));border-color:var(--category-one)}.badge[data-color=cyan],.tag[data-color=cyan]{background-color:color-mix(in srgb,var(--category-six) 20%,var(--surface-raised));border-color:var(--category-six)}.badge[data-color=purple],.tag[data-color=purple]{background-color:color-mix(in srgb,var(--category-five) 20%,var(--surface-raised));border-color:var(--category-five)}.badge[data-color=muted],.tag[data-color=muted]{background-color:var(--surface-sunken);border-color:var(--content-muted)}.badge[data-color=blue],.tag[data-color=blue]{background-color:color-mix(in srgb,var(--category-three) 20%,var(--surface-raised));border-color:var(--category-three)}.badge--xs{padding:.1rem .5rem;font-size:.75rem}.badge--sm{padding:.15rem .55rem;font-size:.78rem}.badge--filled{border:none}.badge--filled[data-color=green]{background:var(--category-two);color:var(--content-on-action)}.badge--filled[data-color=yellow]{background:var(--category-four);color:var(--content)}.badge--filled[data-color=red]{background:var(--category-one);color:var(--content-on-action)}.badge--filled[data-color=cyan]{background:var(--category-six);color:var(--content-on-action)}.badge--filled[data-color=purple]{background:var(--category-five);color:var(--content-on-action)}.badge--filled[data-color=blue]{background:var(--category-three);color:var(--content-on-action)}.badge--filled[data-color=muted]{background:var(--surface-overlay);color:var(--content)}.kbd-hint{display:inline-block;font-family:var(--font-mono, monospace);font-size:.65rem;font-weight:600;padding:.1rem .35rem;margin-left:.35rem;border:1px solid currentColor;border-radius:3px;opacity:.6;vertical-align:middle;line-height:1}.tag.status-active{background-color:color-mix(in srgb,var(--success) 20%,var(--surface-raised));border-color:var(--success)}.tag.status-on_hold,.tag.status-onhold{background-color:color-mix(in srgb,var(--warning) 20%,var(--surface-raised));border-color:var(--warning)}.tag.status-archived{background-color:var(--surface-sunken);border-color:var(--content-muted)}.tag.status-inactive{background-color:color-mix(in srgb,var(--danger) 20%,var(--surface-raised));border-color:var(--danger)}.tag.status-completed{background-color:color-mix(in srgb,var(--category-six) 20%,var(--surface-raised));border-color:var(--category-six)}.data-table{width:100%;border-collapse:separate;border-spacing:0;background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.data-table td,.data-table th{padding:1rem 1.25rem;text-align:left;border-bottom:2px solid var(--border)}.data-table th{background-color:var(--surface-overlay);font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--content)}.data-table tbody tr{transition:background-color .15s ease}.data-table tbody tr:hover{background-color:var(--surface-overlay)}.data-table tbody tr:last-child td{border-bottom:none}.data-table tbody tr.keyboard-selected,.data-table tbody tr.selected{background-color:color-mix(in srgb,var(--action) 25%,var(--surface-raised))}.task-table{width:100%;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);overflow:hidden;display:flex;flex-direction:column;flex:1;min-height:0;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.task-header-row,.task-row{display:grid;grid-template-columns:1fr 140px 60px 110px 90px 100px 90px;align-items:center;gap:.75rem}.task-header-row{background-color:var(--surface-overlay);border-bottom:2px solid var(--border);padding:0 1.25rem}.task-header-row .task-cell{padding:.75rem 0;font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content)}.task-list-container{flex:1;min-height:0;overflow-y:auto;position:relative}.task-row{padding:.75rem 1.25rem;border-bottom:1px solid var(--border);transition:background-color .15s ease,opacity .25s ease,transform .25s ease;cursor:pointer}.task-row-removing{opacity:0;transform:translateX(20px)}.task-row:hover{background-color:var(--surface-overlay)}.task-row:last-child{border-bottom:none}.task-row.keyboard-selected,.task-row.selected{background-color:color-mix(in srgb,var(--action) 25%,var(--surface-raised))}.task-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.task-actions-header{text-align:right}.event-table tbody tr{cursor:pointer}.task-description{font-weight:600;white-space:normal;display:flex;flex-wrap:wrap;align-items:center;gap:.25rem .5rem}.task-description-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.task-project{font-size:.85rem;color:var(--content-secondary);white-space:nowrap}.priority-high,.priority-low,.priority-medium{display:inline-block;padding:.25rem .5rem;border-radius:var(--radius-xs);font-weight:700;text-align:center}.priority-high{color:var(--danger);background:#fde8ea;background:color-mix(in srgb,var(--danger) 15%,var(--surface-raised))}.priority-medium{color:var(--warning);background:#fef8e6;background:color-mix(in srgb,var(--warning) 15%,var(--surface-raised))}.priority-low{color:var(--content-muted);background:var(--surface-overlay)}.sortable{cursor:pointer;user-select:none;white-space:nowrap}.sortable:hover{background:var(--hover-surface)}.sort-arrow{display:inline-block;width:.8em;margin-left:.25rem;opacity:.3}.sort-arrow::after{content:'\2195'}.sortable.sort-asc .sort-arrow::after{content:'\2191'}.sortable.sort-desc .sort-arrow::after{content:'\2193'}.sortable.sort-asc .sort-arrow,.sortable.sort-desc .sort-arrow{opacity:1}.task-overdue .task-description-text{color:var(--danger)}.task-overdue .task-due{color:var(--danger);font-weight:600}.task-tags{display:flex;gap:.25rem;flex-wrap:wrap}.task-tag{background-color:var(--surface-sunken);color:var(--content);padding:.125rem .5rem;border-radius:var(--radius-xs);font-size:.75rem;font-weight:600;border:1px solid var(--border)}.recurrence-icon{color:var(--category-five);font-size:.85rem;font-weight:700}.annotation-badge{background-color:var(--warning);color:var(--content);padding:.125rem .5rem;border-radius:var(--radius-xs);font-size:.7rem;font-weight:700;border:var(--border-width-sm) solid var(--border)}.subtask-badge{background-color:var(--surface-overlay);color:var(--content);padding:.125rem .5rem;border-radius:var(--radius-xs);font-size:.7rem;font-weight:700;border:var(--border-width-sm) solid var(--border);margin-left:.25rem}.task-started{border-left:4px solid var(--success)}.task-completed{opacity:.5;text-decoration:line-through}.task-deleted{display:none}.due-overdue{color:var(--danger);font-weight:700;background:#fde8ea;background:color-mix(in srgb,var(--danger) 15%,var(--surface-raised));padding:.25rem .5rem;border-radius:var(--radius-xs)}.due-today{color:var(--warning);font-weight:700;background:#fef8e6;background:color-mix(in srgb,var(--warning) 15%,var(--surface-raised));padding:.25rem .5rem;border-radius:var(--radius-xs)}.due-soon{color:var(--content-secondary)}.due-future{color:var(--content-muted)}.events-list{display:flex;flex-direction:column;flex:1;min-height:0;gap:1rem}.event-table-virtual{width:100%;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);overflow:hidden;display:flex;flex-direction:column;flex:1;min-height:0;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.event-header-row,.event-row-virtual{display:grid;grid-template-columns:100px 80px 1fr 150px 40px;align-items:center;gap:.5rem}.event-header-row{background-color:var(--surface-overlay);border-bottom:2px solid var(--border);flex-shrink:0}.event-header-row .event-cell{padding:1rem 1.25rem;font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content)}.event-list-container{flex:1;min-height:0;overflow-y:auto;position:relative}.event-row-virtual{padding:.75rem 1.25rem;border-bottom:1px solid var(--border);transition:background-color .15s ease;cursor:pointer}.event-row-virtual:hover{background-color:var(--surface-overlay)}.event-row-virtual:last-child{border-bottom:none}.event-row-virtual.event-past{opacity:.7}.event-cell{overflow:hidden;text-overflow:ellipsis}.event-row{cursor:pointer}.event-cell-date{white-space:nowrap}.event-cell-date .event-date-num{font-weight:700;font-size:.9rem;color:var(--content);margin-right:.5rem}.event-date-badge{display:inline-block;padding:.15rem .4rem;background:var(--success);color:var(--content-on-action);font-size:.7rem;font-weight:700;text-transform:uppercase;border-radius:var(--radius-xs);margin-right:.5rem}.event-cell-time{font-family:var(--font-mono);font-size:.85rem;color:var(--content-secondary)}.event-cell-title{font-weight:600}.event-cell-location{color:var(--content-secondary);font-size:.875rem}.event-date-badge.event-proximity-today{background:var(--success)}.event-date-badge.event-proximity-tomorrow{background:var(--warning);color:var(--content)}.event-date-badge.event-proximity-week{background:var(--category-six)}.event-date-badge.event-proximity-future{background:var(--action)}.event-date-badge.event-proximity-past{background:var(--content-muted)}.event-row.event-past{opacity:.7}.no-upcoming-events{text-align:center;padding:2rem;color:var(--content-secondary);font-style:italic}.past-events-section{margin-top:.5rem}.past-events-toggle{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font-weight:600;color:var(--content-secondary);transition:background-color .15s ease,color .15s ease;list-style:none}.past-events-toggle::-webkit-details-marker{display:none}.past-events-toggle::before{content:'▶';font-size:.7rem;transition:transform .15s ease}.past-events-section[open] .past-events-toggle::before{transform:rotate(90deg)}.past-events-toggle:hover{background:var(--surface-sunken);color:var(--content)}.past-events-label{flex:1}.past-events-count{background:var(--content-muted);color:var(--content-on-action);font-size:.75rem;padding:.15rem .5rem;border-radius:var(--radius-sm)}.past-events-section .event-table-past{margin-top:.75rem;opacity:.85}.past-events-section .event-list-container{max-height:300px}#recurring-events-section .event-table-virtual{opacity:1;margin-top:.75rem}#recurring-events-section .event-list-container{max-height:320px}.event-row-virtual.event-recurring .event-recurrence-pattern{font-weight:600;color:var(--action)}.events-section-heading{margin:1rem 0 .5rem;font-size:.95rem;font-weight:700;color:var(--content-secondary);text-transform:uppercase;letter-spacing:.05em}.event-item{display:flex;gap:1rem;padding:1rem;background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);transition:background-color .15s ease;cursor:pointer}.event-item:hover{background-color:var(--surface-overlay)}.event-date{flex-shrink:0;width:80px;text-align:center;padding:.75rem;background-color:var(--success);border-radius:var(--radius-sm);color:var(--content-on-action)}.event-date-day{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em}.event-date-num{font-size:1.5rem;font-weight:700}.event-content{flex:1}.event-title{font-family:var(--font-heading);font-weight:700;font-size:1.1rem;color:var(--content);margin-bottom:.25rem}.event-details{font-size:.875rem;color:var(--content-secondary);display:flex;gap:1rem}.event-location,.event-time{display:flex;align-items:center;gap:.25rem}.event-project{margin-top:.5rem}.email-list{flex:1;min-height:0}.email-list-container{flex:1;min-height:0;overflow-y:auto;position:relative}.email-item{display:flex;gap:1rem;padding:1rem;border-bottom:2px solid var(--border);transition:background-color .15s ease;cursor:pointer}.email-item:last-child{border-bottom:none}.email-item:hover{background-color:var(--surface-overlay)}.email-item.unread{background-color:color-mix(in srgb,var(--action) 20%,var(--surface-raised));border-left:4px solid var(--action)}.email-item.unread .email-subject{font-weight:700}.email-item.unread .email-from{font-weight:700}.email-item.outgoing{border-left:4px solid var(--success)}.email-checkbox{flex-shrink:0;margin-top:.25rem}.email-content{flex:1;min-width:0}.email-header{display:flex;justify-content:space-between;margin-bottom:.25rem;align-items:center;gap:.5rem}.thread-badge{background-color:var(--surface-sunken);color:var(--content-secondary);font-size:.7rem;font-weight:600;padding:.1rem .4rem;border-radius:var(--radius-md);min-width:1.25rem;text-align:center}.email-from{color:var(--content);font-size:.9rem;font-weight:600}.email-date{color:var(--content-muted);font-size:.8rem;flex-shrink:0;font-weight:600}.email-subject{color:var(--content);font-size:.95rem;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.email-preview{color:var(--content-muted);font-size:.85rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes toastSlideIn{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.toast{position:fixed;bottom:var(--space-5);right:var(--space-5);padding:var(--space-3) var(--space-5);background:var(--surface-raised);color:var(--content);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);z-index:2000;font-weight:600;display:flex;align-items:center;gap:var(--space-3);animation:toastSlideIn .3s ease}.toast.toast-leaving{opacity:0;transform:translateY(10px);transition:opacity .3s ease,transform .3s ease}.toast-info{background:var(--surface-raised);color:var(--content)}.toast-success{background:var(--success);color:var(--content-on-action)}.toast-error{background:var(--danger);color:var(--content-on-action)}.toast-action{background:0 0;border:1px solid currentColor;border-radius:var(--radius-sm);color:inherit;cursor:pointer;padding:.15rem .5rem;font-size:var(--font-size-sm);font-weight:600;font-family:inherit}.toast-undo{z-index:10000}.undo-message{flex:1}.undo-countdown{font-size:var(--font-size-sm);color:var(--content-muted);min-width:2.5rem;text-align:right}@keyframes modalFadeIn{from{opacity:0}to{opacity:1}}@keyframes modalSlideIn{from{opacity:0;transform:translateY(-20px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes modalFadeOut{from{opacity:1}to{opacity:0}}@keyframes modalSlideOut{from{opacity:1;transform:translateY(0) scale(1)}to{opacity:0;transform:translateY(-20px) scale(.95)}}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:var(--overlay);display:flex;align-items:center;justify-content:center;z-index:1000;animation:modalFadeIn .15s ease-out}.modal-overlay.hidden{display:none}.modal-overlay.closing{animation:modalFadeOut .15s ease-in forwards}.modal-container{background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-brutal-xl);max-width:var(--width-modal);width:90%;max-height:calc(100dvh - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px) - 2rem);overflow:auto;animation:modalSlideIn .2s ease-out}.modal-container.modal-large{max-width:calc(100vw - 4rem);width:calc(100vw - 4rem);max-height:calc(100vh - 4rem);height:calc(100vh - 4rem);display:flex;flex-direction:column}.modal-container.modal-large .modal-content{flex:1;overflow:auto;display:flex;flex-direction:column}.modal-overlay.closing .modal-container{animation:modalSlideOut .15s ease-in forwards}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;border-bottom:var(--border-width) solid var(--border);background:var(--surface-overlay)}.modal-header h2,.modal-title{font-family:var(--font-heading);font-size:1.25rem;font-weight:700}.modal-close{background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);font-size:1.25rem;color:var(--content);cursor:pointer;line-height:1;width:36px;height:36px;display:flex;align-items:center;justify-content:center;transition:background-color .15s ease}.modal-close:hover{background:var(--action);color:var(--content-on-action)}.modal-content{padding:1.5rem}.modal-content form>.form-actions:last-child,.modal-content>.form-actions:last-child{position:sticky;bottom:0;margin-top:1.5rem;padding-top:.75rem;padding-bottom:.25rem;background:var(--surface-raised);border-top:var(--border-width-sm) solid var(--border);z-index:1}.form-group{margin-bottom:1.25rem}.form-more-toggle{display:block;background:0 0;border:none;cursor:pointer;font-size:.85rem;font-weight:600;color:var(--action);padding:.25rem 0;margin-bottom:.75rem}.form-more-toggle::before{content:'+ '}.form-more-toggle.expanded::before{content:'- '}.form-extended-fields.hidden{display:none}.recurrence-weekday-label{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;font-size:.8rem;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer}.recurrence-weekday-label:has(input:checked){background:var(--action);color:var(--surface-page);border-color:var(--action)}.recurrence-weekday-label input[type=checkbox]{display:none}.recurrence-config .form-input,.recurrence-config .form-select{font-size:.85rem;padding:.25rem .5rem}.form-label{display:block;font-size:.9rem;font-weight:700;color:var(--content);margin-bottom:.5rem}.form-input,.form-select,.form-textarea{width:100%;padding:.75rem 1rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);background-color:var(--surface-raised);color:var(--content);font-size:1rem;box-shadow:none}.form-input:focus,.form-select:focus,.form-textarea:focus{outline:0;background-color:var(--surface-raised);box-shadow:0 0 0 2px var(--action)}.form-textarea{min-height:100px;resize:vertical}.form-input--ghost{background:0 0;border:none;padding:.5rem;font-size:.875rem}.form-input--ghost:focus{background:0 0;box-shadow:none}.form-select--ghost{background:var(--surface-page);padding:.5rem;font-size:.875rem}.form-actions{display:flex;justify-content:flex-end;gap:.75rem;margin-top:1.5rem}.form-input[aria-invalid=true],.form-select[aria-invalid=true],.form-textarea[aria-invalid=true]{border-color:var(--danger);box-shadow:0 0 0 2px color-mix(in srgb,var(--danger) 30%,transparent)}.form-input[aria-invalid=true]:focus,.form-select[aria-invalid=true]:focus,.form-textarea[aria-invalid=true]:focus{box-shadow:0 0 0 2px var(--danger)}.form-error{color:var(--danger);font-size:.8rem;font-weight:600;margin-top:.25rem;display:none}.form-error.visible{display:block}.form-hint{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-1)}.form-hint--preview{color:var(--action)}.form-checkbox-label{display:flex;align-items:center;gap:var(--space-2);cursor:pointer}.empty-state-action{margin-top:var(--space-3)}.stack{display:flex;flex-direction:column}.stack-2{gap:var(--space-2)}.stack-3{gap:var(--space-3)}.stack-4{gap:var(--space-4)}.row-flex{display:flex;align-items:center}.row-flex-2{gap:var(--space-2)}.row-flex-3{gap:var(--space-3)}.row-flex-4{gap:var(--space-4)}.text-center{text-align:center}.text-left{text-align:left}.w-full{width:100%}.text-muted{color:var(--content-muted)}.text-secondary{color:var(--content-secondary)}.text-danger{color:var(--danger)}.text-sm{font-size:var(--font-size-sm)}.text-xs{font-size:var(--font-size-xs, .75rem)}.section-divider{border-top:var(--border-width-sm) solid var(--border);padding-top:var(--space-4);margin-top:var(--space-4)}.sync-status-row{display:flex;align-items:center;gap:var(--space-3);margin-bottom:var(--space-5)}.sync-status-dot{width:10px;height:10px;border-radius:var(--radius-full);background:var(--success);display:inline-block}.sync-stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-4);margin-bottom:var(--space-5)}.sync-stat{padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-md)}.sync-stat-label{font-size:var(--font-size-sm);color:var(--content-muted);margin-bottom:var(--space-1)}.sync-stat-value{font-size:var(--font-size-md, .9rem)}.sync-encryption-error{color:var(--danger);font-size:var(--font-size-sm);margin-top:var(--space-2);display:none}.sync-encryption-error.visible{display:block}.sync-section-actions{margin-bottom:var(--space-5)}.sync-banner{padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-md);margin-bottom:var(--space-4);font-size:var(--font-size-sm);color:var(--content-secondary)}.sync-banner--warning{background:var(--surface-overlay);border:1px solid var(--border);padding:var(--space-4)}.sync-empty{padding:var(--space-5) 0}.sync-empty-message{margin-bottom:var(--space-5)}.sync-hint{margin-bottom:var(--space-4)}.sync-status-label{font-weight:500}.sync-account-row{display:flex;align-items:baseline;gap:var(--space-3);margin-bottom:var(--space-5);font-size:var(--font-size-sm)}.sync-account-label{color:var(--content-muted)}.sync-account-value{color:var(--content)}.sync-account-username{color:var(--content-muted)}.sync-banner-title{font-weight:500;margin:0 0 var(--space-3) 0}.sync-banner-body{margin:0 0 var(--space-2) 0;font-size:var(--font-size-sm);color:var(--content-secondary)}.sync-banner-tier-line{margin:0 0 var(--space-4) 0;font-size:var(--font-size-sm);color:var(--content-secondary)}.sync-banner-actions{display:flex;gap:var(--space-2);align-items:center}.settings-subheading{margin-bottom:var(--space-3);font-size:var(--font-size-md, .9rem)}.settings-desc-block{font-size:var(--font-size-sm);color:var(--content-secondary);margin-bottom:var(--space-4)}.settings-actions-row{display:flex;flex-wrap:wrap;gap:var(--space-3);margin-bottom:var(--space-4)}.settings-actions-row--center{align-items:center;flex-wrap:nowrap;margin-top:var(--space-3)}.settings-status-text{font-size:var(--font-size-sm);color:var(--content-secondary)}.settings-toggle-row{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3);margin:var(--space-3) 0}.settings-toggle-row>div{flex:1}.settings-toggle-row .settings-desc{margin-bottom:0}.settings-section-block{padding-top:var(--space-4);border-top:var(--border-width-sm) solid var(--border)}.form-hint--spaced{margin-top:var(--space-2)}.empty-italic{color:var(--content-secondary);font-style:italic}.form-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-4)}.email-detect-status{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-1)}.email-detect-note{font-size:var(--font-size-sm);margin-top:var(--space-2);padding:var(--space-3) var(--space-3);background:var(--surface-sunken);border-left:3px solid var(--action);border-radius:var(--radius-sm);line-height:var(--line-height-normal)}.account-row{padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-sm);margin-bottom:var(--space-2)}.account-row-header{display:flex;justify-content:space-between;align-items:flex-start}.account-row-name{font-weight:600}.account-row-meta{font-size:var(--font-size-sm);color:var(--content-secondary)}.account-row-sync{font-size:var(--font-size-sm);color:var(--content-secondary)}.account-row-provider-badge{font-size:var(--font-size-xs, .7rem);padding:.125rem .375rem;background:var(--action);color:var(--content-on-action);border-radius:var(--radius-xs);margin-left:var(--space-2)}.test-conn-result{padding:var(--space-2);background:var(--surface-overlay);border-radius:var(--radius-sm);margin-bottom:var(--space-2)}.test-conn-result--success{color:var(--success)}.test-conn-result--error{color:var(--danger)}.folder-list{max-height:150px;overflow-y:auto;background:var(--surface-overlay);padding:var(--space-2);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm)}.folder-list-meta{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-2)}.error-pre{background:var(--surface-overlay);padding:var(--space-2);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm);white-space:pre-wrap;max-height:150px;overflow-y:auto}.test-conn-section{border-top:var(--border-width-sm) solid var(--border);margin:var(--space-4) 0;padding-top:var(--space-4)}.oauth-waiting{text-align:center;padding:var(--space-5)}.oauth-waiting-title{font-size:var(--font-size-lg, 1.25rem);margin-bottom:var(--space-4)}.oauth-waiting-body{color:var(--content-secondary);margin-bottom:var(--space-5)}.oauth-waiting-spinner{margin:0 auto var(--space-5)}.contact-card-header{gap:var(--space-3)}.contact-card-body{flex:1;min-width:0}.contact-detail-header{display:flex;align-items:center;gap:var(--space-4);margin-bottom:var(--space-5)}.contact-detail-name{margin:0}.contact-detail-tags{margin-bottom:var(--space-4)}.form-actions--spaced{margin-top:var(--space-5)}.milestones-empty{color:var(--content-muted);font-size:var(--font-size-sm);margin-bottom:var(--space-4)}.bulk-modal-prompt{color:var(--content-secondary);margin-bottom:var(--space-2)}.bulk-modal-prompt--wide{margin-bottom:var(--space-3)}.bulk-modal-scroll{max-height:300px;overflow-y:auto;display:flex;flex-direction:column;gap:var(--space-1)}.bulk-priority-row{display:flex;gap:var(--space-2)}.snooze-hint{font-size:var(--font-size-sm);color:var(--content-secondary);margin:0 0 var(--space-3) 0}.time-tracking-empty{color:var(--content-secondary);padding:var(--space-4) 0}.backups-empty{color:var(--content-secondary);font-style:italic}.backup-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-2)}.backup-item-meta{font-size:var(--font-size-sm);color:var(--content-secondary)}.export-desc{font-size:var(--font-size-sm);color:var(--content-secondary);margin-bottom:var(--space-5)}.export-note{margin-top:var(--space-4);padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-sm)}.export-note-text{font-size:var(--font-size-sm);color:var(--content-secondary);margin:0}.paint-time-preview{font-weight:600;color:var(--action);margin-bottom:var(--space-2)}.recurrence-config{display:none;margin-top:var(--space-2);padding:var(--space-2);border:1px solid var(--border);border-radius:var(--radius-sm)}.recurrence-config:not(.hidden){display:block}.recurrence-preview{font-size:var(--font-size-sm);color:var(--action);font-weight:600;margin-bottom:var(--space-2)}.recurrence-sublabel{font-size:var(--font-size-xs, .75rem)}.recurrence-unit{font-size:var(--font-size-sm)}.recurrence-day-label{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm)}.recurrence-nth-toggle{font-size:var(--font-size-sm);margin:var(--space-1) 0}.recurrence-row{margin-bottom:var(--space-2)}.recurrence-row.recurrence-hidden{display:none}.recurrence-interval-row{display:flex;align-items:center;gap:var(--space-2)}.recurrence-num{width:4rem}.recurrence-weekdays{display:flex;gap:var(--space-1);flex-wrap:wrap}.recurrence-monthly{margin-bottom:0}.recurrence-monthly.recurrence-hidden{display:none}.recurrence-monthly-stack{display:flex;flex-direction:column;gap:var(--space-2)}.recurrence-monthly-week{width:auto}.confirm-message-wrap{margin-bottom:var(--space-5)}.confirm-message{color:var(--content-secondary);line-height:var(--line-height-normal)}.review-intro{color:var(--content-secondary);font-size:var(--font-size-sm);margin:0 0 var(--space-4)}.review-intro--weekly{margin:var(--space-2) 0 var(--space-4)}.no-events-day{color:var(--content-secondary)}.loading--error{color:var(--danger)}.project-dashboard-desc{color:var(--content-secondary);margin-bottom:var(--space-4)}.pending-key-hint{position:fixed;bottom:var(--space-5);left:50%;transform:translateX(-50%);padding:var(--space-2) var(--space-4);background:var(--surface-raised);color:var(--content);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);z-index:10000;font-size:var(--font-size-sm);white-space:nowrap;animation:toastSlideIn .15s ease}.pending-key-hint-label{opacity:.7}.pending-key-hint kbd{background:var(--surface-overlay);border:1px solid var(--border);border-radius:var(--radius-xs);padding:.125rem .4rem;font-family:inherit;font-size:var(--font-size-sm)}.shortcuts-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--overlay);display:flex;align-items:center;justify-content:center;z-index:3000}.shortcuts-overlay-panel{background:var(--surface-raised);border-radius:var(--radius-md);padding:var(--space-5);max-width:600px;max-height:80vh;overflow-y:auto}.shortcuts-title{margin-top:0;margin-bottom:var(--space-4);border-bottom:1px solid var(--border);padding-bottom:var(--space-2)}.shortcuts-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-5)}.shortcuts-group-heading{color:var(--content-secondary);font-size:var(--font-size-sm);margin-bottom:var(--space-2)}.shortcuts-group-heading+.shortcut-row{margin-top:0}.shortcuts-group-heading-spaced{color:var(--content-secondary);font-size:var(--font-size-sm);margin-bottom:var(--space-2);margin-top:var(--space-3)}.shortcuts-close{margin-top:var(--space-5);text-align:center}.shortcut-row{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.shortcut-row kbd{background:var(--surface-overlay);border:1px solid var(--border);border-radius:var(--radius-xs);padding:.25rem .5rem;font-family:inherit;font-size:var(--font-size-sm);min-width:1.5rem;text-align:center}.shortcut-row span{color:var(--content-secondary);font-size:var(--font-size-sm);margin-left:auto}.quick-add-syntax{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-2);line-height:var(--line-height-relaxed)}.quick-add-syntax>span{margin-right:var(--space-3)}.quick-add-syntax kbd{font-size:.7rem;padding:.1rem .3rem;border:1px solid var(--border);border-radius:var(--radius-xs);background:var(--surface-overlay)}.virtual-scroller-wrapper{position:relative;width:100%}.virtual-scroller-spacer{height:0;width:100%}.meta-text{font-size:var(--font-size-sm);color:var(--content-muted)}.meta-text--secondary{color:var(--content-secondary)}.subtasks-empty{color:var(--content-secondary);text-align:center;padding:var(--space-4)}.subtask-linked-tag{color:var(--action);font-size:var(--font-size-sm)}.task-actions-bar{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--border)}.error-state--padded{padding:var(--space-4)}.event-cell--shrink{flex:0 0 auto;padding-right:0}.hr-soft{border:none;border-top:1px solid var(--border);margin:var(--space-2) 0}.card-badge--success{background:var(--success);color:var(--content-on-action)}.card-badge--warning{background:var(--warning)}.card-badge--info{background:var(--action);color:var(--content-on-action)}.card-badge--danger{background:var(--danger);color:var(--content-on-action)}.card-badge--neutral{background:var(--surface-overlay)}.empty-italic--muted{color:var(--content-muted);font-style:italic}.review-history-block{margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px dashed var(--border)}.review-history-heading{font-size:var(--font-size-sm);color:var(--content-muted);margin-bottom:var(--space-3)}.email-attachment-row{display:flex;align-items:center;gap:var(--space-2);padding:.375rem 0}.email-attachment-size{font-size:var(--font-size-sm);color:var(--content-muted);flex-shrink:0}.email-attachments-block{margin-bottom:var(--space-3);padding:var(--space-2) var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-sm);border:1px solid var(--border)}.email-attachments-heading{font-size:var(--font-size-sm);font-weight:600;color:var(--content-secondary);margin-bottom:var(--space-1)}.email-thread-count{color:var(--content-muted);font-size:var(--font-size-sm)}.email-subject-line{font-weight:600;font-size:1.1rem}.email-meta-line{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-1)}.email-snoozed-tag{color:var(--warning)}.email-actions-bar{border-top:1px solid var(--border);padding-top:var(--space-4);margin-top:auto}.email-attachment-tag{margin-right:var(--space-2)}.email-draft-item{cursor:pointer;padding:var(--space-3)}.email-draft-meta{font-size:var(--font-size-sm);color:var(--content-secondary)}.label-existing-line{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-1)}.search-no-results{padding:var(--space-5);text-align:center;color:var(--content-secondary)}.email-attachment-name{flex:1;min-width:0}.email-draft-subject{font-weight:500}.header-row{display:flex;align-items:center;padding:.75rem 1rem;border-bottom:1px solid var(--border);gap:.5rem}.header-row--tight{padding:.25rem 1rem}.header-label{width:80px;color:var(--content-secondary);font-size:.875rem;flex-shrink:0}.autocomplete-wrapper{position:relative;flex:1;background:0 0;border-radius:var(--radius-sm)}.autocomplete-wrapper:focus-within{background:var(--surface-overlay)}.body-container{flex:1;display:flex;flex-direction:column;overflow:hidden}.body-textarea{flex:1;min-height:12rem;background:var(--surface-raised);border:none;color:var(--content);font-size:.9375rem;font-family:inherit;padding:1rem;resize:vertical;outline:0;line-height:1.6}.body-textarea::placeholder{color:var(--content-muted)}.reply-indicator{display:none;color:var(--content-secondary);font-size:.8125rem;align-self:center}.compose-attachments{padding:.5rem 1rem;border-top:1px solid var(--border);background:var(--surface-overlay);font-size:.8125rem}.compose-attachment-item{padding:.25rem 0}.compose-attachment-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-attachment-size{color:var(--content-muted);flex-shrink:0}.compose-attachment-remove{background:0 0;border:none;color:var(--danger);cursor:pointer;font-size:1rem;padding:0 .25rem}.compose-attachment-total{display:flex;gap:var(--space-2);align-items:baseline;padding-top:var(--space-2);margin-top:var(--space-1);font-size:var(--font-size-sm);color:var(--content-muted);border-top:1px dashed var(--border)}.compose-attachment-total.over-warn{color:var(--warning)}.compose-attachment-total.over-cap{color:var(--danger)}.compose-attachment-warn{font-style:italic}.about-info-list{display:grid;grid-template-columns:max-content 1fr;column-gap:var(--space-4);row-gap:var(--space-2);margin:var(--space-4) 0;font-size:var(--font-size-sm)}.about-info-list dt{font-weight:600;color:var(--content-secondary)}.about-info-list dd{margin:0;font-family:var(--font-mono)}.about-updater-note{margin-top:var(--space-4)}.filter-count{font-size:var(--font-size-sm);color:var(--content-muted);margin-right:var(--space-2);white-space:nowrap}.filter-count--capped{color:var(--warning);font-weight:600}.ui-mode-mobile #task-view-toggle{display:none}.swipe-peek{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding:0 var(--space-3);font-size:var(--font-size-sm);font-weight:600;color:var(--content-on-action);pointer-events:none;opacity:0;transition:opacity .1s linear;z-index:0}.swipe-peek--right{left:0;background:var(--action);justify-content:flex-start}.swipe-peek--left{right:0;background:var(--action);justify-content:flex-end}.swipe-peek--success{background:var(--success)}.swipe-peek--warn{background:var(--warning);color:var(--content)}.swipe-peek--danger{background:var(--danger)}.swipe-peek--ready{box-shadow:inset 0 0 0 2px var(--content-on-action)}.email-item,.event-row-virtual,.task-row{position:relative;overflow:hidden}.attachment-item{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--border)}.attachment-icon{font-size:1.2rem}.attachment-meta{font-size:var(--font-size-sm);color:var(--content-muted)}.attachment-sync-warning{font-size:var(--font-size-sm);color:var(--content-muted)}.attachment-info{flex:1;min-width:0}.attachment-filename{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-actions{display:flex;gap:var(--space-1)}.attachment-attach-row{margin-top:var(--space-4)}.link-task-item{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2);background:var(--surface-overlay);border-radius:var(--radius-sm);margin-bottom:var(--space-2);cursor:pointer}.link-task-item:hover{background:var(--surface-sunken)}.link-task-project{font-size:var(--font-size-sm);color:var(--content-secondary)}.link-task-prompt{color:var(--content-secondary);margin-bottom:var(--space-4)}.link-task-desc{flex:1}.link-task-list{max-height:400px;overflow-y:auto}.form-actions--top-spaced{margin-top:var(--space-4)}.about-panel{text-align:center;padding:var(--space-4)}.about-title{font-family:var(--font-display);margin-bottom:var(--space-4)}.about-tagline{color:var(--content-secondary);margin-bottom:var(--space-2)}.about-version{color:var(--content-muted);font-size:var(--font-size-sm)}.welcome-panel{line-height:var(--line-height-relaxed)}.welcome-intro{color:var(--content-secondary);margin-bottom:var(--space-4)}.welcome-section{margin-bottom:var(--space-4)}.welcome-subhead{font-size:var(--font-size-md, .9rem);margin-bottom:var(--space-2)}.welcome-subhead--tight{margin-bottom:var(--space-1)}.welcome-step-stack{display:flex;flex-direction:column;gap:var(--space-2)}.welcome-tabs-list{color:var(--content-secondary);font-size:var(--font-size-sm);padding-left:var(--space-4);margin:0}.whats-new-panel{line-height:var(--line-height-relaxed)}.whats-new-group{font-size:var(--font-size-md, .9rem);margin:var(--space-3) 0 var(--space-1)}.whats-new-group:first-child{margin-top:0}.whats-new-list{color:var(--content-secondary);font-size:var(--font-size-sm);padding-left:var(--space-4);margin:0}.whats-new-text{color:var(--content-secondary);margin-bottom:var(--space-2)}.review-more-line{color:var(--content-muted);font-size:var(--font-size-sm);margin-top:var(--space-2)}.modal-attachments{font-size:var(--font-size-sm);margin-top:var(--space-1)}.account-row-info{flex:1}.account-row-actions{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.account-row-quick{display:flex;gap:var(--space-2)}.account-row-quick .btn{flex:1}.account-list{margin-bottom:var(--space-4);max-height:400px;overflow-y:auto}.form-actions-spacer{flex:1}.oauth-block{margin-bottom:var(--space-5)}.oauth-block-title{font-weight:500;margin-bottom:var(--space-3)}.oauth-buttons{display:flex;flex-wrap:wrap;gap:var(--space-2)}.oauth-buttons .btn{flex:1;min-width:120px}.oauth-helptext{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-2)}.imap-block-divider{border-top:var(--border-width-sm) solid var(--border);margin:var(--space-4) 0;padding-top:var(--space-4)}.imap-block-title{font-weight:500;margin-bottom:var(--space-3)}.test-conn-results{margin-bottom:var(--space-4)}.sync-results{margin-bottom:var(--space-4)}.sync-result-banner{padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-sm);margin-bottom:var(--space-2)}.sync-result-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-2);margin-bottom:var(--space-2)}.sync-result-tile{padding:var(--space-2);background:var(--surface-overlay);border-radius:var(--radius-sm)}.app-footer{background-color:var(--surface-raised);border-top:var(--border-width) solid var(--border);padding:.75rem 1.5rem}.footer-content{max-width:var(--width-container);margin:0 auto;display:flex;justify-content:space-between;align-items:center}.ui-mode-desktop .keyboard-hints{display:flex;gap:1rem;font-size:.8rem;color:var(--content-muted)}kbd{display:inline-block;padding:.2rem .5rem;background-color:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-xs);font-family:var(--font-mono);font-size:.75rem;font-weight:700}.welcome-hint{color:var(--content-secondary);font-size:var(--font-size-sm);margin-bottom:var(--space-2)}.version{font-size:.75rem;color:var(--content-muted);font-weight:600}.empty-state{text-align:center;padding:3rem;color:var(--content-secondary)}.empty-state--compact{padding:2rem 1rem;font-size:var(--font-size-sm)}.empty-state--dashboard{padding:2rem 1rem}.empty-state--error{color:var(--danger)}.empty-state-icon{display:flex;justify-content:center;margin-bottom:var(--space-3);color:var(--content-muted)}.empty-state-icon svg{width:2.75rem;height:2.75rem}.empty-state--compact .empty-state-icon svg,.empty-state--dashboard .empty-state-icon svg{width:2rem;height:2rem}.empty-state-text{font-size:1.1rem;font-weight:600;margin-bottom:1rem}.empty-state--compact .empty-state-text,.empty-state--dashboard .empty-state-text{font-size:var(--font-size-sm);font-weight:500;margin-bottom:var(--space-2)}.error-state{text-align:center;padding:2rem;color:var(--danger);background:color-mix(in srgb,var(--danger) 10%,var(--surface-raised));border:var(--border-width-sm) solid var(--danger);border-radius:var(--radius-sm);font-weight:600}.view{display:block}.view.hidden{display:none}.filter-bar{display:flex;flex-wrap:wrap;gap:.75rem;margin-bottom:1.5rem;padding:1rem;background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.filter-group{display:flex;align-items:center;gap:.5rem}.filter-label{font-size:.8rem;font-weight:700;color:var(--content-secondary);text-transform:uppercase;letter-spacing:.05em}.filter-select{padding:.5rem .75rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);background-color:var(--surface-raised);color:var(--content);font-size:.875rem;font-weight:600}.filter-select:focus{outline:0;background-color:var(--action);color:var(--content-on-action)}.filter-checkbox{display:flex;align-items:center;gap:.4rem;font-size:.875rem;font-weight:600;color:var(--content);cursor:pointer}.filter-checkbox input[type=checkbox]{width:1rem;height:1rem;cursor:pointer}.btn-link{background:0 0;border:none;box-shadow:none;color:var(--content-secondary);font-size:.875rem;cursor:pointer;text-decoration:underline;padding:.5rem}.btn-link:hover{box-shadow:none;transform:none;color:var(--content)}@media (min-width:1400px){.ui-mode-desktop .main-content{max-width:1600px}.ui-mode-desktop .cards-grid{grid-template-columns:repeat(auto-fill,minmax(380px,1fr))}.ui-mode-desktop .project-dashboard-grid{gap:2rem}.ui-mode-desktop .day-plan-sidebar{width:320px}.ui-mode-desktop .modal-container{max-width:640px}}@media (max-width:1024px){.ui-mode-desktop .saved-views-sidebar{width:180px}.ui-mode-desktop .day-plan-sidebar{width:240px}.ui-mode-desktop .project-dashboard-grid{grid-template-columns:1fr 1fr;gap:1rem}.ui-mode-desktop .project-dashboard-grid .dashboard-column:last-child{grid-column:span 2}.ui-mode-desktop .filter-bar{flex-wrap:wrap}.ui-mode-desktop .filter-actions{width:100%;justify-content:flex-end;margin-top:.5rem}}.ui-mode-mobile .tab-navigation{flex-wrap:wrap;gap:.5rem}.ui-mode-mobile .tab{flex:1 1 auto;min-width:calc(33% - .5rem);justify-content:center;padding:.625rem .75rem}.ui-mode-mobile .tab-label{display:none}.ui-mode-mobile .tab-icon{font-size:1.25rem}.ui-mode-mobile .kbd-hint{display:none}.ui-mode-mobile .cards-grid{grid-template-columns:1fr}.ui-mode-mobile .task-table{font-size:.85rem}.ui-mode-mobile .task-header-row,.ui-mode-mobile .task-row{grid-template-columns:1fr 80px 40px 80px}.ui-mode-mobile .task-header-row .task-cell:nth-child(n+5),.ui-mode-mobile .task-row .task-cell:nth-child(n+5){display:none}.ui-mode-mobile .filter-bar{flex-direction:column}.ui-mode-mobile .keyboard-hints{display:none}.ui-mode-mobile .page-title{font-size:1.5rem}.ui-mode-mobile .saved-views-sidebar{display:none}.ui-mode-mobile .day-plan-content{flex-direction:column}.ui-mode-mobile .day-plan-sidebar{width:100%;max-height:200px}.ui-mode-mobile .project-dashboard-grid{grid-template-columns:1fr}.ui-mode-mobile .project-dashboard-grid .dashboard-column:last-child{grid-column:span 1}.ui-mode-mobile .modal-container{width:95%;max-height:95vh}.ui-mode-mobile .bulk-actions-bar{flex-wrap:wrap}.ui-mode-mobile .bulk-select-all{width:100%;margin-top:.5rem}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pagination-controls{display:flex;align-items:center;justify-content:center;gap:1rem;padding:1rem;margin-top:1rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md)}.pagination-info{font-weight:600;color:var(--content-secondary);font-size:.9rem}.pagination-controls .btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible,.card:focus-visible,.email-item:focus-visible,.event-row-virtual:focus-visible,.filter-select:focus-visible,.form-input:focus-visible,.form-select:focus-visible,.form-textarea:focus-visible,.modal-close:focus-visible,.saved-view-item:focus-visible,.snooze-option:focus-visible,.tab:focus-visible,.task-row:focus-visible,.timeline-item:focus-visible,.unscheduled-task:focus-visible{outline:3px solid var(--action);outline-offset:2px}.event-row,.task-row-clickable{cursor:pointer}.skip-link{position:absolute;top:-100px;left:0;background:var(--action);color:var(--content-on-action);padding:.75rem 1.5rem;z-index:9999;font-weight:700;border:var(--border-width) solid var(--border);text-decoration:none}.skip-link:focus{top:0}.source-email-link{padding:.75rem;background:var(--surface-overlay);border-radius:var(--radius-sm);border-left:4px solid var(--action)}.thread-message{margin-bottom:1rem;padding:.75rem;background:var(--surface-overlay);border-radius:var(--radius-sm)}.thread-message-latest{border-left:3px solid var(--action)}.thread-message-header{display:flex;justify-content:space-between;margin-bottom:.5rem;font-size:.8rem;color:var(--content-secondary)}.thread-message-from{font-weight:700}.email-reader-body{white-space:pre-wrap;font-size:.9rem;line-height:1.6;color:var(--content);word-wrap:break-word;overflow-wrap:break-word}.email-reader-body .email-link{color:var(--action);text-decoration:underline;cursor:pointer;word-break:break-all}.email-reader-body .email-link:hover{color:var(--category-six)}.email-reader-body hr{border:none;border-top:2px solid var(--border);margin:1rem 0}.email-reader-quote{border-left:3px solid var(--content-muted);padding-left:1rem;margin:.5rem 0;color:var(--content-secondary);font-style:italic}.email-quote-toggle{display:inline-block;color:var(--content-muted);font-size:.8125rem;cursor:pointer;padding:.25rem 0;user-select:none}.email-quote-toggle:hover{color:var(--action)}.email-quote-block{border-left:3px solid var(--content-muted);padding-left:1rem;margin:.25rem 0 .5rem;color:var(--content-secondary)}.email-quote-block.hidden{display:none}.autocomplete-dropdown{background:var(--surface-raised);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-brutal-md);z-index:100;max-height:200px;overflow-y:auto}.autocomplete-item{padding:.5rem .75rem;cursor:pointer;font-size:.875rem}.autocomplete-item.active,.autocomplete-item:hover{background:var(--surface-overlay)}.autocomplete-name{font-weight:500}.autocomplete-email{color:var(--content-secondary);margin-left:.25rem}.email-reader-container{display:flex;flex-direction:column;height:100%;min-height:0}.email-reader-header{margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--border)}.email-sender-contact{margin-top:.5rem;padding:.4rem .5rem;background:var(--surface-sunken);border-radius:4px}.email-sender-info{display:flex;flex-direction:column;flex:1;min-width:0}.email-sender-name{font-weight:600;font-size:.85rem}.email-sender-company{font-size:.75rem;color:var(--content-secondary)}.email-reader-thread{flex:1;overflow-y:auto;margin-bottom:1rem;min-height:0}.dropdown{position:relative;display:inline-block}.dropdown-menu{display:none;position:absolute;bottom:100%;left:0;margin-bottom:.25rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);min-width:160px;z-index:100}.dropdown-menu.show{display:block}.dropdown-item{display:block;width:100%;padding:.5rem 1rem;text-align:left;background:0 0;border:none;cursor:pointer;font-size:.875rem;color:var(--content)}.dropdown-item:hover{background:var(--surface-overlay)}.dropdown-item:first-child{border-radius:var(--radius-md) var(--radius-md) 0 0}.dropdown-item:last-child{border-radius:0 0 var(--radius-md) var(--radius-md)}.context-menu{position:fixed;z-index:10000;min-width:180px;max-width:280px;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-brutal-lg);padding:.25rem 0;display:none}.context-menu.visible{display:block}.context-menu-item{display:flex;align-items:center;gap:.75rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;color:var(--content);cursor:pointer;border:none;background:0 0;width:100%;text-align:left;transition:background .1s}.context-menu-item:focus,.context-menu-item:hover{background:var(--action);color:var(--content-on-action);outline:0}.context-menu-item:focus-visible{outline:2px solid var(--action);outline-offset:-2px}.context-menu-header{font-size:.7rem;font-weight:700;color:var(--content-secondary);text-transform:uppercase;letter-spacing:.05em;padding:.5rem 1rem .25rem}.context-menu-item-icon{width:1.25rem;text-align:center;flex-shrink:0}.context-menu-item-label{flex:1}.context-menu-item-subtitle{display:block;font-size:.7rem;color:var(--content-secondary);font-weight:400}.context-menu-item-shortcut{font-size:.75rem;color:var(--content-muted);font-family:var(--font-mono)}.context-menu-item--danger{color:var(--danger)}.context-menu-item--danger:hover{background:var(--danger);color:var(--content-on-action)}.context-menu-separator{height:2px;background:var(--border);margin:.25rem .5rem}.context-menu-hint{padding:.35rem 1rem;font-size:.7rem;color:var(--content-muted);border-top:1px solid var(--border);margin-top:.25rem}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--surface-overlay);border-left:2px solid var(--border)}::-webkit-scrollbar-thumb{background:var(--content-muted);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm)}::-webkit-scrollbar-thumb:hover{background:var(--content-secondary)}.loading{display:flex;justify-content:center;align-items:center;height:200px;color:var(--content-secondary);font-family:var(--font-heading)}.skeleton-shimmer{display:flex;flex-direction:column;gap:1rem;padding:1rem}.skeleton-shimmer .skeleton-row{display:flex;align-items:center;gap:.75rem;padding:.75rem;background:var(--surface-raised);border-radius:var(--radius-md);border:var(--border-width) solid var(--border)}.skeleton-shimmer .skeleton-avatar{width:36px;height:36px;border-radius:var(--radius-full);background:linear-gradient(90deg,var(--surface-overlay) 25%,var(--surface-sunken) 50%,var(--surface-overlay) 75%);background-size:200% 100%;animation:skeleton-pulse 1.5s ease-in-out infinite;flex-shrink:0}.skeleton-shimmer .skeleton-lines{flex:1;display:flex;flex-direction:column;gap:.4rem}.skeleton-shimmer .skeleton-line{height:.75rem;border-radius:var(--radius-sm);background:linear-gradient(90deg,var(--surface-overlay) 25%,var(--surface-sunken) 50%,var(--surface-overlay) 75%);background-size:200% 100%;animation:skeleton-pulse 1.5s ease-in-out infinite}.skeleton-shimmer .skeleton-line.short{width:40%}.skeleton-shimmer .skeleton-line.medium{width:65%}.skeleton-shimmer .skeleton-line.long{width:90%}@keyframes skeleton-pulse{0%{background-position:200% 0}100%{background-position:-200% 0}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.spinner{display:inline-block;width:1em;height:1em;border:2px solid currentColor;border-top-color:transparent;border-radius:var(--radius-full);animation:spin .8s linear infinite}.btn-loading{position:relative;pointer-events:none;opacity:.8}.btn-loading .btn-text{visibility:hidden}.btn-loading::after{content:'';position:absolute;left:50%;top:50%;width:1em;height:1em;margin-left:-.5em;margin-top:-.5em;border:2px solid currentColor;border-top-color:transparent;border-radius:var(--radius-full);animation:spin .8s linear infinite}.hidden{display:none!important}.project-dashboard-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem;flex:1;min-height:0}.dashboard-column{background:var(--surface-raised);border:var(--border-width) solid var(--border);padding:1rem;display:flex;flex-direction:column;overflow:hidden}.dashboard-column-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:2px solid var(--border)}.dashboard-column-header h3{margin:0;font-size:1rem;font-family:var(--font-heading);font-weight:700}.dashboard-list{flex:1;overflow-y:auto}.dashboard-item-title{font-weight:600;margin-bottom:.25rem}.dashboard-item-meta{font-size:.75rem;color:var(--content-secondary)}.task-badges{display:flex;gap:.25rem;margin-top:.25rem}.task-badge{font-size:.65rem;padding:.15rem .4rem;border:var(--border-width-sm) solid var(--border);background:var(--surface-overlay);color:var(--content);font-weight:600}.task-badge.has-items{background:var(--action);color:var(--content-on-action)}.task-badge.recurrence{background:var(--category-five);color:var(--content-on-action)}.task-row-clickable{cursor:pointer;transition:background .1s}.task-row-clickable:hover{background:var(--surface-overlay)}.progress-bar-container{width:100%;height:10px;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);overflow:hidden}.progress-bar{height:100%;background:var(--success);transition:width .3s ease}.no-subtasks{color:var(--content-secondary);font-size:.875rem}#day-plan-view{display:flex;flex-direction:column;flex:1;min-height:0}#day-plan-view .page-header{flex-shrink:0}.day-plan-nav{display:flex;align-items:center;gap:.5rem}.day-plan-date-picker{padding:.5rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);color:var(--content);font-family:var(--font-body)}.day-plan-date-display{font-size:1.25rem;font-weight:700;margin-left:1rem;font-family:var(--font-heading);line-height:1}.day-plan-content{flex:1;min-height:0;display:flex;gap:1.5rem}.day-plan-main{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.day-plan-sidebar{width:280px;flex-shrink:0;display:flex;flex-direction:column;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.sidebar-header{padding:1rem;border-bottom:2px solid var(--border);flex-shrink:0}.sidebar-header h3{margin:0;font-size:1rem;font-family:var(--font-heading);font-weight:700}.sidebar-task-list{flex:1;overflow-y:auto;padding:.75rem;display:flex;flex-direction:column;gap:.5rem}.timeline-container{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.timeline-scroll-area{position:relative;padding:.5rem 1rem 3rem .5rem;min-height:min-content}#timeline-slots{position:relative}#timeline-items{position:absolute;top:.5rem;left:.5rem;right:1rem;bottom:0;pointer-events:none}#timeline-items .timeline-item{pointer-events:auto}.timeline-slot{display:grid;grid-template-columns:50px 1fr;height:var(--timeline-slot-h,12px);position:relative}.timeline-slot.hour-start .timeline-slot-area{border-top:1px dashed color-mix(in srgb,var(--border) 50%,transparent)}.timeline-time{font-size:.7rem;color:var(--content-secondary);padding-right:.5rem;text-align:right;font-weight:500;transform:translateY(-.5em)}.timeline-hint{text-align:center;color:var(--content-secondary);font-size:.85rem;font-weight:600;margin:0 0 .5rem;padding:.35rem .75rem;background:var(--surface-overlay);border-radius:var(--radius-sm)}.timeline-slot-area{position:relative;cursor:grab}.timeline-slot-area:hover{background:var(--surface-overlay)}.timeline-item{position:absolute;left:60px;right:10px;border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);padding:.25rem .5rem;overflow:hidden;cursor:grab;z-index:10;transition:opacity .15s ease,box-shadow .15s ease}.timeline-item.task{background:var(--success);color:var(--content)}.timeline-item.event{background:var(--action);color:var(--content-on-action)}.timeline-item.block{opacity:.85}.timeline-item.block-free_time{background:var(--category-six);color:var(--content)}.timeline-item.block-personal{background:var(--warning);color:var(--content)}.timeline-item.block-vacation{background:var(--category-five);color:var(--content-on-action)}.timeline-item.block-focus{background:var(--danger);color:var(--content-on-action)}.timeline-item.conflict{box-shadow:0 0 0 3px var(--danger)}.timeline-item.selected{box-shadow:0 0 0 3px var(--surface-raised),0 0 0 6px var(--action)}.timeline-item-title{font-weight:600;font-size:.75rem;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.timeline-item-meta{font-size:.65rem;opacity:.85;line-height:1.1}.timeline-current-time{position:absolute;left:50px;right:0;height:2px;background:var(--danger);z-index:20;pointer-events:none}.timeline-current-time::before{content:'';position:absolute;left:-4px;top:-3px;width:8px;height:8px;background:var(--danger);border-radius:var(--radius-full)}.timeline-paint-preview{position:absolute;left:70px;right:10px;background:var(--action);opacity:.4;border:var(--border-width-sm) dashed var(--border);border-radius:var(--radius-sm);z-index:5;pointer-events:none}.timeline-item.dragging{cursor:grabbing;opacity:.8;z-index:100;box-shadow:var(--shadow-brutal-md,4px 4px 0 var(--border))}.timeline-container.is-painting{cursor:crosshair;user-select:none}.timeline-container.is-painting .timeline-slot-area{pointer-events:none}.unscheduled-task{padding:.75rem;background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-left:6px solid var(--success);border-radius:var(--radius-sm);cursor:grab;transition:background-color .1s}.unscheduled-task:hover{background:var(--surface-overlay)}.unscheduled-task.priority-high{border-left-color:var(--danger)}.unscheduled-task.priority-medium{border-left-color:var(--warning)}.unscheduled-task.priority-low{border-left-color:var(--success)}.unscheduled-task-title{font-weight:600;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.unscheduled-task-meta{font-size:.75rem;color:var(--content-secondary)}.empty-unscheduled{text-align:center;color:var(--content-secondary);padding:2rem 1rem}.shortcut-hint-btn{font-family:var(--font-mono, monospace);font-weight:700;min-width:2rem;padding:.5rem}.settings-section h3{font-size:1rem;color:var(--content)}.settings-section .form-hint{font-size:.75rem;color:var(--content-secondary)}.settings-overlay{position:fixed;inset:0;z-index:70;display:flex;align-items:center;justify-content:center;padding:var(--space-4)}.settings-overlay.hidden{display:none}.settings-overlay-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.35)}.settings-overlay-card{position:relative;background:var(--surface-page);border:1px solid var(--border);border-radius:var(--radius-lg,8px);box-shadow:0 12px 40px rgba(0,0,0,.25);width:min(960px,100%);height:min(720px,100%);max-height:calc(100vh - 2 * var(--space-4));overflow:hidden;display:flex;flex-direction:column}.settings-overlay-card.hidden{display:none}.ui-mode-mobile .settings-overlay{padding:0}.ui-mode-mobile .settings-overlay-card{width:100%;height:100%;max-height:100%;border-radius:0;border:none}.settings-page-layout{display:flex;min-height:100%}.settings-sidebar{width:200px;flex-shrink:0;border-right:1px solid var(--border);padding:1.5rem 0;display:flex;flex-direction:column;gap:.25rem}.settings-nav-items{display:flex;flex-direction:column;gap:.125rem}.settings-nav-item{background:0 0;border:none;text-align:left;padding:.5rem 1.25rem;font-size:.875rem;color:var(--content-secondary);cursor:pointer;border-radius:0;border-left:2px solid transparent}.settings-nav-item:hover{background:var(--hover-surface);color:var(--content)}.settings-nav-item.active{color:var(--content);font-weight:600;border-left-color:var(--action);background:var(--surface-overlay)}.settings-content{flex:1;padding:1.5rem 2rem;max-width:640px;overflow-y:auto}.contact-header-card{display:flex;align-items:center;gap:1.25rem;margin-bottom:1.5rem}.contact-info-section{display:flex;flex-direction:column;gap:.375rem;margin-bottom:1.5rem;padding:1rem}.contact-info-item{font-size:.875rem}.contact-dashboard-summary{display:flex;gap:1.5rem;margin-bottom:1.5rem}.contact-summary-stat{display:flex;flex-direction:column;align-items:center;padding:.75rem 1.25rem;background:var(--surface-overlay);border-radius:var(--radius-md);min-width:80px}.contact-summary-count{font-size:1.5rem;font-weight:700;color:var(--content)}.contact-summary-label{font-size:.75rem;color:var(--content-secondary);margin-top:.25rem}.contact-timeline{display:flex;flex-direction:column;gap:.25rem}.contact-timeline-item{padding:.5rem .75rem;border-radius:var(--radius-sm);cursor:pointer;font-size:.875rem}.contact-timeline-item:hover{background:var(--hover-surface)}.contact-timeline-icon{flex-shrink:0;width:2rem;text-align:center;font-size:.8rem}.contact-timeline-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.contact-timeline-date{flex-shrink:0;font-size:.75rem;color:var(--content-secondary)}.address-highlight-mirror{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;white-space:nowrap;overflow:hidden;z-index:0;display:flex;align-items:center}.addr-malformed{color:var(--danger)}.addr-contact{color:var(--action)}.addr-verified{color:var(--success)}.addr-ghost{color:var(--content-muted);opacity:.5}.sync-indicator{background:0 0;border:none;cursor:pointer;padding:.25rem .5rem;border-radius:var(--radius-sm);transition:background var(--transition-fast)}.sync-indicator:hover{background:var(--hover-surface)}.sync-dot{width:8px;height:8px;border-radius:var(--radius-full);background:var(--content-muted);transition:background var(--transition-slow);flex-shrink:0}.sync-dot.connected{background:var(--success)}.sync-dot.syncing{background:var(--info);animation:sync-pulse 1s infinite}.sync-dot.warn{background:var(--warning);border-radius:0;transform:rotate(45deg)}.sync-dot.error{background:var(--danger);border-radius:0}.sync-label{font-size:var(--font-size-sm);color:var(--content-secondary);white-space:nowrap}.ui-mode-mobile .sync-label{display:none}@keyframes sync-pulse{0%,100%{opacity:1}50%{opacity:.4}}.snooze-options{display:flex;flex-direction:column;gap:.5rem}.snooze-option{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);color:var(--content);cursor:pointer;transition:background-color .1s;text-align:left;width:100%}.snooze-option:hover{background:var(--action);color:var(--content-on-action)}.snooze-option-label{font-weight:600}.snooze-option-time{font-size:.75rem;color:var(--content-secondary)}.snooze-option:hover .snooze-option-time{color:var(--content-on-action)}.snooze-custom{margin-top:.5rem;padding-top:.5rem;border-top:2px solid var(--border)}.snooze-badge{display:inline-block;font-size:.65rem;padding:.15rem .4rem;border:var(--border-width-sm) solid var(--border);background:var(--warning);color:var(--content);font-weight:700;margin-top:.25rem}.contact-badge{display:inline-block;font-size:.65rem;padding:.15rem .4rem;border:var(--border-width-sm) solid var(--border);background:var(--action);color:var(--surface-page);font-weight:700;margin-top:.25rem}.bulk-checkbox{width:18px;height:18px;cursor:pointer;accent-color:var(--action);border:var(--border-width-sm) solid var(--border)}.task-actions-cell{text-align:right;white-space:nowrap;display:flex;align-items:center;justify-content:flex-end;gap:.5rem}.task-actions-cell .bulk-checkbox{margin-right:.5rem}.kebab-btn{font-size:1.1rem;padding:.2rem .4rem;border-radius:var(--radius-sm);color:var(--content-secondary);opacity:0;transition:opacity .15s ease}.email-item:focus-within .kebab-btn,.email-item:hover .kebab-btn,.event-row-virtual:focus-within .kebab-btn,.event-row-virtual:hover .kebab-btn,.task-row:focus-within .kebab-btn,.task-row:hover .kebab-btn{opacity:1}.kebab-btn:hover{background:var(--hover-surface)}.task-recurrence{font-size:.85rem;color:var(--content-secondary)}.task-due{white-space:nowrap}.bulk-actions-bar{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;background:var(--action);color:var(--content-on-action);border:var(--border-width) solid var(--border);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border);margin-bottom:1rem}.bulk-actions-bar.hidden{display:none}.bulk-count{font-weight:700;margin-right:1rem;font-family:var(--font-heading)}.bulk-actions-bar .btn{background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);color:var(--content)}.bulk-actions-bar .btn:hover{background:var(--surface-overlay)}.bulk-select-all{margin-left:auto}.email-checkbox-cell{padding:.75rem .5rem;display:flex;align-items:center}.email-item-with-checkbox{display:flex;align-items:flex-start}.email-item-with-checkbox .email-content{flex:1}.time-block-form{display:flex;flex-direction:column;gap:1rem}.time-block-quick-options{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem}.time-block-quick-btn.selected{background:var(--action);color:var(--content-on-action);box-shadow:inset 0 0 0 2px var(--border)}.duration-presets{display:flex;gap:.5rem;flex-wrap:wrap}.duration-preset{padding:.35rem .75rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);color:var(--content);cursor:pointer;font-size:.75rem;font-weight:600;transition:background-color .1s}.duration-preset:hover{background:var(--surface-sunken)}.duration-preset.selected{background:var(--action);color:var(--content-on-action)}.conflict-warning{padding:.75rem;background:var(--danger);border:var(--border-width) solid var(--border);color:var(--content-on-action);font-size:.875rem;font-weight:600;margin-top:.5rem}.app-body{display:flex;flex:1;min-height:0;overflow:hidden}.app-body .main-content{flex:1;min-width:0;display:flex;flex-direction:column;overflow-x:visible;overflow-y:auto}#emails-view,#events-view,#projects-view,#tasks-view{padding-bottom:2.5rem}#tasks-view{display:flex;flex-direction:column;flex:1;min-height:0}#tasks-view .bulk-actions-bar,#tasks-view .filter-bar,#tasks-view .page-header{flex-shrink:0}#events-view{display:flex;flex-direction:column;flex:1;min-height:0}#events-view .page-header{flex-shrink:0}#emails-view{display:flex;flex-direction:column;flex:1;min-height:0}.email-filter-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto auto;gap:var(--space-2);align-items:center}.email-filter-row>.form-input,.email-filter-row>.form-select{width:100%;min-width:0}.email-filter-row>.form-select{width:9rem}.contacts-filter-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:var(--space-2);align-items:center}.contacts-filter-row>.form-input{width:100%;min-width:0}.contacts-filter-row>.filter-select{width:9rem;min-width:0}.work-hours-row{display:grid;grid-template-columns:auto auto auto;gap:var(--space-2);align-items:center}.work-hours-row>.form-select{width:auto}#emails-view .bulk-actions-bar,#emails-view .page-header{flex-shrink:0}.ui-mode-desktop .saved-views-sidebar{width:200px;flex-shrink:0;background:var(--surface-raised);border-right:var(--border-width) solid var(--border);display:flex;flex-direction:column;overflow:hidden}.sidebar-section{display:flex;flex-direction:column;flex:1;min-height:0}.sidebar-section-header{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content-secondary);border-bottom:2px solid var(--border);background:var(--surface-overlay)}.btn-icon{background:0 0;border:none;color:var(--content-muted);cursor:pointer;padding:.25rem;font-size:.875rem;line-height:1}.btn-icon:hover{color:var(--content)}.pinned-views-list{flex:1;overflow-y:auto;padding:.5rem}.sidebar-empty{text-align:center;padding:1.5rem .5rem;color:var(--content-muted);font-size:.8rem}.saved-view-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;margin-bottom:.5rem;background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font-size:.85rem;font-weight:600;color:var(--content);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border);transition:transform .15s ease,box-shadow .15s ease,background-color .15s ease,color .15s ease}.saved-view-item:hover{background:var(--action);color:var(--content-on-action)}.saved-view-item.active{background:var(--action);color:var(--content-on-action);box-shadow:inset 0 0 0 2px var(--border)}.saved-view-item .view-icon{font-size:.75rem}.saved-view-item .view-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.saved-view-item .view-actions{opacity:0;transition:opacity .1s}.saved-view-item:hover .view-actions{opacity:1}.filter-actions{display:flex;gap:.5rem;margin-left:auto}.avatar{width:40px;height:40px;min-width:40px;border-radius:50%;background-color:var(--action);color:var(--content-on-action);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;font-family:var(--font-heading);border:var(--border-width-sm) solid var(--border);flex-shrink:0}.avatar--sm{width:32px;height:32px;min-width:32px;font-size:.75rem;border:none}.avatar--lg{width:60px;height:60px;min-width:60px;font-size:1.2rem}.avatar--unknown{background:var(--surface-overlay);color:var(--content-secondary)}.contact-card .card-header{display:flex;align-items:center}.contact-nickname{display:block;font-size:.85rem;color:var(--content-secondary);font-style:italic}.contact-company{display:block;font-size:.85rem;color:var(--content-secondary)}.contact-email{font-size:.85rem;color:var(--content-secondary)}.contact-detail .detail-row{margin-bottom:.5rem;font-size:.9rem}.contact-detail .contact-info-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-sunken)}.contact-detail .contact-notes{margin-bottom:1.5rem}.contact-detail .contact-notes p{margin-top:.25rem;white-space:pre-wrap;color:var(--content-secondary)}.sub-collection{margin-bottom:1.25rem}.sub-collection-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem}.sub-collection-header h4{margin:0;font-size:.95rem;font-weight:600}.sub-item{display:flex;justify-content:space-between;align-items:center;padding:.4rem 0;border-bottom:1px solid var(--surface-sunken);font-size:.9rem}.sub-item:last-child{border-bottom:none}.sub-empty{font-size:.85rem;color:var(--content-secondary);font-style:italic;padding:.25rem 0}.edit-sub-collections{border-top:1px solid var(--border);padding-top:1rem;margin-bottom:.5rem}.edit-sub-section{margin-bottom:.75rem}.edit-sub-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.25rem}.sub-item-compact{font-size:.85rem;color:var(--content-secondary);padding:.125rem 0;display:flex;align-items:center;gap:var(--space-2);justify-content:space-between}.sub-item-actions{display:inline-flex;gap:var(--space-1);flex-shrink:0}.reminder-options{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);margin-top:var(--space-2)}.reminder-option{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--content-secondary);cursor:pointer}.task-drawer{position:fixed;top:0;right:0;bottom:0;width:min(480px,100vw);background:var(--surface-page);border-left:1px solid var(--border);box-shadow:-4px 0 18px rgba(0,0,0,.18);transform:translateX(100%);transition:transform 180ms ease-out;z-index:60;display:flex;flex-direction:column;overflow:hidden}.task-drawer.visible{transform:translateX(0)}.task-drawer-header{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border);background:var(--surface-overlay);flex-shrink:0}.task-drawer-title{flex:1;margin:0;font-size:var(--font-size-lg, 1.05rem);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-drawer-close{flex-shrink:0}.task-drawer-actions{display:flex;gap:var(--space-2);flex-shrink:0}.task-drawer-content{flex:1;overflow-y:auto;padding:var(--space-4)}.task-row--active{background:var(--surface-overlay);box-shadow:inset 3px 0 0 var(--action)}.ui-mode-mobile .task-drawer{width:100vw;border-left:none}@media print{.btn,.card-badge,.context-menu,.filter-bar,.focus-section .btn,.focus-slot .btn,.header,.keyboard-hints,.modal-overlay,.pagination,.review-actions-grid,.sidebar,.tab-badge,.tab-nav,.tab-status-dot,.tabs,.toast,.virtual-scroller-spacer{display:none!important}body{background:#fff;color:#000}.main-content,.weekly-review-content{margin:0;padding:0;max-width:100%;width:100%}.view{padding:0}a{color:#000;text-decoration:underline}.data-table,.task-table{border:1px solid #333;box-shadow:none}.data-table{page-break-inside:avoid}.data-table td,.data-table th{border:1px solid #ccc;padding:.5rem;display:table-cell!important}.data-table tbody tr:hover,.task-row:hover{background:0 0}.task-list-container{height:auto!important;overflow:visible!important}.task-header-row,.task-row{grid-template-columns:1fr 100px 40px 80px 60px 80px 60px!important}.task-header-row .task-cell,.task-row .task-cell{display:block!important;border:1px solid #ccc;padding:.25rem .5rem}.view-header{page-break-after:avoid}.event-item,.focus-slot,.project-health,.reflection-prompt,.review-card,.weekly-review-content,body{background:#fff!important;color:#000!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}.review-card{border:1px solid #ccc!important;box-shadow:none!important;page-break-inside:avoid;margin-bottom:1rem}.focus-slot{border:1px solid #999!important}.focus-slot.primary{border:2px solid #f7d154!important;background:#fffbea!important}.review-grid{display:block!important}.review-card{display:inline-block;vertical-align:top;width:48%;margin-right:2%}.focus-section.full-width,.reflection-section,.week-timeline,.week-timeline-events{width:100%!important;display:block!important}.weekly-review-header{border-bottom:2px solid #333;padding-bottom:1rem;margin-bottom:1.5rem}.week-dates{font-size:1.5rem;font-weight:700}.day-dot{-webkit-print-color-adjust:exact;print-color-adjust:exact}.day-dot.completed{background:#5cb85c!important}.day-dot.event{background:#9b59b6!important}.day-dot.overdue{background:#d9534f!important}.project-health{border-left:4px solid #337ab7!important}.project-health.warning{border-left-color:#f7d154!important}.project-health.danger{border-left-color:#d9534f!important}.focus-grid{display:flex!important;gap:1rem}.focus-slot{flex:1}.reflection-prompts{display:flex!important;gap:1rem}.reflection-prompt{flex:1}.prompt-input{border:1px solid #ccc!important;min-height:80px}.focus-section{page-break-before:auto}.reflection-section{page-break-before:always}}.weekly-review-content{max-width:900px;margin:0 auto;padding:1rem}.weekly-review-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:var(--border-width-sm) solid var(--border)}.week-dates{font-family:var(--font-heading);font-size:1.25rem;font-weight:700;color:var(--content)}.review-status{padding:.25rem .75rem;border-radius:var(--radius-xs);font-size:.875rem;font-weight:600;border:var(--border-width-sm) solid var(--border)}.review-status.completed{background:var(--success);color:var(--content-on-action)}.review-status.pending{background:var(--warning);color:var(--content)}.review-status.unreviewed{background:var(--surface-overlay);color:var(--content-muted)}.event-time{font-size:.875rem;font-weight:600;color:var(--content-muted);min-width:80px}.focus-section{background:linear-gradient(135deg,var(--surface-raised) 0,color-mix(in srgb,var(--warning) 15%,var(--surface-raised)) 100%)}.tab-badge{display:inline-block;width:8px;height:8px;background:var(--danger);border-radius:var(--radius-full);margin-left:.5rem;vertical-align:middle;animation:pulse-badge 2s infinite}@keyframes pulse-badge{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(.8)}}.tab-status-dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-left:.5rem;vertical-align:middle;transition:background-color .3s ease}.tab-status-dot.status-none{display:none}.tab-status-dot.status-green{background-color:var(--success)}.tab-status-dot.status-yellow{background-color:var(--warning);animation:pulse-badge 2s ease-in-out infinite}.tab-status-dot.status-red{background-color:var(--danger);animation:pulse-badge 1.5s ease-in-out infinite}.review-grid{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;max-width:1200px;margin:0 auto}.review-card{padding:1.5rem}.review-card .card-header{align-items:center;padding-bottom:.75rem;border-bottom:var(--border-width-sm) solid var(--surface-overlay)}.review-card .card-title{display:flex;align-items:center;gap:.5rem}.review-card .card-icon{font-size:1.25rem}.review-card .card-badge{font-size:.8rem;padding:.25rem .75rem;border-radius:var(--radius-md);font-weight:600}.week-timeline{grid-column:1/-1}.timeline-visual{display:flex;gap:.5rem;margin-top:1rem}.timeline-day{flex:1;text-align:center;padding:.75rem .5rem;background:var(--surface-overlay);border-radius:var(--radius-md);border:1px solid var(--border);position:relative}.timeline-day.today{background:var(--action);color:var(--content-on-action);border-width:2px;font-weight:700}.timeline-day.past{opacity:.7}.timeline-day.future{background:var(--surface-raised)}.timeline-day .day-name{font-size:.7rem;font-weight:600;text-transform:uppercase;color:var(--content-muted)}.timeline-day .day-number{font-size:1.1rem;font-weight:700}.day-dots{display:flex;justify-content:center;gap:3px;margin-top:.5rem;min-height:8px}.day-dot{width:8px;height:8px;border-radius:var(--radius-full)}.day-dot.task{background:var(--action)}.day-dot.event{background:var(--category-five)}.day-dot.completed{background:var(--success)}.day-dot.overdue{background:var(--danger)}.day-dot.vacation-off{background:var(--content-muted);opacity:.5;width:12px;height:4px;border-radius:2px}.day-events{display:flex;flex-direction:column;gap:2px;margin-top:.5rem;text-align:left}.day-event{font-size:.6rem;line-height:1.3;padding:1px 4px;border-left:2px solid var(--category-five);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--content-secondary)}.day-event .event-time{font-size:.55rem;font-weight:600;color:var(--category-five);margin-right:2px;min-width:auto}.day-event-more{font-size:.55rem;color:var(--content-muted);padding:1px 4px;font-style:italic}.week-timeline-events{grid-column:1/-1}.timeline-events-day{margin-bottom:.75rem}.timeline-events-day:last-child{margin-bottom:0}.timeline-events-day-label{font-family:var(--font-heading);font-size:.8rem;font-weight:700;color:var(--content-secondary);margin-bottom:.25rem;text-transform:uppercase}.vacation-toggles-section{margin-top:1rem;padding-top:1rem;border-top:2px solid var(--border)}.vacation-toggles-section h3{margin:0 0 .75rem 0;font-size:.9rem;font-family:var(--font-heading);font-weight:700}.vacation-toggles{display:flex;gap:.5rem}.vacation-toggle{width:2.5rem;height:2.5rem;border-radius:var(--radius-sm);border:var(--border-width) solid var(--border);background:var(--surface-overlay);font-family:var(--font-heading);font-weight:700;font-size:.8rem;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast);display:flex;align-items:center;justify-content:center}.vacation-toggle:hover{background:var(--hover-surface)}.vacation-toggle.active{background:var(--category-five);color:var(--content-on-action);border-color:var(--category-five)}.timeline-day.vacation{opacity:.5}.timeline-day.vacation .day-name{text-decoration:line-through}.vacation-day-banner{text-align:center;padding:.5rem 1rem;background:color-mix(in srgb,var(--category-five) 15%,var(--surface-overlay));border:var(--border-width-sm) solid var(--category-five);border-radius:var(--radius-sm);font-family:var(--font-heading);font-weight:700;font-size:.85rem;color:var(--category-five);margin-bottom:.75rem}.stats-row{display:flex;gap:1rem;margin-bottom:1rem}.stat-box{flex:1;text-align:center;padding:1rem;background:var(--surface-overlay);border-radius:var(--radius-md)}.stat-box .stat-number{font-family:var(--font-heading);font-size:2rem;font-weight:800;line-height:1}.stat-box .stat-number.green{color:var(--success)}.stat-box .stat-number.red{color:var(--danger)}.stat-box .stat-number.blue{color:var(--action)}.stat-box .stat-number.purple{color:var(--category-five)}.stat-box .stat-label{font-size:.75rem;text-transform:uppercase;color:var(--content-muted);font-weight:600;margin-top:.25rem}.task-list{list-style:none;max-height:200px;overflow-y:auto}.task-item{display:flex;align-items:center;gap:.75rem;padding:.75rem;margin-bottom:.5rem;background:var(--surface-overlay);border-radius:var(--radius-md);cursor:pointer;transition:background-color var(--transition-normal)}.task-item:hover{background:var(--action);color:var(--content-on-action)}.task-item.completed{opacity:.6;text-decoration:line-through}.task-checkbox{width:20px;height:20px;border:2px solid var(--border);border-radius:var(--radius-xs);display:flex;align-items:center;justify-content:center;flex-shrink:0}.task-checkbox.checked{background:var(--success);color:var(--content-on-action)}.task-text{flex:1;font-size:.9rem}.task-project{font-size:.75rem;padding:.2rem .5rem;background:var(--surface-raised);border-radius:var(--radius-xs);color:var(--content-muted)}.task-due{font-size:.75rem;color:var(--content-muted)}.task-due.overdue{color:var(--danger);font-weight:600}.focus-section.full-width{grid-column:1/-1}.scope-slots{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem;margin-top:1rem}.scope-slot{padding:1.25rem;background:var(--surface-overlay);border:2px dashed var(--border);border-radius:var(--radius-md);min-height:100px;display:flex;flex-direction:column;gap:.5rem;transition:background .15s,border-color .15s}.scope-slot.filled{border-style:solid;background:var(--surface-raised)}.scope-slot.empty{cursor:pointer}.scope-slot.empty:hover{border-color:var(--action);background:var(--surface-sunken)}.scope-slot-label{font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;color:var(--content-muted);font-weight:600}.scope-slot-title{font-weight:600;font-size:.95rem}.scope-slot-meta{font-size:.8rem;color:var(--content-secondary)}.scope-slot-empty{color:var(--content-muted);font-style:italic;font-size:.9rem}.focus-slot.primary{border-color:var(--warning);background:linear-gradient(135deg,var(--surface-raised) 0,color-mix(in srgb,var(--warning) 10%,var(--surface-raised)) 100%)}.projects-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;margin-top:.5rem}.project-health{padding:.75rem;background:var(--surface-overlay);border-radius:var(--radius-md);border-left:4px solid var(--action)}.project-health.warning{border-left-color:var(--warning)}.project-health.danger{border-left-color:var(--danger)}.project-name{font-weight:600;font-size:.85rem;margin-bottom:.25rem}.project-stats{font-size:.75rem;color:var(--content-muted)}.reflection-section{grid-column:1/-1}.reflection-prompts{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin-top:1rem}.reflection-prompt{padding:1rem;background:var(--surface-overlay);border-radius:var(--radius-md)}.prompt-label{font-size:.8rem;font-weight:600;color:var(--content-secondary);margin-bottom:.5rem}.prompt-input,.reflection-textarea{width:100%;padding:.75rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-md);font-size:.9rem;font-family:inherit;resize:none;background:var(--surface-raised)}.prompt-input:focus,.reflection-textarea:focus{outline:0;border-color:var(--action)}.review-actions-grid{grid-column:1/-1;display:flex;justify-content:flex-end;gap:1rem;padding-top:1rem}.event-item{display:flex;align-items:center;gap:.75rem;padding:.75rem;margin-bottom:.5rem;background:var(--surface-overlay);border-radius:var(--radius-md);border-left:3px solid var(--category-five)}.event-item .event-time{font-size:.8rem;font-weight:600;color:var(--category-five);min-width:100px}.event-item .event-title{flex:1;font-size:.9rem}.accomplishment-highlight{background:linear-gradient(135deg,color-mix(in srgb,var(--success) 10%,var(--surface-raised)) 0,color-mix(in srgb,var(--success) 5%,var(--surface-raised)) 100%);border:2px solid var(--success);padding:1rem;border-radius:var(--radius-md);margin-bottom:1rem;display:flex;align-items:center;gap:1rem}.accomplishment-icon{font-size:2rem}.accomplishment-text{font-size:1rem}.accomplishment-text strong{color:var(--success)}.task-list::-webkit-scrollbar{width:6px}.task-list::-webkit-scrollbar-track{background:var(--surface-overlay);border-radius:var(--radius-xs)}.task-list::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-xs)}.ui-mode-mobile .review-grid{grid-template-columns:1fr}.ui-mode-mobile .focus-section.full-width,.ui-mode-mobile .reflection-section,.ui-mode-mobile .week-timeline,.ui-mode-mobile .week-timeline-events{grid-column:1}.ui-mode-mobile .focus-grid{grid-template-columns:1fr}.ui-mode-mobile .reflection-prompts{grid-template-columns:1fr}.ui-mode-mobile .projects-grid{grid-template-columns:1fr 1fr}.ui-mode-mobile .stat-cards{flex-direction:column}.ui-mode-mobile .stat-card{max-width:none}.ui-mode-mobile .week-info{flex-direction:column;align-items:flex-start;gap:.5rem}.ui-mode-mobile .projects-grid{grid-template-columns:1fr}.focus-slot{transition:background-color .2s ease-out,border-color .2s ease-out}.focus-slot.filled{animation:focusSlotFill .3s ease-out}@keyframes focusSlotFill{0%{transform:scale(.95);opacity:.7}100%{transform:scale(1);opacity:1}}.focus-slot:focus,.focus-slot:focus-within{outline:2px solid var(--action);outline-offset:2px}.focus-slot[tabindex]:focus{outline:2px solid var(--action);outline-offset:2px}.focus-section .btn{transition:transform .15s ease-out,opacity .15s ease-out}.focus-section .btn:active{transform:scale(.97)}.monthly-review-nav,.weekly-review-nav{display:flex;align-items:center;gap:.5rem}.weekly-review-nav .week-dates{font-family:var(--font-heading);font-size:1.25rem;font-weight:700;color:var(--content);margin-left:.5rem}.monthly-review-month-display{font-family:var(--font-heading);font-size:1.25rem;font-weight:700;color:var(--content);margin-left:.5rem}.monthly-review-content{max-width:900px;margin:0 auto;padding:1rem}.month-heatmap{margin-bottom:1.5rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-md);padding:1rem;background:var(--surface-overlay)}.month-heatmap-header{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;margin-bottom:.5rem}.month-heatmap-day-header{font-family:var(--font-heading);font-size:.75rem;font-weight:600;color:var(--content-secondary);text-transform:uppercase}.month-heatmap-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px}.month-heatmap-cell{aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:var(--radius-xs);cursor:pointer;transition:transform .1s ease;border:var(--border-width-sm) solid transparent;position:relative;min-height:40px}.month-heatmap-cell:not(.empty):hover{transform:scale(1.1);border-color:var(--border);z-index:1}.month-heatmap-cell.empty{cursor:default;background:0 0}.month-heatmap-cell.intensity-0{background:var(--surface-page)}.month-heatmap-cell.intensity-1{background:color-mix(in srgb,var(--success) 20%,var(--surface-page))}.month-heatmap-cell.intensity-2{background:color-mix(in srgb,var(--success) 40%,var(--surface-page))}.month-heatmap-cell.intensity-3{background:color-mix(in srgb,var(--success) 60%,var(--surface-page))}.month-heatmap-cell.vacation{background:var(--surface-sunken);opacity:.6}.month-heatmap-cell.today{border-color:var(--action);border-width:2px}.month-heatmap-cell.past.intensity-0{background:var(--surface-sunken)}.month-heatmap-day-number{font-family:var(--font-heading);font-size:.8rem;font-weight:600;color:var(--content)}.month-heatmap-dots{display:flex;gap:2px;margin-top:2px}.month-dot{font-size:.6rem;font-weight:700;border-radius:var(--radius-xs);padding:0 3px;line-height:1.3}.month-dot.completed{color:var(--success)}.month-dot.event{color:var(--category-five)}.monthly-review-cards{display:grid;grid-template-columns:1fr 1fr;gap:1rem}.review-card.month-stats-card{grid-column:span 1}.review-card.month-goals-card{margin-bottom:1rem}.review-card.month-patterns-card,.review-card.month-pulse-card{grid-column:span 1}.review-card.month-reflection-card{grid-column:1/-1}.review-card-title{font-family:var(--font-heading);font-size:1rem;font-weight:700;margin-bottom:.75rem;color:var(--content)}.month-stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.month-stat-item{display:flex;flex-direction:column;align-items:center;padding:.5rem;border-radius:var(--radius-xs);background:var(--surface-page);border:var(--border-width-sm) solid var(--border)}.month-stat-value{font-family:var(--font-heading);font-size:1.5rem;font-weight:700;color:var(--content)}.month-stat-label{font-size:.75rem;color:var(--content-secondary);text-transform:uppercase;font-weight:600}.month-stats-highlights{display:flex;gap:1rem;margin-top:.5rem;justify-content:center}.stat-highlight{font-size:.8rem;color:var(--content-secondary)}.month-pulse-list{display:flex;flex-direction:column;gap:.5rem}.month-pulse-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;border-radius:var(--radius-xs);background:var(--surface-page);border:var(--border-width-sm) solid var(--border)}.pulse-name{font-weight:600;flex:1;font-size:.875rem}.pulse-stats{font-size:.75rem;color:var(--content-secondary)}.pulse-arrow{font-size:1rem;font-weight:700}.month-pulse-item.positive .pulse-arrow{color:var(--success)}.month-pulse-item.negative .pulse-arrow{color:var(--danger)}.month-pulse-item.neutral .pulse-arrow{color:var(--content-secondary)}.month-goal-body{display:flex;align-items:center;gap:.5rem;flex:1}.month-goal-item.done{opacity:.7}.month-goal-item.done .month-goal-text{text-decoration:line-through}.month-goal-item.abandoned{opacity:.5}.month-goal-item.abandoned .month-goal-text{text-decoration:line-through}.month-goal-status-btn{font-size:1rem;padding:0;color:var(--content-secondary);width:24px;text-align:center}.month-goal-item.done .month-goal-status-btn{color:var(--success)}.month-goal-item.abandoned .month-goal-status-btn{color:var(--danger)}.month-goal-text{flex:1;font-size:.875rem}.month-goal-delete-btn{color:var(--content-muted);padding:0 4px;font-size:.75rem;opacity:0;transition:opacity .15s}.month-goal-item:hover .month-goal-delete-btn{opacity:1}.month-goal-placeholder{color:var(--content-muted);font-size:.875rem}.month-reflection-fields{display:flex;flex-direction:column;gap:.5rem}.month-reflection-label{font-size:.875rem;font-weight:600;color:var(--content-secondary)}.month-reflection-textarea{width:100%;padding:.5rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-xs);background:var(--surface-page);color:var(--content);font-family:var(--font-body);font-size:.875rem;resize:vertical}.month-reflection-textarea:focus{outline:2px solid var(--action);outline-offset:-1px}.month-patterns-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:.5rem}.month-pattern-item{font-size:.875rem;color:var(--content-secondary);padding:.5rem;background:var(--surface-page);border-radius:var(--radius-xs);border:var(--border-width-sm) solid var(--border)}.ui-mode-mobile .monthly-review-cards{grid-template-columns:1fr}.ui-mode-mobile .review-card.month-goals-card,.ui-mode-mobile .review-card.month-patterns-card,.ui-mode-mobile .review-card.month-pulse-card,.ui-mode-mobile .review-card.month-stats-card{grid-column:span 1}.ui-mode-mobile .month-heatmap-cell{min-height:32px}.ui-mode-mobile .month-heatmap-day-number{font-size:.7rem}.ui-mode-mobile .month-heatmap-dots{display:none}.import-wizard{display:flex;flex-direction:column;gap:1.5rem}.import-step{padding:1rem;background:var(--surface-overlay);border:var(--border-width) solid var(--border);border-radius:var(--radius-md)}.import-step h3{margin:0 0 1rem 0;font-size:var(--font-size-md);font-weight:600}.plugin-selector{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:.75rem}.plugin-option{display:flex;flex-direction:column;align-items:flex-start;padding:.75rem 1rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);cursor:pointer;text-align:left;transition:border-color var(--transition-fast),background var(--transition-fast)}.plugin-option:hover{border-color:var(--action);background:var(--hover-surface)}.plugin-option.selected{border-color:var(--action);background:color-mix(in srgb,var(--action) 10%,var(--surface-raised));box-shadow:0 0 0 2px color-mix(in srgb,var(--action) 30%,transparent)}.plugin-option .plugin-name{font-weight:600;margin-bottom:.25rem}.plugin-option .plugin-meta{display:flex;gap:.5rem;font-size:var(--font-size-sm);color:var(--content-muted);margin-bottom:.25rem}.plugin-option .plugin-extensions{color:var(--category-six)}.plugin-option .plugin-types{color:var(--content-secondary)}.plugin-option .plugin-description{font-size:var(--font-size-sm);color:var(--content-secondary);line-height:1.4}.file-selector{display:flex;align-items:center;gap:1rem}.selected-file-name{color:var(--content-secondary);font-family:monospace;font-size:var(--font-size-sm)}.import-preview-container{min-height:100px}.import-preview-table-wrapper{max-height:300px;overflow:auto;border:1px solid var(--border);border-radius:var(--radius-sm)}.import-preview-table{font-size:var(--font-size-sm);margin:0}.import-preview-table th{position:sticky;top:0;background:var(--surface-overlay);z-index:1}.import-preview-table td{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.import-summary{margin:0 0 .75rem 0;color:var(--content)}.import-more{margin:.5rem 0 0 0;color:var(--content-muted);font-style:italic;font-size:var(--font-size-sm)}.import-empty,.import-error{padding:2rem;text-align:center;color:var(--content-muted)}.import-error{color:var(--danger)}.import-warnings{margin-top:1rem;padding:.75rem;background:color-mix(in srgb,var(--warning) 10%,var(--surface-raised));border:1px solid var(--warning);border-radius:var(--radius-sm);font-size:var(--font-size-sm)}.import-warnings ul{margin:.5rem 0 0 1.25rem;padding:0}.import-warnings li{margin-bottom:.25rem}.import-external-types{display:flex;gap:1rem;margin-bottom:1.5rem}.import-type-card{flex:1;display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1.5rem 1rem;background:var(--surface-raised);border:2px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color .15s,background .15s}.import-type-card:hover{border-color:var(--action);background:var(--surface-overlay)}.import-type-icon{font-size:2rem}.import-type-label{font-weight:600;color:var(--content)}.import-type-desc{font-size:var(--font-size-sm);color:var(--content-muted)}.plugin-list{display:flex;flex-direction:column;gap:.75rem}.plugin-item{display:flex;justify-content:space-between;align-items:center;padding:1rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md)}.plugin-item .plugin-info{flex:1}.plugin-item .plugin-name{font-weight:600}.plugin-item .plugin-version{color:var(--content-muted);font-size:var(--font-size-sm);margin-left:.5rem}.plugin-item .plugin-description{margin:.25rem 0;color:var(--content-secondary);font-size:var(--font-size-sm)}.plugin-item .plugin-extensions{font-size:var(--font-size-xs);color:var(--content-muted)}.plugin-item .plugin-actions{margin-left:1rem}.toggle-switch{position:relative;display:inline-block;width:44px;height:24px}.toggle-switch input{opacity:0;width:0;height:0}.toggle-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:var(--surface-sunken);border:2px solid var(--border);border-radius:var(--radius-xl);transition:background-color var(--transition-fast),border-color var(--transition-fast)}.toggle-slider:before{position:absolute;content:"";height:16px;width:16px;left:2px;bottom:2px;background-color:var(--content-muted);border-radius:var(--radius-full);transition:transform var(--transition-fast),background-color var(--transition-fast)}.toggle-switch input:checked+.toggle-slider{background-color:var(--action);border-color:var(--action)}.toggle-switch input:checked+.toggle-slider:before{transform:translateX(20px);background-color:var(--surface-raised)}.toggle-switch input:focus+.toggle-slider{box-shadow:0 0 0 2px color-mix(in srgb,var(--action) 30%,transparent)}.milestones-section{margin-bottom:1.5rem}.milestones-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:2px solid var(--border)}.milestones-header h3{margin:0;font-size:1rem;font-family:var(--font-heading);font-weight:700}.milestone-card{background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);padding:1rem;margin-bottom:.75rem;transition:background-color .1s;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.milestone-card:hover{background:var(--surface-overlay)}.milestone-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.5rem}.milestone-card-header h4{margin:0;font-size:.95rem;font-family:var(--font-heading);font-weight:700}.milestone-card-header .milestone-status{font-size:.7rem;font-weight:700;text-transform:uppercase;padding:.15rem .4rem;border-radius:var(--radius-sm);background:var(--surface-overlay);color:var(--content-muted)}.milestone-card-header .milestone-status.completed{background:color-mix(in srgb,var(--success) 15%,var(--surface-overlay));color:var(--success)}.milestone-meta{display:flex;gap:1rem;font-size:.8rem;color:var(--content-muted);margin-bottom:.5rem}.milestone-progress{height:6px;background:var(--surface-overlay);border-radius:var(--radius-full);overflow:hidden;border:var(--border-width-sm) solid var(--border)}.milestone-progress-fill{height:100%;background:var(--success);border-radius:var(--radius-full);transition:width var(--transition-fast)}.milestone-actions{display:flex;gap:.5rem;margin-top:.5rem}.milestone-actions button{font-size:.75rem;padding:.2rem .5rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);cursor:pointer;color:var(--content-secondary);transition:background var(--transition-fast)}.milestone-actions button:hover{background:var(--hover-surface)}.milestone-actions button.danger:hover{background:color-mix(in srgb,var(--danger) 15%,var(--surface-overlay));color:var(--danger)}button.milestone-reorder-btn.btn{font-size:.65rem;padding:.15rem .35rem;line-height:1;min-width:1.5rem;text-align:center}.milestones-completed-section{margin-top:.75rem}.milestones-completed-toggle{font-size:.8rem;color:var(--content-secondary);padding:.25rem 0}.milestone-card-summary{padding:.5rem .75rem;opacity:.7}.milestone-card-summary .milestone-info{display:flex;align-items:center;gap:.5rem}.milestone-complete-badge{font-size:.7rem;font-weight:700;padding:.1rem .4rem;border-radius:var(--radius-sm);background:color-mix(in srgb,var(--success) 15%,var(--surface-overlay));color:var(--success)}.mobile-tab-bar{display:none;position:fixed;bottom:0;left:0;right:0;z-index:1100;background:var(--surface-raised);border-top:var(--border-width) solid var(--border);padding-bottom:env(safe-area-inset-bottom,0);height:calc(52px + env(safe-area-inset-bottom,0px))}.mobile-tab{flex:1;display:flex;align-items:center;justify-content:center;height:52px;background:0 0;border:none;color:var(--content-muted);font-size:.7rem;font-weight:700;font-family:var(--font-sans);text-transform:uppercase;letter-spacing:.05em;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:color .15s ease}.mobile-tab.active{color:var(--action)}.mobile-tab:active{background:var(--surface-overlay)}.mobile-tab-create{font-size:1.4rem;font-weight:400;color:var(--success);letter-spacing:0;text-transform:none}.mobile-tab-slide-menu{position:fixed;z-index:1102;min-width:140px;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);padding:.25rem;display:flex;flex-direction:column;opacity:0;transform:scale(.92);transform-origin:50% 100%;transition:opacity 120ms ease-out,transform 120ms ease-out}.mobile-tab-slide-menu.is-open{opacity:1;transform:scale(1)}.mobile-tab-slide-item{padding:.7rem .9rem;min-height:44px;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-sm);font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content);border-radius:var(--radius-sm);transition:background 80ms ease,transform 80ms ease}.mobile-tab-slide-item.is-highlighted{background:var(--action);color:var(--content-on-action);transform:scale(1.03)}.action-sheet{position:fixed;inset:0;z-index:10001;display:flex;flex-direction:column;justify-content:flex-end}.action-sheet.hidden{display:none}.action-sheet-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.4)}.action-sheet-container{position:relative;background:var(--surface-raised);border-top:var(--border-width) solid var(--border);border-radius:var(--radius-lg) var(--radius-lg) 0 0;padding:.5rem 1rem calc(.5rem + env(safe-area-inset-bottom,0px));max-height:60vh;overflow-y:auto;animation:sheetSlideUp .25s ease-out}.action-sheet-handle{width:36px;height:4px;border-radius:2px;background:var(--content-muted);margin:0 auto .75rem;opacity:.4}.action-sheet-content button{display:flex;align-items:center;gap:.75rem;width:100%;padding:.875rem .5rem;background:0 0;border:none;border-bottom:1px solid var(--surface-overlay);font-size:var(--font-size-base);font-weight:600;color:var(--content);text-align:left;cursor:pointer}.action-sheet-content button:last-child{border-bottom:none}.action-sheet-content button:active{background:var(--surface-overlay)}.action-sheet-content button.danger{color:var(--danger)}.action-sheet-cancel{display:block;width:100%;padding:.875rem;margin-top:.5rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-md);font-size:var(--font-size-base);font-weight:700;color:var(--content);text-align:center;cursor:pointer}.action-sheet-cancel:active{background:var(--surface-sunken)}.modal-drag-handle{display:none;width:36px;height:4px;border-radius:2px;background:var(--content-muted);margin:.5rem auto 0;opacity:.4}.mobile-sort-bar{display:none;gap:.5rem;padding:.5rem 0;align-items:center}.mobile-sort-bar select{flex:1;font-size:var(--font-size-sm)}.mobile-filter-toggle{display:none}.swipe-actions-container{position:relative;overflow:hidden}.swipe-actions-bg{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding:0 1rem;font-weight:700;font-size:var(--font-size-sm);color:var(--content-on-action)}.swipe-actions-bg.swipe-left{right:0;background:var(--success)}.swipe-actions-bg.swipe-right{left:0;background:var(--danger)}.swipe-content{position:relative;background:var(--surface-raised);transition:transform .15s ease}.pull-to-refresh-indicator{display:none;text-align:center;padding:.75rem;font-size:var(--font-size-sm);color:var(--content-muted);font-weight:600}.pull-to-refresh-indicator.visible{display:block}.event-date-group-header{display:none}.day-plan-sidebar-toggle{display:none}@keyframes sheetSlideUp{from{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sheetSlideDown{from{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes dialFadeIn{from{opacity:0}to{opacity:1}}.ui-mode-mobile body,html.ui-mode-mobile{overflow-x:hidden;max-width:100vw;touch-action:pan-y;overscroll-behavior-x:none}.ui-mode-mobile body{padding-top:env(safe-area-inset-top,0);padding-bottom:calc(52px + env(safe-area-inset-bottom,0px));padding-left:env(safe-area-inset-left,0);padding-right:env(safe-area-inset-right,0)}.ui-mode-mobile .mobile-tab-bar,.ui-mode-mobile .timer-widget{padding-left:env(safe-area-inset-left,0);padding-right:env(safe-area-inset-right,0)}.ui-mode-mobile .mobile-tab-bar{display:flex}.ui-mode-mobile .tab-navigation{display:none!important}.ui-mode-mobile .app-header{display:none}.ui-mode-mobile .pill-nav{display:none}.ui-mode-mobile #contacts-view .page-header>.row-flex,.ui-mode-mobile #emails-view>div.row-flex.mb-2,.ui-mode-mobile #tasks-view .mobile-sort-bar,.ui-mode-mobile #tasks-view .page-header>.row-flex{display:grid;grid-auto-flow:row;grid-template-columns:repeat(2,1fr);gap:var(--space-2);align-items:center}.ui-mode-mobile #tasks-view .page-header>.row-flex{grid-template-columns:1fr}.ui-mode-mobile .mobile-hide{display:none!important}.ui-mode-mobile #day-review-status-badge,.ui-mode-mobile #month-review-status-badge,.ui-mode-mobile #week-review-status-badge{display:none!important}.ui-mode-mobile #day-plan-view .timeline-hint{display:none}.ui-mode-mobile #day-plan-view .timeline-slot-area{cursor:default}.ui-mode-mobile #day-plan-view .timeline-slot-area:hover{background:0 0}.ui-mode-mobile #day-plan-view .day-plan-nav{display:flex;flex-wrap:wrap;column-gap:var(--space-2);row-gap:var(--space-3);align-items:center}.ui-mode-mobile #day-plan-view .day-plan-nav .btn{flex:0 0 auto;border-radius:var(--radius-sm);border-right-width:var(--border-width)}.ui-mode-mobile #day-plan-view .day-plan-nav .day-plan-date-picker{flex:1 1 120px;min-width:0}.ui-mode-mobile #day-plan-view .day-plan-date-display{display:none}.ui-mode-mobile #contacts-search,.ui-mode-mobile #email-search{grid-column:1/-1;width:100%;min-width:0}.ui-mode-mobile #email-count{display:none}.ui-mode-mobile #contacts-view .page-header>.row-flex .btn,.ui-mode-mobile #tasks-view .page-header>.row-flex .btn{border-radius:var(--radius-sm);border-right-width:var(--border-width)}.ui-mode-mobile #tasks-view .page-header .view-toggle{display:flex;width:100%}.ui-mode-mobile #tasks-view .page-header .view-toggle .view-toggle-btn{flex:1 1 0}.ui-mode-mobile .tab-group>.subview>.page-header{position:static}.ui-mode-mobile .main-content{padding:.75rem}.ui-mode-mobile .page-header{flex-wrap:wrap;gap:.5rem}.ui-mode-mobile .page-header .btn-primary{display:none}.ui-mode-mobile .page-title{display:none}.ui-mode-mobile #contacts-view .page-header>div,.ui-mode-mobile #emails-view .page-header>div,.ui-mode-mobile .page-header>div{gap:0!important;flex-wrap:wrap}.ui-mode-mobile #contacts-view .page-header>div .btn,.ui-mode-mobile #emails-view .page-header>div .btn,.ui-mode-mobile .bulk-actions-bar .btn,.ui-mode-mobile .page-header>div .btn{flex:1 1 0;min-width:0;padding:.4rem .5rem;font-size:.75rem;border-radius:0;border-right-width:0;white-space:nowrap}.ui-mode-mobile #contacts-view .page-header>div .btn:first-child,.ui-mode-mobile #emails-view .page-header>div .btn:first-child,.ui-mode-mobile .bulk-actions-bar .btn:first-of-type,.ui-mode-mobile .page-header>div .btn:first-child{border-top-left-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.ui-mode-mobile #contacts-view .page-header>div .btn:has(+ .btn-primary),.ui-mode-mobile #contacts-view .page-header>div .btn:last-child,.ui-mode-mobile #emails-view .page-header>div .btn:has(+ .btn-primary),.ui-mode-mobile #emails-view .page-header>div .btn:last-child,.ui-mode-mobile .page-header>div .btn:has(+ .btn-primary),.ui-mode-mobile .page-header>div .btn:last-child{border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm);border-right-width:var(--border-width)}.ui-mode-mobile .bulk-actions-bar{gap:0}.ui-mode-mobile .bulk-actions-bar .bulk-count{margin-right:.5rem}.ui-mode-mobile .bulk-actions-bar .btn:not(.bulk-select-all)+.bulk-select-all{border-right-width:var(--border-width);border-radius:var(--radius-sm)}.ui-mode-mobile .bulk-actions-bar .btn:not(.bulk-select-all):nth-last-of-type(2){border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm);border-right-width:var(--border-width)}.ui-mode-mobile .bulk-select-all{margin-left:auto}.ui-mode-mobile #emails-view .form-select[id^=email-]{min-width:0!important;flex:1}.ui-mode-mobile .form-input,.ui-mode-mobile .form-select,.ui-mode-mobile .form-textarea{padding:.45rem .65rem}.ui-mode-mobile .form-textarea{min-height:72px}.ui-mode-mobile .form-group{margin-bottom:.75rem}.ui-mode-mobile .form-label{margin-bottom:.25rem}.ui-mode-mobile .form-actions{gap:.5rem;margin-top:1rem}.ui-mode-mobile .quick-add-input{padding:.55rem .75rem}.ui-mode-mobile .quick-add{gap:.5rem;margin-bottom:1rem}.ui-mode-mobile .bulk-modal-option-btn,.ui-mode-mobile .snooze-option{padding:.55rem .75rem}.ui-mode-mobile .snooze-options{gap:.35rem}.ui-mode-mobile .modal-header{padding:.6rem .9rem}.ui-mode-mobile .modal-header h2,.ui-mode-mobile .modal-title{font-size:1.05rem}.ui-mode-mobile .modal-content{padding:.9rem}.ui-mode-mobile .modal-content form>.form-actions:last-child,.ui-mode-mobile .modal-content>.form-actions:last-child{margin-top:.9rem;padding-top:.5rem}.ui-mode-mobile .modal-overlay{align-items:flex-end;bottom:calc(52px + env(safe-area-inset-bottom,0px))}.ui-mode-mobile .modal-container{width:100%!important;max-width:100%!important;max-height:calc(100vh - 52px - env(safe-area-inset-bottom,0px) - env(safe-area-inset-top,0px));border-radius:var(--radius-lg) var(--radius-lg) 0 0;margin:0;border-bottom:none;padding-bottom:0}.ui-mode-mobile .modal-container.modal-large{max-width:100%!important;width:100%!important;max-height:calc(100vh - 52px - env(safe-area-inset-bottom,0px) - env(safe-area-inset-top,0px));border-radius:var(--radius-lg) var(--radius-lg) 0 0}.ui-mode-mobile .modal-drag-handle{display:block}.ui-mode-mobile .modal-header{padding:.75rem 1rem}.ui-mode-mobile .modal-content{padding:1rem}@keyframes modalSlideInMobile{from{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes modalSlideOutMobile{from{transform:translateY(0)}to{transform:translateY(100%)}}.ui-mode-mobile .modal-container{animation-name:modalSlideInMobile}.ui-mode-mobile .modal-overlay.closing .modal-container{animation-name:modalSlideOutMobile}.ui-mode-mobile .toast,.ui-mode-mobile .toast-undo{bottom:calc(env(safe-area-inset-bottom,0px) + 4.5rem)!important;left:1rem!important;right:1rem!important;max-width:none!important}.ui-mode-mobile .task-table{border:none;box-shadow:none;background:0 0}.ui-mode-mobile .task-header-row{display:none!important}.ui-mode-mobile .task-row{display:flex!important;flex-direction:column;gap:.25rem;padding:.75rem 1rem;margin-bottom:.5rem;background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-md);border-left:4px solid var(--content-muted)}.ui-mode-mobile .task-row.task-pending{border-left-color:var(--content-muted)}.ui-mode-mobile .task-row .task-cell.priority-h~.task-cell:first-child,.ui-mode-mobile .task-row:has(.priority-h){border-left-color:var(--danger)}.ui-mode-mobile .task-row:has(.priority-m){border-left-color:var(--warning)}.ui-mode-mobile .task-row:has(.priority-l){border-left-color:var(--content-muted)}.ui-mode-mobile .task-row .task-cell{display:flex!important;overflow:visible;padding:0}.ui-mode-mobile .task-cell.task-description{font-weight:600;font-size:var(--font-size-base)}.ui-mode-mobile .task-cell.task-due,.ui-mode-mobile .task-cell.task-project{font-size:var(--font-size-sm);color:var(--content-secondary)}.ui-mode-mobile .task-row .task-cell.task-project::before{content:none}.ui-mode-mobile .task-cell.task-progress,.ui-mode-mobile .task-cell.task-recurrence,.ui-mode-mobile .task-row .task-cell:nth-child(3){display:none!important}.ui-mode-mobile .task-cell.task-project{order:2}.ui-mode-mobile .task-cell.task-due{order:3}.ui-mode-mobile .task-cell.task-description{order:1}.ui-mode-mobile .task-cell.task-actions-cell{order:4;justify-content:flex-end}.ui-mode-mobile .task-cell.task-progress:has(.progress-bar-container){display:flex!important;order:5}.ui-mode-mobile .task-actions-cell .bulk-checkbox{display:none}.ui-mode-mobile .kebab-btn{opacity:1}.ui-mode-mobile .mobile-sort-bar{display:flex}.ui-mode-mobile .mobile-filter-toggle{display:inline-flex;align-items:center;gap:.25rem;padding:.5rem .75rem;background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);font-size:var(--font-size-sm);font-weight:600;cursor:pointer}.ui-mode-mobile .filter-bar{display:none!important}.ui-mode-mobile .filter-bar.mobile-visible{display:flex!important;flex-direction:column;position:fixed;bottom:calc(52px + env(safe-area-inset-bottom,0px));left:0;right:0;background:var(--surface-raised);border-top:var(--border-width) solid var(--border);border-radius:var(--radius-lg) var(--radius-lg) 0 0;padding:1rem;z-index:1050;box-shadow:0 -4px 12px rgba(0,0,0,.1)}.ui-mode-mobile .event-header-row{display:none!important}.ui-mode-mobile .event-row-virtual{display:flex!important;flex-direction:column;gap:.125rem;padding:.75rem 1rem;border-bottom:1px solid var(--surface-overlay)}.ui-mode-mobile .event-cell-date{font-weight:700;font-size:var(--font-size-sm);color:var(--content-secondary)}.ui-mode-mobile .event-cell-time{font-size:var(--font-size-sm);color:var(--content-muted)}.ui-mode-mobile .event-cell-title{font-weight:600;font-size:var(--font-size-base)}.ui-mode-mobile .event-cell-location{font-size:var(--font-size-sm);color:var(--content-secondary)}.ui-mode-mobile .event-date-group-header{display:flex;position:sticky;top:0;z-index:5;padding:.5rem 1rem;background:var(--surface-overlay);font-weight:700;font-size:var(--font-size-sm);text-transform:uppercase;letter-spacing:.05em;color:var(--content);border-bottom:var(--border-width-sm) solid var(--border)}.ui-mode-mobile .email-item{padding:.625rem .75rem}.ui-mode-mobile .email-from{font-size:var(--font-size-sm)}.ui-mode-mobile .email-subject{font-size:var(--font-size-base)}.ui-mode-mobile .email-preview{display:none}.ui-mode-mobile .email-date{font-size:var(--font-size-xs)}.ui-mode-mobile .email-item .bulk-checkbox{display:none}.ui-mode-mobile .day-plan-content{flex-direction:column}.ui-mode-mobile .day-plan-sidebar{width:100%;max-height:none;border-top:var(--border-width-sm) solid var(--border);order:2}.ui-mode-mobile .day-plan-sidebar.collapsed .sidebar-task-list{display:none}.ui-mode-mobile .day-plan-sidebar-toggle{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.625rem .75rem;background:var(--surface-overlay);border:none;border-bottom:1px solid var(--border);font-size:var(--font-size-sm);font-weight:700;cursor:pointer;color:var(--content)}.ui-mode-mobile .day-plan-main{order:1}.ui-mode-mobile .day-plan-nav{flex-wrap:wrap;gap:.25rem}.ui-mode-mobile .weekly-review-content{padding:0}.ui-mode-mobile .monthly-review-content{padding:0}.ui-mode-mobile .month-reflection-textarea,.ui-mode-mobile .prompt-input{resize:none;overflow:hidden}.ui-mode-mobile .monthly-review-nav{flex-wrap:wrap;gap:.25rem}.ui-mode-mobile .monthly-review-month-display{font-size:1rem}.ui-mode-mobile .day-summary-sheet{padding:.5rem 0}.ui-mode-mobile .day-summary-date{font-size:1rem;font-weight:700;margin-bottom:.75rem;color:var(--content)}.ui-mode-mobile .day-summary-stats{display:flex;gap:.5rem;margin-bottom:1rem}.ui-mode-mobile .day-summary-chip{padding:.25rem .75rem;background:var(--surface-overlay);border-radius:var(--radius-sm);font-size:var(--font-size-sm);font-weight:600;color:var(--content-secondary)}.ui-mode-mobile .day-summary-list{list-style:none;padding:0;margin:0 0 1rem 0}.ui-mode-mobile .day-summary-item{padding:.5rem 0;border-bottom:1px solid var(--surface-overlay);font-size:var(--font-size-sm);color:var(--content)}.ui-mode-mobile .day-summary-time{font-weight:600;color:var(--content-secondary);margin-right:.5rem}.ui-mode-mobile .day-summary-more{color:var(--content-muted);font-style:italic}.ui-mode-mobile .day-summary-empty{color:var(--content-muted);font-size:var(--font-size-sm);margin:.5rem 0 1rem}.ui-mode-mobile .day-summary-go-btn{width:100%;margin-top:.5rem}.ui-mode-mobile .bulk-actions-bar{position:fixed;bottom:calc(52px + env(safe-area-inset-bottom,0px));left:0;right:0;z-index:1050;border-radius:var(--radius-lg) var(--radius-lg) 0 0;box-shadow:0 -4px 12px rgba(0,0,0,.15)}.ui-mode-mobile .pagination-controls{padding:.5rem}.ui-mode-mobile .pagination-controls .btn{padding:.5rem .75rem;font-size:var(--font-size-sm)}@media (hover:none){.task-row:hover{background-color:transparent}.task-row-clickable:hover{background:0 0}.event-row-virtual:hover{background-color:transparent}.email-item:hover{background-color:transparent}.card:hover{background-color:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.btn:hover{background:var(--surface-raised)}.btn-primary:hover{background-color:var(--action)}.btn-danger:hover{background-color:var(--danger)}.card:hover{background-color:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.kanban-card:hover{background:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.saved-view-item:hover{background:var(--surface-raised);color:var(--content);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.context-menu-item:hover{background:0 0;color:var(--content)}.modal-close:hover{background:var(--surface-raised);color:var(--content)}.month-heatmap-cell:hover{background:0 0;transform:none}.email-item .kebab-btn,.event-row-virtual .kebab-btn,.task-row .kebab-btn{opacity:1}.shortcut-hint-btn{display:none}.time-block-quick-options{grid-template-columns:1fr}.duration-preset,.time-block-quick-btn{min-height:44px;padding:.75rem;font-size:1rem}}body.is-touch .email-item .kebab-btn,body.is-touch .event-row-virtual .kebab-btn,body.is-touch .task-row .kebab-btn{opacity:1}body.is-touch .shortcut-hint-btn{display:none}.view-toggle{display:flex;gap:0;margin-left:auto}.view-toggle-btn{padding:.35rem .75rem;border:var(--border-width-sm) solid var(--border);background:var(--surface-overlay);font-family:var(--font-body);font-size:var(--font-size-md);cursor:pointer;transition:background var(--transition-fast),box-shadow var(--transition-fast)}.view-toggle-btn.active{background:var(--surface-raised);font-weight:600}.view-toggle-btn:first-child{border-radius:var(--radius-xs) 0 0 var(--radius-xs)}.view-toggle-btn:last-child{border-radius:0 var(--radius-xs) var(--radius-xs) 0;border-left:none}.kanban-board{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;padding:.5rem 0;min-height:400px}.kanban-column{background:var(--surface-raised);border:var(--border-width) solid var(--border);display:flex;flex-direction:column;min-height:300px;max-height:calc(100vh - 200px)}.kanban-column-header{padding:.75rem 1rem;border-bottom:2px solid var(--border);font-family:var(--font-heading);font-weight:700;display:flex;justify-content:space-between;align-items:center}.kanban-column-count{font-family:var(--font-body);font-size:var(--font-size-sm);color:var(--content-secondary)}.kanban-column-body{flex:1;overflow-y:auto;padding:.5rem;display:flex;flex-direction:column;gap:.5rem}.kanban-column.drag-over{background-color:var(--surface-sunken)}.kanban-card{padding:.75rem;border-width:var(--border-width-sm);border-radius:0;cursor:grab;border-left:4px solid transparent}.kanban-card.dragging{opacity:.5;cursor:grabbing}.kanban-card.priority-high{border-left-color:var(--danger)}.kanban-card.priority-medium{border-left-color:var(--warning)}.kanban-card.priority-low{border-left-color:var(--success)}.kanban-card-title{font-weight:600;margin-bottom:.25rem}.kanban-card-meta{font-size:var(--font-size-sm);color:var(--content-secondary);display:flex;gap:.5rem;flex-wrap:wrap}.kanban-card-due.overdue{color:var(--danger);font-weight:600}.progress-bar-mini{height:3px;background:var(--surface-sunken);border-radius:2px;margin-top:.5rem}.progress-bar-mini .progress-fill{height:100%;background:var(--success);border-radius:2px}.ui-mode-mobile .kanban-board{grid-template-columns:1fr}.ui-mode-mobile .kanban-column{max-height:none}.timer-widget{position:fixed;bottom:0;left:0;right:0;z-index:900;background:var(--surface-page);border-top:var(--border-width) solid var(--border);box-shadow:0 -2px 8px rgba(0,0,0,.1);padding:.5rem 1rem;transition:transform .2s ease}.timer-widget.hidden{transform:translateY(100%);pointer-events:none}.timer-widget-inner{display:flex;align-items:center;gap:1rem;max-width:800px;margin:0 auto}.timer-task-name{flex:1;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timer-elapsed{font-family:var(--font-mono, monospace);font-size:1.125rem;font-weight:700;color:var(--action);min-width:5rem;text-align:center}.timer-actions{display:flex;gap:.5rem}.focus-overlay{position:fixed;inset:0;z-index:1000;background:var(--surface-page);display:flex;align-items:center;justify-content:center;transition:opacity .3s ease}.focus-overlay.hidden{opacity:0;pointer-events:none}.focus-overlay-content{text-align:center;max-width:400px;width:100%;padding:2rem}.focus-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:2rem}.focus-label{font-family:var(--font-heading);font-size:1.25rem;font-weight:700}.focus-presets{display:flex;gap:.5rem}.focus-preset-btn.active{background:var(--action);color:var(--surface-page);border-color:var(--action)}.focus-countdown{font-family:var(--font-mono, monospace);font-size:4rem;font-weight:700;line-height:1;margin-bottom:1.5rem;color:var(--content)}.focus-progress-bar{height:6px;background:var(--surface-sunken);border-radius:3px;margin-bottom:1.5rem;overflow:hidden}.focus-progress-fill{height:100%;background:var(--action);border-radius:3px;transition:width 1s linear}.focus-task-name{color:var(--content-secondary);margin-bottom:2rem;font-size:.9rem}.focus-actions{display:flex;gap:1rem;justify-content:center}.time-summary-section{margin-bottom:1rem}.time-summary-toggle{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem;background:0 0;border:none;font-family:var(--font-heading);font-size:.875rem;font-weight:700;color:var(--content);cursor:pointer;text-align:left}.time-summary-toggle:hover{color:var(--action)}.time-summary-toggle-icon{font-size:.625rem;transition:transform .15s ease}.time-summary-body{padding:.5rem;overflow:hidden;transition:max-height .2s ease;max-height:500px}.time-summary-body.collapsed{max-height:0;padding:0 .5rem}.time-summary-today{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid var(--border);margin-bottom:.5rem}.time-summary-today-label{font-weight:600;font-size:.875rem}.time-summary-today-value{font-family:var(--font-mono, monospace);font-weight:700;font-size:1rem;color:var(--action)}.time-summary-week-header{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content-secondary);margin-bottom:.5rem}.time-summary-project{margin-bottom:.5rem}.time-summary-project-info{display:flex;justify-content:space-between;align-items:center;font-size:.8125rem;margin-bottom:.25rem}.time-summary-project-name{color:var(--content);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.time-summary-project-time{font-family:var(--font-mono, monospace);font-weight:600;font-size:.75rem;color:var(--content-secondary);margin-left:.5rem;flex-shrink:0}.time-summary-bar{height:4px;background:var(--surface-sunken);border-radius:2px;overflow:hidden}.time-summary-bar-fill{height:100%;background:var(--action);border-radius:2px}.unscheduled-task-actions{display:flex;gap:.25rem;margin-top:.375rem}.unscheduled-task-actions .btn{font-size:.7rem;padding:.125rem .375rem;min-height:auto;line-height:1.4}.task-time-badge{display:inline-block;font-family:var(--font-mono, monospace);font-size:.7rem;font-weight:600;color:var(--content-secondary);background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);padding:.05rem .35rem;margin-left:.375rem;vertical-align:middle;white-space:nowrap}.task-time-badge.over-estimate{color:var(--danger);border-color:var(--danger)}.task-started-icon{display:inline-block;width:0;height:0;border-style:solid;border-width:5px 0 5px 8px;border-color:transparent transparent transparent var(--success);margin-right:.375rem;vertical-align:middle;cursor:pointer;opacity:.8;flex-shrink:0}.task-started-icon:hover{opacity:1}.task-timer-active{display:inline-block;width:8px;height:8px;background:var(--danger);border-radius:var(--radius-full);margin-left:.375rem;vertical-align:middle;animation:timer-pulse 1.5s ease-in-out infinite}@keyframes timer-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.8)}}.ui-mode-mobile .timer-widget{bottom:calc(52px + env(safe-area-inset-bottom,0px))}.ui-mode-mobile .focus-countdown{font-size:3rem}.timer-active-banner{display:flex;align-items:center;gap:1rem;padding:.875rem 1rem;background:var(--surface-overlay);border:var(--border-width) solid var(--action);border-radius:var(--radius-md);margin-bottom:1.5rem}.timer-active-info{flex:1;min-width:0}.timer-active-label{display:block;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--action);margin-bottom:.125rem}.timer-active-task{display:block;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timer-active-elapsed{font-family:var(--font-mono, monospace);font-size:1.25rem;font-weight:700;color:var(--action);min-width:5rem;text-align:center}.timer-active-actions{display:flex;gap:.5rem}.timer-focus-split{display:flex;align-items:center;gap:.375rem;padding:.5rem 0;margin-bottom:.5rem}.timer-focus-split-label{font-size:.8125rem;color:var(--content-secondary);font-weight:600;margin-right:.25rem}.timer-split-input{width:3.5rem;padding:.25rem .375rem;font-size:.875rem;font-family:var(--font-mono, monospace);text-align:center;border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);background:var(--surface-page);color:var(--content)}.timer-focus-split-sep{font-size:.8125rem;color:var(--content-secondary)}.timer-task-list{display:flex;flex-direction:column;gap:0}.timer-task-item{display:flex;align-items:center;gap:1rem;padding:.75rem .5rem;border-bottom:1px solid var(--border)}.timer-task-item:last-child{border-bottom:none}.timer-task-info{flex:1;min-width:0}.timer-task-desc{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timer-task-meta{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.25rem;font-size:.8125rem;color:var(--content-secondary)}.timer-task-project{font-weight:600}.timer-task-priority{font-weight:600}.timer-task-priority.priority-h,.timer-task-priority.priority-high{color:var(--danger)}.timer-task-priority.priority-m,.timer-task-priority.priority-medium{color:var(--warning)}.timer-task-estimate,.timer-task-tracked{font-family:var(--font-mono, monospace);font-size:.75rem}.timer-task-actions{display:flex;gap:.375rem;flex-shrink:0}.ui-mode-mobile .timer-active-banner{flex-wrap:wrap}.ui-mode-mobile .timer-active-elapsed{font-size:1rem}.ui-mode-mobile .timer-task-item{flex-wrap:wrap}.ui-mode-mobile .timer-task-actions{width:100%;justify-content:flex-end}.task-overview-section{margin-bottom:1.5rem;padding:1rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.task-overview-section-title{font-family:var(--font-heading);font-size:1rem;font-weight:700;margin-bottom:.75rem;display:flex;align-items:center;gap:.5rem}.task-overview-count{font-weight:400;font-size:.85rem;color:var(--content-secondary)}.task-overview-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:.75rem;margin-bottom:1rem}.task-overview-stat{text-align:center;padding:.5rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border)}.task-overview-stat-value{font-family:var(--font-heading);font-size:1.25rem;font-weight:700}.task-overview-stat-label{font-size:.75rem;color:var(--content-secondary);margin-top:.25rem}.task-overview-heatmap-nav{display:flex;align-items:center;justify-content:center;gap:1rem;margin-bottom:.75rem;font-family:var(--font-heading);font-weight:700}.task-overview-meta{display:flex;flex-direction:column;gap:.5rem}.task-overview-badges{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:.25rem}.task-overview-details{display:flex;flex-direction:column;gap:.25rem;color:var(--content-secondary);font-size:.9rem}.task-overview-subtask-list{display:flex;flex-direction:column;gap:.25rem;margin-bottom:.75rem}.task-overview-subtask{display:flex;align-items:center;gap:.5rem;padding:.25rem 0}.completed-text{text-decoration:line-through;color:var(--content-secondary)}.task-overview-add-form{display:flex;gap:.5rem;margin-top:.5rem}.task-overview-add-form .form-input{flex:1}.task-overview-sessions{display:flex;flex-direction:column;gap:.25rem;font-size:.9rem;color:var(--content-secondary)}.task-overview-session{padding:.25rem 0;border-bottom:var(--border-width-sm) solid var(--border)}.task-overview-annotations{display:flex;flex-direction:column;gap:.5rem;margin-bottom:.75rem}.task-overview-annotation{padding:.5rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border)}.task-overview-annotation-date{font-size:.75rem;color:var(--content-secondary);margin-bottom:.25rem}.task-overview-completion-list{margin-top:.75rem;font-size:.9rem;color:var(--content-secondary)}.task-overview-completion-item{padding:.25rem 0;border-bottom:var(--border-width-sm) solid var(--border)}.progress-bar{height:6px;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);margin-bottom:.75rem;overflow:hidden}.progress-fill{height:100%;background:var(--success);transition:width .3s ease}.progress-bar.over-estimate .progress-fill{background:var(--danger)}.ui-mode-mobile .task-overview-stats{grid-template-columns:repeat(2,1fr)}.toggle-nudge-dot{display:inline-block;width:7px;height:7px;background:var(--danger);border-radius:var(--radius-full);margin-left:.35rem;vertical-align:middle;animation:pulse-badge 2s infinite}.view-toggle-btn{position:relative}.finish-review-bar{display:flex;justify-content:flex-end;padding:1.5rem 0 1rem;margin-top:1.5rem;border-top:1px dashed var(--border)}.finish-review-btn{position:relative;font-size:var(--font-size-lg);padding:.65rem 1.5rem}.finish-review-modal-content{display:flex;flex-direction:column;gap:1.25rem}.past-review-banner{padding:.75rem 1rem;border:var(--border-width-sm) dashed var(--border);border-radius:var(--radius-md);background:var(--surface-overlay);color:var(--content-secondary);font-size:.9rem}.day-accomplished-inline{margin-top:1.5rem}.day-accomplished-inline:empty{display:none}.day-accomplished-stats{font-size:.8rem;color:var(--content-secondary);margin-bottom:.5rem}.events-calendar-container{padding:0}.calendar-nav{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem}.calendar-nav-label{font-family:var(--font-heading);font-size:1.1rem;font-weight:700;margin-left:.5rem}.cal-month-grid{border:var(--border-width) solid var(--border);overflow:hidden;background:var(--surface-raised);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.cal-month-cells,.cal-month-header{display:grid;grid-template-columns:repeat(7,1fr)}.cal-month-day-header{font-family:var(--font-heading);font-size:.75rem;font-weight:600;text-align:center;padding:.5rem;text-transform:uppercase;background:var(--surface-overlay);border-bottom:var(--border-width-sm) solid var(--border)}.cal-month-cell{min-height:90px;border:var(--border-width-sm) solid var(--border);padding:.25rem;cursor:pointer;transition:background var(--transition-fast)}.cal-month-cell:hover{background:var(--surface-overlay)}.cal-month-cell.other-month{opacity:.4}.cal-month-cell.today{border-color:var(--action);border-width:2px}.cal-month-cell-header{margin-bottom:.15rem}.cal-day-number{font-family:var(--font-heading);font-size:.8rem;font-weight:600}.cal-event-chip{font-size:.7rem;padding:1px 4px;margin-top:2px;border-radius:var(--radius-xs);background:var(--action);color:var(--content-on-action);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.cal-event-chip:hover{opacity:.85}.cal-event-chip.block-focus{background:var(--category-one)}.cal-event-chip.block-personal{background:var(--category-four);color:var(--content)}.cal-event-chip.block-free_time{background:var(--category-two);color:var(--content)}.cal-event-more{font-size:.65rem;color:var(--content-secondary);padding:1px 4px}.month-day-detail{margin-top:1rem;border:var(--border-width) solid var(--border);padding:1rem;background:var(--surface-raised);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.cal-day-detail-event{display:flex;gap:.75rem;padding:.5rem 0;border-bottom:1px solid var(--border);cursor:pointer}.cal-day-detail-event:hover{background:var(--surface-overlay)}.cal-detail-time{font-weight:600;white-space:nowrap;min-width:100px}.cal-detail-location{color:var(--content-secondary);font-size:.85rem}.cal-week-grid{border:var(--border-width) solid var(--border);overflow:hidden;background:var(--surface-raised);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.cal-week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:var(--border-width-sm) solid var(--border);background:var(--surface-overlay)}.cal-week-day-header{text-align:center;padding:.5rem;font-family:var(--font-heading)}.cal-week-day-header.today{background:color-mix(in srgb,var(--action) 15%,transparent)}.cal-week-day-name{font-size:.75rem;text-transform:uppercase;font-weight:600}.cal-week-day-num{font-size:1rem;font-weight:700;display:block}.cal-week-allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:var(--border-width-sm) solid var(--border);min-height:28px}.cal-allday-label{font-size:.7rem;color:var(--content-secondary);display:flex;align-items:center;justify-content:center}.cal-week-allday-cell{padding:2px;border-left:1px solid var(--border)}.cal-week-body{display:grid;grid-template-columns:60px repeat(7,1fr);position:relative;overflow-y:auto;max-height:70vh}.cal-week-time-gutter{position:relative}.cal-week-hour-label{position:absolute;right:.5rem;font-size:.7rem;color:var(--content-secondary);transform:translateY(-.5em)}.cal-week-day-col{position:relative;border-left:1px solid var(--border)}.cal-week-day-col.today{background:color-mix(in srgb,var(--action) 5%,transparent)}.cal-week-hour-line{position:absolute;left:0;right:0;border-top:1px dashed color-mix(in srgb,var(--border) 50%,transparent)}.cal-week-event{position:absolute;left:2px;right:2px;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);padding:2px 4px;background:var(--action);color:var(--content-on-action);overflow:hidden;cursor:pointer;z-index:10;font-size:.7rem}.cal-week-event:hover{opacity:.85}.cal-week-event-title{font-weight:600}.cal-week-event-time{font-size:.65rem;opacity:.85}.cal-week-event.block-focus{background:var(--category-one)}.cal-week-event.block-personal{background:var(--category-four);color:var(--content)}.cal-week-event.block-free_time{background:var(--category-two);color:var(--content)}html.ui-mode-mobile{--timeline-slot-h:22px}.ui-mode-mobile .cal-month-cell{min-height:64px;padding:4px}.ui-mode-mobile .cal-day-number{font-size:.95rem;font-weight:600}.ui-mode-mobile .cal-event-chip{font-size:.65rem}.ui-mode-mobile .cal-week-body{max-height:60vh}.ui-mode-mobile .cal-mobile-day{display:flex;flex-direction:column;height:70vh;user-select:none}.ui-mode-mobile .cal-mobile-day-header{padding:.75rem;font-weight:600;text-align:center;border-bottom:1px solid var(--border)}.ui-mode-mobile .cal-mobile-day-header.today{color:var(--action)}.ui-mode-mobile .cal-mobile-allday{padding:.5rem;display:flex;flex-direction:column;gap:.25rem;border-bottom:1px solid var(--border)}.ui-mode-mobile .cal-mobile-day-body{position:relative;flex:1;overflow-y:auto;display:grid;grid-template-columns:48px 1fr}.ui-mode-mobile .cal-mobile-day-col{position:relative;border-left:1px solid var(--border)}.ui-mode-mobile .settings-page-layout{flex-direction:column}.ui-mode-mobile .settings-sidebar{width:100%;border-right:none;border-bottom:1px solid var(--border);padding:.75rem;flex-direction:row;flex-wrap:wrap;align-items:center}.ui-mode-mobile .settings-back{margin-bottom:0;margin-right:.5rem;padding:.5rem}.ui-mode-mobile .settings-nav-items{flex-direction:row;flex-wrap:wrap;gap:.25rem}.ui-mode-mobile .settings-nav-item{padding:.5rem .75rem;border-left:none;border-radius:var(--radius-sm)}.ui-mode-mobile .settings-nav-item.active{border-left-color:transparent}.ui-mode-mobile .settings-content{padding:1rem}body.compose-window{height:100vh;display:flex;flex-direction:column;overflow:hidden}body.compose-window .compose-toolbar{display:flex;gap:.5rem;padding:.75rem 1rem;background:var(--surface-overlay);border-bottom:1px solid var(--border)}body.compose-window .toolbar-spacer{flex:1}body.compose-window .compose-form{flex:1;display:flex;flex-direction:column;overflow:hidden;background:var(--surface-raised)}body.compose-window .status-bar{padding:.5rem 1rem;background:var(--surface-overlay);border-top:1px solid var(--border);font-size:.8125rem;color:var(--content-secondary)}body.compose-window .status-bar.error{color:var(--danger)}body.compose-window .status-bar.success{color:var(--success)}body.compose-window .compose-loading{opacity:.6;pointer-events:none}.saved-views-save{display:flex;gap:var(--space-2);align-items:center;flex-wrap:wrap;margin-bottom:var(--space-4)}.saved-views-save .form-input{flex:1 1 auto;min-width:160px}.saved-views-list{display:flex;flex-direction:column;gap:var(--space-2)}.saved-views-row{display:flex;gap:var(--space-2);align-items:center}.saved-views-row .saved-views-apply{flex:1 1 auto;text-align:left}.saved-views-empty{color:var(--content-muted)}#command-palette{position:fixed;inset:0;z-index:5000;display:flex;align-items:flex-start;justify-content:center;padding-top:15vh}#command-palette.hidden{display:none}.cp-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.5)}.cp-dialog{position:relative;width:90%;max-width:560px;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);overflow:hidden}.cp-input-row{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;border-bottom:1px solid var(--border)}.cp-icon{font-size:1.1rem;opacity:.5}.cp-input{flex:1;border:none;outline:0;background:0 0;font-size:1rem;font-family:inherit;color:var(--content)}.cp-esc{font-size:.7rem;padding:.15rem .4rem;background:var(--surface-overlay);border:1px solid var(--border);border-radius:3px;color:var(--content-secondary)}.cp-filters{display:flex;gap:.4rem;padding:0 1rem;flex-wrap:wrap}.cp-filters:not(:empty){padding-top:.5rem;padding-bottom:.25rem}.cp-filter-tag{font-size:.75rem;padding:.15rem .5rem;background:var(--surface-overlay);border-radius:var(--radius-sm);color:var(--content-secondary)}.cp-results{max-height:360px;overflow-y:auto}.cp-empty,.cp-hint{padding:1.5rem 1rem;text-align:center;font-size:.85rem;color:var(--content-secondary);line-height:1.6}.cp-hint kbd{font-size:.75rem;padding:.1rem .35rem;background:var(--surface-overlay);border:1px solid var(--border);border-radius:3px}.cp-result{display:flex;align-items:center;gap:.6rem;padding:.5rem 1rem;cursor:pointer;border-bottom:1px solid var(--border)}.cp-result:last-child{border-bottom:none}.cp-result.cp-selected,.cp-result:hover{background:var(--surface-overlay)}.cp-type-icon{font-size:1rem;width:1.5rem;text-align:center;flex-shrink:0}.cp-result-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:.15rem}.cp-title{font-size:.9rem;color:var(--content);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cp-project{font-size:.75rem;color:var(--content-secondary)}.cp-snippet{font-size:.75rem;color:var(--content-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cp-type-badge{font-size:.7rem;padding:.15rem .4rem;background:var(--surface-overlay);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--content-secondary);flex-shrink:0}.cp-more{padding:.5rem 1rem;text-align:center;font-size:.8rem;color:var(--content-secondary);opacity:.7}
1 > \ No newline at end of file
1 + @font-face{font-family:Reglo;src:url('../fonts/Reglo-Bold.woff2') format('woff2');font-weight:700;font-style:normal;font-display:swap}*,::after,::before{box-sizing:border-box;margin:0;padding:0}:root{--timeline-slot-h:12px;--surface-page:#E0E4FA;--surface-raised:#FFFFFF;--surface-sunken:#BAC2E6;--surface-overlay:#CDD3F0;--content:#000000;--content-secondary:#2D2D2D;--content-muted:#6B6B6B;--content-on-action:#000000;--action:#6196FF;--action-hover:#70a6ff;--danger:#DC3545;--success:#5CB85C;--warning:#F7D154;--info:#17A2B8;--border:#000000;--border-strong:#000000;--focus-ring:#6196ff;--hover-surface:#bac2e6;--category-one:#DC3545;--category-two:#5CB85C;--category-three:#6196FF;--category-four:#F7D154;--category-five:#7B68EE;--category-six:#17A2B8;--overlay:rgba(1, 1, 8, 0.5);--border-width:2px;--border-width-sm:2px;--shadow-offset-xs:1px;--shadow-offset-md:3px;--shadow-offset:4px;--shadow-offset-lg:6px;--shadow-offset-xl:8px;--shadow-brutal-xs:var(--shadow-offset-xs) var(--shadow-offset-xs) 0 var(--border);--shadow-brutal-md:var(--shadow-offset-md) var(--shadow-offset-md) 0 var(--border);--shadow-brutal-lg:var(--shadow-offset-lg) var(--shadow-offset-lg) 0 var(--border);--shadow-brutal-xl:var(--shadow-offset-xl) var(--shadow-offset-xl) 0 var(--border);--radius-xs:3px;--radius-sm:5px;--radius-md:5px;--radius-lg:10px;--radius-xl:20px;--radius-full:50%;--width-container:1400px;--width-modal:560px;--width-sidebar:280px;--space-1:0.25rem;--space-2:0.5rem;--space-3:0.75rem;--space-4:1rem;--space-5:1.25rem;--space-6:1.5rem;--font-sans:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;--font-serif:Georgia,'Times New Roman',serif;--font-mono:'SF Mono','Consolas','Liberation Mono',monospace;--font-display:'Reglo',var(--font-serif);--font-heading:var(--font-sans);--font-body:var(--font-sans);--font-size-xxs:0.65rem;--font-size-xs:0.7rem;--font-size-sm:0.75rem;--font-size-md:0.8rem;--font-size-base:0.875rem;--font-size-lg:1rem;--font-size-xl:1.1rem;--font-size-2xl:1.25rem;--font-size-3xl:1.5rem;--font-size-4xl:1.75rem;--line-height-tight:1.25;--line-height-normal:1.5;--line-height-relaxed:1.75;--transition-fast:0.1s;--transition-normal:0.15s;--transition-slow:0.3s;--overlay-color:color-mix(in srgb, var(--content) 60%, transparent)}html{font-size:16px}.flex-1{flex:1}.row{display:flex}.text-sm-secondary{font-size:.875rem;color:var(--content-secondary)}.text-xs-secondary{font-size:.75rem;color:var(--content-secondary)}.text-accent-red{color:var(--danger)}.mb-1{margin-bottom:1rem}.mb-2{margin-bottom:var(--space-2)}.form-select--compact{width:auto;min-width:120px}.settings-divider{margin-top:1.5rem;padding-top:1.5rem;border-top:2px solid var(--border)}.settings-heading{margin-bottom:1rem;font-family:var(--font-heading)}.settings-desc{font-size:.875rem;color:var(--content-secondary);margin-bottom:1rem}.subtask-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;background:var(--surface-overlay);border-radius:4px;margin-bottom:.5rem}.subtask-item--linked{background:var(--surface-sunken);border-left:var(--border-width) solid var(--action)}.subtask-checkbox{cursor:pointer;width:18px;height:18px}.subtask-checkbox-disabled{cursor:not-allowed;width:18px;height:18px;opacity:.5}.subtask-text-done{text-decoration:line-through;opacity:.6}body{font-family:var(--font-sans);background-color:var(--surface-page);color:var(--content);line-height:1.6;height:100vh;overflow:hidden;display:flex;flex-direction:column}.badge,.btn,.mobile-tab,.mobile-tab-bar,.mobile-tab-create,.tab,.tab-icon,.tab-label,.tab-navigation,.tag,.toggle-switch,button,label{-webkit-user-select:none;user-select:none}.selectable,[contenteditable=true],input,textarea{-webkit-user-select:text;user-select:text}.ui-mode-desktop .app-header{background:var(--surface-raised);border-bottom:var(--border-width) solid var(--border);padding:.75rem 1.5rem;display:flex;justify-content:space-between;align-items:center}.ui-mode-desktop .header-content{display:flex;align-items:center;gap:.75rem}.ui-mode-desktop .header-actions{display:flex;align-items:center;gap:.5rem}.ui-mode-desktop .app-title{font-family:var(--font-display);font-size:1.75rem;font-weight:700;color:var(--content);letter-spacing:-.02em}.ui-mode-desktop .app-subtitle{font-size:.875rem;color:var(--content-muted);font-weight:500;line-height:1}.mobile-view-title{display:none}.ui-mode-desktop .tab-navigation{display:flex;justify-content:center;gap:.5rem}.ui-mode-desktop .tab{display:flex;align-items:center;gap:.5rem;padding:.75rem 1.25rem;text-decoration:none;color:var(--content);background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);font-weight:600;transition:background-color .15s ease}.ui-mode-desktop .tab:hover{background:var(--surface-overlay)}.ui-mode-desktop .tab.active{background-color:var(--action);color:var(--content-on-action);box-shadow:var(--shadow-brutal-xs)}.ui-mode-desktop .tab-icon{font-size:1.1rem}.ui-mode-desktop .tab-label{font-weight:600;font-size:.9rem}.ui-mode-desktop .tab.tab-right{margin-left:auto}.tab-group .subview.hidden{display:none}.ui-mode-desktop .pill-nav{display:flex;align-items:center;gap:var(--space-1);padding:0;margin-bottom:1rem;min-height:2rem}.ui-mode-desktop .pill{padding:var(--space-1) var(--space-3);border-radius:var(--radius-xl);border:var(--border-width-sm) solid var(--border);background:var(--surface-raised);font-family:var(--font-sans);font-size:var(--font-size-sm);font-weight:600;cursor:pointer;transition:background-color var(--transition-fast)}.ui-mode-desktop .pill:hover{background:var(--surface-sunken)}.ui-mode-desktop .pill.active{background:var(--content);color:var(--surface-raised);border-color:var(--content);box-shadow:var(--shadow-brutal-xs)}.main-content{flex:1;max-width:var(--width-container);width:100%;margin:0 auto;padding:1.5rem 1.75rem 2rem}.page-header{display:flex;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:1rem}.page-title{font-family:var(--font-heading);font-size:1.75rem;font-weight:700;color:var(--content)}.tab-group{position:relative}.tab-group>.subview>.page-header{position:absolute;top:0;right:0;margin:0;z-index:1}.tab-group .page-header .page-title{display:none}#day-plan-view>.page-header,#project-dashboard-view>.page-header{position:static;margin-bottom:1rem}#project-dashboard-view .page-title{display:block}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.625rem 1.25rem;border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);font-size:.9rem;font-weight:600;cursor:pointer;transition:background-color .15s ease,transform .1s ease,box-shadow .1s ease;text-decoration:none;background:var(--surface-raised);color:var(--content);box-shadow:var(--shadow-brutal-xs)}.btn:hover{background:var(--surface-overlay);transform:translate(-1px,-1px);box-shadow:var(--shadow-offset-md) var(--shadow-offset-md) 0 var(--border)}.btn:active{background:var(--surface-sunken);transform:translate(1px,1px);box-shadow:none}.btn:disabled{background:0 0;color:var(--content-muted);border-color:var(--content-muted);cursor:not-allowed;box-shadow:none}.btn:disabled:hover{background:0 0;transform:none;box-shadow:none}.btn-primary{background-color:var(--action);color:var(--content-on-action)}.btn-primary:hover{background-color:color-mix(in srgb,var(--action) 85%,#000)}.btn-primary:active{background-color:color-mix(in srgb,var(--action) 70%,#000)}.btn-secondary{background-color:var(--surface-overlay);color:var(--content)}.btn-danger{background-color:var(--danger);color:var(--content-on-action)}.btn-danger:hover{background-color:color-mix(in srgb,var(--danger) 85%,#000)}.btn-danger:active{background-color:color-mix(in srgb,var(--danger) 70%,#000)}.btn-sm{padding:.375rem .75rem;font-size:.8rem}.cards-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:1.25rem}.card{background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);padding:1.25rem;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border);transition:transform .15s ease,box-shadow .15s ease,background-color .15s ease;cursor:pointer}.card:hover{background-color:var(--surface-overlay);transform:translate(-2px,-2px);box-shadow:calc(var(--shadow-offset) + 2px) calc(var(--shadow-offset) + 2px) 0 var(--border)}.card--list-item{padding:.75rem;border-radius:0;margin-bottom:.5rem}.card--shell{padding:0;cursor:default;display:flex;flex-direction:column;overflow:hidden}.card--shell:hover{background-color:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.card--muted{background:var(--surface-overlay);border:none;box-shadow:none;cursor:default}.card--muted:hover{background:var(--surface-overlay);transform:none;box-shadow:none}.card--static{cursor:default}.card--static:hover{background-color:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.75rem}.card-title{font-family:var(--font-heading);font-size:1.1rem;font-weight:700;color:var(--content)}.card-description{font-size:.9rem;color:var(--content-secondary);margin-bottom:1rem}.markdown-content{font-size:.9rem;color:var(--content-secondary);line-height:1.5}.markdown-content p{margin:0 0 .5em 0}.markdown-content p:last-child{margin-bottom:0}.markdown-content ol,.markdown-content ul{margin:0 0 .5em 1.5em;padding:0}.markdown-content code{background:var(--surface-sunken);padding:.1em .3em;border-radius:3px;font-size:.85em}.markdown-content pre{background:var(--surface-sunken);padding:.5em;border-radius:4px;overflow-x:auto;margin:0 0 .5em 0}.markdown-content pre code{background:0 0;padding:0}.markdown-content a{color:var(--action)}.markdown-content blockquote{border-left:3px solid var(--border);margin:0 0 .5em 0;padding-left:.75em;color:var(--content-secondary)}.markdown-content h1,.markdown-content h2,.markdown-content h3{margin:.5em 0 .25em 0;font-size:1em;font-weight:600;color:var(--content)}.markdown-content table{border-collapse:collapse;margin:.5em 0}.markdown-content td,.markdown-content th{border:1px solid var(--border);padding:.25em .5em}.markdown-content img{max-width:100%}.card-meta{display:flex;gap:.5rem;flex-wrap:wrap}.badge,.tag{display:inline-flex;align-items:center;padding:.25rem .625rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);font-size:.8125rem;font-weight:600;background:var(--surface-raised);color:var(--content)}.badge[data-color=green],.tag[data-color=green]{background-color:color-mix(in srgb,var(--category-two) 20%,var(--surface-raised));border-color:var(--category-two)}.badge[data-color=yellow],.tag[data-color=yellow]{background-color:color-mix(in srgb,var(--category-four) 20%,var(--surface-raised));border-color:var(--category-four)}.badge[data-color=red],.tag[data-color=red]{background-color:color-mix(in srgb,var(--category-one) 20%,var(--surface-raised));border-color:var(--category-one)}.badge[data-color=cyan],.tag[data-color=cyan]{background-color:color-mix(in srgb,var(--category-six) 20%,var(--surface-raised));border-color:var(--category-six)}.badge[data-color=purple],.tag[data-color=purple]{background-color:color-mix(in srgb,var(--category-five) 20%,var(--surface-raised));border-color:var(--category-five)}.badge[data-color=muted],.tag[data-color=muted]{background-color:var(--surface-sunken);border-color:var(--content-muted)}.badge[data-color=blue],.tag[data-color=blue]{background-color:color-mix(in srgb,var(--category-three) 20%,var(--surface-raised));border-color:var(--category-three)}.badge--xs{padding:.1rem .5rem;font-size:.75rem}.badge--sm{padding:.15rem .55rem;font-size:.78rem}.badge--filled{border:none}.badge--filled[data-color=green]{background:var(--category-two);color:var(--content-on-action)}.badge--filled[data-color=yellow]{background:var(--category-four);color:var(--content)}.badge--filled[data-color=red]{background:var(--category-one);color:var(--content-on-action)}.badge--filled[data-color=cyan]{background:var(--category-six);color:var(--content-on-action)}.badge--filled[data-color=purple]{background:var(--category-five);color:var(--content-on-action)}.badge--filled[data-color=blue]{background:var(--category-three);color:var(--content-on-action)}.badge--filled[data-color=muted]{background:var(--surface-overlay);color:var(--content)}.kbd-hint{display:inline-block;font-family:var(--font-mono, monospace);font-size:.65rem;font-weight:600;padding:.1rem .35rem;margin-left:.35rem;border:1px solid currentColor;border-radius:3px;opacity:.6;vertical-align:middle;line-height:1}.tag.status-active{background-color:color-mix(in srgb,var(--success) 20%,var(--surface-raised));border-color:var(--success)}.tag.status-on_hold,.tag.status-onhold{background-color:color-mix(in srgb,var(--warning) 20%,var(--surface-raised));border-color:var(--warning)}.tag.status-archived{background-color:var(--surface-sunken);border-color:var(--content-muted)}.tag.status-inactive{background-color:color-mix(in srgb,var(--danger) 20%,var(--surface-raised));border-color:var(--danger)}.tag.status-completed{background-color:color-mix(in srgb,var(--category-six) 20%,var(--surface-raised));border-color:var(--category-six)}.data-table{width:100%;border-collapse:separate;border-spacing:0;background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.data-table td,.data-table th{padding:1rem 1.25rem;text-align:left;border-bottom:2px solid var(--border)}.data-table th{background-color:var(--surface-overlay);font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--content)}.data-table tbody tr{transition:background-color .15s ease}.data-table tbody tr:hover{background-color:var(--surface-overlay)}.data-table tbody tr:last-child td{border-bottom:none}.data-table tbody tr.keyboard-selected,.data-table tbody tr.selected{background-color:color-mix(in srgb,var(--action) 25%,var(--surface-raised))}.task-table{width:100%;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);overflow:hidden;display:flex;flex-direction:column;flex:1;min-height:0;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.task-header-row,.task-row{display:grid;grid-template-columns:1fr 140px 60px 110px 90px 100px 90px;align-items:center;gap:.75rem}.task-header-row{background-color:var(--surface-overlay);border-bottom:2px solid var(--border);padding:0 1.25rem}.task-header-row .task-cell{padding:.75rem 0;font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content)}.task-list-container{flex:1;min-height:0;overflow-y:auto;position:relative}.task-row{padding:.75rem 1.25rem;border-bottom:1px solid var(--border);transition:background-color .15s ease,opacity .25s ease,transform .25s ease;cursor:pointer}.task-row-removing{opacity:0;transform:translateX(20px)}.task-row:hover{background-color:var(--surface-overlay)}.task-row:last-child{border-bottom:none}.task-row.keyboard-selected,.task-row.selected{background-color:color-mix(in srgb,var(--action) 25%,var(--surface-raised))}.task-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.task-actions-header{text-align:right}.event-table tbody tr{cursor:pointer}.task-description{font-weight:600;white-space:normal;display:flex;flex-wrap:wrap;align-items:center;gap:.25rem .5rem}.task-description-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.task-project{font-size:.85rem;color:var(--content-secondary);white-space:nowrap}.priority-high,.priority-low,.priority-medium{display:inline-block;padding:.25rem .5rem;border-radius:var(--radius-xs);font-weight:700;text-align:center}.priority-high{color:var(--danger);background:#fde8ea;background:color-mix(in srgb,var(--danger) 15%,var(--surface-raised))}.priority-medium{color:var(--warning);background:#fef8e6;background:color-mix(in srgb,var(--warning) 15%,var(--surface-raised))}.priority-low{color:var(--content-muted);background:var(--surface-overlay)}.sortable{cursor:pointer;user-select:none;white-space:nowrap}.sortable:hover{background:var(--hover-surface)}.sort-arrow{display:inline-block;width:.8em;margin-left:.25rem;opacity:.3}.sort-arrow::after{content:'\2195'}.sortable.sort-asc .sort-arrow::after{content:'\2191'}.sortable.sort-desc .sort-arrow::after{content:'\2193'}.sortable.sort-asc .sort-arrow,.sortable.sort-desc .sort-arrow{opacity:1}.task-overdue .task-description-text{color:var(--danger)}.task-overdue .task-due{color:var(--danger);font-weight:600}.task-tags{display:flex;gap:.25rem;flex-wrap:wrap}.task-tag{background-color:var(--surface-sunken);color:var(--content);padding:.125rem .5rem;border-radius:var(--radius-xs);font-size:.75rem;font-weight:600;border:1px solid var(--border)}.recurrence-icon{color:var(--category-five);font-size:.85rem;font-weight:700}.annotation-badge{background-color:var(--warning);color:var(--content);padding:.125rem .5rem;border-radius:var(--radius-xs);font-size:.7rem;font-weight:700;border:var(--border-width-sm) solid var(--border)}.subtask-badge{background-color:var(--surface-overlay);color:var(--content);padding:.125rem .5rem;border-radius:var(--radius-xs);font-size:.7rem;font-weight:700;border:var(--border-width-sm) solid var(--border);margin-left:.25rem}.task-started{border-left:4px solid var(--success)}.task-completed{opacity:.5;text-decoration:line-through}.task-deleted{display:none}.due-overdue{color:var(--danger);font-weight:700;background:#fde8ea;background:color-mix(in srgb,var(--danger) 15%,var(--surface-raised));padding:.25rem .5rem;border-radius:var(--radius-xs)}.due-today{color:var(--warning);font-weight:700;background:#fef8e6;background:color-mix(in srgb,var(--warning) 15%,var(--surface-raised));padding:.25rem .5rem;border-radius:var(--radius-xs)}.due-soon{color:var(--content-secondary)}.due-future{color:var(--content-muted)}.events-list{display:flex;flex-direction:column;flex:1;min-height:0;gap:1rem}.event-table-virtual{width:100%;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);overflow:hidden;display:flex;flex-direction:column;flex:1;min-height:0;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.event-header-row,.event-row-virtual{display:grid;grid-template-columns:100px 80px 1fr 150px 40px;align-items:center;gap:.5rem}.event-header-row{background-color:var(--surface-overlay);border-bottom:2px solid var(--border);flex-shrink:0}.event-header-row .event-cell{padding:1rem 1.25rem;font-size:.8rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content)}.event-list-container{flex:1;min-height:0;overflow-y:auto;position:relative}.event-row-virtual{padding:.75rem 1.25rem;border-bottom:1px solid var(--border);transition:background-color .15s ease;cursor:pointer}.event-row-virtual:hover{background-color:var(--surface-overlay)}.event-row-virtual:last-child{border-bottom:none}.event-row-virtual.event-past{opacity:.7}.event-cell{overflow:hidden;text-overflow:ellipsis}.event-row{cursor:pointer}.event-cell-date{white-space:nowrap}.event-cell-date .event-date-num{font-weight:700;font-size:.9rem;color:var(--content);margin-right:.5rem}.event-date-badge{display:inline-block;padding:.15rem .4rem;background:var(--success);color:var(--content-on-action);font-size:.7rem;font-weight:700;text-transform:uppercase;border-radius:var(--radius-xs);margin-right:.5rem}.event-cell-time{font-family:var(--font-mono);font-size:.85rem;color:var(--content-secondary)}.event-cell-title{font-weight:600}.event-cell-location{color:var(--content-secondary);font-size:.875rem}.event-date-badge.event-proximity-today{background:var(--success)}.event-date-badge.event-proximity-tomorrow{background:var(--warning);color:var(--content)}.event-date-badge.event-proximity-week{background:var(--category-six)}.event-date-badge.event-proximity-future{background:var(--action)}.event-date-badge.event-proximity-past{background:var(--content-muted)}.event-row.event-past{opacity:.7}.no-upcoming-events{text-align:center;padding:2rem;color:var(--content-secondary);font-style:italic}.past-events-section{margin-top:.5rem}.past-events-toggle{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font-weight:600;color:var(--content-secondary);transition:background-color .15s ease,color .15s ease;list-style:none}.past-events-toggle::-webkit-details-marker{display:none}.past-events-toggle::before{content:'▶';font-size:.7rem;transition:transform .15s ease}.past-events-section[open] .past-events-toggle::before{transform:rotate(90deg)}.past-events-toggle:hover{background:var(--surface-sunken);color:var(--content)}.past-events-label{flex:1}.past-events-count{background:var(--content-muted);color:var(--content-on-action);font-size:.75rem;padding:.15rem .5rem;border-radius:var(--radius-sm)}.past-events-section .event-table-past{margin-top:.75rem;opacity:.85}.past-events-section .event-list-container{max-height:300px}#recurring-events-section .event-table-virtual{opacity:1;margin-top:.75rem}#recurring-events-section .event-list-container{max-height:320px}.event-row-virtual.event-recurring .event-recurrence-pattern{font-weight:600;color:var(--action)}.events-section-heading{margin:1rem 0 .5rem;font-size:.95rem;font-weight:700;color:var(--content-secondary);text-transform:uppercase;letter-spacing:.05em}.event-item{display:flex;gap:1rem;padding:1rem;background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);transition:background-color .15s ease;cursor:pointer}.event-item:hover{background-color:var(--surface-overlay)}.event-date{flex-shrink:0;width:80px;text-align:center;padding:.75rem;background-color:var(--success);border-radius:var(--radius-sm);color:var(--content-on-action)}.event-date-day{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em}.event-date-num{font-size:1.5rem;font-weight:700}.event-content{flex:1}.event-title{font-family:var(--font-heading);font-weight:700;font-size:1.1rem;color:var(--content);margin-bottom:.25rem}.event-details{font-size:.875rem;color:var(--content-secondary);display:flex;gap:1rem}.event-location,.event-time{display:flex;align-items:center;gap:.25rem}.event-project{margin-top:.5rem}.email-list{flex:1;min-height:0}.email-list-container{flex:1;min-height:0;overflow-y:auto;position:relative}.email-item{display:flex;gap:1rem;padding:1rem;border-bottom:2px solid var(--border);transition:background-color .15s ease;cursor:pointer}.email-item:last-child{border-bottom:none}.email-item:hover{background-color:var(--surface-overlay)}.email-item.unread{background-color:color-mix(in srgb,var(--action) 20%,var(--surface-raised));border-left:4px solid var(--action)}.email-item.unread .email-subject{font-weight:700}.email-item.unread .email-from{font-weight:700}.email-item.outgoing{border-left:4px solid var(--success)}.email-checkbox{flex-shrink:0;margin-top:.25rem}.email-content{flex:1;min-width:0}.email-header{display:flex;justify-content:space-between;margin-bottom:.25rem;align-items:center;gap:.5rem}.thread-badge{background-color:var(--surface-sunken);color:var(--content-secondary);font-size:.7rem;font-weight:600;padding:.1rem .4rem;border-radius:var(--radius-md);min-width:1.25rem;text-align:center}.email-from{color:var(--content);font-size:.9rem;font-weight:600}.email-date{color:var(--content-muted);font-size:.8rem;flex-shrink:0;font-weight:600}.email-subject{color:var(--content);font-size:.95rem;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.email-preview{color:var(--content-muted);font-size:.85rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes toastSlideIn{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.toast{position:fixed;bottom:var(--space-5);right:var(--space-5);padding:var(--space-3) var(--space-5);background:var(--surface-raised);color:var(--content);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);z-index:2000;font-weight:600;display:flex;align-items:center;gap:var(--space-3);animation:toastSlideIn .3s ease}.toast.toast-leaving{opacity:0;transform:translateY(10px);transition:opacity .3s ease,transform .3s ease}.toast-info{background:var(--surface-raised);color:var(--content)}.toast-success{background:var(--success);color:var(--content-on-action)}.toast-error{background:var(--danger);color:var(--content-on-action)}.toast-action{background:0 0;border:1px solid currentColor;border-radius:var(--radius-sm);color:inherit;cursor:pointer;padding:.15rem .5rem;font-size:var(--font-size-sm);font-weight:600;font-family:inherit}.toast-undo{z-index:10000}.undo-message{flex:1}.undo-countdown{font-size:var(--font-size-sm);color:var(--content-muted);min-width:2.5rem;text-align:right}@keyframes modalFadeIn{from{opacity:0}to{opacity:1}}@keyframes modalSlideIn{from{opacity:0;transform:translateY(-20px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes modalFadeOut{from{opacity:1}to{opacity:0}}@keyframes modalSlideOut{from{opacity:1;transform:translateY(0) scale(1)}to{opacity:0;transform:translateY(-20px) scale(.95)}}.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background-color:var(--overlay);display:flex;align-items:center;justify-content:center;z-index:1000;animation:modalFadeIn .15s ease-out}.modal-overlay.hidden{display:none}.modal-overlay.closing{animation:modalFadeOut .15s ease-in forwards}.modal-container{background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-brutal-xl);max-width:var(--width-modal);width:90%;max-height:calc(100dvh - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px) - 2rem);overflow:auto;animation:modalSlideIn .2s ease-out}.modal-container.modal-large{max-width:calc(100vw - 4rem);width:calc(100vw - 4rem);max-height:calc(100vh - 4rem);height:calc(100vh - 4rem);display:flex;flex-direction:column}.modal-container.modal-large .modal-content{flex:1;overflow:auto;display:flex;flex-direction:column}.modal-overlay.closing .modal-container{animation:modalSlideOut .15s ease-in forwards}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;border-bottom:var(--border-width) solid var(--border);background:var(--surface-overlay)}.modal-header h2,.modal-title{font-family:var(--font-heading);font-size:1.25rem;font-weight:700}.modal-close{background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);font-size:1.25rem;color:var(--content);cursor:pointer;line-height:1;width:36px;height:36px;display:flex;align-items:center;justify-content:center;transition:background-color .15s ease}.modal-close:hover{background:var(--action);color:var(--content-on-action)}.modal-content{padding:1.5rem}.modal-content form>.form-actions:last-child,.modal-content>.form-actions:last-child{position:sticky;bottom:0;margin-top:1.5rem;padding-top:.75rem;padding-bottom:.25rem;background:var(--surface-raised);border-top:var(--border-width-sm) solid var(--border);z-index:1}.form-group{margin-bottom:1.25rem}.form-more-toggle{display:block;background:0 0;border:none;cursor:pointer;font-size:.85rem;font-weight:600;color:var(--action);padding:.25rem 0;margin-bottom:.75rem}.form-more-toggle::before{content:'+ '}.form-more-toggle.expanded::before{content:'- '}.form-extended-fields.hidden{display:none}.recurrence-weekday-label{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;font-size:.8rem;border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer}.recurrence-weekday-label:has(input:checked){background:var(--action);color:var(--surface-page);border-color:var(--action)}.recurrence-weekday-label input[type=checkbox]{display:none}.recurrence-config .form-input,.recurrence-config .form-select{font-size:.85rem;padding:.25rem .5rem}.form-label{display:block;font-size:.9rem;font-weight:700;color:var(--content);margin-bottom:.5rem}.form-input,.form-select,.form-textarea{width:100%;padding:.75rem 1rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);background-color:var(--surface-raised);color:var(--content);font-size:1rem;box-shadow:none}.form-input:focus,.form-select:focus,.form-textarea:focus{outline:0;background-color:var(--surface-raised);box-shadow:0 0 0 2px var(--action)}.form-textarea{min-height:100px;resize:vertical}.form-input--ghost{background:0 0;border:none;padding:.5rem;font-size:.875rem}.form-input--ghost:focus{background:0 0;box-shadow:none}.form-select--ghost{background:var(--surface-page);padding:.5rem;font-size:.875rem}.form-actions{display:flex;justify-content:flex-end;gap:.75rem;margin-top:1.5rem}.form-input[aria-invalid=true],.form-select[aria-invalid=true],.form-textarea[aria-invalid=true]{border-color:var(--danger);box-shadow:0 0 0 2px color-mix(in srgb,var(--danger) 30%,transparent)}.form-input[aria-invalid=true]:focus,.form-select[aria-invalid=true]:focus,.form-textarea[aria-invalid=true]:focus{box-shadow:0 0 0 2px var(--danger)}.form-error{color:var(--danger);font-size:.8rem;font-weight:600;margin-top:.25rem;display:none}.form-error.visible{display:block}.form-hint{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-1)}.form-hint--preview{color:var(--action)}.form-checkbox-label{display:flex;align-items:center;gap:var(--space-2);cursor:pointer}.empty-state-action{margin-top:var(--space-3)}.stack{display:flex;flex-direction:column}.stack-2{gap:var(--space-2)}.stack-3{gap:var(--space-3)}.stack-4{gap:var(--space-4)}.row-flex{display:flex;align-items:center}.row-flex-2{gap:var(--space-2)}.row-flex-3{gap:var(--space-3)}.row-flex-4{gap:var(--space-4)}.text-center{text-align:center}.text-left{text-align:left}.w-full{width:100%}.text-muted{color:var(--content-muted)}.text-secondary{color:var(--content-secondary)}.text-danger{color:var(--danger)}.text-sm{font-size:var(--font-size-sm)}.text-xs{font-size:var(--font-size-xs, .75rem)}.section-divider{border-top:var(--border-width-sm) solid var(--border);padding-top:var(--space-4);margin-top:var(--space-4)}.sync-status-row{display:flex;align-items:center;gap:var(--space-3);margin-bottom:var(--space-5)}.sync-status-dot{width:10px;height:10px;border-radius:var(--radius-full);background:var(--success);display:inline-block}.sync-stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-4);margin-bottom:var(--space-5)}.sync-stat{padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-md)}.sync-stat-label{font-size:var(--font-size-sm);color:var(--content-muted);margin-bottom:var(--space-1)}.sync-stat-value{font-size:var(--font-size-md, .9rem)}.sync-encryption-error{color:var(--danger);font-size:var(--font-size-sm);margin-top:var(--space-2);display:none}.sync-encryption-error.visible{display:block}.sync-section-actions{margin-bottom:var(--space-5)}.sync-banner{padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-md);margin-bottom:var(--space-4);font-size:var(--font-size-sm);color:var(--content-secondary)}.sync-banner--warning{background:var(--surface-overlay);border:1px solid var(--border);padding:var(--space-4)}.sync-empty{padding:var(--space-5) 0}.sync-empty-message{margin-bottom:var(--space-5)}.sync-hint{margin-bottom:var(--space-4)}.sync-status-label{font-weight:500}.sync-account-row{display:flex;align-items:baseline;gap:var(--space-3);margin-bottom:var(--space-5);font-size:var(--font-size-sm)}.sync-account-label{color:var(--content-muted)}.sync-account-value{color:var(--content)}.sync-account-username{color:var(--content-muted)}.sync-banner-title{font-weight:500;margin:0 0 var(--space-3) 0}.sync-banner-body{margin:0 0 var(--space-2) 0;font-size:var(--font-size-sm);color:var(--content-secondary)}.sync-banner-tier-line{margin:0 0 var(--space-4) 0;font-size:var(--font-size-sm);color:var(--content-secondary)}.sync-banner-actions{display:flex;gap:var(--space-2);align-items:center}.settings-subheading{margin-bottom:var(--space-3);font-size:var(--font-size-md, .9rem)}.settings-desc-block{font-size:var(--font-size-sm);color:var(--content-secondary);margin-bottom:var(--space-4)}.settings-actions-row{display:flex;flex-wrap:wrap;gap:var(--space-3);margin-bottom:var(--space-4)}.settings-actions-row--center{align-items:center;flex-wrap:nowrap;margin-top:var(--space-3)}.settings-status-text{font-size:var(--font-size-sm);color:var(--content-secondary)}.settings-toggle-row{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3);margin:var(--space-3) 0}.settings-toggle-row>div{flex:1}.settings-toggle-row .settings-desc{margin-bottom:0}.settings-section-block{padding-top:var(--space-4);border-top:var(--border-width-sm) solid var(--border)}.form-hint--spaced{margin-top:var(--space-2)}.empty-italic{color:var(--content-secondary);font-style:italic}.form-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-4)}.email-detect-status{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-1)}.email-detect-note{font-size:var(--font-size-sm);margin-top:var(--space-2);padding:var(--space-3) var(--space-3);background:var(--surface-sunken);border-left:3px solid var(--action);border-radius:var(--radius-sm);line-height:var(--line-height-normal)}.account-row{padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-sm);margin-bottom:var(--space-2)}.account-row-header{display:flex;justify-content:space-between;align-items:flex-start}.account-row-name{font-weight:600}.account-row-meta{font-size:var(--font-size-sm);color:var(--content-secondary)}.account-row-sync{font-size:var(--font-size-sm);color:var(--content-secondary)}.account-row-provider-badge{font-size:var(--font-size-xs, .7rem);padding:.125rem .375rem;background:var(--action);color:var(--content-on-action);border-radius:var(--radius-xs);margin-left:var(--space-2)}.test-conn-result{padding:var(--space-2);background:var(--surface-overlay);border-radius:var(--radius-sm);margin-bottom:var(--space-2)}.test-conn-result--success{color:var(--success)}.test-conn-result--error{color:var(--danger)}.folder-list{max-height:150px;overflow-y:auto;background:var(--surface-overlay);padding:var(--space-2);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm)}.folder-list-meta{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-2)}.error-pre{background:var(--surface-overlay);padding:var(--space-2);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--font-size-sm);white-space:pre-wrap;max-height:150px;overflow-y:auto}.test-conn-section{border-top:var(--border-width-sm) solid var(--border);margin:var(--space-4) 0;padding-top:var(--space-4)}.oauth-waiting{text-align:center;padding:var(--space-5)}.oauth-waiting-title{font-size:var(--font-size-lg, 1.25rem);margin-bottom:var(--space-4)}.oauth-waiting-body{color:var(--content-secondary);margin-bottom:var(--space-5)}.oauth-waiting-spinner{margin:0 auto var(--space-5)}.contact-card-header{gap:var(--space-3)}.contact-card-body{flex:1;min-width:0}.contact-detail-header{display:flex;align-items:center;gap:var(--space-4);margin-bottom:var(--space-5)}.contact-detail-name{margin:0}.contact-detail-tags{margin-bottom:var(--space-4)}.form-actions--spaced{margin-top:var(--space-5)}.milestones-empty{color:var(--content-muted);font-size:var(--font-size-sm);margin-bottom:var(--space-4)}.bulk-modal-prompt{color:var(--content-secondary);margin-bottom:var(--space-2)}.bulk-modal-prompt--wide{margin-bottom:var(--space-3)}.bulk-modal-scroll{max-height:300px;overflow-y:auto;display:flex;flex-direction:column;gap:var(--space-1)}.bulk-priority-row{display:flex;gap:var(--space-2)}.snooze-hint{font-size:var(--font-size-sm);color:var(--content-secondary);margin:0 0 var(--space-3) 0}.time-tracking-empty{color:var(--content-secondary);padding:var(--space-4) 0}.backups-empty{color:var(--content-secondary);font-style:italic}.backup-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:var(--space-2)}.backup-item-meta{font-size:var(--font-size-sm);color:var(--content-secondary)}.export-desc{font-size:var(--font-size-sm);color:var(--content-secondary);margin-bottom:var(--space-5)}.export-note{margin-top:var(--space-4);padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-sm)}.export-note-text{font-size:var(--font-size-sm);color:var(--content-secondary);margin:0}.paint-time-preview{font-weight:600;color:var(--action);margin-bottom:var(--space-2)}.recurrence-config{display:none;margin-top:var(--space-2);padding:var(--space-2);border:1px solid var(--border);border-radius:var(--radius-sm)}.recurrence-config:not(.hidden){display:block}.recurrence-preview{font-size:var(--font-size-sm);color:var(--action);font-weight:600;margin-bottom:var(--space-2)}.recurrence-sublabel{font-size:var(--font-size-xs, .75rem)}.recurrence-unit{font-size:var(--font-size-sm)}.recurrence-day-label{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm)}.recurrence-nth-toggle{font-size:var(--font-size-sm);margin:var(--space-1) 0}.recurrence-row{margin-bottom:var(--space-2)}.recurrence-row.recurrence-hidden{display:none}.recurrence-interval-row{display:flex;align-items:center;gap:var(--space-2)}.recurrence-num{width:4rem}.recurrence-weekdays{display:flex;gap:var(--space-1);flex-wrap:wrap}.recurrence-monthly{margin-bottom:0}.recurrence-monthly.recurrence-hidden{display:none}.recurrence-monthly-stack{display:flex;flex-direction:column;gap:var(--space-2)}.recurrence-monthly-week{width:auto}.confirm-message-wrap{margin-bottom:var(--space-5)}.confirm-message{color:var(--content-secondary);line-height:var(--line-height-normal)}.review-intro{color:var(--content-secondary);font-size:var(--font-size-sm);margin:0 0 var(--space-4)}.review-intro--weekly{margin:var(--space-2) 0 var(--space-4)}.no-events-day{color:var(--content-secondary)}.loading--error{color:var(--danger)}.project-dashboard-desc{color:var(--content-secondary);margin-bottom:var(--space-4)}.pending-key-hint{position:fixed;bottom:var(--space-5);left:50%;transform:translateX(-50%);padding:var(--space-2) var(--space-4);background:var(--surface-raised);color:var(--content);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);z-index:10000;font-size:var(--font-size-sm);white-space:nowrap;animation:toastSlideIn .15s ease}.pending-key-hint-label{opacity:.7}.pending-key-hint kbd{background:var(--surface-overlay);border:1px solid var(--border);border-radius:var(--radius-xs);padding:.125rem .4rem;font-family:inherit;font-size:var(--font-size-sm)}.shortcuts-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--overlay);display:flex;align-items:center;justify-content:center;z-index:3000}.shortcuts-overlay-panel{background:var(--surface-raised);border-radius:var(--radius-md);padding:var(--space-5);max-width:600px;max-height:80vh;overflow-y:auto}.shortcuts-title{margin-top:0;margin-bottom:var(--space-4);border-bottom:1px solid var(--border);padding-bottom:var(--space-2)}.shortcuts-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-5)}.shortcuts-group-heading{color:var(--content-secondary);font-size:var(--font-size-sm);margin-bottom:var(--space-2)}.shortcuts-group-heading+.shortcut-row{margin-top:0}.shortcuts-group-heading-spaced{color:var(--content-secondary);font-size:var(--font-size-sm);margin-bottom:var(--space-2);margin-top:var(--space-3)}.shortcuts-close{margin-top:var(--space-5);text-align:center}.shortcut-row{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.shortcut-row kbd{background:var(--surface-overlay);border:1px solid var(--border);border-radius:var(--radius-xs);padding:.25rem .5rem;font-family:inherit;font-size:var(--font-size-sm);min-width:1.5rem;text-align:center}.shortcut-row span{color:var(--content-secondary);font-size:var(--font-size-sm);margin-left:auto}.quick-add-syntax{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-2);line-height:var(--line-height-relaxed)}.quick-add-syntax>span{margin-right:var(--space-3)}.quick-add-syntax kbd{font-size:.7rem;padding:.1rem .3rem;border:1px solid var(--border);border-radius:var(--radius-xs);background:var(--surface-overlay)}.virtual-scroller-wrapper{position:relative;width:100%}.virtual-scroller-spacer{height:0;width:100%}.meta-text{font-size:var(--font-size-sm);color:var(--content-muted)}.meta-text--secondary{color:var(--content-secondary)}.subtasks-empty{color:var(--content-secondary);text-align:center;padding:var(--space-4)}.subtask-linked-tag{color:var(--action);font-size:var(--font-size-sm)}.task-actions-bar{display:flex;flex-wrap:wrap;gap:var(--space-2);margin-top:var(--space-4);padding-top:var(--space-3);border-top:1px solid var(--border)}.error-state--padded{padding:var(--space-4)}.event-cell--shrink{flex:0 0 auto;padding-right:0}.hr-soft{border:none;border-top:1px solid var(--border);margin:var(--space-2) 0}.card-badge--success{background:var(--success);color:var(--content-on-action)}.card-badge--warning{background:var(--warning)}.card-badge--info{background:var(--action);color:var(--content-on-action)}.card-badge--danger{background:var(--danger);color:var(--content-on-action)}.card-badge--neutral{background:var(--surface-overlay)}.empty-italic--muted{color:var(--content-muted);font-style:italic}.review-history-block{margin-top:var(--space-5);padding-top:var(--space-4);border-top:1px dashed var(--border)}.review-history-heading{font-size:var(--font-size-sm);color:var(--content-muted);margin-bottom:var(--space-3)}.email-attachment-row{display:flex;align-items:center;gap:var(--space-2);padding:.375rem 0}.email-attachment-size{font-size:var(--font-size-sm);color:var(--content-muted);flex-shrink:0}.email-attachments-block{margin-bottom:var(--space-3);padding:var(--space-2) var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-sm);border:1px solid var(--border)}.email-attachments-heading{font-size:var(--font-size-sm);font-weight:600;color:var(--content-secondary);margin-bottom:var(--space-1)}.email-thread-count{color:var(--content-muted);font-size:var(--font-size-sm)}.email-subject-line{font-weight:600;font-size:1.1rem}.email-meta-line{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-1)}.email-snoozed-tag{color:var(--warning)}.email-actions-bar{border-top:1px solid var(--border);padding-top:var(--space-4);margin-top:auto}.email-attachment-tag{margin-right:var(--space-2)}.email-draft-item{cursor:pointer;padding:var(--space-3)}.email-draft-meta{font-size:var(--font-size-sm);color:var(--content-secondary)}.label-existing-line{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-1)}.search-no-results{padding:var(--space-5);text-align:center;color:var(--content-secondary)}.email-attachment-name{flex:1;min-width:0}.email-draft-subject{font-weight:500}.header-row{display:flex;align-items:center;padding:.75rem 1rem;border-bottom:1px solid var(--border);gap:.5rem}.header-row--tight{padding:.25rem 1rem}.header-label{width:80px;color:var(--content-secondary);font-size:.875rem;flex-shrink:0}.autocomplete-wrapper{position:relative;flex:1;background:0 0;border-radius:var(--radius-sm)}.autocomplete-wrapper:focus-within{background:var(--surface-overlay)}.body-container{flex:1;display:flex;flex-direction:column;overflow:hidden}.body-textarea{flex:1;min-height:12rem;background:var(--surface-raised);border:none;color:var(--content);font-size:.9375rem;font-family:inherit;padding:1rem;resize:vertical;outline:0;line-height:1.6}.body-textarea::placeholder{color:var(--content-muted)}.reply-indicator{display:none;color:var(--content-secondary);font-size:.8125rem;align-self:center}.compose-attachments{padding:.5rem 1rem;border-top:1px solid var(--border);background:var(--surface-overlay);font-size:.8125rem}.compose-attachment-item{padding:.25rem 0}.compose-attachment-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.compose-attachment-size{color:var(--content-muted);flex-shrink:0}.compose-attachment-remove{background:0 0;border:none;color:var(--danger);cursor:pointer;font-size:1rem;padding:0 .25rem}.compose-attachment-total{display:flex;gap:var(--space-2);align-items:baseline;padding-top:var(--space-2);margin-top:var(--space-1);font-size:var(--font-size-sm);color:var(--content-muted);border-top:1px dashed var(--border)}.compose-attachment-total.over-warn{color:var(--warning)}.compose-attachment-total.over-cap{color:var(--danger)}.compose-attachment-warn{font-style:italic}.about-info-list{display:grid;grid-template-columns:max-content 1fr;column-gap:var(--space-4);row-gap:var(--space-2);margin:var(--space-4) 0;font-size:var(--font-size-sm)}.about-info-list dt{font-weight:600;color:var(--content-secondary)}.about-info-list dd{margin:0;font-family:var(--font-mono)}.about-updater-note{margin-top:var(--space-4)}.filter-count{font-size:var(--font-size-sm);color:var(--content-muted);margin-right:var(--space-2);white-space:nowrap}.filter-count--capped{color:var(--warning);font-weight:600}.ui-mode-mobile #task-view-toggle{display:none}.swipe-peek{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding:0 var(--space-3);font-size:var(--font-size-sm);font-weight:600;color:var(--content-on-action);pointer-events:none;opacity:0;transition:opacity .1s linear;z-index:0}.swipe-peek--right{left:0;background:var(--action);justify-content:flex-start}.swipe-peek--left{right:0;background:var(--action);justify-content:flex-end}.swipe-peek--success{background:var(--success)}.swipe-peek--warn{background:var(--warning);color:var(--content)}.swipe-peek--danger{background:var(--danger)}.swipe-peek--ready{box-shadow:inset 0 0 0 2px var(--content-on-action)}.email-item,.event-row-virtual,.task-row{position:relative;overflow:hidden}.attachment-item{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) 0;border-bottom:1px solid var(--border)}.attachment-icon{font-size:1.2rem}.attachment-meta{font-size:var(--font-size-sm);color:var(--content-muted)}.attachment-sync-warning{font-size:var(--font-size-sm);color:var(--content-muted)}.attachment-info{flex:1;min-width:0}.attachment-filename{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-actions{display:flex;gap:var(--space-1)}.attachment-attach-row{margin-top:var(--space-4)}.link-task-item{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2);background:var(--surface-overlay);border-radius:var(--radius-sm);margin-bottom:var(--space-2);cursor:pointer}.link-task-item:hover{background:var(--surface-sunken)}.link-task-project{font-size:var(--font-size-sm);color:var(--content-secondary)}.link-task-prompt{color:var(--content-secondary);margin-bottom:var(--space-4)}.link-task-desc{flex:1}.link-task-list{max-height:400px;overflow-y:auto}.form-actions--top-spaced{margin-top:var(--space-4)}.about-panel{text-align:center;padding:var(--space-4)}.about-title{font-family:var(--font-display);margin-bottom:var(--space-4)}.about-tagline{color:var(--content-secondary);margin-bottom:var(--space-2)}.about-version{color:var(--content-muted);font-size:var(--font-size-sm)}.welcome-panel{line-height:var(--line-height-relaxed)}.welcome-intro{color:var(--content-secondary);margin-bottom:var(--space-4)}.welcome-section{margin-bottom:var(--space-4)}.welcome-subhead{font-size:var(--font-size-md, .9rem);margin-bottom:var(--space-2)}.welcome-subhead--tight{margin-bottom:var(--space-1)}.welcome-step-stack{display:flex;flex-direction:column;gap:var(--space-2)}.welcome-tabs-list{color:var(--content-secondary);font-size:var(--font-size-sm);padding-left:var(--space-4);margin:0}.whats-new-panel{line-height:var(--line-height-relaxed)}.whats-new-group{font-size:var(--font-size-md, .9rem);margin:var(--space-3) 0 var(--space-1)}.whats-new-group:first-child{margin-top:0}.whats-new-list{color:var(--content-secondary);font-size:var(--font-size-sm);padding-left:var(--space-4);margin:0}.whats-new-text{color:var(--content-secondary);margin-bottom:var(--space-2)}.review-more-line{color:var(--content-muted);font-size:var(--font-size-sm);margin-top:var(--space-2)}.modal-attachments{font-size:var(--font-size-sm);margin-top:var(--space-1)}.account-row-info{flex:1}.account-row-actions{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2)}.account-row-quick{display:flex;gap:var(--space-2)}.account-row-quick .btn{flex:1}.account-list{margin-bottom:var(--space-4);max-height:400px;overflow-y:auto}.form-actions-spacer{flex:1}.oauth-block{margin-bottom:var(--space-5)}.oauth-block-title{font-weight:500;margin-bottom:var(--space-3)}.oauth-buttons{display:flex;flex-wrap:wrap;gap:var(--space-2)}.oauth-buttons .btn{flex:1;min-width:120px}.oauth-helptext{font-size:var(--font-size-sm);color:var(--content-secondary);margin-top:var(--space-2)}.imap-block-divider{border-top:var(--border-width-sm) solid var(--border);margin:var(--space-4) 0;padding-top:var(--space-4)}.imap-block-title{font-weight:500;margin-bottom:var(--space-3)}.test-conn-results{margin-bottom:var(--space-4)}.sync-results{margin-bottom:var(--space-4)}.sync-result-banner{padding:var(--space-3);background:var(--surface-overlay);border-radius:var(--radius-sm);margin-bottom:var(--space-2)}.sync-result-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-2);margin-bottom:var(--space-2)}.sync-result-tile{padding:var(--space-2);background:var(--surface-overlay);border-radius:var(--radius-sm)}.app-footer{background-color:var(--surface-raised);border-top:var(--border-width) solid var(--border);padding:.75rem 1.5rem}.footer-content{max-width:var(--width-container);margin:0 auto;display:flex;justify-content:space-between;align-items:center}.ui-mode-desktop .keyboard-hints{display:flex;gap:1rem;font-size:.8rem;color:var(--content-muted)}kbd{display:inline-block;padding:.2rem .5rem;background-color:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-xs);font-family:var(--font-mono);font-size:.75rem;font-weight:700}.welcome-hint{color:var(--content-secondary);font-size:var(--font-size-sm);margin-bottom:var(--space-2)}.version{font-size:.75rem;color:var(--content-muted);font-weight:600}.empty-state{text-align:center;padding:3rem;color:var(--content-secondary)}.empty-state--compact{padding:2rem 1rem;font-size:var(--font-size-sm)}.empty-state--dashboard{padding:2rem 1rem}.empty-state--error{color:var(--danger)}.empty-state-icon{display:flex;justify-content:center;margin-bottom:var(--space-3);color:var(--content-muted)}.empty-state-icon svg{width:2.75rem;height:2.75rem}.empty-state--compact .empty-state-icon svg,.empty-state--dashboard .empty-state-icon svg{width:2rem;height:2rem}.empty-state-text{font-size:1.1rem;font-weight:600;margin-bottom:1rem}.empty-state--compact .empty-state-text,.empty-state--dashboard .empty-state-text{font-size:var(--font-size-sm);font-weight:500;margin-bottom:var(--space-2)}.error-state{text-align:center;padding:2rem;color:var(--danger);background:color-mix(in srgb,var(--danger) 10%,var(--surface-raised));border:var(--border-width-sm) solid var(--danger);border-radius:var(--radius-sm);font-weight:600}.view{display:block}.view.hidden{display:none}.filter-bar{display:flex;flex-wrap:wrap;gap:.75rem;margin-bottom:1.5rem;padding:1rem;background-color:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.filter-group{display:flex;align-items:center;gap:.5rem}.filter-label{font-size:.8rem;font-weight:700;color:var(--content-secondary);text-transform:uppercase;letter-spacing:.05em}.filter-select{padding:.5rem .75rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);background-color:var(--surface-raised);color:var(--content);font-size:.875rem;font-weight:600}.filter-select:focus{outline:0;background-color:var(--action);color:var(--content-on-action)}.filter-checkbox{display:flex;align-items:center;gap:.4rem;font-size:.875rem;font-weight:600;color:var(--content);cursor:pointer}.filter-checkbox input[type=checkbox]{width:1rem;height:1rem;cursor:pointer}.btn-link{background:0 0;border:none;box-shadow:none;color:var(--content-secondary);font-size:.875rem;cursor:pointer;text-decoration:underline;padding:.5rem}.btn-link:hover{box-shadow:none;transform:none;color:var(--content)}@media (min-width:1400px){.ui-mode-desktop .main-content{max-width:1600px}.ui-mode-desktop .cards-grid{grid-template-columns:repeat(auto-fill,minmax(380px,1fr))}.ui-mode-desktop .project-dashboard-grid{gap:2rem}.ui-mode-desktop .day-plan-sidebar{width:320px}.ui-mode-desktop .modal-container{max-width:640px}}@media (max-width:1024px){.ui-mode-desktop .saved-views-sidebar{width:180px}.ui-mode-desktop .day-plan-sidebar{width:240px}.ui-mode-desktop .project-dashboard-grid{grid-template-columns:1fr 1fr;gap:1rem}.ui-mode-desktop .project-dashboard-grid .dashboard-column:last-child{grid-column:span 2}.ui-mode-desktop .filter-bar{flex-wrap:wrap}.ui-mode-desktop .filter-actions{width:100%;justify-content:flex-end;margin-top:.5rem}}.ui-mode-mobile .tab-navigation{flex-wrap:wrap;gap:.5rem}.ui-mode-mobile .tab{flex:1 1 auto;min-width:calc(33% - .5rem);justify-content:center;padding:.625rem .75rem}.ui-mode-mobile .tab-label{display:none}.ui-mode-mobile .tab-icon{font-size:1.25rem}.ui-mode-mobile .kbd-hint{display:none}.ui-mode-mobile .cards-grid{grid-template-columns:1fr}.ui-mode-mobile .task-table{font-size:.85rem}.ui-mode-mobile .task-header-row,.ui-mode-mobile .task-row{grid-template-columns:1fr 80px 40px 80px}.ui-mode-mobile .task-header-row .task-cell:nth-child(n+5),.ui-mode-mobile .task-row .task-cell:nth-child(n+5){display:none}.ui-mode-mobile .filter-bar{flex-direction:column}.ui-mode-mobile .keyboard-hints{display:none}.ui-mode-mobile .page-title{font-size:1.5rem}.ui-mode-mobile .saved-views-sidebar{display:none}.ui-mode-mobile .day-plan-content{flex-direction:column}.ui-mode-mobile .day-plan-sidebar{width:100%;max-height:200px}.ui-mode-mobile .project-dashboard-grid{grid-template-columns:1fr}.ui-mode-mobile .project-dashboard-grid .dashboard-column:last-child{grid-column:span 1}.ui-mode-mobile .modal-container{width:95%;max-height:95vh}.ui-mode-mobile .bulk-actions-bar{flex-wrap:wrap}.ui-mode-mobile .bulk-select-all{width:100%;margin-top:.5rem}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pagination-controls{display:flex;align-items:center;justify-content:center;gap:1rem;padding:1rem;margin-top:1rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md)}.pagination-info{font-weight:600;color:var(--content-secondary);font-size:.9rem}.pagination-controls .btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible,.card:focus-visible,.email-item:focus-visible,.event-row-virtual:focus-visible,.filter-select:focus-visible,.form-input:focus-visible,.form-select:focus-visible,.form-textarea:focus-visible,.modal-close:focus-visible,.saved-view-item:focus-visible,.snooze-option:focus-visible,.tab:focus-visible,.task-row:focus-visible,.timeline-item:focus-visible,.unscheduled-task:focus-visible{outline:3px solid var(--action);outline-offset:2px}.event-row,.task-row-clickable{cursor:pointer}.skip-link{position:absolute;top:-100px;left:0;background:var(--action);color:var(--content-on-action);padding:.75rem 1.5rem;z-index:9999;font-weight:700;border:var(--border-width) solid var(--border);text-decoration:none}.skip-link:focus{top:0}.source-email-link{padding:.75rem;background:var(--surface-overlay);border-radius:var(--radius-sm);border-left:4px solid var(--action)}.thread-message{margin-bottom:1rem;padding:.75rem;background:var(--surface-overlay);border-radius:var(--radius-sm)}.thread-message-latest{border-left:3px solid var(--action)}.thread-message-header{display:flex;justify-content:space-between;margin-bottom:.5rem;font-size:.8rem;color:var(--content-secondary)}.thread-message-from{font-weight:700}.email-reader-body{white-space:pre-wrap;font-size:.9rem;line-height:1.6;color:var(--content);word-wrap:break-word;overflow-wrap:break-word}.email-reader-body .email-link{color:var(--action);text-decoration:underline;cursor:pointer;word-break:break-all}.email-reader-body .email-link:hover{color:var(--category-six)}.email-reader-body hr{border:none;border-top:2px solid var(--border);margin:1rem 0}.email-reader-quote{border-left:3px solid var(--content-muted);padding-left:1rem;margin:.5rem 0;color:var(--content-secondary);font-style:italic}.email-quote-toggle{display:inline-block;color:var(--content-muted);font-size:.8125rem;cursor:pointer;padding:.25rem 0;user-select:none}.email-quote-toggle:hover{color:var(--action)}.email-quote-block{border-left:3px solid var(--content-muted);padding-left:1rem;margin:.25rem 0 .5rem;color:var(--content-secondary)}.email-quote-block.hidden{display:none}.autocomplete-dropdown{background:var(--surface-raised);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-brutal-md);z-index:100;max-height:200px;overflow-y:auto}.autocomplete-item{padding:.5rem .75rem;cursor:pointer;font-size:.875rem}.autocomplete-item.active,.autocomplete-item:hover{background:var(--surface-overlay)}.autocomplete-name{font-weight:500}.autocomplete-email{color:var(--content-secondary);margin-left:.25rem}.email-reader-container{display:flex;flex-direction:column;height:100%;min-height:0}.email-reader-header{margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--border)}.email-sender-contact{margin-top:.5rem;padding:.4rem .5rem;background:var(--surface-sunken);border-radius:4px}.email-sender-info{display:flex;flex-direction:column;flex:1;min-width:0}.email-sender-name{font-weight:600;font-size:.85rem}.email-sender-company{font-size:.75rem;color:var(--content-secondary)}.email-reader-thread{flex:1;overflow-y:auto;margin-bottom:1rem;min-height:0}.dropdown{position:relative;display:inline-block}.dropdown-menu{display:none;position:absolute;bottom:100%;left:0;margin-bottom:.25rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);min-width:160px;z-index:100}.dropdown-menu.show{display:block}.dropdown-item{display:block;width:100%;padding:.5rem 1rem;text-align:left;background:0 0;border:none;cursor:pointer;font-size:.875rem;color:var(--content)}.dropdown-item:hover{background:var(--surface-overlay)}.dropdown-item:first-child{border-radius:var(--radius-md) var(--radius-md) 0 0}.dropdown-item:last-child{border-radius:0 0 var(--radius-md) var(--radius-md)}.context-menu{position:fixed;z-index:10000;min-width:180px;max-width:280px;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-brutal-lg);padding:.25rem 0;display:none}.context-menu.visible{display:block}.context-menu-item{display:flex;align-items:center;gap:.75rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;color:var(--content);cursor:pointer;border:none;background:0 0;width:100%;text-align:left;transition:background .1s}.context-menu-item:focus,.context-menu-item:hover{background:var(--action);color:var(--content-on-action);outline:0}.context-menu-item:focus-visible{outline:2px solid var(--action);outline-offset:-2px}.context-menu-header{font-size:.7rem;font-weight:700;color:var(--content-secondary);text-transform:uppercase;letter-spacing:.05em;padding:.5rem 1rem .25rem}.context-menu-item-icon{width:1.25rem;text-align:center;flex-shrink:0}.context-menu-item-label{flex:1}.context-menu-item-subtitle{display:block;font-size:.7rem;color:var(--content-secondary);font-weight:400}.context-menu-item-shortcut{font-size:.75rem;color:var(--content-muted);font-family:var(--font-mono)}.context-menu-item--danger{color:var(--danger)}.context-menu-item--danger:hover{background:var(--danger);color:var(--content-on-action)}.context-menu-separator{height:2px;background:var(--border);margin:.25rem .5rem}.context-menu-hint{padding:.35rem 1rem;font-size:.7rem;color:var(--content-muted);border-top:1px solid var(--border);margin-top:.25rem}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--surface-overlay);border-left:2px solid var(--border)}::-webkit-scrollbar-thumb{background:var(--content-muted);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm)}::-webkit-scrollbar-thumb:hover{background:var(--content-secondary)}.loading{display:flex;justify-content:center;align-items:center;height:200px;color:var(--content-secondary);font-family:var(--font-heading)}.skeleton-shimmer{display:flex;flex-direction:column;gap:1rem;padding:1rem}.skeleton-shimmer .skeleton-row{display:flex;align-items:center;gap:.75rem;padding:.75rem;background:var(--surface-raised);border-radius:var(--radius-md);border:var(--border-width) solid var(--border)}.skeleton-shimmer .skeleton-avatar{width:36px;height:36px;border-radius:var(--radius-full);background:linear-gradient(90deg,var(--surface-overlay) 25%,var(--surface-sunken) 50%,var(--surface-overlay) 75%);background-size:200% 100%;animation:skeleton-pulse 1.5s ease-in-out infinite;flex-shrink:0}.skeleton-shimmer .skeleton-lines{flex:1;display:flex;flex-direction:column;gap:.4rem}.skeleton-shimmer .skeleton-line{height:.75rem;border-radius:var(--radius-sm);background:linear-gradient(90deg,var(--surface-overlay) 25%,var(--surface-sunken) 50%,var(--surface-overlay) 75%);background-size:200% 100%;animation:skeleton-pulse 1.5s ease-in-out infinite}.skeleton-shimmer .skeleton-line.short{width:40%}.skeleton-shimmer .skeleton-line.medium{width:65%}.skeleton-shimmer .skeleton-line.long{width:90%}@keyframes skeleton-pulse{0%{background-position:200% 0}100%{background-position:-200% 0}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.spinner{display:inline-block;width:1em;height:1em;border:2px solid currentColor;border-top-color:transparent;border-radius:var(--radius-full);animation:spin .8s linear infinite}.btn-loading{position:relative;pointer-events:none;opacity:.8}.btn-loading .btn-text{visibility:hidden}.btn-loading::after{content:'';position:absolute;left:50%;top:50%;width:1em;height:1em;margin-left:-.5em;margin-top:-.5em;border:2px solid currentColor;border-top-color:transparent;border-radius:var(--radius-full);animation:spin .8s linear infinite}.hidden{display:none!important}.project-dashboard-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem;flex:1;min-height:0}.dashboard-column{background:var(--surface-raised);border:var(--border-width) solid var(--border);padding:1rem;display:flex;flex-direction:column;overflow:hidden}.dashboard-column-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:2px solid var(--border)}.dashboard-column-header h3{margin:0;font-size:1rem;font-family:var(--font-heading);font-weight:700}.dashboard-list{flex:1;overflow-y:auto}.dashboard-item-title{font-weight:600;margin-bottom:.25rem}.dashboard-item-meta{font-size:.75rem;color:var(--content-secondary)}.task-badges{display:flex;gap:.25rem;margin-top:.25rem}.task-badge{font-size:.65rem;padding:.15rem .4rem;border:var(--border-width-sm) solid var(--border);background:var(--surface-overlay);color:var(--content);font-weight:600}.task-badge.has-items{background:var(--action);color:var(--content-on-action)}.task-badge.recurrence{background:var(--category-five);color:var(--content-on-action)}.token-dot{-webkit-appearance:none;appearance:none;display:inline-block;width:.6rem;height:.6rem;padding:0;line-height:0;border-radius:50%;border:var(--border-width-sm) solid var(--border);background:var(--content-muted);cursor:pointer;vertical-align:middle;flex:none}.token-dot--neutral{background:0 0;border-color:var(--content-muted);opacity:.5}.token-dot--pending{background:var(--warning)}.token-dot--complete{background:var(--success)}.token-dot:focus-visible{outline:var(--border-width-sm) solid var(--focus-ring);outline-offset:2px}.token-item{display:flex;align-items:center;gap:.4rem;padding:.35rem 0;border-bottom:var(--border-width-sm) solid var(--border)}.token-item .token-dot{cursor:default}.token-ref{font-family:var(--font-mono);font-size:.8rem;word-break:break-all}.token-ref--primary{font-weight:700}.token-primary-tag{font-family:inherit;font-size:.6rem;text-transform:uppercase;letter-spacing:.03em;padding:.05rem .3rem;border:var(--border-width-sm) solid var(--border);background:var(--success);color:var(--content-on-action)}.task-row-clickable{cursor:pointer;transition:background .1s}.task-row-clickable:hover{background:var(--surface-overlay)}.progress-bar-container{width:100%;height:10px;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);overflow:hidden}.progress-bar{height:100%;background:var(--success);transition:width .3s ease}.no-subtasks{color:var(--content-secondary);font-size:.875rem}#day-plan-view{display:flex;flex-direction:column;flex:1;min-height:0}#day-plan-view .page-header{flex-shrink:0}.day-plan-nav{display:flex;align-items:center;gap:.5rem}.day-plan-date-picker{padding:.5rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);color:var(--content);font-family:var(--font-body)}.day-plan-date-display{font-size:1.25rem;font-weight:700;margin-left:1rem;font-family:var(--font-heading);line-height:1}.day-plan-content{flex:1;min-height:0;display:flex;gap:1.5rem}.day-plan-main{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.day-plan-sidebar{width:280px;flex-shrink:0;display:flex;flex-direction:column;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);overflow:hidden;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.sidebar-header{padding:1rem;border-bottom:2px solid var(--border);flex-shrink:0}.sidebar-header h3{margin:0;font-size:1rem;font-family:var(--font-heading);font-weight:700}.sidebar-task-list{flex:1;overflow-y:auto;padding:.75rem;display:flex;flex-direction:column;gap:.5rem}.timeline-container{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.timeline-scroll-area{position:relative;padding:.5rem 1rem 3rem .5rem;min-height:min-content}#timeline-slots{position:relative}#timeline-items{position:absolute;top:.5rem;left:.5rem;right:1rem;bottom:0;pointer-events:none}#timeline-items .timeline-item{pointer-events:auto}.timeline-slot{display:grid;grid-template-columns:50px 1fr;height:var(--timeline-slot-h,12px);position:relative}.timeline-slot.hour-start .timeline-slot-area{border-top:1px dashed color-mix(in srgb,var(--border) 50%,transparent)}.timeline-time{font-size:.7rem;color:var(--content-secondary);padding-right:.5rem;text-align:right;font-weight:500;transform:translateY(-.5em)}.timeline-hint{text-align:center;color:var(--content-secondary);font-size:.85rem;font-weight:600;margin:0 0 .5rem;padding:.35rem .75rem;background:var(--surface-overlay);border-radius:var(--radius-sm)}.timeline-slot-area{position:relative;cursor:grab}.timeline-slot-area:hover{background:var(--surface-overlay)}.timeline-item{position:absolute;left:60px;right:10px;border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);padding:.25rem .5rem;overflow:hidden;cursor:grab;z-index:10;transition:opacity .15s ease,box-shadow .15s ease}.timeline-item.task{background:var(--success);color:var(--content)}.timeline-item.event{background:var(--action);color:var(--content-on-action)}.timeline-item.block{opacity:.85}.timeline-item.block-free_time{background:var(--category-six);color:var(--content)}.timeline-item.block-personal{background:var(--warning);color:var(--content)}.timeline-item.block-vacation{background:var(--category-five);color:var(--content-on-action)}.timeline-item.block-focus{background:var(--danger);color:var(--content-on-action)}.timeline-item.conflict{box-shadow:0 0 0 3px var(--danger)}.timeline-item.selected{box-shadow:0 0 0 3px var(--surface-raised),0 0 0 6px var(--action)}.timeline-item-title{font-weight:600;font-size:.75rem;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.timeline-item-meta{font-size:.65rem;opacity:.85;line-height:1.1}.timeline-current-time{position:absolute;left:50px;right:0;height:2px;background:var(--danger);z-index:20;pointer-events:none}.timeline-current-time::before{content:'';position:absolute;left:-4px;top:-3px;width:8px;height:8px;background:var(--danger);border-radius:var(--radius-full)}.timeline-paint-preview{position:absolute;left:70px;right:10px;background:var(--action);opacity:.4;border:var(--border-width-sm) dashed var(--border);border-radius:var(--radius-sm);z-index:5;pointer-events:none}.timeline-item.dragging{cursor:grabbing;opacity:.8;z-index:100;box-shadow:var(--shadow-brutal-md,4px 4px 0 var(--border))}.timeline-container.is-painting{cursor:crosshair;user-select:none}.timeline-container.is-painting .timeline-slot-area{pointer-events:none}.unscheduled-task{padding:.75rem;background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-left:6px solid var(--success);border-radius:var(--radius-sm);cursor:grab;transition:background-color .1s}.unscheduled-task:hover{background:var(--surface-overlay)}.unscheduled-task.priority-high{border-left-color:var(--danger)}.unscheduled-task.priority-medium{border-left-color:var(--warning)}.unscheduled-task.priority-low{border-left-color:var(--success)}.unscheduled-task-title{font-weight:600;margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.unscheduled-task-meta{font-size:.75rem;color:var(--content-secondary)}.empty-unscheduled{text-align:center;color:var(--content-secondary);padding:2rem 1rem}.shortcut-hint-btn{font-family:var(--font-mono, monospace);font-weight:700;min-width:2rem;padding:.5rem}.settings-section h3{font-size:1rem;color:var(--content)}.settings-section .form-hint{font-size:.75rem;color:var(--content-secondary)}.settings-overlay{position:fixed;inset:0;z-index:70;display:flex;align-items:center;justify-content:center;padding:var(--space-4)}.settings-overlay.hidden{display:none}.settings-overlay-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.35)}.settings-overlay-card{position:relative;background:var(--surface-page);border:1px solid var(--border);border-radius:var(--radius-lg,8px);box-shadow:0 12px 40px rgba(0,0,0,.25);width:min(960px,100%);height:min(720px,100%);max-height:calc(100vh - 2 * var(--space-4));overflow:hidden;display:flex;flex-direction:column}.settings-overlay-card.hidden{display:none}.ui-mode-mobile .settings-overlay{padding:0}.ui-mode-mobile .settings-overlay-card{width:100%;height:100%;max-height:100%;border-radius:0;border:none}.settings-page-layout{display:flex;min-height:100%}.settings-sidebar{width:200px;flex-shrink:0;border-right:1px solid var(--border);padding:1.5rem 0;display:flex;flex-direction:column;gap:.25rem}.settings-nav-items{display:flex;flex-direction:column;gap:.125rem}.settings-nav-item{background:0 0;border:none;text-align:left;padding:.5rem 1.25rem;font-size:.875rem;color:var(--content-secondary);cursor:pointer;border-radius:0;border-left:2px solid transparent}.settings-nav-item:hover{background:var(--hover-surface);color:var(--content)}.settings-nav-item.active{color:var(--content);font-weight:600;border-left-color:var(--action);background:var(--surface-overlay)}.settings-content{flex:1;padding:1.5rem 2rem;max-width:640px;overflow-y:auto}.contact-header-card{display:flex;align-items:center;gap:1.25rem;margin-bottom:1.5rem}.contact-info-section{display:flex;flex-direction:column;gap:.375rem;margin-bottom:1.5rem;padding:1rem}.contact-info-item{font-size:.875rem}.contact-dashboard-summary{display:flex;gap:1.5rem;margin-bottom:1.5rem}.contact-summary-stat{display:flex;flex-direction:column;align-items:center;padding:.75rem 1.25rem;background:var(--surface-overlay);border-radius:var(--radius-md);min-width:80px}.contact-summary-count{font-size:1.5rem;font-weight:700;color:var(--content)}.contact-summary-label{font-size:.75rem;color:var(--content-secondary);margin-top:.25rem}.contact-timeline{display:flex;flex-direction:column;gap:.25rem}.contact-timeline-item{padding:.5rem .75rem;border-radius:var(--radius-sm);cursor:pointer;font-size:.875rem}.contact-timeline-item:hover{background:var(--hover-surface)}.contact-timeline-icon{flex-shrink:0;width:2rem;text-align:center;font-size:.8rem}.contact-timeline-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.contact-timeline-date{flex-shrink:0;font-size:.75rem;color:var(--content-secondary)}.address-highlight-mirror{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;white-space:nowrap;overflow:hidden;z-index:0;display:flex;align-items:center}.addr-malformed{color:var(--danger)}.addr-contact{color:var(--action)}.addr-verified{color:var(--success)}.addr-ghost{color:var(--content-muted);opacity:.5}.sync-indicator{background:0 0;border:none;cursor:pointer;padding:.25rem .5rem;border-radius:var(--radius-sm);transition:background var(--transition-fast)}.sync-indicator:hover{background:var(--hover-surface)}.sync-dot{width:8px;height:8px;border-radius:var(--radius-full);background:var(--content-muted);transition:background var(--transition-slow);flex-shrink:0}.sync-dot.connected{background:var(--success)}.sync-dot.syncing{background:var(--info);animation:sync-pulse 1s infinite}.sync-dot.warn{background:var(--warning);border-radius:0;transform:rotate(45deg)}.sync-dot.error{background:var(--danger);border-radius:0}.sync-label{font-size:var(--font-size-sm);color:var(--content-secondary);white-space:nowrap}.ui-mode-mobile .sync-label{display:none}@keyframes sync-pulse{0%,100%{opacity:1}50%{opacity:.4}}.snooze-options{display:flex;flex-direction:column;gap:.5rem}.snooze-option{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);color:var(--content);cursor:pointer;transition:background-color .1s;text-align:left;width:100%}.snooze-option:hover{background:var(--action);color:var(--content-on-action)}.snooze-option-label{font-weight:600}.snooze-option-time{font-size:.75rem;color:var(--content-secondary)}.snooze-option:hover .snooze-option-time{color:var(--content-on-action)}.snooze-custom{margin-top:.5rem;padding-top:.5rem;border-top:2px solid var(--border)}.snooze-badge{display:inline-block;font-size:.65rem;padding:.15rem .4rem;border:var(--border-width-sm) solid var(--border);background:var(--warning);color:var(--content);font-weight:700;margin-top:.25rem}.contact-badge{display:inline-block;font-size:.65rem;padding:.15rem .4rem;border:var(--border-width-sm) solid var(--border);background:var(--action);color:var(--surface-page);font-weight:700;margin-top:.25rem}.bulk-checkbox{width:18px;height:18px;cursor:pointer;accent-color:var(--action);border:var(--border-width-sm) solid var(--border)}.task-actions-cell{text-align:right;white-space:nowrap;display:flex;align-items:center;justify-content:flex-end;gap:.5rem}.task-actions-cell .bulk-checkbox{margin-right:.5rem}.kebab-btn{font-size:1.1rem;padding:.2rem .4rem;border-radius:var(--radius-sm);color:var(--content-secondary);opacity:0;transition:opacity .15s ease}.email-item:focus-within .kebab-btn,.email-item:hover .kebab-btn,.event-row-virtual:focus-within .kebab-btn,.event-row-virtual:hover .kebab-btn,.task-row:focus-within .kebab-btn,.task-row:hover .kebab-btn{opacity:1}.kebab-btn:hover{background:var(--hover-surface)}.task-recurrence{font-size:.85rem;color:var(--content-secondary)}.task-due{white-space:nowrap}.bulk-actions-bar{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;background:var(--action);color:var(--content-on-action);border:var(--border-width) solid var(--border);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border);margin-bottom:1rem}.bulk-actions-bar.hidden{display:none}.bulk-count{font-weight:700;margin-right:1rem;font-family:var(--font-heading)}.bulk-actions-bar .btn{background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);color:var(--content)}.bulk-actions-bar .btn:hover{background:var(--surface-overlay)}.bulk-select-all{margin-left:auto}.email-checkbox-cell{padding:.75rem .5rem;display:flex;align-items:center}.email-item-with-checkbox{display:flex;align-items:flex-start}.email-item-with-checkbox .email-content{flex:1}.time-block-form{display:flex;flex-direction:column;gap:1rem}.time-block-quick-options{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem}.time-block-quick-btn.selected{background:var(--action);color:var(--content-on-action);box-shadow:inset 0 0 0 2px var(--border)}.duration-presets{display:flex;gap:.5rem;flex-wrap:wrap}.duration-preset{padding:.35rem .75rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);color:var(--content);cursor:pointer;font-size:.75rem;font-weight:600;transition:background-color .1s}.duration-preset:hover{background:var(--surface-sunken)}.duration-preset.selected{background:var(--action);color:var(--content-on-action)}.conflict-warning{padding:.75rem;background:var(--danger);border:var(--border-width) solid var(--border);color:var(--content-on-action);font-size:.875rem;font-weight:600;margin-top:.5rem}.app-body{display:flex;flex:1;min-height:0;overflow:hidden}.app-body .main-content{flex:1;min-width:0;display:flex;flex-direction:column;overflow-x:visible;overflow-y:auto}#emails-view,#events-view,#projects-view,#tasks-view{padding-bottom:2.5rem}#tasks-view{display:flex;flex-direction:column;flex:1;min-height:0}#tasks-view .bulk-actions-bar,#tasks-view .filter-bar,#tasks-view .page-header{flex-shrink:0}#events-view{display:flex;flex-direction:column;flex:1;min-height:0}#events-view .page-header{flex-shrink:0}#emails-view{display:flex;flex-direction:column;flex:1;min-height:0}.email-filter-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto auto;gap:var(--space-2);align-items:center}.email-filter-row>.form-input,.email-filter-row>.form-select{width:100%;min-width:0}.email-filter-row>.form-select{width:9rem}.contacts-filter-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:var(--space-2);align-items:center}.contacts-filter-row>.form-input{width:100%;min-width:0}.contacts-filter-row>.filter-select{width:9rem;min-width:0}.work-hours-row{display:grid;grid-template-columns:auto auto auto;gap:var(--space-2);align-items:center}.work-hours-row>.form-select{width:auto}#emails-view .bulk-actions-bar,#emails-view .page-header{flex-shrink:0}.ui-mode-desktop .saved-views-sidebar{width:200px;flex-shrink:0;background:var(--surface-raised);border-right:var(--border-width) solid var(--border);display:flex;flex-direction:column;overflow:hidden}.sidebar-section{display:flex;flex-direction:column;flex:1;min-height:0}.sidebar-section-header{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content-secondary);border-bottom:2px solid var(--border);background:var(--surface-overlay)}.btn-icon{background:0 0;border:none;color:var(--content-muted);cursor:pointer;padding:.25rem;font-size:.875rem;line-height:1}.btn-icon:hover{color:var(--content)}.pinned-views-list{flex:1;overflow-y:auto;padding:.5rem}.sidebar-empty{text-align:center;padding:1.5rem .5rem;color:var(--content-muted);font-size:.8rem}.saved-view-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;margin-bottom:.5rem;background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font-size:.85rem;font-weight:600;color:var(--content);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border);transition:transform .15s ease,box-shadow .15s ease,background-color .15s ease,color .15s ease}.saved-view-item:hover{background:var(--action);color:var(--content-on-action)}.saved-view-item.active{background:var(--action);color:var(--content-on-action);box-shadow:inset 0 0 0 2px var(--border)}.saved-view-item .view-icon{font-size:.75rem}.saved-view-item .view-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.saved-view-item .view-actions{opacity:0;transition:opacity .1s}.saved-view-item:hover .view-actions{opacity:1}.filter-actions{display:flex;gap:.5rem;margin-left:auto}.avatar{width:40px;height:40px;min-width:40px;border-radius:50%;background-color:var(--action);color:var(--content-on-action);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;font-family:var(--font-heading);border:var(--border-width-sm) solid var(--border);flex-shrink:0}.avatar--sm{width:32px;height:32px;min-width:32px;font-size:.75rem;border:none}.avatar--lg{width:60px;height:60px;min-width:60px;font-size:1.2rem}.avatar--unknown{background:var(--surface-overlay);color:var(--content-secondary)}.contact-card .card-header{display:flex;align-items:center}.contact-nickname{display:block;font-size:.85rem;color:var(--content-secondary);font-style:italic}.contact-company{display:block;font-size:.85rem;color:var(--content-secondary)}.contact-email{font-size:.85rem;color:var(--content-secondary)}.contact-detail .detail-row{margin-bottom:.5rem;font-size:.9rem}.contact-detail .contact-info-section{margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-sunken)}.contact-detail .contact-notes{margin-bottom:1.5rem}.contact-detail .contact-notes p{margin-top:.25rem;white-space:pre-wrap;color:var(--content-secondary)}.sub-collection{margin-bottom:1.25rem}.sub-collection-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem}.sub-collection-header h4{margin:0;font-size:.95rem;font-weight:600}.sub-item{display:flex;justify-content:space-between;align-items:center;padding:.4rem 0;border-bottom:1px solid var(--surface-sunken);font-size:.9rem}.sub-item:last-child{border-bottom:none}.sub-empty{font-size:.85rem;color:var(--content-secondary);font-style:italic;padding:.25rem 0}.edit-sub-collections{border-top:1px solid var(--border);padding-top:1rem;margin-bottom:.5rem}.edit-sub-section{margin-bottom:.75rem}.edit-sub-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:.25rem}.sub-item-compact{font-size:.85rem;color:var(--content-secondary);padding:.125rem 0;display:flex;align-items:center;gap:var(--space-2);justify-content:space-between}.sub-item-actions{display:inline-flex;gap:var(--space-1);flex-shrink:0}.reminder-options{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);margin-top:var(--space-2)}.reminder-option{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--content-secondary);cursor:pointer}.task-drawer{position:fixed;top:0;right:0;bottom:0;width:min(480px,100vw);background:var(--surface-page);border-left:1px solid var(--border);box-shadow:-4px 0 18px rgba(0,0,0,.18);transform:translateX(100%);transition:transform 180ms ease-out;z-index:60;display:flex;flex-direction:column;overflow:hidden}.task-drawer.visible{transform:translateX(0)}.task-drawer-header{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border);background:var(--surface-overlay);flex-shrink:0}.task-drawer-title{flex:1;margin:0;font-size:var(--font-size-lg, 1.05rem);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.task-drawer-close{flex-shrink:0}.task-drawer-actions{display:flex;gap:var(--space-2);flex-shrink:0}.task-drawer-content{flex:1;overflow-y:auto;padding:var(--space-4)}.task-row--active{background:var(--surface-overlay);box-shadow:inset 3px 0 0 var(--action)}.ui-mode-mobile .task-drawer{width:100vw;border-left:none}@media print{.btn,.card-badge,.context-menu,.filter-bar,.focus-section .btn,.focus-slot .btn,.header,.keyboard-hints,.modal-overlay,.pagination,.review-actions-grid,.sidebar,.tab-badge,.tab-nav,.tab-status-dot,.tabs,.toast,.virtual-scroller-spacer{display:none!important}body{background:#fff;color:#000}.main-content,.weekly-review-content{margin:0;padding:0;max-width:100%;width:100%}.view{padding:0}a{color:#000;text-decoration:underline}.data-table,.task-table{border:1px solid #333;box-shadow:none}.data-table{page-break-inside:avoid}.data-table td,.data-table th{border:1px solid #ccc;padding:.5rem;display:table-cell!important}.data-table tbody tr:hover,.task-row:hover{background:0 0}.task-list-container{height:auto!important;overflow:visible!important}.task-header-row,.task-row{grid-template-columns:1fr 100px 40px 80px 60px 80px 60px!important}.task-header-row .task-cell,.task-row .task-cell{display:block!important;border:1px solid #ccc;padding:.25rem .5rem}.view-header{page-break-after:avoid}.event-item,.focus-slot,.project-health,.reflection-prompt,.review-card,.weekly-review-content,body{background:#fff!important;color:#000!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}.review-card{border:1px solid #ccc!important;box-shadow:none!important;page-break-inside:avoid;margin-bottom:1rem}.focus-slot{border:1px solid #999!important}.focus-slot.primary{border:2px solid #f7d154!important;background:#fffbea!important}.review-grid{display:block!important}.review-card{display:inline-block;vertical-align:top;width:48%;margin-right:2%}.focus-section.full-width,.reflection-section,.week-timeline,.week-timeline-events{width:100%!important;display:block!important}.weekly-review-header{border-bottom:2px solid #333;padding-bottom:1rem;margin-bottom:1.5rem}.week-dates{font-size:1.5rem;font-weight:700}.day-dot{-webkit-print-color-adjust:exact;print-color-adjust:exact}.day-dot.completed{background:#5cb85c!important}.day-dot.event{background:#9b59b6!important}.day-dot.overdue{background:#d9534f!important}.project-health{border-left:4px solid #337ab7!important}.project-health.warning{border-left-color:#f7d154!important}.project-health.danger{border-left-color:#d9534f!important}.focus-grid{display:flex!important;gap:1rem}.focus-slot{flex:1}.reflection-prompts{display:flex!important;gap:1rem}.reflection-prompt{flex:1}.prompt-input{border:1px solid #ccc!important;min-height:80px}.focus-section{page-break-before:auto}.reflection-section{page-break-before:always}}.weekly-review-content{max-width:900px;margin:0 auto;padding:1rem}.weekly-review-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:var(--border-width-sm) solid var(--border)}.week-dates{font-family:var(--font-heading);font-size:1.25rem;font-weight:700;color:var(--content)}.review-status{padding:.25rem .75rem;border-radius:var(--radius-xs);font-size:.875rem;font-weight:600;border:var(--border-width-sm) solid var(--border)}.review-status.completed{background:var(--success);color:var(--content-on-action)}.review-status.pending{background:var(--warning);color:var(--content)}.review-status.unreviewed{background:var(--surface-overlay);color:var(--content-muted)}.event-time{font-size:.875rem;font-weight:600;color:var(--content-muted);min-width:80px}.focus-section{background:linear-gradient(135deg,var(--surface-raised) 0,color-mix(in srgb,var(--warning) 15%,var(--surface-raised)) 100%)}.tab-badge{display:inline-block;width:8px;height:8px;background:var(--danger);border-radius:var(--radius-full);margin-left:.5rem;vertical-align:middle;animation:pulse-badge 2s infinite}@keyframes pulse-badge{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(.8)}}.tab-status-dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-left:.5rem;vertical-align:middle;transition:background-color .3s ease}.tab-status-dot.status-none{display:none}.tab-status-dot.status-green{background-color:var(--success)}.tab-status-dot.status-yellow{background-color:var(--warning);animation:pulse-badge 2s ease-in-out infinite}.tab-status-dot.status-red{background-color:var(--danger);animation:pulse-badge 1.5s ease-in-out infinite}.review-grid{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;max-width:1200px;margin:0 auto}.review-card{padding:1.5rem}.review-card .card-header{align-items:center;padding-bottom:.75rem;border-bottom:var(--border-width-sm) solid var(--surface-overlay)}.review-card .card-title{display:flex;align-items:center;gap:.5rem}.review-card .card-icon{font-size:1.25rem}.review-card .card-badge{font-size:.8rem;padding:.25rem .75rem;border-radius:var(--radius-md);font-weight:600}.week-timeline{grid-column:1/-1}.timeline-visual{display:flex;gap:.5rem;margin-top:1rem}.timeline-day{flex:1;text-align:center;padding:.75rem .5rem;background:var(--surface-overlay);border-radius:var(--radius-md);border:1px solid var(--border);position:relative}.timeline-day.today{background:var(--action);color:var(--content-on-action);border-width:2px;font-weight:700}.timeline-day.past{opacity:.7}.timeline-day.future{background:var(--surface-raised)}.timeline-day .day-name{font-size:.7rem;font-weight:600;text-transform:uppercase;color:var(--content-muted)}.timeline-day .day-number{font-size:1.1rem;font-weight:700}.day-dots{display:flex;justify-content:center;gap:3px;margin-top:.5rem;min-height:8px}.day-dot{width:8px;height:8px;border-radius:var(--radius-full)}.day-dot.task{background:var(--action)}.day-dot.event{background:var(--category-five)}.day-dot.completed{background:var(--success)}.day-dot.overdue{background:var(--danger)}.day-dot.vacation-off{background:var(--content-muted);opacity:.5;width:12px;height:4px;border-radius:2px}.day-events{display:flex;flex-direction:column;gap:2px;margin-top:.5rem;text-align:left}.day-event{font-size:.6rem;line-height:1.3;padding:1px 4px;border-left:2px solid var(--category-five);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--content-secondary)}.day-event .event-time{font-size:.55rem;font-weight:600;color:var(--category-five);margin-right:2px;min-width:auto}.day-event-more{font-size:.55rem;color:var(--content-muted);padding:1px 4px;font-style:italic}.week-timeline-events{grid-column:1/-1}.timeline-events-day{margin-bottom:.75rem}.timeline-events-day:last-child{margin-bottom:0}.timeline-events-day-label{font-family:var(--font-heading);font-size:.8rem;font-weight:700;color:var(--content-secondary);margin-bottom:.25rem;text-transform:uppercase}.vacation-toggles-section{margin-top:1rem;padding-top:1rem;border-top:2px solid var(--border)}.vacation-toggles-section h3{margin:0 0 .75rem 0;font-size:.9rem;font-family:var(--font-heading);font-weight:700}.vacation-toggles{display:flex;gap:.5rem}.vacation-toggle{width:2.5rem;height:2.5rem;border-radius:var(--radius-sm);border:var(--border-width) solid var(--border);background:var(--surface-overlay);font-family:var(--font-heading);font-weight:700;font-size:.8rem;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast);display:flex;align-items:center;justify-content:center}.vacation-toggle:hover{background:var(--hover-surface)}.vacation-toggle.active{background:var(--category-five);color:var(--content-on-action);border-color:var(--category-five)}.timeline-day.vacation{opacity:.5}.timeline-day.vacation .day-name{text-decoration:line-through}.vacation-day-banner{text-align:center;padding:.5rem 1rem;background:color-mix(in srgb,var(--category-five) 15%,var(--surface-overlay));border:var(--border-width-sm) solid var(--category-five);border-radius:var(--radius-sm);font-family:var(--font-heading);font-weight:700;font-size:.85rem;color:var(--category-five);margin-bottom:.75rem}.stats-row{display:flex;gap:1rem;margin-bottom:1rem}.stat-box{flex:1;text-align:center;padding:1rem;background:var(--surface-overlay);border-radius:var(--radius-md)}.stat-box .stat-number{font-family:var(--font-heading);font-size:2rem;font-weight:800;line-height:1}.stat-box .stat-number.green{color:var(--success)}.stat-box .stat-number.red{color:var(--danger)}.stat-box .stat-number.blue{color:var(--action)}.stat-box .stat-number.purple{color:var(--category-five)}.stat-box .stat-label{font-size:.75rem;text-transform:uppercase;color:var(--content-muted);font-weight:600;margin-top:.25rem}.task-list{list-style:none;max-height:200px;overflow-y:auto}.task-item{display:flex;align-items:center;gap:.75rem;padding:.75rem;margin-bottom:.5rem;background:var(--surface-overlay);border-radius:var(--radius-md);cursor:pointer;transition:background-color var(--transition-normal)}.task-item:hover{background:var(--action);color:var(--content-on-action)}.task-item.completed{opacity:.6;text-decoration:line-through}.task-checkbox{width:20px;height:20px;border:2px solid var(--border);border-radius:var(--radius-xs);display:flex;align-items:center;justify-content:center;flex-shrink:0}.task-checkbox.checked{background:var(--success);color:var(--content-on-action)}.task-text{flex:1;font-size:.9rem}.task-project{font-size:.75rem;padding:.2rem .5rem;background:var(--surface-raised);border-radius:var(--radius-xs);color:var(--content-muted)}.task-due{font-size:.75rem;color:var(--content-muted)}.task-due.overdue{color:var(--danger);font-weight:600}.focus-section.full-width{grid-column:1/-1}.scope-slots{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem;margin-top:1rem}.scope-slot{padding:1.25rem;background:var(--surface-overlay);border:2px dashed var(--border);border-radius:var(--radius-md);min-height:100px;display:flex;flex-direction:column;gap:.5rem;transition:background .15s,border-color .15s}.scope-slot.filled{border-style:solid;background:var(--surface-raised)}.scope-slot.empty{cursor:pointer}.scope-slot.empty:hover{border-color:var(--action);background:var(--surface-sunken)}.scope-slot-label{font-size:.7rem;text-transform:uppercase;letter-spacing:.05em;color:var(--content-muted);font-weight:600}.scope-slot-title{font-weight:600;font-size:.95rem}.scope-slot-meta{font-size:.8rem;color:var(--content-secondary)}.scope-slot-empty{color:var(--content-muted);font-style:italic;font-size:.9rem}.focus-slot.primary{border-color:var(--warning);background:linear-gradient(135deg,var(--surface-raised) 0,color-mix(in srgb,var(--warning) 10%,var(--surface-raised)) 100%)}.projects-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;margin-top:.5rem}.project-health{padding:.75rem;background:var(--surface-overlay);border-radius:var(--radius-md);border-left:4px solid var(--action)}.project-health.warning{border-left-color:var(--warning)}.project-health.danger{border-left-color:var(--danger)}.project-name{font-weight:600;font-size:.85rem;margin-bottom:.25rem}.project-stats{font-size:.75rem;color:var(--content-muted)}.reflection-section{grid-column:1/-1}.reflection-prompts{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin-top:1rem}.reflection-prompt{padding:1rem;background:var(--surface-overlay);border-radius:var(--radius-md)}.prompt-label{font-size:.8rem;font-weight:600;color:var(--content-secondary);margin-bottom:.5rem}.prompt-input,.reflection-textarea{width:100%;padding:.75rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-md);font-size:.9rem;font-family:inherit;resize:none;background:var(--surface-raised)}.prompt-input:focus,.reflection-textarea:focus{outline:0;border-color:var(--action)}.review-actions-grid{grid-column:1/-1;display:flex;justify-content:flex-end;gap:1rem;padding-top:1rem}.event-item{display:flex;align-items:center;gap:.75rem;padding:.75rem;margin-bottom:.5rem;background:var(--surface-overlay);border-radius:var(--radius-md);border-left:3px solid var(--category-five)}.event-item .event-time{font-size:.8rem;font-weight:600;color:var(--category-five);min-width:100px}.event-item .event-title{flex:1;font-size:.9rem}.accomplishment-highlight{background:linear-gradient(135deg,color-mix(in srgb,var(--success) 10%,var(--surface-raised)) 0,color-mix(in srgb,var(--success) 5%,var(--surface-raised)) 100%);border:2px solid var(--success);padding:1rem;border-radius:var(--radius-md);margin-bottom:1rem;display:flex;align-items:center;gap:1rem}.accomplishment-icon{font-size:2rem}.accomplishment-text{font-size:1rem}.accomplishment-text strong{color:var(--success)}.task-list::-webkit-scrollbar{width:6px}.task-list::-webkit-scrollbar-track{background:var(--surface-overlay);border-radius:var(--radius-xs)}.task-list::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-xs)}.ui-mode-mobile .review-grid{grid-template-columns:1fr}.ui-mode-mobile .focus-section.full-width,.ui-mode-mobile .reflection-section,.ui-mode-mobile .week-timeline,.ui-mode-mobile .week-timeline-events{grid-column:1}.ui-mode-mobile .focus-grid{grid-template-columns:1fr}.ui-mode-mobile .reflection-prompts{grid-template-columns:1fr}.ui-mode-mobile .projects-grid{grid-template-columns:1fr 1fr}.ui-mode-mobile .stat-cards{flex-direction:column}.ui-mode-mobile .stat-card{max-width:none}.ui-mode-mobile .week-info{flex-direction:column;align-items:flex-start;gap:.5rem}.ui-mode-mobile .projects-grid{grid-template-columns:1fr}.focus-slot{transition:background-color .2s ease-out,border-color .2s ease-out}.focus-slot.filled{animation:focusSlotFill .3s ease-out}@keyframes focusSlotFill{0%{transform:scale(.95);opacity:.7}100%{transform:scale(1);opacity:1}}.focus-slot:focus,.focus-slot:focus-within{outline:2px solid var(--action);outline-offset:2px}.focus-slot[tabindex]:focus{outline:2px solid var(--action);outline-offset:2px}.focus-section .btn{transition:transform .15s ease-out,opacity .15s ease-out}.focus-section .btn:active{transform:scale(.97)}.monthly-review-nav,.weekly-review-nav{display:flex;align-items:center;gap:.5rem}.weekly-review-nav .week-dates{font-family:var(--font-heading);font-size:1.25rem;font-weight:700;color:var(--content);margin-left:.5rem}.monthly-review-month-display{font-family:var(--font-heading);font-size:1.25rem;font-weight:700;color:var(--content);margin-left:.5rem}.monthly-review-content{max-width:900px;margin:0 auto;padding:1rem}.month-heatmap{margin-bottom:1.5rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-md);padding:1rem;background:var(--surface-overlay)}.month-heatmap-header{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;margin-bottom:.5rem}.month-heatmap-day-header{font-family:var(--font-heading);font-size:.75rem;font-weight:600;color:var(--content-secondary);text-transform:uppercase}.month-heatmap-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px}.month-heatmap-cell{aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:var(--radius-xs);cursor:pointer;transition:transform .1s ease;border:var(--border-width-sm) solid transparent;position:relative;min-height:40px}.month-heatmap-cell:not(.empty):hover{transform:scale(1.1);border-color:var(--border);z-index:1}.month-heatmap-cell.empty{cursor:default;background:0 0}.month-heatmap-cell.intensity-0{background:var(--surface-page)}.month-heatmap-cell.intensity-1{background:color-mix(in srgb,var(--success) 20%,var(--surface-page))}.month-heatmap-cell.intensity-2{background:color-mix(in srgb,var(--success) 40%,var(--surface-page))}.month-heatmap-cell.intensity-3{background:color-mix(in srgb,var(--success) 60%,var(--surface-page))}.month-heatmap-cell.vacation{background:var(--surface-sunken);opacity:.6}.month-heatmap-cell.today{border-color:var(--action);border-width:2px}.month-heatmap-cell.past.intensity-0{background:var(--surface-sunken)}.month-heatmap-day-number{font-family:var(--font-heading);font-size:.8rem;font-weight:600;color:var(--content)}.month-heatmap-dots{display:flex;gap:2px;margin-top:2px}.month-dot{font-size:.6rem;font-weight:700;border-radius:var(--radius-xs);padding:0 3px;line-height:1.3}.month-dot.completed{color:var(--success)}.month-dot.event{color:var(--category-five)}.monthly-review-cards{display:grid;grid-template-columns:1fr 1fr;gap:1rem}.review-card.month-stats-card{grid-column:span 1}.review-card.month-goals-card{margin-bottom:1rem}.review-card.month-patterns-card,.review-card.month-pulse-card{grid-column:span 1}.review-card.month-reflection-card{grid-column:1/-1}.review-card-title{font-family:var(--font-heading);font-size:1rem;font-weight:700;margin-bottom:.75rem;color:var(--content)}.month-stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.month-stat-item{display:flex;flex-direction:column;align-items:center;padding:.5rem;border-radius:var(--radius-xs);background:var(--surface-page);border:var(--border-width-sm) solid var(--border)}.month-stat-value{font-family:var(--font-heading);font-size:1.5rem;font-weight:700;color:var(--content)}.month-stat-label{font-size:.75rem;color:var(--content-secondary);text-transform:uppercase;font-weight:600}.month-stats-highlights{display:flex;gap:1rem;margin-top:.5rem;justify-content:center}.stat-highlight{font-size:.8rem;color:var(--content-secondary)}.month-pulse-list{display:flex;flex-direction:column;gap:.5rem}.month-pulse-item{display:flex;align-items:center;gap:.5rem;padding:.5rem;border-radius:var(--radius-xs);background:var(--surface-page);border:var(--border-width-sm) solid var(--border)}.pulse-name{font-weight:600;flex:1;font-size:.875rem}.pulse-stats{font-size:.75rem;color:var(--content-secondary)}.pulse-arrow{font-size:1rem;font-weight:700}.month-pulse-item.positive .pulse-arrow{color:var(--success)}.month-pulse-item.negative .pulse-arrow{color:var(--danger)}.month-pulse-item.neutral .pulse-arrow{color:var(--content-secondary)}.month-goal-body{display:flex;align-items:center;gap:.5rem;flex:1}.month-goal-item.done{opacity:.7}.month-goal-item.done .month-goal-text{text-decoration:line-through}.month-goal-item.abandoned{opacity:.5}.month-goal-item.abandoned .month-goal-text{text-decoration:line-through}.month-goal-status-btn{font-size:1rem;padding:0;color:var(--content-secondary);width:24px;text-align:center}.month-goal-item.done .month-goal-status-btn{color:var(--success)}.month-goal-item.abandoned .month-goal-status-btn{color:var(--danger)}.month-goal-text{flex:1;font-size:.875rem}.month-goal-delete-btn{color:var(--content-muted);padding:0 4px;font-size:.75rem;opacity:0;transition:opacity .15s}.month-goal-item:hover .month-goal-delete-btn{opacity:1}.month-goal-placeholder{color:var(--content-muted);font-size:.875rem}.month-reflection-fields{display:flex;flex-direction:column;gap:.5rem}.month-reflection-label{font-size:.875rem;font-weight:600;color:var(--content-secondary)}.month-reflection-textarea{width:100%;padding:.5rem;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-xs);background:var(--surface-page);color:var(--content);font-family:var(--font-body);font-size:.875rem;resize:vertical}.month-reflection-textarea:focus{outline:2px solid var(--action);outline-offset:-1px}.month-patterns-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:.5rem}.month-pattern-item{font-size:.875rem;color:var(--content-secondary);padding:.5rem;background:var(--surface-page);border-radius:var(--radius-xs);border:var(--border-width-sm) solid var(--border)}.ui-mode-mobile .monthly-review-cards{grid-template-columns:1fr}.ui-mode-mobile .review-card.month-goals-card,.ui-mode-mobile .review-card.month-patterns-card,.ui-mode-mobile .review-card.month-pulse-card,.ui-mode-mobile .review-card.month-stats-card{grid-column:span 1}.ui-mode-mobile .month-heatmap-cell{min-height:32px}.ui-mode-mobile .month-heatmap-day-number{font-size:.7rem}.ui-mode-mobile .month-heatmap-dots{display:none}.import-wizard{display:flex;flex-direction:column;gap:1.5rem}.import-step{padding:1rem;background:var(--surface-overlay);border:var(--border-width) solid var(--border);border-radius:var(--radius-md)}.import-step h3{margin:0 0 1rem 0;font-size:var(--font-size-md);font-weight:600}.plugin-selector{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:.75rem}.plugin-option{display:flex;flex-direction:column;align-items:flex-start;padding:.75rem 1rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);cursor:pointer;text-align:left;transition:border-color var(--transition-fast),background var(--transition-fast)}.plugin-option:hover{border-color:var(--action);background:var(--hover-surface)}.plugin-option.selected{border-color:var(--action);background:color-mix(in srgb,var(--action) 10%,var(--surface-raised));box-shadow:0 0 0 2px color-mix(in srgb,var(--action) 30%,transparent)}.plugin-option .plugin-name{font-weight:600;margin-bottom:.25rem}.plugin-option .plugin-meta{display:flex;gap:.5rem;font-size:var(--font-size-sm);color:var(--content-muted);margin-bottom:.25rem}.plugin-option .plugin-extensions{color:var(--category-six)}.plugin-option .plugin-types{color:var(--content-secondary)}.plugin-option .plugin-description{font-size:var(--font-size-sm);color:var(--content-secondary);line-height:1.4}.file-selector{display:flex;align-items:center;gap:1rem}.selected-file-name{color:var(--content-secondary);font-family:monospace;font-size:var(--font-size-sm)}.import-preview-container{min-height:100px}.import-preview-table-wrapper{max-height:300px;overflow:auto;border:1px solid var(--border);border-radius:var(--radius-sm)}.import-preview-table{font-size:var(--font-size-sm);margin:0}.import-preview-table th{position:sticky;top:0;background:var(--surface-overlay);z-index:1}.import-preview-table td{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.import-summary{margin:0 0 .75rem 0;color:var(--content)}.import-more{margin:.5rem 0 0 0;color:var(--content-muted);font-style:italic;font-size:var(--font-size-sm)}.import-empty,.import-error{padding:2rem;text-align:center;color:var(--content-muted)}.import-error{color:var(--danger)}.import-warnings{margin-top:1rem;padding:.75rem;background:color-mix(in srgb,var(--warning) 10%,var(--surface-raised));border:1px solid var(--warning);border-radius:var(--radius-sm);font-size:var(--font-size-sm)}.import-warnings ul{margin:.5rem 0 0 1.25rem;padding:0}.import-warnings li{margin-bottom:.25rem}.import-external-types{display:flex;gap:1rem;margin-bottom:1.5rem}.import-type-card{flex:1;display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1.5rem 1rem;background:var(--surface-raised);border:2px solid var(--border);border-radius:var(--radius-md);cursor:pointer;transition:border-color .15s,background .15s}.import-type-card:hover{border-color:var(--action);background:var(--surface-overlay)}.import-type-icon{font-size:2rem}.import-type-label{font-weight:600;color:var(--content)}.import-type-desc{font-size:var(--font-size-sm);color:var(--content-muted)}.plugin-list{display:flex;flex-direction:column;gap:.75rem}.plugin-item{display:flex;justify-content:space-between;align-items:center;padding:1rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md)}.plugin-item .plugin-info{flex:1}.plugin-item .plugin-name{font-weight:600}.plugin-item .plugin-version{color:var(--content-muted);font-size:var(--font-size-sm);margin-left:.5rem}.plugin-item .plugin-description{margin:.25rem 0;color:var(--content-secondary);font-size:var(--font-size-sm)}.plugin-item .plugin-extensions{font-size:var(--font-size-xs);color:var(--content-muted)}.plugin-item .plugin-actions{margin-left:1rem}.toggle-switch{position:relative;display:inline-block;width:44px;height:24px}.toggle-switch input{opacity:0;width:0;height:0}.toggle-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:var(--surface-sunken);border:2px solid var(--border);border-radius:var(--radius-xl);transition:background-color var(--transition-fast),border-color var(--transition-fast)}.toggle-slider:before{position:absolute;content:"";height:16px;width:16px;left:2px;bottom:2px;background-color:var(--content-muted);border-radius:var(--radius-full);transition:transform var(--transition-fast),background-color var(--transition-fast)}.toggle-switch input:checked+.toggle-slider{background-color:var(--action);border-color:var(--action)}.toggle-switch input:checked+.toggle-slider:before{transform:translateX(20px);background-color:var(--surface-raised)}.toggle-switch input:focus+.toggle-slider{box-shadow:0 0 0 2px color-mix(in srgb,var(--action) 30%,transparent)}.milestones-section{margin-bottom:1.5rem}.milestones-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding-bottom:.5rem;border-bottom:2px solid var(--border)}.milestones-header h3{margin:0;font-size:1rem;font-family:var(--font-heading);font-weight:700}.milestone-card{background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);padding:1rem;margin-bottom:.75rem;transition:background-color .1s;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.milestone-card:hover{background:var(--surface-overlay)}.milestone-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:.5rem}.milestone-card-header h4{margin:0;font-size:.95rem;font-family:var(--font-heading);font-weight:700}.milestone-card-header .milestone-status{font-size:.7rem;font-weight:700;text-transform:uppercase;padding:.15rem .4rem;border-radius:var(--radius-sm);background:var(--surface-overlay);color:var(--content-muted)}.milestone-card-header .milestone-status.completed{background:color-mix(in srgb,var(--success) 15%,var(--surface-overlay));color:var(--success)}.milestone-meta{display:flex;gap:1rem;font-size:.8rem;color:var(--content-muted);margin-bottom:.5rem}.milestone-progress{height:6px;background:var(--surface-overlay);border-radius:var(--radius-full);overflow:hidden;border:var(--border-width-sm) solid var(--border)}.milestone-progress-fill{height:100%;background:var(--success);border-radius:var(--radius-full);transition:width var(--transition-fast)}.milestone-actions{display:flex;gap:.5rem;margin-top:.5rem}.milestone-actions button{font-size:.75rem;padding:.2rem .5rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);cursor:pointer;color:var(--content-secondary);transition:background var(--transition-fast)}.milestone-actions button:hover{background:var(--hover-surface)}.milestone-actions button.danger:hover{background:color-mix(in srgb,var(--danger) 15%,var(--surface-overlay));color:var(--danger)}button.milestone-reorder-btn.btn{font-size:.65rem;padding:.15rem .35rem;line-height:1;min-width:1.5rem;text-align:center}.milestones-completed-section{margin-top:.75rem}.milestones-completed-toggle{font-size:.8rem;color:var(--content-secondary);padding:.25rem 0}.milestone-card-summary{padding:.5rem .75rem;opacity:.7}.milestone-card-summary .milestone-info{display:flex;align-items:center;gap:.5rem}.milestone-complete-badge{font-size:.7rem;font-weight:700;padding:.1rem .4rem;border-radius:var(--radius-sm);background:color-mix(in srgb,var(--success) 15%,var(--surface-overlay));color:var(--success)}.mobile-tab-bar{display:none;position:fixed;bottom:0;left:0;right:0;z-index:1100;background:var(--surface-raised);border-top:var(--border-width) solid var(--border);padding-bottom:env(safe-area-inset-bottom,0);height:calc(52px + env(safe-area-inset-bottom,0px))}.mobile-tab{flex:1;display:flex;align-items:center;justify-content:center;height:52px;background:0 0;border:none;color:var(--content-muted);font-size:.7rem;font-weight:700;font-family:var(--font-sans);text-transform:uppercase;letter-spacing:.05em;cursor:pointer;-webkit-tap-highlight-color:transparent;transition:color .15s ease}.mobile-tab.active{color:var(--action)}.mobile-tab:active{background:var(--surface-overlay)}.mobile-tab-create{font-size:1.4rem;font-weight:400;color:var(--success);letter-spacing:0;text-transform:none}.mobile-tab-slide-menu{position:fixed;z-index:1102;min-width:140px;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);padding:.25rem;display:flex;flex-direction:column;opacity:0;transform:scale(.92);transform-origin:50% 100%;transition:opacity 120ms ease-out,transform 120ms ease-out}.mobile-tab-slide-menu.is-open{opacity:1;transform:scale(1)}.mobile-tab-slide-item{padding:.7rem .9rem;min-height:44px;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-sm);font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content);border-radius:var(--radius-sm);transition:background 80ms ease,transform 80ms ease}.mobile-tab-slide-item.is-highlighted{background:var(--action);color:var(--content-on-action);transform:scale(1.03)}.action-sheet{position:fixed;inset:0;z-index:10001;display:flex;flex-direction:column;justify-content:flex-end}.action-sheet.hidden{display:none}.action-sheet-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.4)}.action-sheet-container{position:relative;background:var(--surface-raised);border-top:var(--border-width) solid var(--border);border-radius:var(--radius-lg) var(--radius-lg) 0 0;padding:.5rem 1rem calc(.5rem + env(safe-area-inset-bottom,0px));max-height:60vh;overflow-y:auto;animation:sheetSlideUp .25s ease-out}.action-sheet-handle{width:36px;height:4px;border-radius:2px;background:var(--content-muted);margin:0 auto .75rem;opacity:.4}.action-sheet-content button{display:flex;align-items:center;gap:.75rem;width:100%;padding:.875rem .5rem;background:0 0;border:none;border-bottom:1px solid var(--surface-overlay);font-size:var(--font-size-base);font-weight:600;color:var(--content);text-align:left;cursor:pointer}.action-sheet-content button:last-child{border-bottom:none}.action-sheet-content button:active{background:var(--surface-overlay)}.action-sheet-content button.danger{color:var(--danger)}.action-sheet-cancel{display:block;width:100%;padding:.875rem;margin-top:.5rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-md);font-size:var(--font-size-base);font-weight:700;color:var(--content);text-align:center;cursor:pointer}.action-sheet-cancel:active{background:var(--surface-sunken)}.modal-drag-handle{display:none;width:36px;height:4px;border-radius:2px;background:var(--content-muted);margin:.5rem auto 0;opacity:.4}.mobile-sort-bar{display:none;gap:.5rem;padding:.5rem 0;align-items:center}.mobile-sort-bar select{flex:1;font-size:var(--font-size-sm)}.mobile-filter-toggle{display:none}.swipe-actions-container{position:relative;overflow:hidden}.swipe-actions-bg{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding:0 1rem;font-weight:700;font-size:var(--font-size-sm);color:var(--content-on-action)}.swipe-actions-bg.swipe-left{right:0;background:var(--success)}.swipe-actions-bg.swipe-right{left:0;background:var(--danger)}.swipe-content{position:relative;background:var(--surface-raised);transition:transform .15s ease}.pull-to-refresh-indicator{display:none;text-align:center;padding:.75rem;font-size:var(--font-size-sm);color:var(--content-muted);font-weight:600}.pull-to-refresh-indicator.visible{display:block}.event-date-group-header{display:none}.day-plan-sidebar-toggle{display:none}@keyframes sheetSlideUp{from{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sheetSlideDown{from{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes dialFadeIn{from{opacity:0}to{opacity:1}}.ui-mode-mobile body,html.ui-mode-mobile{overflow-x:hidden;max-width:100vw;touch-action:pan-y;overscroll-behavior-x:none}.ui-mode-mobile body{padding-top:env(safe-area-inset-top,0);padding-bottom:calc(52px + env(safe-area-inset-bottom,0px));padding-left:env(safe-area-inset-left,0);padding-right:env(safe-area-inset-right,0)}.ui-mode-mobile .mobile-tab-bar,.ui-mode-mobile .timer-widget{padding-left:env(safe-area-inset-left,0);padding-right:env(safe-area-inset-right,0)}.ui-mode-mobile .mobile-tab-bar{display:flex}.ui-mode-mobile .tab-navigation{display:none!important}.ui-mode-mobile .app-header{display:none}.ui-mode-mobile .pill-nav{display:none}.ui-mode-mobile #contacts-view .page-header>.row-flex,.ui-mode-mobile #emails-view>div.row-flex.mb-2,.ui-mode-mobile #tasks-view .mobile-sort-bar,.ui-mode-mobile #tasks-view .page-header>.row-flex{display:grid;grid-auto-flow:row;grid-template-columns:repeat(2,1fr);gap:var(--space-2);align-items:center}.ui-mode-mobile #tasks-view .page-header>.row-flex{grid-template-columns:1fr}.ui-mode-mobile .mobile-hide{display:none!important}.ui-mode-mobile #day-review-status-badge,.ui-mode-mobile #month-review-status-badge,.ui-mode-mobile #week-review-status-badge{display:none!important}.ui-mode-mobile #day-plan-view .timeline-hint{display:none}.ui-mode-mobile #day-plan-view .timeline-slot-area{cursor:default}.ui-mode-mobile #day-plan-view .timeline-slot-area:hover{background:0 0}.ui-mode-mobile #day-plan-view .day-plan-nav{display:flex;flex-wrap:wrap;column-gap:var(--space-2);row-gap:var(--space-3);align-items:center}.ui-mode-mobile #day-plan-view .day-plan-nav .btn{flex:0 0 auto;border-radius:var(--radius-sm);border-right-width:var(--border-width)}.ui-mode-mobile #day-plan-view .day-plan-nav .day-plan-date-picker{flex:1 1 120px;min-width:0}.ui-mode-mobile #day-plan-view .day-plan-date-display{display:none}.ui-mode-mobile #contacts-search,.ui-mode-mobile #email-search{grid-column:1/-1;width:100%;min-width:0}.ui-mode-mobile #email-count{display:none}.ui-mode-mobile #contacts-view .page-header>.row-flex .btn,.ui-mode-mobile #tasks-view .page-header>.row-flex .btn{border-radius:var(--radius-sm);border-right-width:var(--border-width)}.ui-mode-mobile #tasks-view .page-header .view-toggle{display:flex;width:100%}.ui-mode-mobile #tasks-view .page-header .view-toggle .view-toggle-btn{flex:1 1 0}.ui-mode-mobile .tab-group>.subview>.page-header{position:static}.ui-mode-mobile .main-content{padding:.75rem}.ui-mode-mobile .page-header{flex-wrap:wrap;gap:.5rem}.ui-mode-mobile .page-header .btn-primary{display:none}.ui-mode-mobile .page-title{display:none}.ui-mode-mobile #contacts-view .page-header>div,.ui-mode-mobile #emails-view .page-header>div,.ui-mode-mobile .page-header>div{gap:0!important;flex-wrap:wrap}.ui-mode-mobile #contacts-view .page-header>div .btn,.ui-mode-mobile #emails-view .page-header>div .btn,.ui-mode-mobile .bulk-actions-bar .btn,.ui-mode-mobile .page-header>div .btn{flex:1 1 0;min-width:0;padding:.4rem .5rem;font-size:.75rem;border-radius:0;border-right-width:0;white-space:nowrap}.ui-mode-mobile #contacts-view .page-header>div .btn:first-child,.ui-mode-mobile #emails-view .page-header>div .btn:first-child,.ui-mode-mobile .bulk-actions-bar .btn:first-of-type,.ui-mode-mobile .page-header>div .btn:first-child{border-top-left-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.ui-mode-mobile #contacts-view .page-header>div .btn:has(+ .btn-primary),.ui-mode-mobile #contacts-view .page-header>div .btn:last-child,.ui-mode-mobile #emails-view .page-header>div .btn:has(+ .btn-primary),.ui-mode-mobile #emails-view .page-header>div .btn:last-child,.ui-mode-mobile .page-header>div .btn:has(+ .btn-primary),.ui-mode-mobile .page-header>div .btn:last-child{border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm);border-right-width:var(--border-width)}.ui-mode-mobile .bulk-actions-bar{gap:0}.ui-mode-mobile .bulk-actions-bar .bulk-count{margin-right:.5rem}.ui-mode-mobile .bulk-actions-bar .btn:not(.bulk-select-all)+.bulk-select-all{border-right-width:var(--border-width);border-radius:var(--radius-sm)}.ui-mode-mobile .bulk-actions-bar .btn:not(.bulk-select-all):nth-last-of-type(2){border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm);border-right-width:var(--border-width)}.ui-mode-mobile .bulk-select-all{margin-left:auto}.ui-mode-mobile #emails-view .form-select[id^=email-]{min-width:0!important;flex:1}.ui-mode-mobile .form-input,.ui-mode-mobile .form-select,.ui-mode-mobile .form-textarea{padding:.45rem .65rem}.ui-mode-mobile .form-textarea{min-height:72px}.ui-mode-mobile .form-group{margin-bottom:.75rem}.ui-mode-mobile .form-label{margin-bottom:.25rem}.ui-mode-mobile .form-actions{gap:.5rem;margin-top:1rem}.ui-mode-mobile .quick-add-input{padding:.55rem .75rem}.ui-mode-mobile .quick-add{gap:.5rem;margin-bottom:1rem}.ui-mode-mobile .bulk-modal-option-btn,.ui-mode-mobile .snooze-option{padding:.55rem .75rem}.ui-mode-mobile .snooze-options{gap:.35rem}.ui-mode-mobile .modal-header{padding:.6rem .9rem}.ui-mode-mobile .modal-header h2,.ui-mode-mobile .modal-title{font-size:1.05rem}.ui-mode-mobile .modal-content{padding:.9rem}.ui-mode-mobile .modal-content form>.form-actions:last-child,.ui-mode-mobile .modal-content>.form-actions:last-child{margin-top:.9rem;padding-top:.5rem}.ui-mode-mobile .modal-overlay{align-items:flex-end;bottom:calc(52px + env(safe-area-inset-bottom,0px))}.ui-mode-mobile .modal-container{width:100%!important;max-width:100%!important;max-height:calc(100vh - 52px - env(safe-area-inset-bottom,0px) - env(safe-area-inset-top,0px));border-radius:var(--radius-lg) var(--radius-lg) 0 0;margin:0;border-bottom:none;padding-bottom:0}.ui-mode-mobile .modal-container.modal-large{max-width:100%!important;width:100%!important;max-height:calc(100vh - 52px - env(safe-area-inset-bottom,0px) - env(safe-area-inset-top,0px));border-radius:var(--radius-lg) var(--radius-lg) 0 0}.ui-mode-mobile .modal-drag-handle{display:block}.ui-mode-mobile .modal-header{padding:.75rem 1rem}.ui-mode-mobile .modal-content{padding:1rem}@keyframes modalSlideInMobile{from{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes modalSlideOutMobile{from{transform:translateY(0)}to{transform:translateY(100%)}}.ui-mode-mobile .modal-container{animation-name:modalSlideInMobile}.ui-mode-mobile .modal-overlay.closing .modal-container{animation-name:modalSlideOutMobile}.ui-mode-mobile .toast,.ui-mode-mobile .toast-undo{bottom:calc(env(safe-area-inset-bottom,0px) + 4.5rem)!important;left:1rem!important;right:1rem!important;max-width:none!important}.ui-mode-mobile .task-table{border:none;box-shadow:none;background:0 0}.ui-mode-mobile .task-header-row{display:none!important}.ui-mode-mobile .task-row{display:flex!important;flex-direction:column;gap:.25rem;padding:.75rem 1rem;margin-bottom:.5rem;background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-md);border-left:4px solid var(--content-muted)}.ui-mode-mobile .task-row.task-pending{border-left-color:var(--content-muted)}.ui-mode-mobile .task-row .task-cell.priority-h~.task-cell:first-child,.ui-mode-mobile .task-row:has(.priority-h){border-left-color:var(--danger)}.ui-mode-mobile .task-row:has(.priority-m){border-left-color:var(--warning)}.ui-mode-mobile .task-row:has(.priority-l){border-left-color:var(--content-muted)}.ui-mode-mobile .task-row .task-cell{display:flex!important;overflow:visible;padding:0}.ui-mode-mobile .task-cell.task-description{font-weight:600;font-size:var(--font-size-base)}.ui-mode-mobile .task-cell.task-due,.ui-mode-mobile .task-cell.task-project{font-size:var(--font-size-sm);color:var(--content-secondary)}.ui-mode-mobile .task-row .task-cell.task-project::before{content:none}.ui-mode-mobile .task-cell.task-progress,.ui-mode-mobile .task-cell.task-recurrence,.ui-mode-mobile .task-row .task-cell:nth-child(3){display:none!important}.ui-mode-mobile .task-cell.task-project{order:2}.ui-mode-mobile .task-cell.task-due{order:3}.ui-mode-mobile .task-cell.task-description{order:1}.ui-mode-mobile .task-cell.task-actions-cell{order:4;justify-content:flex-end}.ui-mode-mobile .task-cell.task-progress:has(.progress-bar-container){display:flex!important;order:5}.ui-mode-mobile .task-actions-cell .bulk-checkbox{display:none}.ui-mode-mobile .kebab-btn{opacity:1}.ui-mode-mobile .mobile-sort-bar{display:flex}.ui-mode-mobile .mobile-filter-toggle{display:inline-flex;align-items:center;gap:.25rem;padding:.5rem .75rem;background:var(--surface-raised);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);font-size:var(--font-size-sm);font-weight:600;cursor:pointer}.ui-mode-mobile .filter-bar{display:none!important}.ui-mode-mobile .filter-bar.mobile-visible{display:flex!important;flex-direction:column;position:fixed;bottom:calc(52px + env(safe-area-inset-bottom,0px));left:0;right:0;background:var(--surface-raised);border-top:var(--border-width) solid var(--border);border-radius:var(--radius-lg) var(--radius-lg) 0 0;padding:1rem;z-index:1050;box-shadow:0 -4px 12px rgba(0,0,0,.1)}.ui-mode-mobile .event-header-row{display:none!important}.ui-mode-mobile .event-row-virtual{display:flex!important;flex-direction:column;gap:.125rem;padding:.75rem 1rem;border-bottom:1px solid var(--surface-overlay)}.ui-mode-mobile .event-cell-date{font-weight:700;font-size:var(--font-size-sm);color:var(--content-secondary)}.ui-mode-mobile .event-cell-time{font-size:var(--font-size-sm);color:var(--content-muted)}.ui-mode-mobile .event-cell-title{font-weight:600;font-size:var(--font-size-base)}.ui-mode-mobile .event-cell-location{font-size:var(--font-size-sm);color:var(--content-secondary)}.ui-mode-mobile .event-date-group-header{display:flex;position:sticky;top:0;z-index:5;padding:.5rem 1rem;background:var(--surface-overlay);font-weight:700;font-size:var(--font-size-sm);text-transform:uppercase;letter-spacing:.05em;color:var(--content);border-bottom:var(--border-width-sm) solid var(--border)}.ui-mode-mobile .email-item{padding:.625rem .75rem}.ui-mode-mobile .email-from{font-size:var(--font-size-sm)}.ui-mode-mobile .email-subject{font-size:var(--font-size-base)}.ui-mode-mobile .email-preview{display:none}.ui-mode-mobile .email-date{font-size:var(--font-size-xs)}.ui-mode-mobile .email-item .bulk-checkbox{display:none}.ui-mode-mobile .day-plan-content{flex-direction:column}.ui-mode-mobile .day-plan-sidebar{width:100%;max-height:none;border-top:var(--border-width-sm) solid var(--border);order:2}.ui-mode-mobile .day-plan-sidebar.collapsed .sidebar-task-list{display:none}.ui-mode-mobile .day-plan-sidebar-toggle{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.625rem .75rem;background:var(--surface-overlay);border:none;border-bottom:1px solid var(--border);font-size:var(--font-size-sm);font-weight:700;cursor:pointer;color:var(--content)}.ui-mode-mobile .day-plan-main{order:1}.ui-mode-mobile .day-plan-nav{flex-wrap:wrap;gap:.25rem}.ui-mode-mobile .weekly-review-content{padding:0}.ui-mode-mobile .monthly-review-content{padding:0}.ui-mode-mobile .month-reflection-textarea,.ui-mode-mobile .prompt-input{resize:none;overflow:hidden}.ui-mode-mobile .monthly-review-nav{flex-wrap:wrap;gap:.25rem}.ui-mode-mobile .monthly-review-month-display{font-size:1rem}.ui-mode-mobile .day-summary-sheet{padding:.5rem 0}.ui-mode-mobile .day-summary-date{font-size:1rem;font-weight:700;margin-bottom:.75rem;color:var(--content)}.ui-mode-mobile .day-summary-stats{display:flex;gap:.5rem;margin-bottom:1rem}.ui-mode-mobile .day-summary-chip{padding:.25rem .75rem;background:var(--surface-overlay);border-radius:var(--radius-sm);font-size:var(--font-size-sm);font-weight:600;color:var(--content-secondary)}.ui-mode-mobile .day-summary-list{list-style:none;padding:0;margin:0 0 1rem 0}.ui-mode-mobile .day-summary-item{padding:.5rem 0;border-bottom:1px solid var(--surface-overlay);font-size:var(--font-size-sm);color:var(--content)}.ui-mode-mobile .day-summary-time{font-weight:600;color:var(--content-secondary);margin-right:.5rem}.ui-mode-mobile .day-summary-more{color:var(--content-muted);font-style:italic}.ui-mode-mobile .day-summary-empty{color:var(--content-muted);font-size:var(--font-size-sm);margin:.5rem 0 1rem}.ui-mode-mobile .day-summary-go-btn{width:100%;margin-top:.5rem}.ui-mode-mobile .bulk-actions-bar{position:fixed;bottom:calc(52px + env(safe-area-inset-bottom,0px));left:0;right:0;z-index:1050;border-radius:var(--radius-lg) var(--radius-lg) 0 0;box-shadow:0 -4px 12px rgba(0,0,0,.15)}.ui-mode-mobile .pagination-controls{padding:.5rem}.ui-mode-mobile .pagination-controls .btn{padding:.5rem .75rem;font-size:var(--font-size-sm)}@media (hover:none){.task-row:hover{background-color:transparent}.task-row-clickable:hover{background:0 0}.event-row-virtual:hover{background-color:transparent}.email-item:hover{background-color:transparent}.card:hover{background-color:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.btn:hover{background:var(--surface-raised)}.btn-primary:hover{background-color:var(--action)}.btn-danger:hover{background-color:var(--danger)}.card:hover{background-color:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.kanban-card:hover{background:var(--surface-raised);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.saved-view-item:hover{background:var(--surface-raised);color:var(--content);transform:none;box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.context-menu-item:hover{background:0 0;color:var(--content)}.modal-close:hover{background:var(--surface-raised);color:var(--content)}.month-heatmap-cell:hover{background:0 0;transform:none}.email-item .kebab-btn,.event-row-virtual .kebab-btn,.task-row .kebab-btn{opacity:1}.shortcut-hint-btn{display:none}.time-block-quick-options{grid-template-columns:1fr}.duration-preset,.time-block-quick-btn{min-height:44px;padding:.75rem;font-size:1rem}}body.is-touch .email-item .kebab-btn,body.is-touch .event-row-virtual .kebab-btn,body.is-touch .task-row .kebab-btn{opacity:1}body.is-touch .shortcut-hint-btn{display:none}.view-toggle{display:flex;gap:0;margin-left:auto}.view-toggle-btn{padding:.35rem .75rem;border:var(--border-width-sm) solid var(--border);background:var(--surface-overlay);font-family:var(--font-body);font-size:var(--font-size-md);cursor:pointer;transition:background var(--transition-fast),box-shadow var(--transition-fast)}.view-toggle-btn.active{background:var(--surface-raised);font-weight:600}.view-toggle-btn:first-child{border-radius:var(--radius-xs) 0 0 var(--radius-xs)}.view-toggle-btn:last-child{border-radius:0 var(--radius-xs) var(--radius-xs) 0;border-left:none}.kanban-board{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;padding:.5rem 0;min-height:400px}.kanban-column{background:var(--surface-raised);border:var(--border-width) solid var(--border);display:flex;flex-direction:column;min-height:300px;max-height:calc(100vh - 200px)}.kanban-column-header{padding:.75rem 1rem;border-bottom:2px solid var(--border);font-family:var(--font-heading);font-weight:700;display:flex;justify-content:space-between;align-items:center}.kanban-column-count{font-family:var(--font-body);font-size:var(--font-size-sm);color:var(--content-secondary)}.kanban-column-body{flex:1;overflow-y:auto;padding:.5rem;display:flex;flex-direction:column;gap:.5rem}.kanban-column.drag-over{background-color:var(--surface-sunken)}.kanban-card{padding:.75rem;border-width:var(--border-width-sm);border-radius:0;cursor:grab;border-left:4px solid transparent}.kanban-card.dragging{opacity:.5;cursor:grabbing}.kanban-card.priority-high{border-left-color:var(--danger)}.kanban-card.priority-medium{border-left-color:var(--warning)}.kanban-card.priority-low{border-left-color:var(--success)}.kanban-card-title{font-weight:600;margin-bottom:.25rem}.kanban-card-meta{font-size:var(--font-size-sm);color:var(--content-secondary);display:flex;gap:.5rem;flex-wrap:wrap}.kanban-card-due.overdue{color:var(--danger);font-weight:600}.progress-bar-mini{height:3px;background:var(--surface-sunken);border-radius:2px;margin-top:.5rem}.progress-bar-mini .progress-fill{height:100%;background:var(--success);border-radius:2px}.ui-mode-mobile .kanban-board{grid-template-columns:1fr}.ui-mode-mobile .kanban-column{max-height:none}.timer-widget{position:fixed;bottom:0;left:0;right:0;z-index:900;background:var(--surface-page);border-top:var(--border-width) solid var(--border);box-shadow:0 -2px 8px rgba(0,0,0,.1);padding:.5rem 1rem;transition:transform .2s ease}.timer-widget.hidden{transform:translateY(100%);pointer-events:none}.timer-widget-inner{display:flex;align-items:center;gap:1rem;max-width:800px;margin:0 auto}.timer-task-name{flex:1;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timer-elapsed{font-family:var(--font-mono, monospace);font-size:1.125rem;font-weight:700;color:var(--action);min-width:5rem;text-align:center}.timer-actions{display:flex;gap:.5rem}.focus-overlay{position:fixed;inset:0;z-index:1000;background:var(--surface-page);display:flex;align-items:center;justify-content:center;transition:opacity .3s ease}.focus-overlay.hidden{opacity:0;pointer-events:none}.focus-overlay-content{text-align:center;max-width:400px;width:100%;padding:2rem}.focus-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:2rem}.focus-label{font-family:var(--font-heading);font-size:1.25rem;font-weight:700}.focus-presets{display:flex;gap:.5rem}.focus-preset-btn.active{background:var(--action);color:var(--surface-page);border-color:var(--action)}.focus-countdown{font-family:var(--font-mono, monospace);font-size:4rem;font-weight:700;line-height:1;margin-bottom:1.5rem;color:var(--content)}.focus-progress-bar{height:6px;background:var(--surface-sunken);border-radius:3px;margin-bottom:1.5rem;overflow:hidden}.focus-progress-fill{height:100%;background:var(--action);border-radius:3px;transition:width 1s linear}.focus-task-name{color:var(--content-secondary);margin-bottom:2rem;font-size:.9rem}.focus-actions{display:flex;gap:1rem;justify-content:center}.time-summary-section{margin-bottom:1rem}.time-summary-toggle{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem;background:0 0;border:none;font-family:var(--font-heading);font-size:.875rem;font-weight:700;color:var(--content);cursor:pointer;text-align:left}.time-summary-toggle:hover{color:var(--action)}.time-summary-toggle-icon{font-size:.625rem;transition:transform .15s ease}.time-summary-body{padding:.5rem;overflow:hidden;transition:max-height .2s ease;max-height:500px}.time-summary-body.collapsed{max-height:0;padding:0 .5rem}.time-summary-today{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid var(--border);margin-bottom:.5rem}.time-summary-today-label{font-weight:600;font-size:.875rem}.time-summary-today-value{font-family:var(--font-mono, monospace);font-weight:700;font-size:1rem;color:var(--action)}.time-summary-week-header{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--content-secondary);margin-bottom:.5rem}.time-summary-project{margin-bottom:.5rem}.time-summary-project-info{display:flex;justify-content:space-between;align-items:center;font-size:.8125rem;margin-bottom:.25rem}.time-summary-project-name{color:var(--content);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.time-summary-project-time{font-family:var(--font-mono, monospace);font-weight:600;font-size:.75rem;color:var(--content-secondary);margin-left:.5rem;flex-shrink:0}.time-summary-bar{height:4px;background:var(--surface-sunken);border-radius:2px;overflow:hidden}.time-summary-bar-fill{height:100%;background:var(--action);border-radius:2px}.unscheduled-task-actions{display:flex;gap:.25rem;margin-top:.375rem}.unscheduled-task-actions .btn{font-size:.7rem;padding:.125rem .375rem;min-height:auto;line-height:1.4}.task-time-badge{display:inline-block;font-family:var(--font-mono, monospace);font-size:.7rem;font-weight:600;color:var(--content-secondary);background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);padding:.05rem .35rem;margin-left:.375rem;vertical-align:middle;white-space:nowrap}.task-time-badge.over-estimate{color:var(--danger);border-color:var(--danger)}.task-started-icon{display:inline-block;width:0;height:0;border-style:solid;border-width:5px 0 5px 8px;border-color:transparent transparent transparent var(--success);margin-right:.375rem;vertical-align:middle;cursor:pointer;opacity:.8;flex-shrink:0}.task-started-icon:hover{opacity:1}.task-timer-active{display:inline-block;width:8px;height:8px;background:var(--danger);border-radius:var(--radius-full);margin-left:.375rem;vertical-align:middle;animation:timer-pulse 1.5s ease-in-out infinite}@keyframes timer-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.8)}}.ui-mode-mobile .timer-widget{bottom:calc(52px + env(safe-area-inset-bottom,0px))}.ui-mode-mobile .focus-countdown{font-size:3rem}.timer-active-banner{display:flex;align-items:center;gap:1rem;padding:.875rem 1rem;background:var(--surface-overlay);border:var(--border-width) solid var(--action);border-radius:var(--radius-md);margin-bottom:1.5rem}.timer-active-info{flex:1;min-width:0}.timer-active-label{display:block;font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--action);margin-bottom:.125rem}.timer-active-task{display:block;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timer-active-elapsed{font-family:var(--font-mono, monospace);font-size:1.25rem;font-weight:700;color:var(--action);min-width:5rem;text-align:center}.timer-active-actions{display:flex;gap:.5rem}.timer-focus-split{display:flex;align-items:center;gap:.375rem;padding:.5rem 0;margin-bottom:.5rem}.timer-focus-split-label{font-size:.8125rem;color:var(--content-secondary);font-weight:600;margin-right:.25rem}.timer-split-input{width:3.5rem;padding:.25rem .375rem;font-size:.875rem;font-family:var(--font-mono, monospace);text-align:center;border:var(--border-width) solid var(--border);border-radius:var(--radius-sm);background:var(--surface-page);color:var(--content)}.timer-focus-split-sep{font-size:.8125rem;color:var(--content-secondary)}.timer-task-list{display:flex;flex-direction:column;gap:0}.timer-task-item{display:flex;align-items:center;gap:1rem;padding:.75rem .5rem;border-bottom:1px solid var(--border)}.timer-task-item:last-child{border-bottom:none}.timer-task-info{flex:1;min-width:0}.timer-task-desc{display:block;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timer-task-meta{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.25rem;font-size:.8125rem;color:var(--content-secondary)}.timer-task-project{font-weight:600}.timer-task-priority{font-weight:600}.timer-task-priority.priority-h,.timer-task-priority.priority-high{color:var(--danger)}.timer-task-priority.priority-m,.timer-task-priority.priority-medium{color:var(--warning)}.timer-task-estimate,.timer-task-tracked{font-family:var(--font-mono, monospace);font-size:.75rem}.timer-task-actions{display:flex;gap:.375rem;flex-shrink:0}.ui-mode-mobile .timer-active-banner{flex-wrap:wrap}.ui-mode-mobile .timer-active-elapsed{font-size:1rem}.ui-mode-mobile .timer-task-item{flex-wrap:wrap}.ui-mode-mobile .timer-task-actions{width:100%;justify-content:flex-end}.task-overview-section{margin-bottom:1.5rem;padding:1rem;background:var(--surface-raised);border:var(--border-width) solid var(--border);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.task-overview-section-title{font-family:var(--font-heading);font-size:1rem;font-weight:700;margin-bottom:.75rem;display:flex;align-items:center;gap:.5rem}.task-overview-count{font-weight:400;font-size:.85rem;color:var(--content-secondary)}.task-overview-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:.75rem;margin-bottom:1rem}.task-overview-stat{text-align:center;padding:.5rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border)}.task-overview-stat-value{font-family:var(--font-heading);font-size:1.25rem;font-weight:700}.task-overview-stat-label{font-size:.75rem;color:var(--content-secondary);margin-top:.25rem}.task-overview-heatmap-nav{display:flex;align-items:center;justify-content:center;gap:1rem;margin-bottom:.75rem;font-family:var(--font-heading);font-weight:700}.task-overview-meta{display:flex;flex-direction:column;gap:.5rem}.task-overview-badges{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:.25rem}.task-overview-details{display:flex;flex-direction:column;gap:.25rem;color:var(--content-secondary);font-size:.9rem}.task-overview-subtask-list{display:flex;flex-direction:column;gap:.25rem;margin-bottom:.75rem}.task-overview-subtask{display:flex;align-items:center;gap:.5rem;padding:.25rem 0}.completed-text{text-decoration:line-through;color:var(--content-secondary)}.task-overview-add-form{display:flex;gap:.5rem;margin-top:.5rem}.task-overview-add-form .form-input{flex:1}.task-overview-sessions{display:flex;flex-direction:column;gap:.25rem;font-size:.9rem;color:var(--content-secondary)}.task-overview-session{padding:.25rem 0;border-bottom:var(--border-width-sm) solid var(--border)}.task-overview-annotations{display:flex;flex-direction:column;gap:.5rem;margin-bottom:.75rem}.task-overview-annotation{padding:.5rem;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border)}.task-overview-annotation-date{font-size:.75rem;color:var(--content-secondary);margin-bottom:.25rem}.task-overview-completion-list{margin-top:.75rem;font-size:.9rem;color:var(--content-secondary)}.task-overview-completion-item{padding:.25rem 0;border-bottom:var(--border-width-sm) solid var(--border)}.progress-bar{height:6px;background:var(--surface-overlay);border:var(--border-width-sm) solid var(--border);margin-bottom:.75rem;overflow:hidden}.progress-fill{height:100%;background:var(--success);transition:width .3s ease}.progress-bar.over-estimate .progress-fill{background:var(--danger)}.ui-mode-mobile .task-overview-stats{grid-template-columns:repeat(2,1fr)}.toggle-nudge-dot{display:inline-block;width:7px;height:7px;background:var(--danger);border-radius:var(--radius-full);margin-left:.35rem;vertical-align:middle;animation:pulse-badge 2s infinite}.view-toggle-btn{position:relative}.finish-review-bar{display:flex;justify-content:flex-end;padding:1.5rem 0 1rem;margin-top:1.5rem;border-top:1px dashed var(--border)}.finish-review-btn{position:relative;font-size:var(--font-size-lg);padding:.65rem 1.5rem}.finish-review-modal-content{display:flex;flex-direction:column;gap:1.25rem}.past-review-banner{padding:.75rem 1rem;border:var(--border-width-sm) dashed var(--border);border-radius:var(--radius-md);background:var(--surface-overlay);color:var(--content-secondary);font-size:.9rem}.day-accomplished-inline{margin-top:1.5rem}.day-accomplished-inline:empty{display:none}.day-accomplished-stats{font-size:.8rem;color:var(--content-secondary);margin-bottom:.5rem}.events-calendar-container{padding:0}.calendar-nav{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem}.calendar-nav-label{font-family:var(--font-heading);font-size:1.1rem;font-weight:700;margin-left:.5rem}.cal-month-grid{border:var(--border-width) solid var(--border);overflow:hidden;background:var(--surface-raised);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.cal-month-cells,.cal-month-header{display:grid;grid-template-columns:repeat(7,1fr)}.cal-month-day-header{font-family:var(--font-heading);font-size:.75rem;font-weight:600;text-align:center;padding:.5rem;text-transform:uppercase;background:var(--surface-overlay);border-bottom:var(--border-width-sm) solid var(--border)}.cal-month-cell{min-height:90px;border:var(--border-width-sm) solid var(--border);padding:.25rem;cursor:pointer;transition:background var(--transition-fast)}.cal-month-cell:hover{background:var(--surface-overlay)}.cal-month-cell.other-month{opacity:.4}.cal-month-cell.today{border-color:var(--action);border-width:2px}.cal-month-cell-header{margin-bottom:.15rem}.cal-day-number{font-family:var(--font-heading);font-size:.8rem;font-weight:600}.cal-event-chip{font-size:.7rem;padding:1px 4px;margin-top:2px;border-radius:var(--radius-xs);background:var(--action);color:var(--content-on-action);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}.cal-event-chip:hover{opacity:.85}.cal-event-chip.block-focus{background:var(--category-one)}.cal-event-chip.block-personal{background:var(--category-four);color:var(--content)}.cal-event-chip.block-free_time{background:var(--category-two);color:var(--content)}.cal-event-more{font-size:.65rem;color:var(--content-secondary);padding:1px 4px}.month-day-detail{margin-top:1rem;border:var(--border-width) solid var(--border);padding:1rem;background:var(--surface-raised);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.cal-day-detail-event{display:flex;gap:.75rem;padding:.5rem 0;border-bottom:1px solid var(--border);cursor:pointer}.cal-day-detail-event:hover{background:var(--surface-overlay)}.cal-detail-time{font-weight:600;white-space:nowrap;min-width:100px}.cal-detail-location{color:var(--content-secondary);font-size:.85rem}.cal-week-grid{border:var(--border-width) solid var(--border);overflow:hidden;background:var(--surface-raised);box-shadow:var(--shadow-offset) var(--shadow-offset) 0 var(--border)}.cal-week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:var(--border-width-sm) solid var(--border);background:var(--surface-overlay)}.cal-week-day-header{text-align:center;padding:.5rem;font-family:var(--font-heading)}.cal-week-day-header.today{background:color-mix(in srgb,var(--action) 15%,transparent)}.cal-week-day-name{font-size:.75rem;text-transform:uppercase;font-weight:600}.cal-week-day-num{font-size:1rem;font-weight:700;display:block}.cal-week-allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:var(--border-width-sm) solid var(--border);min-height:28px}.cal-allday-label{font-size:.7rem;color:var(--content-secondary);display:flex;align-items:center;justify-content:center}.cal-week-allday-cell{padding:2px;border-left:1px solid var(--border)}.cal-week-body{display:grid;grid-template-columns:60px repeat(7,1fr);position:relative;overflow-y:auto;max-height:70vh}.cal-week-time-gutter{position:relative}.cal-week-hour-label{position:absolute;right:.5rem;font-size:.7rem;color:var(--content-secondary);transform:translateY(-.5em)}.cal-week-day-col{position:relative;border-left:1px solid var(--border)}.cal-week-day-col.today{background:color-mix(in srgb,var(--action) 5%,transparent)}.cal-week-hour-line{position:absolute;left:0;right:0;border-top:1px dashed color-mix(in srgb,var(--border) 50%,transparent)}.cal-week-event{position:absolute;left:2px;right:2px;border:var(--border-width-sm) solid var(--border);border-radius:var(--radius-sm);padding:2px 4px;background:var(--action);color:var(--content-on-action);overflow:hidden;cursor:pointer;z-index:10;font-size:.7rem}.cal-week-event:hover{opacity:.85}.cal-week-event-title{font-weight:600}.cal-week-event-time{font-size:.65rem;opacity:.85}.cal-week-event.block-focus{background:var(--category-one)}.cal-week-event.block-personal{background:var(--category-four);color:var(--content)}.cal-week-event.block-free_time{background:var(--category-two);color:var(--content)}html.ui-mode-mobile{--timeline-slot-h:22px}.ui-mode-mobile .cal-month-cell{min-height:64px;padding:4px}.ui-mode-mobile .cal-day-number{font-size:.95rem;font-weight:600}.ui-mode-mobile .cal-event-chip{font-size:.65rem}.ui-mode-mobile .cal-week-body{max-height:60vh}.ui-mode-mobile .cal-mobile-day{display:flex;flex-direction:column;height:70vh;user-select:none}.ui-mode-mobile .cal-mobile-day-header{padding:.75rem;font-weight:600;text-align:center;border-bottom:1px solid var(--border)}.ui-mode-mobile .cal-mobile-day-header.today{color:var(--action)}.ui-mode-mobile .cal-mobile-allday{padding:.5rem;display:flex;flex-direction:column;gap:.25rem;border-bottom:1px solid var(--border)}.ui-mode-mobile .cal-mobile-day-body{position:relative;flex:1;overflow-y:auto;display:grid;grid-template-columns:48px 1fr}.ui-mode-mobile .cal-mobile-day-col{position:relative;border-left:1px solid var(--border)}.ui-mode-mobile .settings-page-layout{flex-direction:column}.ui-mode-mobile .settings-sidebar{width:100%;border-right:none;border-bottom:1px solid var(--border);padding:.75rem;flex-direction:row;flex-wrap:wrap;align-items:center}.ui-mode-mobile .settings-back{margin-bottom:0;margin-right:.5rem;padding:.5rem}.ui-mode-mobile .settings-nav-items{flex-direction:row;flex-wrap:wrap;gap:.25rem}.ui-mode-mobile .settings-nav-item{padding:.5rem .75rem;border-left:none;border-radius:var(--radius-sm)}.ui-mode-mobile .settings-nav-item.active{border-left-color:transparent}.ui-mode-mobile .settings-content{padding:1rem}body.compose-window{height:100vh;display:flex;flex-direction:column;overflow:hidden}body.compose-window .compose-toolbar{display:flex;gap:.5rem;padding:.75rem 1rem;background:var(--surface-overlay);border-bottom:1px solid var(--border)}body.compose-window .toolbar-spacer{flex:1}body.compose-window .compose-form{flex:1;display:flex;flex-direction:column;overflow:hidden;background:var(--surface-raised)}body.compose-window .status-bar{padding:.5rem 1rem;background:var(--surface-overlay);border-top:1px solid var(--border);font-size:.8125rem;color:var(--content-secondary)}body.compose-window .status-bar.error{color:var(--danger)}body.compose-window .status-bar.success{color:var(--success)}body.compose-window .compose-loading{opacity:.6;pointer-events:none}.saved-views-save{display:flex;gap:var(--space-2);align-items:center;flex-wrap:wrap;margin-bottom:var(--space-4)}.saved-views-save .form-input{flex:1 1 auto;min-width:160px}.saved-views-list{display:flex;flex-direction:column;gap:var(--space-2)}.saved-views-row{display:flex;gap:var(--space-2);align-items:center}.saved-views-row .saved-views-apply{flex:1 1 auto;text-align:left}.saved-views-empty{color:var(--content-muted)}#command-palette{position:fixed;inset:0;z-index:5000;display:flex;align-items:flex-start;justify-content:center;padding-top:15vh}#command-palette.hidden{display:none}.cp-backdrop{position:absolute;inset:0;background:rgba(0,0,0,.5)}.cp-dialog{position:relative;width:90%;max-width:560px;background:var(--surface-raised);border:var(--border-width) solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-brutal-md);overflow:hidden}.cp-input-row{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;border-bottom:1px solid var(--border)}.cp-icon{font-size:1.1rem;opacity:.5}.cp-input{flex:1;border:none;outline:0;background:0 0;font-size:1rem;font-family:inherit;color:var(--content)}.cp-esc{font-size:.7rem;padding:.15rem .4rem;background:var(--surface-overlay);border:1px solid var(--border);border-radius:3px;color:var(--content-secondary)}.cp-filters{display:flex;gap:.4rem;padding:0 1rem;flex-wrap:wrap}.cp-filters:not(:empty){padding-top:.5rem;padding-bottom:.25rem}.cp-filter-tag{font-size:.75rem;padding:.15rem .5rem;background:var(--surface-overlay);border-radius:var(--radius-sm);color:var(--content-secondary)}.cp-results{max-height:360px;overflow-y:auto}.cp-empty,.cp-hint{padding:1.5rem 1rem;text-align:center;font-size:.85rem;color:var(--content-secondary);line-height:1.6}.cp-hint kbd{font-size:.75rem;padding:.1rem .35rem;background:var(--surface-overlay);border:1px solid var(--border);border-radius:3px}.cp-result{display:flex;align-items:center;gap:.6rem;padding:.5rem 1rem;cursor:pointer;border-bottom:1px solid var(--border)}.cp-result:last-child{border-bottom:none}.cp-result.cp-selected,.cp-result:hover{background:var(--surface-overlay)}.cp-type-icon{font-size:1rem;width:1.5rem;text-align:center;flex-shrink:0}.cp-result-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:.15rem}.cp-title{font-size:.9rem;color:var(--content);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cp-project{font-size:.75rem;color:var(--content-secondary)}.cp-snippet{font-size:.75rem;color:var(--content-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cp-type-badge{font-size:.7rem;padding:.15rem .4rem;background:var(--surface-overlay);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--content-secondary);flex-shrink:0}.cp-more{padding:.5rem 1rem;text-align:center;font-size:.8rem;color:var(--content-secondary);opacity:.7}
1 < \ No newline at end of file
@@ -124,6 +124,14 @@ const api = {
124 124 delete: (taskId, subtaskId) => invoke('delete_subtask', { subtaskId }),
125 125 },
126 126
127 + // Status tokens (typed at-a-glance markers, e.g. linked commits).
128 + // `record` is idempotent in (kind, reference), so it also toggles state/primary.
129 + statusTokens: {
130 + list: (taskId) => invoke('list_task_status_tokens', { taskId }),
131 + record: (taskId, input) => invoke('record_task_status_token', { taskId, input }),
132 + delete: (tokenId) => invoke('delete_task_status_token', { tokenId }),
133 + },
134 +
127 135 // Events
128 136 events: {
129 137 list: () => invoke('list_events'),