officialblock 1.0.6 → 1.0.8

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.
Files changed (73) hide show
  1. package/dist/index-Ch_ldWmA.js +1 -0
  2. package/dist/index-DXm2cqxo.mjs +485 -0
  3. package/dist/official-block.cjs.js +74 -74
  4. package/dist/official-block.es.js +13577 -10832
  5. package/dist/official-block.umd.js +78 -78
  6. package/dist/style.css +1 -1
  7. package/dist/swiper-JiLDDxAF.js +1 -0
  8. package/dist/swiper-acbnDJoL.mjs +2035 -0
  9. package/dist/utils-DD-vVZej.mjs +316 -0
  10. package/dist/utils-DOLLD0-F.js +1 -0
  11. package/package.json +2 -1
  12. package/src/components/ArticleList/article.vue +3 -3
  13. package/src/components/ArticleList/contact.vue +9 -9
  14. package/src/components/ArticleList/index.ts +1 -1
  15. package/src/components/ArticleList/index.vue +24 -82
  16. package/src/components/ArticleList/setting.vue +61 -71
  17. package/src/components/ArticleList/type.ts +12 -18
  18. package/src/components/BannerImage/index.ts +11 -0
  19. package/src/components/BannerImage/index.vue +153 -0
  20. package/src/components/BannerImage/setting.vue +55 -0
  21. package/src/components/BannerImage/type.ts +10 -0
  22. package/src/components/BannerPage/index.ts +11 -0
  23. package/src/components/BannerPage/index.vue +283 -0
  24. package/src/components/BannerPage/setting.vue +55 -0
  25. package/src/components/BannerPage/type.ts +10 -0
  26. package/src/components/BtnList/index.ts +11 -0
  27. package/src/components/BtnList/index.vue +588 -0
  28. package/src/components/BtnList/setting.vue +255 -0
  29. package/src/components/BtnList/type.ts +10 -0
  30. package/src/components/Button/index.vue +45 -33
  31. package/src/components/CustomSpace/index.ts +11 -0
  32. package/src/components/CustomSpace/index.vue +82 -0
  33. package/src/components/CustomSpace/setting.vue +89 -0
  34. package/src/components/CustomSpace/type.ts +10 -0
  35. package/src/components/GalleryList/index.ts +12 -0
  36. package/src/components/GalleryList/index.vue +311 -0
  37. package/src/components/GalleryList/setting.vue +268 -0
  38. package/src/components/GalleryList/type.ts +10 -0
  39. package/src/components/HeroSlide/index.ts +1 -1
  40. package/src/components/HeroSlide/index.vue +85 -133
  41. package/src/components/HeroSlide/setting.vue +435 -0
  42. package/src/components/HeroSlide/type.ts +5 -14
  43. package/src/components/LinkLIst/index.ts +11 -0
  44. package/src/components/LinkLIst/index.vue +317 -0
  45. package/src/components/LinkLIst/setting.vue +264 -0
  46. package/src/components/LinkLIst/type.ts +10 -0
  47. package/src/components/Media/index.vue +18 -18
  48. package/src/components/Operate/index.vue +17 -7
  49. package/src/components/Profile/index.vue +999 -0
  50. package/src/components/Profile/modal.vue +56 -0
  51. package/src/components/Profile/setting.vue +330 -0
  52. package/src/components/QuickLinks/index.vue +166 -0
  53. package/src/components/QuoteText/index.ts +11 -0
  54. package/src/components/QuoteText/index.vue +133 -0
  55. package/src/components/QuoteText/setting.vue +81 -0
  56. package/src/components/QuoteText/type.ts +10 -0
  57. package/src/components/ScrollKeyInfo/index.vue +0 -0
  58. package/src/components/Swiper/index.vue +538 -0
  59. package/src/components/index.ts +23 -5
  60. package/src/index.ts +56 -12
  61. package/src/main.ts +6 -3
  62. package/src/router/index.ts +6 -0
  63. package/src/style.css +17 -0
  64. package/src/styles/component-isolation.scss +256 -0
  65. package/src/styles/editor.scss +1 -1
  66. package/src/styles/layers.scss +256 -0
  67. package/src/styles/main.scss +21687 -0
  68. package/src/styles/mixins/style-isolation.scss +262 -0
  69. package/src/styles/smart-reset.scss +287 -0
  70. package/src/styles/test.scss +1 -1
  71. package/src/types/button.ts +10 -0
  72. package/src/views/StyleIsolationTest.vue +292 -0
  73. package/src/views/components/ArticleListDemo.vue +49 -10
