dev.club — where best developers and top companies connect.

dev.club — where best developers and top companies connect.Invite only

Request invite

carbon-components-svelte

NPM npm downloads to date Chat with us on Discord

Carbon Components Svelte is a Svelte component library that implements the Carbon Design System, an open source design system by IBM. Ship accessible, consistent, production-ready interfaces.

The Carbon Svelte ecosystem also includes:

Documentation

Installation

# npm
npm i carbon-components-svelte

# pnpm
pnpm add carbon-components-svelte

# Yarn
yarn add carbon-components-svelte

# Bun
bun add carbon-components-svelte

Usage

Styling

Before importing components, you will need to first apply Carbon component styles. The Carbon Design System supports five themes (2 light, 3 dark).

Each StyleSheet is compiled from Carbon v10 SCSS (carbon-components@10.58, vendored) and this library's own partials in css.

The compiled CSS is generated from the following .scss files:

Import one theme once at the top-level entry point of your app, like index.js or src/+layout.svelte.

CSS StyleSheet

// White theme
import "carbon-components-svelte/css/white.css";

// Gray 10 theme
import "carbon-components-svelte/css/g10.css";

// Gray 80 theme
import "carbon-components-svelte/css/g80.css";

// Gray 90 theme
import "carbon-components-svelte/css/g90.css";

// Gray 100 theme
import "carbon-components-svelte/css/g100.css";

// All themes
import "carbon-components-svelte/css/all.css";

Smaller CSS

Each precompiled StyleSheet contains the styles for every component. To ship only the styles your app uses, add optimizeCss to your production build. Set propAware: true to also drop the styles of prop values your app never passes; see prop-aware pruning.

The SCSS sources are not published. Compiling carbon-components v10 SCSS yourself misses styles for components and variants that only this library provides.

Dynamic theming

To switch themes at runtime, import the combined "all.css" StyleSheet instead of a single theme. It bundles all five themes and toggles between them through a theme attribute on the HTML element.

import "carbon-components-svelte/css/all.css";

Update the theme by setting the theme attribute on the html element. The default theme is "white".

<!doctype html>
<html lang="en" theme="g10">
  <body>
    ...
  </body>
</html>

Or programmatically switch between each of the five Carbon themes by setting the theme attribute on the HTML element.

<script>
  let theme = "white"; // "white" | "g10" | "g80" | "g90" | "g100"

  $: document.documentElement.setAttribute("theme", theme);
</script>

Alternatively, use the Theme component to manage the theme reactively.

Importing components

Import components from carbon-components-svelte in the script tag of your Svelte file. Visit the documentation site for examples.

<!-- App.svelte -->
<script>
  import { Accordion, AccordionItem } from "carbon-components-svelte";
</script>

<Accordion>
  <AccordionItem title="Section 1" open> Content 1 </AccordionItem>
  <AccordionItem title="Section 2"> Content 2 </AccordionItem>
  <AccordionItem title="Section 3"> Content 3 </AccordionItem>
</Accordion>

Refer to the documentation site for component API documentation.

Preprocessors & Plugins

carbon-preprocess-svelte is a collection of Svelte preprocessors and build plugins for Carbon. It trims build times and bundle size with three drop-in tools: faster compiles in development, leaner CSS and leaner JavaScript when you ship. Each works on its own.

[!NOTE] Using carbon-preprocess-svelte is optional and not a prerequisite for this library. It should be installed as a development dependency.

# npm
npm i -D carbon-preprocess-svelte

# pnpm
pnpm add -D carbon-preprocess-svelte

# Yarn
yarn add -D carbon-preprocess-svelte

# Bun
bun add -D carbon-preprocess-svelte
Tool Type What it does
optimizeImports Svelte preprocessor Rewrites barrel imports to source paths, for faster dev and build times
optimizeCss Build plugin Removes unused Carbon styles from production CSS
optimizeComponents Build plugin Rewrites Carbon components for the props your app passes, removing code it never runs

optimizeImports

optimizeImports is a Svelte preprocessor that rewrites barrel imports from Carbon components/icons/pictograms packages to their source Svelte code paths. This can significantly speed up development and production build compile times while preserving typeahead and autocompletion offered by integrated development environments (IDE) like VS Code.

The preprocessor optimizes imports from the following packages:

Before & After

- import { Button } from "carbon-components-svelte";
+ import Button from "carbon-components-svelte/src/Button/Button.svelte";

- import { Add } from "carbon-icons-svelte";
+ import Add from "carbon-icons-svelte/lib/Add.svelte";

- import { Airplane } from "carbon-pictograms-svelte";
+ import Airplane from "carbon-pictograms-svelte/lib/Airplane.svelte";

optimizeCss

optimizeCss is a build plugin that removes unused Carbon styles at build time, often removing hundreds of kilobytes from production bundles. It runs on Vite, Rollup, and Rolldown. For Webpack and Rspack, use OptimizeCssPlugin.

carbon-components-svelte@0.85.0 or greater is required.

$ vite build

Optimized assets/index-Doxsm5Yz.css
- Before: 557.37 kB
+ After:   46.16 kB (-91.72%)

dist/index.html                  0.33 kB │ gzip:  0.23 kB
dist/assets/index-Doxsm5Yz.css  46.16 kB │ gzip:  6.12 kB
dist/assets/index-BoBcXTHi.js   69.61 kB │ gzip: 24.35 kB

[!NOTE] This is a plugin and not a Svelte preprocessor. Add it to your bundler's plugins. Vite runs it on vite build only, and OptimizeCssPlugin runs in Webpack's production mode only. Under Rollup and Rolldown, add it to production builds only.

Prop-aware pruning

