summaryrefslogtreecommitdiff
path: root/frontend/components/prism/TickerHeader.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/components/prism/TickerHeader.tsx')
-rw-r--r--frontend/components/prism/TickerHeader.tsx51
1 files changed, 51 insertions, 0 deletions
diff --git a/frontend/components/prism/TickerHeader.tsx b/frontend/components/prism/TickerHeader.tsx
new file mode 100644
index 0000000..23254f8
--- /dev/null
+++ b/frontend/components/prism/TickerHeader.tsx
@@ -0,0 +1,51 @@
+import { deltaClass, fmtCurrency, fmtPct } from "@/lib/format";
+import { buildIdentityLine, rangePercent } from "@/lib/overview";
+import type { TickerOverview } from "@/types/api";
+
+type Props = {
+ overview: TickerOverview;
+ onToggleWatchlist: () => void;
+ isSaved: boolean;
+};
+
+export function TickerHeader({ overview, onToggleWatchlist, isSaved }: Props) {
+ const pct = rangePercent(overview);
+
+ return (
+ <header className="psm-ticker-head">
+ <div className="psm-header-left">
+ <span className="psm-identity-line psm-eyebrow">{overview.profile.symbol}</span>
+ <div className="psm-heading-row">
+ <span className="psm-symbol">{overview.profile.symbol}</span>
+ <span className="psm-company-name">{overview.profile.name || "Name unavailable"}</span>
+ {overview.meta.is_partial ? <span className="psm-partial-chip">Partial Data</span> : null}
+ </div>
+ <p className="psm-subline">{buildIdentityLine(overview)}</p>
+ </div>
+
+ <div className="psm-range">
+ <div className="psm-eyebrow">52 Week Range</div>
+ <div className="psm-range-values">
+ <span>{fmtCurrency(overview.range_52w.low)}</span>
+ <span>{fmtCurrency(overview.range_52w.price ?? overview.quote.price)}</span>
+ <span>{fmtCurrency(overview.range_52w.high)}</span>
+ </div>
+ <div className="psm-range-rail" aria-hidden>
+ {pct != null ? <span className="psm-range-indicator" style={{ left: `${pct}%` }} /> : null}
+ </div>
+ </div>
+
+ <div className="psm-price-stack">
+ <span className="psm-price">{fmtCurrency(overview.quote.price)}</span>
+ <span className={`psm-change ${deltaClass(overview.quote.change_pct)}`}>
+ {fmtCurrency(overview.quote.change)} ยท {fmtPct(overview.quote.change_pct, 2, true)}
+ </span>
+ <span className="psm-quote-line">Prev close {fmtCurrency(overview.quote.prev_close)}</span>
+ <button type="button" className={`psm-primary-action${isSaved ? " subtle" : ""}`} onClick={onToggleWatchlist}>
+ {isSaved ? "Remove From Watchlist" : "Save To Watchlist"}
+ </button>
+ </div>
+ </header>
+ );
+}
+