officialblock 1.0.8 → 1.0.9

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 (41) hide show
  1. package/dist/official-block.cjs.js +1 -1
  2. package/dist/official-block.es.js +43 -11
  3. package/dist/official-block.umd.js +1 -1
  4. package/dist/style.css +1 -1
  5. package/package.json +1 -1
  6. package/src/assets/icon-email.svg +3 -0
  7. package/src/components/ArticleList/setting.vue +316 -142
  8. package/src/components/BannerImageWithLink/index.ts +11 -0
  9. package/src/components/BannerImageWithLink/index.vue +323 -0
  10. package/src/components/BannerImageWithLink/setting.vue +344 -0
  11. package/src/components/BannerImageWithLink/type.ts +17 -0
  12. package/src/components/ContactUsList/index.ts +11 -0
  13. package/src/components/ContactUsList/index.vue +369 -0
  14. package/src/components/ContactUsList/setting.vue +497 -0
  15. package/src/components/ContactUsList/type.ts +17 -0
  16. package/src/components/CountDown/index.ts +11 -0
  17. package/src/components/CountDown/index.vue +315 -0
  18. package/src/components/CountDown/setting.vue +302 -0
  19. package/src/components/CountDown/type.ts +17 -0
  20. package/src/components/CustomIframe/index.ts +11 -0
  21. package/src/components/CustomIframe/index.vue +118 -0
  22. package/src/components/CustomIframe/setting.vue +323 -0
  23. package/src/components/CustomIframe/type.ts +17 -0
  24. package/src/components/Operate/index.vue +1 -2
  25. package/src/components/ScrollKeyInfo/index.ts +11 -0
  26. package/src/components/ScrollKeyInfo/index.vue +1345 -0
  27. package/src/components/ScrollKeyInfo/setting.vue +302 -0
  28. package/src/components/ScrollKeyInfo/type.ts +17 -0
  29. package/src/components/TabDefault/components/ComponentSelector/compsData.js +143 -0
  30. package/src/components/TabDefault/components/ComponentSelector/index.vue +188 -0
  31. package/src/components/TabDefault/components/PageContent.vue +207 -0
  32. package/src/components/TabDefault/index.vue +475 -0
  33. package/src/components/TabDefault/setting.vue +581 -0
  34. package/src/components/TabDefault/type.ts +17 -0
  35. package/src/components/TableTwo/index.ts +11 -0
  36. package/src/components/TableTwo/index.vue +232 -0
  37. package/src/components/TableTwo/setting.vue +558 -0
  38. package/src/components/TableTwo/type.ts +17 -0
  39. package/src/components/index.ts +17 -0
  40. package/src/styles/component-isolation.scss +2 -1
  41. package/src/views/components/ArticleListDemo.vue +50 -49
