[codex] Improve homepage and dashboard overview - #1197
Conversation
📝 WalkthroughWalkthroughThis PR restructures the web dashboard UI by moving navigation into a sticky sidebar, replacing the multi-section collapsible dashboard with an evidence-focused overview component, and redesigning the landing page around product narrative. It consolidates scattered dashboard sections into DashboardEvidenceOverview with reusable helper functions, updates layout and styling to support the sidebar navigation model, and refactors supporting tests and documentation. ChangesDashboard Evidence Redesign with Navigation Restructuring
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Suggested reviewers
🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Storybook previews for This comment updates automatically on each PR push. |
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
Automated Checks (advisory, non-blocking)
Surmado Code Review — Free tier limit reachedYou've used all 10 free reviews this month. Deterministic checks (secrets, model strings) still ran above. Upgrade to the Paid plan for 100 reviews/month + $15 per additional 100: https://app.surmado.com/checkout?plan=pr_review_starter Or wait until your next monthly window for 10 more free reviews. Surmado Code Review (v1.2-mt) |
There was a problem hiding this comment.
Pull request overview
Redesigns the public landing experience and consolidates /dashboard into a single “evidence overview” panel, while updating the app shell to a sidebar-based layout and adding targeted UI tests/stories.
Changes:
- Makes the web dev proxy target configurable via
DOFEK_API_PROXY_TARGET. - Rebuilds the landing page content and demo preview to match the new “evidence” framing (sources, daily summary, correlation/trend panels, health monitor).
- Refactors the dashboard into
DashboardEvidenceOverview, updatesPageLayout/AppHeaderto an “evidence desk” sidebar shell, and adds Storybook + tests.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/web/vite.config.ts | Adds configurable proxy target for dev server routes. |
| packages/web/src/pages/LandingPage.tsx | Reworks landing page layout/content and demo preview to match dashboard overview. |
| packages/web/src/pages/LandingPage.test.tsx | Updates assertions to align with new landing copy and structure. |
| packages/web/src/pages/Dashboard.tsx | Simplifies /dashboard into a single evidence overview composition. |
| packages/web/src/pages/Dashboard.test.ts | Removes tests for deleted section-layout system; keeps helper tests. |
| packages/web/src/index.css | Tweaks card radius and adds .dashboard-hero styling used by overview panels. |
| packages/web/src/components/PageLayout.tsx | Converts layout to sidebar shell + content toolbar (header controls moved into main area). |
| packages/web/src/components/PageLayout.test.tsx | Adds coverage for new shell structure and “render once” header controls behavior. |
| packages/web/src/components/DashboardEvidenceOverview.tsx | Introduces the unified dashboard evidence overview component + helpers. |
| packages/web/src/components/DashboardEvidenceOverview.test.tsx | Adds helper tests and a rendering/ordering smoke test for the new overview. |
| packages/web/src/components/DashboardEvidenceOverview.stories.tsx | Adds Storybook story for the new overview component. |
| packages/web/src/components/DailyOverview.tsx | Adds embedded mode and updates markup/styling for dashboard embedding. |
| packages/web/src/components/DailyOverview.test.tsx | Adds tests for new embedded behavior and evidence-desk styling. |
| packages/web/src/components/AppHeader.tsx | Replaces top header with mobile header + desktop sidebar navigation. |
| packages/web/src/components/AppHeader.test.tsx | Adds tests for sidebar/mobile header rendering. |
| packages/web/src/components/AppHeader.stories.tsx | Adds Storybook stories for the new header layout with router context. |
| docs/roadmap.md | Adds product roadmap notes (esp. getting-started flow). |
| docs/README.md | Links the new roadmap doc in docs index/table. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Actionable comments posted: 10
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/web/src/pages/LandingPage.tsx (1)
111-115:⚠️ Potential issue | 🟠 Major | ⚡ Quick winHandle query loading/error explicitly instead of collapsing to empty data.
Line 114 uses
usableProviders.data ?? [], which turns fetch failures into a false “no supported sources” empty state. Split loading/error/empty states in the page and only renderLandingPageViewwith resolved data.Suggested fix
import { activityMetricColors } from "`@dofek/scoring/colors`"; import { Link } from "`@tanstack/react-router`"; +import { QueryStatePanel } from "../components/QueryStatePanel.tsx"; import { trpc } from "../lib/trpc.ts"; export function LandingPage() { const usableProviders = trpc.sync.usableProviders.useQuery(); - return <LandingPageView usableProviders={usableProviders.data ?? []} />; + if (usableProviders.isLoading) { + return <QueryStatePanel state="loading" title="Loading supported sources" />; + } + + if (usableProviders.error) { + return ( + <QueryStatePanel + state="error" + title="Unable to load supported sources" + message={usableProviders.error.message} + /> + ); + } + + return <LandingPageView usableProviders={usableProviders.data} />; }As per coding guidelines:
packages/web/src/pages/**/*.{ts,tsx}— “Treat loading, error, and empty as separate UI states. Do not usequery.data ?? []or similar fallbacks whenquery.errorexists. Usesrc/components/QueryStatePanel.tsxfor explicit error/empty/loading states on pages and sections”.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/web/src/pages/LandingPage.tsx` around lines 111 - 115, The page currently collapses loading/error into an empty list by passing usableProviders.data ?? [] to LandingPageView; update LandingPage to branch on usableProviders.isLoading, usableProviders.isError, and resolved usableProviders.data: render the app's QueryStatePanel (src/components/QueryStatePanel.tsx) for loading and error states (passing usableProviders.error) and render an empty-state via QueryStatePanel if data is an empty array; only call <LandingPageView usableProviders={...}> with the actual resolved data when !isLoading && !isError. Ensure you reference the trpc hook usableProviders and the LandingPageView component when making the conditional rendering changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/components/AppHeader.stories.tsx`:
- Around line 49-62: Add two new stories to AppHeader.stories.tsx: a Loading
story and an Empty/NoData story while keeping existing Default and
WithHeaderAction variants. Implement Loading by exporting Loading: Story = {
args: { /* set the component's loading prop to true (e.g., loading: true) and
minimal children if required */ } } and implement Empty/NoData by exporting
Empty: Story = { args: { /* provide props that represent no data (e.g., users:
[], items: [], title: '', or an explicit empty flag) so the header renders the
empty state */ } }. Ensure story names match the pattern (Loading and Empty) and
reuse the same types/imports as Default and WithHeaderAction so the file exports
Default, WithHeaderAction, Loading, and Empty for AppHeader.
In `@packages/web/src/components/AppHeader.tsx`:
- Around line 43-48: The mobile menu toggle button in AppHeader.tsx currently
toggles via setMenuOpen but does not expose its state or the controlled element
to assistive tech; update the button element (the onClick using setMenuOpen) to
include aria-expanded={menuOpen} and aria-controls="mobile-navigation" (or
another stable id) and add that same id ("mobile-navigation") to the <nav>
element rendered later (the nav that wraps the mobile menu at/around Line 81) so
screen readers know the expanded/collapsed state and target; ensure the id is
unique in the component and keep the boolean state variable name menuOpen (or
the existing state) in the aria-expanded binding.
In `@packages/web/src/components/DailyOverview.test.tsx`:
- Around line 145-147: The test in DailyOverview.test.tsx uses a brittle string
match for the "card" class on the DOM element referenced by panel; replace that
assertion to use the DOMTokenList API so it's deterministic — locate the
assertions around the panel variable in the test (the expect lines that inspect
panel.className) and change the negative " card " substring check to an
assertion that panel.classList.contains("card") is false (e.g.,
expect(panel.classList.contains("card")).toBe(false)), leaving the other class
assertions intact.
In `@packages/web/src/components/DashboardEvidenceOverview.stories.tsx`:
- Around line 4-90: Add two new Story exports in this stories file: Loading and
Empty. For Loading, export a Story named Loading (same Story type) that uses the
meta and sets args to simulate the loading state (e.g., include a loading: true
prop or remove data props like trend/topInsight/dailySummary and pass minimal
placeholders so the component renders its skeleton). For Empty, export a Story
named Empty that supplies args representing no-data (e.g., sources: [],
dailySummary: null/undefined, healthMonitor: null/undefined, topInsight:
null/undefined, trend: undefined) so the component shows its empty/no-data UI.
Ensure both exports follow the same pattern as Default and are added alongside
meta and Default in this file.
In `@packages/web/src/components/DashboardEvidenceOverview.tsx`:
- Around line 76-80: In DashboardEvidenceOverview, replace hardcoded unit
strings (e.g., the "days" label and any other hardcoded units like "day" or
"bpm") with formatting from the useUnits hook: import and call useUnits() inside
the DashboardEvidenceOverview component and use its formatting helpers to render
the days label (instead of "{days} days") and to update formatDashboardRange
usage if it currently emits hardcoded units; also update the other occurrences
called out (around the references to lines 101 and 116–117) to use the same
useUnits helpers so all user-facing units are produced via useUnits rather than
literal strings.
- Around line 95-99: DashboardEvidenceOverview currently hardcodes hex color
values in multiple JSX elements (e.g., the correlation value paragraph and the
correlationStrengthLabel output around the correlationValue and effectSize
usage) and in SVG/bar elements; replace those raw hex strings with existing
Tailwind utility classes or semantic theme tokens (e.g., use text-*, bg-*,
stroke-* classes or project theme tokens) so styles respond to dark mode and
theme updates. Locate the JSX elements inside the DashboardEvidenceOverview
component (where correlationValue is rendered, where
correlationStrengthLabel(effectSize) is used, and the SVG/bar elements rendering
strength bars) and swap hex literals for the appropriate Tailwind utilities or
theme token references consistent with the rest of the codebase. Ensure
accessibility and visual parity by testing in both light and dark themes after
change.
In `@packages/web/src/pages/Dashboard.tsx`:
- Around line 175-182: topInsight currently collapses the error/loading path by
using insightsQuery.data ?? [], which hides errors; change the logic so useMemo
reads insightsQuery.data without defaulting to [] and returns undefined when
insightsQuery.isLoading or insightsQuery.error is present, then update the
Dashboard render to show the section’s QueryStatePanel
(src/components/QueryStatePanel.tsx) for loading/error/empty states instead of
relying on an empty array fallback; reference the topInsight selector and
insightsQuery (the same useMemo and query) so the UI explicitly handles
insightsQuery.isLoading, insightsQuery.error, and the empty-data case.
- Around line 177-181: The current code mutates cached query data by calling
.sort on allInsights (from insightsQuery.data), so change the ranking to sort a
shallow copy instead (e.g., use [...allInsights] or Array.from(allInsights])
before .filter and .sort) and then return the first element of that sorted copy;
ensure you reference allInsights/insightsQuery.data and avoid in-place mutation
when computing the top insight.
In `@packages/web/src/pages/LandingPage.tsx`:
- Around line 359-363: The user-facing metric labels in LandingPage.tsx use
unexplained acronyms (e.g., "bpm", "SpO2", "kcal", "C"); update the JSX text
where those strings appear (e.g., the small label divs under the metric values
and any related elements referencing activityMetricColors) to use expanded,
layman-friendly phrasing such as "beats per minute (bpm)", "blood oxygen
(SpO2)", "kilocalories (kcal)", and "°C (Celsius)" and/or add an accessible
tooltip/title or <abbr> wrapper so screen readers and hover users see the full
term.
In `@packages/web/vite.config.ts`:
- Line 41: The review flags that the new env var DOFEK_API_PROXY_TARGET (used to
set apiProxyTarget) must be verified in Infisical before merging; update the PR
description/checklist to show evidence that DOFEK_API_PROXY_TARGET exists in the
relevant Infisical environments (e.g., dev/staging/production) by adding
screenshots or links, the environment names, and who added/confirmed them, and
confirm in the checklist that the default fallback ("http://localhost:3000") is
acceptable if the secret is missing.
---
Outside diff comments:
In `@packages/web/src/pages/LandingPage.tsx`:
- Around line 111-115: The page currently collapses loading/error into an empty
list by passing usableProviders.data ?? [] to LandingPageView; update
LandingPage to branch on usableProviders.isLoading, usableProviders.isError, and
resolved usableProviders.data: render the app's QueryStatePanel
(src/components/QueryStatePanel.tsx) for loading and error states (passing
usableProviders.error) and render an empty-state via QueryStatePanel if data is
an empty array; only call <LandingPageView usableProviders={...}> with the
actual resolved data when !isLoading && !isError. Ensure you reference the trpc
hook usableProviders and the LandingPageView component when making the
conditional rendering changes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 4ca66e56-3f82-47cd-9e68-1b6d7eaee49d
📒 Files selected for processing (18)
docs/README.mddocs/roadmap.mdpackages/web/src/components/AppHeader.stories.tsxpackages/web/src/components/AppHeader.test.tsxpackages/web/src/components/AppHeader.tsxpackages/web/src/components/DailyOverview.test.tsxpackages/web/src/components/DailyOverview.tsxpackages/web/src/components/DashboardEvidenceOverview.stories.tsxpackages/web/src/components/DashboardEvidenceOverview.test.tsxpackages/web/src/components/DashboardEvidenceOverview.tsxpackages/web/src/components/PageLayout.test.tsxpackages/web/src/components/PageLayout.tsxpackages/web/src/index.csspackages/web/src/pages/Dashboard.test.tspackages/web/src/pages/Dashboard.tsxpackages/web/src/pages/LandingPage.test.tsxpackages/web/src/pages/LandingPage.tsxpackages/web/vite.config.ts
💤 Files with no reviewable changes (1)
- packages/web/src/pages/Dashboard.test.ts
There was a problem hiding this comment.
0 issues found across 2 files (changes from recent commits).
Requires human review: This PR is a major refactor of the dashboard and landing page, replacing the entire dashboard UI with a new evidence overview, removing multiple existing components (e.g., NutritionChart), and restructuring the app shell layout, which carries high risk of breaking core user-facing functionality and
Re-trigger cubic
There was a problem hiding this comment.
2 issues found across 18 files
Confidence score: 3/5
- There is a concrete user-impact risk in
packages/web/src/pages/Dashboard.tsx: usinginsightsQuery.data ?? []can mask query failures, so users may see an empty/placeholder state instead of an error state, which conflicts with the query-state handling guideline. packages/web/src/components/DashboardEvidenceOverview.tsxcomputesstrengthfrom index (92 - index * 7) rather than real source data, which can misrepresent evidence quality on the live dashboard.- Given both findings are medium severity (6/10) with high confidence (8/10) and affect real dashboard behavior, this carries some merge risk and is worth addressing before release.
- Pay close attention to
packages/web/src/pages/Dashboard.tsxandpackages/web/src/components/DashboardEvidenceOverview.tsx- query errors are being hidden and displayed strength values may be inaccurate.
Tip: cubic can generate docs of your entire codebase and keep them up to date. Try it here.
Fix all with cubic | Re-trigger cubic
|
Review app deployment was skipped for PR #1197. Hetzner could not allocate the configured review app server type in the configured location. This is provider capacity/placement availability, not a code failure in this PR. |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
packages/web/src/components/AppHeader.stories.tsx (1)
1-1:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winFix missing dependencies flagged by pipeline.
The pipeline reports that
@storybook/react-viteandreactare used but not listed inpackage.json. Add both to your dependencies manifest.Per the guideline: "When a required precondition is missing (env file, config, dependency), fail immediately with a clear error — never log a warning and silently continue with broken state."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/web/src/components/AppHeader.stories.tsx` at line 1, The build fails because imports in AppHeader.stories.tsx reference packages not listed in package.json; add "`@storybook/react-vite`" and "react" to the project's package.json (appropriate dependencies or devDependencies as per your repo policy) and run the package manager install so the imports (e.g., the import line in AppHeader.stories.tsx) resolve; ensure package.json versions match the repo's Storybook/React versions and commit the updated manifest.packages/web/src/index.css (1)
35-40: 🧹 Nitpick | 🔵 Trivial | 💤 Low valueConsider aligning border-radius across card-like components.
The
.cardutility now uses0.5rem, but.query-state-paneland.query-error-panel(lines 199, 212) still use0.75rem. If these panels are conceptually card variants, unifying the border-radius would improve visual consistency.♻️ Optional alignment
.query-state-panel, .query-error-panel { display: flex; align-items: center; justify-content: center; - border-radius: 0.75rem; + border-radius: 0.5rem; padding: 1.25rem 1rem;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/web/src/index.css` around lines 35 - 40, The border-radius for the card-like components is inconsistent: the `@utility` card uses border-radius: 0.5rem while .query-state-panel and .query-error-panel use 0.75rem; update the border-radius on .query-state-panel and .query-error-panel to match `@utility` card (use 0.5rem) so all card variants share the same radius, or alternatively change `@utility` card to 0.75rem if you prefer that radius—ensure the final value is applied consistently across `@utility` card, .query-state-panel, and .query-error-panel.packages/web/src/pages/LandingPage.tsx (1)
119-119: 🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick winRemove the
Viewsuffix from component name.
LandingPageViewviolates the naming guideline. Rename to a domain-specific name likeLandingPageContent,LandingPageRoot, orLandingPageBody.As per coding guidelines: "Do not name React components with a
Viewsuffix; use domain-specific names such asContent,Panel,Body,Card, or the concrete concept the component renders"📝 Suggested rename
-export function LandingPageView({ usableProviders }: { usableProviders: LandingPageProvider[] }) { +export function LandingPageContent({ usableProviders }: { usableProviders: LandingPageProvider[] }) {And update the usage in LandingPage:
export function LandingPage() { const usableProviders = trpc.sync.usableProviders.useQuery(); - return <LandingPageView usableProviders={usableProviders.data ?? []} />; + return <LandingPageContent usableProviders={usableProviders.data ?? []} />; }Also update the test imports and usage.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/web/src/pages/LandingPage.tsx` at line 119, Rename the React component exported as LandingPageView to a domain-specific name (e.g., LandingPageContent or LandingPageRoot) across the codebase: update the function declaration/export in the file containing LandingPageView, replace all imports/usages in LandingPage (the parent that renders it) and any tests that import LandingPageView to the new name, and ensure any type annotations (usableProviders: LandingPageProvider[]) remain identical; run the test suite/TS compiler to catch remaining references and fix any lingering import paths or named-export mismatches.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/web/src/pages/Dashboard.tsx`:
- Around line 198-200: The insightError prop currently only surfaces
insightsQuery.error; update the Dashboard rendering around insightsQuery to
treat loading, error, and empty as distinct states by using QueryStatePanel for
each: show QueryStatePanel with isLoading while insightsQuery.isLoading, show
QueryStatePanel with error when insightsQuery.error exists, and show an explicit
empty QueryStatePanel when insightsQuery.data is present but empty instead of
falling back to correlation content; locate usages of insightsQuery and the
insightError prop in the Dashboard component and replace the single error-only
branch with explicit checks for insightsQuery.isLoading, insightsQuery.error,
and empty data to pass the appropriate QueryStatePanel instance into
insightError.
In `@packages/web/src/pages/LandingPage.tsx`:
- Line 354: Replace the three hardcoded unit strings in LandingPage.tsx
("beats/min average", "calories", "Celsius") with the app's unit formatter from
the useUnits hook: import and call useUnits() at the top of the component (e.g.,
const { formatUnit } = useUnits() or the hook's provided formatter) and replace
the inline strings in the JSX (the element rendering "beats/min average" and the
two elements rendering "calories" and "Celsius") with calls to the hook (e.g.,
{formatUnit('beats/min average')}, {formatUnit('calories')},
{formatUnit('Celsius')}) so units go through the UnitProvider/i18n pipeline.
---
Outside diff comments:
In `@packages/web/src/components/AppHeader.stories.tsx`:
- Line 1: The build fails because imports in AppHeader.stories.tsx reference
packages not listed in package.json; add "`@storybook/react-vite`" and "react" to
the project's package.json (appropriate dependencies or devDependencies as per
your repo policy) and run the package manager install so the imports (e.g., the
import line in AppHeader.stories.tsx) resolve; ensure package.json versions
match the repo's Storybook/React versions and commit the updated manifest.
In `@packages/web/src/index.css`:
- Around line 35-40: The border-radius for the card-like components is
inconsistent: the `@utility` card uses border-radius: 0.5rem while
.query-state-panel and .query-error-panel use 0.75rem; update the border-radius
on .query-state-panel and .query-error-panel to match `@utility` card (use 0.5rem)
so all card variants share the same radius, or alternatively change `@utility`
card to 0.75rem if you prefer that radius—ensure the final value is applied
consistently across `@utility` card, .query-state-panel, and .query-error-panel.
In `@packages/web/src/pages/LandingPage.tsx`:
- Line 119: Rename the React component exported as LandingPageView to a
domain-specific name (e.g., LandingPageContent or LandingPageRoot) across the
codebase: update the function declaration/export in the file containing
LandingPageView, replace all imports/usages in LandingPage (the parent that
renders it) and any tests that import LandingPageView to the new name, and
ensure any type annotations (usableProviders: LandingPageProvider[]) remain
identical; run the test suite/TS compiler to catch remaining references and fix
any lingering import paths or named-export mismatches.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 008aec5e-f5e4-42d2-afb2-854f4cd30e82
📒 Files selected for processing (13)
.codex/config.tomlpackages/web/src/components/AppHeader.stories.tsxpackages/web/src/components/AppHeader.test.tsxpackages/web/src/components/AppHeader.tsxpackages/web/src/components/DailyOverview.test.tsxpackages/web/src/components/DashboardEvidenceOverview.stories.tsxpackages/web/src/components/DashboardEvidenceOverview.test.tsxpackages/web/src/components/DashboardEvidenceOverview.tsxpackages/web/src/components/NutritionChart.tsxpackages/web/src/index.csspackages/web/src/pages/Dashboard.tsxpackages/web/src/pages/LandingPage.test.tsxpackages/web/src/pages/LandingPage.tsx
💤 Files with no reviewable changes (2)
- packages/web/src/components/NutritionChart.tsx
- .codex/config.toml
Summary
Redesigns the homepage around a truthful product mock that matches the live overview panel.
Reworks the app shell and dashboard so
/dashboardis a single evidence overview with daily rings, evidence cards, and Health Monitor.Adds focused tests and Storybook stories for the new header, daily summary embedding, and dashboard evidence overview.
Adds roadmap documentation for a future getting-started flow and makes the web dev proxy target configurable.
Validation
Summary by cubic
Redesigned the homepage and
/dashboardaround a focused evidence overview with a new “evidence desk” sidebar shell. The landing page mirrors the live overview with simpler copy, inclusive date ranges, and a clear mobile app path.New Features
/dashboardwithDashboardEvidenceOverview(daily rings, evidence cards, Health Monitor) plus plain trend/correlation labels and an inclusive date range.AppHeader(nav label now “Overview”) and updatedPageLayout;DailyOverviewaddsembeddedmode, hero styling, and ARIA “Daily health summary”.Migration
DOFEK_API_PROXY_TARGETforpackages/webdev proxy if your API is not onhttp://localhost:3000.Written for commit 8141507. Summary will update on new commits.
Review in cubic
Summary by CodeRabbit
Release Notes
New Features
Documentation
Refactors