@coffic/cosy-ui 0.8.29 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/utils/i18n.ts +0 -6
- package/dist/src/utils/language.ts +80 -101
- package/dist/src-astro/header/Header.astro +3 -3
- package/dist/src-astro/language-switcher/LanguageSwitcher.astro +42 -33
- package/dist/src-astro/language-switcher/index.ts +1 -9
- package/dist/src-astro/language-switcher/switcher_util.ts +40 -0
- package/dist/src-astro/link/Link.astro +6 -1
- package/dist/src-astro/list/ListItem.astro +58 -11
- package/dist/src-astro/types/header.ts +66 -71
- package/package.json +1 -1
- package/dist/src-astro/language-switcher/LanguageSwitcherBasic.astro +0 -7
package/dist/src/utils/i18n.ts
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
import { getRelativeLocaleUrl } from 'astro:i18n';
|
2
1
|
import type { AstroGlobal } from 'astro';
|
3
|
-
import { cosyLogger } from '../../src-astro/cosy';
|
4
2
|
|
5
3
|
// 默认语言
|
6
4
|
export const DEFAULT_LANGUAGE = 'en';
|
@@ -11,111 +9,92 @@ export const DEFAULT_LANGUAGE = 'en';
|
|
11
9
|
* 提供语言相关的工具函数,用于多语言支持
|
12
10
|
*/
|
13
11
|
export class LanguageUtil {
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
`getRelativeLink: locale=${locale}, currentPath=${originalPath}, currentLocale=${currentLocale}, result=${result}`
|
26
|
-
);
|
27
|
-
}
|
28
|
-
|
29
|
-
return result;
|
30
|
-
}
|
31
|
-
|
32
|
-
static getLanguageName(code: string | undefined): string {
|
33
|
-
switch (code) {
|
34
|
-
case 'en':
|
35
|
-
return 'English';
|
36
|
-
case 'zh-cn':
|
37
|
-
return '简体中文';
|
38
|
-
case 'zh':
|
39
|
-
return '中文';
|
40
|
-
case undefined:
|
41
|
-
default:
|
42
|
-
return 'not known';
|
12
|
+
static getLanguageName(code: string | undefined): string {
|
13
|
+
switch (code) {
|
14
|
+
case 'en':
|
15
|
+
return 'English';
|
16
|
+
case 'zh-cn':
|
17
|
+
return '简体中文';
|
18
|
+
case 'zh':
|
19
|
+
return '中文';
|
20
|
+
default:
|
21
|
+
return code || 'not known';
|
22
|
+
}
|
43
23
|
}
|
44
|
-
}
|
45
24
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
25
|
+
/**
|
26
|
+
* 获取当前语言
|
27
|
+
* @param astro Astro全局对象
|
28
|
+
* @returns 当前应使用的语言代码
|
29
|
+
*/
|
30
|
+
static getCurrentLanguage(astro: AstroGlobal): string {
|
31
|
+
// 尝试从Astro全局对象中获取语言
|
32
|
+
const astroLang = astro.currentLocale;
|
33
|
+
if (astroLang) {
|
34
|
+
return astroLang;
|
35
|
+
}
|
36
|
+
// 尝试从URL中获取语言
|
37
|
+
const urlLang = this.getLanguageFromURL(astro.url.pathname);
|
38
|
+
if (urlLang) {
|
39
|
+
return urlLang;
|
40
|
+
}
|
41
|
+
|
42
|
+
// 尝试从浏览器设置中获取语言
|
43
|
+
const browserLang = this.getLanguageFromBrowser();
|
44
|
+
if (browserLang) {
|
45
|
+
return browserLang;
|
46
|
+
}
|
47
|
+
|
48
|
+
// 尝试从Astro全局对象中获取语言
|
49
|
+
const preferredLocale = astro.preferredLocale;
|
50
|
+
if (preferredLocale) {
|
51
|
+
return preferredLocale;
|
52
|
+
}
|
53
|
+
|
54
|
+
// 如果无法检测,返回默认语言
|
55
|
+
return DEFAULT_LANGUAGE;
|
67
56
|
}
|
68
57
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
58
|
+
/**
|
59
|
+
* 从URL中提取语言代码
|
60
|
+
* @param url 当前URL
|
61
|
+
* @returns 从URL中提取的语言代码,如果无法提取则返回undefined
|
62
|
+
*/
|
63
|
+
private static getLanguageFromURL(url: string): string | undefined {
|
64
|
+
let currentUrl = url;
|
65
|
+
|
66
|
+
if (currentUrl === undefined) {
|
67
|
+
if (typeof window === 'undefined') return undefined;
|
68
|
+
currentUrl = window.location.href;
|
69
|
+
}
|
70
|
+
|
71
|
+
// 尝试从路径中提取语言代码
|
72
|
+
// 例如: /zh-cn/components/button
|
73
|
+
const pathMatch = currentUrl.match(/^\/([\w-]+)\//);
|
74
|
+
if (pathMatch) {
|
75
|
+
return pathMatch[1];
|
76
|
+
}
|
77
|
+
|
78
|
+
// 尝试从查询参数中提取语言代码
|
79
|
+
// 例如: ?lang=zh-cn
|
80
|
+
const urlParams = new URLSearchParams(currentUrl.split('?')[1]);
|
81
|
+
const langParam = urlParams.get('lang');
|
82
|
+
if (langParam) {
|
83
|
+
return langParam;
|
84
|
+
}
|
85
|
+
|
86
|
+
return undefined;
|
73
87
|
}
|
74
88
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
* @param url 当前URL
|
82
|
-
* @returns 从URL中提取的语言代码,如果无法提取则返回undefined
|
83
|
-
*/
|
84
|
-
private static getLanguageFromURL(url: string): string | undefined {
|
85
|
-
let currentUrl = url;
|
89
|
+
/**
|
90
|
+
* 从浏览器设置中获取首选语言
|
91
|
+
* @returns 从浏览器设置中获取的语言代码,如果无法获取则返回undefined
|
92
|
+
*/
|
93
|
+
private static getLanguageFromBrowser(): string | undefined {
|
94
|
+
if (typeof navigator === 'undefined') return undefined;
|
86
95
|
|
87
|
-
|
88
|
-
|
89
|
-
|
96
|
+
// 获取浏览器语言
|
97
|
+
const browserLang = navigator.language.toLowerCase();
|
98
|
+
return browserLang;
|
90
99
|
}
|
91
|
-
|
92
|
-
// 尝试从路径中提取语言代码
|
93
|
-
// 例如: /zh-cn/components/button
|
94
|
-
const pathMatch = currentUrl.match(/^\/([\w-]+)\//);
|
95
|
-
if (pathMatch) {
|
96
|
-
return pathMatch[1];
|
97
|
-
}
|
98
|
-
|
99
|
-
// 尝试从查询参数中提取语言代码
|
100
|
-
// 例如: ?lang=zh-cn
|
101
|
-
const urlParams = new URLSearchParams(currentUrl.split('?')[1]);
|
102
|
-
const langParam = urlParams.get('lang');
|
103
|
-
if (langParam) {
|
104
|
-
return langParam;
|
105
|
-
}
|
106
|
-
|
107
|
-
return undefined;
|
108
|
-
}
|
109
|
-
|
110
|
-
/**
|
111
|
-
* 从浏览器设置中获取首选语言
|
112
|
-
* @returns 从浏览器设置中获取的语言代码,如果无法获取则返回undefined
|
113
|
-
*/
|
114
|
-
private static getLanguageFromBrowser(): string | undefined {
|
115
|
-
if (typeof navigator === 'undefined') return undefined;
|
116
|
-
|
117
|
-
// 获取浏览器语言
|
118
|
-
const browserLang = navigator.language.toLowerCase();
|
119
|
-
return browserLang;
|
120
|
-
}
|
121
100
|
}
|
@@ -22,8 +22,9 @@ import {
|
|
22
22
|
Link,
|
23
23
|
Image,
|
24
24
|
ThemeSwitcher,
|
25
|
-
} from '
|
25
|
+
} from '../../index-astro';
|
26
26
|
import Logo from '../../src/assets/logo-rounded.png';
|
27
|
+
import { i18n } from 'astro:config/server';
|
27
28
|
|
28
29
|
export interface Props extends IHeaderProps {
|
29
30
|
debug?: boolean;
|
@@ -31,7 +32,6 @@ export interface Props extends IHeaderProps {
|
|
31
32
|
|
32
33
|
const {
|
33
34
|
height = 'md',
|
34
|
-
languages = ['zh-cn', 'en'],
|
35
35
|
logo = Logo,
|
36
36
|
logoHref = '/',
|
37
37
|
navItems = [],
|
@@ -200,7 +200,7 @@ const activeLink = LinkUtil.getActiveLink(
|
|
200
200
|
}
|
201
201
|
|
202
202
|
{showThemeSwitcher && <ThemeSwitcher />}
|
203
|
-
{
|
203
|
+
{i18n !== undefined && <LanguageSwitcher />}
|
204
204
|
|
205
205
|
<slot name="navbar-end" />
|
206
206
|
</div>
|
@@ -19,50 +19,59 @@
|
|
19
19
|
* <LanguageSwitcher />
|
20
20
|
* ```
|
21
21
|
*
|
22
|
-
* 自定义语言列表:
|
23
|
-
* ```astro
|
24
|
-
* <LanguageSwitcher
|
25
|
-
* languages={['zh-cn', 'en']}
|
26
|
-
* />
|
27
|
-
* ```
|
28
22
|
*/
|
29
23
|
|
30
|
-
import {
|
24
|
+
import {
|
25
|
+
ChevronDownIcon,
|
26
|
+
LanguageUtil,
|
27
|
+
Link,
|
28
|
+
ListItem,
|
29
|
+
} from '../../index-astro';
|
31
30
|
import '../../style.ts';
|
31
|
+
import { i18n } from 'astro:config/server';
|
32
32
|
|
33
33
|
interface Props {
|
34
|
-
languages: string[];
|
35
34
|
/**
|
36
35
|
* 自定义类名
|
37
36
|
*/
|
38
37
|
class?: string;
|
39
38
|
}
|
40
39
|
|
41
|
-
const {
|
40
|
+
const { class: className = '' } = Astro.props;
|
41
|
+
|
42
|
+
let links: any[] = [];
|
43
|
+
let currentLocale: string | undefined = undefined;
|
44
|
+
let currentLanguageName: string | undefined = undefined;
|
42
45
|
|
43
|
-
|
44
|
-
const
|
46
|
+
if (i18n !== undefined) {
|
47
|
+
const { getSwitcherLinks } = await import('./switcher_util.ts');
|
48
|
+
links = getSwitcherLinks(Astro);
|
49
|
+
|
50
|
+
currentLocale = Astro.currentLocale!;
|
51
|
+
currentLanguageName = LanguageUtil.getLanguageName(currentLocale);
|
52
|
+
} else {
|
53
|
+
throw new Error('can not use LanguageSwitcher when i18n is disabled');
|
54
|
+
}
|
45
55
|
---
|
46
56
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
</div>
|
57
|
+
{
|
58
|
+
i18n !== undefined && (
|
59
|
+
<div class={`cosy:dropdown cosy:dropdown-end ${className}`}>
|
60
|
+
<div tabindex="0" role="button" class:list={['cosy:btn cosy:btn-ghost']}>
|
61
|
+
<span class="cosy:mr-1">{currentLanguageName}</span>
|
62
|
+
<ChevronDownIcon size="16px" class="cosy:w-4 cosy:h-4" />
|
63
|
+
</div>
|
64
|
+
<ul
|
65
|
+
tabindex="0"
|
66
|
+
class="cosy:z-[1] cosy:bg-base-100 cosy:shadow cosy:p-2 cosy:rounded-box cosy:w-32 cosy:dropdown-content cosy:menu">
|
67
|
+
{links.map((link) => (
|
68
|
+
<ListItem>
|
69
|
+
<Link href={link.url} active={currentLocale === link.locale}>
|
70
|
+
{link.name}
|
71
|
+
</Link>
|
72
|
+
</ListItem>
|
73
|
+
))}
|
74
|
+
</ul>
|
75
|
+
</div>
|
76
|
+
)
|
77
|
+
}
|
@@ -1,11 +1,3 @@
|
|
1
1
|
import LanguageSwitcher from './LanguageSwitcher.astro';
|
2
|
-
import LanguageSwitcherBasic from './LanguageSwitcherBasic.astro';
|
3
|
-
import BasicSourceCode from './LanguageSwitcherBasic.astro?raw';
|
4
|
-
import { extractSimpleExample } from '../../src/utils/component';
|
5
2
|
|
6
|
-
export { LanguageSwitcher
|
7
|
-
|
8
|
-
// 导出示例源代码
|
9
|
-
export const LanguageSwitcherExampleCodes = {
|
10
|
-
Basic: extractSimpleExample(BasicSourceCode, 'LanguageSwitcher'),
|
11
|
-
};
|
3
|
+
export { LanguageSwitcher };
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import { getRelativeLocaleUrl, getRelativeLocaleUrlList } from 'astro:i18n';
|
2
|
+
import type { AstroGlobal } from 'astro';
|
3
|
+
import { LanguageUtil } from '../../index-astro';
|
4
|
+
|
5
|
+
export interface SwitcherLink {
|
6
|
+
locale: string;
|
7
|
+
name: string;
|
8
|
+
url: string;
|
9
|
+
}
|
10
|
+
|
11
|
+
// 获取基础路径
|
12
|
+
const getBaseUrl = (): string => {
|
13
|
+
return import.meta.env.BASE_URL;
|
14
|
+
};
|
15
|
+
|
16
|
+
const getLocaleFromUrl = (url: string): string => {
|
17
|
+
return url.replace(getBaseUrl(), '').split('/')[0];
|
18
|
+
};
|
19
|
+
|
20
|
+
export function getSwitcherLinks(astro: AstroGlobal): SwitcherLink[] {
|
21
|
+
const currentLocale = astro.currentLocale;
|
22
|
+
|
23
|
+
if (currentLocale === undefined) {
|
24
|
+
throw new Error('can not get switcher links when i18n is disabled');
|
25
|
+
}
|
26
|
+
|
27
|
+
const currentLocalURLPrefix = getRelativeLocaleUrl(currentLocale, '');
|
28
|
+
const pathname = astro.url.pathname + '/';
|
29
|
+
const slug = pathname.replace(
|
30
|
+
currentLocalURLPrefix,
|
31
|
+
''
|
32
|
+
);
|
33
|
+
const urls = getRelativeLocaleUrlList(slug);
|
34
|
+
|
35
|
+
return urls.map((url) => ({
|
36
|
+
locale: getLocaleFromUrl(url),
|
37
|
+
name: LanguageUtil.getLanguageName(getLocaleFromUrl(url)),
|
38
|
+
url: url
|
39
|
+
}));
|
40
|
+
}
|
@@ -100,6 +100,7 @@ interface Props extends HTMLAttributes<'a'> {
|
|
100
100
|
| 'warning'
|
101
101
|
| 'error';
|
102
102
|
align?: 'left' | 'center' | 'right';
|
103
|
+
active?: boolean;
|
103
104
|
}
|
104
105
|
|
105
106
|
const {
|
@@ -121,6 +122,7 @@ const {
|
|
121
122
|
fullWidth = false,
|
122
123
|
color,
|
123
124
|
align,
|
125
|
+
active = false,
|
124
126
|
...rest
|
125
127
|
} = Astro.props;
|
126
128
|
|
@@ -159,7 +161,10 @@ const classes = [
|
|
159
161
|
animation === 'hover-scale' &&
|
160
162
|
'cosy:hover:scale-105 cosy:transition-transform',
|
161
163
|
|
162
|
-
//
|
164
|
+
// Active state
|
165
|
+
active && 'cosy:active',
|
166
|
+
|
167
|
+
// 按钮风格
|
163
168
|
btn && 'cosy:btn',
|
164
169
|
btn && size === 'sm' && 'cosy:btn-sm',
|
165
170
|
btn && size === 'lg' && 'cosy:btn-lg',
|
@@ -1,10 +1,35 @@
|
|
1
1
|
---
|
2
2
|
/**
|
3
3
|
* @component ListItem
|
4
|
-
*
|
5
|
-
* @
|
6
|
-
*
|
7
|
-
*
|
4
|
+
*
|
5
|
+
* @description
|
6
|
+
* ListItem 组件用于在列表中显示单个项目。它内置了多种加载动画效果,可以方便地通过 `loading` 属性来控制加载状态,并通过 `loadingAnimationType` 属性切换不同的加载Loading动画样式。
|
7
|
+
*
|
8
|
+
* @usage
|
9
|
+
* 基本用法:
|
10
|
+
* ```astro
|
11
|
+
* <ListItem>这是一个列表项</ListItem>
|
12
|
+
* ```
|
13
|
+
*
|
14
|
+
* 加载状态:
|
15
|
+
* ```astro
|
16
|
+
* <ListItem loading={true}>加载中的列表项</ListItem>
|
17
|
+
* ```
|
18
|
+
*
|
19
|
+
* 指定加载动画类型:
|
20
|
+
* ```astro
|
21
|
+
* <ListItem loading={true} loadingAnimationType="pulse">使用脉冲动画加载</ListItem>
|
22
|
+
* <ListItem loading={true} loadingAnimationType="icon-left">使用左侧图标动画加载</ListItem>
|
23
|
+
* ```
|
24
|
+
*
|
25
|
+
* @props
|
26
|
+
* @prop {string} [class] - 自定义 CSS 类名。
|
27
|
+
* @prop {boolean} [loading=false] - 控制是否显示加载动画。
|
28
|
+
* @prop {number} [duration] - 动画的持续时间(单位:毫秒)。
|
29
|
+
* @prop {('none'|'ring'|'icon-left'|'icon-right'|'breath'|'pulse'|'glow')} [loadingAnimationType='none'] - 加载动画的类型。
|
30
|
+
*
|
31
|
+
* @slots
|
32
|
+
* @slot default - 列表项的内容。
|
8
33
|
*/
|
9
34
|
import '../../style.ts';
|
10
35
|
import ListItemRing from './ListItemRing.astro';
|
@@ -14,16 +39,38 @@ import ListItemBreath from './ListItemBreath.astro';
|
|
14
39
|
import ListItemPulse from './ListItemPulse.astro';
|
15
40
|
import ListItemGlow from './ListItemGlow.astro';
|
16
41
|
|
42
|
+
interface Props {
|
43
|
+
class?: string;
|
44
|
+
loading?: boolean;
|
45
|
+
duration?: number;
|
46
|
+
loadingAnimationType?:
|
47
|
+
| 'none'
|
48
|
+
| 'ring'
|
49
|
+
| 'icon-left'
|
50
|
+
| 'icon-right'
|
51
|
+
| 'breath'
|
52
|
+
| 'pulse'
|
53
|
+
| 'glow';
|
54
|
+
}
|
55
|
+
|
17
56
|
const {
|
18
57
|
loading = false,
|
19
58
|
duration,
|
20
|
-
|
59
|
+
loadingAnimationType = 'none',
|
21
60
|
...restProps
|
22
61
|
} = Astro.props;
|
23
62
|
---
|
24
63
|
|
25
64
|
{
|
26
|
-
|
65
|
+
loadingAnimationType === 'none' && (
|
66
|
+
<li {...restProps}>
|
67
|
+
<slot />
|
68
|
+
</li>
|
69
|
+
)
|
70
|
+
}
|
71
|
+
|
72
|
+
{
|
73
|
+
loadingAnimationType === 'ring' && (
|
27
74
|
<ListItemRing loading={loading} duration={duration} {...restProps}>
|
28
75
|
<slot />
|
29
76
|
</ListItemRing>
|
@@ -31,7 +78,7 @@ const {
|
|
31
78
|
}
|
32
79
|
|
33
80
|
{
|
34
|
-
|
81
|
+
loadingAnimationType === 'icon-left' && (
|
35
82
|
<ListItemIconLeft loading={loading} duration={duration} {...restProps}>
|
36
83
|
<slot />
|
37
84
|
</ListItemIconLeft>
|
@@ -39,7 +86,7 @@ const {
|
|
39
86
|
}
|
40
87
|
|
41
88
|
{
|
42
|
-
|
89
|
+
loadingAnimationType === 'icon-right' && (
|
43
90
|
<ListItemIconRight loading={loading} duration={duration} {...restProps}>
|
44
91
|
<slot />
|
45
92
|
</ListItemIconRight>
|
@@ -47,7 +94,7 @@ const {
|
|
47
94
|
}
|
48
95
|
|
49
96
|
{
|
50
|
-
|
97
|
+
loadingAnimationType === 'breath' && (
|
51
98
|
<ListItemBreath loading={loading} duration={duration} {...restProps}>
|
52
99
|
<slot />
|
53
100
|
</ListItemBreath>
|
@@ -55,7 +102,7 @@ const {
|
|
55
102
|
}
|
56
103
|
|
57
104
|
{
|
58
|
-
|
105
|
+
loadingAnimationType === 'pulse' && (
|
59
106
|
<ListItemPulse loading={loading} duration={duration} {...restProps}>
|
60
107
|
<slot />
|
61
108
|
</ListItemPulse>
|
@@ -63,7 +110,7 @@ const {
|
|
63
110
|
}
|
64
111
|
|
65
112
|
{
|
66
|
-
|
113
|
+
loadingAnimationType === 'glow' && (
|
67
114
|
<ListItemGlow loading={loading} duration={duration} {...restProps}>
|
68
115
|
<slot />
|
69
116
|
</ListItemGlow>
|
@@ -1,87 +1,82 @@
|
|
1
1
|
import type { INavItem } from './nav';
|
2
2
|
|
3
3
|
export interface IHeaderProps {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
/**
|
5
|
+
* 侧边栏是否默认展开
|
6
|
+
* @default false
|
7
|
+
*/
|
8
|
+
defaultSidebarOpen?: boolean;
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
/**
|
11
|
+
* 导航栏高度
|
12
|
+
* @default "md"
|
13
|
+
*/
|
14
|
+
height?: '3xs' | '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
/**
|
17
|
+
* Logo图片元数据
|
18
|
+
*/
|
19
|
+
logo?: ImageMetadata;
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
/**
|
22
|
+
* Logo 链接地址
|
23
|
+
* @default "/"
|
24
|
+
*/
|
25
|
+
logoHref?: string;
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
logoHref?: string;
|
27
|
+
/**
|
28
|
+
* 导航菜单项
|
29
|
+
*/
|
30
|
+
navItems?: INavItem[];
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
/**
|
33
|
+
* 导航栏位置
|
34
|
+
* @default "start"
|
35
|
+
*/
|
36
|
+
navPosition?: 'start' | 'center' | 'end';
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
/**
|
39
|
+
* 水平内边距
|
40
|
+
* @default "md"
|
41
|
+
*/
|
42
|
+
paddingHorizontal?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
/**
|
45
|
+
* 垂直内边距
|
46
|
+
* @default "md"
|
47
|
+
*/
|
48
|
+
paddingVertical?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
/**
|
51
|
+
* 圆角大小
|
52
|
+
* @default "md"
|
53
|
+
*/
|
54
|
+
rounded?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
/**
|
57
|
+
* 是否显示侧边栏切换按钮
|
58
|
+
* @default false
|
59
|
+
*/
|
60
|
+
showSidebarToggle?: boolean;
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
/**
|
63
|
+
* 是否显示主题切换按钮
|
64
|
+
* @default false
|
65
|
+
*/
|
66
|
+
showThemeSwitcher?: boolean;
|
66
67
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
68
|
+
/**
|
69
|
+
* 社交媒体链接列表
|
70
|
+
*/
|
71
|
+
socialLinks?: Array<{
|
72
|
+
name: string;
|
73
|
+
url: string;
|
74
|
+
icon: any;
|
75
|
+
}>;
|
72
76
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
url: string;
|
79
|
-
icon: any;
|
80
|
-
}>;
|
81
|
-
|
82
|
-
/**
|
83
|
-
* 是否固定在顶部
|
84
|
-
* @default true
|
85
|
-
*/
|
86
|
-
sticky?: boolean;
|
77
|
+
/**
|
78
|
+
* 是否固定在顶部
|
79
|
+
* @default true
|
80
|
+
*/
|
81
|
+
sticky?: boolean;
|
87
82
|
}
|
package/package.json
CHANGED