Icon Button
Icon buttons render an icon-only action without a visible text label. Use them sparingly where space is constrained and the icon is unambiguous.
Ready to use
Icon Buttons are circular interactive elements that display a single icon to trigger an action or represent a state. They’re used when an action can be represented visually — Close, Play, Next — without the need for text. The component is fully responsive and intentionally designed to be used across all viewports, with no alternative versions required.
Anatomy
Section titled “Anatomy”- Container
- Icon
When to use it
Section titled “When to use it”Use Icon Buttons when:
- The action is simple and universally recognisable (play, pause, close, next, previous).
- Text would crowd the surface but the meaning of the icon is clear in context.
- The control sits in regular page chrome and a circular affordance fits the layout.
Avoid Icon Buttons when:
- A label is needed for clarity — use a standard Button instead.
- The icon’s meaning is ambiguous and there’s no tooltip to clarify it.
- The action is play/pause inside a media surface — reach for the Media Button instead.
Properties
Section titled “Properties”Type
Two visual styles: Filled (solid background, no border) and Outlined (transparent background with a 1px border). Pick filled for emphasis on neutral surfaces, outlined when the button should sit lighter inside a busy layout.
Size
Four sizes — XS (22×22), SM (32×32), MD (40×40), and LG (80×80) — with matching icon glyphs. Choose the smallest size that still clears the 24×24 minimum touch area; LG suits hero or focal controls.
State
Rested, Hover, Active, Focus, and Disabled. Hover and focus styles are intentionally distinct so keyboard users get a clear ring; disabled state mutes both fill and icon.
Contrast
A boolean that flips the colour set for use over dark imagery or high-contrast surfaces. Use the contrast variant when the surrounding scheme calls for inverted foreground colours.
Background
A boolean that toggles the filled background on or off. Turning it off leaves a transparent button that relies on the icon alone — useful in compact toolbars where the fill would feel heavy.
Platform considerations
Section titled “Platform considerations”Desktop
Pointer accuracy is high, but keep the visible size at MD or above for primary actions so the target stays comfortable to click.
Tablet
Touch is mixed with pointer here. Don’t drop below SM and respect the 44×44 px recommended touch area for any control the user repeats.
Mobile
Mobile is touch-first. Aim for MD or LG for any button the user reaches for repeatedly, and keep generous spacing around adjacent buttons.
Best practices
Section titled “Best practices”Treat Icon Buttons as glyph-only — readability and a clear accessible name carry all the meaning.
Do
Always provide an ARIA label that names the action (“Close”, “Play video”), keep hover and focus styles visually distinct so keyboard users get clear feedback, and respect the minimum 24×24 px touch area (44×44 recommended).
Don't
Don’t reach for an Icon Button when the icon’s meaning depends on context — pair it with a tooltip or use a standard button instead. Don’t use it for navigation unless the glyph reads unambiguously, and don’t fold focus and hover into one shared state.
Content guidelines
Section titled “Content guidelines”Icon Buttons are icon-only, so the accessible name does all the work. Write a short verb phrase that describes the action from the user’s perspective — “Close”, “Play video”, “Next slide” — not the icon name. Update the label when the action toggles (an aria-label that says “Play” while the icon is showing “pause” is worse than no label at all). Keep wording consistent across the product so screen-reader users recognise familiar actions.
Styles
Section titled “Styles”Variants
Section titled “Variants”<button class="tng-icon-button" aria-label="Download"> <i class="tng-icon icon-download" aria-hidden="true"></i></button><button class="tng-icon-button is-outlined" aria-label="Bookmark"> <i class="tng-icon icon-bookmark" aria-hidden="true"></i></button><button class="tng-icon-button is-ghost" aria-label="External link"> <i class="tng-icon icon-external-link" aria-hidden="true"></i></button>The default size is sm.
<button class="tng-icon-button is-xs" aria-label="Search"> <i class="tng-icon icon-search" aria-hidden="true"></i></button><button class="tng-icon-button is-sm" aria-label="Search"> <i class="tng-icon icon-search" aria-hidden="true"></i></button><button class="tng-icon-button is-md" aria-label="Calendar"> <i class="tng-icon icon-calendar" aria-hidden="true"></i></button><button class="tng-icon-button is-lg" aria-label="Confirm"> <i class="tng-icon icon-check" aria-hidden="true"></i></button>States
Section titled “States”<button class="tng-icon-button" disabled aria-label="Download"> <i class="tng-icon icon-download" aria-hidden="true"></i></button><button class="tng-icon-button is-outlined" disabled aria-label="External link"> <i class="tng-icon icon-external-link" aria-hidden="true"></i></button><button class="tng-icon-button is-ghost" disabled aria-label="External link"> <i class="tng-icon icon-external-link" aria-hidden="true"></i></button>Description
Section titled “Description”The Icon Button is an interactive component that wraps an icon inside a button element. It supports event handling, accessibility, making it suitable for actions in menus, carousel, overlay, etc.
Component
Section titled “Component”Properties
Section titled “Properties”Icons reference icons.
The IconButtonProperties extends <React.HTMLAttributes<HTMLButtonElement> which means it includes all standard HTML attributes that can be applied to an HTML Button element.
| Prop | Type | Description | Optional |
|---|---|---|---|
iconName | ToyotaIcon | LexusIcon | The rendered Icon inside button component from the library | ❌ |
size | Size | Defines the size of the button | ✅ |
isOutlined | boolean | Display the button with outlined style (no border, no background-color) | ✅ |
isNeutral | boolean | Display the button with neutral style | ✅ |
className | ClassValue | Custom classNames you want to apply on the button element | ✅ |
screenReaderText | string | Accessibility label used for screen readers | ✅ |
Example
Section titled “Example”import { IconButton } from '@tmedxp/react-components';
const IconButtonExample = () => { return ( <IconButton iconName="travel" size="lg" isOutlined={true} isNeutral={true} /> );};
export { IconButtonExample };Accessibility
Section titled “Accessibility”Icon Buttons are interactive components that rely solely on visual cues (icons, outlines, and focus rings) to convey meaning. Because they don’t include text, ensuring accessibility through proper semantics, focus management, and colour contrast is essential.
For Design
Section titled “For Design”Minimum touch area
Section titled “Minimum touch area”To ensure accessibility and ease of interaction across devices, all interactive elements — including Icon Buttons — must respect a minimum touch target size.
Absolute minimum: 24 × 24 px — This is the lowest technical requirement referenced in accessibility standards (WCAG 2.5.5, EN 301549). It ensures the button can still be reached, but doesn’t guarantee an optimal experience for all users.
Recommended best practice: 44 × 44 px — Provides a comfortable interaction area for users with motor impairments, touch devices, or outdoor use. Should be considered the default requirement for Icon Buttons in our system.
The minimum target size applies regardless of the visual size of the icon or container. If the visual element is smaller (e.g. small icons or outlined variants), add invisible padding to meet the required target area. Maintain consistency across all sizes (LG, MD, SM) and across both styles (Filled / Outlined).
Do
Add invisible padding to meet the minimum touch size without altering the visual design, ensure the button remains tappable and clearly identifiable in responsive layouts and mobile contexts, and keep spacing between Icon Buttons to at least one touch target so targets never overlap.
Don't
Don’t rely on the visible icon size to define the touch area, don’t define interactive areas smaller than the minimum even for small icons, and don’t cluster multiple Icon Buttons too closely — that makes interaction difficult for users.
For Dev
Section titled “For Dev”To ensure Icon Buttons meet accessibility standards across platforms, follow this implementation checklist. These recommendations align with WCAG 2.2 AA and EN 301549, supporting keyboard navigation, screen readers, and assistive technologies.
- Screen reader support
- Use semantic
<button>elements for all Icon Buttons. - Each button must include a descriptive
aria-labelthat clearly communicates its purpose. - When used as toggles, add
aria-pressed="true"or"false"to indicate the current state. - Avoid using decorative icons alone — hide them from assistive tech with
aria-hidden="true". - Never use
<div>or<span>elements styled as buttons, as they break keyboard semantics.
- Use semantic
- Keyboard navigation
- Buttons must be focusable via Tab and activatable via Enter or Space.
- Maintain a visible focus state at all times, consistent with the visual design.
- Avoid intercepting default keyboard behaviour unless required (e.g. arrow keys for carousels).
- Ensure sufficient contrast between link focus indicators and adjacent elements (minimum 3:1).
- Motion sensitivity and feedback
- Avoid any animations that trigger automatically or on hover.
- Respect user preferences (
prefers-reduced-motion). - Motion should always support, not replace, visual state changes.
- ARIA and markup
- Always expose the button role and name to assistive technology (
role="button",aria-label="..."). - Use
aria-pressedfor toggle buttons andaria-busyfor asynchronous actions. - Use
aria-live="polite"for status updates triggered by Icon Buttons (e.g. loading states).
- Always expose the button role and name to assistive technology (
- Testing and validation
- Validate accessibility using tools like Axe, Lighthouse, or Accessibility Insights.
- Verify focus visibility under both light and dark modes.
- Test manually using keyboard navigation to ensure expected behaviour and focus order.