summaryrefslogtreecommitdiff
path: root/frontend/app
diff options
context:
space:
mode:
authorTyler Hoang <tyler@tylerhoang.xyz>2026-05-19 00:45:57 -0700
committerTyler Hoang <tyler@tylerhoang.xyz>2026-05-19 00:45:57 -0700
commit5fd350345a6f6caceb3375d3736a9a9ef7291257 (patch)
tree6a46f7a35d1223c180b7d801859babfa182e413d /frontend/app
parent927a77d68b138778690d380fe7931cc37ce06c9e (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.tsx6
-rw-r--r--frontend/app/prism-shell.css69
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;
+}