Airgentic Help
The UI Design screen lets you customise the visual appearance of your Airgentic chat widget by editing its stylesheet and icon files.

The Design screen lists all the files available to edit for your service:
| File | Description |
|---|---|
style.css |
Custom CSS applied to the chat widget. Use this to override colours, fonts, spacing, and other visual styles. |
icons/submit-disabled.svg |
The send/submit button icon shown when the input field is empty. |
icons/chat-open.svg |
The floating chat button icon shown on the page when the widget is closed. |
icons/microphone-inactive-1.svg |
Microphone icon displayed when voice mode is available but not active (state 1). |
icons/microphone-inactive-2.svg |
Microphone icon displayed when voice mode is available but not active (state 2). |
icons/microphone-active-1.svg |
Microphone icon displayed when voice mode is recording. |
icons/thumbs-up.svg |
Thumbs-up icon used in response feedback. |
icons/thumbs-down.svg |
Thumbs-down icon used in response feedback. |
Click any row or its pencil icon to open the file editor.
For Site Search, Airgentic also emits stable air-* classes plus common search and Bootstrap-style classes such as search-results, search-facet, nav-tabs, nav-item, card, pagination, and page-link. See Styling Site Search for search-specific selectors and examples.
If you need custom widget behaviour rather than visual styling, approved accounts can use External Script URLs. Review the security and support notes in that guide before adding JavaScript.
Each file opens in a syntax-highlighted code editor with line numbers.
style.css editor uses a split-screen layout: the code editor on the left and a live preview pinned on the right, so the preview stays in view as you scroll the code. Drag the divider between them to resize. As you type, unsaved CSS is applied to the preview only.For style.css, turn on Inspect CSS variables above the preview, then hover a UI region. The tooltip shows the supported CSS variables for that part of the UI, the selector scope to paste them under, and a copyable starter snippet.
The inspector is a guide to the supported theme variables. It does not show every computed CSS property, and some artwork such as uploaded SVG icons may still need to be edited as files. For one-off changes that do not have a variable, use a scoped CSS selector in style.css.
When you make a change, a red save bar appears at the bottom of the screen. Click Save Style to save (you will be asked to confirm before the file is written), or Cancel to discard your changes.
After saving, allow a few minutes for changes to propagate and appear on the live website.
If you only need brand colours on every surface, start here:
#air-widget {
--air-brand: #0c4a6e;
--air-header-background: #0c4a6e;
--air-header-text: #ffffff;
--air-chip-text: #0c4a6e;
}
That updates headers, welcome chips, and related accents across Service Hub, Hover Widget, and Inline Search in one place.
To style a single component everywhere:
.air-assistant-message {
border-radius: 18px;
}
To style a component on one surface only (for example, the floating hover panel):
#air-widget[data-context="hover"] .air-assistant-message {
width: min(92%, 520px);
}
Three rules to remember:
.air-assistant-message — not old suffixes like -hw or -sh.#air-widget[data-context="..."] when you need surface-specific styling.style.css — it loads last, so simple selectors usually win without !important.Airgentic loads styles in a predictable order. Your style.css is always the last customer-controlled layer, so simple overrides in the Design screen usually win without needing !important.
| Layer | What it is | Typical use |
|---|---|---|
| Built-in Airgentic CSS | Default layout, typography, and theme styling shipped with the widget | Usually leave as-is |
| External search stylesheet | Optional hosted stylesheet from a previous search platform | Migration from another search vendor |
Your style.css |
Customer-editable stylesheet from UI Design | Brand colours, spacing, fonts, final overrides |
| Website CSS (inline search only) | Styles already on the host page | Layout around per-slot search regions |
For the Hover Widget and Service Hub, Airgentic injects your style.css after the built-in widget CSS.
For Site Search, the load order is:
style.css (loaded last)That means a rule like .hit-card { border-radius: 14px; } in style.css overrides both the built-in theme and an external migration stylesheet.
style.css appliesThe same style.css file is shared across every surface for a service:
When you need different styling on search vs hover, use #air-widget[data-context="..."] (see Styling by surface).
Built-in Airgentic theme rules use CSS :where(...) so they contribute zero extra specificity. Your style.css loads after the built-in CSS. Together, that means a plain rule like .air-widget-title { background: #0c4a6e; } normally overrides the default theme without !important.
Airgentic uses a small, stable set of hooks for customer CSS. Think of it as two axes:
| Axis | What it tells you | Example |
|---|---|---|
| Component class | What you are styling | .air-assistant-message, .air-text-input |
data-context |
Where the widget appears | data-context="hover", "service-hub", "search" |
Optional modifiers on the same root element:
| Modifier | When it appears | Example use |
|---|---|---|
.air-design-202604 |
Modern UI theme enabled in service.conf |
Pin a rule to one theme version |
.air-inline-search |
Inline Site Search page | Search-page layout (usually combine with data-context="search") |
.overlay |
Fullscreen search/chat panel on Hover Widget | Old overlay search UI (two remaining customers) |
Every surface shares the same root pattern. The widget is always #air-widget with class air-widget and a data-context attribute:
Inline Search:
<div id="air-widget" class="air-widget air-inline-search" data-context="search">
…
</div>
Hover Widget:
<div id="air-widget" class="air-widget" data-context="hover">
…
</div>
Service Hub:
<div id="air-widget" class="air-widget" data-context="service-hub">
…
</div>
Overlay search (fullscreen panel opened from the Hover Widget):
<div id="air-widget" class="air-widget overlay" data-context="hover">
…
</div>
data-context |
Surface | Typical page |
|---|---|---|
service-hub |
Service Hub | Dedicated support / chat page |
hover |
Hover Widget | Floating chat icon and panel on your website |
search |
Inline Site Search | Search page, Ask tab, and search-embedded chat |
Always scope context selectors to #air-widget so you do not accidentally match unrelated elements on the host page:
/* Good */
#air-widget[data-context="hover"] .air-messages { … }
/* Avoid on customer sites — too broad */
[data-context="hover"] .air-messages { … }
Component classes use semantic names — the same class name on every surface. You no longer need (and should not use) old suffixes such as -hw (hover widget) or -sh (service hub).
| Component | Class | Notes |
|---|---|---|
| Widget shell | .air-widget |
On #air-widget root |
| Header bar | .air-widget-title |
Top bar with title and action icons |
| Header text | .air-widget-title-text |
Title label (e.g. “How can we help you?”) |
| Header icons | .air-widget-title-icon, .air-widget-title-icon-svg |
Reset and other header buttons |
| Message list | .air-messages |
Scrollable conversation area |
| Assistant bubble | .air-assistant-message |
Agent replies |
| User bubble | .air-user-message |
End-user messages |
| Agent label | .air-agent-message-label |
Name above an agent message |
| Welcome chips | .air-entity |
Clickable suggestions in the welcome message |
| Example questions | .air-example-questions, .air-example-question |
Horizontal example-question strip |
| Input wrapper | .air-text-input-container, .air-text-input-container-container |
Input area chrome |
| Text input | .air-text-input |
Message textarea |
| Submit control | .air-submit-icon-container, .air-submit-disabled-icon, .air-submit-enabled-icon |
Send button states |
| Microphone | .air-microphone-icon-container, .air-microphone-icon |
Voice mode controls |
| Footer / branding | .air-logo-container, .air-logo-text |
“Powered by Airgentic” area |
| Loading indicator | .air-loading-dots |
Typing / waiting animation |
| Citations | .air-citation, .air-sources-container, .air-citation-link-text |
Source links and expandable sources |
| Images in answers | .air-inline-image |
Representative photos embedded in answers (when Images in Answers is enabled) |
| Component | Class or ID | Notes |
|---|---|---|
| Search shell | #air-search-shell |
Container for search + Ask tabs |
| Search input mount | #air-searchbox |
Algolia search box (overlay and inline) |
| Search / Ask tabs | .air-search-shell-tabs, .air-search-shell-tab |
“Search” and “AI Agent” tabs |
| Ask panel | #air-widget-chat.search-ask-panel |
Chat UI inside inline search Ask tab |
| Scope tabs | .type-tab, .nav-link |
Content-type filters on search pages |
| Ask tab button | .air-search-ask-tab, .search-ask-tab |
Accent-filled scope tab (Ask AI) |
| Result cards | .hit-card, .hit-title, .hit-snippet |
Search results (see Styling Site Search) |
Practical rule: use .air-assistant-message (or theme variables on #air-widget) for shared chat styling. Add #air-widget[data-context="..."] when a surface needs different styling.
If your style.css still uses legacy suffixed class names, update them to the new contract.
| Old (do not use) | New |
|---|---|
.air-widget-hw |
.air-widget with #air-widget[data-context="hover"] when scoping to hover |
.air-widget-sh |
.air-widget with #air-widget[data-context="service-hub"] when scoping to Service Hub |
.air-assistant-message-hw |
.air-assistant-message |
.air-assistant-message-sh |
.air-assistant-message |
.air-messages-hw |
.air-messages |
.air-text-input-hw |
.air-text-input |
Any other *-hw / *-sh suffix |
Same name without the suffix |
Before (legacy):
.air-assistant-message-hw {
background-color: #f0f4f8;
}
.air-widget-title-sh {
background: #0c4a6e;
}
After (current):
/* Shared styling — applies everywhere */
.air-assistant-message {
background-color: #f0f4f8;
}
/* Service Hub header only */
#air-widget[data-context="service-hub"] .air-widget-title {
background: #0c4a6e;
}
Before (hover-only with suffix on every class):
.air-widget-hw .air-messages-hw {
font-family: 'Open Sans', sans-serif;
}
After:
#air-widget[data-context="hover"].air-widget {
font-family: 'Open Sans', sans-serif;
}
Contact Airgentic support if you have a large legacy stylesheet — we can help batch-convert customer CSS.
Existing services keep the legacy widget design unless a newer UI theme is explicitly enabled in service.conf.
New services use the April 2026 UI theme by default:
"ui_theme": "202604"
When this theme is active, #air-widget also has the class .air-design-202604.
The older key is still supported as a legacy alias:
"service_hub.design_version": "202604"
Future themes will use the same YYYYMM format, such as .air-design-202607.
The style.css editor includes a Preview theme selector so you can see how your CSS looks against a theme before saving. This selector is for preview only; the live service theme is controlled by service.conf.
.air-design-202604 in your selectorsModern built-in theme rules are wrapped in CSS :where(...). That keeps theme styling intact but gives your style.css equal footing with simple selectors.
Works — no theme class required:
.air-assistant-message {
width: min(85%, 650px);
}
.air-widget-title {
background: #0c4a6e;
}
Also works — pin an override to one theme version:
.air-design-202604 .air-assistant-message {
width: min(85%, 650px);
}
Use the theme class when you want a rule to apply only while 202604 is active and to stay unchanged if Airgentic ships a newer default theme later.
Legacy services without ui_theme do not get .air-design-202604. Target stable classes like .air-assistant-message.
Use #air-widget[data-context="..."] when you want a rule on one surface only.
.air-assistant-message {
border-radius: 18px;
}
/* Inline search — wider messages */
#air-widget[data-context="search"] .air-assistant-message {
width: min(90%, 720px);
}
/* Hover panel — compact messages */
#air-widget[data-context="hover"] .air-assistant-message {
width: min(92%, 520px);
}
/* Service Hub — full-width header gradient */
#air-widget[data-context="service-hub"] .air-widget-title {
background: linear-gradient(135deg, #0c4a6e, #0369a1);
}
/* Welcome chips on search only */
#air-widget[data-context="search"] .air-entity {
color: #0c4a6e;
}
/* Active Search tab underline on hover overlay */
#air-widget[data-context="hover"] .air-search-shell-tab.active {
border-bottom-color: #0c4a6e;
}
/* Hide example questions on Service Hub only */
#air-widget[data-context="service-hub"] .air-example-questions {
display: none;
}
A small number of services open search in a fullscreen overlay on top of the page. The root has both data-context="hover" and class overlay:
/* Assistant messages in overlay search mode */
#air-widget[data-context="hover"].overlay .air-assistant-message {
max-width: 720px;
}
/* Overlay search tab styling */
#air-widget.overlay .air-search-shell-tab.active {
border-bottom-color: #60a5fa;
}
Inline search adds air-inline-search on the root. You usually only need data-context="search", but both can be combined for extra precision:
#air-widget[data-context="search"].air-inline-search .ais-SearchBox-input {
border-radius: 999px;
border-color: #cbd5e1;
}
For modern themes, the easiest way to customise common colours and surfaces is to set CSS variables on #air-widget in style.css. Variables cascade to headers, messages, chips, inputs, and shadows inside the widget.
#air-widget {
--air-header-background: #0d68bb;
--air-header-text: #ffffff;
--air-brand: #0d68bb;
--air-brand-deep: #0a4f8f;
--air-chip-text: #0d68bb;
--air-chip-border: rgba(13, 104, 187, 0.3);
--air-assistant-background: #ffffff;
--air-assistant-border: rgba(13, 104, 187, 0.15);
--air-user-background: linear-gradient(135deg, #0d68bb, #0a4f8f);
--air-user-text: #ffffff;
}
#air-widget[data-context="search"] {
--air-brand: #0c4a6e;
--air-header-background: #0c4a6e;
--air-chip-text: #0c4a6e;
}
--air-widget-background, --air-widget-text, --air-widget-muted-text, --air-widget-border, --air-widget-shadow, --air-widget-radius--air-brand, --air-brand-deep, --air-brand-soft--air-header-background, --air-header-text, --air-header-icon-background, --air-header-icon-border, --air-header-decoration-primary, --air-header-decoration-secondary--air-assistant-background, --air-assistant-text, --air-assistant-border, --air-assistant-shadow, --air-user-background, --air-user-text--air-chip-text, --air-chip-background, --air-chip-border, --air-chip-shadow, --air-chip-hover-background, --air-chip-hover-border, --air-chip-hover-shadow--air-input-background, --air-input-text, --air-input-placeholder, --air-input-border, --air-input-focus-border, --air-input-shadow, --air-input-focus-shadow--air-footer-background, --air-footer-textInline Search uses a separate --air-search-* token set. Put these on #air-widget.air-inline-search so they apply only to the search page and override the built-in light/dark/auto/transparent presets configured in Search settings.
Common starting points:
#air-widget.air-inline-search {
--air-search-canvas-bg: #252a2c; /* search page background behind the UI */
--air-search-card-bg: #353b3e; /* search input, results panel, result cards */
--air-search-soft-bg: #2f3538; /* filters panel, scope-tabs container */
--air-search-answer-bg: #2f3538; /* AI summary box */
--air-search-hover-bg: rgba(255, 255, 255, 0.06);
--air-search-selected-bg: rgba(255, 255, 255, 0.10);
--air-search-accent: #2563eb;
}
You do not need to target html or body inside the search iframe. Set --air-search-canvas-bg on #air-widget.air-inline-search and the widget applies it to the search canvas for you.
If the area around the embedded search on your website (outside the widget) should match, style that separately in your page HTML/CSS (for example body or .search-card on search_inline.html). That outer page is not controlled by variables on #air-widget.
Customer style.css is loaded after bundled search CSS, so these variables apply without !important in normal use.
Theme variables are the recommended starting point for brand colours because they update many related elements at once and are less brittle than overriding individual components.
The live preview in the Design screen updates immediately as you edit variables.
Use these variables depending on which background you want to change:
| Area | Recommended variable | Notes |
|---|---|---|
| Search page background behind the UI | --air-search-canvas-bg |
The usual choice when customers want to change the overall dark or light backdrop |
| Main results panel | --air-search-card-bg |
Also affects the search input and result cards in the modern inline layout |
| Filters panel | --air-search-soft-bg |
Also affects the scope tabs container |
| AI summary | --air-search-answer-bg |
Controls the summary card shown above results |
| Result hover / selected states | --air-search-hover-bg, --air-search-selected-bg |
Use translucent colours on dark themes |
| Website page around the widget | Your page CSS only, e.g. body, .search-page, .search-card |
Optional. Only needed for the host page outside the widget; not for backgrounds inside inline search |
Most common full-background change — one flat colour across the search UI:
#air-widget.air-inline-search {
--air-search-canvas-bg: #191e20;
--air-search-card-bg: #191e20;
--air-search-soft-bg: #191e20;
--air-search-answer-bg: #191e20;
}
Examples for common themes:
/* Dark theme */
#air-widget.air-inline-search {
--air-search-canvas-bg: #191e20;
--air-search-card-bg: #191e20;
--air-search-soft-bg: #191e20;
--air-search-answer-bg: #191e20;
--air-search-hover-bg: #2b3032;
--air-search-selected-bg: #252a2c;
}
/* Light theme */
#air-widget.air-inline-search {
--air-search-canvas-bg: #f4f6f8;
--air-search-card-bg: #ffffff;
--air-search-soft-bg: #f4f6f8;
--air-search-answer-bg: #eef6ff;
--air-search-hover-bg: #eef2f7;
--air-search-selected-bg: #dbeafe;
}
/* Transparent theme over a branded page */
#air-widget.air-inline-search {
--air-search-canvas-bg: transparent;
--air-search-card-bg: rgba(255, 255, 255, 0.92);
--air-search-soft-bg: rgba(255, 255, 255, 0.78);
--air-search-answer-bg: rgba(255, 255, 255, 0.92);
}
Work through these examples in order. Each builds on the same patterns: variables first, then component classes, then surface scoping.
#air-widget {
--air-header-background: #0c4a6e;
--air-header-text: #ffffff;
}
.air-widget-title {
background: #0c4a6e;
}
.air-widget-title-text {
color: #ffffff;
}
#air-widget[data-context="hover"].air-widget,
#air-widget[data-context="service-hub"].air-widget {
font-family: 'Open Sans', sans-serif;
}
The built-in 202604 theme sets assistant messages to width: min(85%, 620px). Override with one rule:
.air-assistant-message {
width: min(85%, 650px);
}
:root {
--brand-green: #309b42;
--bubble-bg: #f8f6f6;
}
.air-assistant-message {
background-image:
linear-gradient(var(--bubble-bg), var(--bubble-bg)),
linear-gradient(90deg, var(--brand-green) 0%, #9abb91 100%);
}
.air-user-message {
border: 1px solid var(--brand-green);
}
.air-entity {
color: #0c4a6e;
}
#air-widget {
--air-chip-text: #0c4a6e;
--air-chip-border: rgba(12, 74, 110, 0.25);
--air-chip-hover-background: rgba(12, 74, 110, 0.08);
}
When Images in Answers is enabled in service configuration, the agent may embed representative photos in answers. Override default sizing and spacing with:
#air-widget .air-inline-image {
max-width: 100%;
width: min(100%, 420px);
border-radius: 8px;
margin: 0.75rem 0;
}
.air-example-questions {
display: none;
}
Or on one surface only:
#air-widget[data-context="service-hub"] .air-example-questions {
display: none;
}
.air-loading-dots span {
background-color: #0c4a6e;
}
#air-widget {
--air-input-border: rgba(12, 74, 110, 0.35);
--air-input-focus-border: #0c4a6e;
--air-input-focus-shadow: 0 0 0 3px rgba(12, 74, 110, 0.15);
}
.air-text-input::placeholder {
color: #94a3b8;
}
#air-widget[data-context="search"] .ais-SearchBox-input {
border-radius: 999px;
min-height: 52px;
font-size: 17px;
}
#air-widget[data-context="search"] .ais-SearchBox-input:focus {
border-color: #0c4a6e;
box-shadow: 0 0 0 4px rgba(12, 74, 110, 0.12);
}
Result cards, tabs, and filters use search-specific classes. These apply on the search page regardless of data-context:
.hit-card {
border-radius: 14px;
border-color: rgba(12, 74, 110, 0.15);
}
.hit-title a {
color: #0c4a6e;
}
.type-tab.active,
.nav-link.active {
border-bottom-color: #0c4a6e;
}
More search selectors are in Styling Site Search.
The Ask scope tab uses three colour tokens: --air-search-ask-gradient (idle), --air-search-ask-gradient-active (selected), and --air-search-ask-gradient-hover (pointer hover only). Set them on #air-widget.air-inline-search (iframe search). For per-slot layouts where scope tabs render on the host page, also set the same tokens on :root.
:root,
#air-widget.air-inline-search {
--air-search-ask-gradient: #2563eb;
--air-search-ask-gradient-active: #1d4ed8;
--air-search-ask-gradient-hover: #1e40af;
--air-search-ask-text: #ffffff;
}
The Ask panel reuses chat message classes. Style the tab chrome separately:
#air-widget[data-context="search"] .air-search-shell-tab.active {
color: #0c4a6e;
border-bottom-color: #0c4a6e;
}
#air-widget[data-context="search"] #air-widget-chat.search-ask-panel .air-assistant-message {
max-width: 720px;
}
.air-search-ask-tab,
.search-ask-tab {
font-weight: 700;
}
#air-widget.overlay .air-search-shell-tab.active {
border-bottom-color: #60a5fa;
}
#air-widget[data-context="hover"].overlay .air-assistant-message {
background-color: rgba(0, 0, 0, 0.75);
color: #ffffff;
}
| Goal | Selector pattern |
|---|---|
| Style everywhere | .air-assistant-message { … } |
| Hover Widget only | #air-widget[data-context="hover"] .air-assistant-message { … } |
| Service Hub only | #air-widget[data-context="service-hub"] .air-widget-title { … } |
| Inline search only | #air-widget[data-context="search"] .air-entity { … } |
| Overlay search panel | #air-widget.overlay … or #air-widget[data-context="hover"].overlay … |
| Modern theme only | .air-design-202604 .air-assistant-message { … } |
| Brand colours everywhere | #air-widget { --air-brand: …; } |
| Brand colours on one surface | #air-widget[data-context="search"] { --air-brand: …; } |
| Search result cards | .hit-card { … } (no context needed) |
| Per-slot search regions | [data-airgentic="search-results"] { … } |
!importantPrefer normal cascade order first:
style.css last.:where(), so your simple selectors usually win.#air-widget update many elements without fighting individual rules.Reserve !important for:
If a rule is not applying, check in the browser developer tools which stylesheet is winning before reaching for !important. Often the fix is a more specific selector (for example, adding #air-widget[data-context="hover"]) rather than !important.
If your organisation already has a hosted search stylesheet, Airgentic support can add that URL to Search Configuration > Superuser. External stylesheets load before your Airgentic-managed style.css, so the Design screen remains the final override layer.
For search-specific selector examples, result-card vs CSS guidance, and per-slot layout notes, see Styling Site Search.
The Design screen preview shows Service Hub styling. Hover Widget, overlay search, and inline search may need surface-specific selectors. Test on the real page for each surface you care about.
-hw / -sh classesRemove the suffix and use semantic class names. Add #air-widget[data-context="hover"] or "service-hub" when you need surface-specific rules. See Migrating Old CSS.
That is expected if built-in defaults differ slightly per surface. Use #air-widget[data-context="..."] to align them, or set shared theme variables on #air-widget for consistent brand colours.
Inline search renders on your page (not always in an iframe). Host-page rules can affect search elements. Scope your website CSS away from air-* classes, or scope Airgentic overrides to #air-widget / [data-airgentic="..."].
Click Cancel to go back to the file list. If you have unsaved changes, you will be prompted to confirm before leaving — changes will be lost if you proceed.