@@ -0,0 +1,81 @@
1
+ <template>
2
+ <a-drawer :width="500" :visible="show" :footer="false" @cancel="handleCancel" unmountOnClose>
3
+ <template #title>
4
+ {{data.type}}组件编辑
5
+ </template>
6
+ <div class="setting-content">
7
+ <!-- 组件自身属性 -->
8
+ <div class="setting-header flex items-center">
9
+ <span class="header-title">组件宽度</span>
10
+ <a-select v-model="data.data.width" placeholder="请选择" allow-clear>
11
+ <a-option value="default">默认</a-option>
12
+ <a-option value="small">小</a-option>
13
+ <a-option value="medium">中</a-option>
14
+ <a-option value="large">大</a-option>
15
+ </a-select>
16
+ </div>
17
+ <div class="setting-header flex items-center">
18
+ <span class="header-title">组件背景</span>
19
+ <a-select v-model="data.data.bgColor" placeholder="请选择" allow-clear>
20
+ <a-option value="#ffffff">白色</a-option>
21
+ <a-option value="#F7F7FA">灰色</a-option>
22
+ </a-select>
23
+ </div>
24
+ <div class="setting-header flex items-center">
25
+ <span class="header-title">是否显示下划线</span>
26
+ <a-select v-model="data.data.hasLine" placeholder="请选择" allow-clear>
27
+ <a-option :value="true">是</a-option>
28
+ <a-option :value="false">否</a-option>
29
+ </a-select>
30
+ </div>
31
+
32
+ <p class="item-title">标题</p>
33
+ <RichTextEditor v-model="data.data.text"></RichTextEditor>
34
+
35
+ <p class="item-title">内容</p>
36
+ <RichTextEditor v-model="data.data.desc"></RichTextEditor>
37
+ </div>
38
+ </a-drawer>
39
+ </template>
40
+
41
+ <script lang="ts" setup>
42
+ import RichTextEditor from '@/components/RichTextEditor'
43
+
44
+ defineProps({
45
+ show: {
46
+ type: Boolean,
47
+ default: false
48
+ },
49
+
50
+ data: {
51
+ type: Object,
52
+ default: () => {}
53
+ }
54
+ })
55
+
56
+ const emit = defineEmits(['update:show']);
57
+
58
+ const handleCancel = () => {
59
+ emit('update:show', false);
60
+ }
61
+ </script>
62
+
63
+ <style lang="scss" scoped>
64
+ .setting-content {
65
+ .setting-header {
66
+ padding-bottom: 12px;
67
+
68
+ .header-title {
69
+ width: 120px;
70
+ padding-right: 12px;
71
+ text-align: right;
72
+ }
73
+ }
74
+
75
+ .item-title {
76
+ padding: 12px 0 8px 0;
77
+ font-size: 14px;
78
+ font-weight: 600;
79
+ }
80
+ }
81
+ </style>
@@ -0,0 +1,10 @@
1
+ export interface QuoteTextProps {
2
+ /** 双向绑定的值 */
3
+ modelValue: any
4
+ }
5
+
6
+ export interface QuoteTextEmits {
7
+ (e: 'update:modelValue', value: any): void
8
+ (e: 'handleDelete', value: string | number): void
9
+ (e: 'handleCopy', value: any): void
10
+ }
File without changes
@@ -0,0 +1,538 @@
1
+ <template>
2
+ <div class="swiper-container" ref="swiperContainer">
3
+ <div class="swiper-wrapper">
4
+ <div class="swiper-slide" v-for="(item, index) in data" :key="item.id">
5
+ <div class="swiper-slide__media">
6
+ <img
7
+ v-if="item.type === 'Image'"
8
+ class="swiper-slide__media-img"
9
+ :src="item.imgSrc"
10
+ :alt="item.alt"
11
+ />
12
+ <div class="video-player" v-else-if="item.type === 'Video'">
13
+ <video
14
+ :ref="(el) => setVideoRef(el, index)"
15
+ playsinline
16
+ :poster="item.imgSrc"
17
+ @ended="onVideoEnded"
18
+ >
19
+ <source :src="item.videoSrc" type="video/mp4" />
20
+ </video>
21
+ </div>
22
+ </div>
23
+
24
+ <a :href="item.link" target="_blank" class="swiper-slide__link"></a>
25
+ <div class="swiper-slide__body">
26
+ <div class="swiper-slide__body__title text-center">{{ item.title }}</div>
27
+ <template v-if="item.type === 'Video'">
28
+ <button type="button" class="swiper-slide__body__play" v-if="!isPlaying" @click.stop="playVideo"></button>
29
+ <button type="button" class="swiper-slide__body__link" @click.stop="handlePlayAll">观看完整视频</button>
30
+ </template>
31
+ </div>
32
+ </div>
33
+ </div>
34
+
35
+ <!-- 分页器 -->
36
+ <div class="swiper-pagination"></div>
37
+
38
+ <!-- 导航按钮 -->
39
+ <div class="swiper-button-next"></div>
40
+ <div class="swiper-button-prev"></div>
41
+ </div>
42
+
43
+ <a-modal v-model:visible="showVideo" :footer="false" width="1200px" @cancel="handleCancel">
44
+ <template #title>
45
+ 观看完整视频
46
+ </template>
47
+ <div class="video-box">
48
+ <video
49
+ ref="videoElement"
50
+ controls
51
+ >
52
+ <source :src="videoSrc" type="video/mp4" />
53
+ </video>
54
+ </div>
55
+ </a-modal>
56
+ </template>
57
+
58
+ <script lang="ts" setup>
59
+ import { ref, onMounted, onUnmounted, nextTick, watch } from 'vue'
60
+
61
+ interface SwiperItem {
62
+ id: string | number
63
+ type: 'Image' | 'Video'
64
+ imgSrc: string
65
+ alt?: string
66
+ videoSrc?: string
67
+ link?: string
68
+ title?: string
69
+ isExternal: boolean
70
+ }
71
+
72
+ const props = defineProps<{
73
+ data: SwiperItem[],
74
+ imageInterval?: number,
75
+ videoAutoNext?: boolean
76
+ }>()
77
+
78
+ // 响应式变量
79
+ const swiperContainer = ref<HTMLElement>()
80
+ let swiperInstance: any = null
81
+ let currentSlideIndex = 0
82
+
83
+ // 图片自动切换定时器
84
+ let imageTimer: number | null = null
85
+
86
+ // 动态导入 Swiper
87
+ let Swiper: any = null
88
+ let Navigation: any = null
89
+ let Pagination: any = null
90
+ let Autoplay: any = null
91
+
92
+ // 初始化 Swiper
93
+ const initSwiper = async () => {
94
+ try {
95
+ // 动态导入 Swiper 模块
96
+ const swiperModule = await import('swiper' as any)
97
+ const { Navigation: NavigationModule, Pagination: PaginationModule, Autoplay: AutoplayModule } = await import('swiper/modules' as any)
98
+
99
+ Swiper = swiperModule.Swiper
100
+ Navigation = NavigationModule
101
+ Pagination = PaginationModule
102
+ Autoplay = AutoplayModule
103
+
104
+ // 导入 Swiper 样式
105
+ await import('swiper/css' as any)
106
+ await import('swiper/css/navigation' as any)
107
+ await import('swiper/css/pagination' as any)
108
+
109
+ if (swiperContainer.value) {
110
+ swiperInstance = new Swiper(swiperContainer.value, {
111
+ modules: [Navigation, Pagination, Autoplay],
112
+ autoHeight: false, // 禁用自适应高度,使用固定高度
113
+ speed: 1000,
114
+ effect: 'fade',
115
+ fadeEffect: {
116
+ crossFade: true
117
+ },
118
+ navigation: {
119
+ nextEl: '.swiper-button-next',
120
+ prevEl: '.swiper-button-prev',
121
+ },
122
+ pagination: {
123
+ el: '.swiper-pagination',
124
+ clickable: true,
125
+ },
126
+ on: {
127
+ slideChange: (swiper: any) => {
128
+ currentSlideIndex = swiper.activeIndex
129
+ handleSlideChange(currentSlideIndex)
130
+ },
131
+ // 用户交互时重置定时器
132
+ touchStart: () => {
133
+ clearImageTimer()
134
+ },
135
+ touchEnd: () => {
136
+ // 延迟一点时间再启动定时器,避免立即触发
137
+ setTimeout(() => {
138
+ const currentItem = props.data[currentIndex.value]
139
+ if (currentItem && currentItem.type === 'Image') {
140
+ startImageTimer()
141
+ }
142
+ }, 100)
143
+ }
144
+ }
145
+ })
146
+ }
147
+ } catch (error) {
148
+ console.error('Failed to load Swiper:', error)
149
+ }
150
+ }
151
+
152
+ const currentIndex = ref<number>(0)
153
+
154
+ // 清除图片定时器
155
+ const clearImageTimer = () => {
156
+ if (imageTimer) {
157
+ clearTimeout(imageTimer)
158
+ imageTimer = null
159
+ }
160
+ }
161
+
162
+ // 启动图片自动切换定时器
163
+ const startImageTimer = () => {
164
+ clearImageTimer()
165
+ const currentItem = props.data[currentIndex.value]
166
+
167
+ // 只有当前是图片类型时才启动定时器
168
+ if (currentItem && currentItem.type === 'Image') {
169
+ const interval = props.imageInterval || 5000 // 默认5秒
170
+ imageTimer = setTimeout(() => {
171
+ if (swiperInstance) {
172
+ swiperInstance.slideNext()
173
+ }
174
+ }, interval)
175
+ }
176
+ }
177
+
178
+ // 处理幻灯片切换
179
+ const handleSlideChange = (index: number) => {
180
+ // 清除之前的定时器
181
+ clearImageTimer()
182
+ pauseVideo()
183
+ currentIndex.value = index
184
+
185
+ const currentItem = props.data[currentIndex.value]
186
+ if (currentItem.type === 'Video') {
187
+ playVideo()
188
+ } else if (currentItem.type === 'Image') {
189
+ // 启动图片自动切换定时器
190
+ startImageTimer()
191
+ }
192
+ }
193
+
194
+ // 视频播放完成
195
+ const onVideoEnded = () => {
196
+ isPlaying.value = false
197
+
198
+ // 如果启用了视频自动切换下一项
199
+ if (props.videoAutoNext !== false && swiperInstance) { // 默认为true,除非明确设置为false
200
+ setTimeout(() => {
201
+ swiperInstance.slideNext()
202
+ }, 200) // 延迟200ms后切换,给用户一点反应时间
203
+ }
204
+ }
205
+
206
+ // 保存所有 video 元素的 ref
207
+ const videoElements = ref<HTMLVideoElement[]>([])
208
+ // 设置 ref 到数组中
209
+ import type { ComponentPublicInstance } from 'vue'
210
+
211
+ const setVideoRef = (el: Element | ComponentPublicInstance | null, index: number) => {
212
+ // If el is a Vue component instance, get its $el property
213
+ const element = (el && '$el' in el) ? (el as ComponentPublicInstance).$el : el
214
+ if (element instanceof HTMLVideoElement) {
215
+ videoElements.value[index] = element
216
+ }
217
+ }
218
+
219
+ const isPlaying = ref<boolean>(false)
220
+ // 播放视频
221
+ const playVideo = () => {
222
+ if (videoElements.value[currentIndex.value]) {
223
+ videoElements.value[currentIndex.value].play()
224
+ isPlaying.value = true
225
+ // 播放视频时清除图片定时器
226
+ clearImageTimer()
227
+ }
228
+ }
229
+
230
+ // 暂停视频
231
+ const pauseVideo = () => {
232
+ if (videoElements.value[currentIndex.value]) {
233
+ videoElements.value[currentIndex.value].pause()
234
+ isPlaying.value = false
235
+ }
236
+ }
237
+
238
+ const showVideo = ref<boolean>(false)
239
+ const videoElement = ref<HTMLVideoElement>()
240
+ const videoSrc = ref<string>()
241
+ const handlePlayAll = () => {
242
+ pauseVideo()
243
+ videoSrc.value = props.data[currentIndex.value].videoSrc
244
+ nextTick(() => {
245
+ showVideo.value = true
246
+ videoElement.value?.play()
247
+ })
248
+ }
249
+
250
+ const handleCancel = () => {
251
+ videoElement.value?.pause()
252
+ showVideo.value = false
253
+ }
254
+
255
+ // 生命周期
256
+ onMounted(async () => {
257
+ await initSwiper()
258
+ handleSlideChange(0)
259
+ })
260
+
261
+ onUnmounted(() => {
262
+ // 清理定时器
263
+ clearImageTimer()
264
+
265
+ // 销毁 Swiper 实例
266
+ if (swiperInstance) {
267
+ swiperInstance.destroy(true, true)
268
+ }
269
+ })
270
+
271
+ defineExpose({
272
+ initSwiper
273
+ })
274
+ </script>
275
+
276
+ <style lang="scss" scoped>
277
+ // Swiper 容器样式
278
+ .swiper-container {
279
+ position: relative;
280
+ width: 100%;
281
+ height: auto;
282
+ }
283
+
284
+ .swiper-slide {
285
+ position: relative;
286
+ width: 100%;
287
+ aspect-ratio: 1 / 0.455; /* 宽高比为 1 : 0.455,即 height = width * 45.5% */
288
+ overflow: hidden; // 隐藏超出部分
289
+ }
290
+
291
+ @media (min-width: 768px) {
292
+ .swiper-slide {
293
+ min-height:400px; // 移动端固定高度
294
+ }
295
+ }
296
+
297
+ .swiper-slide__link {
298
+ position: absolute;
299
+ width: 100%;
300
+ height: 100%;
301
+ left: 0;
302
+ top: 0;
303
+ z-index: 2;
304
+ }
305
+
306
+ .swiper-slide__media {
307
+ position: absolute;
308
+ top: 0;
309
+ left: 0;
310
+ width: 100%;
311
+ height: 100%;
312
+ z-index: 1;
313
+ }
314
+
315
+ .swiper-slide__media img {
316
+ width: 100%;
317
+ height: 100%;
318
+ object-fit: cover; // 裁剪多余部分,保持宽高比
319
+ display: block;
320
+ }
321
+
322
+ .swiper-slide__media .video-player {
323
+ position: absolute;
324
+ top: 0;
325
+ left: 0;
326
+ width: 100%;
327
+ height: 100%;
328
+ }
329
+
330
+ .swiper-slide__media .video-player video {
331
+ position: absolute;
332
+ top: 0;
333
+ left: 0;
334
+ width: 100%;
335
+ height: 100%;
336
+ object-fit: cover; // 裁剪多余部分,保持宽高比
337
+ }
338
+
339
+ .swiper-slide__body {
340
+ position: absolute;
341
+ top: 0;
342
+ width: 100%;
343
+ height: 100%;
344
+ display: flex;
345
+ flex-direction: column;
346
+ align-items: center;
347
+ justify-content: flex-end;
348
+ z-index: 2;
349
+ pointer-events: none;
350
+ padding: 20px;
351
+ box-sizing: border-box;
352
+ }
353
+
354
+ .swiper-slide__body__title {
355
+ color: #fff;
356
+ margin-bottom: 8px;
357
+ font-size: 40px;
358
+ font-weight: 500;
359
+ line-height: 1.2;
360
+ letter-spacing: .02em;
361
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
362
+ }
363
+
364
+ @media (max-width: 1023.98px) {
365
+ .swiper-slide__body__title {
366
+ font-size: 32px;
367
+ font-weight: 500;
368
+ line-height: 1.2;
369
+ letter-spacing: .02em;
370
+ }
371
+ }
372
+
373
+ @media (max-width: 767.98px) {
374
+ .swiper-slide__body__title {
375
+ font-size: 24px;
376
+ line-height: 1.09;
377
+ }
378
+ }
379
+
380
+ .swiper-slide__body__link {
381
+ background: none;
382
+ border: none;
383
+ font-size: 16px;
384
+ font-weight: 500;
385
+ line-height: 1.5;
386
+ letter-spacing: .01em;
387
+ color: #fff;
388
+ text-decoration: none;
389
+ margin-bottom: 40px;
390
+ padding: 0 0 1px;
391
+ position: relative;
392
+ pointer-events: visible;
393
+ cursor: pointer;
394
+ }
395
+
396
+ @media (max-width: 1023.98px) {
397
+ .swiper-slide__body__link {
398
+ line-height: 1.25;
399
+ letter-spacing: .04em;
400
+ }
401
+ }
402
+
403
+ @media (max-width: 767.98px) {
404
+ .swiper-slide__body__link {
405
+ font-size: 14px;
406
+ line-height: 1.285;
407
+ letter-spacing: .02em;
408
+ margin-bottom: 30px;
409
+ }
410
+ }
411
+
412
+ .swiper-slide__body__link:after {
413
+ content: "";
414
+ width: 100%;
415
+ height: 1px;
416
+ background-color: #fff;
417
+ right: 0;
418
+ bottom: 0;
419
+ position: absolute;
420
+ }
421
+
422
+ .swiper-slide__body__link--hide {
423
+ opacity: 0;
424
+ pointer-events: none;
425
+ }
426
+
427
+ .swiper-slide__body__link:hover:after {
428
+ animation: link-animation .6s;
429
+ animation-fill-mode: both;
430
+ }
431
+
432
+ @keyframes link-animation {
433
+ 0% {
434
+ width: 100%;
435
+ right: 0;
436
+ left: auto;
437
+ }
438
+ 50% {
439
+ width: 0;
440
+ right: 0;
441
+ left: auto;
442
+ }
443
+ 50.1% {
444
+ left: 0;
445
+ right: auto;
446
+ }
447
+ to {
448
+ width: 100%;
449
+ left: 0;
450
+ right: auto;
451
+ }
452
+ }
453
+
454
+ .swiper-slide__body__play {
455
+ position: absolute;
456
+ border: none;
457
+ left: 50%;
458
+ top: 40%;
459
+ width: 52.5px;
460
+ height: 52.5px;
461
+ transform: translate(-50%, -50%);
462
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjEiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MSA2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBvcGFjaXR5PSIwLjciIGN4PSIzMC4yNDE3IiBjeT0iMzAiIHI9IjI2LjI1IiBmaWxsPSIjMDAxRTYwIi8+CjxwYXRoIGQ9Ik00My43NDE3IDI5LjEzNEM0NC40MDg0IDI5LjUxODkgNDQuNDA4NCAzMC40ODExIDQzLjc0MTcgMzAuODY2TDI0LjI0MTcgNDIuMTI0NEMyMy41NzUgNDIuNTA5MyAyMi43NDE3IDQyLjAyODEgMjIuNzQxNyA0MS4yNTgzTDIyLjc0MTcgMTguNzQxN0MyMi43NDE3IDE3Ljk3MTkgMjMuNTc1IDE3LjQ5MDcgMjQuMjQxNyAxNy44NzU2TDQzLjc0MTcgMjkuMTM0WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==);
463
+ background-position: 50%;
464
+ background-size: cover;
465
+ background-repeat: no-repeat;
466
+ background-color: transparent;
467
+ z-index: 3;
468
+ transition: opacity .3s ease-in-out;
469
+ pointer-events: visible;
470
+ cursor: pointer;
471
+ }
472
+
473
+ .swiper-slide__body__play--hide {
474
+ pointer-events: none;
475
+ opacity: 0;
476
+ }
477
+
478
+ // Swiper 导航按钮样式
479
+ .swiper-button-next,
480
+ .swiper-button-prev {
481
+ color: #fff;
482
+ background: rgba(0, 0, 0, 0.3);
483
+ border-radius: 50%;
484
+ width: 44px;
485
+ height: 44px;
486
+ margin-top: -22px;
487
+
488
+ &:after {
489
+ font-size: 18px;
490
+ }
491
+
492
+ &:hover {
493
+ background: rgba(0, 0, 0, 0.5);
494
+ }
495
+ }
496
+
497
+ // Swiper 分页器样式
498
+ .swiper-pagination {
499
+ bottom: 20px;
500
+
501
+ :deep(.swiper-pagination-bullet) {
502
+ background: rgba(255, 255, 255, 0.5);
503
+ opacity: 1;
504
+
505
+ &.swiper-pagination-bullet-active {
506
+ background: #fff;
507
+ }
508
+ }
509
+ }
510
+
511
+ // 响应式调整
512
+ @media (max-width: 767.98px) {
513
+ .swiper-button-next,
514
+ .swiper-button-prev {
515
+ width: 36px;
516
+ height: 36px;
517
+ margin-top: -18px;
518
+
519
+ &:after {
520
+ font-size: 14px;
521
+ }
522
+ }
523
+
524
+ .swiper-pagination {
525
+ bottom: 15px;
526
+ }
527
+ }
528
+
529
+ .video-box {
530
+ width: 1200px;
531
+ height: auto;
532
+
533
+ video {
534
+ width: 100%;
535
+ height: 100%;
536
+ }
537
+ }
538
+ </style>
@@ -1,14 +1,32 @@
1
1
  // 导出所有组件
