This page tests the auto-popup invite card feature.
Expected behavior:
/api/public/brand → topics)Pick a color and Apply, or use a preset. Each click tears down the old widget (host + script + invite dismissal state) and re-embeds with data-color. "Test Broken Avatar" points data-avatar at a missing image to verify the 🤖 emoji fallback.
Runs on every widget (re)embed. Checks: derived default palette vs current hardcoded values (max per-channel Δ ≤ 8), derive(default) === DEFAULT_PALETTE, inline widget.js copy === theme.js copy, invalid input falls back to DEFAULT_PALETTE.
Current Page:
Storage Key: widget_invite_dismissed_<slug>_ (Task 10: key 按租户 slug 命名空间化)