renusify 2.3.1 → 2.3.2

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.
@@ -1,13 +1,13 @@
1
1
  <template>
2
2
  <div class="d-flex flex-wrap">
3
- <r-btn v-for="i in 12"
3
+ <r-btn v-for="i in ls"
4
4
  :key="i"
5
5
  outlined
6
6
  class="w-30 ma-2"
7
- :class="{'color-one-text':i+p===modelValue}"
8
- @click.prevent="emit(i+p)">
7
+ :class="{'color-one':i===modelValue}"
8
+ @click.prevent="emit(i)">
9
9
  {{
10
- $d(new Date(year, i + p, 1, 0, timezoneOffset), 'month', locale)
10
+ $d(new Date(year, i, 1, 0, timezoneOffset), 'month', locale)
11
11
  }}
12
12
  </r-btn>
13
13
  </div>
@@ -22,17 +22,41 @@ export default {
22
22
  month: Number,
23
23
  year: Number
24
24
  },
25
- emits:['update:modelValue'],
25
+ emits: ['update:modelValue'],
26
26
  data() {
27
27
  return {
28
- p: 0
28
+ ls: []
29
29
  }
30
30
  },
31
31
  beforeMount() {
32
- const c = this.$d(new Date(this.year, 1, 1, 0, this.timezoneOffset), 'me', this.locale)
33
- if (c > 1) {
34
- this.p = (1 - c)
32
+ const year = this.$d(new Date(this.year, this.month, 5, 0, this.timezoneOffset), 'ye', this.locale)
33
+ let ls = []
34
+ let first = 0
35
+ let n = 0
36
+ while (true) {
37
+ n++
38
+ if (n > 100) {
39
+ break
40
+ }
41
+ const y = this.$d(new Date(this.year, first, 5, 0, this.timezoneOffset), 'ye', this.locale)
42
+ const m = parseInt(this.$d(new Date(this.year, first, 5, 0, this.timezoneOffset), 'me', this.locale))
43
+ if (y === year && m === 1) {
44
+ break
45
+ }
46
+ if (y > year) {
47
+ first--
48
+ } else if (y < year) {
49
+ first++
50
+ } else if (m > 1) {
51
+ first--
52
+ } else {
53
+ first++
54
+ }
35
55
  }
56
+ for (let i = 0; i < 12; i++) {
57
+ ls.push(first + i)
58
+ }
59
+ this.ls = ls
36
60
  },
37
61
  methods: {
38
62
  emit(n) {
@@ -1,13 +1,13 @@
1
1
  <template>
2
- <div class="d-flex flex-wrap">
3
- <r-btn v-for="i in 12"
2
+ <div class="date-picker-year d-flex flex-wrap">
3
+ <r-btn v-for="i in 200"
4
4
  :key="i"
5
5
  class="w-30 ma-2"
6
- :class="{'color-one-text':modelValue+i-6===modelValue}"
6
+ :class="{'color-one year-select':modelValue+i-100===modelValue}"
7
7
  outlined
8
- @click.prevent="emit(modelValue+i-6)">
8
+ @click.prevent="emit(modelValue+i-100)">
9
9
  {{
10
- $d(new Date(modelValue + i - 6, 1, 1, 0, timezoneOffset), 'year', locale)
10
+ $d(new Date(modelValue + i - 100, month, 5, 0, timezoneOffset), 'year', locale)
11
11
  }}
12
12
  </r-btn>
13
13
  </div>
@@ -22,10 +22,16 @@ export default {
22
22
  month: Number
23
23
  },
24
24
  emits:['update:modelValue'],
25
+ mounted() {
26
+ let el = document.querySelector('.year-select')
27
+ if (el) {
28
+ el.scrollIntoView(true)
29
+ }
30
+ },
25
31
  methods: {
26
32
  emit(n) {
27
- this.$emit('update:modelValue', n)
33
+ this.$emit('update:modelValue', n - this.modelValue)
28
34
  }
29
35
  }
30
36
  }
31
- </script>
37
+ </script>
@@ -1,4 +1,5 @@
1
1
  export * as rGroupInput from './index.vue'
2
2
 
3
3
  export * as l_btn from '../../button/index.js'
4
- export * as l_icon from '../../icon/index.js'
4
+ export * as l_icon from '../../icon/index.js'
5
+ export * as d_sortable from '../../../directive/sortable/index.js'
@@ -4,6 +4,7 @@
4
4
  hide>
5
5
  <div class="w-full">
6
6
  <span v-if="label" class="group-input-label">{{ label }}</span>
7
+ <div :key="key" v-sortable="{grab:'.grab-btn-group-input',end:end}">
7
8
  <div class="group-holder" v-for="(item,i) in modelValue" :key="i">
8
9
  <div class="group-slot">
9
10
  <slot :item="item" :index="i" :disableDel="disDel">
@@ -17,18 +18,15 @@
17
18
  </slot>
18
19
  </div>
19
20
  <div class="group-action">
20
- <r-btn icon text>
21
- <r-icon v-html="$r.icons.chevron_up" :class="{'icon-disabled':i===0}" @click.prevent="up(i)"></r-icon>
22
- </r-btn>
23
- <r-btn icon text>
24
- <r-icon v-html="$r.icons.chevron_down" :class="{'icon-disabled':i===modelValue.length-1}"
25
- @click.prevent="down(i)"></r-icon>
21
+ <r-btn icon text class="grab-btn-group-input">
22
+ <r-icon v-html="$r.icons.drag"></r-icon>
26
23
  </r-btn>
27
24
  <r-btn v-if="!disableItems.includes(itemKey?item[itemKey]:'')" icon text @click.prevent="del(i)">
28
25
  <r-icon v-html="$r.icons.delete" class="color-error-text"></r-icon>
29
26
  </r-btn>
30
27
  </div>
31
28
  </div>
29
+ </div>
32
30
  <div class="mt-5" :class="addBtnClass">
33
31
  <transition name="scale">
34
32
  <r-btn v-if="show_add" class="color-success" icon @click.prevent="add">
@@ -55,6 +53,7 @@ export default {
55
53
  emits:['update:modelValue','add','delete'],
56
54
  data() {
57
55
  return {
56
+ key: 0,
58
57
  disabledDel: {}
59
58
  }
60
59
  },
@@ -71,6 +70,14 @@ export default {
71
70
  }
72
71
  },
73
72
  methods: {
73
+ end(e) {
74
+ let a = []
75
+ for (let i = 0; i < e.length; i++) {
76
+ a.push(this.modelValue[parseInt(e[i])])
77
+ }
78
+ this.$emit('update:modelValue', a)
79
+ this.key++
80
+ },
74
81
  t(k) {
75
82
  if (this.translate) {
76
83
  return this.$t(k)
@@ -104,32 +111,6 @@ export default {
104
111
  this.$emit('delete', i)
105
112
  this.$emit('update:modelValue', a)
106
113
  },
107
- up(i) {
108
- if (i === 0) {
109
- return
110
- }
111
- let a = this.modelValue || []
112
- a = this.array_move(a, i, i - 1)
113
- this.$emit('update:modelValue', a)
114
- },
115
- down(i) {
116
- if (i === this.modelValue.length - 1) {
117
- return
118
- }
119
- let a = this.modelValue || []
120
- a = this.array_move(a, i, i + 1)
121
- this.$emit('update:modelValue', a)
122
- },
123
- array_move(arr, old_index, new_index) {
124
- if (new_index >= arr.length) {
125
- let k = new_index - arr.length + 1;
126
- while (k--) {
127
- arr.push(undefined);
128
- }
129
- }
130
- arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
131
- return arr;
132
- }
133
114
  }
134
115
  }
135
116
  </script>
@@ -24,7 +24,8 @@
24
24
  class="mb-5">
25
25
  <template v-if="item['formInput']!==false">
26
26
 
27
- <r-json-input v-if="item['type']==='file-uploader'" v-model="copyItem['d'][key]" :label="$t(key,'renusify')"
27
+ <r-json-input v-if="item['type']==='file-uploader'" v-model="copyItem['d'][key]"
28
+ :label="$t(key,'renusify')"
28
29
  baseArray></r-json-input>
29
30
  <component
30
31
  :is="item['type']"
@@ -60,37 +61,44 @@
60
61
  @a-search="(a_search=$event),(searching())"></manage-header>
61
62
  <div v-if="card" class="d-flex overflow-x-auto">
62
63
  <div class="d-flex">
63
- <r-card v-for="(item,i) in table.data" :key="i" :class="{'br-lg':!$r.inputs.tile}" class="pa-3 me-3"
64
+ <r-card v-for="(item,i) in table.data" :key="i" :class="{'br-lg':!$r.inputs.tile}"
65
+ class="pa-3 me-3"
64
66
  style="width: 300px">
65
- <div v-for="(h,j) in headerTable" :key="i+'-'+j" class="d-flex text-no-wrap overflow-x-auto">
66
- <slot :data="item" :header="h" name="card">
67
- <div v-if="h['option']['type']==='r-date-input' && item[h['value']]!==undefined" class="py-2">
68
- {{ h['text'] }}: {{ $d(new Date(item[h['value']]), h['option']['format'] || 'short') }}
69
- </div>
70
- <div
71
- v-else-if="h['option']['type']==='r-time-ago' && item[h['value']]!==undefined" class="py-2">
72
- {{ h['text'] }}:
73
- <r-time-ago :time="item[h['value']]"></r-time-ago>
74
- </div>
75
- <div v-else-if="h['option']['type']==='r-switch-input'" class="d-flex py-2">
76
- {{ h['text'] }}:
77
- <r-switch-input
78
- :modelValue="item[h['value']]"
79
- :readonly="h['option']['formInput']===false"
80
- class="mt-0"
81
- @update:modelValue="h['option']['formInput']!==false?editItem(item,true,h['value']):''"
82
- ></r-switch-input>
83
- </div>
84
- <div v-else-if="h['option']['type'] === 'r-number-input'" class="py-2">
85
- {{ h['text'] }}: {{ $n(item[h["value"]]) }}
86
- </div>
87
- <div v-else-if="h['option']['type']!=='action'" class="py-2">
88
- {{ h['text'] }}: {{
67
+ <div v-for="(h,j) in headerTable" :key="i+'-'+j"
68
+ class="d-flex text-no-wrap overflow-x-auto">
69
+ <slot :editItem="editItem" :item="item" :value="h" :name="'td-'+h.value">
70
+ <slot :editItem="editItem" :item="item" :value="h" name="card">
71
+ <div v-if="h['option']['type']==='r-date-input' && item[h['value']]!==undefined"
72
+ class="py-2">
73
+ {{ h['text'] }}:
74
+ {{ $d(new Date(item[h['value']]), h['option']['format'] || 'short') }}
75
+ </div>
76
+ <div
77
+ v-else-if="h['option']['type']==='r-time-ago' && item[h['value']]!==undefined"
78
+ class="py-2">
79
+ {{ h['text'] }}:
80
+ <r-time-ago :time="item[h['value']]"></r-time-ago>
81
+ </div>
82
+ <div v-else-if="h['option']['type']==='r-switch-input'" class="d-flex py-2">
83
+ {{ h['text'] }}:
84
+ <r-switch-input
85
+ :modelValue="item[h['value']]"
86
+ :readonly="h['option']['formInput']===false"
87
+ class="mt-0"
88
+ @update:modelValue="h['option']['formInput']!==false?editItem(item,true,h['value']):''"
89
+ ></r-switch-input>
90
+ </div>
91
+ <div v-else-if="h['option']['type'] === 'r-number-input'" class="py-2">
92
+ {{ h['text'] }}: {{ $n(item[h['value']]) }}
93
+ </div>
94
+ <div v-else-if="h['option']['type']!=='action'" class="py-2">
95
+ {{ h['text'] }}: {{
89
96
  h['value'] in cast ?
90
- $helper.ifHas(item, '', h['value'], cast[h['value']])
91
- : item[h['value']]
92
- }}
93
- </div>
97
+ $helper.ifHas(item, '', h['value'], cast[h['value']])
98
+ : item[h['value']]
99
+ }}
100
+ </div>
101
+ </slot>
94
102
  </slot>
95
103
  <div v-if="h['option']['type']==='action'" class="w-full text-end">
96
104
  <r-divider class="mt-3"></r-divider>
@@ -102,7 +110,8 @@
102
110
  icon text @click.prevent="deleteItem(item)">
103
111
  <r-icon v-html="$r.icons.delete"></r-icon>
104
112
  </r-btn>
105
- <r-btn v-for="(val,index) in actions" :key="index" :class="`color-${val.color}-text`" class="mx-0" icon
113
+ <r-btn v-for="(val,index) in actions" :key="index" :class="`color-${val.color}-text`"
114
+ class="mx-0" icon
106
115
  text @click.prevent="$emit(val.name,item)">
107
116
  <r-icon exact v-html="val.icon"></r-icon>
108
117
  </r-btn>
@@ -111,7 +120,8 @@
111
120
  </r-card>
112
121
  </div>
113
122
  </div>
114
- <r-table v-else :headers="headerTable" :items="table.data" :key-item="itemId" :responsive="responsive"
123
+ <r-table v-else :headers="headerTable" :items="table.data" :key-item="itemId"
124
+ :responsive="responsive"
115
125
  transition="table-row">
116
126
  <template v-slot:header="{header}">
117
127
  <th v-for="(item,key) in header"
@@ -157,33 +167,37 @@
157
167
  icon text @click.prevent="props.open(props.key)">
158
168
  <r-icon v-html="props.opened!==props.key?$r.icons.plus:$r.icons.minus"></r-icon>
159
169
  </r-btn>
160
- <slot :editItem="editItem" :item="props.item" :value="value" name="cell">
161
- <div
162
- v-if="value['option']['type']==='r-date-input' && props.item[value['value']]!==undefined">
163
- {{ $d(new Date(props.item[value['value']]), value['option']['format'] || 'short') }}
164
- </div>
165
- <div
166
- v-else-if="value['option']['type']==='r-time-ago' && props.item[value['value']]!==undefined">
167
- <r-time-ago :time="props.item[value['value']]"></r-time-ago>
168
- </div>
169
- <div v-else-if="value['option']['type']==='r-switch-input'">
170
- <r-switch-input
171
- :modelValue="props.item[value['value']]"
172
- :readonly="value['option']['formInput']===false"
173
- class="mt-0"
174
- @update:modelValue="value['option']['formInput']!==false?editItem(props.item,true,value['value']):''"
175
- ></r-switch-input>
176
- </div>
177
- <div v-else-if="value['option']['type'] === 'r-number-input'">
178
- {{ $n(props.item[value["value"]]) }}
179
- </div>
180
- <div v-else-if="value['option']['type']!=='action'">
181
- {{
170
+ <slot :editItem="editItem" :item="props.item" :value="value" :name="'td-'+value.value">
171
+ <slot :editItem="editItem" :item="props.item" :value="value" name="cell">
172
+ <div
173
+ v-if="value['option']['type']==='r-date-input' && props.item[value['value']]!==undefined">
174
+ {{
175
+ $d(new Date(props.item[value['value']]), value['option']['format'] || 'short')
176
+ }}
177
+ </div>
178
+ <div
179
+ v-else-if="value['option']['type']==='r-time-ago' && props.item[value['value']]!==undefined">
180
+ <r-time-ago :time="props.item[value['value']]"></r-time-ago>
181
+ </div>
182
+ <div v-else-if="value['option']['type']==='r-switch-input'">
183
+ <r-switch-input
184
+ :modelValue="props.item[value['value']]"
185
+ :readonly="value['option']['formInput']===false"
186
+ class="mt-0"
187
+ @update:modelValue="value['option']['formInput']!==false?editItem(props.item,true,value['value']):''"
188
+ ></r-switch-input>
189
+ </div>
190
+ <div v-else-if="value['option']['type'] === 'r-number-input'">
191
+ {{ $n(props.item[value['value']]) }}
192
+ </div>
193
+ <div v-else-if="value['option']['type']!=='action'">
194
+ {{
182
195
  value['value'] in cast ?
183
- $helper.ifHas(props.item, '', value['value'], cast[value['value']])
184
- : props.item[value['value']]
185
- }}
186
- </div>
196
+ $helper.ifHas(props.item, '', value['value'], cast[value['value']])
197
+ : props.item[value['value']]
198
+ }}
199
+ </div>
200
+ </slot>
187
201
  </slot>
188
202
  <div v-if="value['option']['type']==='action'">
189
203
  <r-btn v-if="!disableUpdate" class="mx-0 color-success-text"
@@ -194,7 +208,8 @@
194
208
  icon text @click.prevent="deleteItem(props.item)">
195
209
  <r-icon v-html="$r.icons.delete"></r-icon>
196
210
  </r-btn>
197
- <r-btn v-for="(val,index) in actions" :key="index" :class="`color-${val.color}-text`" class="mx-0" icon
211
+ <r-btn v-for="(val,index) in actions" :key="index" :class="`color-${val.color}-text`"
212
+ class="mx-0" icon
198
213
  text @click.prevent="$emit(val.name,props.item)">
199
214
  <r-icon exact v-html="val.icon"></r-icon>
200
215
  </r-btn>
@@ -204,7 +219,8 @@
204
219
  </template>
205
220
 
206
221
  </r-table>
207
- <manage-footer v-model:page="page" v-model:per-page="itemsPerPage" :total="table.total"></manage-footer>
222
+ <manage-footer v-model:page="page" v-model:per-page="itemsPerPage"
223
+ :total="table.total"></manage-footer>
208
224
  <r-confirm
209
225
  v-model="showConfirm"
210
226
  hard
@@ -221,9 +237,9 @@ export default {
221
237
  name: 'r-table-crud',
222
238
  components: {
223
239
  ManageHeader: defineAsyncComponent(() =>
224
- import("./header.vue")
240
+ import('./header.vue')
225
241
  ), ManageFooter: defineAsyncComponent(() =>
226
- import("./footer.vue")
242
+ import('./footer.vue')
227
243
  )
228
244
  },
229
245
  props: {
@@ -260,7 +276,7 @@ export default {
260
276
  disableDelete: Boolean,
261
277
  disableUpdate: Boolean,
262
278
  mcud: String,
263
- itemId: {type: String, default: "_id"},
279
+ itemId: {type: String, default: '_id'},
264
280
  headers: Object
265
281
  },
266
282
  emits: ['actions'],
@@ -532,9 +548,9 @@ export default {
532
548
  let all = []
533
549
  if (this.mcud) {
534
550
  all.push({
535
- option: {type: "mcud", sortable: false, formInput: false, priority: 10},
536
- text: "action",
537
- value: "action"
551
+ option: {type: 'mcud', sortable: false, formInput: false, priority: 10},
552
+ text: 'action',
553
+ value: 'action'
538
554
  })
539
555
  }
540
556
  all = all.concat(data.headers)
@@ -43,6 +43,7 @@
43
43
  <slot :key="key" :item="item" :open="open" :opened="opened" :show="show" :th="th"
44
44
  name="row">
45
45
  <td v-for="(value,k) in th" :key="`${key}- ${k}`">
46
+ <slot :item="item" :value="value" :name="'td-'+value.value">
46
47
  <div>
47
48
  <r-btn v-if="show(k)"
48
49
  icon text @click.prevent="open(key)">
@@ -51,6 +52,7 @@
51
52
  </r-btn>
52
53
  {{ item[value.value] }}
53
54
  </div>
55
+ </slot>
54
56
  </td>
55
57
  </slot>
56
58
  </tr>
@@ -72,6 +74,7 @@
72
74
  </div>
73
75
  <r-modal v-if="editable" v-model="showModal">
74
76
  <div
77
+ :key="key"
75
78
  v-sortable="{
76
79
  items: cols,
77
80
  end: store_db,
@@ -120,6 +123,7 @@ export default {
120
123
  },
121
124
  data() {
122
125
  return {
126
+ key: 0,
123
127
  showTable: true,
124
128
  opened: null,
125
129
  sortKey: null,
@@ -132,14 +136,6 @@ export default {
132
136
  cols: []
133
137
  }
134
138
  },
135
- created() {
136
- if (!this.$r.icons.setting) {
137
- this.$r.icons.setting = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M19.14 12.94c.04-.3.06-.61.06-.94c0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.488.488 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6s3.6 1.62 3.6 3.6s-1.62 3.6-3.6 3.6z"/></svg>'
138
- }
139
- if (!this.$r.icons.drag) {
140
- this.$r.icons.drag = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M7 19v-2h2v2H7m4 0v-2h2v2h-2m4 0v-2h2v2h-2m-8-4v-2h2v2H7m4 0v-2h2v2h-2m4 0v-2h2v2h-2m-8-4V9h2v2H7m4 0V9h2v2h-2m4 0V9h2v2h-2M7 7V5h2v2H7m4 0V5h2v2h-2m4 0V5h2v2h-2Z"/></svg>'
141
- }
142
- },
143
139
  watch: {
144
140
  items: {
145
141
  immediate: true,
@@ -225,6 +221,7 @@ export default {
225
221
  },
226
222
  store_db(data) {
227
223
  this.$storage.set('table_' + this.hash_key, data)
224
+ this.key++
228
225
  this.check_hidden()
229
226
  if (this.responsive) {
230
227
  this.build()
@@ -43,9 +43,7 @@ function mousestart(e, wrapper) {
43
43
  wrapper.el.insertBefore(holder, targetEl);
44
44
  wrapper.holder = holder
45
45
 
46
- const y = event.y || event.pageY
47
-
48
- targetEl.style.top = y - targetEl.clientHeight / 2 + "px";
46
+ targetEl.style.top = targetEl.offsetTop - targetEl.clientHeight / 2 + "px";
49
47
  targetEl.style.width = targetEl.clientWidth + "px";
50
48
  targetEl.classList.add("on-drag");
51
49
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "renusify",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "description": "Vue3 Framework",
5
5
  "keywords": [
6
6
  "vuejs",
package/tools/icons.js CHANGED
@@ -23,5 +23,7 @@ export let Icons = {
23
23
  'attachment': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M7.5 18A5.5 5.5 0 0 1 2 12.5A5.5 5.5 0 0 1 7.5 7H18a4 4 0 0 1 4 4a4 4 0 0 1-4 4H9.5A2.5 2.5 0 0 1 7 12.5A2.5 2.5 0 0 1 9.5 10H17v1.5H9.5a1 1 0 0 0-1 1a1 1 0 0 0 1 1H18a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 18 8.5H7.5a4 4 0 0 0-4 4a4 4 0 0 0 4 4H17V18H7.5Z"/></svg>',
24
24
  'send': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="m2 21l21-9L2 3v7l15 2l-15 2v7Z"/></svg>',
25
25
  'sticker': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M5.5 2C3.56 2 2 3.56 2 5.5v13C2 20.44 3.56 22 5.5 22H16l6-6V5.5C22 3.56 20.44 2 18.5 2h-13m.25 2h12.5A1.75 1.75 0 0 1 20 5.75V15h-1.5c-1.94 0-3.5 1.56-3.5 3.5V20H5.75A1.75 1.75 0 0 1 4 18.25V5.75A1.75 1.75 0 0 1 5.75 4m8.69 2.77c-.16 0-.32.02-.47.06c-.94.26-1.47 1.22-1.23 2.17c.05.15.12.3.21.44l3.23-.88c0-.17-.02-.34-.06-.51c-.21-.75-.9-1.28-1.68-1.28M8.17 8.5c-.17 0-.32 0-.47.05c-.93.26-1.48 1.22-1.23 2.15c.03.16.12.3.21.46l3.23-.88c0-.17-.02-.34-.06-.5A1.72 1.72 0 0 0 8.17 8.5m8.55 2.76l-9.13 2.51a5.266 5.266 0 0 0 5.36 1.64a5.273 5.273 0 0 0 3.77-4.15Z"/></svg>',
26
- 'search': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5l-1.5 1.5l-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16A6.5 6.5 0 0 1 3 9.5A6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14S14 12 14 9.5S12 5 9.5 5Z"/></svg>'
26
+ 'search': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5l-1.5 1.5l-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16A6.5 6.5 0 0 1 3 9.5A6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14S14 12 14 9.5S12 5 9.5 5Z"/></svg>',
27
+ 'drag': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M7 19v-2h2v2H7m4 0v-2h2v2h-2m4 0v-2h2v2h-2m-8-4v-2h2v2H7m4 0v-2h2v2h-2m4 0v-2h2v2h-2m-8-4V9h2v2H7m4 0V9h2v2h-2m4 0V9h2v2h-2M7 7V5h2v2H7m4 0V5h2v2h-2m4 0V5h2v2h-2Z"/></svg>',
28
+ 'setting': '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="currentColor" d="M19.14 12.94c.04-.3.06-.61.06-.94c0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.488.488 0 0 0-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6s3.6 1.62 3.6 3.6s-1.62 3.6-3.6 3.6z"/></svg>'
27
29
  }