/* global React */
const { useState, useEffect, useRef, useMemo } = React;
/* ─── Stamp ─────────────────────────────────────────────────────── */
function Stamp({ children, ink }) {
return {children};
}
/* ─── Art-chip (instrument badge) ───────────────────────────────── */
function ArtChip({ code, tone = "red", title }) {
const cls = "art-chip" + (tone === "blue" ? " is-blue" : tone === "amber" ? " is-amber" : "");
return {code};
}
/* ─── Redact span ───────────────────────────────────────────────── */
function Redact({ children, len }) {
// render fixed-width blocks if `len` is passed; otherwise show children styled as bar
const text = len ? "█".repeat(len) : (children || "████");
return {text};
}
/* ─── Cite chip (richer) ─────────────────────────────────────────── */
function CiteChip({ n, active, onClick }) {
return (
{n}
);
}
/* ─── Topbar with case-number ───────────────────────────────────── */
function Topbar({ caseNo, status }) {
return (
Do Better Norge · tools.dobetternorge.no
Legal Tools · Case Workbench
{caseNo}·session in memory · nothing stored
ECHR Art. 8 monitoring{status}
);
}
/* ─── Manifesto strip — replaces vanilla disclaimer with a headline + stats */
function Manifesto({ headline, stats, intensity }) {
return (
{headline.eyebrow}
{headline.title}
{headline.sub}
{stats.echrViolations}
ECHR violations since 2015
{stats.echrLossRate}%
cases lost 2017–22
{stats.tribunalDecisions.toLocaleString()}
tribunal decisions analysed
{stats.pendingStrasbourg}+
pending Strasbourg
);
}
/* ─── Disclaimer (kept, but reskinned amber) ────────────────────── */
function Disclaimer() {
return (
Notice.
Legal information and preparation support, not final legal advice. Pasted text is processed in memory by default
under ECHR Art. 8 and Norwegian Personopplysningsloven principles.