@coffic/cosy-ui 0.9.3 → 0.9.5
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/app.css +1 -1
- package/dist/index-astro.ts +3 -19
- package/dist/index-collection.ts +1 -105
- package/dist/src-astro/collection/entities/BaseDoc.ts +28 -0
- package/dist/src-astro/collection/entities/BlogDoc.ts +221 -0
- package/dist/src-astro/collection/entities/CourseDoc.ts +254 -0
- package/dist/src-astro/collection/entities/ExperimentDoc.ts +169 -0
- package/dist/src-astro/collection/entities/LessonDoc.ts +203 -0
- package/dist/src-astro/collection/entities/MetaDoc.ts +115 -0
- package/dist/src-astro/{entities → collection/entities}/SidebarItem.ts +17 -17
- package/dist/src-astro/collection/entities/Tag.ts +42 -0
- package/dist/src-astro/collection/index.ts +11 -0
- package/dist/src-astro/collection/repos/BaseRepo.ts +276 -0
- package/dist/src-astro/collection/repos/BlogRepo.ts +226 -0
- package/dist/src-astro/collection/repos/CourseRepo.ts +137 -0
- package/dist/src-astro/collection/repos/ExperimentRepo.ts +121 -0
- package/dist/src-astro/collection/repos/LessonRepo.ts +128 -0
- package/dist/src-astro/collection/repos/MetaRepo.ts +89 -0
- package/dist/src-astro/empty-state/EmptyState.astro +100 -0
- package/dist/src-astro/empty-state/index.ts +2 -0
- package/dist/src-astro/empty-state/types.ts +70 -0
- package/dist/src-astro/layout-dashboard/DashboardLayout.astro +2 -1
- package/dist/src-astro/layout-dashboard/DashboardTopNavbar.astro +2 -26
- package/package.json +1 -1
- package/dist/src-astro/database/BaseDB.ts +0 -264
- package/dist/src-astro/database/BlogDB.ts +0 -198
- package/dist/src-astro/database/CourseDB.ts +0 -90
- package/dist/src-astro/database/ExperimentDB.ts +0 -106
- package/dist/src-astro/database/LessonDB.ts +0 -106
- package/dist/src-astro/database/MetaDB.ts +0 -74
- package/dist/src-astro/database/index.ts +0 -3
- package/dist/src-astro/entities/BaseDoc.ts +0 -207
- package/dist/src-astro/entities/BlogDoc.ts +0 -107
- package/dist/src-astro/entities/CourseDoc.ts +0 -102
- package/dist/src-astro/entities/ExperimentDoc.ts +0 -119
- package/dist/src-astro/entities/LessonDoc.ts +0 -153
- package/dist/src-astro/entities/MetaDoc.ts +0 -93
- package/dist/src-astro/entities/Tag.ts +0 -42
- /package/dist/src-astro/{entities → collection/entities}/Feature.ts +0 -0
@@ -0,0 +1,121 @@
|
|
1
|
+
import { defineCollection, z, type CollectionEntry } from 'astro:content';
|
2
|
+
import { BaseDB } from './BaseRepo';
|
3
|
+
import ExperimentDoc from '../entities/ExperimentDoc';
|
4
|
+
import { cosyLogger } from '../../cosy';
|
5
|
+
import { glob } from 'astro/loaders';
|
6
|
+
|
7
|
+
export const COLLECTION_EXPERIMENT = 'experiments' as const;
|
8
|
+
export type ExperimentEntry = CollectionEntry<typeof COLLECTION_EXPERIMENT>;
|
9
|
+
|
10
|
+
/**
|
11
|
+
* 实验数据库类,用于管理实验内容集合
|
12
|
+
*
|
13
|
+
* 目录结构:
|
14
|
+
* ```
|
15
|
+
* experiments/
|
16
|
+
* ├── safari_itp/ # 实验目录
|
17
|
+
* │ ├── images/ # 实验图片资源
|
18
|
+
* │ ├── components/ # 课程组件
|
19
|
+
* │ ├── en/ # 英文版本
|
20
|
+
* │ │ ├── index.mdx # 课程首页
|
21
|
+
* │ │ ├── 1.mdx # 第一章
|
22
|
+
* │ │ └── 2.mdx # 第二章
|
23
|
+
* │ └── zh-cn/ # 中文版本
|
24
|
+
* │ ├── index.mdx # 课程首页
|
25
|
+
* │ ├── 1.mdx # 第一章
|
26
|
+
* │ └── 2.mdx # 第二章
|
27
|
+
* └── learn_astro/ # 另一个课程
|
28
|
+
* ├── en/
|
29
|
+
* │ ├── index.mdx
|
30
|
+
* │ ├── 1.mdx
|
31
|
+
* │ └── 2.mdx
|
32
|
+
* └── zh-cn/
|
33
|
+
* ├── index.mdx
|
34
|
+
* ├── 1.mdx
|
35
|
+
* └── 2.mdx
|
36
|
+
* ```
|
37
|
+
*
|
38
|
+
* 说明:
|
39
|
+
* - 每个课程(如 build_your_own_web_toolbox)是一个独立的目录
|
40
|
+
* - 课程目录可以包含多语言版本(en, zh-cn 等)
|
41
|
+
* - 每个语言版本包含完整的课程内容
|
42
|
+
* - 课程目录可以作为 git 子模块独立管理
|
43
|
+
*/
|
44
|
+
class ExperimentRepo extends BaseDB<
|
45
|
+
typeof COLLECTION_EXPERIMENT,
|
46
|
+
ExperimentEntry,
|
47
|
+
ExperimentDoc
|
48
|
+
> {
|
49
|
+
protected collectionName = COLLECTION_EXPERIMENT;
|
50
|
+
|
51
|
+
protected createDoc(entry: ExperimentEntry): ExperimentDoc {
|
52
|
+
return new ExperimentDoc(entry);
|
53
|
+
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* 获取指定语言的所有课程
|
57
|
+
*
|
58
|
+
* @param {string} lang - 语言代码
|
59
|
+
* @returns {Promise<ExperimentDoc[]>} 返回指定语言的所有课程
|
60
|
+
*/
|
61
|
+
async allExperiments(lang: string): Promise<ExperimentDoc[]> {
|
62
|
+
const docs = await this.getDocsByDepth(2);
|
63
|
+
return docs.filter((doc) => doc.getId().endsWith(lang));
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* 获取用于 Astro 静态路由生成的路径参数
|
68
|
+
*
|
69
|
+
* @param debug - 是否开启调试模式
|
70
|
+
* @returns 返回路径参数数组
|
71
|
+
*/
|
72
|
+
async getStaticPaths(debug: boolean = false) {
|
73
|
+
const docs = await this.getEntries();
|
74
|
+
|
75
|
+
if (debug) {
|
76
|
+
cosyLogger.array('所有文档', docs);
|
77
|
+
}
|
78
|
+
|
79
|
+
const paths = docs.map((doc) => {
|
80
|
+
const id = doc.id;
|
81
|
+
const lang = id.split('/')[1];
|
82
|
+
|
83
|
+
let slug = '';
|
84
|
+
if (id.endsWith(lang)) {
|
85
|
+
slug = id.replace(`${lang}`, '');
|
86
|
+
} else {
|
87
|
+
slug = id.replace(`${lang}/`, '');
|
88
|
+
}
|
89
|
+
|
90
|
+
return {
|
91
|
+
params: {
|
92
|
+
lang: lang,
|
93
|
+
slug: slug,
|
94
|
+
},
|
95
|
+
};
|
96
|
+
});
|
97
|
+
|
98
|
+
if (debug) {
|
99
|
+
cosyLogger.array('所有文档的路径', paths);
|
100
|
+
}
|
101
|
+
|
102
|
+
return paths;
|
103
|
+
}
|
104
|
+
|
105
|
+
makeExperimentCollection = (base: string) => {
|
106
|
+
return defineCollection({
|
107
|
+
loader: glob({
|
108
|
+
pattern: '**/*.{md,mdx}',
|
109
|
+
base,
|
110
|
+
}),
|
111
|
+
schema: z.object({
|
112
|
+
title: z.string().optional(),
|
113
|
+
description: z.string().optional(),
|
114
|
+
pubDate: z.date().optional(),
|
115
|
+
}),
|
116
|
+
});
|
117
|
+
};
|
118
|
+
}
|
119
|
+
|
120
|
+
// 创建并导出单例实例
|
121
|
+
export const experimentRepo = new ExperimentRepo();
|
@@ -0,0 +1,128 @@
|
|
1
|
+
import { defineCollection, z, type CollectionEntry } from 'astro:content';
|
2
|
+
import { BaseDB } from './BaseRepo';
|
3
|
+
import LessonDoc from '../entities/LessonDoc';
|
4
|
+
import { cosyLogger } from '../../cosy';
|
5
|
+
import { glob } from 'astro/loaders';
|
6
|
+
|
7
|
+
export const COLLECTION_LESSON = 'lessons' as const;
|
8
|
+
export type LessonEntry = CollectionEntry<typeof COLLECTION_LESSON>;
|
9
|
+
|
10
|
+
/**
|
11
|
+
* 课程数据库类,用于管理课程内容集合
|
12
|
+
*
|
13
|
+
* 目录结构:
|
14
|
+
* ```
|
15
|
+
* lessons/
|
16
|
+
* ├── build_your_own_web_toolbox/ # 课程目录
|
17
|
+
* │ ├── images/ # 课程图片资源
|
18
|
+
* │ ├── components/ # 课程组件
|
19
|
+
* │ ├── en/ # 英文版本
|
20
|
+
* │ │ ├── index.mdx # 课程首页
|
21
|
+
* │ │ ├── 1.mdx # 第一章
|
22
|
+
* │ │ └── 2.mdx # 第二章
|
23
|
+
* │ └── zh-cn/ # 中文版本
|
24
|
+
* │ ├── index.mdx # 课程首页
|
25
|
+
* │ ├── 1.mdx # 第一章
|
26
|
+
* │ └── 2.mdx # 第二章
|
27
|
+
* └── learn_astro/ # 另一个课程
|
28
|
+
* ├── en/
|
29
|
+
* │ ├── index.mdx
|
30
|
+
* │ ├── 1.mdx
|
31
|
+
* │ └── 2.mdx
|
32
|
+
* └── zh-cn/
|
33
|
+
* ├── index.mdx
|
34
|
+
* ├── 1.mdx
|
35
|
+
* └── 2.mdx
|
36
|
+
* ```
|
37
|
+
*
|
38
|
+
* 说明:
|
39
|
+
* - 每个课程(如 build_your_own_web_toolbox)是一个独立的目录
|
40
|
+
* - 课程目录可以包含多语言版本(en, zh-cn 等)
|
41
|
+
* - 每个语言版本包含完整的课程内容
|
42
|
+
* - 课程目录可以作为 git 子模块独立管理
|
43
|
+
*/
|
44
|
+
class LessonRepo extends BaseDB<
|
45
|
+
typeof COLLECTION_LESSON,
|
46
|
+
LessonEntry,
|
47
|
+
LessonDoc
|
48
|
+
> {
|
49
|
+
protected collectionName = COLLECTION_LESSON;
|
50
|
+
|
51
|
+
protected createDoc(entry: LessonEntry): LessonDoc {
|
52
|
+
return new LessonDoc(entry);
|
53
|
+
}
|
54
|
+
|
55
|
+
/**
|
56
|
+
* 获取指定语言的所有课程
|
57
|
+
*
|
58
|
+
* @param {string} lang - 语言代码
|
59
|
+
* @returns {Promise<LessonDoc[]>} 返回指定语言的所有课程
|
60
|
+
*/
|
61
|
+
async allLessons(lang: string): Promise<LessonDoc[]> {
|
62
|
+
const docs = await this.getDocsByDepth(2);
|
63
|
+
return docs.filter((doc) => doc.getId().endsWith(lang));
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* 获取用于 Astro 静态路由生成的路径参数
|
68
|
+
*
|
69
|
+
* @param debug - 是否开启调试模式
|
70
|
+
* @returns 返回路径参数数组
|
71
|
+
*/
|
72
|
+
async getStaticPaths(debug: boolean = false) {
|
73
|
+
const docs = await this.getEntries();
|
74
|
+
|
75
|
+
if (debug) {
|
76
|
+
cosyLogger.array('所有文档', docs);
|
77
|
+
}
|
78
|
+
|
79
|
+
const paths = docs.map((doc) => {
|
80
|
+
const id = doc.id;
|
81
|
+
const lang = id.split('/')[1];
|
82
|
+
|
83
|
+
let slug = '';
|
84
|
+
if (id.endsWith(lang)) {
|
85
|
+
slug = id.replace(`${lang}`, '');
|
86
|
+
} else {
|
87
|
+
slug = id.replace(`${lang}/`, '');
|
88
|
+
}
|
89
|
+
|
90
|
+
return {
|
91
|
+
params: {
|
92
|
+
lang: lang,
|
93
|
+
slug: slug,
|
94
|
+
},
|
95
|
+
};
|
96
|
+
});
|
97
|
+
|
98
|
+
if (debug) {
|
99
|
+
cosyLogger.array('所有文档的路径', paths);
|
100
|
+
}
|
101
|
+
|
102
|
+
return paths;
|
103
|
+
}
|
104
|
+
|
105
|
+
makeLessonCollection = (base: string) => {
|
106
|
+
return defineCollection({
|
107
|
+
loader: glob({
|
108
|
+
pattern: '**/*.{md,mdx}',
|
109
|
+
base,
|
110
|
+
}),
|
111
|
+
schema: z.object({
|
112
|
+
title: z.string().optional(),
|
113
|
+
description: z.string().optional(),
|
114
|
+
authors: z
|
115
|
+
.array(
|
116
|
+
z.object({
|
117
|
+
name: z.string(),
|
118
|
+
picture: z.string().optional(),
|
119
|
+
})
|
120
|
+
)
|
121
|
+
.optional(),
|
122
|
+
}),
|
123
|
+
});
|
124
|
+
};
|
125
|
+
}
|
126
|
+
|
127
|
+
// 创建并导出单例实例
|
128
|
+
export const lessonRepo = new LessonRepo();
|
@@ -0,0 +1,89 @@
|
|
1
|
+
import MetaDoc from '../entities/MetaDoc';
|
2
|
+
import { cosyLogger } from '../../cosy';
|
3
|
+
import { defineCollection, z, type CollectionEntry } from 'astro:content';
|
4
|
+
import { BaseDB } from './BaseRepo';
|
5
|
+
import { glob } from 'astro/loaders';
|
6
|
+
|
7
|
+
export const COLLECTION_META = 'meta' as const;
|
8
|
+
export type MetaEntry = CollectionEntry<typeof COLLECTION_META>;
|
9
|
+
|
10
|
+
/**
|
11
|
+
* 元数据数据库类,用于管理网站的元数据内容集合(如"关于我们"等页面)
|
12
|
+
*
|
13
|
+
* 目录结构:
|
14
|
+
* ```
|
15
|
+
* meta/
|
16
|
+
* ├── zh-cn/ # 中文内容
|
17
|
+
* │ ├── about.md # 关于我们
|
18
|
+
* │ ├── advice.md # 建议
|
19
|
+
* └── en/ # 英文内容
|
20
|
+
* ├── about.md
|
21
|
+
* ├── privacy.md
|
22
|
+
* └── terms.md
|
23
|
+
* ```
|
24
|
+
*/
|
25
|
+
class MetaRepo extends BaseDB<typeof COLLECTION_META, MetaEntry, MetaDoc> {
|
26
|
+
protected collectionName = COLLECTION_META;
|
27
|
+
|
28
|
+
protected createDoc(entry: MetaEntry): MetaDoc {
|
29
|
+
return new MetaDoc(entry);
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* 获取指定文档的兄弟文档
|
34
|
+
* 例如:对于 'zh-cn/about',会返回 'zh-cn' 下的文档
|
35
|
+
*
|
36
|
+
* @param targetId - 目标文档ID
|
37
|
+
* @returns 返回兄弟文档数组(包括目标文档本身)
|
38
|
+
*/
|
39
|
+
async getSiblings(targetId: string): Promise<MetaDoc[]> {
|
40
|
+
const target = await this.find(targetId);
|
41
|
+
if (!target) {
|
42
|
+
return [];
|
43
|
+
}
|
44
|
+
const docs = await this.getDocsByDepth(2);
|
45
|
+
return docs.filter((doc) => doc.getLang() === target.getLang());
|
46
|
+
}
|
47
|
+
|
48
|
+
/**
|
49
|
+
* 获取用于 Astro 静态路由生成的路径参数,专门配合 [lang]/meta/[slug].astro 使用
|
50
|
+
*
|
51
|
+
* @param debug - 是否开启调试模式
|
52
|
+
* @returns 返回路径参数数组
|
53
|
+
*/
|
54
|
+
async getStaticPaths(debug: boolean = false) {
|
55
|
+
const docs = await this.getDescendantDocs('');
|
56
|
+
|
57
|
+
const paths = docs.map((doc) => {
|
58
|
+
return {
|
59
|
+
params: {
|
60
|
+
lang: doc.getLang(),
|
61
|
+
slug: doc.getSlug(),
|
62
|
+
},
|
63
|
+
};
|
64
|
+
});
|
65
|
+
|
66
|
+
if (debug) {
|
67
|
+
cosyLogger.array('所有元数据文档的路径', paths);
|
68
|
+
}
|
69
|
+
|
70
|
+
return paths;
|
71
|
+
}
|
72
|
+
|
73
|
+
makeMetaCollection = (base: string) => {
|
74
|
+
return defineCollection({
|
75
|
+
loader: glob({
|
76
|
+
pattern: '**/*.{md,mdx}',
|
77
|
+
base,
|
78
|
+
}),
|
79
|
+
schema: z.object({
|
80
|
+
title: z.string().optional(),
|
81
|
+
description: z.string().optional(),
|
82
|
+
}),
|
83
|
+
});
|
84
|
+
};
|
85
|
+
|
86
|
+
}
|
87
|
+
|
88
|
+
// 创建并导出单例实例
|
89
|
+
export const metaRepo = new MetaRepo();
|
@@ -0,0 +1,100 @@
|
|
1
|
+
---
|
2
|
+
/**
|
3
|
+
* @component EmptyState
|
4
|
+
* @description 一个用于表示空状态的组件,通常在列表、搜索结果或任何需要数据的区域为空时使用。
|
5
|
+
*
|
6
|
+
* @usage
|
7
|
+
* ```astro
|
8
|
+
* <EmptyState
|
9
|
+
* icon="users"
|
10
|
+
* title="没有找到用户"
|
11
|
+
* description="尝试更改筛选条件或创建一个新用户。"
|
12
|
+
* >
|
13
|
+
* <Button>创建用户</Button>
|
14
|
+
* </EmptyState>
|
15
|
+
* ```
|
16
|
+
*
|
17
|
+
* @props
|
18
|
+
* - icon?: string - 在标题上方显示的图标名称。
|
19
|
+
* - title: string - 主标题,用于描述空状态。
|
20
|
+
* - description?: string - 对空状态的详细描述。
|
21
|
+
*
|
22
|
+
* @slots
|
23
|
+
* - default - 用于放置操作按钮,如"创建"或"返回"。
|
24
|
+
*/
|
25
|
+
import '../../style.ts';
|
26
|
+
import * as Icons from '../icons';
|
27
|
+
import type { EmptyStateProps, IconName } from './types';
|
28
|
+
|
29
|
+
const { title, description, icon, ...rest } = Astro.props;
|
30
|
+
|
31
|
+
const iconMap: Record<IconName, any> = {
|
32
|
+
SocialIcon: Icons.SocialIcon,
|
33
|
+
TwitterIcon: Icons.TwitterIcon,
|
34
|
+
UserIcon: Icons.UserIcon,
|
35
|
+
WarningIcon: Icons.WarningIcon,
|
36
|
+
XCircle: Icons.XCircle,
|
37
|
+
InfoIcon: Icons.InfoIcon,
|
38
|
+
LinkIcon: Icons.LinkIcon,
|
39
|
+
LinkedinIcon: Icons.LinkedinIcon,
|
40
|
+
MenuIcon: Icons.MenuIcon,
|
41
|
+
RefreshIcon: Icons.RefreshIcon,
|
42
|
+
SearchIcon: Icons.SearchIcon,
|
43
|
+
SuccessIcon: Icons.SuccessIcon,
|
44
|
+
SunCloudyIcon: Icons.SunCloudyIcon,
|
45
|
+
AlertTriangle: Icons.AlertTriangle,
|
46
|
+
CalendarIcon: Icons.CalendarIcon,
|
47
|
+
CheckCircle: Icons.CheckCircle,
|
48
|
+
CheckIcon: Icons.CheckIcon,
|
49
|
+
ClipboardIcon: Icons.ClipboardIcon,
|
50
|
+
CloseIcon: Icons.CloseIcon,
|
51
|
+
CodeIcon: Icons.CodeIcon,
|
52
|
+
DeleteIcon: Icons.DeleteIcon,
|
53
|
+
ErrorIcon: Icons.ErrorIcon,
|
54
|
+
GithubIcon: Icons.GithubIcon,
|
55
|
+
InfoCircle: Icons.InfoCircle,
|
56
|
+
InboxArchive: Icons.InboxArchive,
|
57
|
+
SettingsIcon: Icons.SettingsIcon,
|
58
|
+
ChevronDownIcon: Icons.ChevronDownIcon,
|
59
|
+
HomeIcon: Icons.HomeIcon,
|
60
|
+
DashboardIcon: Icons.DashboardIcon,
|
61
|
+
ChartIcon: Icons.ChartIcon,
|
62
|
+
DocumentIcon: Icons.DocumentIcon,
|
63
|
+
NotificationIcon: Icons.NotificationIcon,
|
64
|
+
UsersIcon: Icons.UsersIcon,
|
65
|
+
MessageIcon: Icons.MessageIcon,
|
66
|
+
MailIcon: Icons.MailIcon,
|
67
|
+
FolderIcon: Icons.FolderIcon,
|
68
|
+
StarIcon: Icons.StarIcon,
|
69
|
+
HeartIcon: Icons.HeartIcon,
|
70
|
+
SaveIcon: Icons.SaveIcon,
|
71
|
+
EditIcon: Icons.EditIcon,
|
72
|
+
ToolsIcon: Icons.ToolsIcon,
|
73
|
+
WalletIcon: Icons.WalletIcon,
|
74
|
+
ReportIcon: Icons.ReportIcon,
|
75
|
+
SecurityIcon: Icons.SecurityIcon,
|
76
|
+
UploadIcon: Icons.UploadIcon,
|
77
|
+
DownloadIcon: Icons.DownloadIcon,
|
78
|
+
LogOut: Icons.LogOut,
|
79
|
+
AppStoreIcon: Icons.AppStoreIcon,
|
80
|
+
WebsiteIcon: Icons.WebsiteIcon,
|
81
|
+
};
|
82
|
+
|
83
|
+
const IconComponent =
|
84
|
+
icon && iconMap[icon as IconName] ? iconMap[icon as IconName] : null;
|
85
|
+
---
|
86
|
+
|
87
|
+
<div class="cosy:text-center cosy:py-16 cosy:px-6" {...rest}>
|
88
|
+
{IconComponent && <IconComponent class="cosy:mx-auto cosy:h-12 cosy:w-12" />}
|
89
|
+
{title && <h3 class="cosy:mt-2 cosy:text-2xl cosy:font-bold">{title}</h3>}
|
90
|
+
{
|
91
|
+
description && (
|
92
|
+
<p class="cosy:mt-1 cosy:text-sm cosy:text-base-content/80">
|
93
|
+
{description}
|
94
|
+
</p>
|
95
|
+
)
|
96
|
+
}
|
97
|
+
<div class="cosy:mt-6 cosy:flex cosy:justify-center cosy:gap-4">
|
98
|
+
<slot />
|
99
|
+
</div>
|
100
|
+
</div>
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import type { HTMLAttributes } from 'astro/types';
|
2
|
+
|
3
|
+
export const iconNames = [
|
4
|
+
'SocialIcon',
|
5
|
+
'TwitterIcon',
|
6
|
+
'UserIcon',
|
7
|
+
'WarningIcon',
|
8
|
+
'XCircle',
|
9
|
+
'InfoIcon',
|
10
|
+
'LinkIcon',
|
11
|
+
'LinkedinIcon',
|
12
|
+
'MenuIcon',
|
13
|
+
'RefreshIcon',
|
14
|
+
'SearchIcon',
|
15
|
+
'SuccessIcon',
|
16
|
+
'SunCloudyIcon',
|
17
|
+
'AlertTriangle',
|
18
|
+
'CalendarIcon',
|
19
|
+
'CheckCircle',
|
20
|
+
'CheckIcon',
|
21
|
+
'ClipboardIcon',
|
22
|
+
'CloseIcon',
|
23
|
+
'CodeIcon',
|
24
|
+
'DeleteIcon',
|
25
|
+
'ErrorIcon',
|
26
|
+
'GithubIcon',
|
27
|
+
'InfoCircle',
|
28
|
+
'InboxArchive',
|
29
|
+
'SettingsIcon',
|
30
|
+
'ChevronDownIcon',
|
31
|
+
'HomeIcon',
|
32
|
+
'DashboardIcon',
|
33
|
+
'ChartIcon',
|
34
|
+
'DocumentIcon',
|
35
|
+
'NotificationIcon',
|
36
|
+
'UsersIcon',
|
37
|
+
'MessageIcon',
|
38
|
+
'MailIcon',
|
39
|
+
'FolderIcon',
|
40
|
+
'StarIcon',
|
41
|
+
'HeartIcon',
|
42
|
+
'SaveIcon',
|
43
|
+
'EditIcon',
|
44
|
+
'ToolsIcon',
|
45
|
+
'WalletIcon',
|
46
|
+
'ReportIcon',
|
47
|
+
'SecurityIcon',
|
48
|
+
'UploadIcon',
|
49
|
+
'DownloadIcon',
|
50
|
+
'LogOut',
|
51
|
+
'AppStoreIcon',
|
52
|
+
'WebsiteIcon',
|
53
|
+
] as const;
|
54
|
+
|
55
|
+
export type IconName = (typeof iconNames)[number];
|
56
|
+
|
57
|
+
export interface EmptyStateProps extends HTMLAttributes<'div'> {
|
58
|
+
/**
|
59
|
+
* The title of the empty state.
|
60
|
+
*/
|
61
|
+
title?: string;
|
62
|
+
/**
|
63
|
+
* The description of the empty state.
|
64
|
+
*/
|
65
|
+
description?: string;
|
66
|
+
/**
|
67
|
+
* The name of the icon to display.
|
68
|
+
*/
|
69
|
+
icon?: IconName;
|
70
|
+
}
|
@@ -307,7 +307,7 @@ const mainPaddingMap = {
|
|
307
307
|
</div>
|
308
308
|
|
309
309
|
<!-- 主内容区 -->
|
310
|
-
<div class="cosy:drawer-content cosy:flex cosy:flex-col">
|
310
|
+
<div class="cosy:drawer-content cosy:flex cosy:flex-col cosy:h-screen">
|
311
311
|
<!-- 顶部导航栏 -->
|
312
312
|
<DashboardTopNavbar
|
313
313
|
title={title}
|
@@ -320,6 +320,7 @@ const mainPaddingMap = {
|
|
320
320
|
<main
|
321
321
|
class:list={[
|
322
322
|
'cosy:flex-1',
|
323
|
+
'cosy:overflow-y-auto',
|
323
324
|
mainPaddingMap[mainPadding],
|
324
325
|
'cosy:bg-base-100',
|
325
326
|
]}>
|
@@ -73,7 +73,8 @@ const defaultUserMenuItems: UserMenuItem[] = [
|
|
73
73
|
const menuItems = userMenuItems || defaultUserMenuItems;
|
74
74
|
---
|
75
75
|
|
76
|
-
<div
|
76
|
+
<div
|
77
|
+
class="cosy:navbar cosy:bg-base-100 cosy:shadow-2xl cosy:border-b cosy:border-base-300">
|
77
78
|
<div class="cosy:navbar-start">
|
78
79
|
<label
|
79
80
|
for="dashboard-drawer"
|
@@ -88,31 +89,6 @@ const menuItems = userMenuItems || defaultUserMenuItems;
|
|
88
89
|
</div>
|
89
90
|
|
90
91
|
<div class="cosy:navbar-end cosy:gap-2">
|
91
|
-
<!-- 搜索框 -->
|
92
|
-
<div class="cosy:form-control cosy:hidden cosy:lg:flex">
|
93
|
-
<div class="cosy:input-group">
|
94
|
-
<input
|
95
|
-
type="text"
|
96
|
-
placeholder="搜索..."
|
97
|
-
class="cosy:input cosy:input-bordered cosy:input-sm cosy:w-48"
|
98
|
-
/>
|
99
|
-
<button class="cosy:btn cosy:btn-square cosy:btn-sm">
|
100
|
-
<AstroIcon name="search" size="16px" stroke="currentColor" />
|
101
|
-
</button>
|
102
|
-
</div>
|
103
|
-
</div>
|
104
|
-
|
105
|
-
<!-- 通知 -->
|
106
|
-
<div class="cosy:indicator">
|
107
|
-
<button class="cosy:btn cosy:btn-ghost cosy:btn-circle">
|
108
|
-
<AstroIcon name="notification" size="18px" stroke="currentColor" />
|
109
|
-
</button>
|
110
|
-
<span
|
111
|
-
class="cosy:badge cosy:badge-xs cosy:badge-primary cosy:indicator-item"
|
112
|
-
>3</span
|
113
|
-
>
|
114
|
-
</div>
|
115
|
-
|
116
92
|
<!-- 用户信息 -->
|
117
93
|
{
|
118
94
|
userName && (
|