@@ -0,0 +1,11 @@
1
+ import type { App, Plugin } from 'vue'
2
+ import BannerImageWithLink from './index.vue'
3
+
4
+ export default {
5
+ install: (app: App) => {
6
+ app.component('BannerImageWithLink', BannerImageWithLink)
7
+ },
8
+ } satisfies Plugin
9
+
10
+ export { default as BannerImageWithLink } from './index.vue'
11
+ export type { BannerImageWithLinkProps, BannerImageWithLinkEmits } from './type'
@@ -0,0 +1,323 @@
1
+ <template>
2
+ <div
3
+ style="margin-top: 30px; margin-bottom: 30px; border: 2px solid red"
4
+ class="custom-iframe-container"
5
+ :style="{ backgroundColor: modelValue?.bgColor }"
6
+ @mouseenter="isHover = true"
7
+ @mouseleave="isHover = false"
8
+ >
9
+ <div class="banner-image-with-link">
10
+ <div class="banner-wrapper" :style="{ '--bg-image': backgroundImageUrl }">
11
+ <div class="banner-body">
12
+ <div class="banner-body__title">ding-title</div>
13
+ <div class="banner-body__link">
14
+ <div class="circle-link circle-link--light">
15
+ <a href="https://www.baidu.com" target="_blank"
16
+ ><!---->
17
+ <div>bing-placholder</div>
18
+ <span class="circle-link__icon circle-link__icon--light"></span
19
+ ></a>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ <Operate
26
+ v-if="!modelValue?.readOnly"
27
+ v-model:show="isHover"
28
+ @handle-edit="showSetting = true"
29
+ @handle-delete="handleDelete"
30
+ @handle-copy="handleCopy"
31
+ ></Operate>
32
+ <!-- </a-row> -->
33
+ </div>
34
+
35
+ <Setting v-model:show="showSetting" :data="modelValue"></Setting>
36
+ </template>
37
+
38
+ <script lang="ts" setup>
39
+ import { computed, nextTick, ref } from "vue";
40
+ import { randomString } from "@/utils/common";
41
+ import Setting from "./setting.vue";
42
+ import Operate from "@/components/Operate/index.vue";
43
+
44
+ // 定义组件名称
45
+ defineOptions({
46
+ name: "CountDown",
47
+ });
48
+
49
+ const props = defineProps({
50
+ modelValue: {
51
+ type: Object,
52
+ default: () => {},
53
+ },
54
+
55
+ // 是否预览
56
+ isPreview: {
57
+ type: Boolean,
58
+ default: false,
59
+ },
60
+ });
61
+ console.log("!!!!", props.modelValue);
62
+ const emit = defineEmits(["update:modelValue", "handleDelete", "handleCopy"]);
63
+
64
+ const isHover = ref<boolean>(false);
65
+ const showSetting = ref<boolean>(false);
66
+
67
+ const handleDelete = () => {
68
+ emit("handleDelete", props.modelValue.id);
69
+ };
70
+
71
+ const handleCopy = () => {
72
+ emit("handleCopy", props.modelValue);
73
+ };
74
+
75
+ const handleInit = () => {
76
+ if (props.modelValue && props.modelValue.data) return; // 有数据不用初始化
77
+ const data = {
78
+ id: props.modelValue?.id || randomString(),
79
+ type: "BannerImageWithLink",
80
+ readOnly: props.modelValue?.readOnly || false,
81
+ title: "bing-bannerImgLink",
82
+ image:
83
+ "https://osswebsite-test.cedim.cn/media-library/ywies-tx/pdf/TX%20Brochure%20Cover_optim_origin.png",
84
+ text: "哈哈哈",
85
+ linkType: "External Link",
86
+ link: "https://www.baidu.com",
87
+ };
88
+ emit("update:modelValue", data);
89
+ console.log("props.modelValue111111111", props.modelValue);
90
+ };
91
+
92
+ handleInit();
93
+ const backgroundImageUrl = computed(() => {
94
+ let url = props.modelValue?.image ? `url(${props.modelValue.image})` : "none";
95
+ return url;
96
+ });
97
+ </script>
98
+
99
+ <style scoped lang="scss">
100
+ .custom-iframe-container {
101
+ position: relative;
102
+ }
103
+ .banner-image-with-link {
104
+ position: relative;
105
+ }
106
+
107
+ .banner-image-with-link .banner-wrapper {
108
+ position: relative;
109
+ height: 0;
110
+ padding-bottom: 45.833%;
111
+ background-position: 50%;
112
+ background-size: cover;
113
+ background-repeat: no-repeat;
114
+ background-image: linear-gradient(
115
+ 180deg,
116
+ transparent 22.84%,
117
+ rgba(0, 0, 0, 0.6)
118
+ ),
119
+ var(--bg-image);
120
+ }
121
+
122
+ @media (max-width: 767.98px) {
123
+ .banner-image-with-link .banner-wrapper {
124
+ padding-bottom: 0;
125
+ height: 448px;
126
+ }
127
+ }
128
+
129
+ .banner-image-with-link .banner-body {
130
+ position: absolute;
131
+ left: 0;
132
+ top: 0;
133
+ width: 100%;
134
+ height: 100%;
135
+ display: flex;
136
+ justify-content: flex-end;
137
+ flex-direction: column;
138
+ align-items: center;
139
+ padding-bottom: clamp(55px, (100vw - 320px)/44.301 + 55px, 76.67px);
140
+ }
141
+
142
+ .banner-image-with-link .banner-body__title {
143
+ font-size: 42px;
144
+ line-height: 1.43;
145
+ letter-spacing: 0.015em;
146
+ font-weight: 700;
147
+ color: #fff;
148
+ }
149
+
150
+ @media (max-width: 1023.98px) {
151
+ .banner-image-with-link .banner-body__title {
152
+ font-size: 36px;
153
+ }
154
+ }
155
+
156
+ @media (max-width: 575.98px) {
157
+ .banner-image-with-link .banner-body__title {
158
+ font-size: 40px;
159
+ font-weight: 500;
160
+ line-height: 1.2;
161
+ letter-spacing: 0.02em;
162
+ }
163
+ }
164
+
165
+ @media (max-width: 575.98px) and (max-width: 1023.98px) {
166
+ .banner-image-with-link .banner-body__title {
167
+ font-size: 32px;
168
+ font-weight: 500;
169
+ line-height: 1.2;
170
+ letter-spacing: 0.02em;
171
+ }
172
+ }
173
+
174
+ @media (max-width: 575.98px) and (max-width: 767.98px) {
175
+ .banner-image-with-link .banner-body__title {
176
+ font-size: 24px;
177
+ line-height: 1.09;
178
+ }
179
+ }
180
+
181
+ .banner-image-with-link .banner-body__link {
182
+ margin-top: 7px;
183
+ }
184
+
185
+ @media (max-width: 575.98px) {
186
+ .banner-image-with-link .banner-body__link {
187
+ margin-top: 18px;
188
+ }
189
+ }
190
+ .circle-link {
191
+ display: flex;
192
+ --link-color: var(--link-blue-color);
193
+ }
194
+
195
+ .circle-link--light {
196
+ --link-color: var(--link-light-color);
197
+ }
198
+
199
+ .circle-link a,
200
+ .circle-link button {
201
+ font-size: 14px;
202
+ font-weight: 500;
203
+ line-height: 1.285;
204
+ letter-spacing: 0.04em;
205
+ border: none;
206
+ background: none;
207
+ color: var(--link-color);
208
+ text-decoration: none;
209
+ display: flex;
210
+ align-items: center;
211
+ padding: 0;
212
+ }
213
+
214
+ @media (max-width: 1023.98px) {
215
+ .circle-link a,
216
+ .circle-link button {
217
+ line-height: 1.428;
218
+ }
219
+ }
220
+
221
+ @media (max-width: 767.98px) {
222
+ .circle-link a,
223
+ .circle-link button {
224
+ line-height: 1.285;
225
+ }
226
+ }
227
+
228
+ .circle-link a:hover .circle-link__icon:before,
229
+ .circle-link button:hover .circle-link__icon:before {
230
+ transform: translate(-50%, -50%);
231
+ }
232
+
233
+ .circle-link a:hover .circle-link__icon:after,
234
+ .circle-link button:hover .circle-link__icon:after {
235
+ transform: translate(150%, -50%);
236
+ }
237
+
238
+ .circle-link a:active .circle-link__icon:before,
239
+ .circle-link button:active .circle-link__icon:before {
240
+ transform: translate(-260%, -50%);
241
+ }
242
+
243
+ .circle-link a:active .circle-link__icon:after,
244
+ .circle-link button:active .circle-link__icon:after {
245
+ transform: translate(-50%, -50%);
246
+ }
247
+
248
+ .circle-link__icon {
249
+ width: 18px;
250
+ height: 18px;
251
+ border-radius: 50%;
252
+ overflow: hidden;
253
+ background-color: var(--link-color);
254
+ position: relative;
255
+ margin-left: 7px;
256
+ flex-shrink: 0;
257
+ }
258
+
259
+ @media (max-width: 767.98px) {
260
+ .circle-link__icon {
261
+ width: 12px;
262
+ height: 12px;
263
+ margin-left: 4px;
264
+ }
265
+ }
266
+
267
+ .circle-link__icon:after,
268
+ .circle-link__icon:before {
269
+ content: "";
270
+ width: 6px;
271
+ height: 9px;
272
+ position: absolute;
273
+ top: 50%;
274
+ left: 55%;
275
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNiIgaGVpZ2h0PSI5IiB2aWV3Qm94PSIwIDAgNiA5IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMC4yMzUxOTYgNy42MjA3OUwzLjM2MDE4IDQuNDk1OEwwLjIzNTE5NiAxLjM3MDgyQzAuMTYwNjMgMS4yOTYyNSAwLjEwMTQ4MSAxLjIwNzczIDAuMDYxMTI1OSAxLjExMDMxQzAuMDIwNzcxIDEuMDEyODggMS41NzEzN2UtMDkgMC45MDg0NiAwIDAuODAzMDA4Qy0xLjU3MTM2ZS0wOSAwLjY5NzU1NSAwLjAyMDc3MSAwLjU5MzEzNSAwLjA2MTEyNTkgMC40OTU3MUMwLjEwMTQ4MSAwLjM5ODI4NSAwLjE2MDYzIDAuMzA5NzYyIDAuMjM1MTk2IDAuMjM1MTk1QzAuMzA5NzYyIDAuMTYwNjI5IDAuMzk4Mjg1IDAuMTAxNDggMC40OTU3MSAwLjA2MTEyNTFDMC41OTMxMzYgMC4wMjA3NzAyIDAuNjk3NTU2IC0xLjU3MTM3ZS0wOSAwLjgwMzAwOCAwQzAuOTA4NDYxIDEuNTcxMzdlLTA5IDEuMDEyODggMC4wMjA3NzAyIDEuMTEwMzEgMC4wNjExMjUxQzEuMjA3NzMgMC4xMDE0OCAxLjI5NjI1IDAuMTYwNjI5IDEuMzcwODIgMC4yMzUxOTVMNS4wNjc2NCAzLjkzMjAyQzUuMzgxNzUgNC4yNDYxMyA1LjM4MTc1IDQuNzUzNTMgNS4wNjc2NCA1LjA2NzY0TDEuMzcwODIgOC43NjQ0NkMxLjI5NjMxIDguODM5MTMgMS4yMDc4IDguODk4MzYgMS4xMTAzNyA4LjkzODc4QzEuMDEyOTQgOC45NzkyIDAuOTA4NDkxIDkgMC44MDMwMDggOUMwLjY5NzUyNSA5IDAuNTkzMDc4IDguOTc5MiAwLjQ5NTY0NSA4LjkzODc4QzAuMzk4MjEyIDguODk4MzYgMC4zMDk3MDcgOC44MzkxMyAwLjIzNTE5NiA4Ljc2NDQ2Qy0wLjA3MDg1OTEgOC40NTAzNSAtMC4wNzg5MTMyIDcuOTM0ODkgMC4yMzUxOTYgNy42MjA3OVoiIGZpbGw9IiMwMDFFNjAiLz4KPC9zdmc+Cgo=);
276
+ background-position: 50%;
277
+ background-size: cover;
278
+ background-repeat: no-repeat;
279
+ background-color: hsla(0, 0%, 100%, 0);
280
+ transition: transform 0.3s ease-in-out;
281
+ }
282
+
283
+ @media (max-width: 767.98px) {
284
+ .circle-link__icon:after,
285
+ .circle-link__icon:before {
286
+ width: 4.7px;
287
+ height: 6px;
288
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNiIgaGVpZ2h0PSI5IiB2aWV3Qm94PSIwIDAgNiA5IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMC4yMzUxOTYgNy42MjA3OUwzLjM2MDE4IDQuNDk1OEwwLjIzNTE5NiAxLjM3MDgyQzAuMTYwNjMgMS4yOTYyNSAwLjEwMTQ4MSAxLjIwNzczIDAuMDYxMTI1OSAxLjExMDMxQzAuMDIwNzcxIDEuMDEyODggMS41NzEzN2UtMDkgMC45MDg0NiAwIDAuODAzMDA4Qy0xLjU3MTM2ZS0wOSAwLjY5NzU1NSAwLjAyMDc3MSAwLjU5MzEzNSAwLjA2MTEyNTkgMC40OTU3MUMwLjEwMTQ4MSAwLjM5ODI4NSAwLjE2MDYzIDAuMzA5NzYyIDAuMjM1MTk2IDAuMjM1MTk1QzAuMzA5NzYyIDAuMTYwNjI5IDAuMzk4Mjg1IDAuMTAxNDggMC40OTU3MSAwLjA2MTEyNTFDMC41OTMxMzYgMC4wMjA3NzAyIDAuNjk3NTU2IC0xLjU3MTM3ZS0wOSAwLjgwMzAwOCAwQzAuOTA4NDYxIDEuNTcxMzdlLTA5IDEuMDEyODggMC4wMjA3NzAyIDEuMTEwMzEgMC4wNjExMjUxQzEuMjA3NzMgMC4xMDE0OCAxLjI5NjI1IDAuMTYwNjI5IDEuMzcwODIgMC4yMzUxOTVMNS4wNjc2NCAzLjkzMjAyQzUuMzgxNzUgNC4yNDYxMyA1LjM4MTc1IDQuNzUzNTMgNS4wNjc2NCA1LjA2NzY0TDEuMzcwODIgOC43NjQ0NkMxLjI5NjMxIDguODM5MTMgMS4yMDc4IDguODk4MzYgMS4xMTAzNyA4LjkzODc4QzEuMDEyOTQgOC45NzkyIDAuOTA4NDkxIDkgMC44MDMwMDggOUMwLjY5NzUyNSA5IDAuNTkzMDc4IDguOTc5MiAwLjQ5NTY0NSA4LjkzODc4QzAuMzk4MjEyIDguODk4MzYgMC4zMDk3MDcgOC44MzkxMyAwLjIzNTE5NiA4Ljc2NDQ2Qy0wLjA3MDg1OTEgOC40NTAzNSAtMC4wNzg5MTMyIDcuOTM0ODkgMC4yMzUxOTYgNy42MjA3OVoiIGZpbGw9IiMwMDFFNjAiLz4KPC9zdmc+Cgo=);
289
+ background-position: 50%;
290
+ background-size: cover;
291
+ background-repeat: no-repeat;
292
+ background-color: hsla(0, 0%, 100%, 0);
293
+ }
294
+ }
295
+
296
+ .circle-link__icon:before {
297
+ transform: translate(-260%, -50%);
298
+ }
299
+
300
+ .circle-link__icon:after {
301
+ transform: translate(-50%, -50%);
302
+ }
303
+
304
+ .circle-link__icon--light:after,
305
+ .circle-link__icon--light:before {
306
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNiIgaGVpZ2h0PSI5IiB2aWV3Qm94PSIwIDAgNiA5IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMC4yMzUxOTYgNy42MjA3OUwzLjM2MDE4IDQuNDk1OEwwLjIzNTE5NiAxLjM3MDgyQzAuMTYwNjMgMS4yOTYyNSAwLjEwMTQ4MSAxLjIwNzczIDAuMDYxMTI1OSAxLjExMDMxQzAuMDIwNzcxIDEuMDEyODggMS41NzEzN2UtMDkgMC45MDg0NiAwIDAuODAzMDA4Qy0xLjU3MTM2ZS0wOSAwLjY5NzU1NSAwLjAyMDc3MSAwLjU5MzEzNSAwLjA2MTEyNTkgMC40OTU3MUMwLjEwMTQ4MSAwLjM5ODI4NSAwLjE2MDYzIDAuMzA5NzYyIDAuMjM1MTk2IDAuMjM1MTk1QzAuMzA5NzYyIDAuMTYwNjI5IDAuMzk4Mjg1IDAuMTAxNDggMC40OTU3MSAwLjA2MTEyNTFDMC41OTMxMzYgMC4wMjA3NzAyIDAuNjk3NTU2IC0xLjU3MTM3ZS0wOSAwLjgwMzAwOCAwQzAuOTA4NDYxIDEuNTcxMzdlLTA5IDEuMDEyODggMC4wMjA3NzAyIDEuMTEwMzEgMC4wNjExMjUxQzEuMjA3NzMgMC4xMDE0OCAxLjI5NjI1IDAuMTYwNjI5IDEuMzcwODIgMC4yMzUxOTVMNS4wNjc2NCAzLjkzMjAyQzUuMzgxNzUgNC4yNDYxMyA1LjM4MTc1IDQuNzUzNTMgNS4wNjc2NCA1LjA2NzY0TDEuMzcwODIgOC43NjQ0NkMxLjI5NjMxIDguODM5MTMgMS4yMDc4IDguODk4MzYgMS4xMTAzNyA4LjkzODc4QzEuMDEyOTQgOC45NzkyIDAuOTA4NDkxIDkgMC44MDMwMDggOUMwLjY5NzUyNSA5IDAuNTkzMDc4IDguOTc5MiAwLjQ5NTY0NSA4LjkzODc4QzAuMzk4MjEyIDguODk4MzYgMC4zMDk3MDcgOC44MzkxMyAwLjIzNTE5NiA4Ljc2NDQ2Qy0wLjA3MDg1OTEgOC40NTAzNSAtMC4wNzg5MTMyIDcuOTM0ODkgMC4yMzUxOTYgNy42MjA3OVoiIGZpbGw9IiMwMDFFNjAiLz4KPC9zdmc+Cgo=);
307
+ background-position: 50%;
308
+ background-size: cover;
309
+ background-repeat: no-repeat;
310
+ background-color: hsla(0, 0%, 100%, 0);
311
+ }
312
+
313
+ @media (max-width: 767.98px) {
314
+ .circle-link__icon--light:after,
315
+ .circle-link__icon--light:before {
316
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNiIgaGVpZ2h0PSI5IiB2aWV3Qm94PSIwIDAgNiA5IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMC4yMzUxOTYgNy42MjA3OUwzLjM2MDE4IDQuNDk1OEwwLjIzNTE5NiAxLjM3MDgyQzAuMTYwNjMgMS4yOTYyNSAwLjEwMTQ4MSAxLjIwNzczIDAuMDYxMTI1OSAxLjExMDMxQzAuMDIwNzcxIDEuMDEyODggMS41NzEzN2UtMDkgMC45MDg0NiAwIDAuODAzMDA4Qy0xLjU3MTM2ZS0wOSAwLjY5NzU1NSAwLjAyMDc3MSAwLjU5MzEzNSAwLjA2MTEyNTkgMC40OTU3MUMwLjEwMTQ4MSAwLjM5ODI4NSAwLjE2MDYzIDAuMzA5NzYyIDAuMjM1MTk2IDAuMjM1MTk1QzAuMzA5NzYyIDAuMTYwNjI5IDAuMzk4Mjg1IDAuMTAxNDggMC40OTU3MSAwLjA2MTEyNTFDMC41OTMxMzYgMC4wMjA3NzAyIDAuNjk3NTU2IC0xLjU3MTM3ZS0wOSAwLjgwMzAwOCAwQzAuOTA4NDYxIDEuNTcxMzdlLTA5IDEuMDEyODggMC4wMjA3NzAyIDEuMTEwMzEgMC4wNjExMjUxQzEuMjA3NzMgMC4xMDE0OCAxLjI5NjI1IDAuMTYwNjI5IDEuMzcwODIgMC4yMzUxOTVMNS4wNjc2NCAzLjkzMjAyQzUuMzgxNzUgNC4yNDYxMyA1LjM4MTc1IDQuNzUzNTMgNS4wNjc2NCA1LjA2NzY0TDEuMzcwODIgOC43NjQ0NkMxLjI5NjMxIDguODM5MTMgMS4yMDc4IDguODk4MzYgMS4xMTAzNyA4LjkzODc4QzEuMDEyOTQgOC45NzkyIDAuOTA4NDkxIDkgMC44MDMwMDggOUMwLjY5NzUyNSA5IDAuNTkzMDc4IDguOTc5MiAwLjQ5NTY0NSA4LjkzODc4QzAuMzk4MjEyIDguODk4MzYgMC4zMDk3MDcgOC44MzkxMyAwLjIzNTE5NiA4Ljc2NDQ2Qy0wLjA3MDg1OTEgOC40NTAzNSAtMC4wNzg5MTMyIDcuOTM0ODkgMC4yMzUxOTYgNy42MjA3OVoiIGZpbGw9IiMwMDFFNjAiLz4KPC9zdmc+Cgo=);
317
+ background-position: 50%;
318
+ background-size: cover;
319
+ background-repeat: no-repeat;
320
+ background-color: hsla(0, 0%, 100%, 0);
321
+ }
322
+ }
323
+ </style>
@@ -0,0 +1,344 @@
1
+ <template>
2
+ <a-drawer
3
+ :width="500"
4
+ :visible="show"
5
+ :footer="false"
6
+ @cancel="handleCancel"
7
+ unmountOnClose
8
+ >
9
+ <template #title> {{ data?.type }}组件编辑 </template>
10
+ <div class="seting-box">
11
+ <p class="item-title">标题</p>
12
+ <a-input v-model="data.title" placeholder="请输入标题" allow-clear />
13
+ <p class="item-title">图片</p>
14
+ <img v-if="data?.image" class="item-img" :src="data?.image" />
15
+ <div class="item-uplaod flex items-center">
16
+ <a-input
17
+ v-model="data.image"
18
+ placeholder="请输入图片链接"
19
+ allow-clear
20
+ />
21
+ <a-upload class="fit-content" :show-file-list="false" action="/" />
22
+ </div>
23
+ <a-divider class="divider_box" type="dashed" :size="1" />
24
+ <a-button type="outline" @click="handlerLink" v-if="!showLink"
25
+ >添加链接</a-button
26
+ >
27
+ <div class="link-title-box" v-if="showLink">
28
+ <h4>链接</h4>
29
+ <a-button type="text" @click="removeLink">移除</a-button>
30
+ </div>
31
+ <div v-if="showLink">
32
+ <p class="item-title">文本</p>
33
+ <a-input v-model="data.text" placeholder="请输入文本" allow-clear />
34
+ <p class="item-title">链接类型</p>
35
+ <a-select v-model="data.linkType" placeholder="请选择" allow-clear>
36
+ <a-option value="External Link">外部链接</a-option>
37
+ <a-option value="Internal Link">内容链接</a-option>
38
+ </a-select>
39
+ <p class="item-title">链接</p>
40
+ <a-input v-model="data.link" placeholder="请输入链接" allow-clear />
41
+ </div>
42
+ </div>
43
+ </a-drawer>
44
+ </template>
45
+
46
+ <script lang="ts" setup>
47
+ import { ref, computed } from "vue";
48
+
49
+ const props = defineProps({
50
+ show: {
51
+ type: Boolean,
52
+ default: false,
53
+ },
54
+
55
+ data: {
56
+ type: Object,
57
+ default: () => {},
58
+ },
59
+ });
60
+
61
+ const emit = defineEmits(["update:show"]);
62
+ const showLink = ref(false);
63
+
64
+ const handleCancel = () => {
65
+ emit("update:show", false);
66
+ };
67
+ const removeLink = () => {
68
+ showLink.value = false;
69
+ };
70
+ const handlerLink = () => {
71
+ showLink.value = !showLink.value;
72
+ };
73
+ </script>
74
+
75
+ <style lang="scss" scoped>
76
+ .link-title-box {
77
+ display: flex;
78
+ align-items: flex-end;
79
+ margin-top: 30px;
80
+ margin-bottom: -15px;
81
+ }
82
+ :deep(.arco-select-view-single) {
83
+ background: #ffffff;
84
+ }
85
+ .divider_box {
86
+ margin-top: 30px;
87
+ margin-bottom: 20px;
88
+ }
89
+ .item-title {
90
+ padding: 12px 0 8px 0;
91
+ font-size: 14px;
92
+ font-weight: 600;
93
+ margin-top: 10px;
94
+ }
95
+ .setting-header {
96
+ padding-bottom: 12px;
97
+
98
+ .header-title {
99
+ width: 120px;
100
+ padding-right: 12px;
101
+ text-align: right;
102
+ }
103
+ }
104
+ .setting-header :deep(.arco-select-view-single) {
105
+ background-color: #fff !important;
106
+ }
107
+ .setting-header :deep(.arco-input-wrapper) {
108
+ background-color: #fff !important;
109
+ }
110
+ .item-img {
111
+ height: 100px;
112
+ }
113
+ .seting-box {
114
+ padding: 20px;
115
+ background: #f0f2f5;
116
+ border-radius: 3px;
117
+ .arco-input-wrapper {
118
+ background: #ffffff;
119
+ }
120
+ }
121
+ .setting-content {
122
+ .setting-header {
123
+ padding-bottom: 12px;
124
+
125
+ .header-title {
126
+ width: 120px;
127
+ padding-right: 12px;
128
+ text-align: right;
129
+ }
130
+ }
131
+
132
+ .setting-body {
133
+ margin-top: 12px;
134
+
135
+ .setting-item {
136
+ position: relative;
137
+ padding: 16px 12px;
138
+ background: #f0f2f5;
139
+ border-radius: 8px;
140
+ margin-bottom: 20px;
141
+
142
+ .btn-group {
143
+ position: absolute;
144
+ right: 0;
145
+ top: 0;
146
+ display: flex;
147
+ align-items: center;
148
+ padding: 4px;
149
+
150
+ .btn-delete {
151
+ padding: 4px;
152
+ font-size: 24px;
153
+ cursor: pointer;
154
+ }
155
+ }
156
+
157
+ .item-name {
158
+ font-size: 16px;
159
+ font-weight: 600;
160
+ padding-bottom: 10px;
161
+ border-bottom: 1px solid #fff;
162
+ }
163
+
164
+ .arco-input-wrapper {
165
+ background: #fff;
166
+ }
167
+
168
+ .item-button {
169
+ position: relative;
170
+ padding: 12px 8px 4px;
171
+ background: #fff;
172
+ border-radius: 4px;
173
+ margin: 4px 0;
174
+ transition: all 0.3s ease;
175
+
176
+ &.draggable-item {
177
+ cursor: move;
178
+
179
+ &:hover {
180
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
181
+ transform: translateY(-1px);
182
+ }
183
+
184
+ // 当禁用拖拽时,不显示拖拽效果
185
+ &.sortable-disabled {
186
+ cursor: default;
187
+
188
+ &:hover {
189
+ box-shadow: none;
190
+ transform: none;
191
+ }
192
+ }
193
+ }
194
+
195
+ .arco-input-wrapper {
196
+ background: #f2f3f5;
197
+ }
198
+ }
199
+
200
+ // 拖拽相关样式
201
+ .flip-list-move {
202
+ transition: transform 0.5s;
203
+ }
204
+
205
+ .no-move {
206
+ transition: transform 0s;
207
+ }
208
+
209
+ .ghost {
210
+ opacity: 0.5;
211
+ background: #c8ebfb;
212
+ }
213
+
214
+ .list-group {
215
+ min-height: 20px;
216
+ }
217
+
218
+ .list-group-item {
219
+ cursor: move;
220
+ }
221
+
222
+ .list-group-item i {
223
+ cursor: pointer;
224
+ }
225
+
226
+ .item-action {
227
+ padding: 10px 0;
228
+
229
+ .action-text {
230
+ width: 150px;
231
+ margin-right: 8px;
232
+ }
233
+ }
234
+
235
+ .item-add-btn {
236
+ display: inline-block;
237
+ padding: 2px 8px;
238
+ margin-top: 5px;
239
+ font-size: 11px;
240
+ color: #165dff;
241
+ border-radius: 4px;
242
+ font-weight: 600;
243
+ border: 1px solid #165dff;
244
+ cursor: pointer;
245
+ }
246
+
247
+ .item-img {
248
+ margin-top: 12px;
249
+ height: 160px;
250
+ }
251
+
252
+ .fit-content {
253
+ width: fit-content;
254
+ }
255
+
256
+ .item-img-list {
257
+ .img-list-item {
258
+ margin: 4px 0;
259
+ position: relative;
260
+ padding: 8px;
261
+ border-radius: 4px;
262
+ transition: all 0.3s ease;
263
+ background: #fff;
264
+ border-radius: 4px;
265
+
266
+ &.draggable-item {
267
+ cursor: move;
268
+
269
+ &:hover {
270
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
271
+ transform: translateY(-1px);
272
+ }
273
+
274
+ // 当禁用拖拽时,不显示拖拽效果
275
+ &.sortable-disabled {
276
+ cursor: default;
277
+
278
+ &:hover {
279
+ box-shadow: none;
280
+ transform: none;
281
+ }
282
+ }
283
+ }
284
+
285
+ .arco-input-wrapper {
286
+ background: #f2f3f5;
287
+ }
288
+
289
+ .img-drag-handle {
290
+ top: 0 !important;
291
+ }
292
+ }
293
+
294
+ .item-img-box {
295
+ margin-right: 12px;
296
+ position: relative;
297
+ width: 133px;
298
+ height: 100px;
299
+
300
+ .item-img-dlete {
301
+ position: absolute;
302
+ padding: 8px;
303
+ font-size: 32px;
304
+ top: -16px;
305
+ right: -16px;
306
+ color: red;
307
+ cursor: pointer;
308
+ }
309
+ }
310
+
311
+ .small-img {
312
+ margin: 0;
313
+ height: 100px;
314
+ object-fit: cover;
315
+ }
316
+
317
+ .item-right {
318
+ padding-top: 24px;
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ .drag-handle {
325
+ padding: 4px;
326
+ cursor: grab;
327
+ padding: 4px;
328
+ border-radius: 4px;
329
+
330
+ &:hover {
331
+ background-color: #f0f2f5;
332
+ }
333
+
334
+ &:active {
335
+ cursor: grabbing;
336
+ }
337
+
338
+ .drag-icon {
339
+ font-size: 16px;
340
+ color: #86909c;
341
+ }
342
+ }
343
+ }
344
+ </style>
@@ -0,0 +1,17 @@
1
+ export interface BannerImageWithLinkProps {
2
+ /** 双向绑定的值 */
3
+ modelValue: any
4
+ }
5
+
6
+ export interface BannerImageWithLinkEmits {
7
+ (e: 'update:modelValue', value: any): void
8
+ (e: 'handleDelete', value: string | number): void
9
+ (e: 'handleCopy', value: any): void
10
+ }
11
+
12
+ // export type ComponentSlots = {
13
+ // /** 默认插槽内容 */
14
+ // default?: (props: { value: string | number }) => VNode[]
15
+ // /** 头部内容 */
16
+ // header?: (props: { title: string }) => VNode[]
17
+ // }
@@ -0,0 +1,11 @@
1
+ import type { App, Plugin } from 'vue'
2
+ import ContactUsList from './index.vue'
3
+
4
+ export default {
5
+ install: (app: App) => {
6
+ app.component('ContactUsList', ContactUsList)
7
+ },
8
+ } satisfies Plugin
9
+
10
+ export { default as ContactUsList } from './index.vue'
11
+ export type { ContactUsListProps, ContactUsListEmits } from './type'