Iframe-teman
Chastify skickar temainformation till iframe-tillägg så att ditt användargränssnitt kan matcha låssidan där det är inbäddat.
Anta inte att användaren använder ett mörkt tema. Ditt tillägg kan öppnas i ljusa, mörka, anpassade, genomskinliga och högkontrastteman.
Det säkraste standardvärdet är att behandla iframe-nyttolasten ui som sanningskälla för sidbakgrund, textfärg och kantfärg, och sedan härleda dina egna läsbara paneler och märken från ui.isDark.
Tema nyttolast
När Chastify öppnar din iframe lägger den till en URI-kodad JSON-nyttolast till location.hash.
Nyttolasten inkluderar ui:
{
"bridge": {
"v": 1,
"nonce": "request-nonce",
"parentOrigin": "https://chastify.net"
},
"sessionId": "extension-session-id",
"lockId": "lock-id",
"ui": {
"isDark": true,
"bg": "rgb(10, 10, 10)",
"text": "#e5e7eb",
"border": "#27272a"
}
}
Fältbetydelser:
ui.isDark: om värdsidan för närvarande använder ett mörkt tema.ui.bg: bakgrund för sidan/ytan från värden. Detta kan vara en färg eller en komplex CSS-bakgrund.ui.text: primär läsbar textfärg.ui.border: kantfärg som matchar värdtemat.
ui.bg kan vara en fullständig CSS-bakgrundssträng, inte bara en hexagonal färg. Använd den som ett CSS background-värde, inte som ett värde du analyserar manuellt.
Analysera hashen
type ChastifyThemePayload = {
ui?: {
isDark?: boolean;
bg?: string;
text?: string;
border?: string;
};
};
export function parseHashPayload(): ChastifyThemePayload | null {
const raw = window.location.hash.startsWith("#")
? window.location.hash.slice(1)
: window.location.hash;
if (!raw) return null;
try {
return JSON.parse(decodeURIComponent(raw));
} catch {
return null;
}
}
Minimala CSS-variabler
Konvertera nyttolasten till CSS-variabler vid uppstart:
const payload = parseHashPayload();
const ui = payload?.ui ?? {};
const isDark = ui.isDark !== false;
document.documentElement.style.setProperty("--chastify-bg", ui.bg || (isDark ? "#040711" : "#f8fafc"));
document.documentElement.style.setProperty("--chastify-text", ui.text || (isDark ? "#e5e7eb" : "#0f172a"));
document.documentElement.style.setProperty("--chastify-border", ui.border || (isDark ? "#27272a" : "#e2e8f0"));
document.documentElement.dataset.themeMode = isDark ? "dark" : "light";
Använd dessa variabler i ditt app-skal:
html,
body,
#root {
min-height: 100%;
margin: 0;
}
body {
background: var(--chastify-bg);
color: var(--chastify-text);
}
.panel {
border: 1px solid var(--chastify-border);
}
Reagera exempel
import { useMemo } from "react";
function getTheme(payload: any) {
const ui = payload?.ui ?? {};
const isDark = ui.isDark !== false;
return {
isDark,
pageStyle: {
background: ui.bg || (isDark ? "#040711" : "#f8fafc"),
color: ui.text || (isDark ? "#e5e7eb" : "#0f172a"),
} satisfies React.CSSProperties,
panelClass: isDark
? "border-white/10 bg-black/35 text-slate-100"
: "border-slate-200 bg-white/85 text-slate-950 shadow-sm",
mutedClass: isDark ? "text-slate-400" : "text-slate-600",
badgeClass: isDark
? "bg-sky-400/15 text-sky-200"
: "bg-sky-50 text-sky-900 ring-1 ring-sky-200",
};
}
export function ExtensionApp({ payload }: { payload: any }) {
const theme = useMemo(() => getTheme(payload), [payload]);
return (
<main style={theme.pageStyle} className="min-h-screen p-4">
<section className={`rounded-2xl border p-4 ${theme.panelClass}`}>
<h1 className="text-xl font-bold">My Extension</h1>
<p className={`mt-2 text-sm ${theme.mutedClass}`}>
This text stays readable on light and dark Chastify themes.
</p>
<span className={`mt-3 inline-flex rounded-full px-3 py-1 text-xs font-semibold ${theme.badgeClass}`}>
Connected
</span>
</section>
</main>
);
}
Medvindsmönster
Om du använder Tailwind, förgrena dig från ui.isDark för varje yta som innehåller text.
const isDarkTheme = payload?.ui?.isDark !== false;
const panelClass = isDarkTheme
? "border-white/10 bg-black/30 text-slate-100"
: "border-slate-200 bg-white/85 text-slate-950 shadow-sm";
const successClass = isDarkTheme
? "border-emerald-300/20 bg-emerald-400/10 text-emerald-100"
: "border-emerald-500/25 bg-emerald-50 text-emerald-950";
const errorClass = isDarkTheme
? "border-rose-300/20 bg-rose-400/10 text-rose-100"
: "border-rose-500/25 bg-rose-50 text-rose-950";
Använd de valda klasserna där texten renderas:
<div className={`rounded-xl border px-3 py-2 text-sm ${result.ok ? successClass : errorClass}`}>
<div className="font-semibold">{result.title}</div>
<div className="mt-1 opacity-85">{result.message}</div>
</div>
Uppdateringar av live-tema
Föräldern kan skicka live-temauppdateringar medan din iframe är öppen:
type UiUpdateMessage = {
type: "chastify:ext:ui";
v: 1;
nonce: string;
ui: {
isDark?: boolean;
bg?: string;
text?: string;
border?: string;
};
};
Lyssna efter meddelandet och verifiera noncen:
const nonce = payload.bridge.nonce;
const parentOrigin = payload.bridge.parentOrigin;
window.addEventListener("message", (event) => {
if (event.origin !== parentOrigin) return;
const msg = event.data as Partial<UiUpdateMessage>;
if (msg.type !== "chastify:ext:ui" || msg.v !== 1) return;
if (msg.nonce !== nonce) return;
applyTheme(msg.ui);
});
Vanliga misstag
- Hårdkodning av
text-whiteeller blekatext-*-100inuti kort utan ett alternativ med ljust tema. - Styla sidans bakgrund men glöm kapslade kort, märken, framstegsringar och resultatflöden.
- Behandlar
ui.bgsom en enkel hexagonal färg. Det kan vara en gradient eller en webbläsarnormaliserad CSS-bakgrundssträng. - Använder inbyggda formulärkontroller utan att ställa in både bakgrunds- och textfärg. Valda alternativ kan bli oläsliga i mörka teman.
- Förutsatt att en iframe-omladdning behövs för temaändringar. Lyssna efter
chastify:ext:uiom du vill ha liveuppdateringar.
Temadata är endast presentationsdata. Använd den inte för auktorisering, förtroendebeslut, upplåsningslogik, belöningar, straff eller identitet för backend-sessioner.
Checklista
Innan du publicerar ditt iframe-tillägg:
- Testa ljustema.
- Testa mörkt tema.
- Testa ett anpassat tema om det är tillgängligt.
- Kontrollera att alla kort, knappar, märken, formulärkontroller, förloppsringar och resultatmeddelanden har läsbar kontrast.
- Kontrollera att texten fortfarande får plats på mobilen.
- Verifiera att iframe-storleken ändras automatiskt efter tema- eller innehållsändringar.
Nästa: Iframe Quickstart eller API-exempel.