This feature is currently in beta. Documentation for Version 1 templates is here

Styling & CSS Variables — How to theme the waiting room with CSS custom properties.

See also: Template Markup & Structure | Vue State & Methods

Styling

Theme Input Variables

Override these in a stylesheet loaded after the ch-wait.css link. The theme derives all other colours automatically.

<link rel="stylesheet" >
<style>
:root {
  --ch-brand-primary:    #424242;  /* Title, accent, stock pill */
  --ch-brand-secondary:  #4b4b4b;  /* Buttons, focus rings */
  --ch-bg:               #FFFFFF;  /* Page background */
  --ch-surface:          #F0F4F8;  /* Card / panel backgrounds */
  --ch-progress-color:   #004f84;  /* Progress bar base colour (optional) */
  --ch-border-radius:    12px;    /* Base radius — all radii scale from this */
}
</style>

You can also add overrides in a stylesheet loaded after the main crowdhandler styles:

<link rel="stylesheet" >
<link rel="stylesheet" href="my-overrides.css">

Derived Variables Reference

All derived variables can be individually overridden. In browsers supporting oklch(from ...) they are calculated automatically from the inputs above; otherwise they use static hex fallbacks.

Typography

VariableDefaultDescription
--ch-font-primaryPlus Jakarta SansBody and heading font
--ch-font-secondaryJetBrains MonoPosition number and countdown digits

Text

VariableDerived fromDescription
--ch-text-primary--ch-textMain body text
--ch-text-secondary--ch-text 80%Secondary text
--ch-text-muted--ch-text 70%Muted / helper text
--ch-on-bg--ch-bgAuto light/dark text on page background
--ch-on-bg-secondary--ch-on-bg 65%Secondary text on page background
--ch-on-surface--ch-surfaceAuto light/dark text on card/panel
--ch-on-surface-secondary--ch-on-surface 65%Secondary text on card/panel
--ch-on-surface-muted--ch-on-surface 52%Muted text on card/panel

Backgrounds

VariableDerived fromDescription
--ch-bg-page--ch-bgPage background
--ch-bg-card--ch-surfaceCard background
--ch-bg-inset--ch-surface darkenedInset panel background
--ch-bg-input--ch-surfaceInput field background
--ch-bg-surface--ch-surface + --ch-bg 50/50Intermediate surface

Borders

VariableDerived fromDescription
--ch-border--ch-on-bg 12%Default border colour
--ch-border-focus--ch-brand-secondaryFocus ring colour

Accent

VariableDerived fromDescription
--ch-accent--ch-brand-primaryAccent colour (titles, stock pill)
--ch-accent-hover--ch-accent darkenedAccent hover state
--ch-accent-glow--ch-brand-primary 25% opacityAccent glow effect
--ch-on-accent--ch-accentAuto light/dark text on accent

Status Colours

VariableDerived fromDescription
--ch-status-greenInputGreen status input (bright)
--ch-status-amberInputAmber status input (bright)
--ch-status-redInputRed status input (bright)
--ch-success--ch-status-green darkenedAA-safe green text
--ch-warning--ch-status-amber darkenedAA-safe amber text
--ch-danger--ch-status-red darkenedAA-safe red text
--ch-success-glow--ch-status-green 30% opacityGreen glow
--ch-warning-glow--ch-status-amber 20% opacityAmber glow
--ch-danger-glow--ch-status-red 20% opacityRed glow

Buttons

VariableDerived fromDescription
--ch-btn-bg--ch-brand-secondaryPrimary button background
--ch-btn-text--ch-btn-bgAuto light/dark button text
--ch-btn-hover--ch-btn-bg darkenedPrimary button hover
--ch-btn-disabled-bg--ch-btn-bg lightenedDisabled button background
--ch-btn-secondary-bgtransparentSecondary button background
--ch-btn-secondary-text--ch-text-secondarySecondary button text
--ch-btn-secondary-border--ch-borderSecondary button border
--ch-btn-secondary-hover-bg--ch-on-bg 4%Secondary button hover

Progress Bar

