@mixd-id/web-scaffold 0.1.230406199 → 0.1.230406201

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mixd-id/web-scaffold",
3
3
  "private": false,
4
- "version": "0.1.230406199",
4
+ "version": "0.1.230406201",
5
5
  "scripts": {
6
6
  "dev": "vite serve",
7
7
  "build": "vite build",
@@ -0,0 +1,92 @@
1
+ <template>
2
+ <div :class="$style.comp">
3
+
4
+ <component v-for="(item, idx) in computedItems"
5
+ :is="item.type"
6
+ :key="item.key"
7
+ :="item" />
8
+
9
+ <div v-show="hasNext">
10
+ <button type="button" @click="loadNext" class="p-3 w-full text-primary">Load More</button>
11
+ </div>
12
+
13
+ </div>
14
+ </template>
15
+
16
+ <script>
17
+
18
+ import {componentMixin} from "../mixin/component";
19
+
20
+ export default{
21
+
22
+ inject: [ 'pageLoad' ],
23
+
24
+ mixins: [ componentMixin ],
25
+
26
+ props: {
27
+
28
+ data: Object,
29
+ datasource: Object,
30
+
31
+ items: Array,
32
+ },
33
+
34
+ computed: {
35
+
36
+ computedData(){
37
+ return (this.pageData ?? {})[(this.datasource ?? {}).key] ?? {}
38
+ },
39
+
40
+ dataItems(){
41
+ const dataItems = this.computedData.items ?? []
42
+ if(this.editMode === 1 && this.dataItems.length < 1) dataItems.push({})
43
+ return dataItems
44
+ },
45
+
46
+ computedItems(){
47
+ if(this.items.length < 1) return []
48
+
49
+ const items = []
50
+ const itemJSON = JSON.stringify(this.items[0])
51
+
52
+ for(let data of this.dataItems){
53
+ const item = JSON.parse(itemJSON)
54
+ item.data = data
55
+ items.push(item)
56
+
57
+ if(this.editMode === 1) break
58
+ }
59
+
60
+ return items
61
+ },
62
+
63
+ hasNext(){
64
+ return true
65
+ }
66
+
67
+ },
68
+
69
+ methods: {
70
+
71
+ loadNext(){
72
+ if(!this.pageLoad) return
73
+
74
+ this.pageLoad({
75
+ ...this.datasource,
76
+ page: (this.computedData.page ?? 0) + 1
77
+ })
78
+ },
79
+
80
+ }
81
+
82
+ }
83
+
84
+ </script>
85
+
86
+ <style module>
87
+
88
+ .comp{
89
+
90
+ }
91
+
92
+ </style>
@@ -21,8 +21,15 @@ export default{
21
21
  items: Array,
22
22
  flexColumns: Array,
23
23
  columnType: Array,
24
+ data: Object
24
25
  },
25
26
 
27
+ provide(){
28
+ return {
29
+ parentData: this.data
30
+ }
31
+ }
32
+
26
33
  }
27
34
 
28
35
  </script>
@@ -31,6 +31,7 @@
31
31
  <script>
32
32
 
33
33
  import { componentMixin } from "../mixin/component";
34
+ import { applyDatasourceReplacer } from "../utils/helpers";
34
35
 
35
36
  export default{
36
37
 
@@ -50,6 +51,7 @@ export default{
50
51
  target: String,
51
52
  text: String,
52
53
  download: Object,
54
+ data: Object,
53
55
  },
54
56
 
55
57
  computed: {
@@ -62,14 +64,22 @@ export default{
62
64
  const obj = {}
63
65
 
64
66
  if(this.route.hash)
65
- obj.hash = '#' + this.route.hash
67
+ obj.hash = '#' + (this.editMode === 1 ? this.route.hash :
68
+ applyDatasourceReplacer(this.route.hash, this.data))
66
69
 
67
70
  if(this.route.path)
68
- obj.path = this.route.path
71
+ obj.path = this.editMode === 1 ? this.route.path :
72
+ applyDatasourceReplacer(this.route.path, this.data)
69
73
 
70
74
  return obj
71
75
  }
72
76
 
77
+ },
78
+
79
+ provide(){
80
+ return {
81
+ parentData: this.data
82
+ }
73
83
  }
74
84
 
75
85
  }
