diff options
| author | Tyler Hoang <tyler@tylerhoang.xyz> | 2026-05-19 00:45:57 -0700 |
|---|---|---|
| committer | Tyler Hoang <tyler@tylerhoang.xyz> | 2026-05-19 00:45:57 -0700 |
| commit | 5fd350345a6f6caceb3375d3736a9a9ef7291257 (patch) | |
| tree | 6a46f7a35d1223c180b7d801859babfa182e413d /frontend/app | |
| parent | 927a77d68b138778690d380fe7931cc37ce06c9e (diff) | |
feat: add PriceVsValueCard to overview left column (DCF compass)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'frontend/app')
| -rw-r--r-- | frontend/app/page.tsx | 6 | ||||
| -rw-r--r-- | frontend/app/prism-shell.css | 69 |
2 files changed, 75 insertions, 0 deletions
diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 07bdfa4..5c14488 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -11,6 +11,7 @@ import { KPIStrip } from "@/components/prism/KPIStrip"; import { Sidebar } from "@/components/prism/Sidebar"; import { TickerHeader } from "@/components/prism/TickerHeader"; import { TopBar } from "@/components/prism/TopBar"; +import { PriceVsValueCard } from "@/components/prism/PriceVsValueCard"; import { QualityCard } from "@/components/prism/QualityCard"; import { ValuationOverviewCard } from "@/components/prism/ValuationOverviewCard"; import { VolumeCard } from "@/components/prism/VolumeCard"; @@ -76,6 +77,8 @@ function OverviewClient() { setOverviewError(null); setChartError(null); setWatchlistError(null); + setValuation(null); + setValState("idle"); setOverviewState("loading"); setChartState("loading"); @@ -107,6 +110,8 @@ function OverviewClient() { setOverviewError(null); setChartError(null); setWatchlistError(null); + setValuation(null); + setValState("idle"); setOverviewState("idle"); setChartState("idle"); startTransition(() => { @@ -345,6 +350,7 @@ function OverviewClient() { <ChartCard symbol={overview.profile.symbol} period={period} points={history} chartState={chartState} chartError={chartError} onChangePeriod={setPeriod} /> <VolumeCard overview={overview} /> <SignalCard overview={overview} /> + <PriceVsValueCard overview={overview} valuation={valuation} valState={valState} /> </div> <div className="psm-column"> <ProfileCard overview={overview} /> diff --git a/frontend/app/prism-shell.css b/frontend/app/prism-shell.css index 56ca536..9bcbdc5 100644 --- a/frontend/app/prism-shell.css +++ b/frontend/app/prism-shell.css @@ -1888,3 +1888,72 @@ border-top: 1px solid var(--line-1); margin: var(--sp-4) 0 var(--sp-3); } + +/* ── Price vs Value card ────────────────────────── */ + +.psm-pvv-figures { + display: flex; + align-items: baseline; + gap: var(--sp-4); + margin-bottom: var(--sp-4); +} + +.psm-pvv-current { + color: var(--fg-1); + font-family: var(--font-mono); + font-size: var(--fs-24); + font-variant-numeric: tabular-nums; +} + +.psm-pvv-iv { + font-family: var(--font-mono); + font-size: var(--fs-14); + font-variant-numeric: tabular-nums; +} + +.psm-pvv-rail { + position: relative; + height: 4px; + border-radius: var(--r-full); + background: var(--ink-3); + margin-bottom: var(--sp-2); +} + +.psm-pvv-fill { + position: absolute; + top: 0; + height: 100%; + border-radius: var(--r-full); +} + +.psm-pvv-tick { + position: absolute; + top: -4px; + width: 2px; + height: 12px; + border-radius: 1px; +} + +.psm-pvv-tick.price { + background: var(--fg-1); +} + +.psm-pvv-tick.iv { + background: var(--fg-4); +} + +.psm-pvv-rail-labels { + display: flex; + justify-content: space-between; + color: var(--fg-4); + font-family: var(--font-mono); + font-size: var(--fs-12); + font-variant-numeric: tabular-nums; + margin-bottom: var(--sp-3); +} + +.psm-pvv-meta { + color: var(--fg-4); + font-size: var(--fs-12); + line-height: 1.5; +} |
