⚡ OTC flow playground

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.

📦 Dokumentacja integracyjna

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-*

AtrybutWymaganyOpis
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.
🎨 Konfiguracja CSS — tokeny motywu

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.

Aby nadpisać motyw, zaktualizuj lub wstaw wiersz w tabeli 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

TokenDomyślna wartośćOpis
--otc-fontInter, system-ui, sans-serifFont dla całego widgetu
--otc-radius-xl16pxBardzo duże zaokrąglenie — karta widgetu
--otc-radius-lg12pxDuże zaokrąglenie — przyciski, inputy, zakładki
--otc-radius-md8pxŚrednie zaokrąglenie — elementy select
--otc-radius-sm6pxMałe zaokrąglenie — elementy wewnętrzne
--otc-shadow-card0px 34px 100px -16px rgba(25,27,59,.1)Cień głównej karty
--otc-shadow-sm0px 1px 2px rgba(0,0,0,.05)Mały cień elementów wewnętrznych
--otc-color-primary#0F112BGłówny kolor ciemny (tła aktywne, obramowania, tekst)
--otc-color-primary-hover#1a1f45Wariant hover koloru primary
--otc-color-accent#FABB20Kolor akcentowy — CTA, aktywne elementy
--otc-color-accent-hover#f5ab00Wariant hover koloru accent
--otc-color-white#FFFFFFBiały — tła kart i przycisków
--otc-color-surface#F1F5F9Jasne tło — inputy, zakładki, hover
--otc-color-border#E2E8F0Obramowania w stanie spoczynku
--otc-color-text-primary#0F112BGłówny kolor tekstu
--otc-color-text-secondary#45556CTekst pomocniczy (etykiety, opisy)
--otc-color-text-muted#62748ETekst wyciszony (placeholdery, podpisy)
--otc-color-success#16A34AKolor sukcesu
--otc-color-info#2563EBKolor informacji
--otc-color-warning#A15110Kolor ostrzeżenia
--otc-color-error#DC2626Kolor 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

GrupaPrzykł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.