UI Components

The EBRAINS Design System provides 44+ production-ready web components built with Stencil. They are framework-agnostic and work with any JavaScript framework or plain HTML.

Load the Module

Integrating the components into a project with or without a JavaScript framework is straightforward. Add the following to your <head>:

Under the hood, this:

  • Imports the loader module from the Stencil-generated CDN package
  • Registers custom elements with the browser using customElements.define()
  • Lazy-loads components — implementation code is only fetched when a component is first used
  • Optimizes performance — fast startup with on-demand loading

Load Variables and Styles

To use the design tokens (colors, breakpoints, typography), add the stylesheet:

This loads all CSS custom properties and utility classes. It also includes the IBM Plex fonts, so no separate font loading is needed.

For variables only (without utility classes):

Install via NPM (vanilla JS / framework-agnostic)

For plain HTML/JS or any framework where you’d rather use the raw eds-* custom elements directly:

Then in your application entry point:

Framework Integration

For React, Vue, and Angular projects we publish dedicated wrapper packages that expose the components as idiomatic, fully-typed framework components. The wrappers self-register the underlying custom elements on import — you do not need to call defineCustomElements() yourself.

React

Install the React wrapper alongside the assets package:

Import the components and styles where you need them — the wrapper handles custom-element registration internally:

import { EdsButton, EdsAlert } from '@ebrains/react';
import '@ebrains/assets/styles/output.css';

function App() {
  return (
    <>
      <EdsButton label="Click me" intent="primary" />
      <EdsAlert intent="info" message="Welcome to EBRAINS." />
    </>
  );
}

Vue.js

Install the Vue wrapper:

Use the wrapped components directly in your single-file components. No app.config.compilerOptions.isCustomElement configuration is required — you import the wrapped Vue components, not the raw eds-* tags:

<script setup>
import { EdsButton, EdsAlert } from '@ebrains/vue';
import '@ebrains/assets/styles/output.css';
</script>

<template>
  <EdsButton label="Click me" intent="primary" />
  <EdsAlert intent="info" message="Welcome to EBRAINS." />
</template>

Angular

Install the Angular wrapper (Angular 18+):

Components are exported as standalone Angular components and self-register the underlying custom elements — no CUSTOM_ELEMENTS_SCHEMA or NgModule wiring needed:

import { Component } from '@angular/core';
import { EdsButton, EdsAlert } from '@ebrains/angular';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [EdsButton, EdsAlert],
  templateUrl: './app.component.html'
})
export class AppComponent {}

The matching template:

<eds-button label="Click me" intent="primary"></eds-button>
<eds-alert intent="info" message="Welcome to EBRAINS."></eds-alert>

Load the design-system styles globally (e.g., in src/styles.css):

Example