Set propAware: true to also remove styles for the prop values your app never passes.

optimizeCss({ propAware: true });
<Button kind="tertiary">Save</Button>
<!-- kept:   .bx--btn, .bx--btn--tertiary
     pruned: the other kinds and sizes, .bx--skeleton, the icon-only tooltip -->

It reads literal props, constants and state nothing reassigns (including constants your own modules export), your own wrapper components, props forwarded with {...$$restProps} or ...rest, object and array literals, and your own {#if} and {#each}. A value it can't read keeps every variant: a reassigned variable, a writable store, bind:, a spread of anything but a literal or forwarded props, or data fetched at runtime.

Refer to the carbon-preprocess-svelte documentation for details.

optimizeComponents

optimizeComponents rewrites each Carbon component your app renders for the props it passes. Values that never change become literals, and branches that can't run are removed, along with child components only those branches render (a skeleton, a tooltip portal). It is the JavaScript counterpart of prop-aware CSS pruning and uses the same analysis. In typical apps it removes 18–27% of the production JavaScript.

Your own wrapper components are rewritten the same way when every place that renders them is in content.

// vite.config.js
import { svelte } from "@sveltejs/vite-plugin-svelte";
import {
  optimizeComponents,
  optimizeCss,
  optimizeImports,
} from "carbon-preprocess-svelte";

export default {
  plugins: [
    optimizeComponents(),
    svelte({ preprocess: [optimizeImports()] }),
    optimizeCss({ propAware: true }),
  ],
};
Bundler Set-up Runs on
Vite, SvelteKit, Astro add optimizeComponents() to vite.plugins; it orders itself first vite build only, never vite dev
Rollup, Rolldown list optimizeComponents() before the Svelte plugin production builds only (add it conditionally)
Webpack, Rspack add new OptimizeComponentsPlugin() to plugins mode: "production" only

Refer to the carbon-preprocess-svelte documentation for every option.

Configure your bundler

Add optimizeImports to your Svelte preprocessor and optimizeCss to your bundler plugins. See examples for full configurations.

Vite

// vite.config.js
import { svelte, vitePreprocess } from "@sveltejs/vite-plugin-svelte";
import { optimizeCss, optimizeImports } from "carbon-preprocess-svelte";

export default {
  plugins: [
    svelte({
      preprocess: [vitePreprocess(), optimizeImports()],
    }),
    optimizeCss(),
  ],
};

SvelteKit

// vite.config.js
import adapter from "@sveltejs/adapter-static";
import { sveltekit } from "@sveltejs/kit/vite";
import { vitePreprocess } from "@sveltejs/vite-plugin-svelte";
import { optimizeCss, optimizeImports } from "carbon-preprocess-svelte";

export default {
  plugins: [
    sveltekit({
      preprocess: [vitePreprocess(), optimizeImports()],
      adapter: adapter(),
    }),
    optimizeCss(),
  ],
};

On SvelteKit 2, pass the same preprocess in svelte.config.js and the adapter under kit.

Rollup

// rollup.config.js
import svelte from "rollup-plugin-svelte";
import { optimizeCss, optimizeImports } from "carbon-preprocess-svelte";

const production = !process.env.ROLLUP_WATCH;

export default {
  plugins: [
    svelte({
      preprocess: [optimizeImports()],
    }),
    production && optimizeCss(),
  ],
};

Webpack

Rspack implements Webpack's plugin and loader APIs, so the same configuration works in rspack.config.mjs.

// webpack.config.mjs
import { OptimizeCssPlugin, optimizeImports } from "carbon-preprocess-svelte";

export default {
  module: {
    rules: [
      {
        test: /\.svelte$/,
        use: {
          loader: "svelte-loader",
          options: {
            preprocess: [optimizeImports()],
          },
        },
      },
    ],
  },
  plugins: [new OptimizeCssPlugin()],
};

Icons and pictograms

The icon and pictogram sets ship as separate packages of individual Svelte components. Each is optional, so install only what you need.

Icons

2,700+ icons designed for product UI, in four sizes (16, 20, 24, and 32 pixels), set with a single prop.

# npm
npm i carbon-icons-svelte

# pnpm
pnpm add carbon-icons-svelte

# Yarn
yarn add carbon-icons-svelte

# Bun
bun add carbon-icons-svelte
<script>
  import Add from "carbon-icons-svelte/lib/Add.svelte";
</script>

<Add size={24} />

Pictograms

1,500+ illustrative pictograms for empty states, onboarding, hero sections, and feature callouts. Larger than icons, 64px by default.

# npm
npm i carbon-pictograms-svelte

# pnpm
pnpm add carbon-pictograms-svelte

# Yarn
yarn add carbon-pictograms-svelte

# Bun
bun add carbon-pictograms-svelte
<script>
  import Cloud from "carbon-pictograms-svelte/lib/Cloud.svelte";
</script>

<Cloud />

Documentation for LLMs

Documentation is available in LLM-friendly plain text for use with coding assistants, plus a standalone Markdown document for every component. Append .md to any component's URL to read it.

Examples

TypeScript support

Every component ships TypeScript definitions for its props, events, and slots (src/**/*.svelte.d.ts), generated from the component source by sveld.

Contributing

Refer to the Contributing guidelines.

Changelog

License

Apache 2.0

IBM Telemetry IBM Telemetry

This package uses IBM Telemetry to collect de-identified and anonymized metrics data in CI environments. By installing this package as a dependency you are agreeing to telemetry collection. To opt out, see Opting out of IBM Telemetry data collection. For more information on the data being collected, please see the IBM Telemetry documentation.

Join libs.tech

...and unlock some superpowers

GitHub

We won't share your data with anyone else.