Brand Concierge Style Guide (Android)

This document provides a comprehensive reference for all styling properties supported by the Brand Concierge Android SDK. Themes are configured using JSON files that follow a web-compatible CSS variable format.

data-variant=warning
data-slots=text
Implementation Status: While the theme system parses all CSS variables for web compatibility, not all properties are currently used in the Android UI. See the Implementation Status section for detailed information on which properties are actively rendered versus defined but unused.

Overview

The theme configuration is loaded from a JSON file using ConciergeThemeLoader.load(context, filename). The framework supports CSS-like variable names (prefixed with --) that are automatically mapped to native Kotlin properties.

Loading a theme

// Load from app assets
val theme = ConciergeThemeLoader.load(context, "theme-default")

// Use default theme
val defaultTheme = ConciergeThemeLoader.default()

Applying a theme

Apply the theme using the ConciergeTheme composable:

import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import com.adobe.marketing.mobile.concierge.ui.theme.ConciergeTheme
import com.adobe.marketing.mobile.concierge.ui.theme.ConciergeThemeLoader

@Composable
fun MyApp() {
    val context = LocalContext.current
    
    // Load theme from assets
    val theme = remember {
        ConciergeThemeLoader.load(context, "my-theme") 
            ?: ConciergeThemeLoader.default()
    }
    
    ConciergeTheme(theme = theme) {
        // Your app content here
        // Concierge UI components will use the theme
    }
}

You can also load themes by filename directly:

@Composable
fun MyApp() {
    ConciergeTheme(themeFileName = "my-theme.json") {
        // Your app content here
    }
}

Applying a theme in XML/Views

For XML-based apps using ConciergeChatView, pass the theme when binding:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // Load theme
        val theme = ConciergeThemeLoader.load(this, "my-theme")
        val surfaces = listOf("web://example.com/your-surface.html")
        
        val chatView = findViewById<ConciergeChatView>(R.id.concierge_chat)
        chatView.bind(
            lifecycleOwner = this,
            viewModelStoreOwner = this,
            surfaces = surfaces,
            theme = theme,
            onClose = { finish() }
        )
    }
}

Important: The ConciergeTheme composable provides theme tokens to all child composables through CompositionLocal.

Default theming

JSON structure

The theme JSON file contains these top-level keys:

Key
Description
metadata
Theme identification and versioning
header
Header title, subtitle, image, and layout configuration
behavior
Feature toggles and interaction settings
disclaimer
Legal/disclaimer text configuration
text
Localized UI strings (copy)
arrays
Welcome examples and feedback options
assets
Icon and image assets
components
Non-CSS component overrides (currently feedback dialog only)
theme
Visual styling tokens (CSS variables)

Value formats

Understanding the value formats used throughout this document.

Colors

Colors are specified as hex strings:

"--color-primary": "#EB1000"
"--message-user-background": "#EBEEFF"
"--input-box-shadow": "0 2px 8px 0 #00000014"

Supported formats:

Dimensions

Dimensions use CSS pixel units:

"--input-height-mobile": "52px"
"--input-border-radius-mobile": "12px"
"--message-max-width": "100%"

Padding

Padding follows CSS shorthand syntax:

"--message-padding": "8px 16px"

Formats:

Shadows

Shadows use CSS box-shadow syntax:

"--input-box-shadow": "0 2px 8px 0 #00000014"
"--multimodal-card-box-shadow": "0 1px 3px 0 #00000014"

Format: offsetX offsetY blurRadius spreadRadius color. Set to "none" to disable a shadow entirely.

--multimodal-card-box-shadow renders as a drop shadow on ExtendedProductCard, but only two of the five values are actually applied — Compose's Modifier.shadow is elevation-based, not a literal box-shadow renderer:

Token
Consumed?
Effect
offsetX
❌
Parsed but ignored — no horizontal-offset equivalent in Compose's shadow
offsetY
❌
Parsed but ignored — no vertical-offset equivalent either
blurRadius
✅
Becomes the shadow's elevation (dp)
spreadRadius
❌
Parsed but ignored — no spread equivalent
color
✅
Used as both ambientColor and spotColor

