diff options
Diffstat (limited to 'packages/frontend/src/components/MkEmojiPicker.section.vue')
| -rw-r--r-- | packages/frontend/src/components/MkEmojiPicker.section.vue | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/packages/frontend/src/components/MkEmojiPicker.section.vue b/packages/frontend/src/components/MkEmojiPicker.section.vue index 08297ea5ba..35de9bbb5e 100644 --- a/packages/frontend/src/components/MkEmojiPicker.section.vue +++ b/packages/frontend/src/components/MkEmojiPicker.section.vue @@ -5,9 +5,10 @@ SPDX-License-Identifier: AGPL-3.0-only <template> <!-- このコンポーネントの要素のclassは親から利用されるのでむやみに弄らないこと --> -<section> +<!-- フォルダの中にはカスタム絵文字だけ(Unicode絵文字もこっち) --> +<section v-if="!hasChildSection" v-panel style="border-radius: 6px; border-bottom: 0.5px solid var(--divider);"> <header class="_acrylic" @click="shown = !shown"> - <i class="toggle ti-fw" :class="shown ? 'ti ti-chevron-down' : 'ti ti-chevron-up'"></i> <slot></slot> ({{ emojis.length }}) + <i class="toggle ti-fw" :class="shown ? 'ti ti-chevron-down' : 'ti ti-chevron-up'"></i> <slot></slot> (<i class="ti ti-icons"></i>:{{ emojis.length }}) </header> <div v-if="shown" class="body"> <button @@ -23,15 +24,52 @@ SPDX-License-Identifier: AGPL-3.0-only </button> </div> </section> +<!-- フォルダの中にはカスタム絵文字やフォルダがある --> +<section v-else v-panel style="border-radius: 6px; border-bottom: 0.5px solid var(--divider);"> + <header class="_acrylic" @click="shown = !shown"> + <i class="toggle ti-fw" :class="shown ? 'ti ti-chevron-down' : 'ti ti-chevron-up'"></i> <slot></slot> (<i class="ti ti-folder ti-fw"></i>:{{ customEmojiTree.length }} <i class="ti ti-icons ti-fw"></i>:{{ emojis.length }}) + </header> + <div v-if="shown" style="padding-left: 9px;"> + <MkEmojiPickerSection + v-for="child in customEmojiTree" + :key="`custom:${child.value}`" + :initialShown="initialShown" + :emojis="computed(() => customEmojis.filter(e => e.category === child.category).map(e => `:${e.name}:`))" + :hasChildSection="child.children.length !== 0" + :customEmojiTree="child.children" + @chosen="nestedChosen" + > + {{ child.value || i18n.ts.other }} + </MkEmojiPickerSection> + </div> + <div v-if="shown" class="body"> + <button + v-for="emoji in emojis" + :key="emoji" + :data-emoji="emoji" + class="_button item" + @pointerenter="computeButtonTitle" + @click="emit('chosen', emoji, $event)" + > + <MkCustomEmoji v-if="emoji[0] === ':'" class="emoji" :name="emoji" :normal="true"/> + <MkEmoji v-else class="emoji" :emoji="emoji" :normal="true"/> + </button> + </div> +</section> </template> <script lang="ts" setup> import { ref, computed, Ref } from 'vue'; -import { getEmojiName } from '@/scripts/emojilist.js'; +import { CustomEmojiFolderTree, getEmojiName } from '@/scripts/emojilist.js'; +import { i18n } from '../i18n.js'; +import { customEmojis } from '@/custom-emojis.js'; +import MkEmojiPickerSection from '@/components/MkEmojiPicker.section.vue'; const props = defineProps<{ emojis: string[] | Ref<string[]>; initialShown?: boolean; + hasChildSection?: boolean; + customEmojiTree?: CustomEmojiFolderTree[]; }>(); const emit = defineEmits<{ @@ -49,4 +87,7 @@ function computeButtonTitle(ev: MouseEvent): void { elm.title = getEmojiName(emoji) ?? emoji; } +function nestedChosen(emoji: any, ev?: MouseEvent) { + emit('chosen', emoji, ev); +} </script> |