@@ -1,48 +1,46 @@
1
1
  <template>
2
- <div>
3
- <Teleport to=".bW9k">
4
- <Transition :name="computedTransition"
5
- appear
6
- @after-leave="onAfterLeave(); $emit('hide')"
7
- @after-enter="$emit('show')">
8
- <div v-if="currentState"
9
- ref="modal"
10
- :class="computedClass"
11
- :style="computedStyle"
12
- :data-state="computedState ? 1 : 0">
13
- <component v-if="Array.isArray(items) && items.length > 0"
14
- v-for="(item, idx) in items"
15
- :is="item.type"
16
- :key="item.key"
17
- :="item" />
18
- <form v-else-if="useForm" @submit.prevent="$emit('submit')">
19
- <div class="modal-head">
20
- <slot name="head" :context="context"></slot>
21
- </div>
22
- <div :class="$style.modalBody">
23
- <slot :context="context"></slot>
24
- </div>
25
- <div class="modal-foot">
26
- <slot name="foot" :context="context"></slot>
27
- </div>
28
- <div v-if="isDisabled" :class="$style.overlay"></div>
29
- </form>
30
- <div v-else class="flex-1 min-h-0 flex flex-col relative">
31
- <div class="modal-head">
32
- <slot name="head" :context="context"></slot>
33
- </div>
34
- <div :class="$style.modalBody">
35
- <slot :context="context"></slot>
36
- </div>
37
- <div class="modal-foot">
38
- <slot name="foot" :context="context"></slot>
39
- </div>
40
- <div v-if="isDisabled" :class="$style.overlay"></div>
41
- </div>
2
+ <Teleport to=".bW9k">
3
+ <Transition :name="computedTransition"
4
+ appear
5
+ @after-leave="onAfterLeave(); $emit('hide')"
6
+ @after-enter="$emit('show')">
7
+ <div v-if="currentState"
8
+ ref="modal"
9
+ :class="computedClass"
10
+ :style="computedStyle"
11
+ :data-state="computedState ? 1 : 0">
12
+ <component v-if="Array.isArray(items) && items.length > 0"
13
+ v-for="(item, idx) in items"
14
+ :is="item.type"
15
+ :key="item.key"
16
+ :="item" />
17
+ <form v-else-if="useForm" @submit.prevent="$emit('submit')">
18
+ <div class="modal-head">
19
+ <slot name="head" :context="context"></slot>
20
+ </div>
21
+ <div :class="$style.modalBody">
22
+ <slot :context="context"></slot>
23
+ </div>
24
+ <div class="modal-foot">
25
+ <slot name="foot" :context="context"></slot>
26
+ </div>
27
+ <div v-if="isDisabled" :class="$style.overlay"></div>
28
+ </form>
29
+ <div v-else class="flex-1 min-h-0 flex flex-col relative">
30
+ <div class="modal-head">
31
+ <slot name="head" :context="context"></slot>
32
+ </div>
33
+ <div :class="$style.modalBody">
34
+ <slot :context="context"></slot>
35
+ </div>
36
+ <div class="modal-foot">
37
+ <slot name="foot" :context="context"></slot>
38
+ </div>
39
+ <div v-if="isDisabled" :class="$style.overlay"></div>
42
40
  </div>
43
- </Transition>
44
- </Teleport>
45
- </div>
41
+ </div>
42
+ </Transition>
43
+ </Teleport>
46
44
  </template>
47
45
 
48
46
  <script>
@@ -1,15 +1,18 @@
1
1
  <template>
2
2
  <component :is="tagName" :class="$style.comp">
3
- {{ text }}
3
+ {{ computedText }}
4
4
  </component>
5
5
  </template>
6
6
 
7
7
  <script>
8
8
 
9
9
  import {componentMixin} from "../mixin/component";
10
+ import {applyDatasourceReplacer} from "../utils/helpers";
10
11
 