Low alpha values (e.g. #00000014 ≈ 8%) are barely visible against a white background — increase alpha (e.g. #00000040+) for a more visible effect.

--input-box-shadow is parsed into the same shape but isn't rendered by any composable yet (see status table below).

Gradients

Some color tokens (input border, mic icon, arrow send button background, mic waveform bars) support a two-color linear gradient as an alternative to a solid color. Each gradient-capable token is configured via 3 CSS variables sharing a common prefix — a start color, an end color, and an optional angle:

"--input-outline-gradient-start-color": "#12B0A0",
"--input-outline-gradient-end-color": "#6DD3C4",
"--input-outline-gradient-angle": "90deg"

Font Weights

Font weights use CSS numeric or named values:

Value
Name
Android FontWeight
100
ultraLight
W100
200
thin
W200
300
light
Light
400 / normal
regular
Normal
500
medium
Medium
600
semibold
SemiBold
700 / bold
bold
Bold
800
heavy
W800
900
black
Black

Text Alignment

Value
Compose Equivalent
left
TextAlign.Start
center
TextAlign.Center
right
TextAlign.End

Metadata

Theme identification information.

JSON Key
Type
Default
Description
metadata.brandName
string
""
Brand/company name
metadata.version
string
"0.0.0"
Theme version
metadata.language
string
"en-US"
Locale identifier
metadata.namespace
string
"brand-concierge"
Theme namespace

Example

{
  "metadata": {
    "brandName": "Concierge Demo",
    "version": "1.0.0",
    "language": "en-US",
    "namespace": "brand-concierge"
  }
}

Chat header title, subtitle, and image configuration. This is a separate top-level header object — it is not part of text.

JSON Key
Type
Default
Description
header.title
string
"Concierge"
Header title text.
header.subtitle
string
"Powered by Adobe"
Header subtitle text.
header.image
string
null
Header image/logo, rendered only when layoutType is "imageOnly". A local asset basename under assets/icons/ (matched against .png, .webp, .jpg, .jpeg, in that order) or an absolute http(s) URL. Falls back to a default chat icon when unset, blank, or unresolvable.
header.layoutType
string
null
Header content mode. "imageOnly" renders only the image; "textOnly", null, or any other/unknown value renders only the title and subtitle (the default).
header.imageHeight
string (CSS px)
null (48dp)
Height of the header image/fallback icon, e.g. "24px". Width follows the image's aspect ratio (wrap content).

Note: title/subtitle only fall back to the defaults above when both are blank or unset. If you set either one, the other is left blank rather than defaulted — setting only header.subtitle hides the title instead of showing "Concierge".

Example

{
  "header": {
    "title": "Acme Assistant",
    "subtitle": "Here to help",
    "image": "logo",
    "layoutType": "imageOnly",
    "imageHeight": "24px"
  }
}

Behavior

Feature toggles and interaction configuration.

JSON Key
Type
Default
Description
behavior.multimodalCarousel.cardClickAction
string
"openLink"
Action when carousel card is tapped. Currently "openLink" is the only option available.
behavior.multimodalCarousel.carouselStyle
string
"paged"
Carousel navigation style. "paged" = snap to item with prev/next buttons and page dots; "scroll" = continuous horizontal scroll with no paging controls.

Input

JSON Key
Type
Default
Description
behavior.input.enableVoiceInput
boolean
false
Enable voice input button
behavior.input.sendButtonStyle
string
"default"
Send button style: "default" (paper airplane icon) or "arrow" (filled circle with upward arrow)
behavior.input.disableMultiline
boolean
true
Disable multiline text input
behavior.input.showAiChatIcon
object
null
Leading icon shown before the text field in the input bar. Object with an icon property: a local asset basename under assets/icons/ or an absolute http(s) URL — same resolution rules as citations.phoneIcon/storeIcon. null or an empty icon hides it. Tooltip/content description is set via text["input.aiChatIcon.tooltip"].
behavior.input.enableMicPulseBackground
boolean
true
Shows a pulsing colored disc behind the mic/waveform icon while recording. Set to false for a bare waveform with no disc, rendered directly on the input background.
behavior.input.stopRecordingIcon
string | null
null
Basename (no extension) of the stop-recording icon under assets/icons/, or an absolute http(s) URL. Falls back to the Material stop-circle icon when null, blank, or unresolvable.

Chat

JSON Key
Type
Default
Description
behavior.chat.messageAlignment
ConciergeTextAlignment
"start"
Agent message alignment. Accepts "start" / "leading" / "left", "center" / "justify", or "end" / "trailing" / "right". Case-insensitive; unknown values fall back to "start".
behavior.chat.messageWidth
string
"100%"
Max message width (e.g., "100%", "768px")
behavior.chat.userMessageBubbleStyle
string
"default"
User message bubble shape. "default" = all corners rounded; "balloon" = rounded except bottom-right corner is square (speech balloon style). Corner radius is controlled by --message-border-radius (default 12dp).

Product Card

JSON Key
Type
Default
Description
behavior.productCard.cardStyle
string
"actionButton"
Product card layout. "actionButton" = image overlay with primary/secondary action buttons; "productDetail" = extended card with image, badge, name, subtitle, and price.
behavior.productCard.cardsAlignment
string
"center"
Horizontal alignment of product cards within their display area. "start" = left-aligned; "center" = centered; "end" = right-aligned.

Welcome Card

JSON Key
Type
Default
Description
behavior.welcomeCard.closeButtonAlignment
string
"end"
Close button position: "start" (left of title) or "end" (right of title)
behavior.welcomeCard.promptFullWidth
boolean
true
true = full-width rows with image thumbnails; false = compact pill chips with icon
behavior.welcomeCard.promptMaxLines
number
—
Max lines for prompt text. When omitted, the Android SDK applies no limit. Set to 1 for uniform pill heights with ellipsis.
behavior.welcomeCard.contentAlignment
string
"top"
Welcome card vertical position: "top" (anchored to top) or "center" (vertically centered)

Prompt Suggestions

JSON Key
Type
Default
Description
behavior.promptSuggestions.itemMaxLines
number
1
Max lines for suggestion chip text before ellipsis.
behavior.promptSuggestions.showHeader
boolean
false
Show a "Suggestions" header label above the chips. Label text is configurable via text["suggestions.header"].

Feedback

JSON Key
Type
Default
Description
behavior.feedback.displayMode
string
"modal"
Feedback dialog display mode. "modal" renders a centered modal card; "action" renders a ModalBottomSheet.
behavior.feedback.thumbsPlacement
string
"inline"
Thumbs up/down placement. "inline" places thumbs beside the sources accordion header; "below" places them below the accordion with a "Was this helpful?" label.
behavior.feedback.showCloseButton
boolean | null
null
X close button visibility. null = shown for "action", hidden for "modal".
behavior.feedback.showCancelButton
boolean | null
null
Cancel button visibility. null = shown for "modal", hidden for "action". Both set to false is honored: Submit and (in action mode) drag-down still dismiss.
behavior.feedback.alwaysDisplay
boolean
false
When true, shows the feedback thumbs as soon as the response finishes streaming, bypassing the server's feedbackEligible flag. Does not bypass the streaming-complete requirement.

Citations

JSON Key
Type
Default
Description
behavior.citations.showLinkIcon
boolean
false
Show an external link icon next to citation URLs, and next to links inline in AI message text.
behavior.citations.phoneIcon
string | null
null
Icon shown next to inline message links whose kind is "phone" (assigned by the response's linkHints, not inferred from the URL). A local asset basename under assets/icons/ or an absolute http(s) URL — same resolution rules as behavior.input.showAiChatIcon.icon. Falls back to the built-in pop-out icon when null, blank, or unresolvable.
behavior.citations.storeIcon
string | null
null
Same as phoneIcon, for links with kind "store".
behavior.citations.defaultLinkIcon
string | null
null
Same as phoneIcon, for links with any other kind — including links with no matching linkHints entry.
behavior.citations.linkIconStyle.size
number
16
Inline link icon size, in dp.
behavior.citations.linkIconStyle.spacing
number
2
Gap between link text and its icon, in dp.
behavior.citations.linkIconStyle.color
string
--message-concierge-link-color, else primary
Inline link icon tint color (hex).

phoneIcon/storeIcon/defaultLinkIcon/linkIconStyle only affect links rendered inline within AI message text. The citation list icon (in the expanded sources accordion) is a fixed 14dp size tinted with the citation URL color, and always uses the built-in pop-out icon — only showLinkIcon applies to it.

Example

{
  "behavior": {
    "multimodalCarousel": {
      "cardClickAction": "openLink",
      "carouselStyle": "scroll"
    },
    "productCard": {
      "cardStyle": "productDetail",
      "cardsAlignment": "center"
    },
    "input": {
      "enableVoiceInput": true,
      "sendButtonStyle": "default",
      "disableMultiline": false,
      "showAiChatIcon": {
        "icon": "ai-assistant-icon"
      }
    },
    "chat": {
      "messageAlignment": "left",
      "messageWidth": "100%",
      "userMessageBubbleStyle": "balloon"
    },
    "feedback": {
      "displayMode": "action",
      "thumbsPlacement": "below",
      "showCloseButton": true,
      "showCancelButton": false,
      "alwaysDisplay": false
    },
    "citations": {
      "showLinkIcon": true
    },
    "welcomeCard": {
      "closeButtonAlignment": "start",
      "promptFullWidth": false,
      "promptMaxLines": 1,
      "contentAlignment": "top"
    },
    "promptSuggestions": {
      "itemMaxLines": 1,
      "showHeader": true
    }
  }
}

Disclaimer

Legal disclaimer text with embedded links.

JSON Key
Type
Default
Description
disclaimer.text
string
"AI responses may be inaccurate. Check answers and sources. {Terms}"
Disclaimer text with {placeholders} for links
disclaimer.links
array
One default Terms link if empty
Array of link objects; each item has string properties text and url.
disclaimer.links[].text
string
""
Link display text (matches placeholder, e.g. Terms for {Terms})
disclaimer.links[].url
string
""
Link URL (opened when the user taps the link)

Example

{
  "disclaimer": {
    "text": "AI responses may be inaccurate. Check answers and sources. {Terms}",
    "links": [
      {
        "text": "Terms",
        "url": "https://www.adobe.com/legal/licenses-terms/adobe-gen-ai-user-guidelines.html"
      }
    ]
  }
}

To hide the disclaimer, omit the disclaimer key from the theme or set disclaimer.text to an empty string.

Text (Copy)

Localized UI strings using dot-notation keys.

✅ Content Recommendations

While there are no strict requirements for character limits in many of these text fields, it is strongly recommended that the values be tested on target device(s) prior to deployment, ensuring the UI renders as desired.

Welcome Screen

JSON Key
Default
Description
text["welcome.heading"]
"Explore what you can do with Adobe apps."
Welcome screen heading
text["welcome.subheading"]
"Choose an option or tell us..."
Welcome screen subheading

Input

JSON Key
Default
Description
text["input.placeholder"]
"Tell us what you'd like to do or create"
Input field placeholder
text["input.aiChatIcon.tooltip"]
"Ask AI"
AI icon tooltip

System Messages

JSON Key
Default
Description
text["error.network"]
"I'm sorry, I'm having trouble..."
Network error message
text["loading.message"]
"Generating response from our knowledge base"
Loading indicator text

Feedback Dialog

JSON Key
Default
Description
text["feedback.dialog.title.positive"]
"Your feedback is appreciated"
Positive feedback dialog title
text["feedback.dialog.title.negative"]
"Your feedback is appreciated"
Negative feedback dialog title
text["feedback.dialog.question.positive"]
"What went well? Select all that apply."
Positive feedback question
text["feedback.dialog.question.negative"]
"What went wrong? Select all that apply."
Negative feedback question
text["feedback.dialog.notes"]
"Notes"
Notes section label
text["feedback.dialog.submit"]
"Submit"
Submit button text
text["feedback.dialog.cancel"]
"Cancel"
Cancel button text
text["feedback.dialog.notes.placeholder"]
"Additional notes (optional)"
Notes placeholder
text["feedback.toast.success"]
"Thank you for the feedback."
Success toast message
JSON Key
Default
Description
text["sourcesLabel"]
"Sources"
Accordion label for the sources/feedback section
text["feedbackHelpfulLabel"]
"Was this helpful?"
Label shown above feedback thumbs when behavior.feedback.thumbsPlacement is "below". Set to "" to hide.

Prompt Suggestions

JSON Key
Default
Description
text["suggestions.header"]
"Suggestions"
Header label shown above prompt suggestion chips when behavior.promptSuggestions.showHeader is true.

Example

{
  "text": {
    "welcome.heading": "Welcome to Brand Concierge!",
    "welcome.subheading": "I'm your personal guide to help you explore.",
    "input.placeholder": "How can I help?",
    "error.network": "I'm sorry, I'm having trouble connecting.",
    "loading.message": "Generating response from our knowledge base...",
    "feedbackHelpfulLabel": "Was this helpful?",
    "sourcesLabel": "Sources & Feedback",
    "suggestions.header": "Suggestions",
    "feedback.dialog.title.positive": "Your feedback is appreciated",
    "feedback.dialog.title.negative": "Your feedback is appreciated",
    "feedback.dialog.question.positive": "What went well? Select all that apply.",
    "feedback.dialog.question.negative": "What went wrong? Select all that apply.",
    "feedback.dialog.notes": "Notes",
    "feedback.dialog.submit": "Submit",
    "feedback.dialog.cancel": "Cancel",
    "feedback.dialog.notes.placeholder": "Additional notes (optional)",
    "feedback.toast.success": "Thank you for the feedback."
  }
}

Arrays

List-based configuration for examples and feedback options.

Welcome Examples

You shouldn't have more than four items in your provided welcome examples.

Always test your values on device to ensure the UI looks as desired.

JSON Key
Type
Description
arrays["welcome.examples"]
array
Welcome screen example cards; each item is an object with text, optional image, and optional backgroundColor (hex string).
arrays["welcome.examples"][].text
string
Card display text
arrays["welcome.examples"][].image
string
Card image URL (optional; may be null or omitted).
arrays["welcome.examples"][].backgroundColor
string
Card background color as hex string (optional; may be null or omitted).

Feedback Options

You shouldn't have more than five options available for feedback.

Always test your values on device to ensure the UI looks as desired.

JSON Key
Type
Description
arrays["feedback.positive.options"]
array
Positive feedback checkbox options; array of strings.
arrays["feedback.negative.options"]
array
Negative feedback checkbox options; array of strings.

Example

{
  "arrays": {
    "welcome.examples": [
      {
        "text": "I'd like to explore templates to see what I can create.",
        "image": "https://example.com/template.png",
        "backgroundColor": "#F5F5F5"
      }
    ],
    "feedback.positive.options": [
      "Helpful and relevant recommendations",
      "Clear and easy to understand",
      "Other"
    ],
    "feedback.negative.options": [
      "Didn't understand my request",
      "Unhelpful or irrelevant information",
      "Other"
    ]
  }
}

Assets

Icon and image asset configuration.

JSON Key
Type
Default
Description
assets.icons.company
string
""
Company icon displayed to the left of agent text message bubbles. When set, all agent response elements — message text, product cards, and prompt suggestion chips — are automatically aligned to the icon column (flush with the right edge of the icon). Accepts a remote URL (http:// or https://) or a local asset name (without extension) resolved from the app's assets/icons/ folder. Supported local formats: .png, .webp, .jpg, .jpeg. Leave empty to show no icon.

Example

{
  "assets": {
    "icons": {
      "company": "https://example.com/brand-icon.png"
    }
  }
}

To use a local asset instead, place the image file in your app's assets/icons/ directory and set the value to the filename without its extension:

{
  "assets": {
    "icons": {
      "company": "company-logo"
    }
  }
}

Theme Tokens

Visual styling using CSS-like variable names. All properties in the theme object use the --property-name format.

Typography

CSS Variable
Kotlin Property
Type
Default
Description
--font-family
typography.fontFamily
String
null (system font)
Font family name
--line-height-body
typography.lineHeight
Double
1.0
Line height multiplier

Colors - Primary

CSS Variable
Kotlin Property
Type
Default
Description
--color-primary
colors.primaryColors.primary
String
"#1976D2"
Primary brand color (hex)
--color-text
colors.primaryColors.text
String
"#000000"
Primary text color (hex)
--color-container
colors.container
String?
null (falls back to hardcoded light/dark value)
Background for cards and container elements — prompt suggestion chips, product cards, message bubble fallback (hex)

Colors - Surface

CSS Variable
Kotlin Property
Type
Default
Description
--main-container-background
colors.surfaceColors.mainContainerBackground
String
"#FFFFFF"
Main container background (hex)
--main-container-bottom-background
colors.surfaceColors.mainContainerBottomBackground
String
"#FFFFFF"
Bottom container background (hex)
--message-blocker-background
colors.surfaceColors.messageBlockerBackground
String
"#FFFFFF"
Message blocker overlay (hex)

Colors - Messages

CSS Variable
Kotlin Property
Type
Default
Description
--message-user-background
colors.message.userBackground
String
"#E3F2FD"
User message bubble background (hex)
--message-user-text
colors.message.userText
String
"#000000"
User message text color (hex)
--message-concierge-background
colors.message.conciergeBackground
String
"#F5F5F5"
AI message bubble background (hex)
--message-concierge-text
colors.message.conciergeText
String
"#000000"
AI message text color (hex)
--message-concierge-link-color
colors.message.conciergeLink
String
"#1976D2"
Link color in AI messages (hex)

Colors - Buttons

CSS Variable
Kotlin Property
Type
Default
Description
--button-primary-background
colors.button.primaryBackground
String
"#1976D2"
Primary button background (hex)
--button-primary-text
colors.button.primaryText
String
"#FFFFFF"
Primary button text (hex)
--button-primary-hover
colors.button.primaryHover
String
"#1565C0"
Primary button hover state (hex)
--button-secondary-border
colors.button.secondaryBorder
String
"#1976D2"
Secondary button border (hex)
--button-secondary-text
colors.button.secondaryText
String
"#1976D2"
Secondary button text (hex)
--button-secondary-hover
colors.button.secondaryHover
String
"#E3F2FD"
Secondary button hover state (hex)
--color-button-secondary-hover-text
colors.button.secondaryHoverText
String
"#1976D2"
Secondary button hover text (hex)
--submit-button-fill-color
colors.button.submitFill
String
"#FFFFFF"
Submit button fill (hex)
--submit-button-fill-color-disabled
colors.button.submitFillDisabled
String
"#E0E0E0"
Disabled submit button fill (hex)
--color-button-submit
colors.button.submitText
String
"#1976D2"
Submit button icon/text color (hex)
--color-button-submit-hover
colors.button.submitTextHover
String
"#1565C0"
Submit button hover color (hex)
--button-disabled-background
colors.button.disabledBackground
String
"#E0E0E0"
Disabled button background (hex)

Colors - Input

CSS Variable
Kotlin Property
Type
Default
Description
--input-background
colors.input.background
String
"#FFFFFF"
Input field background (hex)
--input-text-color
colors.input.text
String
"#000000"
Input text color (hex)
--input-outline-color
colors.input.outline
String?
null
Input border color (hex)
--input-outline-gradient-start-color
colors.input.outlineGradient
String?
null
Input border gradient start color (hex). See Gradients. Overrides --input-outline-color when both gradient colors are set
--input-outline-gradient-end-color
colors.input.outlineGradient
String?
null
Input border gradient end color (hex)
--input-outline-gradient-angle
colors.input.outlineGradient
String
"180deg"
Input border gradient direction
--input-focus-outline-color
colors.input.outlineFocus
String
"#1976D2"
Focused input border color (hex)
--input-send-icon-color
colors.input.sendIconColor
String?
null
Send button icon color (hex). Falls back to onSurface
--input-send-arrow-icon-color
colors.input.sendArrowIconColor
String?
null
Arrow send button icon (arrow) color (hex). Falls back to onPrimary. Only used when sendButtonStyle is "arrow"
--input-send-arrow-background-color
colors.input.sendArrowBackgroundColor
String?
null
Arrow send button circle background color (hex). Falls back to sendIconColor then primary. Only used when sendButtonStyle is "arrow"
--input-send-arrow-background-gradient-start-color
colors.input.sendArrowBackgroundGradient
String?
null
Arrow send button circle gradient start color (hex). See Gradients. Only used when sendButtonStyle is "arrow"
--input-send-arrow-background-gradient-end-color
colors.input.sendArrowBackgroundGradient
String?
null
Arrow send button circle gradient end color (hex)
--input-send-arrow-background-gradient-angle
colors.input.sendArrowBackgroundGradient
String
"180deg"
Arrow send button circle gradient direction
--input-mic-icon-color
colors.input.micIconColor
String?
null
Mic button icon color (hex). Falls back to primary
--input-mic-icon-gradient-start-color
colors.input.micIconGradient
String?
null
Mic button icon gradient start color (hex). See Gradients
--input-mic-icon-gradient-end-color
colors.input.micIconGradient
String?
null
Mic button icon gradient end color (hex)
--input-mic-icon-gradient-angle
colors.input.micIconGradient
String
"180deg"
Mic button icon gradient direction
--input-mic-recording-icon-color
colors.input.micRecordingIconColor
String?
null
Waveform animation color during voice recording (hex). Falls back to onPrimary when enableMicPulseBackground is true, otherwise primary
--input-mic-waveform-gradient-start-color
colors.input.micWaveformGradient
String?
null
Start color of the listening waveform bars' gradient (hex). Requires the end color to also be set; otherwise falls back to micRecordingIconColor
--input-mic-waveform-gradient-end-color
colors.input.micWaveformGradient
String?
null
End color of the listening waveform bars' gradient (hex). Requires the start color to also be set; otherwise falls back to micRecordingIconColor
--input-mic-waveform-gradient-angle
colors.input.micWaveformGradient
String
"180deg"
Waveform bar gradient direction. Defaults to top-to-bottom

Colors - Welcome Prompts

CSS Variable
Kotlin Property
Type
Default
Description
--welcome-prompt-background-color
colors.welcomePrompt.backgroundColor
String?
null (falls back to surface)
Prompt pill background color (hex). Only applied if a per-prompt backgroundColor is not defined in the prompt configuration.
--welcome-prompt-text-color
colors.welcomePrompt.textColor
String?
null (falls back to onSurface)
Prompt pill text color (hex)

Colors - Prompt Suggestions

CSS Variable
Kotlin Property
Type
Default
Description
--suggestion-background-color
colors.promptSuggestion.backgroundColor
String?
null (falls back to --color-container then hardcoded light/dark value)
Prompt suggestion chip background color (hex)
--suggestion-text-color
colors.promptSuggestion.textColor
String?
null (falls back to --message-concierge-text then onSurface)
Prompt suggestion chip text and icon color (hex)

Colors - Circular Citations

CSS Variable
Kotlin Property
Type
Default
Description
--citations-background-color
colors.citation.backgroundColor
String
"#E0E0E0"
Citation pill background (hex)
--citations-text-color
colors.citation.textColor
String
"#000000"
Citation pill text color (hex).

Colors - Feedback

CSS Variable
Kotlin Property
Type
Default
Description
--feedback-icon-btn-background
colors.feedback.iconButtonBackground
String
"#FFFFFF"
Feedback button background (hex)
--feedback-icon-btn-hover-background
colors.feedback.iconButtonHoverBackground
String
"#F5F5F5"
Feedback button hover background (hex)

Feedback Dialog Colors

These tokens style the feedback dialog (modal card and action bottom sheet).

CSS Variable
Kotlin Property
Type
Default
Description
--feedback-sheet-background-color
colors.feedback.sheetBackground
String?
Falls back to colors.background
Dialog background fill; also applied to the notes editor.
--feedback-title-text-color
colors.feedback.titleText
String?
Falls back to colors.onBackground / colors.primary.text
Dialog title color.
--feedback-question-text-color
colors.feedback.questionText
String?
Falls back to the title color
Dialog question color.
--feedback-options-text-color
colors.feedback.optionsText
String?
Falls back to the title color
Checkbox option label color.
--feedback-checkbox-border-color
colors.feedback.checkboxBorder
String?
"#7F7F7F" (light) / "#B0B0B0" (dark)
Checkbox unchecked outline color. Also used for the notes editor outline.
--feedback-drag-handle-color
colors.feedback.dragHandle
String?
"#CCCCCC"
Drag handle color. Only visible in action mode.
--feedback-submit-button-fill-color
colors.feedback.submitButtonFill
String?
Falls back to colors.button.primaryBackground
Submit button fill color.
--feedback-submit-button-text-color
colors.feedback.submitButtonText
String?
Falls back to colors.button.primaryText
Submit button text color.
--feedback-cancel-button-fill-color
colors.feedback.cancelButtonFill
String?
null (transparent; outline style)
Cancel button fill. null = transparent (outline style); set to a color for a solid fill. The cancel button border is always applied — set --feedback-cancel-button-border-width to 0 to suppress it. Also tints the X close icon.
--feedback-cancel-button-text-color
colors.feedback.cancelButtonText
String?
Falls back to colors.button.secondaryText
Cancel button label color.
--feedback-cancel-button-border-color
colors.feedback.cancelButtonBorder
String?
Falls back to colors.button.secondaryBorder
Cancel button outline color. Applied whenever --feedback-cancel-button-border-width > 0, regardless of whether cancelButtonFill is set.

Contrast note: When --feedback-sheet-background-color is pinned, also set --feedback-title-text-color, --feedback-question-text-color, and --feedback-options-text-color to maintain text contrast. System defaults track the device palette, not the themed surface.

Colors - Disclaimer

CSS Variable
Kotlin Property
Type
Default
Description
--disclaimer-color
colors.disclaimer
String
"#757575"
Disclaimer text color (hex)

Colors - Thinking Animation

CSS Variable
Kotlin Property
Type
Default
Description
--thinking-dot-color
colors.thinking.dotColor
String?
null (falls back to --color-primary at 70% opacity)
Color of the thinking indicator dots (hex)

Colors - Extended Product Cards

Used when behavior.productCard.cardStyle is "productDetail".

CSS Variable
Kotlin Property
Type
Default
Description
--product-card-outline-color
cssLayout.productCardOutlineColor
String
"#E3E3E3"
Card border stroke color (hex)
--product-card-background-color
cssLayout.productCardBackgroundColor
String
"#FFFFFF"
Card background (hex)
--product-card-title-color
cssLayout.productCardTitleColor
String
"#191F1C"
Title text color (hex)
--product-card-subtitle-color
cssLayout.productCardSubtitleColor
String
"#4F4F4F"
Subtitle text color (hex)
--product-card-price-color
cssLayout.productCardPriceColor
String
"#191F1C"
Price text color (hex)
--product-card-badge-text-color
cssLayout.productCardBadgeTextColor
String
"#FFFFFF"
Badge text color (hex)
--product-card-badge-background-color
cssLayout.productCardBadgeBackgroundColor
String
primary color
Badge background (hex)
--product-card-was-price-color
cssLayout.productCardWasPriceColor
String
"#6E6E6E"
"Was" price text color (hex)
--product-card-cta-button-background-color
colors.productCardCtaButton.background
String
"#BB5811"
Product card CTA button background color (hex)
--product-card-cta-button-text-color
colors.productCardCtaButton.text
String
"#FFFFFF"
Product card CTA button label text color (hex)

Colors - CTA Button

CSS Variable
Kotlin Property
Type
Default
Description
--cta-button-background-color
colors.ctaButton.background
String
"#EDEDED"
CTA button background color (hex)
--cta-button-text-color
colors.ctaButton.text
String
"#191F1C"
CTA button label text color (hex)
--cta-button-icon-color
colors.ctaButton.iconColor
String
"#161313"
CTA button icon color (hex)

Layout value format: All layout measurements are specified as CSS strings in the JSON theme object (e.g. "8px", "16px") and integer quantities as numeric strings (e.g. "700", "400"). The SDK parses these into their internal Kotlin types (Double for dp values, Int for weights and orders). The Type and Default columns below reflect the internal representation.

Layout - Input

CSS Variable
Kotlin Property
Type
Default
Description
--input-height-mobile
cssLayout.inputHeight
Double
52.0
Input field height (dp)
--input-border-radius-mobile
cssLayout.inputBorderRadius
Double
12.0
Input field corner radius (dp)
--input-outline-width
cssLayout.inputOutlineWidth
Double
2.0
Input border width (dp)
--input-focus-outline-width
cssLayout.inputFocusOutlineWidth
Double
2.0
Focused input border width (dp)
--input-font-size
cssLayout.inputFontSize
Double
16.0
Input text font size (sp)
--input-button-height
cssLayout.inputButtonHeight
Double
24.0
Shared icon size (dp) for every icon in the input row: leading AI-chat icon, clear (x), mic, send, and stop-recording. Either this or --input-button-width alone is enough to override the default; when both are set, width wins.
--input-button-width
cssLayout.inputButtonWidth
Double
24.0
See --input-button-height — same shared input-row icon size, preferred over height when both are set.
--input-button-border-radius
cssLayout.inputButtonBorderRadius
Double
8.0
Input button corner radius (dp)
--input-box-shadow
cssLayout.inputBoxShadow
Map<String, Any>
null
Input field shadow

Layout - Messages

CSS Variable
Kotlin Property
Type
Default
Description
--message-border-radius
cssLayout.messageBorderRadius
Double
10.0
Message bubble corner radius (dp)
--message-padding
cssLayout.messagePadding
List<Double>
[8, 16]
Message content padding (dp)
--message-max-width
cssLayout.messageMaxWidth
Double?
null
Max message width (dp or %)
--agent-icon-size
cssLayout.agentIconSize
Double?
39.0
Size (dp) of the agent icon shown to the left of agent messages. Also determines the start offset applied to product cards and prompt suggestion chips so they align with the message text column.
--agent-icon-spacing
cssLayout.agentIconSpacing
Double?
12.0
Horizontal gap (dp) between the agent icon and the message card. Also contributes to the start offset of product cards and prompt suggestion chips.

Layout - Chat

CSS Variable
Kotlin Property
Type
Default
Description
--chat-interface-max-width
cssLayout.chatInterfaceMaxWidth
Double
768.0
Max chat interface width (dp)
--chat-history-padding
cssLayout.chatHistoryPadding
Double
16.0
Chat history horizontal padding (dp)
--chat-history-padding-top-expanded
cssLayout.chatHistoryPaddingTopExpanded
Double
8.0
Top padding when expanded (dp)
--chat-history-bottom-padding
cssLayout.chatHistoryBottomPadding
Double
12.0
Bottom padding (dp)
--message-blocker-height
cssLayout.messageBlockerHeight
Double
105.0
Message blocker overlay height (dp)
CSS Variable
Kotlin Property
Type
Default
Description
--border-radius-card
cssLayout.borderRadiusCard
Double
16.0
Card corner radius (dp)
--multimodal-card-box-shadow
cssLayout.multimodalCardBoxShadow
Map<String, Any>
null
Card shadow

Layout - Extended Product Cards

When behavior.productCard.cardStyle is "productDetail", product recommendations display as extended cards with image, badge, name, subtitle, and price. The following theme tokens customize the extended product card layout. See Colors - Extended Product Cards for color properties.

CSS Variable
Kotlin Property
Type
Default
Description
--product-card-width
cssLayout.productCardWidth
Double
250.0
Card width (dp)
--product-card-min-height
cssLayout.productCardMinHeight
Double
240.0
Minimum card height (dp); the card grows with its content up to --product-card-max-height.
--product-card-max-height
cssLayout.productCardMaxHeight
Double
360.0
Maximum card height (dp); content beyond this scrolls internally.
--product-card-border-radius
cssLayout.productCardBorderRadius
Double
8.0
Card corner radius (dp)
--product-image-width
cssLayout.productImageWidth
Double
190.0
Product image width (dp); the image always renders at this fixed size.
--product-image-height
cssLayout.productImageHeight
Double
190.0
Product image height (dp); the image always renders at this fixed size.
--product-image-scale
cssLayout.productImageScale
String
"fill"
Image scaling mode: "fit" shows the whole image uncropped inside the fixed image slot; "fill" (default, or any other value) scales to fill the slot and crops overflow.
--product-card-title-font-size
cssLayout.productCardTitleFontSize
Double
14.0
Title font size (sp)
--product-card-title-font-weight
cssLayout.productCardTitleFontWeight
Int
700
Title font weight
--product-card-subtitle-font-size
cssLayout.productCardSubtitleFontSize
Double
12.0
Subtitle font size (sp)
--product-card-subtitle-font-weight
cssLayout.productCardSubtitleFontWeight
Int
400
Subtitle font weight
--product-card-price-font-size
cssLayout.productCardPriceFontSize
Double
14.0
Price font size (sp)
--product-card-price-font-weight
cssLayout.productCardPriceFontWeight
Int
400
Price font weight
--product-card-badge-font-size
cssLayout.productCardBadgeFontSize
Double
12.0
Badge font size (sp)
--product-card-badge-font-weight
cssLayout.productCardBadgeFontWeight
Int
700
Badge font weight
--product-card-was-price-font-size
cssLayout.productCardWasPriceFontSize
Double
12.0
"Was" price font size (sp)
--product-card-was-price-font-weight
cssLayout.productCardWasPriceFontWeight
Int
400
"Was" price font weight
--product-card-was-price-text-prefix
cssLayout.productCardWasPriceTextPrefix
String
"was "
Prefix for "Was" price (e.g., "marked down from $99")
--product-card-text-horizontal-padding
cssLayout.productCardTextHorizontalPadding
Double
16.0
Horizontal padding for card text content (dp)
--product-card-text-top-padding
cssLayout.productCardTextTopPadding
Double
24.0
Top padding for card text content (dp)
--product-card-text-bottom-padding
cssLayout.productCardTextBottomPadding
Double
16.0
Bottom padding for card text content (dp)
--product-card-title-subtitle-spacing
cssLayout.productCardTitleSubtitleSpacing
Double
8.0
Gap between title and subtitle (dp). Falls back to --product-card-text-spacing when unset.
--product-card-section-spacing
cssLayout.productCardSectionSpacing
Double
16.0
Gap between the title/subtitle block and the price row (dp). Falls back to --product-card-text-spacing when unset.
--product-card-price-spacing
cssLayout.productCardPriceSpacing
Double
0.0
Gap between the price and the "was" price line (dp).
--product-card-text-spacing
cssLayout.productCardTextSpacing
Double?
null
Legacy fallback applied to both --product-card-title-subtitle-spacing (default 8.0) and --product-card-section-spacing (default 16.0) when they aren't set individually. Prefer setting those two directly (dp).
--product-card-carousel-horizontal-padding
cssLayout.productCardCarouselHorizontalPadding
Double
0.0
Extra trailing padding (dp) added to the carousel scroll content. Leading inset is always the 16dp base alignment inset only; trailing uses this value (falls back to --chat-history-padding when unset).
--product-card-carousel-spacing
cssLayout.productCardCarouselSpacing
Double
12.0
Spacing between carousel cards (dp)
--product-card-cta-button-border-radius
cssLayout.productCardCtaButtonBorderRadius
Double
40.0
Product card CTA button corner radius (dp)
--product-card-cta-button-horizontal-padding
cssLayout.productCardCtaButtonHorizontalPadding
Double
16.0
Product card CTA button horizontal padding (dp)
--product-card-cta-button-vertical-padding
cssLayout.productCardCtaButtonVerticalPadding
Double
8.0
Product card CTA button vertical padding (dp).
--product-card-cta-button-font-size
cssLayout.productCardCtaButtonFontSize
Double
12.0
Product card CTA button label font size (sp)
--product-card-cta-button-font-weight
cssLayout.productCardCtaButtonFontWeight
Int
600
Product card CTA button label font weight

Layout - Buttons

CSS Variable
Kotlin Property
Type
Default
Description
--button-height-s
cssLayout.buttonHeightSmall
Double
30.0
Small button height (dp)
--cta-button-border-radius
cssLayout.ctaButtonBorderRadius
Double
99.0
CTA button corner radius (dp)
--cta-button-horizontal-padding
cssLayout.ctaButtonHorizontalPadding
Double
16.0
CTA button horizontal padding (dp)
--cta-button-vertical-padding
cssLayout.ctaButtonVerticalPadding
Double
12.0
CTA button vertical padding (dp)
--cta-button-font-size
cssLayout.ctaButtonFontSize
Double
14.0
CTA button label font size (sp)
--cta-button-font-weight
cssLayout.ctaButtonFontWeight
Int
400
CTA button label font weight
--cta-button-icon-size
cssLayout.ctaButtonIconSize
Double
16.0
CTA button icon size (dp)

Layout - Feedback

CSS Variable
Kotlin Property
Type
Default
Description
--feedback-container-gap
cssLayout.feedbackContainerGap
Double
4.0
Gap between feedback buttons (dp)
--feedback-icon-btn-size-desktop
components.feedback.iconButtonSizeDesktop
Double
32.0
Feedback button hit target size (dp)

Feedback Dialog Layout

These tokens style the feedback dialog layout (modal card and action bottom sheet).

CSS Variable
Kotlin Property
Type
Default
Description
--feedback-submit-button-border-radius
cssLayout.feedbackSubmitButtonBorderRadius
Double?
10.0
Submit button corner radius (dp).
--feedback-cancel-button-border-radius
cssLayout.feedbackCancelButtonBorderRadius
Double?
10.0
Cancel button corner radius (dp).
--feedback-cancel-button-border-width
cssLayout.feedbackCancelButtonBorderWidth
Double?
1.0
Cancel button outline width (dp).
--feedback-submit-button-font-weight
cssLayout.feedbackSubmitButtonFontWeight
Int?
600
Submit button label font weight.
--feedback-cancel-button-font-weight
cssLayout.feedbackCancelButtonFontWeight
Int?
600
Cancel button label font weight.
--feedback-checkbox-border-radius
cssLayout.feedbackCheckboxBorderRadius
Double?
6.0
Checkbox corner radius (dp). Also used for the notes editor corner radius.
--feedback-title-text-align
cssLayout.feedbackTitleTextAlign
ConciergeTextAlignment?
null (START)
Feedback dialog title alignment. Accepts "start" / "leading" / "left", "center" / "justify", or "end" / "trailing" / "right". Case-insensitive; unknown values fall back to START.
--feedback-title-font-size
cssLayout.feedbackTitleFontSize
Double?
22.0
Title font size (sp).

Components - Feedback

Non-CSS components.feedback overrides for the feedback dialog.

JSON Key
Type
Default
Description
components.feedback.iconButtonSizeDesktop
number
32
Feedback icon button hit target size (dp). Mirrors --feedback-icon-btn-size-desktop.
components.feedback.positiveNotesEnabled
boolean
true
Notes field visibility for positive-sentiment modal. Not applied in action mode.
components.feedback.negativeNotesEnabled
boolean
true
Notes field visibility for negative-sentiment modal. Not applied in action mode.

Note: The notes field is only available in "modal" display mode, gated by components.feedback.positiveNotesEnabled / negativeNotesEnabled.

Layout - Citations

CSS Variable
Kotlin Property
Type
Default
Description
--citations-text-font-weight
cssLayout.citationsTextFontWeight
Int
700
Citation text weight
--citations-desktop-button-font-size
cssLayout.citationsDesktopButtonFontSize
Double
14.0
Citation button font size (sp)

Layout - Disclaimer

CSS Variable
Kotlin Property
Type
Default
Description
--disclaimer-font-size
cssLayout.disclaimerFontSize
Double
12.0
Disclaimer font size (sp)
--disclaimer-font-weight
cssLayout.disclaimerFontWeight
Int
400
Disclaimer font weight

Layout - Welcome Screen

CSS Variable
Kotlin Property
Type
Default
Description
--welcome-input-order
cssLayout.welcomeInputOrder
Int
3
Input field display order
--welcome-cards-order
cssLayout.welcomeCardsOrder
Int
2
Example cards display order
--header-title-font-size
cssLayout.headerTitleFontSize
Double
null (uses headlineSmall)
Header title font size (sp)
--welcome-title-font-size
cssLayout.welcomeTitleFontSize
Double
null (uses headlineSmall)
Welcome card title font size (sp)
--welcome-text-align
cssLayout.welcomeTextAlign
String
"center"
Welcome card text alignment ("left", "center", "right")
--welcome-content-padding
cssLayout.welcomeContentPadding
Double
20.0
Welcome card content padding (dp)
--welcome-prompt-image-size
cssLayout.welcomePromptImageSize
Double
75.0
Prompt suggestion thumbnail size (dp)
--welcome-prompt-spacing
cssLayout.welcomePromptSpacing
Double
8.0
Spacing between prompt items (dp)
--welcome-title-bottom-spacing
cssLayout.welcomeTitleBottomSpacing
Double
8.0
Spacing below welcome title (dp)
--welcome-prompts-top-spacing
cssLayout.welcomePromptsTopSpacing
Double
8.0
Spacing above prompt list (dp)
--welcome-prompt-padding
cssLayout.welcomePromptPadding
Double
0.0
Inner padding for prompt pills (dp)
--welcome-prompt-corner-radius
cssLayout.welcomePromptCornerRadius
Double
8.0
Prompt pill corner radius (dp)
--suggestion-item-border-radius
cssLayout.suggestionItemBorderRadius
Double
10.0
Prompt suggestion chip corner radius (dp)

Layout - Thinking Animation

CSS Variable
Kotlin Property
Type
Default
Description
--thinking-dot-size
cssLayout.thinkingDotSize
Double
8.0
Diameter of each thinking indicator dot (dp)
--thinking-dot-spacing
cssLayout.thinkingDotSpacing
Double
8.0
Space between thinking indicator dots (dp)
--thinking-bubble-border-radius
cssLayout.thinkingBubbleBorderRadius
Double
8.0
Corner radius of the thinking bubble (dp)
--thinking-bubble-padding-horizontal
cssLayout.thinkingBubblePaddingHorizontal
Double
16.0
Horizontal inner padding of the thinking bubble (dp)
--thinking-bubble-padding-vertical
cssLayout.thinkingBubblePaddingVertical
Double
8.0
Vertical inner padding of the thinking bubble (dp)
--thinking-dot-vertical-alignment
cssLayout.thinkingDotVerticalAlignment
String
"center"
Vertical alignment of the thinking dots row: "top", "center", or "bottom"

Complete Example

{
  "metadata": {
    "brandName": "Concierge Demo",
    "version": "1.0.0",
    "language": "en-US",
    "namespace": "brand-concierge"
  },
  "header": {
    "title": "Concierge",
    "subtitle": "Powered by Adobe"
  },
  "behavior": {
    "multimodalCarousel": {
      "cardClickAction": "openLink",
      "carouselStyle": "paged"
    },
    "productCard": {
      "cardStyle": "actionButton",
      "cardsAlignment": "center"
    },
    "input": {
      "enableVoiceInput": true,
      "sendButtonStyle": "default",
      "disableMultiline": false,
      "showAiChatIcon": {
        "icon": "ai-assistant-icon"
      }
    },
    "chat": {
      "messageAlignment": "left",
      "messageWidth": "100%",
      "userMessageBubbleStyle": "balloon"
    },
    "feedback": {
      "displayMode": "action",
      "thumbsPlacement": "inline",
      "alwaysDisplay": false
    },
    "citations": {
      "showLinkIcon": false
    },
    "welcomeCard": {
      "closeButtonAlignment": "start",
      "promptFullWidth": false,
      "promptMaxLines": 1,
      "contentAlignment": "top"
    }
  },
  "disclaimer": {
    "text": "AI responses may be inaccurate. Check answers and sources. {Terms}",
    "links": [
      {
        "text": "Terms",
        "url": "https://www.adobe.com/legal/licenses-terms/adobe-gen-ai-user-guidelines.html"
      }
    ]
  },
  "text": {
    "welcome.heading": "Welcome to Brand Concierge!",
    "welcome.subheading": "I'm your personal guide to help you explore.",
    "input.placeholder": "How can I help?",
    "input.aiChatIcon.tooltip": "Ask AI",
    "error.network": "I'm sorry, I'm having trouble connecting to our services right now.",
    "loading.message": "Generating response from our knowledge base...",
    "feedbackHelpfulLabel": "Was this helpful?",
    "sourcesLabel": "Sources",
    "feedback.dialog.title.positive": "Your feedback is appreciated",
    "feedback.dialog.title.negative": "Your feedback is appreciated",
    "feedback.dialog.question.positive": "What went well? Select all that apply.",
    "feedback.dialog.question.negative": "What went wrong? Select all that apply.",
    "feedback.dialog.notes": "Notes",
    "feedback.dialog.submit": "Submit",
    "feedback.dialog.cancel": "Cancel",
    "feedback.dialog.notes.placeholder": "Additional notes (optional)",
    "feedback.toast.success": "Thank you for the feedback."
  },
  "arrays": {
    "welcome.examples": [
      {
        "text": "I'd like to explore templates to see what I can create.",
        "image": "https://example.com/template.png",
        "backgroundColor": "#F5F5F5"
      },
      {
        "text": "Help me find recommendations.",
        "image": "https://example.com/example.png",
        "backgroundColor": "#F5F5F5"
      },
      {
        "text": "Where can I learn more?",
        "image": "https://example.com/learn-more.png",
        "backgroundColor": "#F5F5F5"
      }
    ],
    "feedback.positive.options": [
      "Helpful and relevant recommendations",
      "Clear and easy to understand",
      "Friendly and conversational tone",
      "Visually appealing presentation",
      "Other"
    ],
    "feedback.negative.options": [
      "Didn't understand my request",
      "Unhelpful or irrelevant information",
      "Too vague or lacking detail",
      "Errors or poor quality response",
      "Other"
    ]
  },
  "assets": {
    "icons": {
      "company": ""
    }
  },
  "theme": {
    "--welcome-input-order": "3",
    "--welcome-cards-order": "2",
    "--header-title-font-size": "18px",
    "--welcome-title-font-size": "16px",
    "--welcome-text-align": "left",
    "--welcome-content-padding": "16px",
    "--welcome-prompt-image-size": "16px",
    "--welcome-prompt-padding": "12px",
    "--welcome-prompt-corner-radius": "20px",
    "--welcome-prompt-background-color": "#F5F5F5",
    "--welcome-prompt-text-color": "#000000",
    "--welcome-prompt-spacing": "8px",
    "--suggestion-background-color": "#F0F0F0",
    "--suggestion-text-color": "#131313",
    "--suggestion-item-border-radius": "10px",
    "--thinking-dot-color": "#1B6B58",
    "--thinking-dot-size": "8px",
    "--thinking-dot-spacing": "8px",
    "--thinking-bubble-border-radius": "8px",
    "--thinking-bubble-padding-horizontal": "16px",
    "--thinking-bubble-padding-vertical": "8px",
    "--thinking-dot-vertical-alignment": "center",
    "--welcome-title-bottom-spacing": "6px",
    "--welcome-prompts-top-spacing": "12px",
    "--font-family": "",
    "--color-primary": "#EB1000",
    "--color-text": "#131313",
    "--color-container": "#F0F0F0",
    "--line-height-body": "1.75",
    "--main-container-background": "#FFFFFF",
    "--main-container-bottom-background": "#FFFFFF",

    "--message-blocker-background": "#00000066",

    "--message-user-background": "#E3F2FD",
    "--message-user-text": "#000000",

    "--message-concierge-background": "#F5F5F5",
    "--message-concierge-text": "#000000",
    "--message-concierge-link-color": "#1976D2",

    "--message-max-width": "100%",
    "--message-border-radius": "10px",
    "--message-padding": "8px 16px",
    "--agent-icon-size": "39px",
    "--agent-icon-spacing": "12px",

    "--chat-interface-max-width": "768px",
    "--chat-history-padding": "16px",
    "--chat-history-padding-top-expanded": "0",
    "--chat-history-bottom-padding": "0",
    "--message-blocker-height": "105px",

    "--input-height-mobile": "52px",
    "--input-border-radius-mobile": "12px",
    "--button-primary-background": "#1976D2",
    "--button-primary-text": "#FFFFFF",
    "--button-primary-hover": "#1565C0",
    "--button-secondary-border": "#1976D2",
    "--button-secondary-text": "#1976D2",
    "--button-secondary-hover": "#E3F2FD",
    "--color-button-secondary-hover-text": "#1976D2",
    "--button-height-s": "30px",
    "--button-disabled-background": "#E0E0E0",

    "--submit-button-fill-color": "#FFFFFF",
    "--submit-button-fill-color-disabled": "#C6C6C6",
    "--color-button-submit": "#1976D2",
    "--color-button-submit-hover": "#1565C0",

    "--cta-button-background-color": "#EDEDED",
    "--cta-button-text-color": "#191F1C",
    "--cta-button-icon-color": "#161313",
    "--cta-button-border-radius": "99px",
    "--cta-button-horizontal-padding": "16px",
    "--cta-button-vertical-padding": "12px",
    "--cta-button-font-size": "14px",
    "--cta-button-font-weight": "400",
    "--cta-button-icon-size": "16px",

    "--disclaimer-color": "#757575",
    "--disclaimer-font-size": "12px",
    "--disclaimer-font-weight": "400",

    "--input-background": "#FFFFFF",
    "--input-outline-color": null,
    "--input-outline-gradient-start-color": "#1976D2",
    "--input-outline-gradient-end-color": "#4B75FF",
    "--input-outline-gradient-angle": "90deg",
    "--input-outline-width": "2px",
    "--input-box-shadow": "0 2px 8px 0 #00000014",
    "--input-focus-outline-width": "2px",
    "--input-text-color": "#000000",
    "--input-focus-outline-color": "#1976D2",
    "--input-send-icon-color": "#000000",
    "--input-send-arrow-icon-color": "#FFFFFF",
    "--input-send-arrow-background-color": "#1976D2",
    "--input-send-arrow-background-gradient-start-color": "#1976D2",
    "--input-send-arrow-background-gradient-end-color": "#4B75FF",
    "--input-send-arrow-background-gradient-angle": "135deg",
    "--input-mic-icon-color": "#000000",
    "--input-mic-icon-gradient-start-color": "#1976D2",
    "--input-mic-icon-gradient-end-color": "#4B75FF",
    "--input-mic-icon-gradient-angle": "135deg",
    "--input-mic-recording-icon-color": "#FFFFFF",
    "--input-mic-waveform-gradient-start-color": "#1976D2",
    "--input-mic-waveform-gradient-end-color": "#4B75FF",
    "--input-mic-waveform-gradient-angle": "180deg",
    "--input-font-size": "16px",
    "--input-button-height": "32px",
    "--input-button-width": "32px",
    "--input-button-border-radius": "8px",
    "--input-send-icon-color": "#1976D2",
    "--input-mic-icon-color": "#1976D2",

    "--citations-text-font-weight": "700",
    "--citations-desktop-button-font-size": "12px",
    "--citations-background-color": "#E0E0E0",
    "--citations-text-color": "#000000",

    "--feedback-icon-btn-background": "#FFFFFF",
    "--feedback-icon-btn-hover-background": "#F5F5F5",
    "--feedback-icon-btn-size-desktop": "32px",
    "--feedback-container-gap": "4px",
    "--feedback-sheet-background-color": "#FFFFFF",
    "--feedback-title-text-color": "#131313",
    "--feedback-question-text-color": "#424242",
    "--feedback-options-text-color": "#131313",
    "--feedback-checkbox-border-color": "#131313",
    "--feedback-drag-handle-color": "#CCCCCC",
    "--feedback-submit-button-fill-color": "#EB1000",
    "--feedback-submit-button-text-color": "#FFFFFF",
    "--feedback-submit-button-border-radius": "10px",
    "--feedback-submit-button-font-weight": "600",
    "--feedback-cancel-button-fill-color": null,
    "--feedback-cancel-button-text-color": "#EB1000",
    "--feedback-cancel-button-border-color": "#EB1000",
    "--feedback-cancel-button-border-width": "1px",
    "--feedback-cancel-button-border-radius": "10px",
    "--feedback-cancel-button-font-weight": "600",
    "--feedback-checkbox-border-radius": "6px",
    "--feedback-title-text-align": "start",
    "--feedback-title-font-size": "22px",

    "--multimodal-card-box-shadow": "none",
    "--border-radius-card": "16px",

    "--product-card-outline-color": "#E3E3E3",
    "--product-card-width": "222px",
    "--product-card-min-height": "240px",
    "--product-card-max-height": "360px",
    "--product-card-border-radius": "8px",
    "--product-image-width": "190px",
    "--product-image-height": "190px",
    "--product-image-scale": "fill",
    "--product-card-title-font-weight": "700",
    "--product-card-title-font-size": "14px",
    "--product-card-title-color": "#191F1C",
    "--product-card-subtitle-font-weight": "400",
    "--product-card-subtitle-font-size": "12px",
    "--product-card-subtitle-color": "#4F4F4F",
    "--product-card-price-font-weight": "400",
    "--product-card-price-font-size": "14px",
    "--product-card-price-color": "#191F1C",
    "--product-card-badge-font-weight": "700",
    "--product-card-badge-font-size": "12px",
    "--product-card-badge-text-color": "#FFFFFF",
    "--product-card-badge-background-color": "#1976D2",
    "--product-card-background-color": "#FFFFFF",
    "--product-card-was-price-color": "#6E6E6E",
    "--product-card-was-price-font-size": "12px",
    "--product-card-was-price-font-weight": "400",
    "--product-card-was-price-text-prefix": "previously ",
    "--product-card-text-horizontal-padding": "16px",
    "--product-card-text-top-padding": "24px",
    "--product-card-text-bottom-padding": "16px",
    "--product-card-title-subtitle-spacing": "8px",
    "--product-card-section-spacing": "16px",
    "--product-card-price-spacing": "0px",
    "--product-card-carousel-horizontal-padding": "16px",
    "--product-card-carousel-spacing": "12px",
    "--product-card-cta-button-background-color": "#BB5811",
    "--product-card-cta-button-text-color": "#FFFFFF",
    "--product-card-cta-button-border-radius": "40px",
    "--product-card-cta-button-horizontal-padding": "16px",
    "--product-card-cta-button-vertical-padding": "8px",
    "--product-card-cta-button-font-size": "12px",
    "--product-card-cta-button-font-weight": "600"
  }
}

Implementation Status

This section documents which properties are fully implemented, partially implemented, or not yet implemented in the Android SDK based on actual usage in composables.

Legend

Status
Description
✅
Fully implemented - property is mapped and actively used in composables
⚠️
Defined but unused - property is parsed but not rendered in any composable
❌
Not supported - property exists in web JSON but is ignored by Android

Note: The tables below include a "Used In" column showing which UI composables consume each theme property.

Implementation Summary

Overall Implementation Status:

Key Differences from Web/iOS:

Metadata

Property
Status
Notes
Used In
metadata.brandName
⚠️
Parsed but not used
-
metadata.version
⚠️
Parsed but not used
-
metadata.language
⚠️
Parsed but not used
-
metadata.namespace
⚠️
Parsed but not used
-

Header

Property
Status
Notes
Used In
header.title
✅
Falls back to "Concierge" only when both title and subtitle are unset
ChatHeader
header.subtitle
✅
Falls back to "Powered by Adobe" only when both title and subtitle are unset
ChatHeader
header.image
✅
Rendered only when layoutType is "imageOnly"; falls back to a default chat icon when unset/blank/unresolvable
ChatHeader
header.layoutType
✅
Switches between image-only and text-only header content
ChatHeader
header.imageHeight
✅
Defaults to 48dp
ChatHeader

Behavior

Property
Status
Notes
Used In
behavior.multimodalCarousel.cardClickAction
⚠️
Parsed but not implemented in carousel composables
-
behavior.multimodalCarousel.carouselStyle
✅
Switches between paged (prev/next/dots) and continuous scroll
ProductCarousel
behavior.productCard.cardStyle
✅
Switches between action-button cards and extended product-detail cards
RecommendationCards, ProductCarousel
behavior.productCard.cardsAlignment
✅
Controls horizontal alignment of product cards ("start", "center", "end")
RecommendationCards
behavior.input.enableVoiceInput
✅
Controls mic button visibility
InputActionButtons
behavior.input.sendButtonStyle
✅
"default" (paper airplane) or "arrow" (filled circle with upward arrow)
SendButton
behavior.input.disableMultiline
✅
Restricts input to a single line when true
ChatTextField
behavior.input.showAiChatIcon
✅
Rendered as a leading icon before the text field
ChatInputPanel
behavior.input.enableMicPulseBackground
✅
Shows/hides the pulsing colored disc behind the mic/waveform icon while recording
MicButton
behavior.input.stopRecordingIcon
✅
Falls back to the Material stop-circle icon when unset/blank/unresolvable
InputActionButtons
behavior.chat.messageAlignment
✅
"start" (default, full-width), "center", or "end" alignment for agent message bubbles
ChatMessageItem
behavior.chat.messageWidth
⚠️
Parsed but not implemented
-
behavior.chat.userMessageBubbleStyle
✅
"default" (all corners rounded) or "balloon" (square bottom-right corner)
ChatMessageItem
behavior.welcomeCard.closeButtonAlignment
✅
"start" or "end" close button position
ChatHeader
behavior.welcomeCard.promptFullWidth
✅
Full-width cards vs compact pill chips
SuggestedPromptItem
behavior.welcomeCard.promptMaxLines
✅
Max lines for prompt text (uniform pill height)
SuggestedPromptItem
behavior.welcomeCard.contentAlignment
✅
"top" or "center" vertical position
ConciergeChat

Disclaimer

Property
Status
Notes
Used In
disclaimer.text
✅
Rendered below chat input; default used if omitted
ConciergeDisclaimer
disclaimer.links
✅
Placeholders in text replaced by tappable links
ConciergeDisclaimer

Text (Copy)

Property
Status
Notes
Used In
text["welcome.heading"]
✅
Welcome screen title
WelcomeCard
text["welcome.subheading"]
✅
Welcome screen description
WelcomeCard
text["input.placeholder"]
✅
Input field hint text
ChatTextField
text["input.aiChatIcon.tooltip"]
✅
Used as the content description for the leading input icon
ChatInputPanel
text["error.network"]
⚠️
Parsed but error uses hardcoded text
-
text["loading.message"]
✅
Loading animation text
ConciergeThinking
text["feedback.dialog.title.positive"]
✅
Feedback dialog title for positive feedback
FeedbackDialog
text["feedback.dialog.title.negative"]
✅
Feedback dialog title for negative feedback
FeedbackDialog
text["feedback.dialog.question.positive"]
✅
Feedback dialog question for positive feedback
FeedbackDialog
text["feedback.dialog.question.negative"]
✅
Feedback dialog question for negative feedback
FeedbackDialog
text["feedback.dialog.notes"]
✅
Feedback dialog notes label
FeedbackDialog
text["feedback.dialog.submit"]
✅
Feedback dialog submit button text
FeedbackDialog
text["feedback.dialog.cancel"]
✅
Feedback dialog cancel button text
FeedbackDialog
text["feedback.dialog.notes.placeholder"]
✅
Feedback dialog notes placeholder
FeedbackDialog
text["feedback.toast.success"]
⚠️
Parsed but toast not implemented
-
text["sourcesLabel"]
✅
Accordion label for sources/feedback section
ChatFooter → SourcesAccordionButton
text["feedbackHelpfulLabel"]
✅
Feedback helpful label shown in below thumbs placement mode
FeedbackButtons

Behavior — Feedback & Citations

Property
Status
Notes
Used In
behavior.feedback.displayMode
✅
Modal (default) or ActionSheet feedback dialog
FeedbackDialog
behavior.feedback.thumbsPlacement
✅
Inline (default) or below sources accordion
ChatFooter
behavior.feedback.showCloseButton
✅
Toggles the top-right X close button; defaults by displayMode when null
FeedbackDialog
behavior.feedback.showCancelButton
✅
Toggles the Cancel button; defaults by displayMode when null
FeedbackDialog
behavior.feedback.alwaysDisplay
✅
Bypasses feedbackEligible (not the streaming-complete requirement) once the response finishes
ChatFooter
behavior.citations.showLinkIcon
✅
External link icon next to citation URLs, and next to inline message links
ExpandedCitations → CitationItem; ConciergeResponse → LinkHintUiUtils
behavior.citations.phoneIcon
✅
Icon for inline links with kind: "phone"
LinkHintUiUtils
behavior.citations.storeIcon
✅
Icon for inline links with kind: "store"
LinkHintUiUtils
behavior.citations.defaultLinkIcon
✅
Icon for inline links with any other/unmatched kind
LinkHintUiUtils
behavior.citations.linkIconStyle
✅
Size/spacing/color for inline link icons
ConciergeResponse

Arrays

Property
Status
Notes
Used In
arrays["welcome.examples"]
✅
Suggested prompts displayed on welcome screen
WelcomeCard → PromptSuggestions
arrays["feedback.positive.options"]
✅
Positive feedback category options
FeedbackDialog
arrays["feedback.negative.options"]
✅
Negative feedback category options
FeedbackDialog

Assets

Property
Status
Notes
Used In
assets.icons.company
✅
Company icon displayed to the left of agent text message bubbles. When set, product cards and prompt suggestion chips are automatically offset to align with the agent text column.
ChatMessageItem (RenderTextMessageWithIcon, RenderMixedMessage)

Theme Tokens - Typography

CSS Variable
Status
Notes
Used In
--font-family
⚠️
Parsed but not implemented
-
--line-height-body
✅
Body text line height
All text components via ConciergeStyles.withThemeTypography
--input-font-size
✅
Input field text size
ChatTextField
--citations-desktop-button-font-size
✅
Citation pill text size
CircularCitation
--disclaimer-font-size
✅
Disclaimer text size
ConciergeDisclaimer (DisclaimerStyle)

Theme Tokens - Colors

Note: The following base colors are not configurable via JSON themes. They are hardcoded in LightConciergeColors / DarkConciergeColors and serve as fallback colors throughout the UI:

These colors are used internally by composables but cannot be customized in theme JSON files. See "Fallback Colors" section at the end.

Note: container (card/chip background) is now configurable via --color-container.

CSS Variable
Status
Notes
Used In
--thinking-dot-color
✅
Thinking indicator dot color
ConciergeThinking
--thinking-dot-size
✅
Thinking indicator dot size
ConciergeThinking
--thinking-dot-spacing
✅
Spacing between thinking dots
ConciergeThinking
--thinking-bubble-border-radius
✅
Thinking bubble corner radius
ChatMessageItem
--thinking-bubble-padding-horizontal
✅
Thinking bubble horizontal padding
ChatMessageItem
--thinking-bubble-padding-vertical
✅
Thinking bubble vertical padding
ChatMessageItem
--thinking-dot-vertical-alignment
✅
Vertical alignment of the thinking dots row
ConciergeThinking
--color-primary
✅
Primary brand color
Product buttons, feedback dialog submit button, feedback checkbox (checked fill), mic button icon, thinking animation (fallback when --thinking-dot-color not set)
--color-text
✅
Primary text color; used for body text on main background and for micButtonColor in parsed theme (mic icon uses --color-primary in UI)
ChatHeader, WelcomeCard, prompt suggestions (when theme loaded)
--color-container
✅
Background for cards and container elements; fallback for prompt suggestion chips when --suggestion-background-color is not set
ProductCard, PromptSuggestions, ChatInputPanel (fallback)
--main-container-background
✅
Main chat screen, welcome card, and feedback dialog background
ChatScreen, WelcomeCard, FeedbackDialog
--main-container-bottom-background
✅
Bottom container/surface background
Input area, voice recording panel
--message-blocker-background
⚠️
Parsed but not used in UI
-
--message-user-background
✅
User message bubble background
ChatMessageItem
--message-user-text
✅
User message text color
ChatMessageItem
--message-concierge-background
✅
AI message bubble background
ChatMessageItem
--message-concierge-text
✅
AI message text color, feedback dialog text, feedback button icons, prompt suggestion chip text/icon fallback, expanded citation list text, chat footer (Sources label and icon)
ChatMessageItem, FeedbackDialog, FeedbackButtons, PromptSuggestions, ExpandedCitations, ChatFooter, ProductCard text, ProductCarousel switcher color
--message-concierge-link-color
✅
Link color in AI messages; expanded citation list URLs
ExpandedCitations (citation URLs); message body links when applied
--button-primary-background
✅
Primary button background
ProductActionButtons
--button-primary-text
✅
Primary button text
ProductActionButtons
--button-primary-hover
⚠️
Parsed but no hover states on Android
-
--button-secondary-border
✅
Secondary button border
ProductActionButtons
--button-secondary-text
✅
Secondary button text
ProductActionButtons
--button-secondary-hover
⚠️
Parsed but no hover states on Android
-
--color-button-secondary-hover-text
⚠️
Parsed but no hover states on Android
-
--submit-button-fill-color
✅
Feedback dialog submit button background
FeedbackDialog
--submit-button-fill-color-disabled
⚠️
Parsed but disabled state not implemented
-
--color-button-submit
✅
Feedback dialog submit button text/icon, also used for send/mic icons
FeedbackDialog, InputActionButtons
--color-button-submit-hover
⚠️
Parsed but no hover states on Android
-
--button-disabled-background
⚠️
Parsed but disabled state not implemented
-
--input-background
✅
Input field background
ChatInputPanel
--input-text-color
✅
Input field text color
ChatTextField, FeedbackDialog
--input-outline-color
✅
Input field border color
ChatInputPanel
--input-outline-gradient-start-color
✅
Input border gradient start color, overrides --input-outline-color
ChatInputPanel
--input-outline-gradient-end-color
✅
Input border gradient end color
ChatInputPanel
--input-outline-gradient-angle
✅
Input border gradient direction
ChatInputPanel
--input-focus-outline-color
✅
Input field focused border color
ChatInputPanel
--input-send-icon-color
✅
Send button icon color (default style tint)
SendButton
--input-send-arrow-icon-color
✅
Arrow send button icon color (arrow style only)
SendButton
--input-send-arrow-background-color
✅
Arrow send button circle background (arrow style only)
SendButton
--input-send-arrow-background-gradient-start-color
✅
Arrow send button circle gradient start color
SendButton
--input-send-arrow-background-gradient-end-color
✅
Arrow send button circle gradient end color
SendButton
--input-send-arrow-background-gradient-angle
✅
Arrow send button circle gradient direction
SendButton
--input-mic-icon-color
✅
Mic button icon color
MicButton
--input-mic-icon-gradient-start-color
✅
Mic button icon gradient start color
MicButton
--input-mic-icon-gradient-end-color
✅
Mic button icon gradient end color
MicButton
--input-mic-icon-gradient-angle
✅
Mic button icon gradient direction
MicButton
--input-mic-recording-icon-color
✅
Waveform animation color during recording
MicButton, AnimatedAudioWave
--input-mic-waveform-gradient-start-color
✅
Start color of the listening waveform bars' gradient
AnimatedAudioWave
--input-mic-waveform-gradient-end-color
✅
End color of the listening waveform bars' gradient
AnimatedAudioWave
--input-mic-waveform-gradient-angle
✅
Waveform bar gradient direction
AnimatedAudioWave
--welcome-prompt-background-color
✅
Welcome prompt pill background
SuggestedPromptItem
--welcome-prompt-text-color
✅
Welcome prompt pill text
SuggestedPromptItem
--suggestion-background-color
✅
Prompt suggestion chip background
PromptSuggestions
--suggestion-text-color
✅
Prompt suggestion chip text and icon color
PromptSuggestions
--citations-background-color
✅
Citation pill background
CircularCitation
--citations-text-color
✅
Citation pill (badge) text
CircularCitation
--feedback-icon-btn-background
✅
Thumbs up/down button background
FeedbackComponents
--feedback-icon-btn-hover-background
⚠️
Parsed but no hover states on Android
-
--feedback-sheet-background-color
✅
Feedback dialog sheet/modal card background + notes editor fill
FeedbackDialog
--feedback-title-text-color
✅
Feedback dialog title text
FeedbackDialog
--feedback-question-text-color
✅
Feedback dialog question text
FeedbackDialog
--feedback-options-text-color
✅
Feedback checkbox option labels
FeedbackDialog
--feedback-checkbox-border-color
✅
Checkbox unchecked outline + notes editor outline
FeedbackDialog
--feedback-drag-handle-color
✅
Action-sheet drag handle
FeedbackDialog
--feedback-submit-button-fill-color
✅
Submit button fill
FeedbackDialog
--feedback-submit-button-text-color
✅
Submit button text
FeedbackDialog
--feedback-cancel-button-fill-color
✅
Cancel button fill + X close icon tint
FeedbackDialog
--feedback-cancel-button-text-color
✅
Cancel button text
FeedbackDialog
--feedback-cancel-button-border-color
✅
Cancel button outline
FeedbackDialog
--disclaimer-color
✅
Disclaimer text color
ConciergeDisclaimer (DisclaimerStyle)
--cta-button-background-color
✅
CTA button background color
CtaButton
--cta-button-text-color
✅
CTA button label text color
CtaButton
--cta-button-icon-color
✅
CTA button icon color
CtaButton
--product-card-outline-color
✅
Extended product card border color
ExtendedProductCard
--product-card-background-color
✅
Extended product card background
ExtendedProductCard
--product-card-title-color
✅
Extended product card title color
ExtendedProductCard
--product-card-subtitle-color
✅
Extended product card subtitle color
ExtendedProductCard
--product-card-price-color
✅
Extended product card price color
ExtendedProductCard
--product-card-badge-text-color
✅
Extended product card badge text color
ExtendedProductCard
--product-card-badge-background-color
✅
Extended product card badge background
ExtendedProductCard
--product-card-was-price-color
✅
Extended product card "was" price color
ExtendedProductCard
--product-card-cta-button-background-color
✅
Product card CTA button background color
ExtendedProductCard
--product-card-cta-button-text-color
✅
Product card CTA button label text color
ExtendedProductCard

Note: The feedback dialog checkbox uses --color-primary for the check box filled color; the checkmark icon is white and is not configurable via theme.

Theme Tokens - Layout

CSS Variable
Status
Notes
Used In
--input-height-mobile
⚠️
Parsed but not used in composables
-
--input-border-radius-mobile
✅
Input field corner radius
ChatInputPanel
--input-outline-width
✅
Input field border width
ChatInputPanel
--input-focus-outline-width
✅
Input field focused border width
ChatInputPanel
--input-font-size
✅
Input field text size
ChatTextField
--input-button-height
✅
Sizes every input-row icon (leading AI-chat icon, clear, mic, send, stop-recording)
ConciergeStyles.inputRowIconSize
--input-button-width
✅
Sizes every input-row icon (leading AI-chat icon, clear, mic, send, stop-recording)
ConciergeStyles.inputRowIconSize
--input-button-border-radius
⚠️
Parsed but not used in composables
-
--input-box-shadow
⚠️
Parsed but shadows not rendered
-
--message-border-radius
✅
Corner radius for all message bubbles; applies to both user and agent bubbles
ChatMessageItem
--message-padding
⚠️
Parsed but not used in composables
-
--message-max-width
⚠️
Parsed but not used in composables
-
--agent-icon-size
✅
Size of agent icon next to agent messages
ChatMessageItem (RenderTextMessageWithIcon)
--agent-icon-spacing
✅
Gap between agent icon and message card
ChatMessageItem (RenderTextMessageWithIcon)
--chat-interface-max-width
⚠️
Parsed but not used in composables
-
--chat-history-padding
⚠️
Parsed but not used in composables
-
--chat-history-padding-top-expanded
⚠️
Parsed but not used in composables
-
--chat-history-bottom-padding
⚠️
Parsed but not used in composables
-
--message-blocker-height
⚠️
Parsed but not used in composables
-
--border-radius-card
⚠️
Parsed but not used in composables
-
--multimodal-card-box-shadow
✅
Card drop shadow (blur radius → elevation, color → ambient/spot shadow color)
ExtendedProductCard
--product-card-width
✅
Extended product card width
ExtendedProductCard, ProductCarousel
--product-card-min-height
✅
Minimum card height; card grows with content
ExtendedProductCard
--product-card-max-height
✅
Maximum card height; content beyond this scrolls internally
ExtendedProductCard
--product-card-border-radius
✅
Extended product card corner radius
ExtendedProductCard
--product-image-width
✅
Fixed product image width
ExtendedProductCard
--product-image-height
✅
Fixed product image height
ExtendedProductCard
--product-image-scale
✅
"fit" (uncropped) or "fill" (default, cropped)
ExtendedProductCard
--product-card-title-font-size
✅
Extended product card title size
ExtendedProductCard
--product-card-title-font-weight
✅
Extended product card title weight
ExtendedProductCard
--product-card-subtitle-font-size
✅
Extended product card subtitle size
ExtendedProductCard
--product-card-subtitle-font-weight
✅
Extended product card subtitle weight
ExtendedProductCard
--product-card-price-font-size
✅
Extended product card price size
ExtendedProductCard
--product-card-price-font-weight
✅
Extended product card price weight
ExtendedProductCard
--product-card-badge-font-size
✅
Extended product card badge size
ExtendedProductCard
--product-card-badge-font-weight
✅
Extended product card badge weight
ExtendedProductCard
--product-card-was-price-font-size
✅
Extended product card "was" price size
ExtendedProductCard
--product-card-was-price-font-weight
✅
Extended product card "was" price weight
ExtendedProductCard
--product-card-was-price-text-prefix
✅
Extended product card "was" price prefix
ExtendedProductCard
--product-card-text-horizontal-padding
✅
Extended product card text horizontal padding
ExtendedProductCard
--product-card-text-top-padding
✅
Extended product card text top padding
ExtendedProductCard
--product-card-text-bottom-padding
✅
Extended product card text bottom padding
ExtendedProductCard
--product-card-title-subtitle-spacing
✅
Gap between title and subtitle
ExtendedProductCard
--product-card-section-spacing
✅
Gap between the title/subtitle block and the price row
ExtendedProductCard
--product-card-price-spacing
✅
Gap between price and "was" price
ExtendedProductCard
--product-card-text-spacing
⚠️
Legacy fallback for the two spacing tokens above; prefer setting those directly
-
--product-card-carousel-horizontal-padding
✅
Extra trailing inset only; leading is always the 16dp base inset
ProductCarousel
--product-card-carousel-spacing
✅
Spacing between carousel cards
ProductCarousel
--product-card-cta-button-border-radius
✅
Product card CTA button corner radius
ExtendedProductCard
--product-card-cta-button-horizontal-padding
✅
Product card CTA button horizontal padding
ExtendedProductCard
--product-card-cta-button-vertical-padding
✅
Product card CTA button vertical padding
ExtendedProductCard
--product-card-cta-button-font-size
✅
Product card CTA button label font size
ExtendedProductCard
--product-card-cta-button-font-weight
✅
Product card CTA button label font weight
ExtendedProductCard
--button-height-s
⚠️
Parsed but not used in composables
-
--cta-button-border-radius
✅
CTA button corner radius
CtaButton
--cta-button-horizontal-padding
✅
CTA button horizontal padding
CtaButton
--cta-button-vertical-padding
✅
CTA button vertical padding
CtaButton
--cta-button-font-size
✅
CTA button label font size
CtaButton
--cta-button-font-weight
✅
CTA button label font weight
CtaButton
--cta-button-icon-size
✅
CTA button icon size
CtaButton
--feedback-container-gap
⚠️
Parsed but not used in composables
-
--feedback-icon-btn-size-desktop
⚠️
Parsed but not used in composables
-
--feedback-submit-button-border-radius
✅
Submit button corner radius
FeedbackDialog
--feedback-submit-button-font-weight
✅
Submit button label weight
FeedbackDialog
--feedback-cancel-button-border-radius
✅
Cancel button corner radius
FeedbackDialog
--feedback-cancel-button-border-width
✅
Cancel button outline width
FeedbackDialog
--feedback-cancel-button-font-weight
✅
Cancel button label weight
FeedbackDialog
--feedback-checkbox-border-radius
✅
Checkbox + notes editor corner radius
FeedbackDialog
--feedback-title-text-align
✅
Feedback dialog title alignment
FeedbackDialog
--feedback-title-font-size
✅
Feedback dialog title size
FeedbackDialog
--citations-text-font-weight
⚠️
Parsed but not used in composables
-
--citations-desktop-button-font-size
✅
Citation pill text size
CircularCitation
--disclaimer-font-size
✅
Disclaimer text size (sp)
ConciergeDisclaimer (DisclaimerStyle)
--disclaimer-font-weight
✅
Disclaimer font weight
ConciergeDisclaimer (DisclaimerStyle)
--welcome-input-order
⚠️
Parsed but welcome layout not customizable
-
--welcome-cards-order
⚠️
Parsed but welcome layout not customizable
-
--header-title-font-size
✅
Header title font size
ChatHeader
--welcome-title-font-size
✅
Welcome card title font size
WelcomeCard
--welcome-text-align
✅
Welcome card text alignment
WelcomeCard
--welcome-content-padding
✅
Welcome card content padding
WelcomeCard
--welcome-prompt-image-size
✅
Prompt thumbnail size
SuggestedPromptItem
--welcome-prompt-spacing
✅
Spacing between prompt items
WelcomeCard
--welcome-title-bottom-spacing
✅
Spacing below welcome title
WelcomeCard
--welcome-prompts-top-spacing
✅
Spacing above prompt list
WelcomeCard
--welcome-prompt-padding
✅
Inner padding for prompt pills
SuggestedPromptItem
--welcome-prompt-corner-radius
✅
Prompt pill corner radius
SuggestedPromptItem
--suggestion-item-border-radius
✅
Prompt suggestion chip corner radius
PromptSuggestions

Unsupported CSS Variables

The following CSS variables from web themes are not supported on Android (desktop-only properties like --input-height and --input-border-radius without -mobile suffix):

CSS Variable
Notes
--input-height
Use --input-height-mobile instead
--input-border-radius
Use --input-border-radius-mobile instead
--message-alignment
Use behavior.chat.messageAlignment instead
--message-width
Use behavior.chat.messageWidth instead

Fallback Colors (Not Theme-Configurable)

The following colors from LightConciergeColors / DarkConciergeColors are hardcoded and cannot be customized via JSON themes. They serve as fallback colors throughout the UI:

Color
Purpose
Used In Composables
secondary
Secondary accent color (currently unused)
-
onSurfaceVariant
Muted text and icons for secondary UI elements
ChatFooter, FeedbackDialog (unchecked checkboxes)
container
Background for cards and container elements — configurable via --color-container
ProductCard, PromptSuggestions (fallback when --suggestion-background-color not set), ChatInputPanel (fallback)
outline
Borders, separators, and outline elements
ChatFooter separator, ProductActionButtons (secondary button fallback), FeedbackDialog text field border, ProductCarousel nav buttons
error
Error state background
ErrorOverlay background
onError
Error state text
ErrorOverlay message text
onSurface
Primary text on surface backgrounds
VoiceRecordingPanel, FeedbackDialog, fallback for feedback buttons

Note: While these colors provide consistent fallback styling, they cannot be overridden in theme JSON files. If you need custom colors for these UI elements, use the theme-specific CSS variables that map to these elements (e.g., use --input-outline-color instead of relying on the outline fallback).

Recommendations for Theme Authors

What to Focus On

When creating themes for the Android SDK, focus on these actively used properties for the best results:

Essential Colors (Highest Impact):

Essential Text/Copy:

Essential Behavior:

Essential Layout:

Extended Product Cards (when behavior.productCard.cardStyle is "productDetail"):

What Can Be Skipped

These properties are parsed but not currently used and can be omitted without affecting the UI:

Testing Your Theme

  1. Test core flows: Create a theme, load it, send messages, provide feedback
  2. Check on multiple devices: Test on different screen sizes and Android versions
  3. Verify contrast ratios: Ensure text is readable on all backgrounds
  4. Test with and without a theme: With no theme loaded, the welcome card and prompts follow system light/dark (dark background + light text in dark mode). With a theme loaded, welcome example backgroundColor and theme colors are applied
  5. Test light/dark modes: If supporting both, verify colors work in both contexts