Skip to content

Commit fb2e0e5

Browse files
committed
feat(docs): add introduction and quick start documentation, implement sider menu component, and update app header styles
1 parent e35bbc7 commit fb2e0e5

File tree

16 files changed

+555
-75
lines changed

16 files changed

+555
-75
lines changed

docs/src/components/app-header.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const drawerVisible = shallowRef(false);
1111

1212
<template>
1313
<header
14-
class="fixed top-0 left-0 right-0 z-50 bg-white/80 dark:bg-gray-950/80 backdrop-blur-md border-b border-gray-200/50 dark:border-gray-800/50 transition-all duration-300"
14+
class="fixed top-0 left-0 right-0 z-50 h-[--app-header] bg-white/80 dark:bg-gray-950/80 backdrop-blur-md border-b border-gray-200/50 dark:border-gray-800/50 transition-all duration-300"
1515
>
1616
<div class="flex items-center justify-between px-6 py-3 max-w-[1440px] mx-auto h-full">
1717
<div class="flex items-center gap-8">

docs/src/components/header-nav.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ const menus = computed<NavigationMenuOptionData[]>(() => [
1818
label: t('layout.header.docs'),
1919
icon: 'lucide:book-open',
2020
linkProps: {
21-
href: '#',
22-
target: '_self',
21+
to: '/overview',
2322
activeClass: 'text-primary font-semibold dark:text-primary'
2423
}
2524
},
@@ -28,7 +27,7 @@ const menus = computed<NavigationMenuOptionData[]>(() => [
2827
label: t('layout.header.components'),
2928
icon: 'lucide:layout-grid',
3029
linkProps: {
31-
to: '/components/button',
30+
to: '/components',
3231
activeClass: 'text-primary font-semibold dark:text-primary'
3332
}
3433
}

docs/src/components/sider-menu.vue

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<script setup lang="ts">
2+
import { ref, watchEffect } from 'vue';
3+
import { useRoute } from 'vue-router';
4+
import { toKebabCase, toPascalCase } from '@soybeanjs/headless/shared';
5+
import type { TreeMenuOptionData } from '@soybeanjs/ui';
6+
import { components } from '../../../src/constants/components';
7+
8+
const route = useRoute();
9+
10+
const expanded = ref<string[]>([]);
11+
12+
const selected = ref<string>('');
13+
14+
const menus: TreeMenuOptionData[] = [
15+
{
16+
label: 'Overview',
17+
value: 'overview',
18+
icon: 'lucide:home',
19+
children: [
20+
{
21+
label: 'Introduction',
22+
value: 'introduction',
23+
linkProps: {
24+
to: '/overview/introduction'
25+
}
26+
},
27+
{
28+
label: 'Quick Start',
29+
value: 'quick-start',
30+
linkProps: {
31+
to: '/overview/quick-start'
32+
}
33+
}
34+
]
35+
},
36+
{
37+
label: 'Components',
38+
value: 'components',
39+
icon: 'lucide:layout-grid',
40+
children: Object.keys(components).map(key => ({
41+
label: toPascalCase(key),
42+
value: toKebabCase(key),
43+
linkProps: {
44+
to: `/components/${toKebabCase(key)}`
45+
}
46+
}))
47+
}
48+
];
49+
50+
watchEffect(() => {
51+
const [dir, value] = route.path.split('/').filter(Boolean);
52+
53+
if (dir) {
54+
expanded.value = [dir];
55+
}
56+
57+
if (value) {
58+
selected.value = value;
59+
}
60+
});
61+
</script>
62+
63+
<template>
64+
<STreeMenu v-model:expanded="expanded" :model-value="selected" :items="menus" />
65+
</template>

docs/src/layouts/default.vue

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
1-
<script setup lang="ts">
2-
import AppHeader from '@/components/app-header.vue';
3-
const { t } = useI18n();
4-
5-
useHead({
6-
title: () => t('layout.default')
7-
});
8-
</script>
1+
<script setup lang="ts"></script>
92

103
<template>
11-
<div class="h-full pt-16 p-4 text-sm">
4+
<div class="[--app-header:3.75rem] h-full pt-[calc(var(--app-header)+1rem)] text-sm">
125
<AppHeader />
13-
<SCard :title="t('layout.default')" class="h-full">
14-
<RouterView />
15-
</SCard>
6+
<div class="fixed top-[--app-header] left-0 w-50 h-[calc(100vh-var(--app-header))]">
7+
<SiderMenu />
8+
</div>
9+
<RouterView />
1610
</div>
1711
</template>

docs/src/pages/components/button/index.md

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script setup lang="ts">
2+
import { onBeforeMount } from 'vue';
3+
import { useRouter } from 'vue-router';
4+
5+
const router = useRouter();
6+
7+
onBeforeMount(() => {
8+
router.replace('/components/button');
9+
});
10+
</script>
11+
12+
<template>
13+
<div></div>
14+
</template>

docs/src/pages/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const features = computed(() => [
6767
</div>
6868

6969
<div class="flex flex-wrap gap-6 justify-center mb-24">
70-
<SButtonLink to="/components/button" size="lg" variant="solid" shape="rounded" class="group w-45">
70+
<SButtonLink to="/overview/quick-start" size="lg" variant="solid" shape="rounded" class="group w-45">
7171
{{ t('components.home.actions.start') }}
7272
<SIcon icon="lucide:arrow-right" class="group-hover:translate-x-1 transition-transform" />
7373
</SButtonLink>

docs/src/pages/overview/index.vue

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script setup lang="ts">
2+
import { onBeforeMount } from 'vue';
3+
import { useRouter } from 'vue-router';
4+
5+
const router = useRouter();
6+
7+
onBeforeMount(() => {
8+
router.replace('/overview/introduction');
9+
});
10+
</script>
11+
12+
<template>
13+
<div></div>
14+
</template>
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
---
2+
title: Introduction
3+
---
4+
5+
# 介绍
6+
7+
SoybeanUI 是一个优雅、现代、可访问且高质量的 UI 组件库,专为 Vue 3 设计,采用 shadcn-like 设计风格,构建在强大的 Headless 基础之上。它提供了一套全面、可访问、可定制且高性能的组件,帮助开发者快速构建现代化的 Web 应用。
8+
9+
## 为什么选择 SoybeanUI?
10+
11+
### 🎨 优雅的设计
12+
13+
SoybeanUI 采用现代化的设计语言,组件外观精美,交互流畅。每个组件都经过精心设计,确保在不同场景下都能提供出色的用户体验。
14+
15+
### ♿ 可访问性优先
16+
17+
所有组件都严格遵循 WAI-ARIA 设计模式,确保残障用户也能轻松使用。键盘导航、屏幕阅读器支持、焦点管理等可访问性特性都已内置,无需额外配置。
18+
19+
### 🏗️ 灵活的架构
20+
21+
SoybeanUI 采用 Headless 架构,将逻辑层和表现层完全分离。这意味着你可以:
22+
23+
- **使用现成的样式组件**:直接使用 `@soybeanjs/ui`,开箱即用
24+
- **自定义样式**:使用 `@soybeanjs/headless` 构建完全属于自己的设计系统
25+
- **混合使用**:在同一个项目中同时使用两种方式
26+
27+
### 🎯 类型安全
28+
29+
完全使用 TypeScript 编写,提供完整的类型定义和智能提示,让开发过程更加高效和可靠。
30+
31+
### 🎨 高度可定制
32+
33+
基于 UnoCSS 和 `tailwind-variants` 构建,支持灵活的主题定制。你可以轻松修改颜色、尺寸、圆角等样式属性,打造符合品牌特色的界面。
34+
35+
### 📦 轻量级
36+
37+
所有组件都支持 Tree-shaking,只打包你实际使用的代码,确保最终产物体积最小化。
38+
39+
## 架构设计
40+
41+
SoybeanUI 由两个核心包组成,每个包都有其独特的定位和价值:
42+
43+
### @soybeanjs/headless - 逻辑层
44+
45+
这是 SoybeanUI 的核心基础,负责处理所有业务逻辑:
46+
47+
- **状态管理**:组件内部状态的完整管理
48+
- **可访问性 (A11y)**:完整的 WAI-ARIA 支持
49+
- **键盘交互**:完整的键盘导航支持
50+
- **焦点管理**:智能的焦点捕获和恢复
51+
- **事件处理**:统一的事件处理机制
52+
53+
Headless 组件完全不包含任何样式,给你最大的自由度来构建自己的设计系统。如果你想要完全控制组件的外观,或者需要构建一个独特的设计系统,Headless 包是你的最佳选择。
54+
55+
### @soybeanjs/ui - 表现层
56+
57+
这是基于 Headless 构建的带样式组件库:
58+
59+
- **精美的样式**:使用 UnoCSS 和 `tailwind-variants` 构建的现代化样式
60+
- **开箱即用**:无需额外配置即可使用
61+
- **主题支持**:内置多种主题配置,支持亮色/暗色模式
62+
- **响应式设计**:所有组件都针对不同屏幕尺寸进行了优化
63+
64+
如果你想要快速开始项目,或者喜欢 SoybeanUI 的默认设计风格,直接使用 `@soybeanjs/ui` 是最佳选择。
65+
66+
## 核心特性
67+
68+
### ✨ 丰富的组件生态
69+
70+
SoybeanUI 提供了 46+ 个高质量组件,覆盖了 Web 应用开发中的大部分场景:
71+
72+
- **基础组件**:Button、Input、Card、Badge 等
73+
- **表单组件**:Form、Select、Checkbox、RadioGroup、Switch 等
74+
- **反馈组件**:Alert、Dialog、Toast、Tooltip 等
75+
- **导航组件**:Menu、Tabs、Breadcrumb、Pagination 等
76+
- **数据展示**:Table、Tree、List、Avatar 等
77+
- **布局组件**:Layout、Separator、AspectRatio 等
78+
79+
### 🎨 主题系统
80+
81+
SoybeanUI 内置了强大的主题系统,支持:
82+
83+
- **多种颜色方案**:primary、destructive、success、warning、info、carbon、secondary、accent 等
84+
- **多种尺寸**:xs、sm、md、lg、xl、2xl
85+
- **多种变体**:solid、outline、ghost、link、plain、dashed、soft、raw
86+
- **暗色模式**:完整的暗色主题支持
87+
- **自定义主题**:轻松扩展和定制主题配置
88+
89+
### 🚀 性能优化
90+
91+
- **Tree-shaking**:只打包使用的代码
92+
- **按需加载**:支持按需引入组件
93+
- **虚拟滚动**:大数据量场景下的性能优化
94+
- **懒加载**:图片和内容的懒加载支持
95+
96+
### 🔧 开发体验
97+
98+
- **TypeScript 支持**:完整的类型定义
99+
- **自动导入**:支持 `unplugin-vue-components` 自动导入
100+
- **Nuxt 模块**:官方 Nuxt 模块支持
101+
- **详细的文档**:每个组件都有详细的文档和示例
102+
103+
## 适用场景
104+
105+
SoybeanUI 适用于各种类型的 Vue 3 项目:
106+
107+
- **企业级应用**:提供完整的组件生态和可访问性支持
108+
- **管理后台**:丰富的表单和数据展示组件
109+
- **内容网站**:优雅的展示组件和布局系统
110+
- **移动端应用**:响应式设计,适配各种屏幕尺寸
111+
- **设计系统**:Headless 架构支持构建自定义设计系统
112+
113+
## 技术栈
114+
115+
SoybeanUI 基于以下技术构建:
116+
117+
- **Vue 3**:使用 Composition API 和 `<script setup>` 语法
118+
- **TypeScript**:完整的类型支持
119+
- **UnoCSS**:原子化 CSS 引擎
120+
- **tailwind-variants**:变体管理工具
121+
122+
## 开始使用
123+
124+
如果你已经准备好开始使用 SoybeanUI,可以查看 [快速开始](./quick-start) 文档,了解如何安装和配置 SoybeanUI。
125+
126+
如果你想要了解更多关于组件的信息,可以浏览 [组件文档](/components/button),每个组件都有详细的 API 文档和使用示例。
127+
128+
## 社区与支持
129+
130+
- **GitHub**[soybeanjs/soybean-ui](https://github.com/soybeanjs/soybean-ui)
131+
- **问题反馈**:欢迎在 GitHub Issues 中提出问题
132+
- **功能建议**:欢迎提交 Pull Request
133+
134+
让我们一起构建更好的 Vue 3 UI 组件库!

0 commit comments

Comments
 (0)