Skip to main content

Custom CSS: style every part of your chat widget with code

A full reference of every stable CSS class in your chat widget, with copy-pasteable code examples, for merchants who want more visual control than the color pickers give.

Written by Joseph

Arbyn's chat widget already themes itself from your Brand accent color and the per-element bubble colors on the Design tab, and most stores never need anything more. But every part of the widget, from the launcher on your storefront down to the smallest button inside a message card, is built with a stable, named CSS class you can target yourself. The Custom CSS field on the Advanced tab lets you write plain CSS against those classes: no theme code to edit, no app reinstall, and changes go live on your storefront on the next page load.

This article is the full reference: every class Arbyn ships, grouped by where it lives, with a working code example for each group so you can copy, paste, and adjust.

What it does

Custom CSS is a plain text field where you write ordinary CSS rules targeting Arbyn's own class names. It doesn't touch your theme's code and it doesn't require a developer, though anyone comfortable writing CSS can use it directly. Rules you write here are checked for a small set of dangerous patterns (explained below) and, once saved, apply automatically to your live storefront.

Where to find it

  1. Go to Settings, Chat widget.

  2. Click Customize widget to open the full screen widget customizer.

  3. Click the Advanced tab.

  4. Type your CSS into the Custom CSS field. The live preview beside the controls updates as you type, so you see the effect immediately.

  5. Click Save.

How it works

One Custom CSS field styles two separate surfaces, and Arbyn routes your rules to the right one automatically, so you never need two stylesheets:

  • The launcher: the pill or bubble your shoppers tap, which sits directly on your storefront page, outside the chat panel.

  • Everything inside the chat panel: the welcome screen, messages, composer, Perks and Quiz pages, and the Chat Bag, which all live inside the panel's own frame.

Because every rule targets a specific class, you only affect the exact element you name. The rest of the widget's built in design stays untouched. An overly broad selector (styling the whole panel with something like *) can break the panel's own layout, so keep rules scoped to the classes below.

A few examples to start

Make message bubbles less rounded, store-wide:

.arbyn-user-bubble,
.arbyn-agent-bubble {
  border-radius: 8px;
}

Give the message composer a heavier border:

.arbyn-composer {
  border-radius: 4px;
  border: 1px solid #d0d0d0;
}

Give your product cards a heavier border in your brand color:

.arbyn-product-card {
  border: 2px solid var(--accent);
}

Quick reference: the most asked-for classes

Class

What it targets

.arbyn-spark-avatar

The agent's avatar circle (welcome hero, every agent reply, the typing indicator)

.arbyn-user-bubble

A shopper's own chat bubble

.arbyn-agent-bubble

Arbyn's reply bubble

.arbyn-agent-name

The agent's name shown above its reply

.arbyn-human-bubble

A reply from you or your team, once you take a conversation over in person

.arbyn-composer

The message input row

.arbyn-entry-pill

The launcher pill on your storefront page

.arbyn-bag-sheet

The Chat Bag panel

.arbyn-product-card

A product recommendation card in chat

The launcher (your storefront page)

The launcher sets most of its own look with inline styles for performance, so a rule targeting it may need !important to win:

.arbyn-entry-pill {
  background: #111111 !important;
}
.arbyn-pill-label {
  font-weight: 600;
}
.arbyn-entry-avatar {
  border: 2px solid #ffffff;
}

Class

What it targets

.arbyn-entry-pill

The whole launcher button (avatar and label), fixed to the corner of your storefront

.arbyn-pill-label

The text inside the launcher ("Shop with Arbyn", "Ask about this product", and so on; it changes per page)

.arbyn-entry-avatar

The small circular avatar or spark icon inside the launcher

The panel shell

Arbyn uses this class to size and position the whole chat window. Keep changes to visual touches (shadow, corner radius) rather than layout (width, height, position), or you risk breaking the panel for shoppers.

.arbyn-panel-shell {
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25);
  border-radius: 20px;
}

Class

What it targets

.arbyn-panel-shell

The chat panel's outer window (desktop: centered card, mobile: full screen)

Header and navigation

