vue-intergrall-plugins 0.0.102 → 0.0.108

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,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-intergrall-plugins",
3
- "version": "0.0.102",
3
+ "version": "0.0.108",
4
4
  "description": "",
5
5
  "main": "dist/vue-intergrall-plugins.ssr.js",
6
6
  "browser": "dist/vue-intergrall-plugins.esm.js",
@@ -24,30 +24,30 @@
24
24
  "@fortawesome/fontawesome-svg-core": "^1.2.36",
25
25
  "@fortawesome/free-solid-svg-icons": "^5.15.4",
26
26
  "@fortawesome/vue-fontawesome": "^2.0.2",
27
- "@popperjs/core": "^2.9.3",
28
- "core-js": "^3.16.3",
29
- "emoji-mart-vue": "^2.6.6",
30
- "postcss": "^8.3.6",
27
+ "@popperjs/core": "^2.10.2",
28
+ "core-js": "^3.18.1",
29
+ "postcss": "^8.3.8",
31
30
  "vue-clickaway": "^2.2.2",
32
- "vue-select": "^3.12.3",
31
+ "vue-select": "^3.13.0",
33
32
  "vue-toasted": "^1.1.28"
34
33
  },
35
34
  "devDependencies": {
36
- "@babel/core": "^7.14.6",
37
- "@babel/preset-env": "^7.14.7",
35
+ "@babel/core": "^7.15.5",
36
+ "@babel/preset-env": "^7.15.6",
38
37
  "@rollup/plugin-alias": "^3.1.2",
39
38
  "@rollup/plugin-babel": "^5.3.0",
40
39
  "@rollup/plugin-commonjs": "^14.0.0",
40
+ "@rollup/plugin-json": "^4.1.0",
41
41
  "@rollup/plugin-node-resolve": "^9.0.0",
42
42
  "@rollup/plugin-replace": "^2.4.2",
43
43
  "@vue/cli-plugin-babel": "^4.5.13",
44
44
  "@vue/cli-service": "^4.5.13",
45
- "autoprefixer": "^10.2.4",
45
+ "autoprefixer": "^10.3.6",
46
46
  "cross-env": "^7.0.3",
47
47
  "cssnano": "^4.1.10",
48
48
  "minimist": "^1.2.5",
49
49
  "rimraf": "^3.0.2",
50
- "rollup": "^2.52.8",
50
+ "rollup": "^2.58.0",
51
51
  "rollup-plugin-terser": "^7.0.2",
52
52
  "rollup-plugin-vue": "^5.1.9",
53
53
  "vue": "^2.6.14",
@@ -0,0 +1,125 @@
1
+ <template>
2
+ <div class="emoji-text-container" v-on-clickaway="away">
3
+ <div
4
+ class="emoji-text-btn"
5
+ @click="toggleEmojiSelection()"
6
+ v-text="String.fromCodePoint(0x1f61c)"
7
+ >
8
+ </div>
9
+ <transition name="show-y">
10
+ <Picker v-show="showEmojis" ref="sm-emoji-picker" @insert-emoji="insertEmoji" />
11
+ </transition>
12
+ </div>
13
+ </template>
14
+
15
+ <script>
16
+
17
+ import Picker from "./Picker"
18
+ import { mixin as clickaway } from 'vue-clickaway'
19
+
20
+ export default {
21
+ components: { Picker },
22
+ mixins: [ clickaway ],
23
+ props: {
24
+ emojiId: {
25
+ type: String,
26
+ required: true
27
+ },
28
+ biggerTextarea: {
29
+ type: Boolean,
30
+ default: true,
31
+ required: false
32
+ },
33
+ small: {
34
+ type: Boolean,
35
+ default: false,
36
+ required: false
37
+ },
38
+ up: {
39
+ type: Boolean,
40
+ default: true,
41
+ required: false
42
+ },
43
+ down: {
44
+ type: Boolean,
45
+ default: false,
46
+ required: false
47
+ },
48
+ left: {
49
+ type: Boolean,
50
+ default: true,
51
+ required: false
52
+ }
53
+ },
54
+ computed: {
55
+ height() {
56
+ if(this.small) return 225
57
+ return 325
58
+ },
59
+ top() {
60
+ if(!this.down) return -(this.height + (!this.biggerTextarea ? 5 : 30) )
61
+ return 40
62
+ }
63
+ },
64
+ data(){
65
+ return{
66
+ showEmojis: false
67
+ }
68
+ },
69
+ created() {
70
+ this.$root.$refs[`etf-${this.emojiId}`] = this
71
+ },
72
+ watch: {
73
+ showEmojis() {
74
+ if(this.showEmojis) this.setPosition("sm-emoji-picker")
75
+ }
76
+ },
77
+ methods: {
78
+ setPosition(refId) {
79
+ try {
80
+ this.$nextTick(() => {
81
+ const elem = this.$refs[refId] ? this.$refs[refId].$el ? this.$refs[refId].$el : this.$refs[refId] : this.$refs[refId] ? this.$refs[refId] : false
82
+ if(elem){
83
+ elem.style.position = "absolute"
84
+ elem.style.top = `${this.top}px`
85
+ elem.style.left = "0"
86
+ elem.style.height = `${this.height}px`
87
+ }
88
+ })
89
+ }catch(e) {
90
+ console.error("Erro ao setar a posicao dos emojis")
91
+ console.error(e)
92
+ }
93
+ },
94
+ insertEmoji(emoji) {
95
+ this.$emit("insert-emoji", emoji)
96
+ },
97
+ toggleEmojiSelection() {
98
+ this.showEmojis = !this.showEmojis
99
+ },
100
+ away() {
101
+ this.showEmojis = false
102
+ }
103
+ }
104
+ }
105
+ </script>
106
+
107
+ <style>
108
+ .show-y-enter-active,
109
+ .show-y-leave-enter {
110
+ opacity: 1;
111
+ transform: translateY(0);
112
+ transition: all 200ms linear;
113
+ }
114
+ .show-y-enter,
115
+ .show-y-leave-to {
116
+ opacity: 0;
117
+ transform: translateY(5%);
118
+ }
119
+
120
+ .emoji-text-container {
121
+ position: relative; }
122
+ .emoji-text-container .emoji-text-btn {
123
+ font-size: 1.2rem;
124
+ cursor: pointer; }
125
+ </style>
@@ -1,11 +1,17 @@
1
1
  <template>
2
- <div class="text-footer-actions--btn" @click="$emit('expand-textarea')">
2
+ <div class="text-footer-actions--btn" @click="$emit('expand-textarea')" :title="dictionary.title_expandir_textarea">
3
3
  <fa-icon :icon="['fas', 'expand-alt']" />
4
4
  </div>
5
5
  </template>
6
6
 
7
7
  <script>
8
8
  export default {
9
-
9
+ props: {
10
+ dictionary: {
11
+ type: Object,
12
+ default: {},
13
+ required: false
14
+ }
15
+ }
10
16
  }
11
17
  </script>
@@ -12,7 +12,7 @@
12
12
  >
13
13
  </textarea>
14
14
  <div class="expand-textarea-footer">
15
- <EmojisTextFooter
15
+ <BtnEmojis
16
16
  v-show="buttons.hasEmojis"
17
17
  :ref="`${identifier}-emojis`"
18
18
  :emojiId="`${identifier}-em`"
@@ -38,12 +38,12 @@
38
38
 
39
39
  <script>
40
40
  import { mixin as clickaway } from "vue-clickaway"
41
- import EmojisTextFooter from "./EmojisTextFooter"
41
+ import BtnEmojis from "./BtnEmojis"
42
42
  import BtnFiles from "./BtnFiles"
43
43
  import { returnMessageWithHexa } from "@/services/textFormatting"
44
44
 
45
45
  export default {
46
- components: { EmojisTextFooter, BtnFiles },
46
+ components: { BtnEmojis, BtnFiles },
47
47
  mixins: [ clickaway ],
48
48
  props: {
49
49
  identifier: {
@@ -245,14 +245,26 @@ export default {
245
245
  insertEmoji(emoji) {
246
246
  try {
247
247
  const textarea = this.$refs[`${this.identifier}`]
248
+ console.log("emoji: ", emoji)
248
249
  console.log(textarea)
249
- this.focusTextarea()
250
- const cursorStart = textarea.selectionStart
251
- const cursorEnd = textarea.selectionEnd
252
- this.message = this.message.slice(0, cursorStart) + emoji.native + this.message.slice(cursorEnd)
250
+ if (document.activeElement === textarea) {
251
+ const cursorStart = textarea.selectionStart
252
+ const cursorEnd = textarea.selectionEnd
253
+ if (cursorEnd == textarea.value.length) {
254
+ this.message += emoji.finalEmoji
255
+ textarea.setSelectionRange(textarea.value.length, textarea.value.length);
256
+ } else {
257
+ const initValue = textarea.value.slice(0, cursorStart) + emoji.finalEmoji;
258
+ const endValue = textarea.value.slice(cursorEnd)
259
+ this.message = initValue + endValue
260
+ textarea.setSelectionRange(initValue.length, initValue.length);
261
+ }
262
+ } else {
263
+ this.message += emoji.finalEmoji
264
+ }
253
265
  this.sendFinalMessage()
254
266
  }catch(e) {
255
- console.error("Erro na insercao de emojis")
267
+ console.error("Erro ao inserir emoji")
256
268
  console.error(e)
257
269
  }
258
270
  }
@@ -0,0 +1,369 @@
1
+ <template>
2
+ <div class="sm-emoji-picker box-shadow">
3
+ <SkeletonPicker v-if="loading" />
4
+ <div class="sm-emoji-header">
5
+ <span
6
+ class="sm-emoji-link"
7
+ v-for="(category, indexCategoryHeader) in allEmojis.categories"
8
+ :key="`ich-${indexCategoryHeader}`"
9
+ :title="category.name"
10
+ :class="{'active' : categoriaSelecionada == category.id}"
11
+ @click="pickerHeaderHandler($event, category.id)"
12
+ v-html="`<a href='#${category.id}'>${category.svg}</a>`"
13
+ ></span>
14
+ </div>
15
+ <div class="sm-emoji-scroll" ref="sm-scroll">
16
+ <div class="sm-emoji-search" ref="sm-search">
17
+ <input type="text" name="emoji-search" @input="filterEmojis" v-model="search" />
18
+ </div>
19
+ <template v-if="!filteredList.length">
20
+ <div v-for="(category, indexCategory) in allEmojis.categories" :key="`ic-${indexCategory}`">
21
+ <div class="sm-emoji-selection">
22
+ <span class="sm-emoji-title" :id="category.id" v-html="`${category.svg} ${category.name}`" :title="category.name"></span>
23
+ <div class="sm-emoji-group">
24
+ <div class="sm-emoji-item" v-for="(emojiKey, key) in category.emojis" :key="`ee-${key}-${category.id}`">
25
+ <span @click="addEmoji(allEmojis.emojis[emojiKey], emojiKey)"> {{ allEmojis.emojis[emojiKey].finalEmoji }} </span>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </template>
31
+ <template v-else>
32
+ <div class="sm-emoji-group">
33
+ <div class="sm-emoji-item" v-for="(emoji, key) in filteredList" :key="`ees-${key}`">
34
+ <span @click="addEmoji(emoji)"> {{ emoji.finalEmoji }} </span>
35
+ </div>
36
+ </div>
37
+ </template>
38
+ </div>
39
+ </div>
40
+ </template>
41
+
42
+ <script>
43
+ import allEmojis from "@/services/emojis/all.json"
44
+ import SkeletonPicker from "./SkeletonPicker"
45
+
46
+ export default {
47
+ components: { SkeletonPicker },
48
+ data() {
49
+ return {
50
+ allEmojis: {},
51
+ categoriaSelecionada: "",
52
+ search: "",
53
+ filteredList: [],
54
+ loading: true,
55
+ isSticky: false
56
+ }
57
+ },
58
+ mounted() {
59
+ this.allEmojis = allEmojis
60
+ this.loadEmojis()
61
+ },
62
+ methods: {
63
+ addEmojiToArray() {
64
+ try {
65
+ for(let key in this.allEmojis.emojis) {
66
+ const keyCode = this.allEmojis.emojis[key]
67
+ if(keyCode && keyCode.hasOwnProperty("finalEmoji")) continue
68
+ const { b } = keyCode
69
+ const hexPoints = b.split(/\s|-/)
70
+ const codePoints = hexPoints.map(hex => {
71
+ return parseInt(hex, 16)
72
+ })
73
+ const finalEmoji = String.fromCodePoint.apply(null, codePoints)
74
+ this.$set(this.allEmojis.emojis[key], "hexa", hexPoints.join(""))
75
+ this.$set(this.allEmojis.emojis[key], "finalEmoji", finalEmoji)
76
+ }
77
+ }catch(e) {
78
+ console.error("Erro ao gerar os emojis")
79
+ console.error(e)
80
+ }
81
+ },
82
+ emojiHeaders() {
83
+ try {
84
+ const emojis = {
85
+ recent: {
86
+ name: "Recentes",
87
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M13 4h-2l-.001 7H9v2h2v2h2v-2h4v-2h-4z"></path><path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10"></path></svg>`
88
+ },
89
+ people: {
90
+ name: "Pessoas & Expressoes",
91
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10"></path><path d="M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0"></path></svg>`
92
+ },
93
+ nature: {
94
+ name: "Animais & Natureza",
95
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M15.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 15.5 8M8.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 8.5 8"></path><path d="M18.933 0h-.027c-.97 0-2.138.787-3.018 1.497-1.274-.374-2.612-.51-3.887-.51-1.285 0-2.616.133-3.874.517C7.245.79 6.069 0 5.093 0h-.027C3.352 0 .07 2.67.002 7.026c-.039 2.479.276 4.238 1.04 5.013.254.258.882.677 1.295.882.191 3.177.922 5.238 2.536 6.38.897.637 2.187.949 3.2 1.102C8.04 20.6 8 20.795 8 21c0 1.773 2.35 3 4 3 1.648 0 4-1.227 4-3 0-.201-.038-.393-.072-.586 2.573-.385 5.435-1.877 5.925-7.587.396-.22.887-.568 1.104-.788.763-.774 1.079-2.534 1.04-5.013C23.929 2.67 20.646 0 18.933 0M3.223 9.135c-.237.281-.837 1.155-.884 1.238-.15-.41-.368-1.349-.337-3.291.051-3.281 2.478-4.972 3.091-5.031.256.015.731.27 1.265.646-1.11 1.171-2.275 2.915-2.352 5.125-.133.546-.398.858-.783 1.313M12 22c-.901 0-1.954-.693-2-1 0-.654.475-1.236 1-1.602V20a1 1 0 1 0 2 0v-.602c.524.365 1 .947 1 1.602-.046.307-1.099 1-2 1m3-3.48v.02a4.752 4.752 0 0 0-1.262-1.02c1.092-.516 2.239-1.334 2.239-2.217 0-1.842-1.781-2.195-3.977-2.195-2.196 0-3.978.354-3.978 2.195 0 .883 1.148 1.701 2.238 2.217A4.8 4.8 0 0 0 9 18.539v-.025c-1-.076-2.182-.281-2.973-.842-1.301-.92-1.838-3.045-1.853-6.478l.023-.041c.496-.826 1.49-1.45 1.804-3.102 0-2.047 1.357-3.631 2.362-4.522C9.37 3.178 10.555 3 11.948 3c1.447 0 2.685.192 3.733.57 1 .9 2.316 2.465 2.316 4.48.313 1.651 1.307 2.275 1.803 3.102.035.058.068.117.102.178-.059 5.967-1.949 7.01-4.902 7.19m6.628-8.202c-.037-.065-.074-.13-.113-.195a7.587 7.587 0 0 0-.739-.987c-.385-.455-.648-.768-.782-1.313-.076-2.209-1.241-3.954-2.353-5.124.531-.376 1.004-.63 1.261-.647.636.071 3.044 1.764 3.096 5.031.027 1.81-.347 3.218-.37 3.235"></path></svg>`
96
+ },
97
+ foods: {
98
+ name: "Comidas & Bebibas",
99
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M17 4.978c-1.838 0-2.876.396-3.68.934.513-1.172 1.768-2.934 4.68-2.934a1 1 0 0 0 0-2c-2.921 0-4.629 1.365-5.547 2.512-.064.078-.119.162-.18.244C11.73 1.838 10.798.023 9.207.023 8.579.022 7.85.306 7 .978 5.027 2.54 5.329 3.902 6.492 4.999 3.609 5.222 0 7.352 0 12.969c0 4.582 4.961 11.009 9 11.009 1.975 0 2.371-.486 3-1 .629.514 1.025 1 3 1 4.039 0 9-6.418 9-11 0-5.953-4.055-8-7-8M8.242 2.546c.641-.508.943-.523.965-.523.426.169.975 1.405 1.357 3.055-1.527-.629-2.741-1.352-2.98-1.846.059-.112.241-.356.658-.686M15 21.978c-1.08 0-1.21-.109-1.559-.402l-.176-.146c-.367-.302-.816-.452-1.266-.452s-.898.15-1.266.452l-.176.146c-.347.292-.477.402-1.557.402-2.813 0-7-5.389-7-9.009 0-5.823 4.488-5.991 5-5.991 1.939 0 2.484.471 3.387 1.251l.323.276a1.995 1.995 0 0 0 2.58 0l.323-.276c.902-.78 1.447-1.251 3.387-1.251.512 0 5 .168 5 6 0 3.617-4.187 9-7 9"></path></svg>`
100
+ },
101
+ activity: {
102
+ name: "Atividades",
103
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 0C5.373 0 0 5.372 0 12c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.628-5.372-12-12-12m9.949 11H17.05c.224-2.527 1.232-4.773 1.968-6.113A9.966 9.966 0 0 1 21.949 11M13 11V2.051a9.945 9.945 0 0 1 4.432 1.564c-.858 1.491-2.156 4.22-2.392 7.385H13zm-2 0H8.961c-.238-3.165-1.536-5.894-2.393-7.385A9.95 9.95 0 0 1 11 2.051V11zm0 2v8.949a9.937 9.937 0 0 1-4.432-1.564c.857-1.492 2.155-4.221 2.393-7.385H11zm4.04 0c.236 3.164 1.534 5.893 2.392 7.385A9.92 9.92 0 0 1 13 21.949V13h2.04zM4.982 4.887C5.718 6.227 6.726 8.473 6.951 11h-4.9a9.977 9.977 0 0 1 2.931-6.113M2.051 13h4.9c-.226 2.527-1.233 4.771-1.969 6.113A9.972 9.972 0 0 1 2.051 13m16.967 6.113c-.735-1.342-1.744-3.586-1.968-6.113h4.899a9.961 9.961 0 0 1-2.931 6.113"></path></svg>`
104
+ },
105
+ places: {
106
+ name: "Viagens & Lugares",
107
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M6.5 12C5.122 12 4 13.121 4 14.5S5.122 17 6.5 17 9 15.879 9 14.5 7.878 12 6.5 12m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5M17.5 12c-1.378 0-2.5 1.121-2.5 2.5s1.122 2.5 2.5 2.5 2.5-1.121 2.5-2.5-1.122-2.5-2.5-2.5m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5"></path><path d="M22.482 9.494l-1.039-.346L21.4 9h.6c.552 0 1-.439 1-.992 0-.006-.003-.008-.003-.008H23c0-1-.889-2-1.984-2h-.642l-.731-1.717C19.262 3.012 18.091 2 16.764 2H7.236C5.909 2 4.738 3.012 4.357 4.283L3.626 6h-.642C1.889 6 1 7 1 8h.003S1 8.002 1 8.008C1 8.561 1.448 9 2 9h.6l-.043.148-1.039.346a2.001 2.001 0 0 0-1.359 2.097l.751 7.508a1 1 0 0 0 .994.901H3v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h6v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h1.096a.999.999 0 0 0 .994-.901l.751-7.508a2.001 2.001 0 0 0-1.359-2.097M6.273 4.857C6.402 4.43 6.788 4 7.236 4h9.527c.448 0 .834.43.963.857L19.313 9H4.688l1.585-4.143zM7 21H5v-1h2v1zm12 0h-2v-1h2v1zm2.189-3H2.811l-.662-6.607L3 11h18l.852.393L21.189 18z"></path></svg>`
108
+ },
109
+ objects: {
110
+ name: "Objetos",
111
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 0a9 9 0 0 0-5 16.482V21s2.035 3 5 3 5-3 5-3v-4.518A9 9 0 0 0 12 0zm0 2c3.86 0 7 3.141 7 7s-3.14 7-7 7-7-3.141-7-7 3.14-7 7-7zM9 17.477c.94.332 1.946.523 3 .523s2.06-.19 3-.523v.834c-.91.436-1.925.689-3 .689a6.924 6.924 0 0 1-3-.69v-.833zm.236 3.07A8.854 8.854 0 0 0 12 21c.965 0 1.888-.167 2.758-.451C14.155 21.173 13.153 22 12 22c-1.102 0-2.117-.789-2.764-1.453z"></path><path d="M14.745 12.449h-.004c-.852-.024-1.188-.858-1.577-1.824-.421-1.061-.703-1.561-1.182-1.566h-.009c-.481 0-.783.497-1.235 1.537-.436.982-.801 1.811-1.636 1.791l-.276-.043c-.565-.171-.853-.691-1.284-1.794-.125-.313-.202-.632-.27-.913-.051-.213-.127-.53-.195-.634C7.067 9.004 7.039 9 6.99 9A1 1 0 0 1 7 7h.01c1.662.017 2.015 1.373 2.198 2.134.486-.981 1.304-2.058 2.797-2.075 1.531.018 2.28 1.153 2.731 2.141l.002-.008C14.944 8.424 15.327 7 16.979 7h.032A1 1 0 1 1 17 9h-.011c-.149.076-.256.474-.319.709a6.484 6.484 0 0 1-.311.951c-.429.973-.79 1.789-1.614 1.789"></path></svg>`
112
+ },
113
+ symbols: {
114
+ name: "Simbolos",
115
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z"></path></svg>`
116
+ },
117
+ flags: {
118
+ name: "Bandeiras",
119
+ svg: `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"></path><line x1="4" y1="22" x2="4" y2="15"></line></svg>`
120
+ }
121
+ }
122
+
123
+ if(this.allEmojis.categories[0].id != "recent") this.allEmojis.categories.unshift({ emojis: this.getRecentEmojis(), id: "recent", name: "" })
124
+ this.allEmojis.categories = this.allEmojis.categories.filter(cat => {
125
+ const { id } = cat
126
+ if(emojis[id]) {
127
+ cat.name = emojis[id].name
128
+ cat.svg = emojis[id].svg
129
+ return cat
130
+ }
131
+ })
132
+
133
+
134
+ }catch(e) {
135
+ console.error("Erro ao gerar os emojis headers")
136
+ console.error(e)
137
+ }
138
+
139
+ },
140
+ loadEmojis() {
141
+ try {
142
+ this.emojiHeaders()
143
+ this.addEmojiToArray()
144
+ setTimeout(() => { this.loading = false; }, 1500)
145
+ }catch(e) {
146
+ console.error("Erro ao carregar os emojis")
147
+ console.error(e)
148
+ }
149
+ },
150
+ getRecentEmojis() {
151
+ const recentEmojis = localStorage.getItem("recent-emojis")
152
+ if(recentEmojis) return recentEmojis.split(",")
153
+ return []
154
+ },
155
+ setEmojiOnLocalStorage(emojiKey) {
156
+ try {
157
+ let finalStr = ""
158
+ const recentEmojis = localStorage.getItem("recent-emojis")
159
+ if(recentEmojis) {
160
+ const arrRecent = recentEmojis.split(",")
161
+ if(!arrRecent.includes(emojiKey)) {
162
+ if(arrRecent.length < 20) {
163
+ finalStr = `${emojiKey},${recentEmojis}`
164
+ }else {
165
+ arrRecent.pop()
166
+ finalStr = `${emojiKey},${arrRecent.join(",")}`
167
+ }
168
+ }
169
+ }else {
170
+ finalStr = `${emojiKey}`
171
+ }
172
+ if(finalStr) {
173
+ localStorage.setItem("recent-emojis", finalStr)
174
+ const finalArr = finalStr.split(",").filter(str => { return str ? str : false })
175
+ this.allEmojis.categories[0].emojis = finalArr
176
+ }
177
+ }catch(e) {
178
+ console.error("Erro ao setar o emoji no localStorage")
179
+ console.error(e)
180
+ }
181
+
182
+ },
183
+ addEmoji(emoji, emojiKey){
184
+ this.setEmojiOnLocalStorage(emojiKey)
185
+ this.$emit("insert-emoji", emoji)
186
+ },
187
+ pickerHeaderHandler(e, id) {
188
+ try {
189
+ const { target } = e
190
+ const { children } = target
191
+ if(children.length) {
192
+ const tag = children[0]
193
+ tag.getAttribute("href") ? tag.click() : ""
194
+ }
195
+ this.categoriaSelecionada = id
196
+ }catch(e) {
197
+ console.error("Erro ao mudar de categoria")
198
+ console.error(e)
199
+ }
200
+ },
201
+ filterEmojis() {
202
+ if(!this.search.trim("")) return this.filteredList = []
203
+
204
+ const rawList = []
205
+ for(let key in this.allEmojis.emojis) {
206
+ const emoji = this.allEmojis.emojis[key]
207
+ const { a } = emoji
208
+ const search = this.search.toUpperCase()
209
+ const upperA = a.toUpperCase()
210
+ if(upperA.indexOf(search) >= 0) rawList.push(emoji)
211
+ }
212
+ if(rawList.length) {
213
+ this.filteredList = rawList
214
+ }else {
215
+ this.filteredList = []
216
+ }
217
+ console.log("this.filteredList: ", this.filteredList)
218
+ }
219
+ }
220
+ }
221
+ </script>
222
+
223
+ <style>
224
+ .box-shadow {
225
+ -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
226
+ -moz-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
227
+ box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
228
+ }
229
+
230
+ .sm-emoji-picker {
231
+ width: 310px;
232
+ z-index: 2;
233
+ border: 1px solid #CCC;
234
+ border-radius: 5px;
235
+ background-color: #FFF;
236
+ display: flex;
237
+ flex-direction: column;
238
+ }
239
+
240
+ .sm-emoji-header {
241
+ width: 100%;
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: space-between;
245
+ margin: 10px 0;
246
+ border-bottom: 1px solid #CCC;
247
+ }
248
+
249
+ .sm-emoji-link {
250
+ padding: 0 5px 5px 5px;
251
+ display: flex;
252
+ justify-content: center;
253
+ align-items: center;
254
+ cursor: pointer;
255
+ opacity: .9;
256
+ transition: all 200ms;
257
+ border-bottom: 2px solid transparent;
258
+ }
259
+ .sm-emoji-link a {
260
+ margin: 0;
261
+ padding: 0;
262
+ fill: #999;
263
+ }
264
+ .sm-emoji-link:hover a > svg, .sm-emoji-link.active a > svg {
265
+ opacity: 1;
266
+ fill: #666;
267
+ }
268
+ .sm-emoji-link:hover a > svg[stroke-linecap], .sm-emoji-link.active a > svg[stroke-linecap] {
269
+ opacity: 1;
270
+ fill: transparent;
271
+ stroke: #666;
272
+ }
273
+ .sm-emoji-link.active {
274
+ border-bottom: 2px solid #666
275
+ }
276
+
277
+ .sm-emoji-scroll {
278
+ width: 100%;
279
+ height: calc(100% - 52px);
280
+ max-height: calc(100% - 52px);
281
+ scroll-behavior: smooth;
282
+ overflow-y: auto;
283
+ overflow-x: hidden;
284
+ scrollbar-color: #888 rgba(0, 0, 0, 0.2);
285
+ scrollbar-width: 8px;
286
+ position: relative;
287
+ }
288
+ .sm-emoji-scroll::-webkit-scrollbar{
289
+ width: 8px;
290
+ }
291
+
292
+ .sm-emoji-scroll::-webkit-scrollbar-track{
293
+ background-color: rgba(0, 0, 0, 0.2);
294
+ }
295
+
296
+ .sm-emoji-scroll::-webkit-scrollbar-thumb{
297
+ transition-duration: .5s;
298
+ background-color: #666
299
+ }
300
+
301
+ .sm-emoji-scroll::-webkit-scrollbar-thumb:hover{
302
+ background-color: #555
303
+ }
304
+
305
+ .sm-emoji-search {
306
+ width: 100%;
307
+ display: flex;
308
+ align-items: center;
309
+ justify-content: center;
310
+ position: sticky;
311
+ top: 0;
312
+ z-index: 1;
313
+ background: #FFF;
314
+ padding-bottom: 10px;
315
+ }
316
+ .sm-emoji-search > input {
317
+ width: 90%;
318
+ outline: none;
319
+ border: 1px solid #CCC;
320
+ border-radius: 2.5px;
321
+ padding: 5px 10px;
322
+ transition: border 200ms;
323
+ }
324
+ .sm-emoji-search > input:focus, .sm-emoji-search > input:active, .sm-emoji-search > input:hover {
325
+ outline: none;
326
+ border: 1px solid #999;
327
+ }
328
+ .sm-emoji-search.sticky {
329
+ position: fixed;
330
+ width: 310px;
331
+ background-color: #FFF;
332
+ }
333
+
334
+ .sm-emoji-selection {
335
+ width: 100%;
336
+ margin-bottom: 10px;
337
+ }
338
+ .sm-emoji-title {
339
+ width: 100%;
340
+ display: flex;
341
+ justify-content: flex-start;
342
+ align-items: center;
343
+ background-color: #F7F7F7;
344
+ padding: 5px 0;
345
+ white-space: nowrap;
346
+ text-overflow: ellipsis;
347
+ overflow: hidden;
348
+ }
349
+ .sm-emoji-title svg {
350
+ margin: 0 5px;
351
+ }
352
+
353
+ .sm-emoji-group {
354
+ width: 100%;
355
+ display: flex;
356
+ flex-wrap: wrap;
357
+ font-size: 1.375rem
358
+ }
359
+
360
+ .sm-emoji-item {
361
+ cursor: pointer;
362
+ opacity: .8;
363
+ transition: opacity 200ms;
364
+ margin: 3.5px;
365
+ }
366
+ .sm-emoji-item:hover {
367
+ opacity: 1;
368
+ }
369
+ </style>