0.3.0Semi Design community edition · Built for admin apps

One component library.
Native in four frameworks.

Logic lives in a framework-agnostic Foundation, and each framework connects in its own idiom.
85 components, from forms and tables to AI chat.

pnpm add @fibrae/semi-ui-react
pnpm add @fibrae/semi-ui-vue
pnpm add @fibrae/semi-ui-solid
pnpm add @fibrae/semi-ui-svelte
Expense approvals
~
Report IDApplicantStatusAmountDate
EX-20261031-018EEmily Chen
Pending
$3,860.00Oct 31
EX-20261030-054RRyan Wang
Approved
$1,248.50Oct 30
EX-20261030-032GGrace Zhou
Pending
$12,400.00Oct 30
EX-20261029-077DDaniel Zhao
Rejected
$568.00Oct 29
EX-20261029-041OOlivia Liu
Approved
$2,190.00Oct 29
128 reports

01Cross-framework

Write the logic once. Connect it natively.

Foundation owns the interaction logic. Adapters bind it to each framework's state: useState in React, v-model in Vue, signals in Solid, $state in Svelte.

FoundationInteraction logic, written once
Adapter
  • React
  • Vue
  • Solid
  • Svelte
ReactJSX · useState
import { useState } from 'react';
import { Select } from '@fibrae/semi-ui-react';

const optionList = [
    { value: 'douyin', label: '抖音' },
    { value: 'jianying', label: '剪映' },
];

export default function Demo() {
    const [value, setValue] = useState<string | undefined>('douyin');

    return (
        <Select
            value={value}
            optionList={optionList}
            onChange={setValue}
        />
    );
}
@fibrae/semi-ui-react
VueSFC · v-model
<script setup lang="ts">
    import { ref } from 'vue';
    import { Select } from '@fibrae/semi-ui-vue';

    const optionList = [
        { value: 'douyin', label: '抖音' },
        { value: 'jianying', label: '剪映' },
    ];

    const value = ref<string | undefined>('douyin');
</script>

<template>
    <Select
        v-model="value"
        :optionList="optionList"
    />
</template>
@fibrae/semi-ui-vue
SolidJSX · createSignal
import { createSignal } from 'solid-js';
import { Select } from '@fibrae/semi-ui-solid';

const optionList = [
    { value: 'douyin', label: '抖音' },
    { value: 'jianying', label: '剪映' },
];

export default function Demo() {
    const [value, setValue] = createSignal<string | undefined>('douyin');

    return (
        <Select
            value={value()}
            optionList={optionList}
            onChange={(v) => setValue(v)}
        />
    );
}
@fibrae/semi-ui-solid
Svelte 5runes · $state
<script lang="ts">
    import { Select } from '@fibrae/semi-ui-svelte';

    const optionList = [
        { value: 'douyin', label: '抖音' },
        { value: 'jianying', label: '剪映' },
    ];

    let value = $state<string | undefined>('douyin');
</script>

<Select
    bind:value
    {optionList}
/>
@fibrae/semi-ui-svelte

02Enterprise-ready

Accessibility, i18n, theming and SSR.
Ready by default.

ACCESSIBILITY

TabEnterEsc

Accessible by default

Roles and keyboard interactions follow WAI-ARIA and APG. Focus stays visible throughout.

INTERNATIONALIZATION

57 languages, native RTL

Built-in text and accessible names come from locale packs. RTL languages mirror the entire page layout.

THEMING

One token set, light and dark

Styles use --semi-* variables inside @layer semi, so they never fight your own CSS.

ENGINEERING

SSR
hydration
format
ESM only
Chrome
≥ 120
Firefox
≥ 125
Safari
≥ 17.2

SSR and hydration

Server rendering and hydration are supported. ESM only, built for modern bundlers.

OPEN SOURCE

MIT licensed

A community fork of Semi Design. Fully open source and free for commercial use.