Deep visual host, clean widget inside.
This page is intentionally overloaded with gradients, shadows and layered backgrounds so you can verify that the widget remains visually isolated in Shadow DOM and still looks good when embedded into a chaotic third-party layout.
1. Jaki element osadzić
Umieść na stronie pusty kontener <div id="otc-widget"> w miejscu,
gdzie ma się pojawić widget. To jedyny element HTML, który musisz dodać. Widget renderuje
się wewnątrz Shadow DOM, więc nie przejmuje ani nie zanieczyszcza
stylów strony hosta.
<div id="otc-widget" data-api-key="TWOJ_API_KEY" data-api-base="https://widget.imagine.usermd.net" data-lang="pl" data-default-crypto-symbol="ETH" data-default-fiat-symbol="PLN" data-default-type="ONRAMP" data-default-from-amount="" ></div>
2. Jaki kod doklejić
Wczytaj skrypt widgetu jako type="module" na końcu strony (przed
</body>). Skrypt sam odnajduje kontener #otc-widget,
odczytuje z niego atrybuty data-* i montuje komponent.
<script type="module" src="https://widget.imagine.usermd.net/otc-widget.js" ></script>
Opcjonalnie nasłuchuj zdarzenia otc-start na window, aby
obsłużyć potwierdzenie zlecenia we własnym przepływie (np. SPA bez przeładowania strony):
window.addEventListener('otc-start', (e) => {
const {
offerRequestId, // ID utworzonego zlecenia
redirectUrl, // docelowy URL (widget i tak tam przekieruje)
direction, // 'ONRAMP' | 'OFFRAMP'
crypto, // { symbol, network }
fiat, // { symbol }
} = e.detail;
console.log('otc-start', offerRequestId, redirectUrl);
});
Atrybuty konfiguracyjne data-*
| Atrybut | Wymagany | Opis |
|---|---|---|
data-api-key |
tak | Klucz API tenanta. Bez niego widget się nie zamontuje. |
data-api-base |
nie | Adres bazowy API. Domyślnie https://widget.imagine.usermd.net. |
data-lang |
nie | Język interfejsu. Domyślnie pl. |
data-default-crypto-symbol |
nie | Wstępnie wybrana kryptowaluta, np. ETH, BTC. |
data-default-fiat-symbol |
nie | Wstępnie wybrana waluta fiat, np. PLN, EUR. |
data-default-type |
nie | Tryb startowy: ONRAMP (kupno) lub OFFRAMP (sprzedaż). Domyślnie ONRAMP. |
data-default-from-amount |
nie | Wstępnie wpisana kwota w polu źródłowym. |
Wygląd widgetu sterowany jest zmiennymi CSS (CSS Custom Properties) w dwóch warstwach:
prymitywów (bazowe kolory, zaokrąglenia, cienie) oraz
komponentów (tokeny per element UI, domyślnie wskazujące na prymitywy
przez var()). Tokeny pochodzą z tabeli theme_tokens i są
dostarczane przez endpoint /api/widget-config. Widget aplikuje je jako
właściwości :host { … } wewnątrz Shadow DOM — zmiana motywu nie wpływa na
stronę hosta.
theme_tokens dla
danego tenanta. Zmiany są pobierane przy następnym załadowaniu widgetu — bez deploymentu.
UPDATE theme_tokens SET value = '#FF6B00' WHERE tenant_id = 1 AND token = '--otc-color-accent'; INSERT INTO theme_tokens (tenant_id, token, value) VALUES (1, '--otc-btn-primary-radius', '999px');
Warstwa 1 — Prymitywy
| Token | Domyślna wartość | Opis |
|---|---|---|
--otc-font | Inter, system-ui, sans-serif | Font dla całego widgetu |
--otc-radius-xl | 16px | Bardzo duże zaokrąglenie — karta widgetu |
--otc-radius-lg | 12px | Duże zaokrąglenie — przyciski, inputy, zakładki |
--otc-radius-md | 8px | Średnie zaokrąglenie — elementy select |
--otc-radius-sm | 6px | Małe zaokrąglenie — elementy wewnętrzne |
--otc-shadow-card | 0px 34px 100px -16px rgba(25,27,59,.1) | Cień głównej karty |
--otc-shadow-sm | 0px 1px 2px rgba(0,0,0,.05) | Mały cień elementów wewnętrznych |
--otc-color-primary | #0F112B | Główny kolor ciemny (tła aktywne, obramowania, tekst) |
--otc-color-primary-hover | #1a1f45 | Wariant hover koloru primary |
--otc-color-accent | #FABB20 | Kolor akcentowy — CTA, aktywne elementy |
--otc-color-accent-hover | #f5ab00 | Wariant hover koloru accent |
--otc-color-white | #FFFFFF | Biały — tła kart i przycisków |
--otc-color-surface | #F1F5F9 | Jasne tło — inputy, zakładki, hover |
--otc-color-border | #E2E8F0 | Obramowania w stanie spoczynku |
--otc-color-text-primary | #0F112B | Główny kolor tekstu |
--otc-color-text-secondary | #45556C | Tekst pomocniczy (etykiety, opisy) |
--otc-color-text-muted | #62748E | Tekst wyciszony (placeholdery, podpisy) |
--otc-color-success | #16A34A | Kolor sukcesu |
--otc-color-info | #2563EB | Kolor informacji |
--otc-color-warning | #A15110 | Kolor ostrzeżenia |
--otc-color-error | #DC2626 | Kolor błędu |
Każdy kolor semantyczny ma także warianty -bg (tło alertu) oraz
-text (tekst alertu), np. --otc-color-success-bg,
--otc-color-success-text.
Warstwa 2 — Komponenty
| Grupa | Przykładowe tokeny |
|---|---|
| Karta widgetu | --otc-card-bg, --otc-card-border, --otc-card-shadow, --otc-card-radius, --otc-card-padding |
| Typografia | --otc-text-primary, --otc-text-secondary, --otc-text-muted |
| Przycisk CTA | --otc-btn-primary-bg, --otc-btn-primary-bg-hover, --otc-btn-primary-text, --otc-btn-primary-radius, --otc-btn-primary-font-weight |
| Przycisk outline | --otc-btn-secondary-bg, --otc-btn-secondary-border, --otc-btn-secondary-text, --otc-btn-secondary-radius |
| Input | --otc-input-bg, --otc-input-bg-focus, --otc-input-border-focus, --otc-input-text, --otc-input-label, --otc-input-placeholder, --otc-input-radius |
| Select | --otc-select-bg, --otc-select-bg-hover, --otc-select-border-focus, --otc-select-text, --otc-select-radius |
| Badge waluty | --otc-currency-select-bg, --otc-currency-select-border-focus, --otc-currency-select-text, --otc-currency-select-radius |
| Zakładki ONRAMP/OFFRAMP | --otc-tab-container-bg, --otc-tab-active-bg, --otc-tab-active-border, --otc-tab-active-text, --otc-tab-inactive-text, --otc-tab-radius |
| Karty metod płatności | --otc-method-bg, --otc-method-bg-hover, --otc-method-border-active, --otc-method-text, --otc-method-radius |
| Kafelki punktów | --otc-office-bg, --otc-office-bg-active, --otc-office-border-active, --otc-office-text-active, --otc-office-radius |
| Selektor języka | --otc-lang-bg, --otc-lang-border, --otc-lang-text, --otc-lang-radius |
| Alerty i bannery | --otc-alert-success-bg, --otc-alert-info-bg, --otc-alert-warning-bg, --otc-alert-error-bg, --otc-alert-radius |
Przykład — pełna personalizacja
-- Ciemny motyw UPDATE theme_tokens SET value = '#0D0D0D' WHERE token = '--otc-color-primary'; UPDATE theme_tokens SET value = '#FF6B00' WHERE token = '--otc-color-accent'; UPDATE theme_tokens SET value = '#1A1A1A' WHERE token = '--otc-card-bg'; UPDATE theme_tokens SET value = '#2A2A2A' WHERE token = '--otc-input-bg'; UPDATE theme_tokens SET value = '#EEEEEE' WHERE token = '--otc-color-text-primary'; -- Zaokrąglone (pill) przyciski UPDATE theme_tokens SET value = '999px' WHERE token = '--otc-btn-primary-radius'; UPDATE theme_tokens SET value = '999px' WHERE token = '--otc-btn-secondary-radius';
Integration
Load the widget bundle with type="module" and pass your data-api-key.
Listen for otc-start on window to redirect or open a transaction page.
Behavior
On-Ramp shows fiat → crypto. Off-Ramp shows crypto → fiat.
Notes
- Use hard refresh after changes.
- Keep the widget bundle small.
- Prefer CSS variables for theming.