.arbyn-imm-header {
  background: #16102c;
}
.arbyn-perks-pill,
.arbyn-quiz-pill {
  border-radius: 999px;
}
.arbyn-imm-header__icon-btn {
  color: #ffffff;
}

Class

What it targets

.arbyn-imm-header

The sticky top bar on the main chat, Perks, and Quiz screens

.arbyn-perks-pill

The Perks pill in the header

.arbyn-quiz-pill

The Quiz pill in the header (styled independently from Perks)

.arbyn-imm-header__icon-btn

The round icon buttons in the header: close and menu on the main chat screen, and the back arrow on Perks/Quiz

Welcome screen

.arbyn-welcome-title {
  font-size: 22px;
}
.arbyn-welcome-subtitle {
  color: #6b6b6b;
}
.arbyn-welcome-section--discover .arbyn-welcome-section__title {
  text-transform: uppercase;
}
.arbyn-discover-tile,
.arbyn-quick-action-tile {
  border-radius: 14px;
}
.arbyn-context-card--compact {
  padding: 8px 12px;
}

Class

What it targets

.arbyn-spark-avatar

The large avatar shown above the welcome greeting

.arbyn-welcome-title

The welcome heading ("Hey there," or your custom text)

.arbyn-welcome-subtitle

The welcome body text below the heading

.arbyn-welcome-section

Either section wrapper (Discover or Quick actions); add .arbyn-welcome-section--discover or .arbyn-welcome-section--quick-actions to target one only

.arbyn-welcome-section__title

The small "Discover" / "Quick actions" row label

.arbyn-discover-tile

One Discover tile (product category or collection card)

.arbyn-quick-action-tile

One Quick actions tile (Track my order, Return an item, and so on)

.arbyn-context-card

The "Ask about this product/collection" card seeded when a shopper opens chat from a product or collection page; add .arbyn-context-card--compact for the smaller version pinned above the composer mid-chat

.arbyn-context-card__chip

One of the tappable suggestion buttons on that card

Messages

.arbyn-user-bubble {
  background: var(--accent);
}
.arbyn-agent-bubble {
  background: #f4f2fb;
}
.arbyn-imm-prose .arbyn-prose__link {
  text-decoration: underline;
}
.arbyn-typing-dots {
  opacity: 0.6;
}
.arbyn-show-more {
  font-weight: 600;
}

Class

What it targets

.arbyn-user-bubble

A shopper's message bubble

.arbyn-agent-bubble

Arbyn's reply bubble

.arbyn-agent-name

The agent's name shown above its reply

.arbyn-human-bubble

A reply from you or your team, once you take a conversation over in person. Styled like the agent's bubble by default, but a separate hook so a human reply can look distinct

.arbyn-human-name

Your display name shown above your reply

.arbyn-human-avatar

