comand-component-library 3.3.84 → 3.3.86
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/comand-component-library.js +5623 -3929
- package/dist/comand-component-library.umd.cjs +4 -4
- package/dist/style.css +1 -1
- package/package.json +2 -2
- package/src/App.vue +215 -112
- package/src/assets/data/component-structure.json +228 -0
- package/src/assets/data/form-elements.json +156 -0
- package/src/assets/data/opening-hours.json +79 -37
- package/src/components/CmdAddressData.vue +187 -201
- package/src/components/CmdAddressDataItem.vue +306 -0
- package/src/components/CmdBox.vue +1 -0
- package/src/components/CmdBoxWrapper.vue +53 -5
- package/src/components/CmdFancyBox.vue +31 -4
- package/src/components/CmdForm.vue +98 -4
- package/src/components/CmdFormElement.vue +5 -1
- package/src/components/CmdHeadline.vue +179 -52
- package/src/components/CmdImage.vue +205 -76
- package/src/components/CmdImageGallery.vue +88 -85
- package/src/components/CmdListOfLinks.vue +63 -43
- package/src/components/CmdListOfLinksItem.vue +97 -0
- package/src/components/CmdLoginForm.vue +3 -6
- package/src/components/CmdMultistepFormProgressBar.vue +37 -8
- package/src/components/CmdOpeningHours.vue +280 -63
- package/src/components/CmdOpeningHoursItem.vue +264 -0
- package/src/components/{CmdPager.vue → CmdPagination.vue} +2 -2
- package/src/components/CmdSlideshow.vue +137 -10
- package/src/components/CmdSocialNetworks.vue +115 -28
- package/src/components/CmdSocialNetworksItem.vue +184 -0
- package/src/components/CmdTable.vue +0 -1
- package/src/components/CmdTextImageBlock.vue +158 -0
- package/src/components/CmdThumbnailScroller.vue +132 -12
- package/src/components/CmdToggleDarkMode.vue +58 -1
- package/src/components/EditComponentWrapper.vue +553 -0
- package/src/index.js +2 -2
- package/src/mixins/EditMode.vue +28 -9
- package/src/utils/editmode.js +30 -5
- package/src/components/CmdTextBlock.vue +0 -73
- package/src/editmode/editModeContext.js +0 -50
@@ -1,6 +1,21 @@
|
|
1
1
|
<template>
|
2
|
-
<div :class="[
|
2
|
+
<div :class="[
|
3
|
+
'cmd-thumbnail-scroller',
|
4
|
+
{
|
5
|
+
'gallery-scroller' : useGalleryScroller,
|
6
|
+
'large-icons': largeIcons,
|
7
|
+
vertical: orientation === 'vertical'
|
8
|
+
},
|
9
|
+
fullWidthClass
|
10
|
+
]"
|
3
11
|
ref="thumbnail-scroller">
|
12
|
+
<!-- begin cmd-headline -->
|
13
|
+
<CmdHeadline
|
14
|
+
v-if="cmdHeadline?.headlineText || editModeContext"
|
15
|
+
v-bind="cmdHeadline"
|
16
|
+
/>
|
17
|
+
<!-- end cmd-headline -->
|
18
|
+
|
4
19
|
<div class="inner-thumbnail-wrapper">
|
5
20
|
<!-- begin CmdSlideButton -->
|
6
21
|
<CmdSlideButton
|
@@ -14,9 +29,9 @@
|
|
14
29
|
<transition-group name="slide" tag="ul">
|
15
30
|
<li v-for="(item, index) in items" :key="index"
|
16
31
|
:class="[{'active' : activeItemIndex === index}, item.id ? 'item-' + item.id : '']">
|
17
|
-
<a :href="executeOnClick === 'url' ? item.url : '#'"
|
32
|
+
<a v-if="!editModeContext" :href="executeOnClick === 'url' ? item.url : '#'"
|
18
33
|
@click="executeLink(index, $event)"
|
19
|
-
:title="
|
34
|
+
:title="tooltip"
|
20
35
|
:target="executeOnClick === 'url' ? '_blank' : null"
|
21
36
|
>
|
22
37
|
<!-- begin CmdImage -->
|
@@ -32,15 +47,44 @@
|
|
32
47
|
</template>
|
33
48
|
<!-- end contentType === text -->
|
34
49
|
</a>
|
50
|
+
|
51
|
+
<!-- begin edit-mode -->
|
52
|
+
<!-- begin CmdImage -->
|
53
|
+
<CmdImage
|
54
|
+
v-else-if="contentType === 'image'"
|
55
|
+
:image="item.image"
|
56
|
+
:figcaption="item.figcaption"
|
57
|
+
:componentPath="['props', 'thumbnailScrollerItems', index]"
|
58
|
+
:editModeConfig="imageStructure()"
|
59
|
+
/>
|
60
|
+
<!-- end CmdImage -->
|
61
|
+
|
62
|
+
<!-- begin contentType === text -->
|
63
|
+
<template v-else-if="contentType === 'text'">
|
64
|
+
<!-- begin CmdIcon -->
|
65
|
+
<CmdIcon v-if="item.iconClass" :iconClass="item.iconClass" :type="item.iconType"/>
|
66
|
+
<!-- end CmdIcon -->
|
67
|
+
<span v-if="item.text">{{ item.text }}</span>
|
68
|
+
</template>
|
69
|
+
<!-- end contentType === text -->
|
70
|
+
<!-- end edit-mode -->
|
71
|
+
</li>
|
72
|
+
<li v-if="!items.length && contentType === 'image'">
|
73
|
+
<!-- begin show placeholder if no image exists (and component is not edited) -->
|
74
|
+
<button type="button" class="button confirm" @click="onAddItem">
|
75
|
+
<span class="icon-plus"></span>
|
76
|
+
<span>Add new thumbnail-scroller-image</span>
|
77
|
+
</button>
|
78
|
+
<!-- end show placeholder if no image exists (and component is not edited) -->
|
35
79
|
</li>
|
36
80
|
</transition-group>
|
37
81
|
<!-- end list of images to slide -->
|
38
82
|
|
39
83
|
<!-- begin CmdSlideButton -->
|
40
84
|
<CmdSlideButton
|
41
|
-
|
42
|
-
|
43
|
-
|
85
|
+
v-if="showSlidebuttons"
|
86
|
+
@click.prevent="showNextItem"
|
87
|
+
:slideButtons="cmdSlideButtons.next"
|
44
88
|
/>
|
45
89
|
<!-- end CmdSlideButton -->
|
46
90
|
</div>
|
@@ -49,18 +93,22 @@
|
|
49
93
|
|
50
94
|
<script>
|
51
95
|
// import functions
|
96
|
+
import {createUuid} from "../utils/common"
|
52
97
|
import {openFancyBox} from './CmdFancyBox.vue'
|
53
98
|
|
54
99
|
// import mixins
|
55
100
|
import I18n from "../mixins/I18n"
|
56
101
|
import DefaultMessageProperties from "../mixins/CmdThumbnailScroller/DefaultMessageProperties"
|
102
|
+
import EditMode from "../mixins/EditMode.vue"
|
103
|
+
import {buildComponentPath} from "../utils/editmode.js"
|
57
104
|
|
58
105
|
export default {
|
59
106
|
name: "CmdThumbnailScroller",
|
60
107
|
emits: ["click"],
|
61
108
|
mixins: [
|
62
109
|
I18n,
|
63
|
-
DefaultMessageProperties
|
110
|
+
DefaultMessageProperties,
|
111
|
+
EditMode
|
64
112
|
],
|
65
113
|
data() {
|
66
114
|
return {
|
@@ -69,6 +117,10 @@ export default {
|
|
69
117
|
}
|
70
118
|
},
|
71
119
|
props: {
|
120
|
+
orientation: {
|
121
|
+
type: String,
|
122
|
+
default: "horizontal"
|
123
|
+
},
|
72
124
|
/**
|
73
125
|
* activate to stretch component to full width (of parent element)
|
74
126
|
*
|
@@ -138,6 +190,20 @@ export default {
|
|
138
190
|
}
|
139
191
|
}
|
140
192
|
},
|
193
|
+
/**
|
194
|
+
* activate if the thumbnail-scroller should be used as gallery-scroller stuck at the bottom of the page
|
195
|
+
*/
|
196
|
+
useGalleryScroller: {
|
197
|
+
type: Boolean,
|
198
|
+
default: false
|
199
|
+
},
|
200
|
+
/**
|
201
|
+
* properties for CmdHeadline-component
|
202
|
+
*/
|
203
|
+
cmdHeadline: {
|
204
|
+
type: Object,
|
205
|
+
required: false
|
206
|
+
},
|
141
207
|
/**
|
142
208
|
* properties for CmdSlideButtons-component
|
143
209
|
*
|
@@ -167,14 +233,14 @@ export default {
|
|
167
233
|
},
|
168
234
|
mounted() {
|
169
235
|
const thumbnailScrollerWrapper = this.$refs["thumbnail-scroller"]
|
170
|
-
const innerListWrapper = thumbnailScrollerWrapper.querySelector("
|
236
|
+
const innerListWrapper = thumbnailScrollerWrapper.querySelector("ul")
|
171
237
|
|
172
238
|
// watch container-size / -overflow on resize
|
173
239
|
const resizeObserver = new ResizeObserver(() => this.toggleSlideButtons(innerListWrapper))
|
174
240
|
resizeObserver.observe(thumbnailScrollerWrapper)
|
175
241
|
},
|
176
242
|
computed: {
|
177
|
-
|
243
|
+
tooltip() {
|
178
244
|
if (this.contentType === "image") {
|
179
245
|
return this.getMessage("cmdthumbnailscroller.tooltip.open_large_image")
|
180
246
|
}
|
@@ -182,9 +248,49 @@ export default {
|
|
182
248
|
return this.getMessage("cmdthumbnailscroller.tooltip.open_url")
|
183
249
|
}
|
184
250
|
return this.getMessage("cmdthumbnailscroller.tooltip.open")
|
251
|
+
},
|
252
|
+
fullWidthClass() {
|
253
|
+
if (this.orientation === "horizontal") {
|
254
|
+
return "full-width"
|
255
|
+
}
|
256
|
+
return null
|
185
257
|
}
|
186
258
|
},
|
187
259
|
methods: {
|
260
|
+
itemProvider() {
|
261
|
+
return {
|
262
|
+
"image": {
|
263
|
+
"id": createUuid(),
|
264
|
+
"src": "/media/images/demo-images/small/landscape-01.jpg",
|
265
|
+
"srcImageLarge": "/media/images/demo-images/large/landscape-01.jpg",
|
266
|
+
"alt": "Alternative Text",
|
267
|
+
"tooltip": "Tooltip 1"
|
268
|
+
},
|
269
|
+
"figcaption": {
|
270
|
+
"text": "Figcaption DE",
|
271
|
+
"position": "bottom",
|
272
|
+
"textAlign": "center",
|
273
|
+
"show": true
|
274
|
+
}
|
275
|
+
}
|
276
|
+
},
|
277
|
+
onAddItem() {
|
278
|
+
this.editModeContext.content.addContent(
|
279
|
+
buildComponentPath(this, 'props', 'thumbnailScrollerItems', -1),
|
280
|
+
this.itemProvider)
|
281
|
+
},
|
282
|
+
imageStructure() {
|
283
|
+
return {
|
284
|
+
itemProviderOverwrite: () => ({
|
285
|
+
"image": {
|
286
|
+
"id": createUuid(),
|
287
|
+
"src": "/media/images/demo-images/small/landscape-01.jpg",
|
288
|
+
"srcImageLarge": "/media/images/demo-images/large/landscape-01.jpg",
|
289
|
+
"tooltip": "Tooltip DE"
|
290
|
+
}
|
291
|
+
})
|
292
|
+
}
|
293
|
+
},
|
188
294
|
toggleSlideButtons(innerListWrapper) {
|
189
295
|
this.showSlidebuttons = innerListWrapper.scrollWidth > innerListWrapper.clientWidth
|
190
296
|
},
|
@@ -244,7 +350,8 @@ export default {
|
|
244
350
|
return newItem
|
245
351
|
})
|
246
352
|
},
|
247
|
-
immediate: true
|
353
|
+
immediate: true,
|
354
|
+
deep: true
|
248
355
|
}
|
249
356
|
}
|
250
357
|
}
|
@@ -256,9 +363,11 @@ export default {
|
|
256
363
|
|
257
364
|
.cmd-thumbnail-scroller {
|
258
365
|
display: inline-flex; /* do not set to table to avoid overflow is not hidden on small devices */
|
366
|
+
flex-direction: column;
|
367
|
+
gap: var(--default-gap);
|
259
368
|
width: 100%;
|
260
369
|
|
261
|
-
|
370
|
+
&.full-width:not(.vertical) {
|
262
371
|
display: flex; /* allows flex-items to stretch equally over full space */
|
263
372
|
|
264
373
|
> div {
|
@@ -268,7 +377,8 @@ export default {
|
|
268
377
|
|
269
378
|
> .inner-thumbnail-wrapper {
|
270
379
|
border-radius: var(--border-radius);
|
271
|
-
|
380
|
+
padding: calc(var(--default-padding) * 2);
|
381
|
+
padding-top: 0;
|
272
382
|
margin: 0 auto;
|
273
383
|
border: var(--default-border);
|
274
384
|
background: var(--color-scheme-background-color);
|
@@ -286,6 +396,7 @@ export default {
|
|
286
396
|
align-self: center;
|
287
397
|
list-style-type: none;
|
288
398
|
margin: 0;
|
399
|
+
margin-top: 2rem;
|
289
400
|
|
290
401
|
a {
|
291
402
|
text-align: center;
|
@@ -293,6 +404,7 @@ export default {
|
|
293
404
|
|
294
405
|
img {
|
295
406
|
border-radius: var(--border-radius);
|
407
|
+
min-width: 15rem;
|
296
408
|
max-height: 10rem;
|
297
409
|
}
|
298
410
|
|
@@ -303,11 +415,18 @@ export default {
|
|
303
415
|
}
|
304
416
|
}
|
305
417
|
}
|
418
|
+
|
419
|
+
.image-wrapper {
|
420
|
+
min-width: 11.1rem; // assure to be as wide as action-buttons in edit-mode
|
421
|
+
}
|
306
422
|
}
|
307
423
|
}
|
308
424
|
}
|
309
425
|
|
310
426
|
&.vertical {
|
427
|
+
width: auto;
|
428
|
+
|
429
|
+
.inner-thumbnail-wrapper {
|
311
430
|
display: inline-flex;
|
312
431
|
left: 50%;
|
313
432
|
height: 75rem; /* remove later !!! */
|
@@ -335,6 +454,7 @@ export default {
|
|
335
454
|
bottom: 0;
|
336
455
|
}
|
337
456
|
}
|
457
|
+
}
|
338
458
|
|
339
459
|
&.gallery-scroller {
|
340
460
|
max-width: var(--max-width);
|
@@ -1,5 +1,6 @@
|
|
1
1
|
<template>
|
2
2
|
<div :class="['cmd-toggle-dark-mode', {'styled-layout': useStyledLayout, 'dark-mode': darkMode}]">
|
3
|
+
<template v-if="!editing">
|
3
4
|
<!-- begin button-style -->
|
4
5
|
<a v-if="styledAsButton"
|
5
6
|
href="#"
|
@@ -30,15 +31,44 @@
|
|
30
31
|
@update:modelValue="setColorScheme"
|
31
32
|
/>
|
32
33
|
<!-- end CmdFormElement -->
|
34
|
+
</template>
|
35
|
+
|
36
|
+
<template v-else>
|
37
|
+
<!-- begin edit-mode -->
|
38
|
+
<CmdFormElement
|
39
|
+
element="input"
|
40
|
+
type="text"
|
41
|
+
labelText="Label for Light Mode"
|
42
|
+
placeholder="Label for Light Mode"
|
43
|
+
v-model="labelTextLightModeModel"
|
44
|
+
/>
|
45
|
+
|
46
|
+
<CmdFormElement
|
47
|
+
element="input"
|
48
|
+
type="text"
|
49
|
+
labelText="Label for Dark Mode"
|
50
|
+
placeholder="Label for Dark Mode"
|
51
|
+
v-model="labelTextDarkModeModel"
|
52
|
+
/>
|
53
|
+
<!-- end edit-mode -->
|
54
|
+
</template>
|
33
55
|
</div>
|
34
56
|
</template>
|
35
57
|
|
36
58
|
<script>
|
59
|
+
import EditMode from "../mixins/EditMode.vue"
|
60
|
+
import {updateHandlerProvider} from "../utils/editmode.js"
|
61
|
+
|
37
62
|
export default {
|
38
63
|
name: "ToggleDarkMode",
|
64
|
+
mixins: [
|
65
|
+
EditMode
|
66
|
+
],
|
39
67
|
data() {
|
40
68
|
return {
|
41
|
-
darkMode: false
|
69
|
+
darkMode: false,
|
70
|
+
editableLabelTextLightMode: null,
|
71
|
+
editableLabelTextDarkMode: null
|
42
72
|
}
|
43
73
|
},
|
44
74
|
props: {
|
@@ -152,9 +182,36 @@ export default {
|
|
152
182
|
toggleColorScheme() {
|
153
183
|
this.darkMode = !this.darkMode
|
154
184
|
this.setColorScheme()
|
185
|
+
},
|
186
|
+
updateHandlerProvider() {
|
187
|
+
const labelTextLightMode = this.labelTextLightModeModel
|
188
|
+
const labelTextDarkMode = this.labelTextDarkModeModel
|
189
|
+
|
190
|
+
return updateHandlerProvider(this, {
|
191
|
+
update(props) {
|
192
|
+
props.labelTextLightMode = labelTextLightMode
|
193
|
+
props.labelTextDarkMode = labelTextDarkMode
|
194
|
+
}
|
195
|
+
})
|
155
196
|
}
|
156
197
|
},
|
157
198
|
computed: {
|
199
|
+
labelTextLightModeModel: {
|
200
|
+
get() {
|
201
|
+
return this.editableLabelTextLightMode == null ? this.labelTextLightMode: this.editableLabelTextLightMode
|
202
|
+
},
|
203
|
+
set(value) {
|
204
|
+
this.editableLabelTextLightMode = value
|
205
|
+
}
|
206
|
+
},
|
207
|
+
labelTextDarkModeModel: {
|
208
|
+
get() {
|
209
|
+
return this.editableLabelTextDarkMode == null ? this.labelTextDarkMode: this.editableLabelTextDarkMode
|
210
|
+
},
|
211
|
+
set(value) {
|
212
|
+
this.editableLabelTextDarkMode = value
|
213
|
+
}
|
214
|
+
},
|
158
215
|
labelText() {
|
159
216
|
return this.darkMode ? this.labelTextDarkMode : this.labelTextLightMode
|
160
217
|
},
|