For the Vue 3.5 SPA (Vite 8). Google publishes no Vue
style guide, so the base is the official Vue Style Guide (Priority A/B) +
Composition API with <script setup lang="ts">; the TypeScript inside SFCs follows the
Google TS rules via gts (CODE_STYLE_TS.md). Tooling: TS strict,
ESLint (eslint-plugin-vue) + Prettier, type-check with vue-tsc. Pinned versions
(Vite 8/Rolldown, Vue 3.5, Tailwind 4, …): TOOLCHAIN.md §1/§5.
- One component per file, PascalCase filename (
ReviewWorkbench.vue) — enforced byeslint-plugin-vue(vue/component-name-in-template-casing); composables areuseX.ts. - SFC block order:
<script setup>→<template>→<style>. - Typed
defineProps<T>()anddefineEmits<T>()— no runtime prop objects. - Keep components small; extract shared logic into composables (
useX()incomposables/). ref/computedoverreactivefor primitives; everyv-forhas a stable:key.
- File length ≤ 400 lines per
.vue(max-lines); split a large screen into child components + composables. Line length = 80 (Prettier).eslint --fix/prettier --writeauto-format; same checks in pre-commit + CI.
- Local state + composables first; reach for Pinia only for genuinely global state.
- A typed API client wraps
fetchto the Go serving API; the chat uses SSE to the reasoning endpoint. The browser never calls a model (AI-GOVERNANCE §5). - Access tier comes from the server (RLS); the UI filter is convenience, never the boundary.
- Tailwind 4 utilities + CVA (class-variance-authority) for component variants; reka-ui primitives (shadcn-vue) — don't hand-roll accessibility. Icons: lucide-vue-next. No ad-hoc global CSS.
- Graph Explorer: Vue Flow + elkjs layout; custom nodes are components.
- Tables (Review Workbench / Findings / Resolution): TanStack Vue Table.
- Chains / diagrams: mermaid.
- Vitest + Vue Test Utils for components.