Widget:Solvency2 BalanceSheet: Difference between revisions
No edit summary |
No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
<div id="insurerbrain-module-solvency2-bs"> |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|||
<title>Solvency II Balance Sheet</title> |
|||
<style> |
<style> |
||
/* ── Reset & Container ──────────────────────────────────── */ |
|||
:root { |
|||
#insurerbrain-module-solvency2-bs *, |
|||
--bg: #ffffff; |
|||
#insurerbrain-module-solvency2-bs *::before, |
|||
--surface: #f8f9fa; |
|||
#insurerbrain-module-solvency2-bs *::after { |
|||
--surface2: #eaecf0; |
|||
box-sizing: border-box; |
|||
margin: 0; |
|||
--border-heavy: #202122; |
|||
padding: 0; |
|||
} |
|||
--text-dim: #54595d; |
|||
--text-muted: #72777d; |
|||
--link: #000099; |
|||
#insurerbrain-module-solvency2-bs { |
|||
/* Monochrome block palette — dark-to-light for visual hierarchy */ |
|||
--ib-accent: #1a5276; |
|||
--ib-accent-light: #d4e6f1; |
|||
--ib-correct: #1e8449; |
|||
--ib-correct-bg: #d5f5e3; |
|||
--ib-correct-border: #82e0aa; |
|||
--ib-wrong: #922b21; |
|||
--ib-wrong-bg: #fadbd8; |
|||
} |
|||
--ib-wrong-border: #f1948a; |
|||
--ib-neutral-bg: #f8f9fa; |
|||
--ib-neutral-border: #c8ccd1; |
|||
--ib-text: #202122; |
|||
--ib-text-muted: #54595d; |
|||
--ib-radius: 4px; |
|||
--ib-transition: 0.25s ease; |
|||
max-width: 52rem; |
|||
* { margin: 0; padding: 0; box-sizing: border-box; } |
|||
padding: 1.5rem 0; |
|||
color: var(--ib-text); |
|||
} |
|||
/* ── Progress Bar ────────────────────────────────────────── */ |
|||
body { |
|||
#insurerbrain-module-solvency2-bs .ib-progress-wrap { |
|||
background: var(--bg); |
|||
display: flex; |
|||
align-items: center; |
|||
gap: 0.75rem; |
|||
margin-bottom: 1.25rem; |
|||
-webkit-font-smoothing: auto; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-progress-label { |
|||
.container { |
|||
white-space: nowrap; |
|||
color: var(--ib-text-muted); |
|||
margin: 0 auto; |
|||
font-size: 0.875em; |
|||
padding: 24px 16px 60px; |
|||
min-width: 6.5rem; |
|||
} |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-progress-track { |
|||
/* ---- Header ---- */ |
|||
flex: 1; |
|||
height: 6px; |
|||
border-bottom: 2px solid var(--border-heavy); |
|||
background: var(--ib-neutral-bg); |
|||
padding-bottom: 10px; |
|||
border: 1px solid var(--ib-neutral-border); |
|||
margin-bottom: 20px; |
|||
border-radius: 3px; |
|||
} |
|||
overflow: hidden; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-progress-fill { |
|||
header h1 { |
|||
height: 100%; |
|||
width: 0%; |
|||
background: var(--ib-accent); |
|||
border-radius: 3px; |
|||
transition: width 0.4s ease; |
|||
margin: 0; |
|||
} |
|||
/* ── Question Card ───────────────────────────────────────── */ |
|||
header p { |
|||
#insurerbrain-module-solvency2-bs .ib-card { |
|||
font-size: 0.88em; |
|||
background: var(--ib-neutral-bg); |
|||
border: 1px solid var(--ib-neutral-border); |
|||
margin-top: 4px; |
|||
border-radius: var(--ib-radius); |
|||
line-height: 1.6; |
|||
padding: 1.5rem; |
|||
} |
|||
margin-bottom: 1rem; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-q-header { |
|||
/* ---- Two-column master layout ---- */ |
|||
display: flex; |
|||
.main-grid { |
|||
align-items: baseline; |
|||
gap: 0.5rem; |
|||
grid-template-columns: 1fr 300px; |
|||
margin-bottom: 1rem; |
|||
} |
|||
align-items: start; |
|||
} |
|||
@media (max-width: 760px) { |
|||
.main-grid { grid-template-columns: 1fr; } |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-q-number { |
|||
/* ---- Balance-sheet visual ---- */ |
|||
display: inline-flex; |
|||
.bs-visual { |
|||
align-items: center; |
|||
border: 1px solid var(--border); |
|||
justify-content: center; |
|||
background: var(--bg); |
|||
min-width: 1.75rem; |
|||
padding: 20px 24px 16px; |
|||
height: 1.75rem; |
|||
} |
|||
background: var(--ib-accent); |
|||
color: #fff; |
|||
border-radius: 50%; |
|||
font-size: 0.8em; |
|||
font-weight: 700; |
|||
flex-shrink: 0; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-q-topic { |
|||
.bs-title-row { |
|||
font-size: 0.8em; |
|||
color: var(--ib-text-muted); |
|||
justify-content: space-between; |
|||
border: 1px solid var(--ib-neutral-border); |
|||
margin-bottom: 14px; |
|||
border-radius: 2px; |
|||
} |
|||
padding: 0.1rem 0.45rem; |
|||
margin-left: auto; |
|||
white-space: nowrap; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-q-text { |
|||
.bs-col-label { |
|||
margin-bottom: 1.25rem; |
|||
line-height: 1.55; |
|||
} |
|||
letter-spacing: 0.06em; |
|||
text-transform: uppercase; |
|||
color: var(--text-muted); |
|||
} |
|||
/* ── Options ─────────────────────────────────────────────── */ |
|||
.bs-columns { |
|||
#insurerbrain-module-solvency2-bs .ib-options { |
|||
display: grid; |
|||
display: flex; |
|||
grid-template-columns: 1fr 24px 1fr; |
|||
flex-direction: column; |
|||
gap: 0.5rem; |
|||
} |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option { |
|||
.bs-col { |
|||
display: flex; |
|||
align-items: flex-start; |
|||
gap: 0.75rem; |
|||
padding: 0.75rem 1rem; |
|||
} |
|||
border: 1px solid var(--ib-neutral-border); |
|||
border-radius: var(--ib-radius); |
|||
background: #fff; |
|||
cursor: pointer; |
|||
transition: border-color var(--ib-transition), background var(--ib-transition); |
|||
line-height: 1.45; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option:hover:not(.ib-disabled) { |
|||
.bs-separator { |
|||
border-color: var(--ib-accent); |
|||
display: flex; |
|||
background: var(--ib-accent-light); |
|||
align-items: stretch; |
|||
} |
|||
justify-content: center; |
|||
} |
|||
.bs-separator .line { |
|||
width: 1px; |
|||
background: var(--border); |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option.ib-selected:not(.ib-disabled) { |
|||
/* ---- Blocks ---- */ |
|||
border-color: var(--ib-accent); |
|||
.bs-block { |
|||
background: var(--ib-accent-light); |
|||
padding: 12px 14px; |
|||
} |
|||
position: relative; |
|||
cursor: pointer; |
|||
transition: background 0.2s ease, box-shadow 0.2s ease; |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
border: 1px solid transparent; |
|||
color: #fff; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option.ib-disabled { |
|||
.bs-block .label { |
|||
cursor: default; |
|||
opacity: 0.85; |
|||
} |
|||
line-height: 1.3; |
|||
} |
|||
.bs-block .sublabel { |
|||
font-size: 0.72em; |
|||
opacity: 0.75; |
|||
margin-top: 1px; |
|||
} |
|||
.bs-block .value { |
|||
font-size: 0.88em; |
|||
font-weight: bold; |
|||
margin-top: 4px; |
|||
font-variant-numeric: tabular-nums; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option.ib-correct-answer { |
|||
.bs-block:hover { |
|||
border-color: var(--ib-correct-border); |
|||
background: var(--ib-correct-bg); |
|||
z-index: 2; |
|||
opacity: 1; |
|||
} |
|||
} |
|||
.bs-block.active { |
|||
box-shadow: 0 0 0 2.5px var(--border-heavy); |
|||
z-index: 3; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option.ib-wrong-answer { |
|||
/* Individual block fills */ |
|||
border-color: var(--ib-wrong-border); |
|||
background: var(--ib-wrong-bg); |
|||
opacity: 1; |
|||
.block-rm { background: var(--rm-fill); } |
|||
} |
|||
.block-scr { background: var(--scr-fill); color: var(--text); } |
|||
.block-mcr { background: var(--mcr-fill); color: var(--text); } |
|||
.block-surplus { background: var(--surplus-fill); color: var(--text); border: 1px solid var(--border); } |
|||
#insurerbrain-module-solvency2-bs .ib-option-key { |
|||
/* ---- Legend ---- */ |
|||
display: inline-flex; |
|||
.legend-strip { |
|||
align-items: center; |
|||
justify-content: center; |
|||
min-width: 1.5rem; |
|||
height: 1.5rem; |
|||
border: 1.5px solid var(--ib-neutral-border); |
|||
border-radius: 50%; |
|||
font-size: 0.8em; |
|||
} |
|||
font-weight: 600; |
|||
.legend-item { |
|||
flex-shrink: 0; |
|||
transition: border-color var(--ib-transition), background var(--ib-transition), color var(--ib-transition); |
|||
align-items: center; |
|||
} |
|||
gap: 5px; |
|||
padding: 3px 8px; |
|||
font-size: 0.75em; |
|||
color: var(--text-dim); |
|||
cursor: pointer; |
|||
border: 1px solid transparent; |
|||
border-radius: 2px; |
|||
transition: border-color 0.15s ease; |
|||
} |
|||
.legend-item:hover { border-color: var(--border); } |
|||
.legend-dot { |
|||
width: 10px; height: 10px; |
|||
border-radius: 1px; |
|||
flex-shrink: 0; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option.ib-selected .ib-option-key { |
|||
/* ---- Status bar ---- */ |
|||
border-color: var(--ib-accent); |
|||
.status-bar { |
|||
background: var(--ib-accent); |
|||
display: flex; |
|||
color: #fff; |
|||
} |
|||
flex-wrap: wrap; |
|||
margin-top: 12px; |
|||
font-size: 0.8em; |
|||
color: var(--text-dim); |
|||
} |
|||
.status-item { |
|||
display: flex; |
|||
align-items: center; |
|||
gap: 6px; |
|||
} |
|||
.status-dot { |
|||
width: 7px; height: 7px; |
|||
border-radius: 50%; |
|||
flex-shrink: 0; |
|||
} |
|||
.status-dot.ok { background: var(--text); } |
|||
.status-dot.warn { background: var(--text-muted); } |
|||
.status-dot.fail { border: 2px solid var(--text); background: transparent; } |
|||
#insurerbrain-module-solvency2-bs .ib-option.ib-correct-answer .ib-option-key { |
|||
/* ---- Side panel ---- */ |
|||
border-color: var(--ib-correct); |
|||
.side-panel { |
|||
background: var(--ib-correct); |
|||
display: flex; |
|||
color: #fff; |
|||
flex-direction: column; |
|||
} |
|||
gap: 16px; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option.ib-wrong-answer .ib-option-key { |
|||
.info-card { |
|||
border-color: var(--ib-wrong); |
|||
background: var(--ib-wrong); |
|||
color: #fff; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option-text { |
|||
.card-label { |
|||
padding-top: 0.1rem; |
|||
} |
|||
font-weight: bold; |
|||
letter-spacing: 0.08em; |
|||
text-transform: uppercase; |
|||
color: var(--text-muted); |
|||
margin-bottom: 10px; |
|||
} |
|||
/* ── Feedback ────────────────────────────────────────────── */ |
|||
/* ---- Gauge ---- */ |
|||
#insurerbrain-module-solvency2-bs .ib-feedback { |
|||
.gauge-card { text-align: center; padding: 18px; } |
|||
margin-top: 1rem; |
|||
padding: 0.85rem 1rem; |
|||
border-radius: var(--ib-radius); |
|||
border-left: 4px solid transparent; |
|||
line-height: 1.5; |
|||
display: none; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-feedback.ib-show { |
|||
.gauge-value { |
|||
display: block; |
|||
animation: ibFadeIn 0.3s ease; |
|||
font-weight: bold; |
|||
} |
|||
color: var(--text); |
|||
line-height: 1.1; |
|||
} |
|||
.gauge-label { |
|||
font-size: 0.78em; |
|||
color: var(--text-muted); |
|||
margin-top: 2px; |
|||
} |
|||
.gauge-bar-track { |
|||
margin-top: 14px; |
|||
height: 6px; |
|||
background: var(--surface2); |
|||
border-radius: 3px; |
|||
overflow: hidden; |
|||
} |
|||
.gauge-bar-fill { |
|||
height: 100%; |
|||
border-radius: 3px; |
|||
background: var(--text); |
|||
transition: width 0.6s ease; |
|||
} |
|||
.gauge-thresholds { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
margin-top: 6px; |
|||
font-size: 0.68em; |
|||
color: var(--text-muted); |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-feedback.ib-fb-correct { |
|||
/* ---- Sliders ---- */ |
|||
background: var(--ib-correct-bg); |
|||
.slider-group { margin-bottom: 14px; } |
|||
border-left-color: var(--ib-correct); |
|||
.slider-group:last-child { margin-bottom: 0; } |
|||
color: var(--ib-correct); |
|||
.slider-header { |
|||
} |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: baseline; |
|||
margin-bottom: 5px; |
|||
} |
|||
.slider-header label { |
|||
font-size: 0.8em; |
|||
color: var(--text-dim); |
|||
} |
|||
.slider-val { |
|||
font-size: 0.8em; |
|||
font-weight: bold; |
|||
color: var(--text); |
|||
font-variant-numeric: tabular-nums; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-feedback.ib-fb-wrong { |
|||
input[type="range"] { |
|||
background: var(--ib-wrong-bg); |
|||
-webkit-appearance: none; |
|||
border-left-color: var(--ib-wrong); |
|||
width: 100%; |
|||
color: var(--ib-wrong); |
|||
height: 3px; |
|||
} |
|||
background: var(--surface2); |
|||
border-radius: 2px; |
|||
outline: none; |
|||
cursor: pointer; |
|||
} |
|||
input[type="range"]::-webkit-slider-thumb { |
|||
-webkit-appearance: none; |
|||
width: 14px; height: 14px; |
|||
border-radius: 50%; |
|||
background: var(--text); |
|||
cursor: pointer; |
|||
border: 2px solid #fff; |
|||
box-shadow: 0 0 0 1px var(--border); |
|||
} |
|||
input[type="range"]::-moz-range-thumb { |
|||
width: 14px; height: 14px; |
|||
border-radius: 50%; |
|||
background: var(--text); |
|||
cursor: pointer; |
|||
border: 2px solid #fff; |
|||
box-shadow: 0 0 0 1px var(--border); |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-feedback strong { |
|||
/* ---- Detail card ---- */ |
|||
display: block; |
|||
.info-card h3 { |
|||
margin-bottom: 0.25rem; |
|||
} |
|||
font-weight: bold; |
|||
color: var(--text); |
|||
margin-bottom: 6px; |
|||
line-height: 1.3; |
|||
} |
|||
.info-card p { |
|||
font-size: 0.84em; |
|||
color: var(--text-dim); |
|||
line-height: 1.6; |
|||
} |
|||
.formula { |
|||
margin-top: 10px; |
|||
padding: 8px 12px; |
|||
background: var(--surface); |
|||
border: 1px solid var(--surface2); |
|||
font-family: "Nimbus Roman No9 L", "Times New Roman", Times, serif; |
|||
font-size: 0.88em; |
|||
color: var(--text); |
|||
letter-spacing: 0.01em; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-feedback .ib-explanation { |
|||
/* ---- MCR badge inside SCR ---- */ |
|||
color: var(--ib-text); |
|||
.tier-badge { |
|||
font-size: 0.92em; |
|||
display: inline-block; |
|||
} |
|||
padding: 1px 6px; |
|||
border-radius: 2px; |
|||
font-size: 0.72em; |
|||
font-weight: bold; |
|||
margin-top: 3px; |
|||
background: rgba(255,255,255,0.18); |
|||
color: inherit; |
|||
cursor: pointer; |
|||
} |
|||
.block-scr .tier-badge { background: rgba(0,0,0,0.08); } |
|||
/* ── Navigation ──────────────────────────────────────────── */ |
|||
/* ---- Deficit block ---- */ |
|||
#insurerbrain-module-solvency2-bs .ib-nav { |
|||
.block-deficit { |
|||
display: flex; |
|||
justify-content: flex-end; |
|||
border: 2px dashed var(--text); |
|||
gap: 0.5rem; |
|||
margin-top: 1rem; |
|||
} |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-btn { |
|||
/* ---- Print ---- */ |
|||
padding: 0.55rem 1.25rem; |
|||
@media print { |
|||
border: 1px solid var(--ib-accent); |
|||
.side-panel { display: none; } |
|||
border-radius: var(--ib-radius); |
|||
.main-grid { grid-template-columns: 1fr; } |
|||
background: var(--ib-accent); |
|||
.container { padding: 0; } |
|||
color: #fff; |
|||
.bs-visual { border: 1px solid #000; } |
|||
font-size: 0.9em; |
|||
} |
|||
font-weight: 600; |
|||
</style> |
|||
cursor: pointer; |
|||
</head> |
|||
transition: opacity var(--ib-transition); |
|||
<body> |
|||
} |
|||
<div class="container"> |
|||
<header> |
|||
<h1>Solvency II Balance Sheet</h1> |
|||
<p>Interactive breakdown of the market-value balance sheet under the EU Solvency II Directive. Adjust the sliders and click any block to explore how assets, technical provisions, and capital requirements interconnect.</p> |
|||
</header> |
|||
#insurerbrain-module-solvency2-bs .ib-btn:hover { |
|||
<div class="main-grid"> |
|||
opacity: 0.85; |
|||
<!-- Left column: balance-sheet diagram --> |
|||
} |
|||
<div> |
|||
<div class="bs-visual" id="bsVisual"> |
|||
<div class="bs-title-row"> |
|||
<span class="bs-col-label">Assets</span> |
|||
<span class="bs-col-label">Liabilities & Own Funds</span> |
|||
</div> |
|||
<div class="bs-columns" id="bsColumns"> |
|||
<div class="bs-col" id="assetsCol"></div> |
|||
<div class="bs-separator"><div class="line"></div></div> |
|||
<div class="bs-col" id="liabCol"></div> |
|||
</div> |
|||
<div class="legend-strip" id="legend"></div> |
|||
</div> |
|||
<div class="status-bar" id="statusBar"></div> |
|||
</div> |
|||
#insurerbrain-module-solvency2-bs .ib-btn:disabled { |
|||
<!-- Right column: controls & info --> |
|||
opacity: 0.4; |
|||
<div class="side-panel"> |
|||
cursor: default; |
|||
<!-- Solvency ratio --> |
|||
} |
|||
<div class="info-card gauge-card"> |
|||
<div class="card-label">Solvency Ratio</div> |
|||
<div class="gauge-value" id="ratioValue">—</div> |
|||
<div class="gauge-label">Eligible Own Funds / SCR</div> |
|||
<div class="gauge-bar-track"><div class="gauge-bar-fill" id="ratioBar"></div></div> |
|||
<div class="gauge-thresholds"> |
|||
<span>0%</span> |
|||
<span>100% min</span> |
|||
<span>200%</span> |
|||
<span>300%</span> |
|||
</div> |
|||
</div> |
|||
#insurerbrain-module-solvency2-bs .ib-btn-outline { |
|||
<!-- Sliders --> |
|||
background: transparent; |
|||
<div class="info-card"> |
|||
color: var(--ib-accent); |
|||
<div class="card-label">Adjust Values (€ bn)</div> |
|||
} |
|||
/* ── Results Screen ──────────────────────────────────────── */ |
|||
<div class="slider-group"> |
|||
#insurerbrain-module-solvency2-bs .ib-results { |
|||
<div class="slider-header"> |
|||
text-align: center; |
|||
<label>Total Assets</label> |
|||
padding: 2rem 1rem; |
|||
<span class="slider-val" id="valAssets">150</span> |
|||
} |
|||
</div> |
|||
<input type="range" id="sliderAssets" min="80" max="250" value="150"> |
|||
</div> |
|||
#insurerbrain-module-solvency2-bs .ib-score-ring { |
|||
<div class="slider-group"> |
|||
position: relative; |
|||
<div class="slider-header"> |
|||
width: 9rem; |
|||
<label>Best Estimate Liabilities</label> |
|||
height: 9rem; |
|||
<span class="slider-val" id="valBEL">85</span> |
|||
margin: 0 auto 1.5rem; |
|||
</div> |
|||
} |
|||
<input type="range" id="sliderBEL" min="30" max="180" value="85"> |
|||
</div> |
|||
#insurerbrain-module-solvency2-bs .ib-score-ring svg { |
|||
<div class="slider-group"> |
|||
transform: rotate(-90deg); |
|||
<div class="slider-header"> |
|||
width: 100%; |
|||
<label>Risk Margin</label> |
|||
height: 100%; |
|||
<span class="slider-val" id="valRM">8</span> |
|||
} |
|||
</div> |
|||
<input type="range" id="sliderRM" min="1" max="30" value="8"> |
|||
</div> |
|||
#insurerbrain-module-solvency2-bs .ib-score-ring circle { |
|||
<div class="slider-group"> |
|||
fill: none; |
|||
<div class="slider-header"> |
|||
stroke-width: 8; |
|||
<label>SCR</label> |
|||
} |
|||
<span class="slider-val" id="valSCR">35</span> |
|||
</div> |
|||
<input type="range" id="sliderSCR" min="10" max="80" value="35"> |
|||
</div> |
|||
#insurerbrain-module-solvency2-bs .ib-ring-bg { |
|||
<div class="slider-group"> |
|||
stroke: var(--ib-neutral-border); |
|||
<div class="slider-header"> |
|||
} |
|||
<label>MCR (% of SCR)</label> |
|||
<span class="slider-val" id="valMCR">35%</span> |
|||
#insurerbrain-module-solvency2-bs .ib-ring-fill { |
|||
</div> |
|||
stroke: var(--ib-correct); |
|||
<input type="range" id="sliderMCR" min="20" max="50" value="35"> |
|||
stroke-linecap: round; |
|||
</div> |
|||
stroke-dasharray: 264; |
|||
</div> |
|||
stroke-dashoffset: 264; |
|||
transition: stroke-dashoffset 1s ease; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-score-label { |
|||
position: absolute; |
|||
inset: 0; |
|||
display: flex; |
|||
flex-direction: column; |
|||
align-items: center; |
|||
justify-content: center; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-score-pct { |
|||
font-size: 2rem; |
|||
font-weight: 700; |
|||
color: var(--ib-text); |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-score-sub { |
|||
font-size: 0.85em; |
|||
color: var(--ib-text-muted); |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-results-msg { |
|||
margin-bottom: 1.5rem; |
|||
color: var(--ib-text-muted); |
|||
line-height: 1.5; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-review-list { |
|||
text-align: left; |
|||
margin-top: 1.5rem; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-review-item { |
|||
display: flex; |
|||
align-items: flex-start; |
|||
gap: 0.6rem; |
|||
padding: 0.65rem 0; |
|||
border-bottom: 1px solid var(--ib-neutral-border); |
|||
font-size: 0.92em; |
|||
line-height: 1.45; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-review-icon { |
|||
flex-shrink: 0; |
|||
width: 1.25rem; |
|||
height: 1.25rem; |
|||
border-radius: 50%; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
font-size: 0.7em; |
|||
font-weight: 700; |
|||
color: #fff; |
|||
margin-top: 0.15rem; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-review-icon.ib-ri-correct { |
|||
background: var(--ib-correct); |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-review-icon.ib-ri-wrong { |
|||
background: var(--ib-wrong); |
|||
} |
|||
/* ── Animation ───────────────────────────────────────────── */ |
|||
@keyframes ibFadeIn { |
|||
from { opacity: 0; transform: translateY(6px); } |
|||
to { opacity: 1; transform: translateY(0); } |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-animate-in { |
|||
animation: ibFadeIn 0.3s ease; |
|||
} |
|||
/* ── Responsive ──────────────────────────────────────────── */ |
|||
@media (max-width: 480px) { |
|||
#insurerbrain-module-solvency2-bs .ib-card { |
|||
padding: 1rem; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-option { |
|||
padding: 0.6rem 0.75rem; |
|||
} |
|||
#insurerbrain-module-solvency2-bs .ib-q-topic { |
|||
display: none; |
|||
} |
|||
} |
|||
</style> |
|||
<!-- Progress --> |
|||
<div class="ib-progress-wrap"> |
|||
<span class="ib-progress-label" id="ib-s2-progress-text">Question 1 / 10</span> |
|||
<div class="ib-progress-track"> |
|||
<h3 id="detailTitle">Select a component</h3> |
|||
<div class="ib-progress-fill" id="ib-s2-progress-bar"></div> |
|||
<p id="detailDesc">Click or hover on any block in the balance sheet to see its definition, purpose, and relationship to other elements.</p> |
|||
<div class="formula" id="detailFormula" style="display:none;"></div> |
|||
</div> |
|||
</div> |
|||
</div> |
</div> |
||
</div> |
</div> |
||
<!-- Question Area --> |
|||
<script> |
|||
<div id="ib-s2-question-area"></div> |
|||
const data = { assets: 150, bel: 85, rm: 8, scr: 35, mcrPct: 35 }; |
|||
<!-- Navigation --> |
|||
const descriptions = { |
|||
<div class="ib-nav" id="ib-s2-nav"> |
|||
assets: { |
|||
<button class="ib-btn ib-btn-outline" id="ib-s2-btn-restart" style="display:none;">Restart</button> |
|||
title: 'Market Value of Assets', |
|||
<button class="ib-btn" id="ib-s2-btn-next" disabled>Next →</button> |
|||
desc: 'All assets held by the insurer valued at fair (market) value under Solvency II. This includes bonds, equities, property, cash, reinsurance recoverables, and other investments. Market-consistent valuation is a core SII principle.', |
|||
</div> |
|||
formula: null |
|||
}, |
|||
bel: { |
|||
title: 'Best Estimate Liabilities (BEL)', |
|||
desc: 'The probability-weighted average of future cash flows for insurance obligations, discounted using the relevant risk-free interest rate term structure prescribed by EIOPA. It represents the expected cost of meeting policyholder obligations.', |
|||
formula: 'BEL = \u03A3 PV(expected future cash flows)' |
|||
}, |
|||
rm: { |
|||
title: 'Risk Margin', |
|||
desc: 'An additional amount over the BEL to ensure technical provisions are sufficient. Calculated as the cost of holding eligible own funds equal to the SCR over the lifetime of the obligations, using a prescribed cost-of-capital rate (currently 6%).', |
|||
formula: 'RM = CoC \u00D7 \u03A3 SCR(t) / (1 + r(t))^t' |
|||
}, |
|||
tp: { |
|||
title: 'Technical Provisions (TP)', |
|||
desc: 'The total value of insurance liabilities \u2014 the sum of the Best Estimate Liabilities and the Risk Margin. This represents the full amount the insurer must reserve to meet policyholder obligations.', |
|||
formula: 'TP = BEL + Risk Margin' |
|||
}, |
|||
scr: { |
|||
title: 'Solvency Capital Requirement', |
|||
desc: 'The capital buffer required to absorb significant unforeseen losses over a 1-year period with a 99.5% confidence level (i.e. a 1-in-200 year event). Can be calculated via the Standard Formula or an approved Internal Model.', |
|||
formula: 'SCR = VaR\u2089\u2089.\u2085%(Basic Own Funds) over 1 year' |
|||
}, |
|||
mcr: { |
|||
title: 'Minimum Capital Requirement', |
|||
desc: 'The minimum level of security below which financial resources should not fall. Breach triggers ultimate supervisory intervention \u2014 the insurer\u2019s licence may be withdrawn. Bounded between 25\u201345% of SCR.', |
|||
formula: 'MCR = max(25% \u00D7 SCR, min(45% \u00D7 SCR, linear MCR))' |
|||
}, |
|||
surplus: { |
|||
title: 'Free Surplus', |
|||
desc: 'Own funds in excess of the SCR \u2014 the capital cushion above regulatory requirements. A healthy surplus signals strong financial resilience and may support dividend distributions or growth strategies.', |
|||
formula: 'Surplus = Own Funds \u2212 SCR' |
|||
}, |
|||
ownfunds: { |
|||
title: 'Eligible Own Funds', |
|||
desc: 'Total own funds available to cover the SCR and MCR. Classified into Tier 1 (highest quality \u2014 equity, retained earnings), Tier 2 (subordinated debt), and Tier 3 (limited eligibility). Tiering limits apply when covering SCR/MCR.', |
|||
formula: 'Own Funds = Assets \u2212 Technical Provisions' |
|||
} |
|||
}; |
|||
<!-- Results (hidden initially) --> |
|||
const legendItems = [ |
|||
<div class="ib-results" id="ib-s2-results" style="display:none;"></div> |
|||
{ id: 'assets', label: 'Assets', color: 'var(--assets-fill)' }, |
|||
{ id: 'bel', label: 'BEL', color: 'var(--bel-fill)' }, |
|||
{ id: 'rm', label: 'Risk Margin', color: 'var(--rm-fill)' }, |
|||
{ id: 'scr', label: 'SCR', color: 'var(--scr-fill)' }, |
|||
{ id: 'surplus', label: 'Surplus', color: 'var(--surplus-fill)' }, |
|||
{ id: 'tp', label: 'Tech. Prov.', color: '#72777d' }, |
|||
{ id: 'ownfunds', label: 'Own Funds', color: '#c8ccd1' }, |
|||
]; |
|||
<script> |
|||
function compute() { |
|||
(function() { |
|||
const tp = data.bel + data.rm; |
|||
/* ── Question Bank ───────────────────────────────────── */ |
|||
const ownFunds = Math.max(0, data.assets - tp); |
|||
var questions = [ |
|||
const mcr = Math.round(data.scr * data.mcrPct / 100); |
|||
{ |
|||
const surplus = Math.max(0, ownFunds - data.scr); |
|||
topic: "Valuation", |
|||
const ratio = data.scr > 0 ? (ownFunds / data.scr * 100) : 0; |
|||
text: "Under Solvency II, how must an insurer's assets be valued on the economic balance sheet?", |
|||
return { tp, ownFunds, mcr, surplus, ratio }; |
|||
options: [ |
|||
} |
|||
"At historical cost, consistent with IFRS 9", |
|||
"At market-consistent (fair) value, using quoted market prices where available", |
|||
"At the lower of cost and net realisable value", |
|||
"At amortised cost with an impairment overlay" |
|||
], |
|||
answer: 1, |
|||
explanation: "Solvency II requires a market-consistent valuation framework. Assets must be valued at the amount for which they could be exchanged between knowledgeable, willing parties in an arm's-length transaction — effectively fair value, with quoted market prices used where an active market exists." |
|||
}, |
|||
{ |
|||
topic: "Technical Provisions", |
|||
text: "Technical provisions under Solvency II are equal to the sum of which two components?", |
|||
options: [ |
|||
"Unearned Premium Reserve + Claims Outstanding Reserve", |
|||
"Best Estimate Liability (BEL) + Risk Margin", |
|||
"Solvency Capital Requirement + Risk Margin", |
|||
"Best Estimate Liability (BEL) + Matching Adjustment" |
|||
], |
|||
answer: 1, |
|||
explanation: "Article 77 of the Solvency II Directive defines technical provisions as the sum of the Best Estimate Liability (BEL) — a probability-weighted average of future cash flows discounted using the risk-free rate term structure — and the Risk Margin, which represents the cost of holding capital to run off the obligations." |
|||
}, |
|||
{ |
|||
topic: "Risk Margin", |
|||
text: "What does the Risk Margin in Solvency II conceptually represent?", |
|||
options: [ |
|||
"A buffer to protect against adverse reserve development", |
|||
"The cost-of-capital that a reference undertaking would require to take over and run off the insurance obligations", |
|||
"A regulatory add-on calibrated at the 99.5% VaR over one year", |
|||
"The expected profit embedded in future premiums" |
|||
], |
|||
answer: 1, |
|||
explanation: "The Risk Margin is calculated using a cost-of-capital approach. It represents the cost a hypothetical reference undertaking would charge — above the Best Estimate — for holding the Solvency Capital Requirement needed to support the obligations until they are fully run off." |
|||
}, |
|||
{ |
|||
topic: "Discount Rate", |
|||
text: "Which rate curve is prescribed for discounting the Best Estimate Liability under Solvency II?", |
|||
options: [ |
|||
"The insurer's own investment return assumptions", |
|||
"Government bond yields of the currency of the obligation", |
|||
"The risk-free interest rate term structure published by EIOPA", |
|||
"The swap rate plus a fixed credit spread" |
|||
], |
|||
answer: 2, |
|||
explanation: "EIOPA publishes the relevant risk-free interest rate term structure each month. It is derived primarily from swap rates, adjusted to remove the credit risk component (Credit Risk Adjustment), and extrapolated beyond the Last Liquid Point toward an Ultimate Forward Rate." |
|||
}, |
|||
{ |
|||
topic: "Own Funds", |
|||
text: "Under Solvency II, 'Own Funds' that can cover the SCR are classified into how many quality tiers?", |
|||
options: [ |
|||
"Two tiers", |
|||
"Three tiers", |
|||
"Four tiers", |
|||
"Five tiers" |
|||
], |
|||
answer: 1, |
|||
explanation: "Own Funds are classified into three tiers based on their quality — primarily their permanence and loss-absorption capacity. Tier 1 is the highest quality (e.g. ordinary share capital, retained earnings), Tier 2 includes items like subordinated liabilities, and Tier 3 captures lower-quality items such as net deferred tax assets." |
|||
}, |
|||
{ |
|||
topic: "SCR", |
|||
text: "The Solvency Capital Requirement (SCR) under the Standard Formula is calibrated to which confidence level over which time horizon?", |
|||
options: [ |
|||
"95.0% Value-at-Risk over a one-year period", |
|||
"99.0% Value-at-Risk over a run-off period", |
|||
"99.5% Value-at-Risk over a one-year period", |
|||
"99.5% Tail Value-at-Risk over a one-year period" |
|||
], |
|||
answer: 2, |
|||
explanation: "The SCR corresponds to the Value-at-Risk of Basic Own Funds at a 99.5% confidence level over a one-year time horizon. This means the insurer should hold enough capital to survive a 1-in-200 year loss event." |
|||
}, |
|||
{ |
|||
topic: "MCR", |
|||
text: "What happens if an insurer's eligible Own Funds fall below the Minimum Capital Requirement (MCR)?", |
|||
options: [ |
|||
"The insurer must submit a revised ORSA within 30 days", |
|||
"The supervisor may ultimately withdraw the insurer's authorisation", |
|||
"The insurer is placed into an automatic run-off of all existing policies", |
|||
"A mandatory dividend suspension is triggered but operations continue" |
|||
], |
|||
answer: 1, |
|||
explanation: "Breaching the MCR represents the most severe regulatory threshold under Solvency II. If an insurer fails to restore Own Funds above the MCR within a short recovery period, the supervisory authority has the power to withdraw the firm's authorisation to write new business." |
|||
}, |
|||
{ |
|||
topic: "Balance Sheet", |
|||
text: "On the Solvency II balance sheet, the excess of assets over liabilities represents which of the following?", |
|||
options: [ |
|||
"The Solvency Capital Requirement", |
|||
"The Basic Own Funds", |
|||
"The Risk Margin", |
|||
"The Free Surplus" |
|||
], |
|||
answer: 1, |
|||
explanation: "The difference between the market-consistent value of assets and the total of technical provisions plus other liabilities equals the Basic Own Funds. When combined with any Ancillary Own Funds (off-balance-sheet items approved by the supervisor), this gives the total Own Funds available to meet capital requirements." |
|||
}, |
|||
{ |
|||
topic: "Volatility Adjustment", |
|||
text: "What is the primary purpose of the Volatility Adjustment (VA) under Solvency II?", |
|||
options: [ |
|||
"To reflect the insurer's superior asset management skills", |
|||
"To mitigate the effect of exaggerated bond spreads on the valuation of insurance liabilities", |
|||
"To increase the SCR during periods of market stress", |
|||
"To accelerate the convergence of the discount curve to the Ultimate Forward Rate" |
|||
], |
|||
answer: 1, |
|||
explanation: "The Volatility Adjustment is added to the risk-free rate curve to prevent artificial balance-sheet volatility when credit spreads widen beyond levels justified by fundamental default risk. It is particularly relevant for insurers that hold bonds to maturity and whose liabilities are not sensitive to short-term spread movements." |
|||
}, |
|||
{ |
|||
topic: "Matching Adjustment", |
|||
text: "Which condition must be satisfied for an insurer to apply the Matching Adjustment to its discount rate?", |
|||
options: [ |
|||
"The insurer must use an internal model approved by the supervisor", |
|||
"The portfolio of assets must be ring-fenced and assigned to a portfolio of obligations with predictable cash flows", |
|||
"The insurer must demonstrate a Solvency Ratio above 150%", |
|||
"The insurer must exclusively write long-term life business" |
|||
], |
|||
answer: 1, |
|||
explanation: "The Matching Adjustment may be applied when the insurer holds a ring-fenced, assigned portfolio of assets whose cash flows replicate the expected cash flows of the matched liabilities. The obligations must have predictable cash flows (e.g. annuities), and the asset portfolio must be managed separately from other business." |
|||
} |
|||
]; |
|||
/* ── State ───────────────────────────────────────────── */ |
|||
function render() { |
|||
var root = document.getElementById('insurerbrain-module-solvency2-bs'); |
|||
const { tp, ownFunds, mcr, surplus, ratio } = compute(); |
|||
var qArea = root.querySelector('#ib-s2-question-area'); |
|||
const total = data.assets; |
|||
var progText = root.querySelector('#ib-s2-progress-text'); |
|||
const totalLiab = tp + data.scr + Math.max(0, surplus); |
|||
var progBar = root.querySelector('#ib-s2-progress-bar'); |
|||
const ref = Math.max(total, totalLiab, 1); |
|||
var navEl = root.querySelector('#ib-s2-nav'); |
|||
const totalH = 480; |
|||
var btnNext = root.querySelector('#ib-s2-btn-next'); |
|||
const pxPer = totalH / ref; |
|||
var btnRestart = root.querySelector('#ib-s2-btn-restart'); |
|||
var resultsEl = root.querySelector('#ib-s2-results'); |
|||
var currentQ = 0; |
|||
var score = 0; |
|||
var answered = false; |
|||
var userAnswers = []; |
|||
/* ── Render Question ─────────────────────────────────── */ |
|||
// Assets |
|||
function renderQuestion() { |
|||
const ac = document.getElementById('assetsCol'); |
|||
var q = questions[currentQ]; |
|||
ac.innerHTML = ''; |
|||
var keys = ['A', 'B', 'C', 'D']; |
|||
ac.appendChild(makeBlock('assets', 'block-assets', 'Total Assets', 'Market value', '\u20AC' + data.assets + 'bn', totalH)); |
|||
answered = false; |
|||
btnNext.disabled = true; |
|||
btnNext.textContent = currentQ < questions.length - 1 ? 'Next \u2192' : 'See Results'; |
|||
progText.textContent = 'Question ' + (currentQ + 1) + ' / ' + questions.length; |
|||
progBar.style.width = ((currentQ) / questions.length * 100) + '%'; |
|||
var html = '<div class="ib-card ib-animate-in">'; |
|||
// Liabilities |
|||
html += '<div class="ib-q-header">'; |
|||
const lc = document.getElementById('liabCol'); |
|||
html += '<span class="ib-q-number">' + (currentQ + 1) + '</span>'; |
|||
lc.innerHTML = ''; |
|||
html += '<span class="ib-q-topic">' + q.topic + '</span>'; |
|||
html += '</div>'; |
|||
html += '<div class="ib-q-text">' + q.text + '</div>'; |
|||
html += '<div class="ib-options">'; |
|||
for (var i = 0; i < q.options.length; i++) { |
|||
html += '<div class="ib-option" data-idx="' + i + '" role="button" tabindex="0">'; |
|||
html += '<span class="ib-option-key">' + keys[i] + '</span>'; |
|||
html += '<span class="ib-option-text">' + q.options[i] + '</span>'; |
|||
html += '</div>'; |
|||
} |
|||
html += '</div>'; |
|||
html += '<div class="ib-feedback" id="ib-s2-feedback"></div>'; |
|||
html += '</div>'; |
|||
qArea.innerHTML = html; |
|||
var opts = qArea.querySelectorAll('.ib-option'); |
|||
for (var j = 0; j < opts.length; j++) { |
|||
opts[j].addEventListener('click', handleOptionClick); |
|||
opts[j].addEventListener('keydown', function(e) { |
|||
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleOptionClick.call(this, e); } |
|||
}); |
|||
} |
|||
} |
|||
/* ── Handle Answer ───────────────────────────────────── */ |
|||
const belH = Math.max(32, data.bel * pxPer); |
|||
function handleOptionClick() { |
|||
lc.appendChild(makeBlock('bel', 'block-bel', 'Best Estimate Liabilities', 'Discounted expected cash flows', '\u20AC' + data.bel + 'bn', belH)); |
|||
if (answered) return; |
|||
answered = true; |
|||
var idx = parseInt(this.getAttribute('data-idx'), 10); |
|||
var q = questions[currentQ]; |
|||
var isCorrect = idx === q.answer; |
|||
if (isCorrect) score++; |
|||
userAnswers.push({ qIndex: currentQ, chosen: idx, correct: isCorrect }); |
|||
var opts = qArea.querySelectorAll('.ib-option'); |
|||
const rmH = Math.max(26, data.rm * pxPer); |
|||
for (var k = 0; k < opts.length; k++) { |
|||
lc.appendChild(makeBlock('rm', 'block-rm', 'Risk Margin', 'Cost-of-capital provision', '\u20AC' + data.rm + 'bn', rmH)); |
|||
opts[k].classList.add('ib-disabled'); |
|||
if (parseInt(opts[k].getAttribute('data-idx'), 10) === q.answer) { |
|||
opts[k].classList.add('ib-correct-answer'); |
|||
} |
|||
if (parseInt(opts[k].getAttribute('data-idx'), 10) === idx && !isCorrect) { |
|||
opts[k].classList.add('ib-wrong-answer'); |
|||
} |
|||
} |
|||
var fb = qArea.querySelector('#ib-s2-feedback'); |
|||
const scrH = Math.max(40, data.scr * pxPer); |
|||
fb.className = 'ib-feedback ib-show ' + (isCorrect ? 'ib-fb-correct' : 'ib-fb-wrong'); |
|||
const scrBlock = makeBlock('scr', 'block-scr', 'SCR', 'Solvency Capital Req.', '\u20AC' + data.scr + 'bn', scrH); |
|||
fb.innerHTML = '<strong>' + (isCorrect ? '\u2713 Correct' : '\u2717 Incorrect') + '</strong>' |
|||
const mcrBadge = document.createElement('div'); |
|||
+ '<span class="ib-explanation">' + q.explanation + '</span>'; |
|||
mcrBadge.className = 'tier-badge'; |
|||
mcrBadge.textContent = 'MCR \u20AC' + mcr + 'bn'; |
|||
mcrBadge.style.cursor = 'pointer'; |
|||
mcrBadge.dataset.block = 'mcr'; |
|||
mcrBadge.addEventListener('click', function(e) { e.stopPropagation(); showDetail('mcr'); }); |
|||
scrBlock.appendChild(mcrBadge); |
|||
lc.appendChild(scrBlock); |
|||
btnNext.disabled = false; |
|||
if (surplus > 0) { |
|||
const surpH = Math.max(26, surplus * pxPer); |
|||
lc.appendChild(makeBlock('surplus', 'block-surplus', 'Free Surplus', 'Excess own funds', '\u20AC' + surplus + 'bn', surpH)); |
|||
} else if (ownFunds < data.scr) { |
|||
const defBlock = makeBlock('surplus', 'block-deficit', 'Capital Shortfall', 'Own funds < SCR', '\u20AC' + Math.round(data.scr - ownFunds) + 'bn deficit', 32); |
|||
lc.appendChild(defBlock); |
|||
} |
} |
||
/* ── Show Results ────────────────────────────────────── */ |
|||
// Ratio |
|||
function showResults() { |
|||
var rVal = document.getElementById('ratioValue'); |
|||
progBar.style.width = '100%'; |
|||
var rBar = document.getElementById('ratioBar'); |
|||
progText.textContent = 'Completed'; |
|||
qArea.style.display = 'none'; |
|||
navEl.style.display = 'none'; |
|||
resultsEl.style.display = 'block'; |
|||
var pct = Math.round((score / questions.length) * 100); |
|||
// Status |
|||
var circumference = 2 * Math.PI * 42; // r=42 |
|||
var sb = document.getElementById('statusBar'); |
|||
var msg = pct >= 80 ? 'Excellent — you have a strong grasp of the Solvency II balance sheet.' |
|||
var scrOk = ownFunds >= data.scr; |
|||
: pct >= 50 ? 'Good effort. Review the explanations below to strengthen weaker areas.' |
|||
var mcrOk = ownFunds >= mcr; |
|||
: 'Keep studying. The Solvency II economic balance sheet has many nuances worth revisiting.'; |
|||
sb.innerHTML = |
|||
'<div class="status-item"><div class="status-dot ' + (scrOk ? 'ok' : 'fail') + '"></div><span>SCR ' + (scrOk ? 'covered' : 'breached') + '</span></div>' + |
|||
'<div class="status-item"><div class="status-dot ' + (mcrOk ? 'ok' : 'fail') + '"></div><span>MCR ' + (mcrOk ? 'covered' : 'breached') + '</span></div>' + |
|||
'<div class="status-item"><div class="status-dot ' + (ratio >= 150 ? 'ok' : ratio >= 100 ? 'warn' : 'fail') + '"></div><span>Ratio: ' + Math.round(ratio) + '%</span></div>' + |
|||
'<div class="status-item" style="cursor:pointer" onclick="showDetail(\'ownfunds\')"><span style="font-weight:bold">Own Funds: \u20AC' + Math.round(ownFunds) + 'bn</span></div>'; |
|||
var html = '<div class="ib-card ib-animate-in">'; |
|||
// Legend |
|||
html += '<div class="ib-score-ring">'; |
|||
var lg = document.getElementById('legend'); |
|||
html += '<svg viewBox="0 0 100 100"><circle class="ib-ring-bg" cx="50" cy="50" r="42"/>'; |
|||
lg.innerHTML = ''; |
|||
html += '<circle class="ib-ring-fill" id="ib-s2-ring" cx="50" cy="50" r="42"/></svg>'; |
|||
legendItems.forEach(function(l) { |
|||
html += '<div class="ib-score-label"><span class="ib-score-pct">' + pct + '%</span>'; |
|||
var el = document.createElement('div'); |
|||
html += '<span class="ib-score-sub">' + score + ' / ' + questions.length + '</span></div>'; |
|||
el.className = 'legend-item'; |
|||
html += '</div>'; |
|||
el.innerHTML = '<span class="legend-dot" style="background:' + l.color + '"></span>' + l.label; |
|||
html += '<div class="ib-results-msg">' + msg + '</div>'; |
|||
el.onclick = function() { showDetail(l.id); }; |
|||
lg.appendChild(el); |
|||
}); |
|||
} |
|||
html += '<div class="ib-review-list">'; |
|||
function makeBlock(id, cls, label, sublabel, value, height) { |
|||
for (var i = 0; i < userAnswers.length; i++) { |
|||
var el = document.createElement('div'); |
|||
var ua = userAnswers[i]; |
|||
el.className = 'bs-block ' + cls; |
|||
var q = questions[ua.qIndex]; |
|||
el.style.height = height + 'px'; |
|||
html += '<div class="ib-review-item">'; |
|||
el.dataset.block = id; |
|||
html += '<span class="ib-review-icon ' + (ua.correct ? 'ib-ri-correct' : 'ib-ri-wrong') + '">' |
|||
el.innerHTML = |
|||
+ (ua.correct ? '\u2713' : '\u2717') + '</span>'; |
|||
html += '<span>' + q.text + '</span>'; |
|||
html += '</div>'; |
|||
} |
|||
el.addEventListener('mouseenter', function() { showDetail(id); }); |
|||
html += '</div>'; |
|||
el.addEventListener('click', function() { showDetail(id); }); |
|||
html += '<div style="margin-top:1.5rem;">'; |
|||
return el; |
|||
html += '<button class="ib-btn" id="ib-s2-btn-retry">Retake Quiz</button>'; |
|||
} |
|||
html += '</div>'; |
|||
html += '</div>'; |
|||
resultsEl.innerHTML = html; |
|||
function showDetail(id) { |
|||
var info = descriptions[id]; |
|||
if (!info) return; |
|||
document.getElementById('detailTitle').textContent = info.title; |
|||
document.getElementById('detailDesc').textContent = info.desc; |
|||
var fEl = document.getElementById('detailFormula'); |
|||
if (info.formula) { fEl.style.display = 'block'; fEl.textContent = info.formula; } |
|||
else { fEl.style.display = 'none'; } |
|||
document.querySelectorAll('.bs-block').forEach(function(b) { b.classList.remove('active'); }); |
|||
document.querySelectorAll('.bs-block[data-block="' + id + '"]').forEach(function(b) { b.classList.add('active'); }); |
|||
} |
|||
// Animate ring |
|||
function bindSlider(sid, vid, key, suffix) { |
|||
setTimeout(function() { |
|||
var s = document.getElementById(sid); |
|||
var |
var ring = root.querySelector('#ib-s2-ring'); |
||
if (ring) { |
|||
s.addEventListener('input', function() { |
|||
ring.style.strokeDashoffset = circumference - (circumference * pct / 100); |
|||
data[key] = parseInt(s.value); |
|||
} |
|||
v.textContent = suffix ? s.value + suffix : s.value; |
|||
}, 60); |
|||
var retryBtn = resultsEl.querySelector('#ib-s2-btn-retry'); |
|||
if (retryBtn) retryBtn.addEventListener('click', resetQuiz); |
|||
} |
|||
/* ── Reset ───────────────────────────────────────────── */ |
|||
function resetQuiz() { |
|||
currentQ = 0; |
|||
score = 0; |
|||
answered = false; |
|||
userAnswers = []; |
|||
resultsEl.style.display = 'none'; |
|||
resultsEl.innerHTML = ''; |
|||
qArea.style.display = 'block'; |
|||
navEl.style.display = 'flex'; |
|||
btnRestart.style.display = 'none'; |
|||
renderQuestion(); |
|||
} |
|||
/* ── Next Button ─────────────────────────────────────── */ |
|||
btnNext.addEventListener('click', function() { |
|||
if (!answered) return; |
|||
currentQ++; |
|||
if (currentQ >= questions.length) { |
|||
showResults(); |
|||
} else { |
|||
renderQuestion(); |
|||
} |
|||
}); |
}); |
||
} |
|||
btnRestart.addEventListener('click', resetQuiz); |
|||
bindSlider('sliderAssets', 'valAssets', 'assets', ''); |
|||
bindSlider('sliderBEL', 'valBEL', 'bel', ''); |
|||
bindSlider('sliderRM', 'valRM', 'rm', ''); |
|||
bindSlider('sliderSCR', 'valSCR', 'scr', ''); |
|||
bindSlider('sliderMCR', 'valMCR', 'mcrPct', '%'); |
|||
/* ── Init ─────────────────────────────────────────────── */ |
|||
render(); |
|||
renderQuestion(); |
|||
})(); |
|||
</script> |
</script> |
||
</body> |
|||
</ |
</div> |
||
Latest revision as of 10:21, 31 March 2026
<style> /* ── Reset & Container ──────────────────────────────────── */
- insurerbrain-module-solvency2-bs *,
- insurerbrain-module-solvency2-bs *::before,
- insurerbrain-module-solvency2-bs *::after {
box-sizing: border-box; margin: 0; padding: 0;
}
- insurerbrain-module-solvency2-bs {
--ib-accent: #1a5276; --ib-accent-light: #d4e6f1; --ib-correct: #1e8449; --ib-correct-bg: #d5f5e3; --ib-correct-border: #82e0aa; --ib-wrong: #922b21; --ib-wrong-bg: #fadbd8; --ib-wrong-border: #f1948a; --ib-neutral-bg: #f8f9fa; --ib-neutral-border: #c8ccd1; --ib-text: #202122; --ib-text-muted: #54595d; --ib-radius: 4px; --ib-transition: 0.25s ease;
max-width: 52rem; padding: 1.5rem 0; color: var(--ib-text);
}
/* ── Progress Bar ────────────────────────────────────────── */
- insurerbrain-module-solvency2-bs .ib-progress-wrap {
display: flex; align-items: center; gap: 0.75rem; margin-bottom: 1.25rem;
}
- insurerbrain-module-solvency2-bs .ib-progress-label {
white-space: nowrap; color: var(--ib-text-muted); font-size: 0.875em; min-width: 6.5rem;
}
- insurerbrain-module-solvency2-bs .ib-progress-track {
flex: 1; height: 6px; background: var(--ib-neutral-bg); border: 1px solid var(--ib-neutral-border); border-radius: 3px; overflow: hidden;
}
- insurerbrain-module-solvency2-bs .ib-progress-fill {
height: 100%; width: 0%; background: var(--ib-accent); border-radius: 3px; transition: width 0.4s ease;
}
/* ── Question Card ───────────────────────────────────────── */
- insurerbrain-module-solvency2-bs .ib-card {
background: var(--ib-neutral-bg); border: 1px solid var(--ib-neutral-border); border-radius: var(--ib-radius); padding: 1.5rem; margin-bottom: 1rem;
}
- insurerbrain-module-solvency2-bs .ib-q-header {
display: flex; align-items: baseline; gap: 0.5rem; margin-bottom: 1rem;
}
- insurerbrain-module-solvency2-bs .ib-q-number {
display: inline-flex; align-items: center; justify-content: center; min-width: 1.75rem; height: 1.75rem; background: var(--ib-accent); color: #fff; border-radius: 50%; font-size: 0.8em; font-weight: 700; flex-shrink: 0;
}
- insurerbrain-module-solvency2-bs .ib-q-topic {
font-size: 0.8em; color: var(--ib-text-muted); border: 1px solid var(--ib-neutral-border); border-radius: 2px; padding: 0.1rem 0.45rem; margin-left: auto; white-space: nowrap;
}
- insurerbrain-module-solvency2-bs .ib-q-text {
margin-bottom: 1.25rem; line-height: 1.55;
}
/* ── Options ─────────────────────────────────────────────── */
- insurerbrain-module-solvency2-bs .ib-options {
display: flex; flex-direction: column; gap: 0.5rem;
}
- insurerbrain-module-solvency2-bs .ib-option {
display: flex; align-items: flex-start; gap: 0.75rem; padding: 0.75rem 1rem; border: 1px solid var(--ib-neutral-border); border-radius: var(--ib-radius); background: #fff; cursor: pointer; transition: border-color var(--ib-transition), background var(--ib-transition); line-height: 1.45;
}
- insurerbrain-module-solvency2-bs .ib-option:hover:not(.ib-disabled) {
border-color: var(--ib-accent); background: var(--ib-accent-light);
}
- insurerbrain-module-solvency2-bs .ib-option.ib-selected:not(.ib-disabled) {
border-color: var(--ib-accent); background: var(--ib-accent-light);
}
- insurerbrain-module-solvency2-bs .ib-option.ib-disabled {
cursor: default; opacity: 0.85;
}
- insurerbrain-module-solvency2-bs .ib-option.ib-correct-answer {
border-color: var(--ib-correct-border); background: var(--ib-correct-bg); opacity: 1;
}
- insurerbrain-module-solvency2-bs .ib-option.ib-wrong-answer {
border-color: var(--ib-wrong-border); background: var(--ib-wrong-bg); opacity: 1;
}
- insurerbrain-module-solvency2-bs .ib-option-key {
display: inline-flex; align-items: center; justify-content: center; min-width: 1.5rem; height: 1.5rem; border: 1.5px solid var(--ib-neutral-border); border-radius: 50%; font-size: 0.8em; font-weight: 600; flex-shrink: 0; transition: border-color var(--ib-transition), background var(--ib-transition), color var(--ib-transition);
}
- insurerbrain-module-solvency2-bs .ib-option.ib-selected .ib-option-key {
border-color: var(--ib-accent); background: var(--ib-accent); color: #fff;
}
- insurerbrain-module-solvency2-bs .ib-option.ib-correct-answer .ib-option-key {
border-color: var(--ib-correct); background: var(--ib-correct); color: #fff;
}
- insurerbrain-module-solvency2-bs .ib-option.ib-wrong-answer .ib-option-key {
border-color: var(--ib-wrong); background: var(--ib-wrong); color: #fff;
}
- insurerbrain-module-solvency2-bs .ib-option-text {
padding-top: 0.1rem;
}
/* ── Feedback ────────────────────────────────────────────── */
- insurerbrain-module-solvency2-bs .ib-feedback {
margin-top: 1rem; padding: 0.85rem 1rem; border-radius: var(--ib-radius); border-left: 4px solid transparent; line-height: 1.5; display: none;
}
- insurerbrain-module-solvency2-bs .ib-feedback.ib-show {
display: block; animation: ibFadeIn 0.3s ease;
}
- insurerbrain-module-solvency2-bs .ib-feedback.ib-fb-correct {
background: var(--ib-correct-bg); border-left-color: var(--ib-correct); color: var(--ib-correct);
}
- insurerbrain-module-solvency2-bs .ib-feedback.ib-fb-wrong {
background: var(--ib-wrong-bg); border-left-color: var(--ib-wrong); color: var(--ib-wrong);
}
- insurerbrain-module-solvency2-bs .ib-feedback strong {
display: block; margin-bottom: 0.25rem;
}
- insurerbrain-module-solvency2-bs .ib-feedback .ib-explanation {
color: var(--ib-text); font-size: 0.92em;
}
/* ── Navigation ──────────────────────────────────────────── */
- insurerbrain-module-solvency2-bs .ib-nav {
display: flex; justify-content: flex-end; gap: 0.5rem; margin-top: 1rem;
}
- insurerbrain-module-solvency2-bs .ib-btn {
padding: 0.55rem 1.25rem; border: 1px solid var(--ib-accent); border-radius: var(--ib-radius); background: var(--ib-accent); color: #fff; font-size: 0.9em; font-weight: 600; cursor: pointer; transition: opacity var(--ib-transition);
}
- insurerbrain-module-solvency2-bs .ib-btn:hover {
opacity: 0.85;
}
- insurerbrain-module-solvency2-bs .ib-btn:disabled {
opacity: 0.4; cursor: default;
}
- insurerbrain-module-solvency2-bs .ib-btn-outline {
background: transparent; color: var(--ib-accent);
}
/* ── Results Screen ──────────────────────────────────────── */
- insurerbrain-module-solvency2-bs .ib-results {
text-align: center; padding: 2rem 1rem;
}
- insurerbrain-module-solvency2-bs .ib-score-ring {
position: relative; width: 9rem; height: 9rem; margin: 0 auto 1.5rem;
}
- insurerbrain-module-solvency2-bs .ib-score-ring svg {
transform: rotate(-90deg); width: 100%; height: 100%;
}
- insurerbrain-module-solvency2-bs .ib-score-ring circle {
fill: none; stroke-width: 8;
}
- insurerbrain-module-solvency2-bs .ib-ring-bg {
stroke: var(--ib-neutral-border);
}
- insurerbrain-module-solvency2-bs .ib-ring-fill {
stroke: var(--ib-correct); stroke-linecap: round; stroke-dasharray: 264; stroke-dashoffset: 264; transition: stroke-dashoffset 1s ease;
}
- insurerbrain-module-solvency2-bs .ib-score-label {
position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center;
}
- insurerbrain-module-solvency2-bs .ib-score-pct {
font-size: 2rem; font-weight: 700; color: var(--ib-text);
}
- insurerbrain-module-solvency2-bs .ib-score-sub {
font-size: 0.85em; color: var(--ib-text-muted);
}
- insurerbrain-module-solvency2-bs .ib-results-msg {
margin-bottom: 1.5rem; color: var(--ib-text-muted); line-height: 1.5;
}
- insurerbrain-module-solvency2-bs .ib-review-list {
text-align: left; margin-top: 1.5rem;
}
- insurerbrain-module-solvency2-bs .ib-review-item {
display: flex; align-items: flex-start; gap: 0.6rem; padding: 0.65rem 0; border-bottom: 1px solid var(--ib-neutral-border); font-size: 0.92em; line-height: 1.45;
}
- insurerbrain-module-solvency2-bs .ib-review-icon {
flex-shrink: 0; width: 1.25rem; height: 1.25rem; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 0.7em; font-weight: 700; color: #fff; margin-top: 0.15rem;
}
- insurerbrain-module-solvency2-bs .ib-review-icon.ib-ri-correct {
background: var(--ib-correct);
}
- insurerbrain-module-solvency2-bs .ib-review-icon.ib-ri-wrong {
background: var(--ib-wrong);
}
/* ── Animation ───────────────────────────────────────────── */ @keyframes ibFadeIn {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
- insurerbrain-module-solvency2-bs .ib-animate-in {
animation: ibFadeIn 0.3s ease;
}
/* ── Responsive ──────────────────────────────────────────── */ @media (max-width: 480px) {
#insurerbrain-module-solvency2-bs .ib-card {
padding: 1rem;
}
#insurerbrain-module-solvency2-bs .ib-option {
padding: 0.6rem 0.75rem;
}
#insurerbrain-module-solvency2-bs .ib-q-topic {
display: none;
}
} </style>
Question 1 / 10
<script> (function() {
/* ── Question Bank ───────────────────────────────────── */
var questions = [
{
topic: "Valuation",
text: "Under Solvency II, how must an insurer's assets be valued on the economic balance sheet?",
options: [
"At historical cost, consistent with IFRS 9",
"At market-consistent (fair) value, using quoted market prices where available",
"At the lower of cost and net realisable value",
"At amortised cost with an impairment overlay"
],
answer: 1,
explanation: "Solvency II requires a market-consistent valuation framework. Assets must be valued at the amount for which they could be exchanged between knowledgeable, willing parties in an arm's-length transaction — effectively fair value, with quoted market prices used where an active market exists."
},
{
topic: "Technical Provisions",
text: "Technical provisions under Solvency II are equal to the sum of which two components?",
options: [
"Unearned Premium Reserve + Claims Outstanding Reserve",
"Best Estimate Liability (BEL) + Risk Margin",
"Solvency Capital Requirement + Risk Margin",
"Best Estimate Liability (BEL) + Matching Adjustment"
],
answer: 1,
explanation: "Article 77 of the Solvency II Directive defines technical provisions as the sum of the Best Estimate Liability (BEL) — a probability-weighted average of future cash flows discounted using the risk-free rate term structure — and the Risk Margin, which represents the cost of holding capital to run off the obligations."
},
{
topic: "Risk Margin",
text: "What does the Risk Margin in Solvency II conceptually represent?",
options: [
"A buffer to protect against adverse reserve development",
"The cost-of-capital that a reference undertaking would require to take over and run off the insurance obligations",
"A regulatory add-on calibrated at the 99.5% VaR over one year",
"The expected profit embedded in future premiums"
],
answer: 1,
explanation: "The Risk Margin is calculated using a cost-of-capital approach. It represents the cost a hypothetical reference undertaking would charge — above the Best Estimate — for holding the Solvency Capital Requirement needed to support the obligations until they are fully run off."
},
{
topic: "Discount Rate",
text: "Which rate curve is prescribed for discounting the Best Estimate Liability under Solvency II?",
options: [
"The insurer's own investment return assumptions",
"Government bond yields of the currency of the obligation",
"The risk-free interest rate term structure published by EIOPA",
"The swap rate plus a fixed credit spread"
],
answer: 2,
explanation: "EIOPA publishes the relevant risk-free interest rate term structure each month. It is derived primarily from swap rates, adjusted to remove the credit risk component (Credit Risk Adjustment), and extrapolated beyond the Last Liquid Point toward an Ultimate Forward Rate."
},
{
topic: "Own Funds",
text: "Under Solvency II, 'Own Funds' that can cover the SCR are classified into how many quality tiers?",
options: [
"Two tiers",
"Three tiers",
"Four tiers",
"Five tiers"
],
answer: 1,
explanation: "Own Funds are classified into three tiers based on their quality — primarily their permanence and loss-absorption capacity. Tier 1 is the highest quality (e.g. ordinary share capital, retained earnings), Tier 2 includes items like subordinated liabilities, and Tier 3 captures lower-quality items such as net deferred tax assets."
},
{
topic: "SCR",
text: "The Solvency Capital Requirement (SCR) under the Standard Formula is calibrated to which confidence level over which time horizon?",
options: [
"95.0% Value-at-Risk over a one-year period",
"99.0% Value-at-Risk over a run-off period",
"99.5% Value-at-Risk over a one-year period",
"99.5% Tail Value-at-Risk over a one-year period"
],
answer: 2,
explanation: "The SCR corresponds to the Value-at-Risk of Basic Own Funds at a 99.5% confidence level over a one-year time horizon. This means the insurer should hold enough capital to survive a 1-in-200 year loss event."
},
{
topic: "MCR",
text: "What happens if an insurer's eligible Own Funds fall below the Minimum Capital Requirement (MCR)?",
options: [
"The insurer must submit a revised ORSA within 30 days",
"The supervisor may ultimately withdraw the insurer's authorisation",
"The insurer is placed into an automatic run-off of all existing policies",
"A mandatory dividend suspension is triggered but operations continue"
],
answer: 1,
explanation: "Breaching the MCR represents the most severe regulatory threshold under Solvency II. If an insurer fails to restore Own Funds above the MCR within a short recovery period, the supervisory authority has the power to withdraw the firm's authorisation to write new business."
},
{
topic: "Balance Sheet",
text: "On the Solvency II balance sheet, the excess of assets over liabilities represents which of the following?",
options: [
"The Solvency Capital Requirement",
"The Basic Own Funds",
"The Risk Margin",
"The Free Surplus"
],
answer: 1,
explanation: "The difference between the market-consistent value of assets and the total of technical provisions plus other liabilities equals the Basic Own Funds. When combined with any Ancillary Own Funds (off-balance-sheet items approved by the supervisor), this gives the total Own Funds available to meet capital requirements."
},
{
topic: "Volatility Adjustment",
text: "What is the primary purpose of the Volatility Adjustment (VA) under Solvency II?",
options: [
"To reflect the insurer's superior asset management skills",
"To mitigate the effect of exaggerated bond spreads on the valuation of insurance liabilities",
"To increase the SCR during periods of market stress",
"To accelerate the convergence of the discount curve to the Ultimate Forward Rate"
],
answer: 1,
explanation: "The Volatility Adjustment is added to the risk-free rate curve to prevent artificial balance-sheet volatility when credit spreads widen beyond levels justified by fundamental default risk. It is particularly relevant for insurers that hold bonds to maturity and whose liabilities are not sensitive to short-term spread movements."
},
{
topic: "Matching Adjustment",
text: "Which condition must be satisfied for an insurer to apply the Matching Adjustment to its discount rate?",
options: [
"The insurer must use an internal model approved by the supervisor",
"The portfolio of assets must be ring-fenced and assigned to a portfolio of obligations with predictable cash flows",
"The insurer must demonstrate a Solvency Ratio above 150%",
"The insurer must exclusively write long-term life business"
],
answer: 1,
explanation: "The Matching Adjustment may be applied when the insurer holds a ring-fenced, assigned portfolio of assets whose cash flows replicate the expected cash flows of the matched liabilities. The obligations must have predictable cash flows (e.g. annuities), and the asset portfolio must be managed separately from other business."
}
];
/* ── State ───────────────────────────────────────────── */
var root = document.getElementById('insurerbrain-module-solvency2-bs');
var qArea = root.querySelector('#ib-s2-question-area');
var progText = root.querySelector('#ib-s2-progress-text');
var progBar = root.querySelector('#ib-s2-progress-bar');
var navEl = root.querySelector('#ib-s2-nav');
var btnNext = root.querySelector('#ib-s2-btn-next');
var btnRestart = root.querySelector('#ib-s2-btn-restart');
var resultsEl = root.querySelector('#ib-s2-results');
var currentQ = 0;
var score = 0;
var answered = false;
var userAnswers = [];
/* ── Render Question ─────────────────────────────────── */
function renderQuestion() {
var q = questions[currentQ];
var keys = ['A', 'B', 'C', 'D'];
answered = false;
btnNext.disabled = true;
btnNext.textContent = currentQ < questions.length - 1 ? 'Next \u2192' : 'See Results';
progText.textContent = 'Question ' + (currentQ + 1) + ' / ' + questions.length;
progBar.style.width = ((currentQ) / questions.length * 100) + '%';
var html = 'html += '' + (currentQ + 1) + ''; html += '' + q.topic + '';html += '
qArea.innerHTML = html;
var opts = qArea.querySelectorAll('.ib-option');
for (var j = 0; j < opts.length; j++) {
opts[j].addEventListener('click', handleOptionClick);
opts[j].addEventListener('keydown', function(e) {
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleOptionClick.call(this, e); }
});
}
}
/* ── Handle Answer ───────────────────────────────────── */
function handleOptionClick() {
if (answered) return;
answered = true;
var idx = parseInt(this.getAttribute('data-idx'), 10);
var q = questions[currentQ];
var isCorrect = idx === q.answer;
if (isCorrect) score++;
userAnswers.push({ qIndex: currentQ, chosen: idx, correct: isCorrect });
var opts = qArea.querySelectorAll('.ib-option');
for (var k = 0; k < opts.length; k++) {
opts[k].classList.add('ib-disabled');
if (parseInt(opts[k].getAttribute('data-idx'), 10) === q.answer) {
opts[k].classList.add('ib-correct-answer');
}
if (parseInt(opts[k].getAttribute('data-idx'), 10) === idx && !isCorrect) {
opts[k].classList.add('ib-wrong-answer');
}
}
var fb = qArea.querySelector('#ib-s2-feedback');
fb.className = 'ib-feedback ib-show ' + (isCorrect ? 'ib-fb-correct' : 'ib-fb-wrong');
fb.innerHTML = '' + (isCorrect ? '\u2713 Correct' : '\u2717 Incorrect') + ''
+ '' + q.explanation + '';
btnNext.disabled = false; }
/* ── Show Results ────────────────────────────────────── */
function showResults() {
progBar.style.width = '100%';
progText.textContent = 'Completed';
qArea.style.display = 'none';
navEl.style.display = 'none';
resultsEl.style.display = 'block';
var pct = Math.round((score / questions.length) * 100);
var circumference = 2 * Math.PI * 42; // r=42
var msg = pct >= 80 ? 'Excellent — you have a strong grasp of the Solvency II balance sheet.'
: pct >= 50 ? 'Good effort. Review the explanations below to strengthen weaker areas.'
: 'Keep studying. The Solvency II economic balance sheet has many nuances worth revisiting.';
var html = 'html += '<svg viewBox="0 0 100 100"><circle class="ib-ring-bg" cx="50" cy="50" r="42"/>'; html += '<circle class="ib-ring-fill" id="ib-s2-ring" cx="50" cy="50" r="42"/></svg>';html += '
for (var i = 0; i < userAnswers.length; i++) {
var ua = userAnswers[i];
var q = questions[ua.qIndex];
html += 'html += ''; html += '' + q.text + '';html += '
}html += '
html += '<button class="ib-btn" id="ib-s2-btn-retry">Retake Quiz</button>';html += '
resultsEl.innerHTML = html;
// Animate ring
setTimeout(function() {
var ring = root.querySelector('#ib-s2-ring');
if (ring) {
ring.style.strokeDashoffset = circumference - (circumference * pct / 100);
}
}, 60);
var retryBtn = resultsEl.querySelector('#ib-s2-btn-retry');
if (retryBtn) retryBtn.addEventListener('click', resetQuiz);
}
/* ── Reset ───────────────────────────────────────────── */
function resetQuiz() {
currentQ = 0;
score = 0;
answered = false;
userAnswers = [];
resultsEl.style.display = 'none';
resultsEl.innerHTML = ;
qArea.style.display = 'block';
navEl.style.display = 'flex';
btnRestart.style.display = 'none';
renderQuestion();
}
/* ── Next Button ─────────────────────────────────────── */
btnNext.addEventListener('click', function() {
if (!answered) return;
currentQ++;
if (currentQ >= questions.length) {
showResults();
} else {
renderQuestion();
}
});
btnRestart.addEventListener('click', resetQuiz);
/* ── Init ─────────────────────────────────────────────── */ renderQuestion();
})(); </script>