VariableDerived fromDescription
--ch-progress-bg--ch-on-bg 8%Track background
--ch-progress-dark--ch-progress-color darkenedGradient dark stop
--ch-progress-light--ch-progress-color lightenedGradient light stop
--ch-progress-gradientdark + light stopsAnimated fill gradient

Message Boxes

VariableDerived fromDescription
--ch-message-warning-bg--ch-warning 8%Warning message background
--ch-message-warning-border--ch-warning 20%Warning message border
--ch-message-danger-bg--ch-danger 8%Danger message background
--ch-message-danger-border--ch-danger 20%Danger message border

Header & Footer

VariableDerived fromDescription
--ch-header-bg--ch-bgHeader background
--ch-on-header-bg--ch-header-bgAuto light/dark header text
--ch-on-header-bg-secondary--ch-on-header-bg 65%Secondary header text
--ch-footer-bg--ch-bgFooter background
--ch-on-footer-bg--ch-footer-bgAuto light/dark footer text
--ch-on-footer-bg-secondary--ch-on-footer-bg 65%Secondary footer text

Card & Countdown

VariableDerived fromDescription
--ch-card-radius--ch-border-radius * 2Card corner radius
--ch-card-shadow--ch-brand-primary tintedCard box shadow
--ch-countdown-shadow--ch-brand-primary tintedCountdown unit shadow

Footer Utilities

VariableDerived fromDescription
--ch-token-bg--ch-on-bg 4%Token badge background
--ch-token-hover-bg--ch-on-bg 8%Token badge hover
--ch-poll-bg--ch-on-bg 4%Poll timer track
--ch-poll-gradientprogress dark + colourPoll timer fill gradient

Key CSS Classes Reference

ClassPurpose
ch-cardMain card container
ch-queue-statesWrapper for countdown + active queue content
ch-state-messageState message container (blocked / room full)
ch-state-message.ch-state-dangerBlocked state (red)
ch-state-message.ch-state-warningRoom full state (amber)
ch-message-boxMessage panel above card
ch-form-sectionForm area with top border separator
ch-priority-sectionPriority code form (inset background)
ch-email-sectionEmail form (outside card)
ch-email-submittingSpinner container during email submission
ch-input-groupFlex row for input + button(s)
ch-inputText/email input field
ch-btnPrimary button
ch-btn-smSmall button variant
ch-btn-secondarySecondary button (outlined)
ch-btn-changeChange email button spacing
ch-form-feedbackFeedback message row
ch-form-feedback.ch-successSuccess feedback
ch-form-feedback.ch-errorError feedback
ch-stock-badgeStock indicator
ch-stock-countStock number pill
ch-stock-badge.ch-stock-lowLow stock state
ch-stock-badge.ch-stock-zeroSold out state
ch-progress-containerProgress bar wrapper (max-width constrained)
ch-progress-barTrack (background bar)
ch-progress-fillFill bar (animated gradient)
ch-progress-bar.ch-progress-midGlow at mid progress
ch-progress-bar.ch-progress-highStronger glow at high progress
ch-progress-bar.ch-progress-almostPulsing glow near completion
ch-progress-infoEstimate and ETA text below bar
ch-spinnerLoading spinner
ch-text-shimmerText shimmer animation
ch-session-infoSession info text

Required CSS Classes

Your template must include these structural classes:

/* Screen reader only */
.ch-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Hidden until loaded */
#crowdhandler-template {
  display: none;
  opacity: 0;
  transition: opacity 0.5s ease;
}

#crowdhandler-template.active {
  display: flex;
  flex-direction: column;
  align-items: center;
  min-height: 100vh;
  opacity: 1;
}

Entrance Animations

Elements use staggered entrance animations via ch-enter et ch-stagger-N classes. Each stagger level adds a 0.1s delay.

<div class="ch-logo ch-enter ch-stagger-1">...</div>
<div class="ch-header-row ch-enter ch-stagger-4">...</div>
<div class="ch-footer ch-enter ch-stagger-5">...</div>
<div class="ch-message-box ch-enter ch-stagger-6">...</div>