Skip to content

Commit f2ddc5b

Browse files
fix(story): refine evidence panels and copy
1 parent 1e887a7 commit f2ddc5b

7 files changed

Lines changed: 120 additions & 33 deletions

File tree

index.html

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ <h1>
3535
<section class="findings-panel" aria-labelledby="findings-title">
3636
<div class="section-kicker">
3737
<p class="eyebrow">Key findings</p>
38-
<h2 id="findings-title">Europe grew. Markets repriced the world elsewhere.</h2>
38+
<h2 id="findings-title">Europe grew. Public equity gains concentrated in the US.</h2>
3939
</div>
4040
<div class="finding-grid">
4141
<article class="finding-card">
@@ -92,10 +92,11 @@ <h2>Europe did not stop growing.</h2>
9292
<h2>The benchmark is not arbitrary.</h2>
9393
<p>
9494
The United States and Europe are both high-income, institutionally
95-
mature markets that matter in global portfolios. Comparing them
96-
lets us separate a real-economy question from a listed-market
97-
question: did people get poorer, or did public equity value
98-
compound somewhere else?
95+
mature markets that matter in global portfolios. From here on,
96+
we keep the comparison anchored on these rich-market blocs so
97+
later gaps are not driven by emerging-market catch-up. The
98+
question is whether output growth diverged, or whether listed
99+
equity gains accumulated much more strongly in the US.
99100
</p>
100101
<div class="story-stat-row">
101102
<span><strong>Rich-market</strong> baseline</span>
@@ -145,25 +146,25 @@ <h2>Europe is not one datapoint.</h2>
145146
<span><strong>1.52x</strong> US ETF</span>
146147
<span><strong>Switzerland</strong> main exception</span>
147148
</div>
148-
<p class="story-analysis-note">
149-
Read: Europe is heterogeneous, but no selected European country
150-
carries the market story the way the US does. The gap is not only
151-
a single weak country dragging down the average.
152-
</p>
153149
<button class="story-preset-button" type="button" data-story-action="europe-dispersion">
154150
Show Europe spread
155151
</button>
156152
</article>
157153

158154
<article class="story-step" data-story-preset="sector-drivers">
159155
<p class="eyebrow">Act 5 &middot; Industry drivers</p>
160-
<h2>The winning sectors sit elsewhere.</h2>
156+
<h2>The sectors driving divergence.</h2>
161157
<p>
162158
The ACWI snapshots translate the country story into sector
163159
exposure. From 2015 to 2026, global index weight becomes more
164160
concentrated in the United States, and information technology
165161
becomes the dominant sector block.
166162
</p>
163+
<p>
164+
The US begins with a strong weight for tech, and as the sector
165+
inflates in value over the decade outpacing all others, the US
166+
share of the ACWI outpaces the rest of the world.
167+
</p>
167168
<div class="story-stat-row">
168169
<span><strong>63.7%</strong> US ACWI weight</span>
169170
<span><strong>30.7%</strong> information technology</span>
@@ -195,15 +196,29 @@ <h2>Europe is not collapsing. Listed-market power moved elsewhere.</h2>
195196
<div class="story-verdict-panel" aria-label="Conclusion verdict">
196197
<strong>Final read</strong>
197198
<p>
198-
The evidence does not support a simple European collapse story.
199-
It supports a more specific claim: Europe kept growing, but the
200-
investable market story shifted toward the US, especially through
201-
listed equity concentration and technology-heavy sectors.
199+
The evidence does not support a simple European collapse
200+
story. It supports a more specific claim: Europe continued to
201+
grow, but was outpaced in capital markets, especially through
202+
listed equity concentration in the US and in technology-heavy
203+
sectors. The divergence is much sharper in market proxies than
204+
in real output, and the gap opens around the 2008 crisis
205+
window.
206+
<!-- Europe kept growing, but the
207+
market values shifted toward the US, especially through
208+
listed equity concentration and technology-heavy sectors. -->
202209
</p>
203210
<p>
204211
The limitation is equally important: these charts measure output
205212
and listed capital, not the full well-being of households.
206213
</p>
214+
<p>
215+
It leads to a final question: do market gains and indicators
216+
really represent lived well-being trends? The data
217+
demonstrates a divergence in perceived market values, but the
218+
divergence is much smaller in real output terms. This
219+
necessitates a deeper future focus on how and whether market
220+
trends translate to broader economic welfare.
221+
</p>
207222
</div>
208223
<button class="story-preset-button" type="button" data-story-action="wrap-up">
209224
Show final comparison
@@ -295,17 +310,16 @@ <h2>Profile comparison</h2>
295310
<p class="eyebrow">2008 break</p>
296311
<h2>The break-year test points to the crisis window.</h2>
297312
<p>
298-
This is the Act 3 evidence: candidate break years cluster around
299-
the crisis window, and the interactive normalization explorer
300-
lets you test whether the split depends on the base year or lens.
313+
The break-year finder and normalization explorer let you inspect
314+
when the split appears and how much it depends on the base year,
315+
metric, and price adjustment.
301316
</p>
302317
</div>
303318
<section class="story-break-subpanel" aria-label="Interactive normalization explorer">
304319
<h3>Interactive divergence explorer</h3>
305320
<p>
306321
Choose the base year and switch between GDP lenses, ETF, and
307-
market-cap proxies. This is the original interactive divergence
308-
plot, restored inside the divergence act.
322+
market-cap proxies.
309323
</p>
310324
<div id="normalization-explorer" class="normalization-explorer"></div>
311325
</section>

src/main.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ async function main() {
123123
);
124124
}
125125
createNormalizationExplorer(getRequiredElement("normalization-explorer"), data);
126+
const storyPlotEvidenceCallout = getRequiredElement("story-evidence-callout-inline");
126127
/*
127128
* Previous candidate analysis views are commented out in index.html and kept
128129
* here for easy restoration if the team wants a longer appendix after the
@@ -301,7 +302,12 @@ async function main() {
301302
selectedRegions = getValidRegions(preset.selectedRegions, DEFAULT_REGIONS);
302303
setTreemapSnapshot(preset.treemapSnapshot);
303304
setVisibleStageSteps(storyStage, preset.stageSteps);
304-
renderStoryEvidenceCallout(storyEvidenceCallout, preset.callout);
305+
renderStoryEvidenceCallouts(
306+
storyEvidenceCallout,
307+
storyPlotEvidenceCallout,
308+
preset.callout,
309+
preset.calloutPlacement,
310+
);
305311
render();
306312
setStageFocus(storyStage, treemapPanel, preset.stageFocus);
307313
}
@@ -525,6 +531,36 @@ function renderStoryEvidenceCallout(container, callout) {
525531
content.append(statList);
526532
}
527533

534+
/**
535+
* Routes the story evidence callout to either the map overlay or an inline slot.
536+
*
537+
* @param {HTMLElement} overlayContainer Overlay callout host.
538+
* @param {HTMLElement} secondaryContainer Secondary callout host.
539+
* @param {{ label: string, title: string, body: string, stats?: string[] } | undefined} callout Story callout copy.
540+
* @param {"overlay" | "inline" | undefined} [placement] Preferred callout placement.
541+
*/
542+
function renderStoryEvidenceCallouts(
543+
overlayContainer,
544+
secondaryContainer,
545+
callout,
546+
placement = "overlay",
547+
) {
548+
const useSecondary = placement === "inline";
549+
resetStoryEvidenceCallout(useSecondary ? overlayContainer : secondaryContainer);
550+
renderStoryEvidenceCallout(useSecondary ? secondaryContainer : overlayContainer, callout);
551+
}
552+
553+
/**
554+
* Hides and clears a story evidence callout host.
555+
*
556+
* @param {HTMLElement} container Callout container.
557+
*/
558+
function resetStoryEvidenceCallout(container) {
559+
container.replaceChildren();
560+
container.hidden = true;
561+
container.removeAttribute("tabindex");
562+
}
563+
528564
/**
529565
* Toggles spider overlay visibility.
530566
*

src/normalization-explorer.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ export function createNormalizationExplorer(container, data) {
6767
</label>
6868
<div class="normalization-explorer__series" id="normalization-series"></div>
6969
</div>
70-
<div class="analysis-chart normalization-explorer__chart" id="normalization-chart"></div>
70+
<div class="normalization-explorer__chart-shell">
71+
<div class="analysis-chart normalization-explorer__chart" id="normalization-chart"></div>
72+
<aside id="story-evidence-callout-inline" class="story-evidence-callout story-evidence-callout--plot" aria-live="polite" hidden></aside>
73+
</div>
7174
<p class="normalization-explorer__note" id="normalization-unit-note"></p>
7275
`;
7376

src/story-presets.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ export const STORY_PRESETS = {
2020
stageFocus: "stage-map",
2121
callout: {
2222
label: "Act 1 evidence",
23-
title: "Europe still grew.",
24-
body: "The map is set to compounded regional GDP growth in 2023. Europe is not flat: it is 1.38x its 2000 GDP baseline in this dataset.",
25-
stats: ["Compounded since 2000", "Regions selected", "2023"],
23+
title: "The regional view rules out collapse.",
24+
body: "Europe stays above its 2000 baseline on both GDP and GDP per capita. The rest of the story is about relative pace and market outcomes, not whether Europe stopped growing outright.",
25+
stats: ["GDP and GDP/person > 1x", "Regional comparison", "2023"],
2626
},
2727
},
2828
"us-eu-frame": {
@@ -40,9 +40,9 @@ export const STORY_PRESETS = {
4040
stageFocus: "stage-map",
4141
callout: {
4242
label: "Act 2 evidence",
43-
title: "This is the benchmark.",
44-
body: "The graph zooms into North America and Europe and switches to countries, so Canada no longer hides the US path inside a regional average.",
45-
stats: ["Compounded since 2000", "Country-level view", "GDP per capita"],
43+
title: "The comparison frame is deliberate.",
44+
body: "From this point on, the chart holds Europe and North America as rich-market peers at country level. That keeps the rest of the story focused on within-peer divergence rather than global catch-up.",
45+
stats: ["Rich-market peers", "Country-level frame", "Rest of story"],
4646
},
4747
},
4848
"divergence-hypothesis": {
@@ -55,13 +55,14 @@ export const STORY_PRESETS = {
5555
selectedRegions: ["Europe", "North America", "Asia-Pacific"],
5656
selectedIso3: ["DEU", "GBR", "USA", "KOR", "JPN"],
5757
treemapSnapshot: "latest",
58-
stageSteps: ["stage-map", "stage-evolution"],
58+
stageSteps: ["stage-evolution"],
5959
stageFocus: "stage-evolution",
60+
calloutPlacement: "inline",
6061
callout: {
6162
label: "Act 3 evidence",
62-
title: "The market proxy separates.",
63-
body: "Scatter mode compares GDP per capita growth with ETF growth. The US sits far above major European markets on the ETF axis.",
64-
stats: ["ETF Price", "Scatter view", "Selected outliers"],
63+
title: "The break clusters around 2008.",
64+
body: "Candidate break years concentrate around the crisis window, and the normalization explorer lets you test how much the split changes with the base year, lens, and price adjustment.",
65+
stats: ["Break-year test", "Normalization explorer", "Lens-sensitive gap"],
6566
},
6667
},
6768
"europe-dispersion": {

src/story.css

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,16 @@
503503
display: none;
504504
}
505505

506+
.story-evidence-callout--plot {
507+
top: 18px;
508+
right: 22px;
509+
}
510+
511+
.story-evidence-callout--plot:hover,
512+
.story-evidence-callout--plot:focus-within {
513+
width: min(304px, calc(100% - 44px));
514+
}
515+
506516
.story-evidence-callout:hover,
507517
.story-evidence-callout:focus-within {
508518
width: min(320px, calc(100% - 44px));
@@ -519,6 +529,10 @@
519529
outline-offset: 4px;
520530
}
521531

532+
.story-evidence-callout--plot:focus-visible {
533+
outline-offset: 2px;
534+
}
535+
522536
.map-tooltip {
523537
position: absolute;
524538
z-index: 6;
@@ -624,6 +638,15 @@
624638
transform: translateY(0);
625639
}
626640

641+
.story-evidence-callout--plot .story-evidence-callout__content {
642+
gap: 8px;
643+
}
644+
645+
.story-evidence-callout--plot:hover .story-evidence-callout__content,
646+
.story-evidence-callout--plot:focus-within .story-evidence-callout__content {
647+
margin-top: 8px;
648+
}
649+
627650
.story-evidence-callout h3 {
628651
margin: 0;
629652
color: var(--text-primary);
@@ -632,6 +655,12 @@
632655
letter-spacing: -0.035em;
633656
}
634657

658+
.story-evidence-callout--plot h3 {
659+
font-size: clamp(0.98rem, 1.35vw, 1.16rem);
660+
line-height: 1.14;
661+
letter-spacing: -0.02em;
662+
}
663+
635664
.story-evidence-callout__body {
636665
margin: 0;
637666
color: var(--text-secondary);

src/style.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,10 @@ input:focus-visible {
529529
min-height: 360px;
530530
}
531531

532+
.normalization-explorer__chart-shell {
533+
position: relative;
534+
}
535+
532536
.normalization-explorer__note {
533537
margin: 0;
534538
padding-top: 2px;

src/treemap-dominance.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export function renderTreemapDominanceSummary(container, data, snapshotKey) {
3030

3131
const label = document.createElement("p");
3232
label.className = "treemap-dominance__label";
33-
label.textContent = "Homogeneity test";
33+
label.textContent = "Focused View";
3434

3535
const title = document.createElement("h3");
3636
title.textContent = "Does one country or industry carry the index?";

0 commit comments

Comments
 (0)