Skip to content

feat(frontend): Agora 2026 design exploration at /agora-2026#482

Draft
arn0ld87 wants to merge 2 commits into
mainfrom
claude/implement-agora-2026-0PjzE
Draft

feat(frontend): Agora 2026 design exploration at /agora-2026#482
arn0ld87 wants to merge 2 commits into
mainfrom
claude/implement-agora-2026-0PjzE

Conversation

@arn0ld87
Copy link
Copy Markdown
Owner

Summary

Vue port of the Claude Design handoff bundle Agora 2026.html — an
editorial Data-Room aesthetic (Geist + Newsreader serif + JetBrains Mono,
warm oklch + cobalt indigo) with the design's key innovation: a
persistent model pill in the topbar and a per-step model strip
on the run-creation hero that solves the recurring "LLM-Anbieter zwischen
Schritten händisch eingeben" pain.

  • Isolated: opt-in via [data-theme="agora-2026"] set on route mount;
    production v4 shell (Sidebar/Topbar/AppShell) is untouched. All tokens,
    fonts, and components are scoped under .a26-root.
  • Two screens at full fidelity from the design bundle:
    • Dashboard — Operator Workbench: hero "Neuer Run" card with
      dropzone + template/language/question fields, per-step model strip
      (inherit/override badges), stats row with sparklines, active runs
      table with progress bars, system health panel.
    • Runs — editorial hero band (120pt display numeral + serif
      headline), filter bar with tabs, full registry table with
      status/confidence/model/branch columns.
  • Reusable atoms: Shell.vue (sidebar + topbar + model pill),
    ModelPill.vue (3-segment: Workspace · Provider · Model + pulse-live
    dot), ProvMark.vue (per-provider color marks).
  • Editorial fonts loaded once in index.html; only rendered under the
    opt-in theme attribute.

Out of scope (left for follow-up)

  • Simulation split-view, LLM-Routing table, ⌘K model-picker drawer
    (3 of the 5 design artboards). Land these as separate slices once
    the design direction is validated.
  • Wiring to live data (runs polling, system status, active model SSE).
    Current implementation uses the design's reference fixtures so the
    visual fidelity matches the handoff 1:1.

Test plan

  • bun run typecheck clean (verified locally, exit 0)
  • bun run build clean (verified locally, exit 0; Agora2026View
    ships as its own ~24 kB chunk)
  • bun run lint clean (verified locally, exit 0)
  • Navigate to /agora-2026: verify editorial theme renders,
    sidebar+topbar+model pill present, switching Dashboard ↔ Runs via
    the sidebar works.
  • Navigate away from /agora-2026: verify the rest of the app
    still renders in the v4 (Apple-style) theme.

https://claude.ai/code/session_01B4vgeCveko3hu3jzhrbvzq


Generated by Claude Code

Vue port of the Claude Design handoff bundle (Agora 2026.html) — an
editorial Data-Room aesthetic with persistent model pill and per-step
model strip that solves the recurring "LLM-Anbieter zwischen Schritten
händisch eingeben" pain.

- Opt-in via [data-theme="agora-2026"] on route mount; leaves the
  production v4 shell (Sidebar/Topbar/AppShell) untouched.
- Two screens at full fidelity from the bundle: Dashboard (Operator
  Workbench with hero + per-step model strip + stats + active runs +
  system health) and Runs (editorial hero band + registry table).
- Tokens, fonts (Geist + Newsreader + JetBrains Mono), shell, model
  pill ported scoped under .a26-root to avoid global FOUC.
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the 'Agora 2026' design exploration, featuring a new editorial-style theme using OKLCH color tokens and custom typography. The changes include a new route, a layout shell with a sidebar and topbar, and several screens such as a Dashboard and a Runs history view. Feedback was provided to address security concerns regarding the use of v-html for SVG rendering, the need for internationalization of hardcoded strings, and the removal of inline styles in favor of CSS classes. Additionally, a suggestion was made to improve type safety within the navigation logic.

</script>

<template>
<span class="a26-icon" v-html="svg" aria-hidden="true" />
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

security-medium medium

Using v-html to render SVG strings is a security risk as it can lead to Cross-Site Scripting (XSS) if the content is not properly sanitized or if it becomes dynamic in the future. While the current icons are static constants, it is better to use a safer approach, such as rendering the SVG elements directly or using a dedicated icon component library.

</div>
</div>

<div class="a26-rail-section">Arbeitsbereich</div>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The application uses i18n for translations, but several new components in the Agora 2026 exploration contain hardcoded German strings. These should be moved to the locale files and accessed via $t() to maintain consistency and support internationalization. This applies to all user-facing text in the new screens.

      <div class="a26-rail-section">{{ $t('agora2026.shell.workspace') }}</div>

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skipping for this PR — /agora-2026 is a design exploration with the handoff bundle's literal German fixture copy ("DACH · Tech-Adoption", "Workbench", "Run-Center · gesamt", etc.) which is the design's intent, not user-facing production strings. Threading 30+ keys through vue-i18n for an exploration that may still be iterated on is premature; we'll i18n once concrete screens land in the production v4 shell. The opt-in route gate ([data-theme="agora-2026"]) keeps this isolated from translated production views.


Generated by Claude Code


<template>
<Shell active="dashboard" :crumbs="['Workbench', 'Dashboard']" @nav="emit('nav', $event)">
<div class="dash-stack" style="max-width: 1280px">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

There are numerous inline styles used throughout this component. For better maintainability and to adhere to the project's styling patterns, these should be moved to the scoped <style> block. For example, the max-width on line 67 can be added to the .dash-stack class.

    <div class="dash-stack">

Comment on lines +10 to +14
function onNav(key: string): void {
if (key === 'dashboard' || key === 'runs') {
active.value = key
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The onNav function uses a manual string check which is brittle. Since ScreenKey is already defined, you can improve type safety by using a type guard or checking against a list of valid keys. This ensures that adding new screens in the future won't require manual updates to this logic.

function onNav(key: string): void {
  const validScreens: ScreenKey[] = ['dashboard', 'runs']
  if (validScreens.includes(key as ScreenKey)) {
    active.value = key as ScreenKey
  }
}

- Icon.vue: render each icon as a Vue functional component via h()
  + <component :is>, eliminating v-html. Icons stay static, but the
  pattern is now safe-by-construction if any icon ever takes input.
- Agora2026View.vue: replace string-equality check on screen keys with
  a type-guard against a SCREEN_KEYS tuple. Adding a new screen now
  only needs the tuple update.
- DashboardScreen.vue: lift the structural inline styles (max-width
  on .dash-stack, .hero-title margin, .hero-meta width, hero-actions
  flex) into the scoped <style>.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants