-
{title}
+
+
+
{title}
{description &&
{description}
}
- {children &&
{children}
}
+ {children &&
{children}
}
);
}
diff --git a/apps/frontend/src/styles/globals.css b/apps/frontend/src/styles/globals.css
index de817c6..7e7aba8 100644
--- a/apps/frontend/src/styles/globals.css
+++ b/apps/frontend/src/styles/globals.css
@@ -4,67 +4,66 @@
@layer base {
:root {
- --background: 0 0% 100%;
- --foreground: 224 71% 4%;
+ --background: 42 31% 96%;
+ --foreground: 258 19% 13%;
--card: 0 0% 100%;
- --card-foreground: 224 71% 4%;
+ --card-foreground: 258 19% 13%;
--popover: 0 0% 100%;
- --popover-foreground: 224 71% 4%;
- --primary: 220 90% 56%;
- --primary-foreground: 210 40% 98%;
- --secondary: 220 14% 96%;
- --secondary-foreground: 220 9% 46%;
- --muted: 220 14% 96%;
- --muted-foreground: 220 9% 46%;
- --accent: 220 14% 96%;
- --accent-foreground: 224 71% 4%;
+ --popover-foreground: 258 19% 13%;
+ --primary: 17 91% 40%;
+ --primary-foreground: 0 0% 100%;
+ --secondary: 38 28% 92%;
+ --secondary-foreground: 260 10% 34%;
+ --muted: 38 25% 92%;
+ --muted-foreground: 263 8% 43%;
+ --accent: 25 72% 92%;
+ --accent-foreground: 258 19% 13%;
--destructive: 0 84% 60%;
--destructive-foreground: 210 40% 98%;
- --success: 142 76% 36%;
+ --success: 142 76% 26%;
--success-foreground: 210 40% 98%;
- --warning: 38 92% 50%;
- --warning-foreground: 224 71% 4%;
- --border: 220 13% 91%;
- --input: 220 13% 91%;
- --ring: 220 90% 56%;
- --radius: 0.5rem;
- --sidebar: 0 0% 98%;
- --sidebar-foreground: 224 71% 4%;
- --sidebar-border: 220 13% 91%;
- --sidebar-accent: 220 14% 96%;
- --sidebar-accent-foreground: 224 71% 4%;
+ --warning: 38 92% 29%;
+ --warning-foreground: 258 19% 13%;
+ --border: 17 70% 72%;
+ --input: 17 70% 72%;
+ --ring: 17 91% 50%;
+ --radius: 0.625rem;
+ --sidebar: 40 31% 94%;
+ --sidebar-foreground: 258 19% 13%;
+ --sidebar-border: 17 70% 72%;
+ --sidebar-accent: 17 91% 40%;
+ --sidebar-accent-foreground: 0 0% 100%;
}
.dark {
- --background: 224 71% 4%;
- --foreground: 213 31% 91%;
- --card: 222 47% 7%;
- --card-foreground: 213 31% 91%;
- --popover: 222 47% 7%;
- --popover-foreground: 213 31% 91%;
- --primary: 217 91% 60%;
- --primary-foreground: 222 47% 7%;
- --secondary: 222 47% 11%;
- --secondary-foreground: 215 20% 65%;
- --muted: 223 47% 11%;
- --muted-foreground: 215 20% 65%;
- --accent: 216 34% 17%;
- --accent-foreground: 213 31% 91%;
+ --background: 258 22% 8%;
+ --foreground: 38 27% 92%;
+ --card: 258 18% 11%;
+ --card-foreground: 38 27% 92%;
+ --popover: 258 18% 11%;
+ --popover-foreground: 38 27% 92%;
+ --primary: 17 91% 53%;
+ --primary-foreground: 0 0% 100%;
+ --secondary: 258 13% 17%;
+ --secondary-foreground: 38 14% 70%;
+ --muted: 258 13% 17%;
+ --muted-foreground: 38 10% 65%;
+ --accent: 17 36% 20%;
+ --accent-foreground: 38 27% 92%;
--destructive: 0 63% 51%;
--destructive-foreground: 210 40% 98%;
--success: 142 71% 45%;
--success-foreground: 222 47% 7%;
--warning: 38 92% 50%;
--warning-foreground: 222 47% 7%;
- --border: 216 34% 17%;
- --input: 216 34% 17%;
- --ring: 217 91% 60%;
- --radius: 0.5rem;
- --sidebar: 222 47% 5%;
- --sidebar-foreground: 213 31% 91%;
- --sidebar-border: 216 34% 17%;
- --sidebar-accent: 216 34% 12%;
- --sidebar-accent-foreground: 213 31% 91%;
+ --border: 17 42% 35%;
+ --input: 17 42% 35%;
+ --ring: 17 91% 53%;
+ --sidebar: 258 21% 7%;
+ --sidebar-foreground: 38 27% 92%;
+ --sidebar-border: 17 42% 35%;
+ --sidebar-accent: 17 91% 53%;
+ --sidebar-accent-foreground: 0 0% 100%;
}
}
@@ -74,6 +73,24 @@
}
body {
@apply bg-background text-foreground font-sans antialiased;
+ min-width: 320px;
+ }
+ button,
+ a,
+ input,
+ select,
+ textarea {
+ @apply focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background;
+ }
+}
+
+@layer components {
+ .partha-surface {
+ @apply rounded-xl border border-border bg-card shadow-[0_1px_0_hsl(var(--foreground)/0.03)];
+ }
+
+ .partha-input {
+ @apply rounded-md border border-input bg-card text-foreground placeholder:text-muted-foreground;
}
}
diff --git a/design-qa.md b/design-qa.md
new file mode 100644
index 0000000..dc797a8
--- /dev/null
+++ b/design-qa.md
@@ -0,0 +1,28 @@
+# Iteration 1 design QA
+
+## Reference
+
+- Figma prototype: Iteration 1, starting at node `285:2987`.
+- Compared states: sign in, dashboard, architecture, AI Workspace, and Settings → AI Providers.
+- Comparison viewport: 1224 × 768. Responsive checks: 320 × 768.
+- Comparison images are local QA artifacts and are not part of the public repository.
+
+## Result
+
+- Brand: designer-supplied PARTHA logo is used in authentication and navigation; no substitute mark is generated.
+- Visual system: the implementation matches the reference cream canvas, orange primary/action colour, outlined surfaces, compact sidebar, and low-shadow card treatment.
+- Dashboard: hierarchy, metric cards, repository list, navigation, and control density match the reference while all values remain authentic fixture data.
+- Architecture: the graph, tabs, manifest, toolbar, and evidence labels match the reference. At 1224px and 320px, the document and main region have equal client and scroll widths. React Flow has non-zero dimensions at both sizes and emits no dimension warning.
+- AI Workspace: the question composer remains visible at both viewports. The reference's blank workspace state is corrected while keeping the disclosed Preview limitation and sealed-snapshot-only context.
+- AI Providers: provider selection, model identifier, masked key field, saved/not-configured state, test action, and save action are visible and functional. No credentials were entered during QA.
+- Upload: source tabs expose real tab/tabpanel state so the selected GitHub or archive input cannot disagree with the visible content.
+- Authentication: the existing supported email/password flow is retained. The reference's Google and GitHub controls were not copied because those authentication methods do not exist in the current backend and would create fake interactions.
+- Responsive and accessibility: keyboard focus styling is visible, mobile navigation remains a labelled modal drawer, page headers wrap, contained tables scroll internally, and no page-level horizontal scrolling was observed in the tested states. White text on the primary burnt-orange action colour measures 5.24:1 contrast; status text maintains at least 4.62:1 against its tinted backgrounds.
+
+## Evidence
+
+- Browser measurements at 1224px: Dashboard, Architecture, AI Workspace, and AI Providers each reported `body.scrollWidth === body.clientWidth`; authenticated main regions also reported equal scroll and client widths.
+- Browser measurements at 320px: Architecture reported a 320 × 288 graph and no document/main overflow; AI Workspace reported a visible composer ending above the viewport bottom.
+- Automated checks: 41 frontend test files / 222 tests passed; frontend lint passed; production build passed. Backend verification covered 888 passing tests and 4 expected environment-gated skips; 886 passed in the full sandboxed run, and the two loopback TLS cases blocked by sandbox socket permissions passed when rerun with loopback permission.
+
+final result: passed
diff --git a/docs/README.md b/docs/README.md
index 02d7728..ad9f1a2 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -37,3 +37,7 @@ Every document listed here is maintained and describes the system as it currentl
- State limitations plainly. An honest gap is more useful than an optimistic claim.
- No placeholder documents.
- Documentation changes in the same pull request as the behaviour it describes.
+
+## Product testing
+
+- [Iteration 1 engineer feedback](operations/ITERATION_1_ENGINEER_FEEDBACK.md) — workflow checklist, feedback fields, and safe reporting guidance for real-user testing.
diff --git a/docs/operations/ITERATION_1_ENGINEER_FEEDBACK.md b/docs/operations/ITERATION_1_ENGINEER_FEEDBACK.md
new file mode 100644
index 0000000..2d3b791
--- /dev/null
+++ b/docs/operations/ITERATION_1_ENGINEER_FEEDBACK.md
@@ -0,0 +1,41 @@
+# Iteration 1 engineer feedback
+
+PARTHA Iteration 1 applies the current product design to the existing authenticated workflow. It does not add new repository facts or product surfaces: Architecture, Dependencies, Engineering Review, Insights, Documentation, exports, and optional AI continue to consume the selected sealed Repository Intelligence snapshot.
+
+## What to test
+
+Use a repository you are authorised to inspect and complete these tasks:
+
+1. Create an account or sign in.
+2. Upload a supported archive, or import a public GitHub repository URL.
+3. Wait for analysis to complete, then move between Dashboard, Architecture, Dependency Graph, Engineering Review, Documentation, and Insights.
+4. Resize the browser to a narrow mobile viewport and confirm navigation and page controls remain usable without page-level horizontal scrolling.
+5. In Architecture, switch among Graph, Request Flow, Heatmap, and List View. Confirm graph labels remain readable and revision-manifest controls remain reachable.
+6. In Settings → AI Providers, save a provider configuration and use Test Connection. Then open AI Workspace and submit a question.
+
+AI is optional. Provider questions receive structural context from the sealed snapshot; PARTHA does not send repository source-file contents through this workflow, and provider prose has no automatic source citations.
+
+## What to report
+
+Open a GitHub issue using the appropriate template and include:
+
+- the task you were trying to complete;
+- expected and actual behaviour;
+- browser, operating system, and viewport size;
+- the affected PARTHA page;
+- a screenshot or short recording with credentials, repository secrets, email addresses, and other personal data removed;
+- whether the problem blocks the workflow or has a workaround.
+
+Do not attach private source code, provider keys, session tokens, `.env` files, or unredacted repository content.
+
+## Local verification
+
+Before proposing a frontend change, run:
+
+```bash
+npm --prefix apps/frontend run test
+npm run lint:frontend
+npm run build:frontend
+```
+
+For the full repository validation sequence, follow [CONTRIBUTING.md](../../CONTRIBUTING.md).