Your photo (or your initials, if you haven't uploaded one) beside your reply

.arbyn-imm-prose

The text layout wrapper around Arbyn's written reply (spacing and line height for paragraphs, lists, links)

.arbyn-prose, .arbyn-prose__p, .arbyn-prose__ul, .arbyn-prose__ol, .arbyn-prose__link

Fine-grained paragraph, list, and link styling inside a reply

.arbyn-imm-system

A system notice row (for example an escalation banner or retry prompt)

.arbyn-escalation

The "a team member will follow up" banner

.arbyn-retry, .arbyn-retry__icon

The "tap to retry" affordance after a send fails

.arbyn-system-note

A plain system note row

.arbyn-typing-row, .arbyn-typing-dots

The "is typing" indicator row and its animated dots

.arbyn-show-more

The "Show more" button that appears when a reply lists more than 3 products

.arbyn-token-row, .arbyn-token

The row wrapper around every card or form Arbyn sends, and a secondary marker useful as a broad "any card" selector

Composer

.arbyn-composer {
  background: #ffffff;
  border: 1px solid #e2e2e2;
}
.arbyn-composer__send {
  background: var(--accent);
}
.arbyn-composer__cart-badge {
  background: #ff5c5c;
}

Class

What it targets

.arbyn-composer

The message input row (background, border, corner radius)

.arbyn-imm-composer-ta

The text input itself (only its scrollbar is styled by default)

.arbyn-composer__attach

The photo attach button

.arbyn-composer__send

The send button

.arbyn-composer__cart

The round Chat Bag button next to the composer

.arbyn-composer__cart-badge

The item count badge on the Chat Bag button

Ratings (CSAT)

.arbyn-imm-csat {
  border-radius: 16px;
}
.arbyn-imm-csat__star.is-filled {
  color: #ffb020;
}

Class

What it targets

.arbyn-imm-csat

The "How did we do?" rating card, shown after Arbyn resolves a chat or when a shopper ends it

.arbyn-imm-csat__stars

The row of 5 star buttons

.arbyn-imm-csat__star

One star button; carries .is-filled once it's part of the picked or hovered rating, so you can style a filled star differently from an empty one

Perks page

.arbyn-perk-discount-card {
  border: 1px dashed var(--accent);
}
.arbyn-perk-discount-card__code {
  font-family: monospace;
}
.arbyn-perk-bundle-card__cta {
  background: var(--accent);
}

Class

What it targets

.arbyn-perks-section-title

The "Active discounts" / "Bundles" section labels

.arbyn-perks-empty

The "No perks just yet" empty state

.arbyn-perk-discount-card

One discount card (code and Apply on checkout button)

.arbyn-perk-discount-card__headline

The card's savings headline ("20% off," "Free shipping," and so on)

.arbyn-perk-discount-card__code

The copyable discount code chip

.arbyn-perk-discount-card__apply-btn

The "Apply on checkout" button

.arbyn-perk-bundle-card

One bundle card (products, discounted price, and Get bundle button)

.arbyn-perk-bundle-card__products

The list of product rows inside the bundle card

.arbyn-perk-bundle-card__pricing

The total price and bundle price rows

.arbyn-perk-bundle-card__cta

The "Get bundle" button

Quiz page

.arbyn-quiz-primary-btn {
  border-radius: 999px;
}
.arbyn-quiz-answer.is-selected {
  border-color: var(--accent);
}
.arbyn-quiz-reward-card {
  background: #f4f2fb;
}

Class

What it targets

.arbyn-quiz-intro

The Start screen (quiz name, description, Start button)

.arbyn-quiz-already-taken

The screen shown to a shopper who already completed the quiz

.arbyn-quiz-question

One question block

.arbyn-quiz-answer

One answer option; carries .is-selected once picked

.arbyn-quiz-primary-btn

Every full width primary button on the Quiz page (Start, See my result, Save, Try again, Back to chat)

.arbyn-quiz-result

The result screen (matched product, or score and tier message)

.arbyn-quiz-error

The "something went wrong" or "quiz isn't available" screen

.arbyn-quiz-reward-card

The reward card (discount code and Apply at checkout)

.arbyn-quiz-lead-form

The optional email, name, and phone capture step

.arbyn-quiz-done

The final "You're all set" confirmation screen

.arbyn-quiz-empty

The "No quiz right now" fallback

Chat Bag

.arbyn-bag-sheet {
  border-radius: 18px 18px 0 0;
}
.arbyn-bag-sheet__checkout {
  background: var(--accent);
}
.arbyn-bag-sheet__qty-btn {
  border-radius: 999px;
}

Class

What it targets

.arbyn-bag-overlay

The dimmed backdrop behind the open bag

.arbyn-bag-sheet

The bag panel itself

.arbyn-bag-sheet__header, .arbyn-bag-sheet__title, .arbyn-bag-sheet__close

The bag's header row

.arbyn-bag-sheet__empty

The empty bag message

.arbyn-bag-sheet__item, .arbyn-bag-sheet__item-img, .arbyn-bag-sheet__item-title, .arbyn-bag-sheet__item-variant, .arbyn-bag-sheet__item-price

One line item in the bag

.arbyn-bag-sheet__item-controls, .arbyn-bag-sheet__qty-btn, .arbyn-bag-sheet__qty-value, .arbyn-bag-sheet__remove

The quantity stepper and remove button

.arbyn-bag-sheet__subtotal

The subtotal line

.arbyn-bag-sheet__discount-note

The "code will apply at checkout" note

.arbyn-bag-sheet__disclaimer

The fine print line above the buttons

.arbyn-bag-sheet__actions, .arbyn-bag-sheet__checkout, .arbyn-bag-sheet__keep-shopping

The Checkout and Keep shopping buttons

The ⋯ menu

.arbyn-menu-dropdown {
  border-radius: 12px;
}
.arbyn-menu-row:hover {
  background: #f4f2fb;
}
.arbyn-menu-toggle {
  accent-color: var(--accent);
}

Class

What it targets

.arbyn-menu-dropdown

The whole dropdown panel

.arbyn-menu-row

One row (Terms, Privacy, Dark mode, Start new chat, End chat)

.arbyn-menu-toggle

The Dark mode on/off switch

.arbyn-menu-confirm

The confirm step shown before "Start a new chat" or "End chat" goes through

.arbyn-menu-confirm__text

The confirmation question text

.arbyn-menu-confirm__actions

The row holding the two confirm dialog buttons

.arbyn-menu-confirm__cancel

The Cancel button

.arbyn-menu-confirm__confirm

The confirming button (its label matches the row you tapped)

Message and action cards

Arbyn sends dozens of specialized cards during a conversation (order status, discounts, gift cards, returns, and more). Every one follows the same naming pattern: a root class for the whole card, then a __part class for each piece inside it. For example:

.arbyn-product-card {
  border-radius: 14px;
}
.arbyn-product-card__title {
  font-weight: 600;
}
.arbyn-product-card__price {
  color: var(--accent);
}
.arbyn-product-card__buy-now {
  background: var(--accent);
  border-radius: 999px;
}

The full set of cards and their root classes:

Card

Root class

Notable parts

Product card

.arbyn-product-card

__img, __title, __price, __compare, __off-badge, __options, __actions, __buy-now

Comparison card

.arbyn-compare

__header, __row, .arbyn-compare__tile (one product tile: __tile-img, __tile-title, __tile-price)

Upsell row

.arbyn-upsell

__header, __title, __sub, __row, __bundle, .arbyn-upsell__tile (__tile-img, __tile-label, __tile-price)

Order status

.arbyn-order-status

__head, __eyebrow, __headline, __pill, __timeline, __tracking, __tracking-link, __package

Order found (confirm order)

.arbyn-order-found

__title, __num, __items, __item, __status, __ship, __actions, __yes, __no

Order summary (recent orders)

.arbyn-order-summary

__order, __name, __status, __items, __more

Address update form

.arbyn-addr-form

__title, __grid, __field, __input, __submit, __done-summary

Discount offer card

.arbyn-discount-card

__headline, __savings, __label, __code, __code-action, __note

Bundle offer card

.arbyn-bundle-card

__headline, __name, __savings, __products, __product, __pricing, __cta

Gift card card

.arbyn-gift-card

__hero, __hero-amount, __code-row, __code-box, __apply-cta, __footnote

Checkout card

.arbyn-checkout-card

__header, __items, __item, __discount, __subtotal, __cta

Order/gift card lookup form

.arbyn-order-lookup

__header, __row, __label, __input, __err

Email capture card

.arbyn-email-capture

__header, __sub, __row, __input, __err

FAQ answer card

.arbyn-faq-answer

__head, __q, __a, __sources

Shipping details card

.arbyn-shipping-card

__row, __icon, __title, __sub

Link CTA card (for example a "Manage my subscription" button)

.arbyn-link-cta-card

__heading, __cta

Free shipping progress card

.arbyn-threshold-card

__head, __headline, __track, __fill

Link preview card

.arbyn-link-preview

__img, __site, __title, __desc

Photo upload card

.arbyn-photo-upload

__thumb, __status, __error

Escalate to human cards

.arbyn-escalate, .arbyn-escalate-confirm, .arbyn-handover

__title, __sub, __actions, __yes, __no, __ref

Return request review form

.arbyn-review

__title, __fields, __field, __input, __submit

Return/cancel submitted receipt

.arbyn-req-submitted

__icon, __title, __sub

Return status card

.arbyn-return-status

__head, __headline, __steps, __body

Return blocked card

.arbyn-return-blocked

__row, __icon, __head, __sub, __actions

Action notice banner

.arbyn-action-notice

__icon, __body

Cart/checkout buttons in chat

.arbyn-cart-cta

.arbyn-cart-cta__btn, __btn--primary, __btn--secondary, __solo

Quick reply, trigger, return, and cancel pills

.arbyn-picks-handoff-pills

.arbyn-pill, .arbyn-pill--primary, .arbyn-pill--ghost

Quick reply chips

.arbyn-chips

.arbyn-chip

Shared buttons across cards

.arbyn-btn

.arbyn-btn--primary, .arbyn-btn--secondary, .arbyn-btn--wide, .arbyn-btn--tiny

Some elements carry a small state class alongside their normal class while they're in a particular state. For example, a selected order item gets .arbyn-order-found__item.is-checked, and a copied discount code gets .arbyn-discount-card__code.is-copied. Target the state directly if you want a rule that only applies once something is picked or copied:

.arbyn-order-found__item.is-checked {
  background: #f4f2fb;
}
.arbyn-discount-card__code.is-copied {
  color: #2ea873;
}

Troubleshooting

I saved my CSS and nothing changed on my storefront. First, confirm your rule is actually reaching the element. On your storefront, right-click the thing you're trying to style and choose Inspect (or open your browser's developer tools). Compare the class names on that exact element, character for character, against the selector you wrote. Custom CSS only checks for the small set of dangerous patterns listed below, never whether a class actually exists, so a typo, an extra space, or a class that isn't on this page's reference will save without any error and simply match nothing. This isn't something Arbyn warns you about today, so comparing what you typed against what's really on the page is the fastest way to catch it.

