renusify 2.3.1 → 2.4.0

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.
@@ -0,0 +1,103 @@
1
+ @use "../../style/variables/base";
2
+
3
+ .#{base.$prefix}highlight {
4
+ direction: ltr;
5
+ text-align: left;
6
+ white-space: pre;
7
+ padding: 30px 20px;
8
+ color: #f8f8f2;
9
+ background: #1a1a1c;
10
+ box-shadow: 0 0 5px #fff;
11
+ text-shadow: none;
12
+ font: normal 18px Consolas, "Courier New", Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
13
+ line-height: 24px;
14
+ box-sizing: border-box;
15
+
16
+ &::selection {
17
+ background: #bdf5
18
+ }
19
+
20
+ > div {
21
+ display: flex;
22
+ overflow: auto
23
+ }
24
+
25
+ > div :last-child {
26
+ flex: 1;
27
+ outline: none
28
+ }
29
+
30
+ &:before {
31
+ color: #6f9aff
32
+ }
33
+
34
+ .highlight-numbers {
35
+ padding-left: 5px;
36
+ counter-reset: line;
37
+
38
+ div {
39
+ padding-right: 5px;
40
+
41
+ &::before {
42
+ color: #fff;
43
+ display: block;
44
+ content: counter(line);
45
+ opacity: .5;
46
+ text-align: right;
47
+ margin-right: 5px;
48
+ counter-increment: line
49
+ }
50
+ }
51
+ }
52
+
53
+ .highlight-syn-cmnt {
54
+ font-style: italic
55
+ }
56
+
57
+
58
+ .highlight-lang-http .highlight-syn-kwd {
59
+ background: #25f;
60
+ color: #fff;
61
+ padding: 0px 5px;
62
+ border-radius: 5px
63
+ }
64
+
65
+ .highlight-syn-deleted,
66
+ .highlight-syn-err,
67
+ .highlight-syn-var {
68
+ color: #ff5261
69
+ }
70
+
71
+ .highlight-syn-section,
72
+ .highlight-syn-kwd {
73
+ color: #ff7cc6
74
+ }
75
+
76
+ .highlight-syn-class {
77
+ color: #eab07c
78
+ }
79
+
80
+ .highlight-numbers,
81
+ .highlight-syn-cmnt {
82
+ color: #7d828b
83
+ }
84
+
85
+ .highlight-syn-insert,
86
+ .highlight-syn-type,
87
+ .highlight-syn-func,
88
+ .highlight-syn-bool {
89
+ color: #71d58a
90
+ }
91
+
92
+ .highlight-syn-num {
93
+ color: #b581fd
94
+ }
95
+
96
+ .highlight-syn-oper {
97
+ color: #80c6ff
98
+ }
99
+
100
+ .highlight-syn-str {
101
+ color: #4dacfa
102
+ }
103
+ }
@@ -79,6 +79,7 @@ export * as rTimeAgo from './timeAgo/index.js'
79
79
  export * as rTimeline from './timeline/index.js'
80
80
  export * as rTour from './tour/index.js'
81
81
  export * as rTree from './tree/index.js'
82
+ export * as rHighlight from './highlight/index.js'
82
83
 
83
84
  export const _register = (app, components) => {
84
85
  let d = {}
@@ -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/index.js CHANGED
@@ -68,7 +68,6 @@ export default {
68
68
  'en': {
69
69
  first_day: 0,
70
70
  time_zone_offset: -480,/*Standard timezone offset minutes -07:00*/
71
- daylight_saving_time: true,
72
71
  localizeName: 'en-US',
73
72
  timeZone: 'America/Los_Angeles',
74
73
  rtl: false
@@ -76,7 +75,6 @@ export default {
76
75
  'fa': {
77
76
  first_day: 6,
78
77
  time_zone_offset: 210,//Standard timezone offset minutes +03:30
79
- daylight_saving_time: false,
80
78
  localizeName: 'fa-IR',
81
79
  timeZone: 'Asia/Tehran',
82
80
  calendar: 'persian',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "renusify",
3
- "version": "2.3.1",
3
+ "version": "2.4.0",
4
4
  "description": "Vue3 Framework",
5
5
  "keywords": [
6
6
  "vuejs",
package/style/app.scss CHANGED
@@ -16,13 +16,13 @@ html {
16
16
 
17
17
  & {
18
18
  text-rendering: optimizeLegibility;
19
- -webkit-font-smoothing: antialiased;
20
- -moz-osx-font-smoothing: grayscale;
21
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
22
- box-sizing: border-box;
23
- overflow-y: scroll;
24
- overflow-x: hidden;
25
- -webkit-text-size-adjust: 100%;
19
+ -webkit-font-smoothing: antialiased;
20
+ -moz-osx-font-smoothing: grayscale;
21
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
22
+ box-sizing: border-box;
23
+ overflow-y: scroll;
24
+ overflow-x: hidden;
25
+ -webkit-text-size-adjust: 100%;
26
26
  scroll-behavior: smooth;
27
27
  }
28
28
  ;
@@ -150,27 +150,27 @@ $color-text: var(--color-on-one);
150
150
  @include mixins.typography(base.$headings, 'display-3')
151
151
  }
152
152
 
153
- .headline-1 {
153
+ .headline-1, h1 {
154
154
  @include mixins.typography(base.$headings, 'headline-1')
155
155
  }
156
156
 
157
- .headline-2 {
157
+ .headline-2, h2 {
158
158
  @include mixins.typography(base.$headings, 'headline-2')
159
159
  }
160
160
 
161
- .headline-3 {
161
+ .headline-3, h3 {
162
162
  @include mixins.typography(base.$headings, 'headline-3')
163
163
  }
164
164
 
165
- .title-1 {
165
+ .title-1, h4 {
166
166
  @include mixins.typography(base.$headings, 'title-1')
167
167
  }
168
168
 
169
- .title-2 {
169
+ .title-2, h5 {
170
170
  @include mixins.typography(base.$headings, 'title-2');
171
171
  }
172
172
 
173
- .title-3 {
173
+ .title-3, h6 {
174
174
  @include mixins.typography(base.$headings, 'title-3');
175
175
  }
176
176
 
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
  }