Upcoming — generated from the latest merged element source; documents unreleased development. Use the channel picker at the top of the sidebar for the docs of a published release.
In development — not yet part of a stable release.
Belongs to the Websites group. Render <WebsitesElement /> inside it (React), or call websites.create('websites', { … }) on the handle (vanilla) — consumer props and on<Event> callbacks both go in the create options / JSX props.
Preview
A live, interactive demo of this element with sample data:
Usage
Props
This element takes no consumer props.
Direct mode only
These props exist only on the in-process (direct-mode) component — the hosted embed never carries them, and the element renders without them.
Direct-mode only. Optional empty-state override for first-party hosts. Omitted in embeds — the built-in empty copy renders instead.
Events
Pass a callback in the create options (or React prop) to receive these.
onWebsiteToggled
A domain row was expanded or collapsed to show or hide its pages.
Signature: ((payload: { domain: string; expanded: boolean; }) => void)
onWebsitesLoaded
The list of domains arrived or changed — use it to drop any pendingWebsites that are now live.
Signature: ((payload: { domains: string[]; }) => void)
onVerifyRequested
The pixel-check button was pressed. Open url and watch for pixel events on your side, then push the outcome back through the handle’s verifyStatus so the button reflects it.
Signature: ((payload: { target: string; url: string; }) => void)
onSettingsRequested
The settings button on a whop.app row was pressed. The element only reports the click — open your own editing surface for the app.
Signature: ((payload: { appId: string; route: string; domain: string; }) => void)
onLoaderStart
Fired the moment the element’s own loading skeleton has painted inside its frame — the earliest point a consumer-managed loading state can hand off without ever exposing a blank. Always precedes onReady; most consumers only need onReady.
Signature: (() => void)
onReady
Fired once the element has booted and painted its first complete frame.
Signature: (() => void)
onError
Fired when the element fails to load or crashes; the element shows its own error fallback. message is human-readable; framework refusals also carry code (e.g. HOST_SOURCE_FAILED, with sourceKey naming the failed hostState key) so hosts can switch on codes, never message text.
Signature: ((e: { message: string; code?: string | undefined; sourceKey?: string | undefined; }) => void)
Methods
Call these on the element handle — the return of create (vanilla) or the component ref (React).
mount
Place the element on the page: appends its container to target (a CSS selector or an element) and starts loading. Nothing renders until this is called. React consumers never call it — the component mounts itself.
Signature: (target: string | HTMLElement) => void
destroy
Remove the element from the page and release its frame and subscriptions. Safe to call more than once. React consumers never call it — unmounting the component does it.
Signature: () => void
update
Change this element’s consumer props after mount — it re-renders with the merged props. React consumers never call it — updating the JSX props does the same.
Signature: (options: Partial<WebsitesElementProps>) => void
Styling
Each part below is a stable class name — safe to depend on. Restyle a part by mapping its class to a style declaration object under appearance.classes (properties camelCase or kebab-case, values as strings with units — the same shape as React’s style prop). The element renders in its own frame, so page stylesheets can’t reach it: these declarations are sanitized against a safe-property allowlist and injected inside the frame for you.
In React, pass the same object as the appearance prop on <Websites>; appearance also applies globally at WhopElements({ appearance }).