@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,134 @@
|
|
1
|
+
<!--
|
2
|
+
@component ConfirmDialog
|
3
|
+
|
4
|
+
@description
|
5
|
+
ConfirmDialog 组件用于显示确认对话框,带有标题、消息内容和两个按钮(确认和取消),支持自定义按钮文本,并带有淡入淡出动画效果。
|
6
|
+
|
7
|
+
@usage
|
8
|
+
基本用法:
|
9
|
+
```vue
|
10
|
+
<ConfirmDialog v-model="showDialog" title="确认操作" message="您确定要执行此操作吗?" @confirm="handleConfirm" />
|
11
|
+
```
|
12
|
+
|
13
|
+
自定义按钮文本:
|
14
|
+
```vue
|
15
|
+
<ConfirmDialog
|
16
|
+
v-model="showDialog"
|
17
|
+
title="删除确认"
|
18
|
+
message="您确定要删除此项目吗?此操作无法撤销。"
|
19
|
+
cancel-text="取消"
|
20
|
+
confirm-text="删除"
|
21
|
+
@confirm="handleDelete"
|
22
|
+
/>
|
23
|
+
```
|
24
|
+
|
25
|
+
组合使用:
|
26
|
+
```vue
|
27
|
+
<template>
|
28
|
+
<button @click="showDialog = true">删除项目</button>
|
29
|
+
<ConfirmDialog v-model="showDialog" title="删除确认" message="此操作无法撤销" @confirm="handleDelete" />
|
30
|
+
</template>
|
31
|
+
|
32
|
+
<script setup lang="ts">
|
33
|
+
import { ref } from 'vue';
|
34
|
+
import { ConfirmDialog } from 'cosy-ui';
|
35
|
+
|
36
|
+
const showDialog = ref(false);
|
37
|
+
const handleDelete = () => {
|
38
|
+
// 处理确认删除逻辑
|
39
|
+
};
|
40
|
+
</script>
|
41
|
+
```
|
42
|
+
|
43
|
+
@props
|
44
|
+
@prop {boolean} modelValue - 控制对话框显示状态,支持v-model双向绑定
|
45
|
+
@prop {string} [title='Confirm'] - 对话框标题
|
46
|
+
@prop {string} [message='Are you sure you want to confirm this action?'] - 对话框显示的消息内容
|
47
|
+
@prop {string} [cancel-text='取消'] - 取消按钮的文本
|
48
|
+
@prop {string} [confirm-text='确认'] - 确认按钮的文本
|
49
|
+
|
50
|
+
@emits
|
51
|
+
@emit {update:modelValue} - 当对话框关闭时触发,用于更新v-model绑定值
|
52
|
+
@emit {confirm} - 当用户点击确认按钮时触发
|
53
|
+
-->
|
54
|
+
|
55
|
+
<template>
|
56
|
+
<Transition name="fade" class="cosy:transition-opacity cosy:duration-200 cosy:ease-in-out">
|
57
|
+
<div v-if="modelValue"
|
58
|
+
class="cosy:fixed cosy:inset-0 cosy:z-50 cosy:flex cosy:items-center cosy:justify-center">
|
59
|
+
<!-- 背景遮罩 -->
|
60
|
+
<div class="cosy:absolute cosy:inset-0 cosy:bg-base-200/80 cosy:backdrop-blur-sm"
|
61
|
+
@click="$emit('update:modelValue', false)" />
|
62
|
+
|
63
|
+
<!-- 对话框 -->
|
64
|
+
<div
|
65
|
+
class="cosy:relative cosy:bg-base-100 cosy:rounded-xl cosy:shadow-xl cosy:w-[400px] cosy:transform cosy:transition-all">
|
66
|
+
<!-- 内容区域 -->
|
67
|
+
<div class="cosy:p-6">
|
68
|
+
<h3 class="cosy:text-lg cosy:font-medium cosy:text-base-content cosy:mb-2">
|
69
|
+
{{ title }}
|
70
|
+
</h3>
|
71
|
+
<p class="cosy:text-base-content/80">
|
72
|
+
{{ message }}
|
73
|
+
</p>
|
74
|
+
</div>
|
75
|
+
|
76
|
+
<!-- 按钮区域 -->
|
77
|
+
<div class="cosy:flex cosy:border-t cosy:border-base-300">
|
78
|
+
<button class="cosy:flex-1 cosy:btn cosy:btn-ghost cosy:rounded-none cosy:rounded-bl-xl"
|
79
|
+
@click="$emit('update:modelValue', false)">
|
80
|
+
{{ cancelText }}
|
81
|
+
</button>
|
82
|
+
<button
|
83
|
+
class="cosy:flex-1 cosy:btn cosy:btn-ghost cosy:text-primary cosy:rounded-none cosy:rounded-br-xl cosy:border-l cosy:border-base-300"
|
84
|
+
@click="handleConfirm">
|
85
|
+
{{ confirmText }}
|
86
|
+
</button>
|
87
|
+
</div>
|
88
|
+
</div>
|
89
|
+
</div>
|
90
|
+
</Transition>
|
91
|
+
</template>
|
92
|
+
|
93
|
+
<script setup lang="ts">
|
94
|
+
import '../../style'
|
95
|
+
|
96
|
+
defineProps({
|
97
|
+
modelValue: Boolean,
|
98
|
+
title: {
|
99
|
+
type: String,
|
100
|
+
default: 'Confirm'
|
101
|
+
},
|
102
|
+
message: {
|
103
|
+
type: String,
|
104
|
+
default: 'Are you sure you want to confirm this action?'
|
105
|
+
},
|
106
|
+
cancelText: {
|
107
|
+
type: String,
|
108
|
+
default: '取消'
|
109
|
+
},
|
110
|
+
confirmText: {
|
111
|
+
type: String,
|
112
|
+
default: '确认'
|
113
|
+
}
|
114
|
+
})
|
115
|
+
|
116
|
+
const emit = defineEmits(['update:modelValue', 'confirm'])
|
117
|
+
|
118
|
+
const handleConfirm = () => {
|
119
|
+
emit('update:modelValue', false)
|
120
|
+
emit('confirm')
|
121
|
+
}
|
122
|
+
</script>
|
123
|
+
|
124
|
+
<style scoped>
|
125
|
+
.fade-enter-active,
|
126
|
+
.fade-leave-active {
|
127
|
+
transition: opacity 0.2s ease;
|
128
|
+
}
|
129
|
+
|
130
|
+
.fade-enter-from,
|
131
|
+
.fade-leave-to {
|
132
|
+
opacity: 0;
|
133
|
+
}
|
134
|
+
</style>
|
@@ -0,0 +1,69 @@
|
|
1
|
+
<!--
|
2
|
+
@component ConfirmDialog.CustomButtons
|
3
|
+
|
4
|
+
@description
|
5
|
+
展示如何自定义 ConfirmDialog 组件的按钮文本。
|
6
|
+
|
7
|
+
@usage
|
8
|
+
```vue
|
9
|
+
<ConfirmDialogExamples.CustomButtons />
|
10
|
+
```
|
11
|
+
-->
|
12
|
+
|
13
|
+
<script lang="ts">
|
14
|
+
import '../../app.css'
|
15
|
+
import { ref, defineComponent } from 'vue'
|
16
|
+
import ConfirmDialog from './ConfirmDialog.vue'
|
17
|
+
|
18
|
+
export default defineComponent({
|
19
|
+
name: 'ConfirmDialogCustomButtonsExample',
|
20
|
+
components: {
|
21
|
+
ConfirmDialog
|
22
|
+
},
|
23
|
+
setup() {
|
24
|
+
const isShowDelete = ref(false)
|
25
|
+
const isShowSave = ref(false)
|
26
|
+
const result = ref('')
|
27
|
+
|
28
|
+
const handleConfirm = (action: string) => {
|
29
|
+
result.value = `用户已${action}`
|
30
|
+
|
31
|
+
// 3秒后清除结果
|
32
|
+
setTimeout(() => {
|
33
|
+
result.value = ''
|
34
|
+
}, 3000)
|
35
|
+
}
|
36
|
+
|
37
|
+
return {
|
38
|
+
isShowDelete,
|
39
|
+
isShowSave,
|
40
|
+
result,
|
41
|
+
handleConfirm
|
42
|
+
}
|
43
|
+
}
|
44
|
+
})
|
45
|
+
</script>
|
46
|
+
|
47
|
+
<template>
|
48
|
+
<div class="cosy:flex cosy:flex-col cosy:gap-4">
|
49
|
+
<div class="cosy:flex cosy:gap-4">
|
50
|
+
<button @click="isShowDelete = true" class="cosy:btn cosy:btn-error">
|
51
|
+
删除文件
|
52
|
+
</button>
|
53
|
+
|
54
|
+
<button @click="isShowSave = true" class="cosy:btn cosy:btn-success">
|
55
|
+
保存更改
|
56
|
+
</button>
|
57
|
+
</div>
|
58
|
+
|
59
|
+
<div v-if="result" class="cosy:alert cosy:alert-info cosy:shadow-lg">
|
60
|
+
<span>{{ result }}</span>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<ConfirmDialog v-model="isShowDelete" title="警告" message="您确定要删除这个文件吗?此操作无法撤销。" cancel-text="取消" confirm-text="删除"
|
65
|
+
@confirm="handleConfirm('删除了文件')" />
|
66
|
+
|
67
|
+
<ConfirmDialog v-model="isShowSave" title="保存更改" message="您的更改尚未保存,确定要保存吗?" cancel-text="稍后再说" confirm-text="保存"
|
68
|
+
@confirm="handleConfirm('保存了更改')" />
|
69
|
+
</template>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import Basic from './Basic.vue';
|
2
|
+
import CustomButtons from './CustomButtons.vue';
|
3
|
+
import BasicSource from './Basic.vue?raw';
|
4
|
+
import CustomButtonsSource from './CustomButtons.vue?raw';
|
5
|
+
import { extractSimpleExample } from '../../utils/component';
|
6
|
+
|
7
|
+
// 导出主组件
|
8
|
+
export { default as ConfirmDialog } from './ConfirmDialog.vue';
|
9
|
+
|
10
|
+
// 导出示例组件
|
11
|
+
export const ConfirmDialogExamples = {
|
12
|
+
Basic,
|
13
|
+
CustomButtons,
|
14
|
+
};
|
15
|
+
|
16
|
+
// 导出示例源代码
|
17
|
+
export const ConfirmDialogExampleCodes = {
|
18
|
+
Basic: extractSimpleExample(BasicSource, 'ConfirmDialog'),
|
19
|
+
CustomButtons: extractSimpleExample(CustomButtonsSource, 'ConfirmDialog'),
|
20
|
+
};
|
@@ -0,0 +1,279 @@
|
|
1
|
+
---
|
2
|
+
/**
|
3
|
+
* @component Contact
|
4
|
+
*
|
5
|
+
* @description
|
6
|
+
* Contact 组件用于展示企业或个人的联系信息,支持多种联系方式(邮件、电话、地址)和社交媒体链接。
|
7
|
+
* 组件设计简洁专业,适合在企业网站的联系页面、页脚或关于我们页面中使用。
|
8
|
+
*
|
9
|
+
* @usage
|
10
|
+
* 基本用法:
|
11
|
+
* ```astro
|
12
|
+
* <Contact
|
13
|
+
* email="contact@company.com"
|
14
|
+
* phone="+1 (555) 123-4567"
|
15
|
+
* address="123 Business St, City, State 12345"
|
16
|
+
* />
|
17
|
+
* ```
|
18
|
+
*
|
19
|
+
* 带社交媒体链接:
|
20
|
+
* ```astro
|
21
|
+
* <Contact
|
22
|
+
* email="contact@company.com"
|
23
|
+
* phone="+1 (555) 123-4567"
|
24
|
+
* address="123 Business St, City, State 12345"
|
25
|
+
* github="https://github.com/company"
|
26
|
+
* twitter="https://twitter.com/company"
|
27
|
+
* facebook="https://facebook.com/company"
|
28
|
+
* />
|
29
|
+
* ```
|
30
|
+
*
|
31
|
+
* 带标题和描述:
|
32
|
+
* ```astro
|
33
|
+
* <Contact
|
34
|
+
* title="联系我们"
|
35
|
+
* description="欢迎随时与我们取得联系"
|
36
|
+
* email="contact@company.com"
|
37
|
+
* phone="+1 (555) 123-4567"
|
38
|
+
* />
|
39
|
+
* ```
|
40
|
+
*
|
41
|
+
* 紧凑模式:
|
42
|
+
* ```astro
|
43
|
+
* <Contact
|
44
|
+
* email="contact@company.com"
|
45
|
+
* phone="+1 (555) 123-4567"
|
46
|
+
* compact
|
47
|
+
* />
|
48
|
+
* ```
|
49
|
+
*
|
50
|
+
* @props
|
51
|
+
* @prop {string} [title] - 联系信息标题
|
52
|
+
* @prop {string} [description] - 联系信息描述
|
53
|
+
* @prop {string} [email] - 电子邮件地址
|
54
|
+
* @prop {string} [phone] - 电话号码
|
55
|
+
* @prop {string} [address] - 地址信息
|
56
|
+
* @prop {string} [website] - 网站链接
|
57
|
+
* @prop {string} [github] - GitHub链接
|
58
|
+
* @prop {string} [twitter] - Twitter链接
|
59
|
+
* @prop {string} [facebook] - Facebook链接
|
60
|
+
* @prop {string} [linkedin] - LinkedIn链接
|
61
|
+
* @prop {boolean} [compact] - 是否使用紧凑模式
|
62
|
+
* @prop {string} [class] - 自定义CSS类,可用于覆盖默认样式
|
63
|
+
*
|
64
|
+
* @slots
|
65
|
+
* @slot default - 额外的联系信息内容
|
66
|
+
*/
|
67
|
+
|
68
|
+
import '../style.ts';
|
69
|
+
|
70
|
+
interface Props {
|
71
|
+
title?: string;
|
72
|
+
description?: string;
|
73
|
+
email?: string;
|
74
|
+
phone?: string;
|
75
|
+
address?: string;
|
76
|
+
website?: string;
|
77
|
+
github?: string;
|
78
|
+
twitter?: string;
|
79
|
+
facebook?: string;
|
80
|
+
linkedin?: string;
|
81
|
+
compact?: boolean;
|
82
|
+
class?: string;
|
83
|
+
}
|
84
|
+
|
85
|
+
const {
|
86
|
+
title,
|
87
|
+
description,
|
88
|
+
email,
|
89
|
+
phone,
|
90
|
+
address,
|
91
|
+
website,
|
92
|
+
github,
|
93
|
+
twitter,
|
94
|
+
facebook,
|
95
|
+
linkedin,
|
96
|
+
compact,
|
97
|
+
class: className = '',
|
98
|
+
} = Astro.props;
|
99
|
+
|
100
|
+
// 构建联系信息容器样式
|
101
|
+
const contactClasses = [
|
102
|
+
'cosy:card',
|
103
|
+
'cosy:w-full',
|
104
|
+
'cosy:bg-base-100',
|
105
|
+
'cosy:shadow-lg',
|
106
|
+
compact ? 'cosy:card-compact' : '',
|
107
|
+
className,
|
108
|
+
]
|
109
|
+
.filter(Boolean)
|
110
|
+
.join(' ');
|
111
|
+
|
112
|
+
// 内容区域的padding
|
113
|
+
const contentPadding = compact ? 'cosy:p-4' : 'cosy:p-6';
|
114
|
+
|
115
|
+
// 联系信息项的样式
|
116
|
+
const contactItemClass = 'cosy:flex cosy:items-center cosy:gap-3 cosy:mb-4 last:cosy:mb-0';
|
117
|
+
const iconClass = 'cosy:w-5 cosy:h-5 cosy:text-primary cosy:flex-shrink-0';
|
118
|
+
const linkClass =
|
119
|
+
'cosy:link cosy:link-hover cosy:text-base-content cosy:no-underline hover:cosy:text-primary cosy:transition-colors';
|
120
|
+
|
121
|
+
// 社交媒体链接样式
|
122
|
+
const socialLinksClass =
|
123
|
+
'cosy:flex cosy:gap-4 cosy:mt-6 cosy:pt-4 cosy:border-t cosy:border-base-300';
|
124
|
+
const socialLinkClass =
|
125
|
+
'cosy:btn cosy:btn-ghost cosy:btn-circle cosy:btn-sm cosy:text-base-content hover:cosy:text-primary hover:cosy:bg-primary/10';
|
126
|
+
---
|
127
|
+
|
128
|
+
<div class={contactClasses}>
|
129
|
+
<div class={`cosy:card-body ${contentPadding}`}>
|
130
|
+
{title && <h2 class="cosy:card-title cosy:text-2xl cosy:font-bold cosy:mb-2">{title}</h2>}
|
131
|
+
|
132
|
+
{description && <p class="cosy:text-base-content/70 cosy:mb-6">{description}</p>}
|
133
|
+
|
134
|
+
<div class="cosy:space-y-0">
|
135
|
+
{
|
136
|
+
email && (
|
137
|
+
<div class={contactItemClass}>
|
138
|
+
<svg class={iconClass} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
139
|
+
<path
|
140
|
+
stroke-linecap="round"
|
141
|
+
stroke-linejoin="round"
|
142
|
+
stroke-width="2"
|
143
|
+
d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"
|
144
|
+
/>
|
145
|
+
</svg>
|
146
|
+
<a href={`mailto:${email}`} class={linkClass}>
|
147
|
+
{email}
|
148
|
+
</a>
|
149
|
+
</div>
|
150
|
+
)
|
151
|
+
}
|
152
|
+
|
153
|
+
{
|
154
|
+
phone && (
|
155
|
+
<div class={contactItemClass}>
|
156
|
+
<svg class={iconClass} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
157
|
+
<path
|
158
|
+
stroke-linecap="round"
|
159
|
+
stroke-linejoin="round"
|
160
|
+
stroke-width="2"
|
161
|
+
d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"
|
162
|
+
/>
|
163
|
+
</svg>
|
164
|
+
<a href={`tel:${phone}`} class={linkClass}>
|
165
|
+
{phone}
|
166
|
+
</a>
|
167
|
+
</div>
|
168
|
+
)
|
169
|
+
}
|
170
|
+
|
171
|
+
{
|
172
|
+
address && (
|
173
|
+
<div class={contactItemClass}>
|
174
|
+
<svg class={iconClass} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
175
|
+
<path
|
176
|
+
stroke-linecap="round"
|
177
|
+
stroke-linejoin="round"
|
178
|
+
stroke-width="2"
|
179
|
+
d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"
|
180
|
+
/>
|
181
|
+
<path
|
182
|
+
stroke-linecap="round"
|
183
|
+
stroke-linejoin="round"
|
184
|
+
stroke-width="2"
|
185
|
+
d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"
|
186
|
+
/>
|
187
|
+
</svg>
|
188
|
+
<span class="cosy:text-base-content">{address}</span>
|
189
|
+
</div>
|
190
|
+
)
|
191
|
+
}
|
192
|
+
|
193
|
+
{
|
194
|
+
website && (
|
195
|
+
<div class={contactItemClass}>
|
196
|
+
<svg class={iconClass} fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
197
|
+
<path
|
198
|
+
stroke-linecap="round"
|
199
|
+
stroke-linejoin="round"
|
200
|
+
stroke-width="2"
|
201
|
+
d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"
|
202
|
+
/>
|
203
|
+
</svg>
|
204
|
+
<a href={website} target="_blank" rel="noopener noreferrer" class={linkClass}>
|
205
|
+
{website.replace(/^https?:\/\//, '')}
|
206
|
+
</a>
|
207
|
+
</div>
|
208
|
+
)
|
209
|
+
}
|
210
|
+
</div>
|
211
|
+
|
212
|
+
{
|
213
|
+
Astro.slots.has('default') && (
|
214
|
+
<div class="cosy:mt-4">
|
215
|
+
<slot />
|
216
|
+
</div>
|
217
|
+
)
|
218
|
+
}
|
219
|
+
|
220
|
+
{
|
221
|
+
(github || twitter || facebook || linkedin) && (
|
222
|
+
<div class={socialLinksClass}>
|
223
|
+
{github && (
|
224
|
+
<a
|
225
|
+
href={github}
|
226
|
+
target="_blank"
|
227
|
+
rel="noopener noreferrer"
|
228
|
+
class={socialLinkClass}
|
229
|
+
title="GitHub">
|
230
|
+
<svg class="cosy:w-5 cosy:h-5" fill="currentColor" viewBox="0 0 24 24">
|
231
|
+
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
|
232
|
+
</svg>
|
233
|
+
</a>
|
234
|
+
)}
|
235
|
+
|
236
|
+
{twitter && (
|
237
|
+
<a
|
238
|
+
href={twitter}
|
239
|
+
target="_blank"
|
240
|
+
rel="noopener noreferrer"
|
241
|
+
class={socialLinkClass}
|
242
|
+
title="Twitter">
|
243
|
+
<svg class="cosy:w-5 cosy:h-5" fill="currentColor" viewBox="0 0 24 24">
|
244
|
+
<path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z" />
|
245
|
+
</svg>
|
246
|
+
</a>
|
247
|
+
)}
|
248
|
+
|
249
|
+
{facebook && (
|
250
|
+
<a
|
251
|
+
href={facebook}
|
252
|
+
target="_blank"
|
253
|
+
rel="noopener noreferrer"
|
254
|
+
class={socialLinkClass}
|
255
|
+
title="Facebook">
|
256
|
+
<svg class="cosy:w-5 cosy:h-5" fill="currentColor" viewBox="0 0 24 24">
|
257
|
+
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z" />
|
258
|
+
</svg>
|
259
|
+
</a>
|
260
|
+
)}
|
261
|
+
|
262
|
+
{linkedin && (
|
263
|
+
<a
|
264
|
+
href={linkedin}
|
265
|
+
target="_blank"
|
266
|
+
rel="noopener noreferrer"
|
267
|
+
class={socialLinkClass}
|
268
|
+
title="LinkedIn">
|
269
|
+
<svg class="cosy:w-5 cosy:h-5" fill="currentColor" viewBox="0 0 24 24">
|
270
|
+
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z" />
|
271
|
+
</svg>
|
272
|
+
</a>
|
273
|
+
)}
|
274
|
+
</div>
|
275
|
+
)
|
276
|
+
}
|
277
|
+
</div>
|
278
|
+
</div>
|
279
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
/**
|
3
|
+
* @component Contact.Basic
|
4
|
+
*
|
5
|
+
* @description
|
6
|
+
* 基础Contact组件示例,展示最简单的联系信息用法。
|
7
|
+
*/
|
8
|
+
import Contact from './Contact.astro';
|
9
|
+
---
|
10
|
+
|
11
|
+
<Contact
|
12
|
+
email="contact@company.com"
|
13
|
+
phone="+1 (555) 123-4567"
|
14
|
+
address="123 Business St, City, State 12345"
|
15
|
+
/>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
import { CodeContainer } from '../index';
|
3
|
+
import ContactBasic from './EContactBasic.astro';
|
4
|
+
import ContactBasicSourceCode from './EContactBasic.astro?raw';
|
5
|
+
---
|
6
|
+
|
7
|
+
<CodeContainer codes={[ContactBasicSourceCode]}>
|
8
|
+
<div id="tab-1">
|
9
|
+
<ContactBasic />
|
10
|
+
</div>
|
11
|
+
</CodeContainer>
|
12
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
import { CodeContainer } from '../index';
|
3
|
+
import ContactCompact from './EContactCompact.astro';
|
4
|
+
import ContactCompactSourceCode from './EContactCompact.astro?raw';
|
5
|
+
---
|
6
|
+
|
7
|
+
<CodeContainer codes={[ContactCompactSourceCode]}>
|
8
|
+
<div id="tab-1">
|
9
|
+
<ContactCompact />
|
10
|
+
</div>
|
11
|
+
</CodeContainer>
|
12
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
/**
|
3
|
+
* @component Contact.CustomStyle
|
4
|
+
*
|
5
|
+
* @description
|
6
|
+
* 展示如何使用class属性自定义Contact组件的样式。
|
7
|
+
*/
|
8
|
+
import '../style.ts';
|
9
|
+
import Contact from './Contact.astro';
|
10
|
+
---
|
11
|
+
|
12
|
+
<Contact
|
13
|
+
title="联系我们"
|
14
|
+
description="自定义样式的联系信息卡片"
|
15
|
+
email="contact@company.com"
|
16
|
+
phone="+1 (555) 123-4567"
|
17
|
+
address="123 Business St, City, State 12345"
|
18
|
+
github="https://github.com/company"
|
19
|
+
twitter="https://twitter.com/company"
|
20
|
+
class="cosy:bg-gradient-to-br cosy:from-blue-50 cosy:to-purple-50 cosy:border-2 cosy:border-blue-200 cosy:shadow-2xl"
|
21
|
+
/>
|
22
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
import { CodeContainer } from '../index';
|
3
|
+
import ContactCustomStyle from './EContactCustomStyle.astro';
|
4
|
+
import ContactCustomStyleSourceCode from './EContactCustomStyle.astro?raw';
|
5
|
+
---
|
6
|
+
|
7
|
+
<CodeContainer codes={[ContactCustomStyleSourceCode]}>
|
8
|
+
<div id="tab-1">
|
9
|
+
<ContactCustomStyle />
|
10
|
+
</div>
|
11
|
+
</CodeContainer>
|
12
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
/**
|
3
|
+
* @component Contact.Social
|
4
|
+
*
|
5
|
+
* @description
|
6
|
+
* 带社交媒体链接的Contact组件示例。
|
7
|
+
*/
|
8
|
+
import Contact from './Contact.astro';
|
9
|
+
---
|
10
|
+
|
11
|
+
<Contact
|
12
|
+
title="联系我们"
|
13
|
+
email="contact@company.com"
|
14
|
+
phone="+1 (555) 123-4567"
|
15
|
+
website="https://www.company.com"
|
16
|
+
github="https://github.com/company"
|
17
|
+
twitter="https://twitter.com/company"
|
18
|
+
facebook="https://facebook.com/company"
|
19
|
+
linkedin="https://linkedin.com/company/company"
|
20
|
+
/>
|
21
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
import { CodeContainer } from '../index';
|
3
|
+
import ContactSocial from './EContactSocial.astro';
|
4
|
+
import ContactSocialSourceCode from './EContactSocial.astro?raw';
|
5
|
+
---
|
6
|
+
|
7
|
+
<CodeContainer codes={[ContactSocialSourceCode]}>
|
8
|
+
<div id="tab-1">
|
9
|
+
<ContactSocial />
|
10
|
+
</div>
|
11
|
+
</CodeContainer>
|
12
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
/**
|
3
|
+
* @component Contact.WithTitle
|
4
|
+
*
|
5
|
+
* @description
|
6
|
+
* 带标题和描述的Contact组件示例。
|
7
|
+
*/
|
8
|
+
import Contact from './Contact.astro';
|
9
|
+
---
|
10
|
+
|
11
|
+
<Contact
|
12
|
+
title="联系我们"
|
13
|
+
description="欢迎随时与我们取得联系,我们将尽快回复您"
|
14
|
+
email="contact@company.com"
|
15
|
+
phone="+1 (555) 123-4567"
|
16
|
+
address="123 Business St, City, State 12345"
|
17
|
+
/>
|
18
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
import { CodeContainer } from '../index';
|
3
|
+
import ContactWithTitle from './EContactWithTitle.astro';
|
4
|
+
import ContactWithTitleSourceCode from './EContactWithTitle.astro?raw';
|
5
|
+
---
|
6
|
+
|
7
|
+
<CodeContainer codes={[ContactWithTitleSourceCode]}>
|
8
|
+
<div id="tab-1">
|
9
|
+
<ContactWithTitle />
|
10
|
+
</div>
|
11
|
+
</CodeContainer>
|
12
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import Contact from './Contact.astro';
|
2
|
+
|
3
|
+
// Container components
|
4
|
+
import ContactBasicContainer from './EContactBasicContainer.astro';
|
5
|
+
import ContactWithTitleContainer from './EContactWithTitleContainer.astro';
|
6
|
+
import ContactSocialContainer from './EContactSocialContainer.astro';
|
7
|
+
import ContactCompactContainer from './EContactCompactContainer.astro';
|
8
|
+
import ContactCustomStyleContainer from './EContactCustomStyleContainer.astro';
|
9
|
+
|
10
|
+
export { Contact };
|
11
|
+
|
12
|
+
export const ContactPackage = {
|
13
|
+
Contact,
|
14
|
+
ContactContainers: {
|
15
|
+
Basic: ContactBasicContainer,
|
16
|
+
WithTitle: ContactWithTitleContainer,
|
17
|
+
Social: ContactSocialContainer,
|
18
|
+
Compact: ContactCompactContainer,
|
19
|
+
CustomStyle: ContactCustomStyleContainer,
|
20
|
+
},
|
21
|
+
};
|