feat(frontend): restyle ThothII to the Omics Portal (GSD) design system

Adopt the portal's design language so the app embeds seamlessly into its
header/sidebar chrome later:
- Token layer rewritten as raw OKLCH triplets (the previous oklch()-wrapped
  vars produced invalid colors; the UI was effectively unstyled). Values mirror
  GSD: Manrope + Fraunces fonts, #cb333b red brand, warm off-white surfaces,
  pill buttons, brand focus rings. Dark tokens follow .dark or the portal's
  [data-bs-theme=dark].
- Layout: no left sidebar, no header (the portal supplies them). Conversation
  column flush-left with a slim F1-F8 phase strip; session rail moved to the
  RIGHT, mirroring the portal's left sidebar (red section label, red-tint active
  item). Editorial empty state.
- Transcript component now actually renders the streamed assistant turns (the
  store accumulated them but nothing displayed them). Toaster mounted for errors
  (matchMedia polyfill added to the jsdom test setup).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-28 18:05:23 +02:00
co-authored by Claude Opus 4.8
parent f59d6d1478
commit 4e6d4a4cea
12 changed files with 424 additions and 180 deletions
+11 -6
View File
@@ -1,6 +1,8 @@
// frontend/src/shell/SteerInput.tsx
import { useState } from "react";
import { ArrowUpIcon } from "lucide-react";
import { postSteer } from "../api/sessions";
import { Button } from "../components/ui/button";
interface Props {
sessionId: string;
@@ -24,21 +26,24 @@ export function SteerInput({ sessionId }: Props) {
}
return (
<div className="flex gap-2 items-center border-t pt-2">
<div className="flex items-center gap-2 rounded-full border border-input bg-card px-2 py-1.5 shadow-sm transition-colors focus-within:border-primary/40 focus-within:ring-3 focus-within:ring-ring/15">
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
onKeyDown={handleKeyDown}
placeholder="Steering libero (!)…"
className="flex-1 border rounded px-2 py-1 text-sm focus:outline-none focus:ring-1"
aria-label="Steering"
className="flex-1 bg-transparent px-2 text-sm outline-none placeholder:text-muted-foreground"
/>
<button
<Button
size="icon-sm"
onClick={submit}
className="border rounded px-3 py-1 text-sm hover:bg-accent"
disabled={!text.trim()}
aria-label="Invia"
>
Invia
</button>
<ArrowUpIcon />
</Button>
</div>
);
}