feat(web): redesign task rail — Plan/Event log polish, entity graph resize fix

- Plan/Activity panels: humanize step titles, richer icons, empty states
  matching Scope's illustration style, pretty-printed expandable detail
- Activity log renamed to Event log; every step now expandable
- Chat: middle-truncate header title, remove redundant task-list rail and
  header stat cluster (duplicated in the sidebar), simplify markdown styling
- Fix --font-mono actually being a monospace font (was aliased to DM Sans)
- Replace rotating loader-circle spinner with a smoother fading-blade Spinner
- SessionGraph entity detail panel: resizable and self-clamping against its
  live container size (was overflowing into sibling sections), close button
- Dev launch config: fetch bearer token from the running api container so
  `npm run dev` works against the local compose stack without a hardcoded
  secret in a tracked file

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 08:22:08 +02:00
parent 3d99282897
commit 6a8efd22bb
16 changed files with 372 additions and 217 deletions

View File

@@ -0,0 +1,30 @@
<script lang="ts">
// A fading-blade spinner rather than a rotating arc — rotating a single
// thin stroke via CSS transform reads as jittery at icon sizes (the arc's
// sub-pixel edges shimmer each frame). Cycling opacity across fixed blades
// avoids that entirely and is how native OS spinners do it.
let { class: className = '' }: { class?: string } = $props()
const TICKS = 8
const DUR = 0.9
</script>
<svg viewBox="0 0 24 24" class={className} fill="none" aria-hidden="true">
{#each Array.from({ length: TICKS }) as _, i (i)}
<rect
x="11" y="1.5" width="2" height="6" rx="1"
fill="currentColor"
opacity="0.15"
transform="rotate({i * (360 / TICKS)} 12 12)"
>
<animate
attributeName="opacity"
values="1;0.15"
keyTimes="0;1"
dur="{DUR}s"
begin="{-(i * (DUR / TICKS)).toFixed(3)}s"
repeatCount="indefinite"
/>
</rect>
{/each}
</svg>