Skip to content

← All components

Actions and forms

IconButton

Compact labelled action for a single Lucide icon.

Live example

Usage

Each example includes the complete adapter-specific parameter reference. Copy it as a starting point, then remove options your use case does not need.

React

tsx
import { IconButton } from "@cofob/design-system-react";

/**
 * Complete IconButton parameter reference.
 * @param label
 *   type: string | renderable content
 *   required
 *   example: "Accessible label"
 * @param icon/children
 *   type: LucideIcon (React) | icon snippet (Svelte)
 *   required
 *   example: {Plus} / icon snippet
 * @param size
 *   type: "sm" | "md" | "lg" (plus heading sizes)
 *   default: "md"
 *   example: "md"
 * @param variant
 *   type: "primary" | "secondary" | "ghost" | "danger"
 *   default: "secondary"
 *   example: "secondary"
 * @param loading
 *   type: boolean
 *   default: false
 *   example: true
 * @param button attributes
 *   type: native element attributes
 *   default: —
 *   example: class / style / aria-* / data-*
 */
export function IconButtonExample() {
  return (
    <IconButton label="Add" icon={Plus} />
  );
}

Svelte

svelte
<script lang="ts">
  import { IconButton } from "@cofob/design-system-svelte";

  // Complete IconButton parameter reference.
  // label
  //   type: string | renderable content
  //   required
  //   example: "Accessible label"
  // icon/children
  //   type: LucideIcon (React) | icon snippet (Svelte)
  //   required
  //   example: {Plus} / icon snippet
  // size
  //   type: "sm" | "md" | "lg" (plus heading sizes)
  //   default: "md"
  //   example: "md"
  // variant
  //   type: "primary" | "secondary" | "ghost" | "danger"
  //   default: "secondary"
  //   example: "secondary"
  // tone
  //   type: "neutral" | "accent" | "info" | "success" | "warning" | "danger"
  //   default: "neutral"
  //   example: "success"
  // loading
  //   type: boolean
  //   default: false
  //   example: true
  // button attributes
  //   type: native element attributes
  //   default: —
  //   example: class / style / aria-* / data-*
</script>

<IconButton label="Add" icon={Plus} />

HTML

html
<!--
  Complete IconButton parameter reference.
  label
    type: string | renderable content
    required
    example: "Accessible label"
  icon/children
    type: LucideIcon (React) | icon snippet (Svelte)
    required
    example: {Plus} / icon snippet
  size
    type: "sm" | "md" | "lg" (plus heading sizes)
    default: "md"
    example: "md"
  variant
    type: "primary" | "secondary" | "ghost" | "danger"
    default: "secondary"
    example: "secondary"
  tone
    type: "neutral" | "accent" | "info" | "success" | "warning" | "danger"
    default: "neutral"
    example: "success"
  loading
    type: boolean
    default: false
    example: true
  button attributes
    type: native element attributes
    default: —
    example: class / style / aria-* / data-*
-->
<button class="cf-icon-button" aria-label="Add">+</button>

<script type="module">
  import { initDesignSystem } from "@cofob/design-system-css";

  const designSystem = initDesignSystem(document);
  window.addEventListener("pagehide", () => designSystem.destroy(), { once: true });
</script>

Parameters

Adapter differences are explicit. Native element attributes are forwarded in React and Svelte and can be written directly in HTML.

ParameterTypeDefaultAdaptersExampleDescription
labelrequiredstring | renderable contentrequiredReact · Svelte · HTML"Accessible label"Visible or accessible name, depending on the component.
icon/childrenrequiredLucideIcon (React) | icon snippet (Svelte)requiredReact · Svelte · HTML{Plus} / icon snippetSupplies the only visible icon while label remains accessible.
size"sm" | "md" | "lg" (plus heading sizes)"md"React · Svelte · HTML"md"Applies a design-system size token.
variant"primary" | "secondary" | "ghost" | "danger""secondary"React · Svelte · HTML"secondary"Selects the component's visual treatment.
tone"neutral" | "accent" | "info" | "success" | "warning" | "danger""neutral"Svelte · HTML"success"Applies semantic color intent without hard-coded colors.
loadingbooleanfalseReact · Svelte · HTMLtrueShows progress, preserves width, and disables repeated activation.
button attributesnative element attributesReact · Svelte · HTMLclass / style / aria-* / data-*Forwards native class/style, accessibility, event, and data attributes to the root element.