// Shared small components used across styles
const Redact = ({ w = 60, children }) => (
{children || "\u00A0"}
);
const Stamp = ({ text = "CONFIDENTIAL", color = "#8b0000", rot = -6, size = 1 }) => (
{text}
);
const FileNumber = ({ id, prefix = "FILE №" }) => (
{prefix} {id}
);
// crosshair / target marker
const Crosshair = ({ size = 14, color = "#8b0000" }) => (
);
// Credibility pips
const Credibility = ({ n, color = "#8b0000" }) => (
{[1,2,3,4,5].map(i => (
●
))}
);
// placeholder imagery — distressed gradient with file-folder tone
const EvidencePlaceholder = ({ label = "EVIDENCE", caseId, seed = 1, variant = "kraft" }) => {
const tints = {
kraft: ["#3a2e1c", "#1a1410"],
paper: ["#c9bda0", "#a89b78"],
dark: ["#1a1816", "#070605"],
red: ["#2a0808", "#0a0202"],
};
const [a, b] = tints[variant] || tints.kraft;
// pseudorandom streaks
const streaks = Array.from({ length: 7 }).map((_, i) => ({
y: ((seed * 37 + i * 13) % 90) + 5,
w: 20 + ((seed * 11 + i * 7) % 60),
o: 0.05 + (((seed + i) % 5) * 0.03),
}));
return (
{/* corner markers */}
+ {label}
{caseId}
[photo redacted]
+
{/* center small crosshair */}
);
};
Object.assign(window, { Redact, Stamp, FileNumber, Crosshair, Credibility, EvidencePlaceholder });