Files
zeekay e9a44b4f52 State a version once
A version written into a manifest is written into every manifest that wants it,
which is how eslint came to exist in a hundred and four forms across this estate
and how a package came to resolve twice at run time. The catalog moves the number
out of the manifest: a manifest names the package, the workspace names the
version.

Four are held below their latest because the newer release cannot be used, and
the reason is recorded rather than the version alone: @noble/hashes 2 renamed
every subpath the web3 stack imports, @splinetool/runtime 2 depends on a package
that was never published, @dynamic-labs 5.4.1 the same, and react-resizable-panels
3 points its types condition at the bundle.
2026-08-29 18:14:17 -07:00
..
2026-08-29 18:14:17 -07:00

@hanzo/waitlist

Monochromatic, brand-neutral viral waitlist widget. Backed by Hanzo Base.

import { Waitlist } from '@hanzo/waitlist'
import '@hanzo/waitlist/styles.css'
import MyLogo from './MyLogo' // your component, your SVG, your <img>

export default function Landing() {
  return (
    <Waitlist
      waitlist="my-product"
      baseUrl="https://api.example.com"
      logo={<MyLogo />}
    />
  )
}

The widget ships with no logo and no brand colors. Each consumer brings its own mark via the logo prop (or <slot name="logo"> in the custom element) and its own palette via CSS variables.

Drop-in (no bundler)

<link rel="stylesheet" href="https://cdn.example.com/@hanzo/waitlist/waitlist.css" />
<script src="https://cdn.example.com/@hanzo/waitlist/waitlist.iife.js"></script>

<hanzo-waitlist waitlist="my-product" base-url="https://api.example.com">
  <!-- Bring your own logo. Either slot in markup: -->
  <img slot="logo" src="/logo.svg" alt="My brand" />
  <!-- ...or use the logo-url attribute instead:
  <hanzo-waitlist ... logo-url="/logo.svg" logo-alt="My brand" />
  -->
</hanzo-waitlist>

Theming

Override any CSS variable on .hanzo-waitlist (or any ancestor). The widget ships fully neutral — no hardcoded brand colors, no logos, no embedded identity. Each consumer sets its own tokens once:

.your-brand {
  --hw-accent: <accent>;     /* brand accent */
  --hw-accent-fg: <text>;    /* text color on accent */
  --hw-radius: <radius>;     /* corner radius */
}

Force a theme with theme="light" | "dark". Default theme="auto" follows prefers-color-scheme.

Programmatic client (no React)

import { WaitlistClient } from '@hanzo/waitlist/client'

const c = new WaitlistClient({ baseUrl: 'https://api.example.com' })
const result = await c.join({ waitlist: 'my-product', email: '[email protected]' })

Server

The backend is the waitlist plugin for Hanzo Base. Register it once at boot:

waitlist.MustRegister(app, waitlist.Config{
    Enabled:         true,
    TurnstileSecret: os.Getenv("TURNSTILE_SECRET_KEY"),
    AdminSecret:     os.Getenv("WAITLIST_ADMIN_SECRET"),
})