diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 403bf74..735044e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,9 @@ jobs: - name: Install run: npm ci + - name: No raw colors + run: npm run check:colors + - name: Test run: npm test diff --git a/.gitignore b/.gitignore index 0a1de36..cdf0a71 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ prisma/*.db-journal # Keep generated SFX (small, needed to mix) # data/voices.json is committed as the default character map .vercel +*.tsbuildinfo diff --git a/README.md b/README.md index cf5ac04..3d21f63 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,8 @@ Default routing (not intelligent): Indic languages → Sarvam `bulbul:v3`. Engli ## Stack (grows only when the audio works) -- Next.js App Router + TypeScript + Tailwind +- Next.js App Router + TypeScript + Tailwind for layout +- House design system (`@house/tokens`, `@house/react`, vendored in `vendor/`) for color, type, and controls; `npm run check:colors` fails on raw colors - Local JSON + wavs on disk, then Prisma (SQLite locally; Postgres when you need it) - FFmpeg via `ffmpeg-static` (system `ffmpeg` used if on PATH) - Sarvam first. ElevenLabs TTS only, as a week-4 benchmark. No Music API. diff --git a/app/create-form.tsx b/app/create-form.tsx index 3a31622..1720e40 100644 --- a/app/create-form.tsx +++ b/app/create-form.tsx @@ -1,7 +1,8 @@ "use client"; -import { useMemo, useState } from "react"; +import { useId, useMemo, useState } from "react"; import { useRouter } from "next/navigation"; +import { Button, Field, Stack, Surface, Text } from "@house/react"; import { USE_CASES, type UseCaseId } from "@/lib/use-cases"; import { parseCanonicalScript } from "@/server/pipeline/parse"; import { useOptionalOnboarding } from "./onboarding/provider"; @@ -23,6 +24,7 @@ export function CreateEpisodeForm() { const [script, setScript] = useState(selected.script); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); + const scriptId = useId(); const parsed = useMemo(() => tryParse(script), [script]); @@ -58,7 +60,7 @@ export function CreateEpisodeForm() { return (
-

Use case

+

Use case

{USE_CASES.map((useCase) => { const on = useCase.id === active; @@ -69,13 +71,16 @@ export function CreateEpisodeForm() { onClick={() => pick(useCase.id)} className={`rounded-lg border px-3 py-3 text-left ${ on - ? "border-[var(--accent)] bg-[var(--panel)]" - : "border-[var(--line)] bg-transparent hover:border-[var(--accent)]" + ? "border-[var(--accent)] bg-[var(--accent-subtle)]" + : "border-[var(--border)] bg-transparent hover:border-[var(--accent)]" }`} + aria-pressed={on} >

{useCase.title}

-

{useCase.who}

-

{useCase.blurb}

+

{useCase.who}

+

+ {useCase.blurb} +

); })} @@ -83,65 +88,62 @@ export function CreateEpisodeForm() {
-
- -