@coffic/cosy-ui 0.7.2 → 0.7.4
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/alert-dialog-vue/AlertDialog.vue +120 -0
- package/dist/alert-dialog-vue/Basic.vue +38 -0
- package/dist/alert-dialog-vue/Multilang.vue +48 -0
- package/dist/alert-dialog-vue/index.ts +20 -0
- package/dist/app.css +1 -1
- package/dist/banner-box-vue/BannerBox.vue +296 -0
- package/dist/banner-box-vue/DownloadButton.vue +202 -0
- package/dist/banner-box-vue/ExampleBasic.vue +32 -0
- package/dist/banner-box-vue/ExampleCustomBg.vue +32 -0
- package/dist/banner-box-vue/ExampleDisplayModeAlways.vue +34 -0
- package/dist/banner-box-vue/ExampleDisplayModeHover.vue +34 -0
- package/dist/banner-box-vue/ExampleDisplayModeNever.vue +34 -0
- package/dist/banner-box-vue/ExampleImageExport.vue +37 -0
- package/dist/banner-box-vue/ExampleSizePreset.vue +35 -0
- package/dist/banner-box-vue/FeatureCard.vue +190 -0
- package/dist/banner-box-vue/SmartBanner.vue +44 -0
- package/dist/banner-box-vue/bgStyles.ts +55 -0
- package/dist/banner-box-vue/index.ts +48 -0
- package/dist/banner-box-vue/sizePresets.ts +23 -0
- package/dist/blog-vue/Basic.vue +30 -0
- package/dist/blog-vue/BlogList.vue +100 -0
- package/dist/blog-vue/Empty.vue +8 -0
- package/dist/blog-vue/EmptyEnglish.vue +8 -0
- package/dist/blog-vue/English.vue +24 -0
- package/dist/blog-vue/index.ts +29 -0
- package/dist/buttons-vue/Button.vue +105 -0
- package/dist/buttons-vue/ButtonBasic.vue +11 -0
- package/dist/buttons-vue/ButtonFeature.vue +91 -0
- package/dist/buttons-vue/ButtonFeatureBasic.vue +8 -0
- package/dist/buttons-vue/ButtonFeatureWithTips.vue +7 -0
- package/dist/buttons-vue/ButtonLink.vue +13 -0
- package/dist/buttons-vue/ButtonSizes.vue +12 -0
- package/dist/buttons-vue/ButtonWithIcons.vue +21 -0
- package/dist/buttons-vue/index.ts +1 -0
- package/dist/card/Card.astro +59 -10
- package/dist/card/ECardBasic.astro +11 -0
- package/dist/card/ECardBasicContainer.astro +11 -0
- package/dist/card/ECardClickable.astro +13 -0
- package/dist/card/ECardClickableContainer.astro +11 -0
- package/dist/card/ECardCompact.astro +13 -0
- package/dist/card/ECardCompactContainer.astro +11 -0
- package/dist/card/ECardCustomStyle.astro +17 -0
- package/dist/card/ECardCustomStyleContainer.astro +11 -0
- package/dist/card/ECardWithImage.astro +16 -0
- package/dist/card/ECardWithImageContainer.astro +11 -0
- package/dist/card/ECardWithSubtitle.astro +13 -0
- package/dist/card/ECardWithSubtitleContainer.astro +11 -0
- package/dist/card/index.ts +32 -6
- package/dist/confirm-dialog-vue/Basic.vue +57 -0
- package/dist/confirm-dialog-vue/ConfirmDialog.vue +134 -0
- package/dist/confirm-dialog-vue/CustomButtons.vue +69 -0
- package/dist/confirm-dialog-vue/index.ts +20 -0
- package/dist/contact/Contact.astro +279 -0
- package/dist/contact/EContactBasic.astro +15 -0
- package/dist/contact/EContactBasicContainer.astro +12 -0
- package/dist/contact/EContactCompact.astro +12 -0
- package/dist/contact/EContactCompactContainer.astro +12 -0
- package/dist/contact/EContactCustomStyle.astro +22 -0
- package/dist/contact/EContactCustomStyleContainer.astro +12 -0
- package/dist/contact/EContactSocial.astro +21 -0
- package/dist/contact/EContactSocialContainer.astro +12 -0
- package/dist/contact/EContactWithTitle.astro +18 -0
- package/dist/contact/EContactWithTitleContainer.astro +12 -0
- package/dist/contact/index.ts +21 -0
- package/dist/counter-vue/VueCounter.vue +29 -0
- package/dist/counter-vue/index.ts +1 -0
- package/dist/iPhone-vue/Basic.vue +33 -0
- package/dist/iPhone-vue/CustomBackground.vue +33 -0
- package/dist/iPhone-vue/NoFrame.vue +33 -0
- package/dist/iPhone-vue/WeatherApp.vue +97 -0
- package/dist/iPhone-vue/assets/iPhone 14 Pro - Deep Purple - Landscape.png +0 -0
- package/dist/iPhone-vue/assets/iPhone 14 Pro - Deep Purple - Portrait.png +0 -0
- package/dist/iPhone-vue/assets/iPhone 14 Pro - Gold - Landscape.png +0 -0
- package/dist/iPhone-vue/assets/iPhone 14 Pro - Gold - Portrait.png +0 -0
- package/dist/iPhone-vue/assets/iPhone 14 Pro - Silver - Landscape.png +0 -0
- package/dist/iPhone-vue/assets/iPhone 14 Pro - Silver - Portrait.png +0 -0
- package/dist/iPhone-vue/assets/iPhone 14 Pro - Space Black - Landscape.png +0 -0
- package/dist/iPhone-vue/assets/iPhone 14 Pro - Space Black - Portrait.png +0 -0
- package/dist/iPhone-vue/iPhoneWindow.vue +193 -0
- package/dist/iPhone-vue/index.ts +28 -0
- package/dist/icons-vue/AlertTriangleIcon.vue +30 -0
- package/dist/icons-vue/CalendarIcon.vue +30 -0
- package/dist/icons-vue/CheckCircleIcon.vue +30 -0
- package/dist/icons-vue/CheckIcon.vue +30 -0
- package/dist/icons-vue/ChevronDownIcon.vue +30 -0
- package/dist/icons-vue/ClipboardIcon.vue +30 -0
- package/dist/icons-vue/CloseIcon.vue +30 -0
- package/dist/icons-vue/InboxArchiveIcon.vue +30 -0
- package/dist/icons-vue/InfoCircleIcon.vue +30 -0
- package/dist/icons-vue/InfoIcon.vue +30 -0
- package/dist/icons-vue/LinkIcon.vue +30 -0
- package/dist/icons-vue/MenuIcon.vue +30 -0
- package/dist/icons-vue/SearchIcon.vue +30 -0
- package/dist/icons-vue/SettingsIcon.vue +30 -0
- package/dist/icons-vue/UserIcon.vue +30 -0
- package/dist/icons-vue/VueIcon.vue +76 -0
- package/dist/icons-vue/XCircleIcon.vue +30 -0
- package/dist/icons-vue/index.ts +1 -0
- package/dist/index_astro.ts +42 -33
- package/dist/index_vue.ts +12 -23
- package/dist/list-vue/ListItem.vue +5 -0
- package/dist/list-vue/index.ts +1 -0
- package/dist/mac-window-vue/Basic.vue +11 -0
- package/dist/mac-window-vue/CustomHeight.vue +13 -0
- package/dist/mac-window-vue/MacWindow.vue +262 -0
- package/dist/mac-window-vue/WithEvents.vue +34 -0
- package/dist/mac-window-vue/WithSidebar.vue +21 -0
- package/dist/mac-window-vue/WithTabs.vue +21 -0
- package/dist/mac-window-vue/WithToolbar.vue +43 -0
- package/dist/mac-window-vue/index.ts +36 -0
- package/package.json +2 -2
- /package/dist/{button → buttons-vue}/ButtonVariants.vue +0 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
<!--
|
2
|
+
@component BannerBox.ImageExport
|
3
|
+
|
4
|
+
@description
|
5
|
+
BannerBox 组件的导出为图片示例,展示如何使用图片导出功能。
|
6
|
+
|
7
|
+
@usage
|
8
|
+
```vue
|
9
|
+
<BannerBoxExamples.ImageExport />
|
10
|
+
```
|
11
|
+
-->
|
12
|
+
|
13
|
+
<script lang="ts">
|
14
|
+
import '../../app.css'
|
15
|
+
import { defineComponent } from 'vue'
|
16
|
+
import BannerBox from './BannerBox.vue'
|
17
|
+
|
18
|
+
export default defineComponent({
|
19
|
+
name: 'BannerBoxImageExportExample',
|
20
|
+
components: {
|
21
|
+
BannerBox
|
22
|
+
}
|
23
|
+
})
|
24
|
+
</script>
|
25
|
+
|
26
|
+
<template>
|
27
|
+
<div>
|
28
|
+
<p class="cosy:mb-4">悬停在左上角显示下载按钮,点击可下载当前内容为图片。</p>
|
29
|
+
<BannerBox :backgroundClassIndex="8">
|
30
|
+
<div
|
31
|
+
class="cosy:flex cosy:flex-col cosy:items-center cosy:justify-center cosy:min-h-[200px] cosy:p-8 cosy:text-center">
|
32
|
+
<h2 class="cosy:text-3xl cosy:font-bold cosy:mb-4">可导出为图片的内容</h2>
|
33
|
+
<p class="cosy:text-lg">适用于创建社交媒体分享图、营销材料等场景</p>
|
34
|
+
</div>
|
35
|
+
</BannerBox>
|
36
|
+
</div>
|
37
|
+
</template>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<!--
|
2
|
+
@component BannerBox.SizePreset
|
3
|
+
|
4
|
+
@description
|
5
|
+
BannerBox 组件的尺寸预设示例,展示如何使用尺寸选择功能。
|
6
|
+
|
7
|
+
@usage
|
8
|
+
```vue
|
9
|
+
<BannerBoxExamples.SizePreset />
|
10
|
+
```
|
11
|
+
-->
|
12
|
+
|
13
|
+
<script lang="ts">
|
14
|
+
import '../../app.css'
|
15
|
+
import { defineComponent } from 'vue'
|
16
|
+
import BannerBox from './BannerBox.vue'
|
17
|
+
|
18
|
+
export default defineComponent({
|
19
|
+
name: 'BannerBoxSizePresetExample',
|
20
|
+
components: {
|
21
|
+
BannerBox
|
22
|
+
}
|
23
|
+
})
|
24
|
+
</script>
|
25
|
+
|
26
|
+
<template>
|
27
|
+
<div>
|
28
|
+
<p class="cosy:mb-4">悬停在左上角显示下载按钮,点击可切换尺寸。尺寸会保存在浏览器中。</p>
|
29
|
+
<BannerBox>
|
30
|
+
<div class="cosy:flex cosy:items-center cosy:justify-center cosy:min-h-[200px]">
|
31
|
+
<h2 class="cosy:text-3xl cosy:font-bold">点击左上角按钮切换尺寸</h2>
|
32
|
+
</div>
|
33
|
+
</BannerBox>
|
34
|
+
</div>
|
35
|
+
</template>
|
@@ -0,0 +1,190 @@
|
|
1
|
+
<script setup lang="ts">
|
2
|
+
import { computed, type Component } from 'vue';
|
3
|
+
import {
|
4
|
+
// 开发相关
|
5
|
+
RiGithubFill,
|
6
|
+
RiGitBranchLine,
|
7
|
+
RiTerminalBoxLine,
|
8
|
+
RiCommandLine,
|
9
|
+
RiCodeSSlashLine,
|
10
|
+
RiBracesLine,
|
11
|
+
RiDatabase2Line,
|
12
|
+
RiServerLine,
|
13
|
+
// 文档相关
|
14
|
+
RiBookOpenLine,
|
15
|
+
RiFileTextLine,
|
16
|
+
RiArticleLine,
|
17
|
+
RiDraftLine,
|
18
|
+
RiFileListLine,
|
19
|
+
// 媒体相关
|
20
|
+
RiImage2Line,
|
21
|
+
RiVideoLine,
|
22
|
+
RiMusic2Line,
|
23
|
+
RiPlayCircleLine,
|
24
|
+
RiMovieLine,
|
25
|
+
// 社交相关
|
26
|
+
RiUserLine,
|
27
|
+
RiTeamLine,
|
28
|
+
RiChat1Line,
|
29
|
+
RiMessage2Line,
|
30
|
+
RiShareLine,
|
31
|
+
// 工具相关
|
32
|
+
RiToolsLine,
|
33
|
+
RiSettings4Line,
|
34
|
+
RiDashboardLine,
|
35
|
+
RiAppsLine,
|
36
|
+
RiPlugLine,
|
37
|
+
// 安全相关
|
38
|
+
RiShieldLine,
|
39
|
+
RiLockLine,
|
40
|
+
RiKeyLine,
|
41
|
+
RiUserSettingsLine,
|
42
|
+
// 云服务相关
|
43
|
+
RiCloudLine,
|
44
|
+
RiUploadCloud2Line,
|
45
|
+
RiDownloadCloud2Line,
|
46
|
+
RiCloudOffLine,
|
47
|
+
// 设备相关
|
48
|
+
RiSmartphoneLine,
|
49
|
+
RiTabletLine,
|
50
|
+
RiComputerLine,
|
51
|
+
RiWifiLine,
|
52
|
+
// 数据相关
|
53
|
+
RiPieChartLine,
|
54
|
+
RiLineChartLine,
|
55
|
+
RiBarChartLine,
|
56
|
+
// AI/机器学习相关
|
57
|
+
RiRobot2Line,
|
58
|
+
RiBrainLine,
|
59
|
+
RiCpuLine,
|
60
|
+
// 其他常用
|
61
|
+
RiRocketLine,
|
62
|
+
RiLightbulbLine,
|
63
|
+
RiStarLine,
|
64
|
+
RiHeartLine,
|
65
|
+
RiThumbUpLine
|
66
|
+
} from '@remixicon/vue';
|
67
|
+
|
68
|
+
// 预设图标映射
|
69
|
+
const presetIcons = {
|
70
|
+
// 开发类
|
71
|
+
github: RiGithubFill,
|
72
|
+
git: RiGitBranchLine,
|
73
|
+
terminal: RiTerminalBoxLine,
|
74
|
+
command: RiCommandLine,
|
75
|
+
code: RiCodeSSlashLine,
|
76
|
+
api: RiBracesLine,
|
77
|
+
database: RiDatabase2Line,
|
78
|
+
server: RiServerLine,
|
79
|
+
|
80
|
+
// 文档类
|
81
|
+
book: RiBookOpenLine,
|
82
|
+
file: RiFileTextLine,
|
83
|
+
article: RiArticleLine,
|
84
|
+
draft: RiDraftLine,
|
85
|
+
list: RiFileListLine,
|
86
|
+
|
87
|
+
// 媒体类
|
88
|
+
image: RiImage2Line,
|
89
|
+
video: RiVideoLine,
|
90
|
+
music: RiMusic2Line,
|
91
|
+
play: RiPlayCircleLine,
|
92
|
+
movie: RiMovieLine,
|
93
|
+
|
94
|
+
// 社交类
|
95
|
+
user: RiUserLine,
|
96
|
+
team: RiTeamLine,
|
97
|
+
chat: RiChat1Line,
|
98
|
+
message: RiMessage2Line,
|
99
|
+
share: RiShareLine,
|
100
|
+
|
101
|
+
// 工具类
|
102
|
+
tools: RiToolsLine,
|
103
|
+
settings: RiSettings4Line,
|
104
|
+
dashboard: RiDashboardLine,
|
105
|
+
apps: RiAppsLine,
|
106
|
+
plugin: RiPlugLine,
|
107
|
+
|
108
|
+
// 安全类
|
109
|
+
shield: RiShieldLine,
|
110
|
+
lock: RiLockLine,
|
111
|
+
key: RiKeyLine,
|
112
|
+
security: RiUserSettingsLine,
|
113
|
+
|
114
|
+
// 云服务类
|
115
|
+
cloud: RiCloudLine,
|
116
|
+
upload: RiUploadCloud2Line,
|
117
|
+
download: RiDownloadCloud2Line,
|
118
|
+
offline: RiCloudOffLine,
|
119
|
+
|
120
|
+
// 设备类
|
121
|
+
mobile: RiSmartphoneLine,
|
122
|
+
tablet: RiTabletLine,
|
123
|
+
computer: RiComputerLine,
|
124
|
+
wifi: RiWifiLine,
|
125
|
+
|
126
|
+
// 数据类
|
127
|
+
chart: RiPieChartLine,
|
128
|
+
line: RiLineChartLine,
|
129
|
+
bar: RiBarChartLine,
|
130
|
+
data: RiDatabase2Line,
|
131
|
+
|
132
|
+
// AI/机器学习类
|
133
|
+
robot: RiRobot2Line,
|
134
|
+
brain: RiBrainLine,
|
135
|
+
cpu: RiCpuLine,
|
136
|
+
|
137
|
+
// 其他常用
|
138
|
+
rocket: RiRocketLine,
|
139
|
+
idea: RiLightbulbLine,
|
140
|
+
star: RiStarLine,
|
141
|
+
heart: RiHeartLine,
|
142
|
+
like: RiThumbUpLine
|
143
|
+
} as const;
|
144
|
+
|
145
|
+
type PresetIconType = keyof typeof presetIcons;
|
146
|
+
|
147
|
+
interface Props {
|
148
|
+
title: string;
|
149
|
+
description?: string;
|
150
|
+
link?: string;
|
151
|
+
emoji?: string;
|
152
|
+
icon?: Component; // 自定义图标组件
|
153
|
+
presetIcon?: PresetIconType; // 预设图标名称
|
154
|
+
}
|
155
|
+
|
156
|
+
const props = defineProps<Props>();
|
157
|
+
|
158
|
+
// 获取预设图标组件
|
159
|
+
const getPresetIcon = computed(() => {
|
160
|
+
if (!props.presetIcon) return null;
|
161
|
+
return presetIcons[props.presetIcon];
|
162
|
+
});
|
163
|
+
</script>
|
164
|
+
|
165
|
+
<template>
|
166
|
+
<component :is="link ? 'a' : 'div'" :href="link || undefined" :target="link ? '_blank' : undefined"
|
167
|
+
:rel="link ? 'noopener noreferrer' : undefined" :class="[
|
168
|
+
'cosy:card cosy:no-underline cosy:bg-base-100/10 cosy:backdrop-blur-lg cosy:p-8 cosy:transition-all cosy:duration-300 cosy:hover:-translate-y-1 cosy:shadow-lg',
|
169
|
+
{
|
170
|
+
'cosy:hover:bg-primary/15 cosy:cursor-pointer': link,
|
171
|
+
'cosy:cursor-default': !link
|
172
|
+
}
|
173
|
+
]">
|
174
|
+
<div class="card-body cosy:p-0">
|
175
|
+
<div class="cosy:mb-4">
|
176
|
+
<component :is="icon" v-if="icon" class="cosy:text-4xl cosy:text-base-content" />
|
177
|
+
<component :is="getPresetIcon" v-else-if="presetIcon" class="cosy:text-4xl cosy:text-base-content" />
|
178
|
+
<div v-else class="cosy:text-4xl cosy:text-base-content">
|
179
|
+
{{ emoji }}
|
180
|
+
</div>
|
181
|
+
</div>
|
182
|
+
<h3 class="card-title cosy:text-lg cosy:font-medium cosy:text-base-content">
|
183
|
+
{{ title }}
|
184
|
+
</h3>
|
185
|
+
<p v-if="description" class="cosy:text-base-content/70">
|
186
|
+
{{ description }}
|
187
|
+
</p>
|
188
|
+
</div>
|
189
|
+
</component>
|
190
|
+
</template>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<!--
|
2
|
+
@component BannerBox.SmartBanner
|
3
|
+
|
4
|
+
@description
|
5
|
+
BannerBox 组件的智能横幅模式示例,展示如何通过 title、description 和 features 属性创建结构化内容。
|
6
|
+
|
7
|
+
@usage
|
8
|
+
```vue
|
9
|
+
<BannerBoxExamples.SmartBanner />
|
10
|
+
```
|
11
|
+
-->
|
12
|
+
|
13
|
+
<script lang="ts">
|
14
|
+
import '../../app.css'
|
15
|
+
import { defineComponent } from 'vue'
|
16
|
+
import BannerBox from './BannerBox.vue'
|
17
|
+
|
18
|
+
export default defineComponent({
|
19
|
+
name: 'BannerBoxSmartBannerExample',
|
20
|
+
components: {
|
21
|
+
BannerBox
|
22
|
+
}
|
23
|
+
})
|
24
|
+
</script>
|
25
|
+
|
26
|
+
<template>
|
27
|
+
<BannerBox title="我们的产品特性" description="探索产品提供的所有强大功能" :features="[
|
28
|
+
{
|
29
|
+
emoji: '⚡',
|
30
|
+
title: '快速响应',
|
31
|
+
link: '#speed'
|
32
|
+
},
|
33
|
+
{
|
34
|
+
emoji: '🔒',
|
35
|
+
title: '安全可靠',
|
36
|
+
link: '#security'
|
37
|
+
},
|
38
|
+
{
|
39
|
+
emoji: '🌐',
|
40
|
+
title: '全球支持',
|
41
|
+
link: '#global'
|
42
|
+
}
|
43
|
+
]" />
|
44
|
+
</template>
|
@@ -0,0 +1,55 @@
|
|
1
|
+
/**
|
2
|
+
* BannerBox组件的背景样式类列表
|
3
|
+
* 包含多种渐变和纯色背景
|
4
|
+
*/
|
5
|
+
export const bgClasses = [
|
6
|
+
// 半透明渐变背景
|
7
|
+
'cosy:bg-gradient-to-b cosy:from-blue-100/50 cosy:to-blue-200/50 dark:cosy:from-blue-500/10 dark:cosy:to-blue-200/10',
|
8
|
+
'cosy:bg-gradient-to-b cosy:from-blue-200/50 cosy:to-purple-200/50 dark:cosy:from-blue-500/10 dark:cosy:to-purple-200/10',
|
9
|
+
'cosy:bg-gradient-to-b cosy:from-yellow-200/50 cosy:to-green-200/50 dark:cosy:from-yellow-500/10 dark:cosy:to-green-200/10',
|
10
|
+
'cosy:bg-gradient-to-b cosy:from-teal-200/50 cosy:to-blue-200/50 dark:cosy:from-teal-500/10 dark:cosy:to-blue-200/10',
|
11
|
+
'cosy:bg-gradient-to-b cosy:from-pink-200/50 cosy:to-indigo-200/20 dark:cosy:from-pink-500/10 dark:cosy:to-indigo-200/10',
|
12
|
+
'cosy:bg-gradient-to-b cosy:from-red-200/50 cosy:to-orange-200/50 dark:cosy:from-red-500/10 dark:cosy:to-orange-200/10',
|
13
|
+
'cosy:bg-gradient-to-b cosy:from-orange-200/50 cosy:to-yellow-200/50 dark:cosy:from-orange-500/10 dark:cosy:to-yellow-200/10',
|
14
|
+
'cosy:bg-gradient-to-b cosy:from-green-200/50 cosy:to-teal-200/50 dark:cosy:from-green-500/10 dark:cosy:to-teal-200/10',
|
15
|
+
|
16
|
+
// 不透明的背景
|
17
|
+
'cosy:bg-gradient-to-b cosy:from-blue-100 cosy:to-blue-200 dark:cosy:from-blue-500 dark:cosy:to-blue-200',
|
18
|
+
'cosy:bg-gradient-to-b cosy:from-blue-200 cosy:to-purple-200 dark:cosy:from-blue-500 dark:cosy:to-purple-200',
|
19
|
+
'cosy:bg-gradient-to-b cosy:from-yellow-200 cosy:to-green-200 dark:cosy:from-yellow-500 dark:cosy:to-green-200',
|
20
|
+
'cosy:bg-gradient-to-b cosy:from-teal-200 cosy:to-blue-200 dark:cosy:from-teal-500 dark:cosy:to-blue-200',
|
21
|
+
'cosy:bg-gradient-to-b cosy:from-pink-200 cosy:to-red-200 dark:cosy:from-pink-500 dark:cosy:to-red-200',
|
22
|
+
'cosy:bg-gradient-to-b cosy:from-red-200 cosy:to-orange-200 dark:cosy:from-red-500 dark:cosy:to-orange-200',
|
23
|
+
'cosy:bg-gradient-to-b cosy:from-orange-200 cosy:to-yellow-200 dark:cosy:from-orange-500 dark:cosy:to-yellow-200',
|
24
|
+
'cosy:bg-gradient-to-b cosy:from-green-200 cosy:to-teal-200 dark:cosy:from-green-500 dark:cosy:to-teal-200',
|
25
|
+
|
26
|
+
// 不透明的深色背景
|
27
|
+
'cosy:bg-gradient-to-b cosy:from-blue-900 cosy:to-blue-200 dark:cosy:from-blue-900 dark:cosy:to-blue-200',
|
28
|
+
'cosy:bg-gradient-to-b cosy:from-blue-900 cosy:to-purple-200 dark:cosy:from-blue-900 dark:cosy:to-purple-200',
|
29
|
+
'cosy:bg-gradient-to-b cosy:from-yellow-900 cosy:to-green-200 dark:cosy:from-yellow-900 dark:cosy:to-green-200',
|
30
|
+
'cosy:bg-gradient-to-b cosy:from-teal-900 cosy:to-blue-200 dark:cosy:from-teal-900 dark:cosy:to-blue-200',
|
31
|
+
'cosy:bg-gradient-to-b cosy:from-pink-900 cosy:to-red-200 dark:cosy:from-pink-900 dark:cosy:to-red-200',
|
32
|
+
'cosy:bg-gradient-to-b cosy:from-red-900 cosy:to-orange-200 dark:cosy:from-red-900 dark:cosy:to-orange-200',
|
33
|
+
'cosy:bg-gradient-to-b cosy:from-orange-900 cosy:to-yellow-200 dark:cosy:from-orange-900 dark:cosy:to-yellow-200',
|
34
|
+
'cosy:bg-gradient-to-b cosy:from-green-900 cosy:to-teal-900 dark:cosy:from-green-900 dark:cosy:to-teal-900',
|
35
|
+
|
36
|
+
// 不透明的渐变背景
|
37
|
+
'cosy:bg-gradient-to-br cosy:from-emerald-400 cosy:to-cyan-400 dark:cosy:from-emerald-600 dark:cosy:to-cyan-600',
|
38
|
+
'cosy:bg-gradient-to-br cosy:from-violet-400 cosy:to-fuchsia-400 dark:cosy:from-violet-600 dark:cosy:to-fuchsia-600',
|
39
|
+
'cosy:bg-gradient-to-br cosy:from-amber-400 cosy:to-orange-400 dark:cosy:from-amber-600 dark:cosy:to-orange-600',
|
40
|
+
'cosy:bg-gradient-to-br cosy:from-rose-400 cosy:to-pink-400 dark:cosy:from-rose-600 dark:cosy:to-pink-600',
|
41
|
+
'cosy:bg-gradient-to-br cosy:from-sky-400 cosy:to-indigo-400 dark:cosy:from-sky-600 dark:cosy:to-indigo-600',
|
42
|
+
'cosy:bg-gradient-to-br cosy:from-lime-400 cosy:to-emerald-400 dark:cosy:from-lime-600 dark:cosy:to-emerald-600',
|
43
|
+
'cosy:bg-gradient-to-br cosy:from-purple-400 cosy:to-indigo-400 dark:cosy:from-purple-600 dark:cosy:to-indigo-600',
|
44
|
+
'cosy:bg-gradient-to-br cosy:from-blue-400 cosy:to-violet-400 dark:cosy:from-blue-600 dark:cosy:to-violet-600',
|
45
|
+
|
46
|
+
// 纯色背景
|
47
|
+
'cosy:bg-emerald-400 dark:cosy:bg-emerald-600',
|
48
|
+
'cosy:bg-violet-400 dark:cosy:bg-violet-600',
|
49
|
+
'cosy:bg-amber-400 dark:cosy:bg-amber-600',
|
50
|
+
'cosy:bg-rose-400 dark:cosy:bg-rose-600',
|
51
|
+
'cosy:bg-sky-400 dark:cosy:bg-sky-600',
|
52
|
+
'cosy:bg-lime-400 dark:cosy:bg-lime-600',
|
53
|
+
'cosy:bg-purple-400 dark:cosy:bg-purple-600',
|
54
|
+
'cosy:bg-blue-400 dark:cosy:bg-blue-600',
|
55
|
+
];
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import Basic from './ExampleBasic.vue';
|
2
|
+
import CustomBg from './ExampleCustomBg.vue';
|
3
|
+
import DisplayModeAlways from './ExampleDisplayModeAlways.vue';
|
4
|
+
import DisplayModeHover from './ExampleDisplayModeHover.vue';
|
5
|
+
import DisplayModeNever from './ExampleDisplayModeNever.vue';
|
6
|
+
import SmartBanner from './SmartBanner.vue';
|
7
|
+
import SizePreset from './ExampleSizePreset.vue';
|
8
|
+
import ImageExport from './ExampleImageExport.vue';
|
9
|
+
import BasicSource from './ExampleBasic.vue?raw';
|
10
|
+
import CustomBgSource from './ExampleCustomBg.vue?raw';
|
11
|
+
import DisplayModeAlwaysSource from './ExampleDisplayModeAlways.vue?raw';
|
12
|
+
import DisplayModeHoverSource from './ExampleDisplayModeHover.vue?raw';
|
13
|
+
import DisplayModeNeverSource from './ExampleDisplayModeNever.vue?raw';
|
14
|
+
import SmartBannerSource from './SmartBanner.vue?raw';
|
15
|
+
import SizePresetSource from './ExampleSizePreset.vue?raw';
|
16
|
+
import ImageExportSource from './ExampleImageExport.vue?raw';
|
17
|
+
import { extractSimpleExample } from '../../utils/component';
|
18
|
+
|
19
|
+
// 获取 BannerBox 和 FeatureCard 组件
|
20
|
+
export { default as BannerBox } from './BannerBox.vue';
|
21
|
+
export { default as FeatureCard } from './FeatureCard.vue';
|
22
|
+
export { default as DownloadButton } from './DownloadButton.vue';
|
23
|
+
export { bgClasses } from './bgStyles';
|
24
|
+
export { sizePresets, type SizePreset } from './sizePresets';
|
25
|
+
|
26
|
+
// 导出示例组件
|
27
|
+
export const BannerBoxExamples = {
|
28
|
+
Basic,
|
29
|
+
CustomBg,
|
30
|
+
DisplayModeAlways,
|
31
|
+
DisplayModeHover,
|
32
|
+
DisplayModeNever,
|
33
|
+
SmartBanner,
|
34
|
+
SizePreset,
|
35
|
+
ImageExport,
|
36
|
+
};
|
37
|
+
|
38
|
+
// 导出示例源代码
|
39
|
+
export const BannerBoxExampleCodes = {
|
40
|
+
Basic: extractSimpleExample(BasicSource, 'BannerBox'),
|
41
|
+
CustomBg: extractSimpleExample(CustomBgSource, 'BannerBox'),
|
42
|
+
DisplayModeAlways: extractSimpleExample(DisplayModeAlwaysSource, 'BannerBox'),
|
43
|
+
DisplayModeHover: extractSimpleExample(DisplayModeHoverSource, 'BannerBox'),
|
44
|
+
DisplayModeNever: extractSimpleExample(DisplayModeNeverSource, 'BannerBox'),
|
45
|
+
SmartBanner: extractSimpleExample(SmartBannerSource, 'BannerBox'),
|
46
|
+
SizePreset: extractSimpleExample(SizePresetSource, 'BannerBox'),
|
47
|
+
ImageExport: extractSimpleExample(ImageExportSource, 'BannerBox'),
|
48
|
+
};
|
@@ -0,0 +1,23 @@
|
|
1
|
+
/**
|
2
|
+
* BannerBox组件的尺寸预设列表
|
3
|
+
* 包含各种常用尺寸和比例
|
4
|
+
*/
|
5
|
+
|
6
|
+
export interface SizePreset {
|
7
|
+
name: string;
|
8
|
+
width: string;
|
9
|
+
height: string;
|
10
|
+
}
|
11
|
+
|
12
|
+
export const sizePresets: SizePreset[] = [
|
13
|
+
{ name: 'Default', width: 'cosy:w-full', height: 'cosy:h-full' },
|
14
|
+
{ name: 'Square', width: 'cosy:w-[600px]', height: 'cosy:h-[600px]' },
|
15
|
+
{ name: 'Landscape', width: 'cosy:w-[800px]', height: 'cosy:h-[450px]' },
|
16
|
+
{ name: 'Portrait', width: 'cosy:w-[450px]', height: 'cosy:h-[800px]' },
|
17
|
+
{ name: 'Wide', width: 'cosy:w-[1200px]', height: 'cosy:h-[675px]' },
|
18
|
+
{ name: 'Banner', width: 'cosy:w-[1200px]', height: 'cosy:h-[300px]' },
|
19
|
+
{ name: '1280 × 800', width: 'cosy:w-[1280px]', height: 'cosy:h-[800px]' },
|
20
|
+
{ name: '1440 × 900', width: 'cosy:w-[1440px]', height: 'cosy:h-[900px]' },
|
21
|
+
{ name: '2560 × 1600', width: 'cosy:w-[2560px]', height: 'cosy:h-[1600px]' },
|
22
|
+
{ name: '2880 × 1800', width: 'cosy:w-[2880px]', height: 'cosy:h-[1800px]' },
|
23
|
+
];
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<template>
|
2
|
+
<BlogList :blogs="blogs" lang="zh" />
|
3
|
+
</template>
|
4
|
+
|
5
|
+
<script setup lang="ts">
|
6
|
+
import '../../style';
|
7
|
+
import { ref } from 'vue';
|
8
|
+
import BlogList from './BlogList.vue';
|
9
|
+
|
10
|
+
const blogs = ref([
|
11
|
+
{
|
12
|
+
id: '1',
|
13
|
+
title: '如何在Vue 3中使用组合式API',
|
14
|
+
link: '/blog/vue3-composition-api',
|
15
|
+
tags: ['Vue', '前端']
|
16
|
+
},
|
17
|
+
{
|
18
|
+
id: '2',
|
19
|
+
title: 'TypeScript高级类型技巧',
|
20
|
+
link: '/blog/typescript-advanced-types',
|
21
|
+
tags: ['TypeScript', '编程']
|
22
|
+
},
|
23
|
+
{
|
24
|
+
id: '3',
|
25
|
+
title: '响应式设计最佳实践',
|
26
|
+
link: '/blog/responsive-design-best-practices',
|
27
|
+
tags: ['CSS', '设计']
|
28
|
+
}
|
29
|
+
]);
|
30
|
+
</script>
|
@@ -0,0 +1,100 @@
|
|
1
|
+
<!--
|
2
|
+
@component BlogList
|
3
|
+
|
4
|
+
@description
|
5
|
+
BlogList 组件用于展示博客文章列表,支持国际化,提供空状态显示。
|
6
|
+
|
7
|
+
@usage
|
8
|
+
基本用法:
|
9
|
+
```vue
|
10
|
+
<BlogList :blogs="blogPosts" lang="zh" />
|
11
|
+
```
|
12
|
+
|
13
|
+
多语言支持:
|
14
|
+
```vue
|
15
|
+
<BlogList :blogs="blogPosts" lang="en" />
|
16
|
+
```
|
17
|
+
|
18
|
+
组合使用:
|
19
|
+
```vue
|
20
|
+
<template>
|
21
|
+
<BlogList :blogs="blogPosts" :lang="currentLang" />
|
22
|
+
</template>
|
23
|
+
|
24
|
+
<script setup lang="ts">
|
25
|
+
import { ref } from 'vue';
|
26
|
+
import { BlogList } from 'cosy-ui';
|
27
|
+
|
28
|
+
const blogPosts = ref([
|
29
|
+
{ id: '1', title: '文章标题', link: '/blog/post-1', tags: ['技术', 'Vue'] }
|
30
|
+
]);
|
31
|
+
const currentLang = ref('zh');
|
32
|
+
</script>
|
33
|
+
```
|
34
|
+
|
35
|
+
@props
|
36
|
+
@prop {IBlog[]} blogs - 博客文章数组
|
37
|
+
@prop {('zh'|'en')} [lang='zh'] - 语言设置,影响空状态显示文本
|
38
|
+
-->
|
39
|
+
|
40
|
+
<script setup lang="ts">
|
41
|
+
import '../../style';
|
42
|
+
import InboxArchiveIcon from '../Icons/InboxArchiveIcon.vue';
|
43
|
+
import Link from '../SmartLink.vue';
|
44
|
+
import ListItem from '../ListItem.vue';
|
45
|
+
|
46
|
+
export interface IBlog {
|
47
|
+
id: string;
|
48
|
+
title: string;
|
49
|
+
link: string;
|
50
|
+
tags: string[];
|
51
|
+
}
|
52
|
+
|
53
|
+
interface Props {
|
54
|
+
blogs: IBlog[];
|
55
|
+
lang?: 'zh' | 'en';
|
56
|
+
}
|
57
|
+
|
58
|
+
const props = withDefaults(defineProps<Props>(), {
|
59
|
+
lang: 'zh'
|
60
|
+
});
|
61
|
+
|
62
|
+
// 多语言文本
|
63
|
+
const messages = {
|
64
|
+
'zh': {
|
65
|
+
empty: '暂无博客文章',
|
66
|
+
checkLater: '稍后再来看看吧'
|
67
|
+
},
|
68
|
+
'en': {
|
69
|
+
empty: 'No blog posts yet',
|
70
|
+
checkLater: 'Check back later'
|
71
|
+
}
|
72
|
+
};
|
73
|
+
|
74
|
+
const t = (key: keyof typeof messages['zh']) => {
|
75
|
+
return messages[props.lang][key];
|
76
|
+
};
|
77
|
+
</script>
|
78
|
+
|
79
|
+
<template>
|
80
|
+
<div class="cosy:py-4">
|
81
|
+
<ul v-if="blogs.length > 0" class="cosy:list-none">
|
82
|
+
<ListItem v-for="blog in blogs" :key="blog.id">
|
83
|
+
<Link :href="blog.link">
|
84
|
+
{{ blog.title }}
|
85
|
+
</Link>
|
86
|
+
</ListItem>
|
87
|
+
</ul>
|
88
|
+
<div v-else class="cosy:text-center cosy:py-8">
|
89
|
+
<div class="cosy:flex cosy:flex-col cosy:items-center cosy:text-base-content/50">
|
90
|
+
<InboxArchiveIcon class="cosy:text-5xl cosy:mb-4 cosy:h-36 cosy:w-36" />
|
91
|
+
<p class="cosy:text-lg">
|
92
|
+
{{ t('empty') }}
|
93
|
+
</p>
|
94
|
+
<p class="cosy:text-sm">
|
95
|
+
{{ t('checkLater') }}
|
96
|
+
</p>
|
97
|
+
</div>
|
98
|
+
</div>
|
99
|
+
</div>
|
100
|
+
</template>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<template>
|
2
|
+
<BlogList :blogs="blogs" lang="en" />
|
3
|
+
</template>
|
4
|
+
|
5
|
+
<script setup lang="ts">
|
6
|
+
import '../../style';
|
7
|
+
import { ref } from 'vue';
|
8
|
+
import BlogList from './BlogList.vue';
|
9
|
+
|
10
|
+
const blogs = ref([
|
11
|
+
{
|
12
|
+
id: '1',
|
13
|
+
title: 'Getting Started with Vue 3 Composition API',
|
14
|
+
link: '/blog/vue3-composition-api',
|
15
|
+
tags: ['Vue', 'Frontend']
|
16
|
+
},
|
17
|
+
{
|
18
|
+
id: '2',
|
19
|
+
title: 'Advanced TypeScript Type Techniques',
|
20
|
+
link: '/blog/typescript-advanced-types',
|
21
|
+
tags: ['TypeScript', 'Programming']
|
22
|
+
}
|
23
|
+
]);
|
24
|
+
</script>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import Basic from './Basic.vue';
|
2
|
+
import Empty from './Empty.vue';
|
3
|
+
import English from './English.vue';
|
4
|
+
import EmptyEnglish from './EmptyEnglish.vue';
|
5
|
+
import BasicSource from './Basic.vue?raw';
|
6
|
+
import EmptySource from './Empty.vue?raw';
|
7
|
+
import EnglishSource from './English.vue?raw';
|
8
|
+
import EmptyEnglishSource from './EmptyEnglish.vue?raw';
|
9
|
+
import { extractSimpleExample } from '../../utils/component';
|
10
|
+
|
11
|
+
// 导出主组件
|
12
|
+
export { default as BlogList } from './BlogList.vue';
|
13
|
+
export type { IBlog } from './BlogList.vue';
|
14
|
+
|
15
|
+
// 将示例组件整合为一个对象导出
|
16
|
+
export const BlogListExamples = {
|
17
|
+
Basic,
|
18
|
+
Empty,
|
19
|
+
English,
|
20
|
+
EmptyEnglish,
|
21
|
+
};
|
22
|
+
|
23
|
+
// 导出示例组件的源代码(简化版本)
|
24
|
+
export const BlogListExampleCodes = {
|
25
|
+
Basic: extractSimpleExample(BasicSource, 'BlogList'),
|
26
|
+
Empty: extractSimpleExample(EmptySource, 'BlogList'),
|
27
|
+
English: extractSimpleExample(EnglishSource, 'BlogList'),
|
28
|
+
EmptyEnglish: extractSimpleExample(EmptyEnglishSource, 'BlogList'),
|
29
|
+
};
|