Where styling lives. The Concierge renders in a closed shadow DOM, so your page’s CSS cannot reach inside it and its styles cannot leak out. Everything is customized through CSS custom properties, set two ways:
- From the Bonsai dashboard (preferred) — your brand colors are fetched per-tenant at load time and applied automatically.
- Inline on the element — set any variable in the tag’s
styleattribute to override it for that embed.
style on the tag is the only way page-side CSS can reach the component. A stylesheet rule like bonsai-chat-bubble { --bonsai-agent-brand: red } will not take effect.Setting variables
Color reference
Header
Conversation
Panel and shape
Launcher reference
The launcher has its own token set, so you can restyle the button without touching the panel.Minimum sizes are accessibility floors, not suggestions.
--bonsai-agent-bubble-min-height and --bonsai-agent-bubble-min-width default to 44px because that is the smallest reliably tappable target. A design that specifies a shorter button will render at 44px unless you lower these explicitly — and lowering them makes the launcher harder to hit on a phone.Responsive behavior
The launcher adapts to the viewport at two breakpoints. Both apply automatically — there is nothing to enable.
380px is the threshold so that an iPhone SE (375px wide) goes compact while an iPhone 12 through 16 (390px) keeps its full launcher.
The compact tab
At 380px and narrower, every launcher — pill or tab, on either side — renders the same way:- Position is forced to the viewport edge and vertically centered.
bubble-bottom,bubble-right,bubble-left, andbubble-topno longer apply; the compact tab uses--bonsai-agent-bubble-compact-topinstead. - Shape is a tab with its outer corners rounded 8px, whichever
launcher-variantyou set. - Text is
launcher-compact-label, notlabel. An icon-only launcher is unaffected, but it also stops being a 56px square and becomes the same compact tab. - The icon is always shown, including when
launcher-content="text". - It hides itself while the panel is open, since at that width the panel covers the screen.
--bonsai-agent-bubble-min-height and --bonsai-agent-bubble-min-width still apply.
Pin the compact twin, not just the base variable
On tablets, a value you pin on the tag wins — the tier only adjusts variables you have not set. The 380px tier is different: it reads its own variables, so pinning the base one has no effect there.Which icon the compact tab shows
launcher-icon-url, if set- Otherwise the built-in glyph named by
launcher-icon—sparkles(the default),chat, ormark(the Bonsai mark)
launcher-icon-url to use your own.
header-icon-url is not reused here. It supplies the logo inside the opened panel only — set launcher-icon-url explicitly even if it points at the same file.launcher-icon-url points at an image that fails to load, the component falls back to the built-in glyph rather than rendering an empty button.
Dark mode
Settheme="dark" to use the dark palette. It adjusts the background, foreground, muted, border, surface, input, card, and hover variables; brand and launcher colors are unchanged, since those are yours.
dark resolves to the light palette. The component does not follow the operating system setting on its own — to do that, set the attribute from your own theme switcher.