blob: ef86e9bad99e715bb91fe04418c34542eca6d4bc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
"use client";
import { fmtCurrency, fmtPct } from "@/lib/format";
import type { SensitivityMatrix } from "@/types/api";
type Props = {
matrix: SensitivityMatrix;
centerWacc?: number;
centerTerminalGrowth?: number;
currency: string;
};
export function SensitivityTable({ matrix, centerWacc, centerTerminalGrowth, currency }: Props) {
const { wacc, terminal_growth, implied_prices } = matrix;
const centerRow =
centerWacc != null ? wacc.findIndex((v) => Math.abs(v - centerWacc) < 1e-9) : -1;
const centerCol =
centerTerminalGrowth != null
? terminal_growth.findIndex((v) => Math.abs(v - centerTerminalGrowth) < 1e-9)
: -1;
return (
<div className="psm-val-sensitivity">
<div className="psm-val-sensitivity-head">
<span className="psm-val-sensitivity-title">Implied Price Sensitivity</span>
<span className="psm-val-sensitivity-subtitle">WACC × Terminal Growth</span>
</div>
<table className="psm-val-sensitivity-table">
<thead>
<tr>
<th className="psm-val-sensitivity-corner">WACC \ g</th>
{terminal_growth.map((g, i) => (
<th
key={i}
className={`psm-val-sensitivity-col-header${
i === centerCol ? " is-center" : ""
}`}
>
{fmtPct(g)}
</th>
))}
</tr>
</thead>
<tbody>
{wacc.map((w, rowIdx) => (
<tr key={rowIdx}>
<th
className={`psm-val-sensitivity-row-header${
rowIdx === centerRow ? " is-center" : ""
}`}
>
{fmtPct(w)}
</th>
{implied_prices[rowIdx]?.map((price, colIdx) => {
const isCenter = rowIdx === centerRow && colIdx === centerCol;
const isNegative = price != null && price < 0;
return (
<td
key={colIdx}
className={`psm-val-sensitivity-cell${isCenter ? " is-center" : ""}${isNegative ? " negative" : ""}`}
>
{price != null && !isNegative ? fmtCurrency(price, 2, currency) : "—"}
</td>
);
})}
</tr>
))}
</tbody>
</table>
</div>
);
}
|