diff --git a/docs/ui-ux-implementation.md b/docs/ui-ux-implementation.md
index 6eb6a53..ea43363 100644
--- a/docs/ui-ux-implementation.md
+++ b/docs/ui-ux-implementation.md
@@ -33,17 +33,19 @@ The changes prioritize clear operational outcomes, reviewed action scope, recove
| 23. Blueprint coverage | Existing/queued inventory is distinguished from healthy playable servers, with linked coverage details. Collections group assignments and show a sticky key count and jump-to-missing-key action. Creation remains limited to the target shortfall. |
| 24. Mobile overhead | Fleet avoids redundant headings/zero campaign summaries, empty libraries emphasize their next action, and Leaderboard totals collapse on phones with a compact selected-stat table. Long forms retain reachable actions and focus spacing. |
| 25. Consistent hierarchy | Editable controls use stronger dedicated boundaries. Routes have descriptive titles, operational language is clearer, keyboard shortcuts have a help panel, and selected overflow tabs scroll into view without moving the page. |
-| 26. Investigation/handoffs | Logs support literal search/highlighting, copy, tail download, deep links, explicit follow/refresh state and jump-to-latest. A bounded recent-notifications panel retains results in the current browser tab. Beta rows include labels, age and blocker context. |
+| 26. Investigation/handoffs | Logs support literal search/highlighting, copy, tail download, deep links, explicit follow/refresh state and jump-to-latest. Beta rows include labels, age and blocker context. |
The review explicitly made overlay-priority reordering and Leaderboard player history/recent-period views conditional on further design or operator demand. Those product extensions remain future discovery work; the composition explanations and mobile Leaderboard changes are implemented.
+Activity and notifications have been removed. Copy results appear next to their controls; GitHub imports retain their inline completion and error states.
+
## API and operational boundaries
- Promotion uses `GET /api/betas/:id/promote` to review impact and `POST` with the returned token as `previewToken` to apply it. A changed plan returns HTTP 409 and needs renewed review.
- Reconciliation uses `POST /api/drift` with `dryRun: true` and optional `servers`, then executes with the returned `expectedFingerprint`. Omitted servers explicitly mean the entire fleet. A stale review returns HTTP 409; changes detected during application are reported as skipped files.
- `POST /api/deployments/:id/cancel` only withdraws a waiting removal. It does not restore a server after deletion has started.
- System status exposes no credential values. Its optional connection check verifies Komodo network reachability, not credential validity. Remote game-file volumes remain explicitly unverified.
-- Drafts contain nonsecret beta setup. Launch keys are not stored in browser drafts. Recent notifications use tab-scoped session storage, capped at 50 entries, and do not imply background push delivery.
+- Drafts contain nonsecret beta setup. Launch keys are not stored in browser drafts.
- Log search/export covers the loaded tail, not an entire remote file or a full diagnostic archive.
## Validation
diff --git a/docs/ui-ux-review.md b/docs/ui-ux-review.md
index 891c391..49214d8 100644
--- a/docs/ui-ux-review.md
+++ b/docs/ui-ux-review.md
@@ -320,7 +320,7 @@ Add log search/highlighting, copy/download, and a deep link preserving the selec
Acceptance: operators can return to a completed notification or share a precise diagnostic view without reconstructing the investigation.
-Sources: [LogPanel](../src/lib/ui/components/LogPanel.svelte); [notification store](../src/lib/ui/toast.ts); [watch handling](../src/lib/ui/stores/fleet.ts); [beta list](../src/routes/betas/+page.svelte); [Leaderboard](../src/routes/leaderboard/+page.svelte).
+Sources: [LogPanel](../src/lib/ui/components/LogPanel.svelte); [watch handling](../src/lib/ui/stores/fleet.ts); [beta list](../src/routes/betas/+page.svelte); [Leaderboard](../src/routes/leaderboard/+page.svelte).
## Suggested layout for operational detail pages
diff --git a/src/lib/ui/components/CopyValue.svelte b/src/lib/ui/components/CopyValue.svelte
index d7b52c7..b2b0457 100644
--- a/src/lib/ui/components/CopyValue.svelte
+++ b/src/lib/ui/components/CopyValue.svelte
@@ -1,11 +1,13 @@
-
{value}
-
+
{value}{#if copyStatus}{copyStatus}{/if}
+
diff --git a/src/lib/ui/components/LogPanel.svelte b/src/lib/ui/components/LogPanel.svelte
index c923f37..7bf5dcf 100644
--- a/src/lib/ui/components/LogPanel.svelte
+++ b/src/lib/ui/components/LogPanel.svelte
@@ -2,7 +2,6 @@
import { tick, untrack, onMount, onDestroy } from 'svelte';
import { page } from '$app/stores';
import { goto } from '$app/navigation';
- import { toast } from '$ui/toast.js';
import { createLogRefresh, type LogResponse } from '$ui/log-refresh.js';
import Tabs from './primitives/Tabs.svelte';
import Button from './primitives/Button.svelte';
@@ -33,11 +32,12 @@
let loading = $state(false);
let autoRefresh = $state(true);
let refreshError = $state('');
+ let copyStatus = $state('');
let bodyEl = $state(null);
let stickToBottom = $state(true);
const refresh = createLogRefresh({
- onReset: () => { data = {}; refreshError = ''; },
+ onReset: () => { data = {}; refreshError = ''; copyStatus = ''; },
onLoading: value => { loading = value; },
onError: message => { refreshError = message; },
onData: (key, body) => {
@@ -67,8 +67,9 @@
await tick(); if (bodyEl) bodyEl.scrollTop = bodyEl.scrollHeight;
}
async function copy(value: string, message: string) {
- try { await navigator.clipboard.writeText(value); toast(message); }
- catch { toast('Could not copy. Select the log text to copy manually.', { variant: 'danger' }); }
+ copyStatus = '';
+ try { await navigator.clipboard.writeText(value); copyStatus = message; }
+ catch { copyStatus = 'Could not copy. Select the log text or browser address to copy manually.'; }
}
function copyLink() {
const url = new URL(window.location.href); url.searchParams.set('tab', 'logs'); url.searchParams.set('log', active);
@@ -134,6 +135,7 @@