The class matches and it still isn't showing. Reload the storefront page you're testing on. A rule you just saved needs a fresh page load to take effect, an already open tab won't pick it up. If it still isn't showing after a reload, check whether another rule later in your Custom CSS targets the same property on the same class, the last matching rule wins, same as any CSS.

It worked before and stopped, and you didn't touch your CSS. This usually means the selector wasn't one of the documented classes in this article. Arbyn's internal markup can change between releases, so a rule that happened to match something undocumented can stop matching after an update. Switch to one of the classes listed here; these are the ones Arbyn keeps stable release to release.

What's not allowed

For your shoppers' safety, a small set of CSS patterns are always blocked, whether or not you intend anything harmful with them:

  • javascript: values

  • expression(...) (legacy Internet Explorer)

  • @import (pulling in an external stylesheet)

  • -moz-binding and behavior: (legacy XBL/HTC bindings)

If your Custom CSS contains any of these, Save is rejected and you'll see an error. Nothing partial gets saved. Everything else, colors, fonts, spacing, borders, shadows, and animations on your own selectors, is fair game.

Good to know

  • An overly broad selector can break the panel's own layout. Style specific classes, like the ones above, not the whole panel with something like *.

  • Custom CSS applies on top of your Design tab colors, not instead of them. Most stores only need the color pickers; Custom CSS is for the extra polish those pickers don't cover.

  • Every class here is stable. Arbyn does not rename or remove a shipped class without warning, so a rule you write today keeps working.

  • Changes go live on the next storefront page load after you save. There's nothing to publish separately.

  • var(--accent) reads your Design tab's brand accent color, so a rule like border: 2px solid var(--accent); automatically follows whatever accent color you set, without hardcoding a hex value.

FAQ

Do I need to know CSS to use this field? Yes, this field expects real CSS syntax. If you're comfortable with basic CSS (selectors, properties, values), you can use every example above directly. If not, the color pickers on the Design tab cover the most common customizations without any code.

What happens if I write invalid CSS, or CSS that includes a blocked pattern? Save is rejected outright with an error, and nothing is saved, partially or otherwise. Your previous Custom CSS (if any) stays in place until you fix and resave.

Can I target a class that isn't listed here? Only the classes in this article are guaranteed to exist and stay stable. Arbyn's internal markup can change between releases; a selector that happens to match something today that isn't documented here could stop matching after an update.

Will my Custom CSS apply to Instagram DMs or Facebook Messenger too? No. Custom CSS only affects the storefront chat widget (the launcher and the panel). Instagram and Facebook Messenger stay in plain text, since that's what those channels support.

Did this answer your question?