AI Button
Action – AI
The AI button is the entry point to AI / concierge features. At rest it is an icon-only circle carrying the ai-sparkle glyph; on hover, keyboard focus, or press it expands to reveal its label (“Hi, I’m Concierge”). The expansion is pure CSS — the label is always in the DOM, so it is also the button’s accessible name.
Usable — may still change
The AI button is the entry point to AI / concierge features. At rest it is an icon-only circle carrying the ai-sparkle glyph; on hover, keyboard focus, or press it auto-expands to reveal its label. Reach for it only where an AI / assistant experience sits behind the click — for any other icon-only control, use Icon Button.
Anatomy
Section titled “Anatomy”The anatomy below is shown in its expanded state so both parts are visible; at rest only the circular icon shows.
- AI button
- AI sparkle icon
- Label
When to use it
Section titled “When to use it”Use the AI button when:
- The click opens an AI / concierge / assistant experience and you want a compact, self-announcing entry point.
- Space is tight at rest but the affordance should still say what it is once the user engages.
Avoid the AI button when:
- The action isn’t AI-related — use Icon Button or a standard Button.
- You need a persistent, always-visible label — use a standard Button with the
ai-sparkleicon instead. - The control needs play / pause or media semantics — that’s Media Button.
Properties
Section titled “Properties”Expand on interaction
At rest the button is a 40 × 40 circle with the glyph filling it. On hover, focus-visible, and active it expands horizontally to reveal the label in lg-button typography and the glyph steps down to 20 px. Keyboard focus expands it too, so the label is not hover-only.
Contrast
Two modes: Neutral for light surfaces and Contrast for dark ones. Each carries its own rested / hover / active fill and foreground from the buttons/ai-button token scale.
Brand shape
The expanded corner is brand-specific: Toyota expands to a sharp-cornered rectangle (radius-none), Lexus to a fully rounded pill (radius-xl). The rested circle is identical on both.
Lexus copper gradient
On Lexus the fill is a copper gradient — linear (left → right) at rest, sliding to radial (inside → outside) on hover — reusing the shared background-gradient tokens (--tng-color-background-gradient-*). Figma ships a flat copper placeholder because multi-brand variables can’t carry gradients. On active, Lexus drops to the flat primary (indigo) token.
Platform considerations
Section titled “Platform considerations”Desktop
Hover is the primary reveal. Place the button where its expansion has room to grow inline without colliding with adjacent chrome.
Tablet
Same 40 px footprint. Focus and press both expand it, so the label is still reachable without a pointer.
Mobile
With no hover, the label reveals on press / focus. The 40 × 40 rested target clears the touch-target minimum, so the collapsed circle is safe to tap.
Best practices
Section titled “Best practices”Do
Keep the label short so the expanded width stays manageable, reserve the button for genuine AI entry points, and leave room for it to expand inline.
Don't
Don’t use it as a generic icon button, don’t rely on hover as the only way to reach the label (focus and press expand it too), and don’t place it where the expansion would be clipped.
Content guidelines
Section titled “Content guidelines”The label doubles as the accessible name, so make it a meaningful standalone announcement of the control’s purpose — the concierge greeting “Hi, I’m Concierge” identifies the assistant. Keep it to a few words; the button expands to fit, and long labels stretch it across the layout.
A native <button> with two children: the decorative ai-sparkle glyph and a label. At rest the label column is collapsed to zero width (the button is a circle); on :hover, :focus-visible, and :active it expands to reveal the label. This is pure CSS — no JavaScript, and the label stays in the DOM so it is the button’s accessible name.
<button class="tng-ai-button" type="button"> <i class="tng-icon icon-ai-sparkle" aria-hidden="true"></i> <span>Hi, I'm Concierge</span></button>Elements
Section titled “Elements”The label is any non-icon child — no class needed (it is targeted structurally). It must be a real element (not a bare text node) because it is the grid column that collapses and clips at rest. Keep it short: the button expands to the label’s content width.
The glyph is decorative — mark it aria-hidden="true". The button takes its accessible name from the label text, so the icon never needs its own.
Behaviour
Section titled “Behaviour”The expand / collapse is driven entirely by :hover, :focus-visible, and :active — there is no state class and no script. Keyboard focus expands the button as well, so keyboard and pointer users both reach the label. Width animates via a grid-column transition, the corner morphs (circle → the brand’s expanded shape), and the glyph steps from 40 px down to 20 px.
States
Section titled “States”Hover, focus, and active are driven by the browser and styled by the design system — no extra classes. Disabled uses the native disabled attribute; a disabled AI button does not expand.
<button class="tng-ai-button" type="button"> <i class="tng-icon icon-ai-sparkle" aria-hidden="true"></i> <span>Hi, I'm Concierge</span></button><button class="tng-ai-button" type="button" disabled> <i class="tng-icon icon-ai-sparkle" aria-hidden="true"></i> <span>Hi, I'm Concierge</span></button>The AI button is a native <button> that follows the WAI-ARIA Button pattern and meets WCAG 2.1 AA. Its distinguishing trait — the label collapses out of view at rest and reveals on interaction — is safe for assistive technology because the label is always in the DOM: it is the button’s accessible name whether the button is collapsed or expanded. The three things to get right are a meaningful label, a decorative icon hidden from assistive technology, and enough contrast for both the glyph and the label.
For designers
Section titled “For designers”- The label doubles as the accessible name, so it must stand alone as a meaningful announcement of the control’s purpose (the concierge greeting “Hi, I’m Concierge” identifies the assistant). A screen-reader user hears the label with no visual context, so avoid opaque or truncated wording. Source: WCAG 2.4.4 Link Purpose.
- The reveal is not hover-only: keyboard focus and press expand the button too, so sighted keyboard and touch users can read the label. Don’t gate the label behind pointer hover alone. Source: WCAG 1.4.13 Content on Hover or Focus.
- The glyph must keep at least 3:1 contrast against the fill in every state and on both brands, and the expanded label must meet 4.5:1 as normal text. The Lexus copper fill in particular needs its label checked against the gradient’s lightest stop. Source: WCAG 1.4.3 Contrast (Minimum) and 1.4.11 Non-text Contrast.
- The focus ring must stay visible over both light and dark surfaces — don’t override it. Source: WCAG 2.4.7 Focus Visible.
- The rested circle is 40 × 40, clearing the target-size minimum, so the collapsed control is safe to tap. Source: WCAG 2.5.8 Target Size (Minimum).
- The expand / collapse animation rides the design-system transition-duration tokens, which collapse to ~0 under
prefers-reduced-motion: reduce. Source: WCAG 2.3.3 Animation from Interactions.
For developers
Section titled “For developers”The AI button is a native <button>, so it is focusable and keyboard-operable (Enter / Space) with no extra wiring — never style a <div> or <a> to stand in for it. It takes its accessible name from the visible label text, which is always present in the DOM, so no aria-label is required; the decorative glyph carries aria-hidden="true" to stay out of the accessibility tree. Disabled is the native disabled attribute, which also suppresses the expand. The per-element roles, names, and states are in the Labelling elements section below.
Labelling elements
Section titled “Labelling elements”Give every element the role, name, and state assistive technology needs.
Button
The native <button> carries its own role and keyboard operation. Its accessible name comes from the label child — no aria-label needed as long as the label describes the action. Add type="button" so it doesn’t submit a surrounding form.
Icon
The glyph is decorative — mark it aria-hidden="true" so it isn’t announced separately.
Label
The visible label is the accessible name and stays in the DOM even when visually collapsed, so screen readers always announce it. Keep it meaningful on its own.
Disabled
Use the native disabled attribute — not an .is-disabled class — so the control is announced as unavailable and skipped in the tab order.
Source: WCAG 4.1.2 Name, Role, Value.