2
2
  export { default as ArticleList } from './ArticleList/index.vue'
3
+ export { default as BannerPage } from './BannerPage/index.vue'
4
+ export { default as CustomSpace } from './CustomSpace/index.vue'
3
5
  export { default as HeroSlide } from './HeroSlide/index.vue'
4
- export { default as RichTextEditor } from './RichTextEditor'
5
- export { default as ThemePreview } from './ThemePreview'
6
+ export { default as BannerImage } from './BannerImage/index.vue'
7
+ export { default as BtnList } from './BtnList/index.vue'
8
+ export { default as GalleryList } from './GalleryList/index.vue'
9
+ export { default as LinkList } from './LinkLIst/index.vue'
10
+ export { default as QuoteText } from './QuoteText/index.vue'
6
11
 
7
12
  // 导出组件插件
8
13
  export { default as ArticleListPlugin } from './ArticleList/index'
14
+ export { default as BannerPagePlugin } from './BannerPage/index'
15
+ export { default as CustomSpacePlugin } from './CustomSpace/index'
9
16
  export { default as HeroSlidePlugin } from './HeroSlide/index'
17
+ export { default as BannerImagePlugin } from './BannerImage/index'
18
+ export { default as BtnListPlugin } from './BtnList/index'
19
+ export { default as GalleryListPlugin } from './GalleryList/index'
20
+ export { default as LinkListPlugin } from './LinkLIst/index'
21
+ export { default as QuoteTextPlugin } from './QuoteText/index'
10
22
 
11
23
  // 导出类型定义
12
- export type { ComponentProps, ComponentEmits, ComponentSlots } from './ArticleList/type'
13
- export type { HeroSlideProps, HeroSlideEmits, SlideItem } from './HeroSlide/type'
14
- export type { IDomEditor, IEditorConfig, IToolbarConfig } from './RichTextEditor'
24
+ export type { ArticleListProps, ArticleListEmits } from './ArticleList/type'
25
+ export type { BannerPageProps, BannerPageEmits } from './BannerPage/type'
26
+ export type { CustomSpaceProps, CustomSpaceEmits } from './CustomSpace/type'
27
+ export type { HeroSlideProps, HeroSlideEmits } from './HeroSlide/type'
28
+ export type { BannerImageProps, BannerImageEmits } from './BannerImage/type'
29
+ export type { BtnListProps, BtnListEmits } from './BtnList/type'
30
+ export type { GalleryListProps, GalleryListEmits } from './GalleryList/type'
31
+ export type { LinkListProps, LinkListEmits } from './LinkLIst/type'
32
+ export type { QuoteTextProps, QuoteTextEmits } from './QuoteText/type'