SoybeanUI is an elegant and accessible UI library like shadcn for Vue3, it is based on @soybean-ui/primitives and UnoCSS.
[!NOTE] because the name
soybean-ui
in npm is already taken, so we usesoy-ui
instead.
pnpm add soy-ui
pnpm add -D unocss @soybean-ui/unocss-preset
import { URL, fileURLToPath } from 'node:url';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import unocss from 'unocss/vite';
export default defineConfig({
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
plugins: [
vue(),
vueJsx(),
unocss()
]
});
- Create
uno.config.ts
file
import { defineConfig, presetWind3, transformerDirectives, transformerVariantGroup } from 'unocss';
import type { Theme } from '@unocss/preset-uno';
import { presetSoybeanUI } from '@soybean-ui/unocss-preset';
export default defineConfig<Theme>({
content: {
pipeline: {
include: [/\.vue($|\?)/, /.*\/soy-ui.*\.js/]
}
},
transformers: [transformerDirectives(), transformerVariantGroup()],
presets: [presetWind3({ dark: 'class' }), presetSoybeanUI()]
});
- import
uno.css
inmain.ts
import 'uno.css';
<script setup lang="ts">
import { SButton } from 'soy-ui';
</script>
<template>
<SButton>Click me</SButton>
</template>
pnpm add -D unplugin-vue-components
- Add
SoybeanUIResolver
invite.config.ts
import { URL, fileURLToPath } from 'node:url';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import unocss from 'unocss/vite';
import Components from 'unplugin-vue-components/vite';
import SoybeanUIResolver from 'soy-ui/resolver';
export default defineConfig({
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
plugins: [
vue(),
vueJsx(),
unocss(),
Components({
dts: 'src/typings/components.d.ts',
types: [{ from: 'vue-router', names: ['RouterLink', 'RouterView'] }],
resolvers: [SoybeanUIResolver()]
})
]
});
import { defineConfig, presetWind3, transformerDirectives, transformerVariantGroup } from 'unocss';
import { presetSoybeanUI } from '@soybean-ui/unocss-preset';
export default defineConfig({
content: {
pipeline: {
include: [/\.vue($|\?)/, /.*\/soy-ui.*\.js/]
}
},
transformers: [transformerDirectives(), transformerVariantGroup()],
presets: [presetWind3({ dark: 'class' }), presetSoybeanUI()],
});
- add options for
presetSoybeanUI
import { defineConfig, presetWind3, transformerDirectives, transformerVariantGroup } from 'unocss';
import { presetSoybeanUI } from '@soybean-ui/unocss-preset';
export default defineConfig({
content: {
pipeline: {
include: [/\.vue($|\?)/, /.*\/soy-ui.*\.js/]
}
},
transformers: [transformerDirectives(), transformerVariantGroup()],
presets: [presetWind3({ dark: 'class' }), presetSoybeanUI({ color: 'orange' })],
});
- ThemeOptions
interface ThemeOptions {
/**
* theme color options
*
* @default 'default'
*/
color?: ColorOptions | false;
/** feedback color */
feedbackColor?: FeedbackColorOfThemeCssVarsVariant;
/**
* theme radius
*
* @default 0.5
*/
radius?: number | false;
/**
* dark theme selector
*
* @default '.dark'
*/
darkSelector?: string;
}