diff --git a/app/src-tauri/src/bridge.rs b/app/src-tauri/src/bridge.rs index 4e3c592..d16e315 100644 --- a/app/src-tauri/src/bridge.rs +++ b/app/src-tauri/src/bridge.rs @@ -430,6 +430,11 @@ pub async fn mark_read(state: BridgeState<'_>, target: Value) -> Result) -> Result { + data_of(state.request(Cmd::ClearEvents).await.map_err(|e| e.to_string())?) +} + #[tauri::command] pub async fn health(state: BridgeState<'_>) -> Result { data_of(state.request(Cmd::Health).await.map_err(|e| e.to_string())?) diff --git a/app/src-tauri/src/lib.rs b/app/src-tauri/src/lib.rs index 9bf792c..cb7a412 100644 --- a/app/src-tauri/src/lib.rs +++ b/app/src-tauri/src/lib.rs @@ -52,6 +52,7 @@ pub fn run() { bridge::set_zoom, bridge::event_log, bridge::mark_read, + bridge::clear_events, bridge::health, bridge::get_config, bridge::set_config, diff --git a/app/src/App.tsx b/app/src/App.tsx index ab54f28..7f2bf10 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -9,7 +9,7 @@ import { Settings } from "./Settings"; import { EventCenter } from "./EventCenter"; import { maybeNotify } from "./notify"; import { COLORS, applyTheme, resolvePalette } from "./theme"; -import { getStatusFull, applyPreset, onDaemonEvent, onDaemonRawEvent, setWorkspaceMeta, focusSurface, getEventLog, markEventsRead, getHealth, closeWorkspaceCmd, getConfig } from "./socketBridge"; +import { getStatusFull, applyPreset, onDaemonEvent, onDaemonRawEvent, setWorkspaceMeta, focusSurface, getEventLog, markEventsRead, clearEvents, getHealth, closeWorkspaceCmd, getConfig } from "./socketBridge"; import type { EventRecord, DaemonHealth, ConfigView } from "./socketBridge"; import { leafIds } from "./layoutTypes"; import type { Group, WorkspaceView, SurfaceState } from "./layoutTypes"; @@ -95,6 +95,8 @@ export function App() { } else if (evt.evt === "events_read") { const ids = new Set(evt.data.ids); setEvents((es) => es.map((e) => (ids.has(e.id) ? { ...e, read: true } : e))); + } else if (evt.evt === "events_cleared") { + setEvents([]); } else if (evt.evt === "state") { setStates((m) => ({ ...m, [evt.data.surface_id]: evt.data.state })); void refresh(); @@ -177,6 +179,7 @@ export function App() { { void markEventsRead({ target: "all" }); }} + onClear={() => { void clearEvents(); }} onSelect={(sid, id) => { void focusSurface(sid); void markEventsRead({ target: "ids", value: [id] }); }} /> )} diff --git a/app/src/EventCenter.tsx b/app/src/EventCenter.tsx index 561d348..242f80f 100644 --- a/app/src/EventCenter.tsx +++ b/app/src/EventCenter.tsx @@ -1,5 +1,5 @@ import { useState } from "react"; -import { Check, Hourglass, X, Power, Send, MessageSquare } from "lucide-react"; +import { Check, Hourglass, X, Power, Send, MessageSquare, Trash2 } from "lucide-react"; import { COLORS, FONT } from "./theme"; import type { EventRecord } from "./socketBridge"; @@ -26,10 +26,11 @@ function rel(ts: number): string { } export function EventCenter({ - events, onMarkAllRead, onSelect, + events, onMarkAllRead, onClear, onSelect, }: { events: EventRecord[]; onMarkAllRead: () => void; + onClear: () => void; onSelect: (surfaceId: string, id: number) => void; }) { const [tab, setTab] = useState("all"); @@ -41,7 +42,14 @@ export function EventCenter({
Event Center - Mark all read + Mark all read + { if (events.length) onClear(); }} + style={{ display: "flex", cursor: events.length ? "pointer" : "default", opacity: events.length ? 1 : 0.4 }} + > + +
diff --git a/app/src/Settings.tsx b/app/src/Settings.tsx index 3f3e07c..d9d1905 100644 --- a/app/src/Settings.tsx +++ b/app/src/Settings.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from "react"; +import { X } from "lucide-react"; import { COLORS, FONT, ACCENTS } from "./theme"; import { setConfig, restartDaemon } from "./socketBridge"; import type { ConfigView, DaemonHealth } from "./socketBridge"; @@ -20,7 +21,13 @@ export function Settings({ config, health, onClose, onReload }: { config: Config
e.stopPropagation()} onKeyDown={(e) => { e.stopPropagation(); if (e.key === "Escape") onClose(); }} style={{ width: 520, maxHeight: "80vh", overflowY: "auto", background: COLORS.bgApp, border: `1px solid ${COLORS.borderStrong}`, borderRadius: 14, padding: 24, color: COLORS.textPrimary, fontFamily: FONT.ui }}> -
Settings
+
+ Settings + +
Terminal font