11
12
  export default{
12
13
 
14
+ inject: [ 'parentData' ],
15
+
13
16
  mixins: [ componentMixin ],
14
17
 
15
18
  props: {
@@ -18,10 +21,21 @@ export default{
18
21
 
19
22
  tagName: {
20
23
  type: String,
21
- default: 'span'
24
+ default: 'div'
25
+ }
26
+
27
+ },
28
+
29
+ computed: {
30
+
31
+ computedText(){
32
+ if(this.parentData && this.editMode !== 1){
33
+ return applyDatasourceReplacer(this.text, this.parentData)
34
+ }
35
+ return this.text
22
36
  }
23
37
 
24
- }
38
+ }
25
39
 
26
40
  }
27
41
 
package/src/index.js CHANGED
@@ -422,6 +422,7 @@ export default{
422
422
  app.component('Testimonial', defineAsyncComponent(() => import("./components/Testimonial.vue")))
423
423
  app.component('TextBlock', defineAsyncComponent(() => import("./components/TextBlock.vue")))
424
424
  app.component('TextEditor', defineAsyncComponent(() => import("./components/TextEditor.vue")))
425
+ app.component('DataList', defineAsyncComponent(() => import("./components/DataList.vue")))
425
426
 
426
427
  app.component('AhrefSetting', defineAsyncComponent(() => import("./widgets/AhrefSetting.vue")))
427
428
  app.component('ArticleSetting', defineAsyncComponent(() => import("./widgets/ArticleSetting.vue")))
@@ -470,5 +471,6 @@ export default{
470
471
  app.component('WebLayoutSelector', defineAsyncComponent(() => import("./widgets/WebLayoutSelector.vue")))
471
472
  app.component('WebTemplateCreator', defineAsyncComponent(() => import("./widgets/WebTemplateCreator.vue")))
472
473
  app.component('ModalSetting', defineAsyncComponent(() => import("./widgets/ModalSetting.vue")))
474
+ app.component('DataListSetting', defineAsyncComponent(() => import("./widgets/DataListSetting.vue")))
473
475
  }
474
476
  }
@@ -177,7 +177,6 @@ export const componentMixin = {
177
177
  data(){
178
178
  return {
179
179
  lastStyle: {},
180
- store: null,
181
180
  page: null,
182
181
  }
183
182
  },
@@ -371,6 +371,22 @@
371
371
  </div>
372
372
  </div>
373
373
 
374
+ <div>
375
+ <label class="text-text-400">Line Clamp</label>
376
+ <div v-for="(_, index) in viewTypes"
377
+ v-show="_.value === viewType">
378
+ <Dropdown v-model="lineClamp[index]">
379
+ <option value="">
380
+ {{ emptyComponentText('lineClamp', index) }}
381
+ </option>
382
+ <option v-for="opt in components.lineClamp"
383
+ :value="`${viewType}${opt[1]}`">
384
+ {{ opt[0] }}
385
+ </option>
386
+ </Dropdown>
387
+ </div>
388
+ </div>
389
+
374
390
  <div>
375
391
  <label class="text-text-400">Letter Spacing</label>
376
392
  <div v-for="(_, index) in viewTypes"
@@ -495,7 +511,117 @@
495
511
  </button>
496
512
  </div>
497
513
  <div class="h-[1px] bg-text-100 mt-2 mb-4"></div>
498
- <div class="grid grid-cols-2 gap-4" v-if="expanded['gridColumn']">
514
+ <div v-if="expanded['gridColumn']"
515
+ v-for="(_, idx) in viewTypes"
516
+ v-show="viewType === _.value"
517
+ class="grid grid-cols-2 gap-4">
518
+
519
+ <div>
520
+ <label class="text-text-400">Columns</label>
521
+ <Dropdown v-model="columns[idx]" class="mt-1">
522
+ <option value="">Not Set</option>
523
+ <option :value="`${viewType}grid-cols-1`">1</option>
524
+ <option :value="`${viewType}grid-cols-2`">2</option>
525
+ <option :value="`${viewType}grid-cols-3`">3</option>
526
+ <option :value="`${viewType}grid-cols-4`">4</option>
527
+ <option :value="`${viewType}grid-cols-5`">5</option>
528
+ <option :value="`${viewType}grid-cols-6`">6</option>
529
+ <option :value="`${viewType}grid-cols-7`">7</option>
530
+ <option :value="`${viewType}grid-cols-8`">8</option>
531
+ <option :value="`${viewType}grid-cols-9`">9</option>
532
+ <option :value="`${viewType}grid-cols-10`">10</option>
533
+ <option :value="`${viewType}grid-cols-11`">11</option>
534
+ <option :value="`${viewType}grid-cols-12`">12</option>
535
+ <option :value="`${viewType}grid-cols-none`">None</option>
536
+ </Dropdown>
537
+ </div>
538
+
539
+ <div>
540
+ <label class="text-text-400">Rows</label>
541
+ <Dropdown v-model="rows[idx]"
542
+ class="mt-1">
543
+ <option value="">Not Set</option>
544
+ <option :value="`${viewType}grid-rows-1`">1</option>
545
+ <option :value="`${viewType}grid-rows-2`">2</option>
546
+ <option :value="`${viewType}grid-rows-3`">3</option>
547
+ <option :value="`${viewType}grid-rows-4`">4</option>
548
+ <option :value="`${viewType}grid-rows-5`">5</option>
549
+ <option :value="`${viewType}grid-rows-6`">6</option>
550
+ <option :value="`${viewType}grid-rows-7`">7</option>
551
+ <option :value="`${viewType}grid-rows-8`">8</option>
552
+ <option :value="`${viewType}grid-rows-9`">9</option>
553
+ <option :value="`${viewType}grid-rows-10`">10</option>
554
+ <option :value="`${viewType}grid-rows-11`">11</option>
555
+ <option :value="`${viewType}grid-rows-12`">12</option>
556
+ <option :value="`${viewType}grid-rows-none`">None</option>
557
+ </Dropdown>
558
+ </div>
559
+
560
+ <div>
561
+ <label class="text-text-400">Gap</label>
562
+ <Dropdown v-model="gap[idx]" class="mt-1">
563
+ <option value="">Not Set</option>
564
+ <option :value="`${viewType}gap-0`">0</option>
565
+ <option :value="`${viewType}gap-1`">1</option>
566
+ <option :value="`${viewType}gap-2`">2</option>
567
+ <option :value="`${viewType}gap-3`">3</option>
568
+ <option :value="`${viewType}gap-4`">4</option>
569
+ <option :value="`${viewType}gap-5`">5</option>
570
+ <option :value="`${viewType}gap-6`">6</option>
571
+ <option :value="`${viewType}gap-7`">7</option>
572
+ <option :value="`${viewType}gap-8`">8</option>
573
+ <option :value="`${viewType}gap-9`">9</option>
574
+ <option :value="`${viewType}gap-10`">10</option>
575
+ <option :value="`${viewType}gap-11`">11</option>
576
+ <option :value="`${viewType}gap-12`">12</option>
577
+ </Dropdown>
578
+ </div>
579
+
580
+ <div>
581
+ <label class="text-text-400">Auto Flow</label>
582
+ <Dropdown v-model="autoFlow[idx]" class="mt-1">
583
+ <option value="">Not Set</option>
584
+ <option :value="`${viewType}grid-flow-row`">Row</option>
585
+ <option :value="`${viewType}grid-flow-col`">Col</option>
586
+ <option :value="`${viewType}grid-flow-dense`">Dense</option>
587
+ <option :value="`${viewType}grid-flow-row-dense`">Row Dense</option>
588
+ <option :value="`${viewType}grid-flow-col-dense`">Col Dense</option>
589
+ </Dropdown>
590
+ </div>
591
+
592
+ <div>
593
+ <label class="text-text-400">Align Items</label>
594
+ <Dropdown v-for="(_, idx) in viewTypes"
595
+ v-show="viewType === _.value"
596
+ v-model="alignItems[idx]"
597
+ class="w-full">
598
+ <option value="">Not Set</option>
599
+ <option :value="`${viewType}items-start`">Start</option>
600
+ <option :value="`${viewType}items-end`">End</option>
601
+ <option :value="`${viewType}items-center`">Center</option>
602
+ <option :value="`${viewType}items-baseline`">Baseline</option>
603
+ <option :value="`${viewType}items-stretch`">Stretch</option>
604
+ </Dropdown>
605
+ </div>
606
+
607
+ <div>
608
+ <label class="text-text-400">Justify Content</label>
609
+ <Dropdown v-for="(_, idx) in viewTypes"
610
+ v-show="viewType === _.value"
611
+ v-model="justifyContent[idx]"
612
+ class="w-full">
613
+ <option value="">Not Set</option>
614
+ <option :value="`${viewType}justify-normal`">Normal</option>
615
+ <option :value="`${viewType}justify-start`">Start</option>
616
+ <option :value="`${viewType}justify-end`">End</option>
617
+ <option :value="`${viewType}justify-center`">Center</option>
618
+ <option :value="`${viewType}justify-between`">Between</option>
619
+ <option :value="`${viewType}justify-around`">Around</option>
620
+ <option :value="`${viewType}justify-evenly`">Evenly</option>
621
+ <option :value="`${viewType}justify-stretch`">Stretch</option>
622
+ </Dropdown>
623
+ </div>
624
+
499
625
  <div>
500
626
  <label class="flex-1 text-text-400">Column Span</label>
501
627
  <div v-for="(_, index) in viewTypes"
@@ -1083,6 +1209,36 @@ export default{
1083
1209
 
1084
1210
  computed: {
1085
1211
 
1212
+ autoFlow(){
1213
+ if(!Array.isArray(this.item.props.autoFlow))
1214
+ this.item.props.autoFlow = []
1215
+ return this.item.props.autoFlow
1216
+ },
1217
+
1218
+ columns(){
1219
+ if(!Array.isArray(this.item.props.columns))
1220
+ this.item.props.columns = []
1221
+ return this.item.props.columns
1222
+ },
1223
+
1224
+ rows(){
1225
+ if(!Array.isArray(this.item.props.rows))
1226
+ this.item.props.rows = []
1227
+ return this.item.props.rows
1228
+ },
1229
+
1230
+ alignItems(){
1231
+ if(!Array.isArray(this.item.props.alignItems))
1232
+ this.item.props.alignItems = []
1233
+ return this.item.props.alignItems
1234
+ },
1235
+
1236
+ justifyContent(){
1237
+ if(!Array.isArray(this.item.props.justifyContent))
1238
+ this.item.props.justifyContent = []
1239
+ return this.item.props.justifyContent
1240
+ },
1241
+
1086
1242
  animate(){
1087
1243
  if(!Array.isArray(this.item.props.animate))
1088
1244
  this.item.props.animate = []
@@ -1288,6 +1444,12 @@ export default{
1288
1444
 
1289
1445
  return this.item.props.letterSpacing
1290
1446
  },
1447
+ lineClamp(){
1448
+ if(!Array.isArray(this.item.props.lineClamp))
1449
+ this.item.props.lineClamp = []
1450
+
1451
+ return this.item.props.lineClamp
1452
+ },
1291
1453
  lineHeight(){
1292
1454
  if(!Array.isArray(this.item.props.lineHeight))
1293
1455
  this.item.props.lineHeight = []
@@ -1582,6 +1744,8 @@ export default{
1582
1744
  [ 'Inline Flex', 'inline-flex' ],
1583
1745
  [ 'Table', 'table' ],
1584
1746
  [ 'Inline Table', 'inline-table' ],
1747
+ [ 'Grid', 'grid' ],
1748
+ [ 'Inline Grid', 'inline-grid' ],
1585
1749
  ],
1586
1750
  divideStyle: [
1587
1751
  [ 'Solid', 'divide-solid' ],
@@ -1730,6 +1894,15 @@ export default{
1730
1894
  [ 'Wider', 'tracking-wider' ],
1731
1895
  [ 'Widest', 'tracking-widest' ],
1732
1896
  ],
1897
+ lineClamp: [
1898
+ [ '1', 'line-clamp-1' ],
1899
+ [ '2', 'line-clamp-2' ],
1900
+ [ '3', 'line-clamp-3' ],
1901
+ [ '4', 'line-clamp-4' ],
1902
+ [ '5', 'line-clamp-5' ],
1903
+ [ '6', 'line-clamp-6' ],
1904
+ [ 'None', 'line-clamp-none' ],
1905
+ ],
1733
1906
  lineHeight: [
1734
1907
  [ 'None', 'leading-none' ],
1735
1908
  [ 'Tight', 'leading-tight' ],
@@ -91,6 +91,18 @@ export default{
91
91
  return
92
92
  }
93
93
 
94
+ const utm = this.utm && Object.values(this.utm).join('').length > 0 ? this.utm :
95
+ ('utm_source' in this.$route.query || 'utm_medium' in this.$route.query ||
96
+ 'utm_campaign' in this.$route.query || 'utm_id' in this.$route.query ||
97
+ 'utm_term' in this.$route.query || 'utm_content' in this.$route.query ? {
98
+ source: this.$route.query.utm_source,
99
+ medium: this.$route.query.utm_medium,
100
+ campaign: this.$route.query.utm_campaign,
101
+ id: this.$route.query.utm_id,
102
+ term: this.$route.query.utm_term,
103
+ content: this.$route.query.utm_content,
104
+ } : null)
105
+
94
106
  this.$refs.submitBtn.setState(2)
95
107
  this.axios({
96
108
  method: this.submitMethod ?? 'post',
@@ -101,7 +113,7 @@ export default{
101
113
  componentUid: this.uid,
102
114
  ...this.form,
103
115
  type: 1,
104
- utm: this.utm,
116
+ utm,
105
117
  },
106
118
  params: this.form
107
119
  })
@@ -0,0 +1,102 @@
1
+ <template>
2
+ <div :class="$style.comp">
3
+
4
+ <div>
5
+ <div class="flex flex-row gap-4 items-center cursor-pointer"
6
+ @click="expanded['datalist'] = !expanded['datalist']">
7
+ <strong class="flex-1 text-text-400">Data List</strong>
8
+ <label class="text-primary">
9
+ {{ expanded['datalist'] ? 'Hide': 'Show' }}
10
+ </label>
11
+ </div>
12
+ <div class="h-[1px] bg-text-100 mt-2 mb-4"></div>
13
+ <div v-if="expanded['datalist']">
14
+
15
+ <div>
16
+ <label class="flex-1 text-text-400">Data key</label>
17
+ <Textbox v-model="datasource.key" @keyup.enter="apply"/>
18
+ </div>
19
+
20
+ </div>
21
+ </div>
22
+
23
+ <ComponentSetting :item="item"
24
+ :view-type="viewType"
25
+ :view-types="viewTypes"
26
+ defaultDisplay="flex"
27
+ @change="apply" />
28
+
29
+ </div>
30
+ </template>
31
+
32
+ <script>
33
+
34
+ export default{
35
+
36
+ emits: [ 'change' ],
37
+
38
+ inject: [ 'confirm', 'imageSrc', 'uploadImage', 'store' ],
39
+
40
+ props: {
41
+
42
+ item: {
43
+ type: Object,
44
+ required: true
45
+ },
46
+
47
+ viewType: String,
48
+
49
+ viewTypes: Array,
50
+
51
+ },
52
+
53
+ methods: {
54
+
55
+ apply(){
56
+ this.$emit('change')
57
+ }
58
+
59
+ },
60
+
61
+ computed: {
62
+
63
+ componentStore(){
64
+ if(this.store && this.store.components){
65
+ if(!this.store.components.compsetting)
66
+ this.store.components.compsetting = {}
67
+
68
+ return this.store.components.compsetting
69
+ }
70
+ return {}
71
+ },
72
+
73
+ expanded(){
74
+ if(!this.componentStore['expanded'])
75
+ this.componentStore['expanded'] = {}
76
+ return this.componentStore['expanded']
77
+ },
78
+
79
+ datasource(){
80
+ if(!this.item.props.datasource)
81
+ this.item.props.datasource = {}
82
+ return this.item.props.datasource
83
+ }
84
+
85
+ },
86
+
87
+ data(){
88
+ return {
89
+ }
90
+ },
91
+
92
+ }
93
+
94
+ </script>
95
+
96
+ <style module>
97
+
98
+ .comp{
99
+ @apply flex flex-col gap-6;
100
+ }
101
+
102
+ </style>
@@ -33,9 +33,7 @@
33
33
 
34
34
  <div>
35
35
  <label class="text-text-400">Rows</label>
36
- <Dropdown v-for="(_, index) in viewTypes"
37
- v-show="_.value === viewType"
38
- v-model="rows[index]"
36
+ <Dropdown v-model="rows[idx]"
39
37
  class="mt-1"
40
38
  @change="$emit('change')">
41
39
  <option value="">Not Set</option>
@@ -10,7 +10,7 @@
10
10
  </label>
11
11
  </div>
12
12
  <div class="h-[1px] bg-text-100 mt-2 mb-4"></div>
13
- <div v-if="expanded['image']">
13
+ <div v-if="expanded['image']" class="flex flex-col gap-4">
14
14
 
15
15
  <div v-for="(_viewType, index) in viewTypes"
16
16
  v-show="_viewType.value === viewType">
@@ -1540,6 +1540,8 @@ export default{
1540
1540
  icons:[], columns:[ 'grid-cols-4' ],
1541
1541
  }},
1542
1542
 
1543
+ { type:'DataList', name:'Data List', group:'Widgets', props:{}, items:[] },
1544
+
1543
1545
  { type:'FAQ', name:'FAQ', group:'Widgets', thumbnailUrl:"/images/templates/faq.gif", props:{ items:[] }},
1544
1546
 
1545
1547
  { type:'FeatureList', name:'Feature List', group:'Widgets', props:{ items:[], columns:[], variant:['variant1'] }},
@@ -1636,7 +1638,7 @@ export default{
1636
1638
  'zIndex',
1637
1639
 
1638
1640
  'autoFlow', 'alignItems', 'justifyContent',
1639
- 'letterSpacing',
1641
+ 'letterSpacing', 'lineClamp',
1640
1642
 
1641
1643
  'animate',
1642
1644
 
@@ -35,6 +35,7 @@ module.exports = {
35
35
  'aspect-[1/2]', 'aspect-[2/3]', 'aspect-[3/4]', 'aspect-[8/9]',
36
36
 
37
37
  'hidden', 'block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table',
38
+ 'grid', 'inline-grid',
38
39
 
39
40
  'static', 'fixed', 'absolute', 'relative', 'sticky',
40
41
 
@@ -228,6 +229,9 @@ module.exports = {
228
229
  'underline', 'overline', 'line-through', 'no-underline',
229
230
  'truncate', 'text-ellipsis', 'text-clip',
230
231
 
232
+ 'line-clamp-1', 'line-clamp-2', 'line-clamp-3', 'line-clamp-4', 'line-clamp-5',
233
+ 'line-clamp-6', 'line-clamp-none',
234
+
231
235
  // // //
232
236
 
233
237
  'md:flex-wrap', 'md:flex-wrap-reverse', 'md:flex-nowrap',
@@ -252,6 +256,7 @@ module.exports = {
252
256
  'md:aspect-[1/2]', 'md:aspect-[2/3]', 'md:aspect-[3/4]', 'md:aspect-[8/9]',
253
257
 
254
258
  'md:hidden', 'md:block', 'md:inline-block', 'md:inline', 'md:flex', 'md:inline-flex', 'md:table', 'md:inline-table',
259
+ 'md:grid', 'md:inline-grid',
255
260
 
256
261
  'md:static', 'md:fixed', 'md:absolute', 'md:relative', 'md:sticky',
257
262
 
@@ -445,6 +450,9 @@ module.exports = {
445
450
  'md:underline', 'md:overline', 'md:line-through', 'md:no-underline',
446
451
  'md:truncate', 'md:text-ellipsis', 'md:text-clip',
447
452
 
453
+ 'md:line-clamp-1', 'md:line-clamp-2', 'md:line-clamp-3', 'md:line-clamp-4', 'md:line-clamp-5',
454
+ 'md:line-clamp-6', 'md:line-clamp-none',
455
+
448
456
  ],
449
457
  theme: {
450
458
  extend: {