Merge tag '2023.12.0-beta.6' into merge-upstream

This commit is contained in:
riku6460
2023-12-21 11:56:34 +09:00
251 changed files with 2328 additions and 1176 deletions

View File

@@ -82,7 +82,8 @@ export function userDetailed(id = 'someuserid', username = 'miskist', host = 'mi
birthday: '2014-06-20',
createdAt: '2016-12-28T22:49:51.000Z',
description: 'I am a cool user!',
ffVisibility: 'public',
followingVisibility: 'public',
followersVisibility: 'public',
roles: [],
fields: [
{

View File

@@ -25,7 +25,7 @@ export const commonHandlers = [
}),
rest.get('/twemoji/:codepoints.svg', async (req, res, ctx) => {
const { codepoints } = req.params;
const value = await fetch(`https://unpkg.com/@discordapp/twemoji@14.1.2/dist/svg/${codepoints}.svg`).then((response) => response.blob());
const value = await fetch(`https://unpkg.com/@discordapp/twemoji@15.0.2/dist/svg/${codepoints}.svg`).then((response) => response.blob());
return res(ctx.set('Content-Type', 'image/svg+xml'), ctx.body(value));
}),
];

View File

@@ -17,7 +17,7 @@
"lint": "pnpm typecheck && pnpm eslint"
},
"dependencies": {
"@discordapp/twemoji": "14.1.2",
"@discordapp/twemoji": "15.0.2",
"@github/webauthn-json": "2.1.1",
"@rollup/plugin-json": "6.1.0",
"@rollup/plugin-replace": "5.0.5",
@@ -25,11 +25,12 @@
"@rollup/pluginutils": "5.1.0",
"@syuilo/aiscript": "0.16.0",
"@tabler/icons-webfont": "2.44.0",
"@twemoji/parser": "15.0.0",
"@vitejs/plugin-vue": "4.5.2",
"@vue/compiler-sfc": "3.3.11",
"@vue/compiler-sfc": "3.3.12",
"aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.0.6",
"astring": "1.8.6",
"broadcast-channel": "6.0.0",
"broadcast-channel": "7.0.0",
"browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3",
"buraha": "0.0.1",
"canvas-confetti": "1.6.1",
@@ -51,11 +52,11 @@
"is-file-animated": "1.0.2",
"json5": "2.2.3",
"matter-js": "0.19.0",
"mfm-js": "0.23.3",
"mfm-js": "0.24.0",
"misskey-js": "workspace:*",
"photoswipe": "5.4.3",
"punycode": "2.3.1",
"rollup": "4.9.0",
"rollup": "4.9.1",
"sanitize-html": "2.11.0",
"sass": "1.69.5",
"shiki": "0.14.7",
@@ -66,12 +67,11 @@
"tinycolor2": "1.6.0",
"tsc-alias": "1.8.8",
"tsconfig-paths": "4.2.0",
"twemoji-parser": "14.0.0",
"typescript": "5.3.3",
"uuid": "9.0.1",
"v-code-diff": "1.7.2",
"vite": "5.0.10",
"vue": "3.3.11",
"vue": "3.3.12",
"vuedraggable": "next"
},
"devDependencies": {
@@ -98,7 +98,7 @@
"@types/estree": "1.0.5",
"@types/matter-js": "0.19.5",
"@types/micromatch": "4.0.6",
"@types/node": "20.10.4",
"@types/node": "20.10.5",
"@types/punycode": "2.1.3",
"@types/sanitize-html": "2.9.5",
"@types/throttle-debounce": "5.0.2",
@@ -108,7 +108,7 @@
"@typescript-eslint/eslint-plugin": "6.14.0",
"@typescript-eslint/parser": "6.14.0",
"@vitest/coverage-v8": "0.34.6",
"@vue/runtime-core": "3.3.11",
"@vue/runtime-core": "3.3.12",
"acorn": "8.11.2",
"cross-env": "7.0.3",
"cypress": "13.6.1",

View File

@@ -3,16 +3,16 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent, App } from 'vue';
import { computed, watch, version as vueVersion, App } from 'vue';
import { compareVersions } from 'compare-versions';
import widgets from '@/widgets/index.js';
import directives from '@/directives/index.js';
import components from '@/components/index.js';
import { version, ui, lang, updateLocale, locale } from '@/config.js';
import { version, lang, updateLocale, locale } from '@/config.js';
import { applyTheme } from '@/scripts/theme.js';
import { isDeviceDarkmode } from '@/scripts/is-device-darkmode.js';
import { i18n, updateI18n } from '@/i18n.js';
import { $i, refreshAccount, login, updateAccount, signout } from '@/account.js';
import { updateI18n } from '@/i18n.js';
import { $i, refreshAccount, login } from '@/account.js';
import { defaultStore, ColdDeviceStorage } from '@/store.js';
import { fetchInstance, instance } from '@/instance.js';
import { deviceKind } from '@/scripts/device-kind.js';

View File

@@ -3,14 +3,14 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent } from 'vue';
import { createApp, markRaw, defineAsyncComponent } from 'vue';
import { common } from './common.js';
import { version, ui, lang, updateLocale } from '@/config.js';
import { i18n, updateI18n } from '@/i18n.js';
import { ui } from '@/config.js';
import { i18n } from '@/i18n.js';
import { confirm, alert, post, popup, toast } from '@/os.js';
import { useStream } from '@/stream.js';
import * as sound from '@/scripts/sound.js';
import { $i, refreshAccount, login, updateAccount, signout } from '@/account.js';
import { $i, updateAccount, signout } from '@/account.js';
import { defaultStore, ColdDeviceStorage } from '@/store.js';
import { makeHotkey } from '@/scripts/hotkey.js';
import { reactionPicker } from '@/scripts/reaction-picker.js';
@@ -20,7 +20,6 @@ import { mainRouter } from '@/router.js';
import { initializeSw } from '@/scripts/initialize-sw.js';
import { deckStore } from '@/ui/deck/deck-store.js';
import { emojiPicker } from '@/scripts/emoji-picker.js';
import { SnowfallEffect } from '@/scripts/snowfall-effect.js';
export async function mainBoot() {
const { isClientUpdated } = await common(() => createApp(
@@ -79,6 +78,7 @@ export async function mainBoot() {
if (defaultStore.state.enableSeasonalScreenEffect) {
const month = new Date().getMonth() + 1;
if (month === 12 || month === 1) {
const SnowfallEffect = (await import('@/scripts/snowfall-effect.js')).SnowfallEffect;
new SnowfallEffect().render();
}
}

View File

@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent } from 'vue';
import { createApp, defineAsyncComponent } from 'vue';
import { common } from './common.js';
export async function subBoot() {

View File

@@ -359,12 +359,25 @@ function onKeydown(event: KeyboardEvent) {
}
break;
case 'Tab':
case 'ArrowDown':
cancel();
selectNext();
break;
case 'Tab':
if (event.shiftKey) {
if (select.value !== -1) {
cancel();
selectPrev();
} else {
props.close();
}
} else {
cancel();
selectNext();
}
break;
default:
event.stopPropagation();
props.textarea.focus();

View File

@@ -24,8 +24,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { onMounted, nextTick, ref, shallowRef, watch, computed, toRefs } from 'vue';
import { i18n } from '@/i18n.js';
import { ref, shallowRef, toRefs } from 'vue';
const props = defineProps<{
modelValue: string | null;

View File

@@ -17,6 +17,7 @@ import MkButton from '@/components/MkButton.vue';
const props = defineProps<{
modelValue: boolean;
text: string | null;
renote: Misskey.entities.Note | null;
files: Misskey.entities.DriveFile[];
poll?: {
expiresAt: string | null;
@@ -41,6 +42,7 @@ const emit = defineEmits<{
const label = computed(() => {
return concat([
props.text ? [i18n.t('_cw.chars', { count: props.text.length })] : [],
props.renote ? [i18n.ts.quote] : [],
props.files.length !== 0 ? [i18n.t('_cw.files', { count: props.files.length })] : [],
props.poll != null ? [i18n.ts.poll] : [],
] as string[][]).join(' / ');

View File

@@ -32,7 +32,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { onMounted, shallowRef, watch, ref } from 'vue';
import { shallowRef, watch, ref } from 'vue';
import * as Misskey from 'misskey-js';
import { i18n } from '@/i18n.js';

View File

@@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div ref="root">
<div>
<XBanner v-for="media in mediaList.filter(media => !previewable(media))" :key="media.id" :media="media"/>
<div v-if="mediaList.filter(media => previewable(media)).length > 0" :class="$style.container">
<div
@@ -27,41 +27,6 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</template>
<script lang="ts">
/**
* アスペクト比算出のためにHTMLElement.clientWidthを使うが、
* 大変重たいのでコンテナ要素とメディアリスト幅のペアをキャッシュする
* (タイムラインごとにスクロールコンテナが存在する前提だが……)
*/
const widthCache = new Map<Element, number>();
/**
* コンテナ要素がリサイズされたらキャッシュを削除する
*/
const ro = new ResizeObserver(entries => {
for (const entry of entries) {
widthCache.delete(entry.target);
}
});
async function getClientWidthWithCache(targetEl: HTMLElement, containerEl: HTMLElement, count = 0) {
if (_DEV_) console.log('getClientWidthWithCache', { targetEl, containerEl, count, cache: widthCache.get(containerEl) });
if (widthCache.has(containerEl)) return widthCache.get(containerEl)!;
const width = targetEl.clientWidth;
if (count <= 10 && width < 64) {
// widthが64未満はおかしいのでリトライする
await new Promise(resolve => setTimeout(resolve, 50));
return getClientWidthWithCache(targetEl, containerEl, count + 1);
}
widthCache.set(containerEl, width);
ro.observe(containerEl);
return width;
}
</script>
<script lang="ts" setup>
import { computed, onMounted, onUnmounted, shallowRef } from 'vue';
import * as Misskey from 'misskey-js';
@@ -74,15 +39,12 @@ import XVideo from '@/components/MkMediaVideo.vue';
import * as os from '@/os.js';
import { FILE_TYPE_BROWSERSAFE } from '@/const';
import { defaultStore } from '@/store.js';
import { getScrollContainer, getBodyScrollHeight } from '@/scripts/scroll.js';
const props = defineProps<{
mediaList: Misskey.entities.DriveFile[];
raw?: boolean;
}>();
const root = shallowRef<HTMLDivElement>();
const container = shallowRef<HTMLElement | null | undefined>(undefined);
const gallery = shallowRef<HTMLDivElement>();
const pswpZIndex = os.claimZIndex('middle');
document.documentElement.style.setProperty('--mk-pswp-root-z-index', pswpZIndex.toString());
@@ -95,12 +57,8 @@ const popstateHandler = (): void => {
}
};
/**
* アスペクト比をmediaListWithOneImageAppearanceに基づいていい感じに調整する
* aspect-ratioではなくheightを使う
*/
async function calcAspectRatio() {
if (!gallery.value || !root.value) return;
if (!gallery.value) return;
let img = props.mediaList[0];
@@ -109,41 +67,22 @@ async function calcAspectRatio() {
return;
}
if (!container.value) container.value = getScrollContainer(root.value);
const width = container.value ? await getClientWidthWithCache(root.value, container.value) : root.value.clientWidth;
const heightMin = (ratio: number) => {
const imgResizeRatio = width / img.properties.width;
const imgDrawHeight = img.properties.height * imgResizeRatio;
const maxHeight = width * ratio;
const height = Math.min(imgDrawHeight, maxHeight);
if (_DEV_) console.log('Image height calculated:', { width, properties: img.properties, imgResizeRatio, imgDrawHeight, maxHeight, height });
return `${height}px`;
};
const ratioMax = (ratio: number) => `${Math.max(ratio, img.properties.width / img.properties.height).toString()} / 1`;
switch (defaultStore.state.mediaListWithOneImageAppearance) {
case '16_9':
gallery.value.style.height = heightMin(9 / 16);
gallery.value.style.aspectRatio = ratioMax(16 / 9);
break;
case '1_1':
gallery.value.style.height = heightMin(1);
gallery.value.style.aspectRatio = ratioMax(1 / 1);
break;
case '2_3':
gallery.value.style.height = heightMin(3 / 2);
gallery.value.style.aspectRatio = ratioMax(2 / 3);
break;
default: {
const maxHeight = Math.max(64, (container.value ? container.value.clientHeight : getBodyScrollHeight()) * 0.5 || 360);
if (width === 0 || !maxHeight) return;
const imgResizeRatio = width / img.properties.width;
const imgDrawHeight = img.properties.height * imgResizeRatio;
gallery.value.style.height = `${Math.max(64, Math.min(imgDrawHeight, maxHeight))}px`;
gallery.value.style.minHeight = 'initial';
gallery.value.style.maxHeight = 'initial';
default:
gallery.value.style.aspectRatio = '';
break;
}
}
gallery.value.style.aspectRatio = 'initial';
}
onMounted(() => {

View File

@@ -62,7 +62,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts">
import { Ref, computed, defineAsyncComponent, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';
import { computed, defineAsyncComponent, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';
import { focusPrev, focusNext } from '@/scripts/focus.js';
import MkSwitchButton from '@/components/MkSwitch.button.vue';
import { MenuItem, InnerMenuItem, MenuPending, MenuAction, MenuSwitch, MenuParent } from '@/types/menu';

View File

@@ -54,7 +54,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div style="container-type: inline-size;">
<p v-if="appearNote.cw != null" :class="$style.cw">
<Mfm v-if="appearNote.cw != ''" style="margin-right: 8px;" :text="appearNote.cw" :author="appearNote.user" :nyaize="'respect'"/>
<MkCwButton v-model="showContent" :text="appearNote.text" :files="appearNote.files" :poll="appearNote.poll" style="margin: 4px 0;"/>
<MkCwButton v-model="showContent" :text="appearNote.text" :renote="appearNote.renote" :files="appearNote.files" :poll="appearNote.poll" style="margin: 4px 0;"/>
</p>
<div v-show="appearNote.cw == null || showContent" :class="[{ [$style.contentCollapsed]: collapsed }]">
<div :class="$style.text">
@@ -151,7 +151,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, inject, onMounted, ref, shallowRef, Ref, defineAsyncComponent, watch, provide } from 'vue';
import { computed, inject, onMounted, ref, shallowRef, Ref, watch, provide } from 'vue';
import * as mfm from 'mfm-js';
import * as Misskey from 'misskey-js';
import MkNoteSub from '@/components/MkNoteSub.vue';
@@ -228,6 +228,7 @@ if (noteViewInterruptors.length > 0) {
const isRenote = (
note.value.renote != null &&
note.value.text == null &&
note.value.cw == null &&
note.value.fileIds.length === 0 &&
note.value.poll == null
);

View File

@@ -221,11 +221,10 @@ import { useNoteCapture } from '@/scripts/use-note-capture.js';
import { deepClone } from '@/scripts/clone.js';
import { useTooltip } from '@/scripts/use-tooltip.js';
import { claimAchievement } from '@/scripts/achievements.js';
import { MenuItem } from '@/types/menu.js';
import MkRippleEffect from '@/components/MkRippleEffect.vue';
import { showMovedDialog } from '@/scripts/show-moved-dialog.js';
import MkUserCardMini from '@/components/MkUserCardMini.vue';
import MkPagination, { Paging } from '@/components/MkPagination.vue';
import MkPagination from '@/components/MkPagination.vue';
import MkReactionIcon from '@/components/MkReactionIcon.vue';
import MkButton from '@/components/MkButton.vue';

View File

@@ -27,7 +27,6 @@ import * as Misskey from 'misskey-js';
import MkNoteHeader from '@/components/MkNoteHeader.vue';
import MkSubNoteContent from '@/components/MkSubNoteContent.vue';
import MkCwButton from '@/components/MkCwButton.vue';
import { $i } from '@/account.js';
const props = defineProps<{
note: Misskey.entities.Note;

View File

@@ -51,7 +51,6 @@ import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import { userPage } from '@/filters/user.js';
import { checkWordMute } from '@/scripts/check-word-mute.js';
import { defaultStore } from '@/store.js';
const props = withDefaults(defineProps<{
note: Misskey.entities.Note;

View File

@@ -8,6 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div :class="$style.head">
<MkAvatar v-if="notification.type === 'pollEnded'" :class="$style.icon" :user="notification.note.user" link preview/>
<MkAvatar v-else-if="notification.type === 'note'" :class="$style.icon" :user="notification.note.user" link preview/>
<MkAvatar v-else-if="notification.type === 'roleAssigned'" :class="$style.icon" :user="$i" link preview/>
<MkAvatar v-else-if="notification.type === 'achievementEarned'" :class="$style.icon" :user="$i" link preview/>
<div v-else-if="notification.type === 'reaction:grouped'" :class="[$style.icon, $style.icon_reactionGroup]"><i class="ti ti-plus" style="line-height: 1;"></i></div>
<div v-else-if="notification.type === 'renote:grouped'" :class="[$style.icon, $style.icon_renoteGroup]"><i class="ti ti-repeat" style="line-height: 1;"></i></div>
@@ -36,6 +37,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<i v-else-if="notification.type === 'quote'" class="ti ti-quote"></i>
<i v-else-if="notification.type === 'pollEnded'" class="ti ti-chart-arrows"></i>
<i v-else-if="notification.type === 'achievementEarned'" class="ti ti-medal"></i>
<img v-else-if="notification.type === 'roleAssigned'" :src="notification.role.iconUrl" alt=""/>
<!-- notification.reaction null になることはまずないがここでoptional chaining使うと一部ブラウザで刺さるので念の為 -->
<MkReactionIcon
v-else-if="notification.type === 'reaction'"
@@ -50,6 +52,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<header :class="$style.header">
<span v-if="notification.type === 'pollEnded'">{{ i18n.ts._notification.pollEnded }}</span>
<span v-else-if="notification.type === 'note'">{{ i18n.ts._notification.newNote }}: <MkUserName :user="notification.note.user"/></span>
<span v-else-if="notification.type === 'roleAssigned'">{{ i18n.ts._notification.roleAssigned }}</span>
<span v-else-if="notification.type === 'achievementEarned'">{{ i18n.ts._notification.achievementEarned }}</span>
<span v-else-if="notification.type === 'test'">{{ i18n.ts._notification.testNotification }}</span>
<MkA v-else-if="notification.user" v-user-preview="notification.user.id" :class="$style.headerName" :to="userPage(notification.user)"><MkUserName :user="notification.user"/></MkA>
@@ -86,6 +89,9 @@ SPDX-License-Identifier: AGPL-3.0-only
<Mfm :text="getNoteSummary(notification.note)" :plain="true" :nowrap="true" :author="notification.note.user"/>
<i class="ti ti-quote" :class="$style.quote"></i>
</MkA>
<div v-else-if="notification.type === 'roleAssigned'" :class="$style.text">
{{ notification.role.name }}
</div>
<MkA v-else-if="notification.type === 'achievementEarned'" :class="$style.text" to="/my/achievements">
{{ i18n.ts._achievements._types['_' + notification.achievement].title }}
</MkA>
@@ -130,7 +136,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { ref, shallowRef } from 'vue';
import { ref } from 'vue';
import * as Misskey from 'misskey-js';
import MkReactionIcon from '@/components/MkReactionIcon.vue';
import MkFollowButton from '@/components/MkFollowButton.vue';

View File

@@ -25,12 +25,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { onUnmounted, onMounted, computed, shallowRef, onActivated } from 'vue';
import MkPagination, { Paging } from '@/components/MkPagination.vue';
import MkPagination from '@/components/MkPagination.vue';
import XNotification from '@/components/MkNotification.vue';
import MkDateSeparatedList from '@/components/MkDateSeparatedList.vue';
import MkNote from '@/components/MkNote.vue';
import { useStream } from '@/stream.js';
import { $i } from '@/account.js';
import { i18n } from '@/i18n.js';
import { notificationTypes } from '@/const.js';
import { infoImageUrl } from '@/instance.js';

View File

@@ -67,6 +67,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkInfo v-if="hasNotSpecifiedMentions" warn :class="$style.hasNotSpecifiedMentions">{{ i18n.ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ i18n.ts.add }}</button></MkInfo>
<input v-show="useCw" ref="cwInputEl" v-model="cw" :class="$style.cw" :placeholder="i18n.ts.annotation" @keydown="onKeydown">
<div :class="[$style.textOuter, { [$style.withCw]: useCw }]">
<div v-if="channel" :class="$style.colorBar" :style="{ background: channel.color }"></div>
<textarea ref="textareaEl" v-model="text" :class="[$style.text]" :disabled="posting || posted" :readonly="textAreaReadOnly" :placeholder="placeholder" data-cy-post-form-text @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd"/>
<div v-if="maxTextLength - textLength < 100" :class="['_acrylic', $style.textCount, { [$style.textOver]: textLength > maxTextLength }]">{{ maxTextLength - textLength }}</div>
</div>
@@ -1041,6 +1042,16 @@ defineExpose({
}
}
.colorBar {
position: absolute;
top: 0px;
left: 12px;
width: 5px;
height: 100% ;
border-radius: 999px;
pointer-events: none;
}
.submitInner {
padding: 0 12px;
line-height: 34px;
@@ -1303,5 +1314,6 @@ defineExpose({
.headerRight {
gap: 0;
}
}
</style>

View File

@@ -80,7 +80,6 @@ import { ref, computed } from 'vue';
import { toUnicode } from 'punycode/';
import MkButton from './MkButton.vue';
import MkInput from './MkInput.vue';
import MkSwitch from './MkSwitch.vue';
import MkCaptcha, { type Captcha } from '@/components/MkCaptcha.vue';
import * as config from '@/config.js';
import * as os from '@/os.js';

View File

@@ -62,7 +62,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, onMounted, ref, watch } from 'vue';
import { computed, ref } from 'vue';
import { instance } from '@/instance.js';
import { i18n } from '@/i18n.js';
import MkButton from '@/components/MkButton.vue';

View File

@@ -39,7 +39,6 @@ import XSignup from '@/components/MkSignupDialog.form.vue';
import XServerRules from '@/components/MkSignupDialog.rules.vue';
import MkModalWindow from '@/components/MkModalWindow.vue';
import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
const props = withDefaults(defineProps<{
autoSet?: boolean;

View File

@@ -35,7 +35,6 @@ import * as Misskey from 'misskey-js';
import MkMediaList from '@/components/MkMediaList.vue';
import MkPoll from '@/components/MkPoll.vue';
import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import { shouldCollapsed } from '@/scripts/collapsed.js';
const props = defineProps<{

View File

@@ -22,10 +22,10 @@ SPDX-License-Identifier: AGPL-3.0-only
<div :class="$style.statusItem">
<p :class="$style.statusItemLabel">{{ i18n.ts.notes }}</p><span :class="$style.statusItemValue">{{ number(user.notesCount) }}</span>
</div>
<div v-if="isFfVisibleForMe(user)" :class="$style.statusItem">
<div v-if="isFollowingVisibleForMe(user)" :class="$style.statusItem">
<p :class="$style.statusItemLabel">{{ i18n.ts.following }}</p><span :class="$style.statusItemValue">{{ number(user.followingCount) }}</span>
</div>
<div v-if="isFfVisibleForMe(user)" :class="$style.statusItem">
<div v-if="isFollowersVisibleForMe(user)" :class="$style.statusItem">
<p :class="$style.statusItemLabel">{{ i18n.ts.followers }}</p><span :class="$style.statusItemValue">{{ number(user.followersCount) }}</span>
</div>
</div>
@@ -40,7 +40,7 @@ import number from '@/filters/number.js';
import { userPage } from '@/filters/user.js';
import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import { isFfVisibleForMe } from '@/scripts/isFfVisibleForMe.js';
import { isFollowingVisibleForMe, isFollowersVisibleForMe } from '@/scripts/isFfVisibleForMe.js';
defineProps<{
user: Misskey.entities.UserDetailed;

View File

@@ -35,11 +35,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<div :class="$style.statusItemLabel">{{ i18n.ts.notes }}</div>
<div>{{ number(user.notesCount) }}</div>
</div>
<div v-if="isFfVisibleForMe(user)" :class="$style.statusItem">
<div v-if="isFollowingVisibleForMe(user)" :class="$style.statusItem">
<div :class="$style.statusItemLabel">{{ i18n.ts.following }}</div>
<div>{{ number(user.followingCount) }}</div>
</div>
<div v-if="isFfVisibleForMe(user)" :class="$style.statusItem">
<div v-if="isFollowersVisibleForMe(user)" :class="$style.statusItem">
<div :class="$style.statusItemLabel">{{ i18n.ts.followers }}</div>
<div>{{ number(user.followersCount) }}</div>
</div>
@@ -65,7 +65,7 @@ import number from '@/filters/number.js';
import { i18n } from '@/i18n.js';
import { defaultStore } from '@/store.js';
import { $i } from '@/account.js';
import { isFfVisibleForMe } from '@/scripts/isFfVisibleForMe.js';
import { isFollowingVisibleForMe, isFollowersVisibleForMe } from '@/scripts/isFfVisibleForMe.js';
const props = defineProps<{
showing: boolean;

View File

@@ -34,15 +34,9 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, ref, watch } from 'vue';
import { instance } from '@/instance.js';
import { i18n } from '@/i18n.js';
import MkButton from '@/components/MkButton.vue';
import MkFolder from '@/components/MkFolder.vue';
import XUser from '@/components/MkUserSetupDialog.User.vue';
import MkInfo from '@/components/MkInfo.vue';
import * as os from '@/os.js';
import { $i } from '@/account.js';
import MkPagination from '@/components/MkPagination.vue';
const pinnedUsers = { endpoint: 'pinned-users', noPaging: true };

View File

@@ -44,14 +44,12 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, ref, watch } from 'vue';
import { instance } from '@/instance.js';
import { ref, watch } from 'vue';
import { i18n } from '@/i18n.js';
import MkSwitch from '@/components/MkSwitch.vue';
import MkInfo from '@/components/MkInfo.vue';
import MkFolder from '@/components/MkFolder.vue';
import * as os from '@/os.js';
import { $i } from '@/account.js';
const isLocked = ref(false);
const hideOnlineStatus = ref(false);

View File

@@ -30,8 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, ref, watch } from 'vue';
import { instance } from '@/instance.js';
import { ref, watch } from 'vue';
import { i18n } from '@/i18n.js';
import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';

View File

@@ -29,7 +29,6 @@ import * as Misskey from 'misskey-js';
import { ref } from 'vue';
import MkButton from '@/components/MkButton.vue';
import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import * as os from '@/os.js';
const props = defineProps<{

View File

@@ -53,7 +53,6 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import * as Misskey from 'misskey-js';
import XTimeline from './welcome.timeline.vue';
import XSigninDialog from '@/components/MkSigninDialog.vue';
import XSignupDialog from '@/components/MkSignupDialog.vue';
import MkButton from '@/components/MkButton.vue';
@@ -63,7 +62,6 @@ import { instanceName } from '@/config.js';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
import number from '@/filters/number.js';
import MkNumber from '@/components/MkNumber.vue';
import XActiveUsersChart from '@/components/MkVisitorDashboard.ActiveUsersChart.vue';

View File

@@ -21,7 +21,6 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref, watch } from 'vue';
import MkButton from '@/components/MkButton.vue';
import { defaultStore } from '@/store.js';
import { i18n } from '@/i18n.js';
const props = defineProps<{

View File

@@ -14,7 +14,6 @@ import { computed } from 'vue';
import * as os from '@/os.js';
import copyToClipboard from '@/scripts/copy-to-clipboard.js';
import { url } from '@/config.js';
import { popout as popout_ } from '@/scripts/popout.js';
import { i18n } from '@/i18n.js';
import { useRouter } from '@/router.js';

View File

@@ -4,11 +4,8 @@
*/
/* eslint-disable @typescript-eslint/explicit-function-return-type */
import { expect } from '@storybook/jest';
import { userEvent, waitFor, within } from '@storybook/testing-library';
import { StoryObj } from '@storybook/vue3';
import MkAd from './MkAd.vue';
import { i18n } from '@/i18n.js';
let lock: Promise<undefined> | undefined;

View File

@@ -5,7 +5,6 @@
/* eslint-disable @typescript-eslint/explicit-function-return-type */
import { expect } from '@storybook/jest';
import { userEvent, within } from '@storybook/testing-library';
import { StoryObj } from '@storybook/vue3';
import { userDetailed } from '../../../.storybook/fakes';
import MkUserName from './MkUserName.vue';

View File

@@ -16,7 +16,6 @@ import * as mfm from 'mfm-js';
import * as Misskey from 'misskey-js';
import { TextBlock } from './block.type';
import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm.js';
import { $i } from '@/account.js';
const MkUrlPreview = defineAsyncComponent(() => import('@/components/MkUrlPreview.vue'));

View File

@@ -10,7 +10,6 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { onMounted, nextTick } from 'vue';
import * as Misskey from 'misskey-js';
import XBlock from './page.block.vue';

View File

@@ -54,7 +54,21 @@ https://github.com/sindresorhus/file-type/blob/main/core.js
https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers
*/
export const notificationTypes = ['note', 'follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'achievementEarned', 'app'] as const;
export const notificationTypes = [
'note',
'follow',
'mention',
'reply',
'renote',
'quote',
'reaction',
'pollEnded',
'receiveFollowRequest',
'followRequestAccepted',
'roleAssigned',
'achievementEarned',
'app',
] as const;
export const obsoleteNotificationTypes = ['pollVote', 'groupInvited'] as const;
export const ROLE_POLICIES = [

View File

@@ -103,6 +103,7 @@
["🫥", "dotted_line_face", 0],
["🫤", "face_with_diagonal_mouth", 0],
["🥹", "face_holding_back_tears", 0],
["🫨", "shaking_face", 0],
["💩", "poop", 0],
["😈", "smiling_imp", 0],
["👿", "imp", 0],
@@ -132,6 +133,8 @@
["✊", "fist", 1],
["🤛", "fist_left", 1],
["🤜", "fist_right", 1],
["🫷", "leftwards_pushing_hand", 1],
["🫸", "rightwards_pushing_hand", 1],
["✌", "v", 1],
["👌", "ok_hand", 1],
["✋", "raised_hand", 1],
@@ -453,6 +456,7 @@
["🐸", "frog", 2],
["🦑", "squid", 2],
["🐙", "octopus", 2],
["🪼", "jellyfish", 2],
["🦐", "shrimp", 2],
["🐵", "monkey_face", 2],
["🦍", "gorilla", 2],
@@ -466,7 +470,9 @@
["🐤", "baby_chick", 2],
["🐣", "hatching_chick", 2],
["🐥", "hatched_chick", 2],
["🪿", "goose", 2],
["🦆", "duck", 2],
["🐦‍⬛", "black_bird", 2],
["🦅", "eagle", 2],
["🦉", "owl", 2],
["🦇", "bat", 2],
@@ -474,6 +480,7 @@
["🐗", "boar", 2],
["🐴", "horse", 2],
["🦄", "unicorn", 2],
["🫎", "moose", 2],
["🐝", "honeybee", 2],
["🐛", "bug", 2],
["🦋", "butterfly", 2],
@@ -516,6 +523,7 @@
["🐐", "goat", 2],
["🐏", "ram", 2],
["🐑", "sheep", 2],
["🫏", "donkey", 2],
["🐎", "racehorse", 2],
["🐖", "pig2", 2],
["🐀", "rat", 2],
@@ -546,6 +554,7 @@
["🐻‍❄️", "polar_bear", 2],
["🦤", "dodo", 2],
["🪶", "feather", 2],
["🪽", "wing", 2],
["🦭", "seal", 2],
["🐾", "paw_prints", 2],
["🐉", "dragon", 2],
@@ -576,6 +585,7 @@
["🌻", "sunflower", 2],
["🌹", "rose", 2],
["🥀", "wilted_flower", 2],
["🪻", "hyacinth", 2],
["🌷", "tulip", 2],
["🌼", "blossom", 2],
["🌸", "cherry_blossom", 2],
@@ -655,6 +665,7 @@
["🥝", "kiwi_fruit", 3],
["🥭", "mango", 3],
["🥑", "avocado", 3],
["🫛", "pea_pod", 3],
["🥦", "broccoli", 3],
["🍅", "tomato", 3],
["🍆", "eggplant", 3],
@@ -668,6 +679,7 @@
["🌽", "corn", 3],
["🥬", "leafy_greens", 3],
["🍠", "sweet_potato", 3],
["🫚", "ginger_root", 3],
["🥜", "peanuts", 3],
["🧄", "garlic", 3],
["🧅", "onion", 3],
@@ -850,9 +862,11 @@
["🎧", "headphones", 4],
["🎼", "musical_score", 4],
["🎹", "musical_keyboard", 4],
["🪇", "maracas", 4],
["🥁", "drum", 4],
["🎷", "saxophone", 4],
["🎺", "trumpet", 4],
["🪈", "flute", 4],
["🎸", "guitar", 4],
["🎻", "violin", 4],
["🪕", "banjo", 4],
@@ -1108,6 +1122,7 @@
["🩹", "adhesive_bandage", 6],
["🩺", "stethoscope", 6],
["🪒", "razor", 6],
["🪮", "hair_pick", 6],
["🩻", "xray", 6],
["🩼", "crutch", 6],
["🧬", "dna", 6],
@@ -1156,6 +1171,7 @@
["🎊", "confetti_ball", 6],
["🎉", "tada", 6],
["🎎", "dolls", 6],
["🪭", "folding_hand_fan", 6],
["🎐", "wind_chime", 6],
["🎌", "crossed_flags", 6],
["🏮", "izakaya_lantern", 6],
@@ -1237,14 +1253,17 @@
["🪧", "placard", 6],
["💯", "100", 7],
["🔢", "1234", 7],
["🩷", "pink_heart", 7],
["❤️", "heart", 7],
["🧡", "orange_heart", 7],
["💛", "yellow_heart", 7],
["💚", "green_heart", 7],
["🩵", "light_blue_heart", 7],
["💙", "blue_heart", 7],
["💜", "purple_heart", 7],
["🤎", "brown_heart", 7],
["🖤", "black_heart", 7],
["🩶", "grey_heart", 7],
["🤍", "white_heart", 7],
["💔", "broken_heart", 7],
["❣", "heavy_heart_exclamation", 7],
@@ -1263,6 +1282,7 @@
["☪", "star_and_crescent", 7],
["🕉", "om", 7],
["☸", "wheel_of_dharma", 7],
["🪯", "khanda", 7],
["✡", "star_of_david", 7],
["🔯", "six_pointed_star", 7],
["🕎", "menorah", 7],
@@ -1358,6 +1378,7 @@
["🛃", "customs", 7],
["🛄", "baggage_claim", 7],
["🛅", "left_luggage", 7],
["🛜", "wireless", 7],
["♿", "wheelchair", 7],
["🚭", "no_smoking", 7],
["🚾", "wc", 7],

View File

@@ -221,12 +221,12 @@ import MkFileListForAdmin from '@/components/MkFileListForAdmin.vue';
import MkInfo from '@/components/MkInfo.vue';
import * as os from '@/os.js';
import { url } from '@/config.js';
import { userPage, acct } from '@/filters/user.js';
import { acct } from '@/filters/user.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import { i18n } from '@/i18n.js';
import { iAmAdmin, iAmModerator, $i } from '@/account.js';
import MkRolePreview from '@/components/MkRolePreview.vue';
import MkPagination, { Paging } from '@/components/MkPagination.vue';
import MkPagination from '@/components/MkPagination.vue';
const props = withDefaults(defineProps<{
userId: string;

View File

@@ -97,11 +97,8 @@ SPDX-License-Identifier: AGPL-3.0-only
import { ref, computed } from 'vue';
import JSON5 from 'json5';
import XHeader from './_header_.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import FormSection from '@/components/form/section.vue';
import FormSplit from '@/components/form/split.vue';
import FormSuspense from '@/components/form/suspense.vue';
import * as os from '@/os.js';
import { instance, fetchInstance } from '@/instance.js';

View File

@@ -69,8 +69,6 @@ import XHeader from './_header_.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import FormSection from '@/components/form/section.vue';
import FormSplit from '@/components/form/split.vue';
import FormSuspense from '@/components/form/suspense.vue';
import * as os from '@/os.js';
import { fetchInstance } from '@/instance.js';

View File

@@ -123,9 +123,7 @@ SPDX-License-Identifier: AGPL-3.0-only
import * as Misskey from 'misskey-js';
import { CodeDiff } from 'v-code-diff';
import JSON5 from 'json5';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { dateString } from '@/filters/date.js';
import MkFolder from '@/components/MkFolder.vue';
const props = defineProps<{

View File

@@ -73,7 +73,7 @@ import { useRouter } from '@/router.js';
import MkButton from '@/components/MkButton.vue';
import MkUserCardMini from '@/components/MkUserCardMini.vue';
import MkInfo from '@/components/MkInfo.vue';
import MkPagination, { Paging } from '@/components/MkPagination.vue';
import MkPagination from '@/components/MkPagination.vue';
import { infoImageUrl } from '@/instance.js';
const router = useRouter();

View File

@@ -16,8 +16,6 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, watch } from 'vue';
import * as os from '@/os.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';

View File

@@ -38,9 +38,6 @@ import { ref, computed } from 'vue';
import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkRadios from '@/components/MkRadios.vue';
import MkInfo from '@/components/MkInfo.vue';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';

View File

@@ -80,7 +80,7 @@ import MkInput from '@/components/MkInput.vue';
import MkPagination from '@/components/MkPagination.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import FormSplit from '@/components/form/split.vue';
import { selectFile, selectFiles } from '@/scripts/select-file.js';
import { selectFile } from '@/scripts/select-file.js';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';

View File

@@ -103,7 +103,7 @@ import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { customEmojiCategories } from '@/custom-emojis.js';
import MkSwitch from '@/components/MkSwitch.vue';
import { selectFile, selectFiles } from '@/scripts/select-file.js';
import { selectFile } from '@/scripts/select-file.js';
import MkRolePreview from '@/components/MkRolePreview.vue';
const props = defineProps<{

View File

@@ -68,7 +68,7 @@ import MkInput from '@/components/MkInput.vue';
import { userListsCache } from '@/cache.js';
import { $i } from '@/account.js';
import { defaultStore } from '@/store.js';
import MkPagination, { Paging } from '@/components/MkPagination.vue';
import MkPagination from '@/components/MkPagination.vue';
const {
enableInfiniteScroll,

View File

@@ -29,7 +29,6 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import { i18n } from '@/i18n.js';
const props = withDefaults(defineProps<{
expanded?: boolean;

View File

@@ -42,18 +42,14 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, onMounted, ref } from 'vue';
import { ref } from 'vue';
import MkNotes from '@/components/MkNotes.vue';
import MkInput from '@/components/MkInput.vue';
import MkRadios from '@/components/MkRadios.vue';
import MkButton from '@/components/MkButton.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import { i18n } from '@/i18n.js';
import * as os from '@/os.js';
import MkFoldableSection from '@/components/MkFoldableSection.vue';
import { $i } from '@/account.js';
import { instance } from '@/instance.js';
import MkInfo from '@/components/MkInfo.vue';
import { useRouter } from '@/router.js';
import MkFolder from '@/components/MkFolder.vue';

View File

@@ -25,7 +25,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, defineAsyncComponent, onMounted, ref } from 'vue';
import { ref } from 'vue';
import MkUserList from '@/components/MkUserList.vue';
import MkInput from '@/components/MkInput.vue';
import MkRadios from '@/components/MkRadios.vue';
@@ -33,9 +33,6 @@ import MkButton from '@/components/MkButton.vue';
import { i18n } from '@/i18n.js';
import * as os from '@/os.js';
import MkFoldableSection from '@/components/MkFoldableSection.vue';
import { $i } from '@/account.js';
import { instance } from '@/instance.js';
import MkInfo from '@/components/MkInfo.vue';
import { useRouter } from '@/router.js';
const router = useRouter();

View File

@@ -23,10 +23,9 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, defineAsyncComponent, onMounted, ref } from 'vue';
import { computed, defineAsyncComponent, ref } from 'vue';
import { i18n } from '@/i18n.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import * as os from '@/os.js';
import { $i } from '@/account.js';
import { instance } from '@/instance.js';
import MkInfo from '@/components/MkInfo.vue';

View File

@@ -72,7 +72,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { ref, defineAsyncComponent, computed } from 'vue';
import { defineAsyncComponent, computed } from 'vue';
import { supported as webAuthnSupported, create as webAuthnCreate, parseCreationOptionsFromJSON } from '@github/webauthn-json/browser-ponyfill';
import MkButton from '@/components/MkButton.vue';
import MkInfo from '@/components/MkInfo.vue';

View File

@@ -50,9 +50,6 @@ import MkButton from '@/components/MkButton.vue';
import MkModalWindow from '@/components/MkModalWindow.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import { i18n } from '@/i18n.js';
import * as os from '@/os.js';
import MkFolder from '@/components/MkFolder.vue';
import MkInfo from '@/components/MkInfo.vue';
import MkRange from '@/components/MkRange.vue';
import { $i } from '@/account.js';

View File

@@ -4,51 +4,56 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
<div v-if="!loading" class="_gaps">
<MkInfo>{{ i18n.t('_profile.avatarDecorationMax', { max: $i.policies.avatarDecorationLimit }) }} ({{ i18n.t('remainingN', { n: $i.policies.avatarDecorationLimit - $i.avatarDecorations.length }) }})</MkInfo>
<div>
<div v-if="!loading" class="_gaps">
<MkInfo>{{ i18n.t('_profile.avatarDecorationMax', { max: $i.policies.avatarDecorationLimit }) }} ({{ i18n.t('remainingN', { n: $i.policies.avatarDecorationLimit - $i.avatarDecorations.length }) }})</MkInfo>
<div v-if="$i.avatarDecorations.length > 0" v-panel :class="$style.current" class="_gaps_s">
<div>{{ i18n.ts.inUse }}</div>
<MkAvatar :class="$style.avatar" :user="$i" forceShowDecoration/>
<div v-if="$i.avatarDecorations.length > 0" v-panel :class="$style.current" class="_gaps_s">
<div>{{ i18n.ts.inUse }}</div>
<div :class="$style.decorations">
<XDecoration
v-for="(avatarDecoration, i) in $i.avatarDecorations"
:decoration="avatarDecorations.find(d => d.id === avatarDecoration.id)"
:angle="avatarDecoration.angle"
:flipH="avatarDecoration.flipH"
:offsetX="avatarDecoration.offsetX"
:offsetY="avatarDecoration.offsetY"
:active="true"
@click="openDecoration(avatarDecoration, i)"
/>
</div>
<MkButton danger @click="detachAllDecorations">{{ i18n.ts.detachAll }}</MkButton>
</div>
<div :class="$style.decorations">
<XDecoration
v-for="(avatarDecoration, i) in $i.avatarDecorations"
:decoration="avatarDecorations.find(d => d.id === avatarDecoration.id)"
:angle="avatarDecoration.angle"
:flipH="avatarDecoration.flipH"
:offsetX="avatarDecoration.offsetX"
:offsetY="avatarDecoration.offsetY"
:active="true"
@click="openDecoration(avatarDecoration, i)"
v-for="avatarDecoration in avatarDecorations"
:key="avatarDecoration.id"
:decoration="avatarDecoration"
@click="openDecoration(avatarDecoration)"
/>
</div>
<MkButton danger @click="detachAllDecorations">{{ i18n.ts.detachAll }}</MkButton>
</div>
<div :class="$style.decorations">
<XDecoration
v-for="avatarDecoration in avatarDecorations"
:key="avatarDecoration.id"
:decoration="avatarDecoration"
@click="openDecoration(avatarDecoration)"
/>
<div v-else>
<MkLoading/>
</div>
</div>
<div v-else>
<MkLoading/>
</div>
</template>
<script lang="ts" setup>
import { ref, defineAsyncComponent } from 'vue';
import { ref, defineAsyncComponent, computed } from 'vue';
import * as Misskey from 'misskey-js';
import XDecoration from './profile.avatar-decoration.decoration.vue';
import XDecoration from './avatar-decoration.decoration.vue';
import MkButton from '@/components/MkButton.vue';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import MkInfo from '@/components/MkInfo.vue';
import { definePageMetadata } from '@/scripts/page-metadata.js';
const loading = ref(true);
const avatarDecorations = ref<Misskey.entities.GetAvatarDecorationsResponse>([]);
@@ -59,7 +64,7 @@ os.api('get-avatar-decorations').then(_avatarDecorations => {
});
function openDecoration(avatarDecoration, index?: number) {
os.popup(defineAsyncComponent(() => import('./profile.avatar-decoration.dialog.vue')), {
os.popup(defineAsyncComponent(() => import('./avatar-decoration.dialog.vue')), {
decoration: avatarDecoration,
usingIndex: index,
}, {
@@ -115,9 +120,25 @@ function detachAllDecorations() {
$i.avatarDecorations = [];
});
}
const headerActions = computed(() => []);
const headerTabs = computed(() => []);
definePageMetadata({
title: i18n.ts.avatarDecorations,
icon: 'ti ti-sparkles',
});
</script>
<style lang="scss" module>
.avatar {
display: inline-block;
width: 72px;
height: 72px;
margin: 16px auto;
}
.current {
padding: 16px;
border-radius: var(--radius);

View File

@@ -55,7 +55,6 @@ import MkPagination from '@/components/MkPagination.vue';
import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
import { i18n } from '@/i18n.js';
import bytes from '@/filters/bytes.js';
import { dateString } from '@/filters/date.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import MkSelect from '@/components/MkSelect.vue';
import { getDriveFileMenu } from '@/scripts/get-drive-file-menu.js';

View File

@@ -57,7 +57,6 @@ import { defaultStore } from '@/store.js';
import { unisonReload } from '@/scripts/unison-reload.js';
import { i18n } from '@/i18n.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import { deepClone } from '@/scripts/clone.js';
const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.default));

View File

@@ -55,7 +55,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { defineAsyncComponent, shallowRef, computed } from 'vue';
import { shallowRef, computed } from 'vue';
import XNotificationConfig from './notifications.notification-config.vue';
import FormLink from '@/components/form/link.vue';
import FormSection from '@/components/form/section.vue';
@@ -68,7 +68,7 @@ import { definePageMetadata } from '@/scripts/page-metadata.js';
import MkPushNotificationAllowButton from '@/components/MkPushNotificationAllowButton.vue';
import { notificationTypes } from '@/const.js';
const nonConfigurableNotificationTypes = ['note'];
const nonConfigurableNotificationTypes = ['note', 'roleAssigned', 'followRequestAccepted', 'achievementEarned'];
const allowButton = shallowRef<InstanceType<typeof MkPushNotificationAllowButton>>();
const pushRegistrationInServer = computed(() => allowButton.value?.pushRegistrationInServer);

View File

@@ -13,12 +13,18 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #caption>{{ i18n.ts.makeReactionsPublicDescription }}</template>
</MkSwitch>
<MkSelect v-model="ffVisibility" @update:modelValue="save()">
<template #label>{{ i18n.ts.ffVisibility }}</template>
<MkSelect v-model="followingVisibility" @update:modelValue="save()">
<template #label>{{ i18n.ts.followingVisibility }}</template>
<option value="public">{{ i18n.ts._ffVisibility.public }}</option>
<option value="followers">{{ i18n.ts._ffVisibility.followers }}</option>
<option value="private">{{ i18n.ts._ffVisibility.private }}</option>
</MkSelect>
<MkSelect v-model="followersVisibility" @update:modelValue="save()">
<template #label>{{ i18n.ts.followersVisibility }}</template>
<option value="public">{{ i18n.ts._ffVisibility.public }}</option>
<option value="followers">{{ i18n.ts._ffVisibility.followers }}</option>
<option value="private">{{ i18n.ts._ffVisibility.private }}</option>
<template #caption>{{ i18n.ts.ffVisibilityDescription }}</template>
</MkSelect>
<MkSwitch v-model="hideOnlineStatus" @update:modelValue="save()">
@@ -84,7 +90,8 @@ const preventAiLearning = ref($i.preventAiLearning);
const isExplorable = ref($i.isExplorable);
const hideOnlineStatus = ref($i.hideOnlineStatus);
const publicReactions = ref($i.publicReactions);
const ffVisibility = ref($i.ffVisibility);
const followingVisibility = ref($i?.followingVisibility);
const followersVisibility = ref($i?.followersVisibility);
const defaultNoteVisibility = computed(defaultStore.makeGetterSetter('defaultNoteVisibility'));
const defaultNoteLocalOnly = computed(defaultStore.makeGetterSetter('defaultNoteLocalOnly'));
@@ -100,7 +107,8 @@ function save() {
isExplorable: !!isExplorable.value,
hideOnlineStatus: !!hideOnlineStatus.value,
publicReactions: !!publicReactions.value,
ffVisibility: ffVisibility.value,
followingVisibility: followingVisibility.value,
followersVisibility: followersVisibility.value,
});
}

View File

@@ -5,12 +5,17 @@ SPDX-License-Identifier: AGPL-3.0-only
<template>
<div class="_gaps_m">
<div :class="$style.avatarAndBanner" :style="{ backgroundImage: $i.bannerUrl ? `url(${ $i.bannerUrl })` : null }">
<div class="_panel">
<div :class="$style.banner" :style="{ backgroundImage: $i.bannerUrl ? `url(${ $i.bannerUrl })` : null }">
<MkButton primary rounded :class="$style.bannerEdit" @click="changeBanner">{{ i18n.ts._profile.changeBanner }}</MkButton>
</div>
<div :class="$style.avatarContainer">
<MkAvatar :class="$style.avatar" :user="$i" forceShowDecoration @click="changeAvatar"/>
<MkButton primary rounded @click="changeAvatar">{{ i18n.ts._profile.changeAvatar }}</MkButton>
<div class="_buttonsCenter">
<MkButton primary rounded @click="changeAvatar">{{ i18n.ts._profile.changeAvatar }}</MkButton>
<MkButton primary rounded link to="/settings/avatar-decoration">{{ i18n.ts.decorate }} <i class="ti ti-sparkles"></i></MkButton>
</div>
</div>
<MkButton primary rounded :class="$style.bannerEdit" @click="changeBanner">{{ i18n.ts._profile.changeBanner }}</MkButton>
</div>
<MkInput v-model="profile.name" :max="30" manualSave :mfmAutocomplete="['emoji']">
@@ -83,13 +88,6 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #caption>{{ i18n.ts._profile.metadataDescription }}</template>
</FormSlot>
<MkFolder>
<template #icon><i class="ti ti-sparkles"></i></template>
<template #label>{{ i18n.ts.avatarDecorations }}</template>
<XAvatarDecoration/>
</MkFolder>
<MkFolder>
<template #label>{{ i18n.ts.advancedSettings }}</template>
@@ -112,8 +110,6 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { computed, reactive, ref, watch, defineAsyncComponent } from 'vue';
import Misskey from 'misskey-js';
import XAvatarDecoration from './profile.avatar-decoration.vue';
import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';
import MkSwitch from '@/components/MkSwitch.vue';
@@ -264,19 +260,19 @@ definePageMetadata({
</script>
<style lang="scss" module>
.avatarAndBanner {
.banner {
position: relative;
height: 130px;
background-size: cover;
background-position: center;
border: solid 1px var(--divider);
border-radius: 10px;
border-bottom: solid 1px var(--divider);
overflow: clip;
}
.avatarContainer {
display: inline-block;
margin-top: -50px;
padding-bottom: 16px;
text-align: center;
padding: 16px;
}
.avatar {

View File

@@ -23,21 +23,12 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, reactive, watch } from 'vue';
import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import MkSelect from '@/components/MkSelect.vue';
import FormSplit from '@/components/form/split.vue';
import MkFolder from '@/components/MkFolder.vue';
import FormSlot from '@/components/form/slot.vue';
import { computed } from 'vue';
import FormSection from '@/components/form/section.vue';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { $i } from '@/account.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import { defaultStore } from '@/store.js';
import MkRolePreview from '@/components/MkRolePreview.vue';
function save() {

View File

@@ -45,7 +45,6 @@ import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
import { $i } from '@/account.js';
import { definePageMetadata } from '@/scripts/page-metadata.js';
import { miLocalStorage } from '@/local-storage.js';
import { antennasCache, userListsCache } from '@/cache.js';
import { deviceKind } from '@/scripts/device-kind.js';
import { MenuItem } from '@/types/menu.js';

View File

@@ -16,8 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { computed, watch } from 'vue';
import * as os from '@/os.js';
import { computed } from 'vue';
import MkUserList from '@/components/MkUserList.vue';
import { definePageMetadata } from '@/scripts/page-metadata.js';

View File

@@ -110,11 +110,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<b>{{ number(user.notesCount) }}</b>
<span>{{ i18n.ts.notes }}</span>
</MkA>
<MkA v-if="isFfVisibleForMe(user)" :to="userPage(user, 'following')">
<MkA v-if="isFollowingVisibleForMe(user)" :to="userPage(user, 'following')">
<b>{{ number(user.followingCount) }}</b>
<span>{{ i18n.ts.following }}</span>
</MkA>
<MkA v-if="isFfVisibleForMe(user)" :to="userPage(user, 'followers')">
<MkA v-if="isFollowersVisibleForMe(user)" :to="userPage(user, 'followers')">
<b>{{ number(user.followersCount) }}</b>
<span>{{ i18n.ts.followers }}</span>
</MkA>
@@ -171,9 +171,8 @@ import { i18n } from '@/i18n.js';
import { $i, iAmModerator } from '@/account.js';
import { dateString } from '@/filters/date.js';
import { confetti } from '@/scripts/confetti.js';
import MkNotes from '@/components/MkNotes.vue';
import { api } from '@/os.js';
import { isFfVisibleForMe } from '@/scripts/isFfVisibleForMe.js';
import { isFollowingVisibleForMe, isFollowersVisibleForMe } from '@/scripts/isFfVisibleForMe.js';
function calcAge(birthdate: string): number {
const date = new Date(birthdate);

View File

@@ -39,13 +39,7 @@ import XTimeline from './welcome.timeline.vue';
import MarqueeText from '@/components/MkMarquee.vue';
import MkFeaturedPhotos from '@/components/MkFeaturedPhotos.vue';
import misskeysvg from '/client-assets/misskey.svg';
import MkInfo from '@/components/MkInfo.vue';
import { instanceName } from '@/config.js';
import * as os from '@/os.js';
import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
import number from '@/filters/number.js';
import MkNumber from '@/components/MkNumber.vue';
import MkVisitorDashboard from '@/components/MkVisitorDashboard.vue';
import { getProxiedImageUrl } from '@/scripts/media-proxy.js';

View File

@@ -34,7 +34,6 @@ import MkMediaList from '@/components/MkMediaList.vue';
import MkPoll from '@/components/MkPoll.vue';
import * as os from '@/os.js';
import { getScrollContainer } from '@/scripts/scroll.js';
import { $i } from '@/account.js';
const notes = ref<Misskey.entities.Note[]>([]);
const isScrolling = ref(false);

View File

@@ -54,6 +54,10 @@ export const routes = [{
path: '/profile',
name: 'profile',
component: page(() => import('./pages/settings/profile.vue')),
}, {
path: '/avatar-decoration',
name: 'avatarDecoration',
component: page(() => import('./pages/settings/avatar-decoration.vue')),
}, {
path: '/roles',
name: 'roles',

View File

@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { defineAsyncComponent, Ref, ref, computed, ComputedRef } from 'vue';
import { defineAsyncComponent, Ref, ref } from 'vue';
import { popup } from '@/os.js';
import { defaultStore } from '@/store.js';

View File

@@ -6,11 +6,19 @@
import * as Misskey from 'misskey-js';
import { $i } from '@/account.js';
export function isFfVisibleForMe(user: Misskey.entities.UserDetailed): boolean {
export function isFollowingVisibleForMe(user: Misskey.entities.UserDetailed): boolean {
if ($i && $i.id === user.id) return true;
if (user.ffVisibility === 'private') return false;
if (user.ffVisibility === 'followers' && !user.isFollowing) return false;
if (user.followingVisibility === 'private') return false;
if (user.followingVisibility === 'followers' && !user.isFollowing) return false;
return true;
}
export function isFollowersVisibleForMe(user: Misskey.entities.UserDetailed): boolean {
if ($i && $i.id === user.id) return true;
if (user.followersVisibility === 'private') return false;
if (user.followersVisibility === 'followers' && !user.isFollowing) return false;
return true;
}

File diff suppressed because one or more lines are too long

View File

@@ -49,7 +49,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { defineAsyncComponent, onMounted, computed, watch, nextTick, ref, shallowRef } from 'vue';
import { defineAsyncComponent, computed, watch, ref, shallowRef } from 'vue';
import { openInstanceMenu } from './_common_/common.js';
// import { host } from '@/config.js';
import * as os from '@/os.js';

View File

@@ -46,7 +46,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { defineAsyncComponent, ComputedRef, onMounted, provide, ref, computed, shallowRef } from 'vue';
import { defineAsyncComponent, onMounted, provide, ref, computed, shallowRef } from 'vue';
import XSidebar from './classic.sidebar.vue';
import XCommon from './_common_/common.vue';
import { instanceName } from '@/config.js';

View File

@@ -99,7 +99,6 @@ import { deckStore, addColumn as addColumnToStore, loadDeck, getProfiles, delete
import XSidebar from '@/ui/_common_/navbar.vue';
import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue';
import MkButton from '@/components/MkButton.vue';
import { getScrollContainer } from '@/scripts/scroll.js';
import * as os from '@/os.js';
import { navbarItemDef } from '@/navbar.js';
import { $i } from '@/account.js';

View File

@@ -71,7 +71,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ComputedRef, onMounted, provide, ref, computed } from 'vue';
import XCommon from './_common_/common.vue';
import { host, instanceName } from '@/config.js';
import { instanceName } from '@/config.js';
import * as os from '@/os.js';
import { instance } from '@/instance.js';
import XSigninDialog from '@/components/MkSigninDialog.vue';

View File

@@ -103,6 +103,7 @@
"🫥": ["depressed", "disappear", "hide", "introvert", "invisible", "tensen"],
"🫤": ["disappointed", "meh", "skeptical", "unsure"],
"🥹": ["angry", "cry", "proud", "resist", "sad"],
"🫨": ["earthquake", "face", "shaking", "shock", "vibrate"],
"💩": ["hankey", "shitface", "fail", "turd", "shit"],
"😈": ["devil", "horns"],
"👿": ["devil", "angry", "horns"],
@@ -132,6 +133,8 @@
"✊": ["fingers", "hand", "grasp"],
"🤛": ["hand", "fistbump"],
"🤜": ["hand", "fistbump"],
"🫷": ["hand", "high_five", "leftward", "push", "refuse", "stop", "wait"],
"🫸": ["hand", "high_five", "push", "refuse", "rightward", "stop", "wait"],
"✌": ["fingers", "ohyeah", "hand", "peace", "victory", "two"],
"👌": ["fingers", "limbs", "perfect", "ok", "okay"],
"✋": ["fingers", "stop", "highfive", "palm", "ban"],
@@ -453,6 +456,7 @@
"🐸": ["animal", "nature", "croak", "toad"],
"🦑": ["animal", "nature", "ocean", "sea"],
"🐙": ["animal", "creature", "ocean", "sea", "nature", "beach"],
"🪼": ["animal", "creature", "ocean", "sea", "nature", "beach"],
"🦐": ["animal", "ocean", "nature", "seafood"],
"🐵": ["animal", "nature", "circus"],
"🦍": ["animal", "nature", "circus"],
@@ -466,7 +470,9 @@
"🐤": ["animal", "chicken", "bird"],
"🐣": ["animal", "chicken", "egg", "born", "baby", "bird"],
"🐥": ["animal", "chicken", "baby", "bird"],
"🪿": ["animal", "nature", "bird", "fowl", "goose", "honk", "silly"],
"🦆": ["animal", "nature", "bird", "mallard"],
"🐦‍⬛": ["animal", "nature", "bird", "black", "crow", "raven", "rook"],
"🦅": ["animal", "nature", "bird"],
"🦉": ["animal", "nature", "bird", "hoot"],
"🦇": ["animal", "nature", "blind", "vampire"],
@@ -474,9 +480,11 @@
"🐗": ["animal", "nature"],
"🐴": ["animal", "brown", "nature"],
"🦄": ["animal", "nature", "mystical"],
"🫎": ["animal", "nature", "antlers", "elk", "mammal"],
"🐝": ["animal", "insect", "nature", "bug", "spring", "honey"],
"🐛": ["animal", "insect", "nature", "worm"],
"🦋": ["animal", "insect", "nature", "caterpillar"],
"🫏": ["animal", "ass", "burro", "mammal", "mule", "stubborn"],
"🐌": ["slow", "animal", "shell"],
"🐞": ["animal", "insect", "nature", "ladybug"],
"🐜": ["animal", "insect", "nature", "bug"],
@@ -546,6 +554,7 @@
"🐻‍❄️": ["animal", "nature"],
"🦤": ["animal", "nature"],
"🪶": ["animal", "nature"],
"🪽": ["angelic", "aviation", "bird", "flying", "mythology"],
"🦭": ["animal", "nature"],
"🐾": ["animal", "tracking", "footprints", "dog", "cat", "pet", "feet"],
"🐉": ["animal", "myth", "nature", "chinese", "green"],
@@ -576,6 +585,7 @@
"🌻": ["nature", "plant", "fall"],
"🌹": ["flowers", "valentines", "love", "spring"],
"🥀": ["plant", "nature", "flower"],
"🪻": ["plant", "nature", "flower", "bluebonnet", "lavender", "lupine", "snapdragon"],
"🌷": ["flowers", "plant", "nature", "summer", "spring"],
"🌼": ["nature", "flowers", "yellow"],
"🌸": ["nature", "plant", "spring", "flower"],
@@ -655,6 +665,7 @@
"🥝": ["fruit", "food"],
"🥭": ["fruit", "food", "tropical"],
"🥑": ["fruit", "food"],
"🫛": ["beans", "edamame", "legume", "pea", "pod", "vegetable", "food"],
"🥦": ["fruit", "food", "vegetable"],
"🍅": ["fruit", "vegetable", "nature", "food"],
"🍆": ["vegetable", "nature", "food", "aubergine"],
@@ -668,6 +679,7 @@
"🌽": ["food", "vegetable", "plant"],
"🥬": ["food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce"],
"🍠": ["food", "nature"],
"🫚": ["food", "nature", "beer", "root", "spice"],
"🥜": ["food", "nut"],
"🧄": ["food"],
"🧅": ["food"],
@@ -850,9 +862,11 @@
"🎧": ["music", "score", "gadgets"],
"🎼": ["treble", "clef", "compose"],
"🎹": ["piano", "instrument", "compose"],
"🪇": ["instrument", "music", "percussion", "rattle", "shake"],
"🥁": ["music", "instrument", "drumsticks", "snare"],
"🎷": ["music", "instrument", "jazz", "blues"],
"🎺": ["music", "brass"],
"🪈": ["music", "fife", "pipe", "recorder", "woodwind"],
"🎸": ["music", "instrument"],
"🎻": ["music", "instrument", "orchestra", "symphony"],
"🪕": ["music", "instrument"],
@@ -1108,6 +1122,7 @@
"🩹": ["health", "hospital", "medicine", "needle", "doctor", "nurse"],
"🩺": ["health", "hospital", "medicine", "needle", "doctor", "nurse"],
"🪒": ["health"],
"🪮": ["afro", "comb", "hair", "pick"],
"🩻": [],
"🩼": [],
"🧬": ["biologist", "genetics", "life"],
@@ -1156,6 +1171,7 @@
"🎊": ["festival", "party", "birthday", "circus"],
"🎉": ["party", "congratulations", "birthday", "magic", "circus", "celebration"],
"🎎": ["japanese", "toy", "kimono"],
"🪭": ["cooling", "dance", "fan", "flutter", "hot", "shy"],
"🎐": ["nature", "ding", "spring", "bell"],
"🎌": ["japanese", "nation", "country", "border"],
"🏮": ["light", "paper", "halloween", "spooky"],
@@ -1237,14 +1253,17 @@
"🪧": [],
"💯": ["score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred"],
"🔢": ["numbers", "blue-square"],
"🩷": ["love", "like", "affection", "valentines"],
"❤️": ["love", "like", "affection", "valentines"],
"🧡": ["love", "like", "affection", "valentines"],
"💛": ["love", "like", "affection", "valentines"],
"💚": ["love", "like", "affection", "valentines"],
"🩵": ["love", "like", "affection", "valentines"],
"💙": ["love", "like", "affection", "valentines"],
"💜": ["love", "like", "affection", "valentines"],
"🤎": ["love", "like", "affection", "valentines"],
"🖤": ["love", "like", "affection", "valentines"],
"🩶": ["love", "like", "affection", "valentines"],
"🤍": ["love", "like", "affection", "valentines"],
"💔": ["sad", "sorry", "break", "heart", "heartbreak"],
"❣": ["decoration", "love"],
@@ -1263,6 +1282,7 @@
"☪": ["islam"],
"🕉": ["hinduism", "buddhism", "sikhism", "jainism"],
"☸": ["hinduism", "buddhism", "sikhism", "jainism"],
"🪯": ["religion", "sikh"],
"✡": ["judaism"],
"🔯": ["purple-square", "religion", "jewish", "hexagram"],
"🕎": ["hanukkah", "candles", "jewish"],
@@ -1358,6 +1378,7 @@
"🛃": ["passport", "border", "blue-square"],
"🛄": ["blue-square", "airport", "transport"],
"🛅": ["blue-square", "travel"],
"🛜": ["blue-square", "computer", "internet", "network"],
"♿": ["blue-square", "disabled", "a11y", "accessibility"],
"🚭": ["cigarette", "blue-square", "smell", "smoke"],
"🚾": ["toilet", "restroom", "blue-square"],
@@ -1527,258 +1548,258 @@
"🕥": ["time", "late", "early", "schedule"],
"🕦": ["time", "late", "early", "schedule"],
"🕧": ["time", "late", "early", "schedule"],
"🇦🇫": ["af", "flag", "nation", "country", "banner"],
"🇦🇽": ["Åland", "islands", "flag", "nation", "country", "banner"],
"🇦🇱": ["al", "flag", "nation", "country", "banner"],
"🇩🇿": ["dz", "flag", "nation", "country", "banner"],
"🇦🇸": ["american", "ws", "flag", "nation", "country", "banner"],
"🇦🇫": ["af", "afghanistan", "flag", "nation", "country", "banner"],
"🇦🇽": ["ax", "Åland", "aland", "islands", "flag", "nation", "country", "banner"],
"🇦🇱": ["al", "albania", "flag", "nation", "country", "banner"],
"🇩🇿": ["dz", "algeria", "flag", "nation", "country", "banner"],
"🇦🇸": ["as", "american", "samoa", "flag", "nation", "country", "banner"],
"🇦🇩": ["ad", "flag", "nation", "country", "banner"],
"🇦🇴": ["ao", "flag", "nation", "country", "banner"],
"🇦🇮": ["ai", "flag", "nation", "country", "banner"],
"🇦🇶": ["aq", "flag", "nation", "country", "banner"],
"🇦🇬": ["antigua", "barbuda", "flag", "nation", "country", "banner"],
"🇦🇷": ["ar", "flag", "nation", "country", "banner"],
"🇦🇲": ["am", "flag", "nation", "country", "banner"],
"🇦🇼": ["aw", "flag", "nation", "country", "banner"],
"🇦🇨": ["flag", "nation", "country", "banner"],
"🇦🇺": ["au", "flag", "nation", "country", "banner"],
"🇦🇹": ["at", "flag", "nation", "country", "banner"],
"🇦🇿": ["az", "flag", "nation", "country", "banner"],
"🇧🇸": ["bs", "flag", "nation", "country", "banner"],
"🇧🇭": ["bh", "flag", "nation", "country", "banner"],
"🇧🇩": ["bd", "flag", "nation", "country", "banner"],
"🇧🇧": ["bb", "flag", "nation", "country", "banner"],
"🇧🇾": ["by", "flag", "nation", "country", "banner"],
"🇧🇪": ["be", "flag", "nation", "country", "banner"],
"🇧🇿": ["bz", "flag", "nation", "country", "banner"],
"🇧🇯": ["bj", "flag", "nation", "country", "banner"],
"🇧🇲": ["bm", "flag", "nation", "country", "banner"],
"🇧🇹": ["bt", "flag", "nation", "country", "banner"],
"🇧🇴": ["bo", "flag", "nation", "country", "banner"],
"🇧🇶": ["bonaire", "flag", "nation", "country", "banner"],
"🇧🇦": ["bosnia", "herzegovina", "flag", "nation", "country", "banner"],
"🇧🇼": ["bw", "flag", "nation", "country", "banner"],
"🇧🇷": ["br", "flag", "nation", "country", "banner"],
"🇮🇴": ["british", "indian", "ocean", "territory", "flag", "nation", "country", "banner"],
"🇻🇬": ["british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner"],
"🇧🇳": ["bn", "darussalam", "flag", "nation", "country", "banner"],
"🇧🇬": ["bg", "flag", "nation", "country", "banner"],
"🇧🇫": ["burkina", "faso", "flag", "nation", "country", "banner"],
"🇧🇮": ["bi", "flag", "nation", "country", "banner"],
"🇨🇻": ["cabo", "verde", "flag", "nation", "country", "banner"],
"🇰🇭": ["kh", "flag", "nation", "country", "banner"],
"🇨🇲": ["cm", "flag", "nation", "country", "banner"],
"🇨🇦": ["ca", "flag", "nation", "country", "banner"],
"🇮🇨": ["canary", "islands", "flag", "nation", "country", "banner"],
"🇰🇾": ["cayman", "islands", "flag", "nation", "country", "banner"],
"🇨🇫": ["central", "african", "republic", "flag", "nation", "country", "banner"],
"🇹🇩": ["td", "flag", "nation", "country", "banner"],
"🇨🇱": ["flag", "nation", "country", "banner"],
"🇨🇳": ["china", "chinese", "prc", "flag", "country", "nation", "banner"],
"🇨🇽": ["christmas", "island", "flag", "nation", "country", "banner"],
"🇨🇨": ["cocos", "keeling", "islands", "flag", "nation", "country", "banner"],
"🇨🇴": ["co", "flag", "nation", "country", "banner"],
"🇰🇲": ["km", "flag", "nation", "country", "banner"],
"🇨🇬": ["congo", "flag", "nation", "country", "banner"],
"🇨🇩": ["congo", "democratic", "republic", "flag", "nation", "country", "banner"],
"🇨🇰": ["cook", "islands", "flag", "nation", "country", "banner"],
"🇨🇷": ["costa", "rica", "flag", "nation", "country", "banner"],
"🇭🇷": ["hr", "flag", "nation", "country", "banner"],
"🇨🇺": ["cu", "flag", "nation", "country", "banner"],
"🇨🇼": ["curaçao", "flag", "nation", "country", "banner"],
"🇨🇾": ["cy", "flag", "nation", "country", "banner"],
"🇨🇿": ["cz", "flag", "nation", "country", "banner"],
"🇩🇰": ["dk", "flag", "nation", "country", "banner"],
"🇩🇯": ["dj", "flag", "nation", "country", "banner"],
"🇩🇲": ["dm", "flag", "nation", "country", "banner"],
"🇩🇴": ["dominican", "republic", "flag", "nation", "country", "banner"],
"🇪🇨": ["ec", "flag", "nation", "country", "banner"],
"🇪🇬": ["eg", "flag", "nation", "country", "banner"],
"🇸🇻": ["el", "salvador", "flag", "nation", "country", "banner"],
"🇬🇶": ["equatorial", "gn", "flag", "nation", "country", "banner"],
"🇪🇷": ["er", "flag", "nation", "country", "banner"],
"🇪🇪": ["ee", "flag", "nation", "country", "banner"],
"🇪🇹": ["et", "flag", "nation", "country", "banner"],
"🇪🇺": ["european", "union", "flag", "banner"],
"🇫🇰": ["falkland", "islands", "malvinas", "flag", "nation", "country", "banner"],
"🇫🇴": ["faroe", "islands", "flag", "nation", "country", "banner"],
"🇫🇯": ["fj", "flag", "nation", "country", "banner"],
"🇫🇮": ["fi", "flag", "nation", "country", "banner"],
"🇫🇷": ["banner", "flag", "nation", "france", "french", "country"],
"🇬🇫": ["french", "guiana", "flag", "nation", "country", "banner"],
"🇵🇫": ["french", "polynesia", "flag", "nation", "country", "banner"],
"🇹🇫": ["french", "southern", "territories", "flag", "nation", "country", "banner"],
"🇬🇦": ["ga", "flag", "nation", "country", "banner"],
"🇬🇲": ["gm", "flag", "nation", "country", "banner"],
"🇬🇪": ["ge", "flag", "nation", "country", "banner"],
"🇩🇪": ["german", "nation", "flag", "country", "banner"],
"🇬🇭": ["gh", "flag", "nation", "country", "banner"],
"🇬🇮": ["gi", "flag", "nation", "country", "banner"],
"🇬🇷": ["gr", "flag", "nation", "country", "banner"],
"🇬🇱": ["gl", "flag", "nation", "country", "banner"],
"🇬🇩": ["gd", "flag", "nation", "country", "banner"],
"🇬🇵": ["gp", "flag", "nation", "country", "banner"],
"🇬🇺": ["gu", "flag", "nation", "country", "banner"],
"🇬🇹": ["gt", "flag", "nation", "country", "banner"],
"🇬🇬": ["gg", "flag", "nation", "country", "banner"],
"🇬🇳": ["gn", "flag", "nation", "country", "banner"],
"🇬🇼": ["gw", "bissau", "flag", "nation", "country", "banner"],
"🇬🇾": ["gy", "flag", "nation", "country", "banner"],
"🇭🇹": ["ht", "flag", "nation", "country", "banner"],
"🇭🇳": ["hn", "flag", "nation", "country", "banner"],
"🇭🇰": ["hong", "kong", "flag", "nation", "country", "banner"],
"🇭🇺": ["hu", "flag", "nation", "country", "banner"],
"🇮🇸": ["is", "flag", "nation", "country", "banner"],
"🇮🇳": ["in", "flag", "nation", "country", "banner"],
"🇮🇩": ["flag", "nation", "country", "banner"],
"🇮🇷": ["iran, ", "islamic", "republic", "flag", "nation", "country", "banner"],
"🇮🇶": ["iq", "flag", "nation", "country", "banner"],
"🇮🇪": ["ie", "flag", "nation", "country", "banner"],
"🇮🇲": ["isle", "man", "flag", "nation", "country", "banner"],
"🇮🇱": ["il", "flag", "nation", "country", "banner"],
"🇮🇹": ["italy", "flag", "nation", "country", "banner"],
"🇨🇮": ["ivory", "coast", "flag", "nation", "country", "banner"],
"🇯🇲": ["jm", "flag", "nation", "country", "banner"],
"🇯🇵": ["japanese", "nation", "flag", "country", "banner"],
"🇯🇪": ["je", "flag", "nation", "country", "banner"],
"🇯🇴": ["jo", "flag", "nation", "country", "banner"],
"🇰🇿": ["kz", "flag", "nation", "country", "banner"],
"🇰🇪": ["ke", "flag", "nation", "country", "banner"],
"🇰🇮": ["ki", "flag", "nation", "country", "banner"],
"🇽🇰": ["xk", "flag", "nation", "country", "banner"],
"🇰🇼": ["kw", "flag", "nation", "country", "banner"],
"🇰🇬": ["kg", "flag", "nation", "country", "banner"],
"🇱🇦": ["lao", "democratic", "republic", "flag", "nation", "country", "banner"],
"🇱🇻": ["lv", "flag", "nation", "country", "banner"],
"🇱🇧": ["lb", "flag", "nation", "country", "banner"],
"🇱🇸": ["ls", "flag", "nation", "country", "banner"],
"🇱🇷": ["lr", "flag", "nation", "country", "banner"],
"🇱🇾": ["ly", "flag", "nation", "country", "banner"],
"🇱🇮": ["li", "flag", "nation", "country", "banner"],
"🇱🇹": ["lt", "flag", "nation", "country", "banner"],
"🇱🇺": ["lu", "flag", "nation", "country", "banner"],
"🇲🇴": ["macao", "flag", "nation", "country", "banner"],
"🇲🇰": ["macedonia, ", "flag", "nation", "country", "banner"],
"🇲🇬": ["mg", "flag", "nation", "country", "banner"],
"🇲🇼": ["mw", "flag", "nation", "country", "banner"],
"🇲🇾": ["my", "flag", "nation", "country", "banner"],
"🇲🇻": ["mv", "flag", "nation", "country", "banner"],
"🇲🇱": ["ml", "flag", "nation", "country", "banner"],
"🇲🇹": ["mt", "flag", "nation", "country", "banner"],
"🇲🇭": ["marshall", "islands", "flag", "nation", "country", "banner"],
"🇲🇶": ["mq", "flag", "nation", "country", "banner"],
"🇲🇷": ["mr", "flag", "nation", "country", "banner"],
"🇲🇺": ["mu", "flag", "nation", "country", "banner"],
"🇾🇹": ["yt", "flag", "nation", "country", "banner"],
"🇲🇽": ["mx", "flag", "nation", "country", "banner"],
"🇫🇲": ["micronesia, ", "federated", "states", "flag", "nation", "country", "banner"],
"🇲🇩": ["moldova, ", "republic", "flag", "nation", "country", "banner"],
"🇲🇨": ["mc", "flag", "nation", "country", "banner"],
"🇲🇳": ["mn", "flag", "nation", "country", "banner"],
"🇲🇪": ["me", "flag", "nation", "country", "banner"],
"🇲🇸": ["ms", "flag", "nation", "country", "banner"],
"🇲🇦": ["ma", "flag", "nation", "country", "banner"],
"🇲🇿": ["mz", "flag", "nation", "country", "banner"],
"🇲🇲": ["mm", "flag", "nation", "country", "banner"],
"🇳🇦": ["na", "flag", "nation", "country", "banner"],
"🇳🇷": ["nr", "flag", "nation", "country", "banner"],
"🇳🇵": ["np", "flag", "nation", "country", "banner"],
"🇳🇱": ["nl", "flag", "nation", "country", "banner"],
"🇳🇨": ["new", "caledonia", "flag", "nation", "country", "banner"],
"🇳🇿": ["new", "zealand", "flag", "nation", "country", "banner"],
"🇳🇮": ["ni", "flag", "nation", "country", "banner"],
"🇳🇪": ["ne", "flag", "nation", "country", "banner"],
"🇳🇬": ["flag", "nation", "country", "banner"],
"🇳🇺": ["nu", "flag", "nation", "country", "banner"],
"🇳🇫": ["norfolk", "island", "flag", "nation", "country", "banner"],
"🇲🇵": ["northern", "mariana", "islands", "flag", "nation", "country", "banner"],
"🇰🇵": ["north", "korea", "nation", "flag", "country", "banner"],
"🇳🇴": ["no", "flag", "nation", "country", "banner"],
"🇴🇲": ["om_symbol", "flag", "nation", "country", "banner"],
"🇵🇰": ["pk", "flag", "nation", "country", "banner"],
"🇵🇼": ["pw", "flag", "nation", "country", "banner"],
"🇵🇸": ["palestine", "palestinian", "territories", "flag", "nation", "country", "banner"],
"🇵🇦": ["pa", "flag", "nation", "country", "banner"],
"🇵🇬": ["papua", "new", "guinea", "flag", "nation", "country", "banner"],
"🇵🇾": ["py", "flag", "nation", "country", "banner"],
"🇵🇪": ["pe", "flag", "nation", "country", "banner"],
"🇵🇭": ["ph", "flag", "nation", "country", "banner"],
"🇵🇳": ["pitcairn", "flag", "nation", "country", "banner"],
"🇵🇱": ["pl", "flag", "nation", "country", "banner"],
"🇵🇹": ["pt", "flag", "nation", "country", "banner"],
"🇵🇷": ["puerto", "rico", "flag", "nation", "country", "banner"],
"🇶🇦": ["qa", "flag", "nation", "country", "banner"],
"🇷🇪": ["réunion", "flag", "nation", "country", "banner"],
"🇷🇴": ["ro", "flag", "nation", "country", "banner"],
"🇷🇺": ["russian", "federation", "flag", "nation", "country", "banner"],
"🇷🇼": ["rw", "flag", "nation", "country", "banner"],
"🇧🇱": ["saint", "barthélemy", "flag", "nation", "country", "banner"],
"🇸🇭": ["saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner"],
"🇰🇳": ["saint", "kitts", "nevis", "flag", "nation", "country", "banner"],
"🇱🇨": ["saint", "lucia", "flag", "nation", "country", "banner"],
"🇵🇲": ["saint", "pierre", "miquelon", "flag", "nation", "country", "banner"],
"🇻🇨": ["saint", "vincent", "grenadines", "flag", "nation", "country", "banner"],
"🇼🇸": ["ws", "flag", "nation", "country", "banner"],
"🇸🇲": ["san", "marino", "flag", "nation", "country", "banner"],
"🇸🇹": ["sao", "tome", "principe", "flag", "nation", "country", "banner"],
"🇸🇦": ["flag", "nation", "country", "banner"],
"🇸🇳": ["sn", "flag", "nation", "country", "banner"],
"🇷🇸": ["rs", "flag", "nation", "country", "banner"],
"🇸🇨": ["sc", "flag", "nation", "country", "banner"],
"🇸🇱": ["sierra", "leone", "flag", "nation", "country", "banner"],
"🇸🇬": ["sg", "flag", "nation", "country", "banner"],
"🇸🇽": ["sint", "maarten", "dutch", "flag", "nation", "country", "banner"],
"🇸🇰": ["sk", "flag", "nation", "country", "banner"],
"🇸🇮": ["si", "flag", "nation", "country", "banner"],
"🇸🇧": ["solomon", "islands", "flag", "nation", "country", "banner"],
"🇸🇴": ["so", "flag", "nation", "country", "banner"],
"🇿🇦": ["south", "africa", "flag", "nation", "country", "banner"],
"🇬🇸": ["south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner"],
"🇰🇷": ["south", "korea", "nation", "flag", "country", "banner"],
"🇸🇸": ["south", "sd", "flag", "nation", "country", "banner"],
"🇪🇸": ["spain", "flag", "nation", "country", "banner"],
"🇱🇰": ["sri", "lanka", "flag", "nation", "country", "banner"],
"🇸🇩": ["sd", "flag", "nation", "country", "banner"],
"🇸🇷": ["sr", "flag", "nation", "country", "banner"],
"🇸🇿": ["sz", "flag", "nation", "country", "banner"],
"🇸🇪": ["se", "flag", "nation", "country", "banner"],
"🇨🇭": ["ch", "flag", "nation", "country", "banner"],
"🇸🇾": ["syrian", "arab", "republic", "flag", "nation", "country", "banner"],
"🇹🇼": ["tw", "flag", "nation", "country", "banner"],
"🇹🇯": ["tj", "flag", "nation", "country", "banner"],
"🇹🇿": ["tanzania, ", "united", "republic", "flag", "nation", "country", "banner"],
"🇹🇭": ["th", "flag", "nation", "country", "banner"],
"🇹🇱": ["timor", "leste", "flag", "nation", "country", "banner"],
"🇹🇬": ["tg", "flag", "nation", "country", "banner"],
"🇹🇰": ["tk", "flag", "nation", "country", "banner"],
"🇹🇴": ["to", "flag", "nation", "country", "banner"],
"🇹🇹": ["trinidad", "tobago", "flag", "nation", "country", "banner"],
"🇹🇦": ["flag", "nation", "country", "banner"],
"🇹🇳": ["tn", "flag", "nation", "country", "banner"],
"🇹🇷": ["turkey", "flag", "nation", "country", "banner"],
"🇹🇲": ["flag", "nation", "country", "banner"],
"🇹🇨": ["turks", "caicos", "islands", "flag", "nation", "country", "banner"],
"🇹🇻": ["flag", "nation", "country", "banner"],
"🇺🇬": ["ug", "flag", "nation", "country", "banner"],
"🇺🇦": ["ua", "flag", "nation", "country", "banner"],
"🇦🇪": ["united", "arab", "emirates", "flag", "nation", "country", "banner"],
"🇬🇧": ["united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack"],
"🇦🇴": ["ao", "angola", "flag", "nation", "country", "banner"],
"🇦🇮": ["ai", "anguilla", "flag", "nation", "country", "banner"],
"🇦🇶": ["aq", "antarctique", "flag", "nation", "country", "banner"],
"🇦🇬": ["ag", "antigua", "barbuda", "flag", "nation", "country", "banner"],
"🇦🇷": ["ar", "argentina", "flag", "nation", "country", "banner"],
"🇦🇲": ["am", "armenia", "flag", "nation", "country", "banner"],
"🇦🇼": ["aw", "aruba", "flag", "nation", "country", "banner"],
"🇦🇨": ["ac", "ascension", "island", "flag", "nation", "country", "banner"],
"🇦🇺": ["au", "australia", "flag", "nation", "country", "banner"],
"🇦🇹": ["at", "austria", "flag", "nation", "country", "banner"],
"🇦🇿": ["az", "azerbaijan", "flag", "nation", "country", "banner"],
"🇧🇸": ["bs", "bahamas", "flag", "nation", "country", "banner"],
"🇧🇭": ["bh", "bahrain", "flag", "nation", "country", "banner"],
"🇧🇩": ["bd", "bangladesh", "flag", "nation", "country", "banner"],
"🇧🇧": ["bb", "barbados", "flag", "nation", "country", "banner"],
"🇧🇾": ["by", "belarus", "flag", "nation", "country", "banner"],
"🇧🇪": ["be", "belgium", "flag", "nation", "country", "banner"],
"🇧🇿": ["bz", "belize", "flag", "nation", "country", "banner"],
"🇧🇯": ["bj", "benin", "flag", "nation", "country", "banner"],
"🇧🇲": ["bm", "bermuda", "flag", "nation", "country", "banner"],
"🇧🇹": ["bt", "bhutan", "flag", "nation", "country", "banner"],
"🇧🇴": ["bo", "bolivia", "flag", "nation", "country", "banner"],
"🇧🇶": ["bq", "bonaire", "flag", "nation", "country", "banner"],
"🇧🇦": ["ba", "bosnia", "herzegovina", "flag", "nation", "country", "banner"],
"🇧🇼": ["bw", "botswana", "flag", "nation", "country", "banner"],
"🇧🇷": ["br", "brazil", "flag", "nation", "country", "banner"],
"🇮🇴": ["io", "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner"],
"🇻🇬": ["vg", "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner"],
"🇧🇳": ["bn", "brunei", "darussalam", "flag", "nation", "country", "banner"],
"🇧🇬": ["bg", "bulgaria", "flag", "nation", "country", "banner"],
"🇧🇫": ["bf", "burkina", "faso", "flag", "nation", "country", "banner"],
"🇧🇮": ["bi", "burundi", "flag", "nation", "country", "banner"],
"🇨🇻": ["cv", "cabo", "verde", "flag", "nation", "country", "banner"],
"🇰🇭": ["kh", "cambodia", "flag", "nation", "country", "banner"],
"🇨🇲": ["cm", "cameroon", "flag", "nation", "country", "banner"],
"🇨🇦": ["ca", "canada", "flag", "nation", "country", "banner"],
"🇮🇨": ["ic", "canary", "islands", "flag", "nation", "country", "banner"],
"🇰🇾": ["ky", "cayman", "islands", "flag", "nation", "country", "banner"],
"🇨🇫": ["cf", "central", "african", "republic", "flag", "nation", "country", "banner"],
"🇹🇩": ["td", "chad", "flag", "nation", "country", "banner"],
"🇨🇱": ["cl", "chile", "flag", "nation", "country", "banner"],
"🇨🇳": ["cn", "china", "chinese", "prc", "flag", "country", "nation", "banner"],
"🇨🇽": ["cx", "christmas", "island", "flag", "nation", "country", "banner"],
"🇨🇨": ["cc", "cocos", "keeling", "islands", "flag", "nation", "country", "banner"],
"🇨🇴": ["co", "colombia", "flag", "nation", "country", "banner"],
"🇰🇲": ["km", "comoros", "flag", "nation", "country", "banner"],
"🇨🇬": ["cg", "republic", "congo", "flag", "nation", "country", "banner"],
"🇨🇩": ["cd", "democratic", "republic", "congo", "flag", "nation", "country", "banner"],
"🇨🇰": ["ck", "cook", "islands", "flag", "nation", "country", "banner"],
"🇨🇷": ["cr", "costa", "rica", "flag", "nation", "country", "banner"],
"🇭🇷": ["hr", "croatia", "flag", "nation", "country", "banner"],
"🇨🇺": ["cu", "cuba", "flag", "nation", "country", "banner"],
"🇨🇼": ["cw", "curacao", "curaçao", "flag", "nation", "country", "banner"],
"🇨🇾": ["cy", "cyprus", "flag", "nation", "country", "banner"],
"🇨🇿": ["cz", "czech", "republic", "flag", "nation", "country", "banner"],
"🇩🇰": ["dk", "denmark", "flag", "nation", "country", "banner"],
"🇩🇯": ["dj", "djibouti", "flag", "nation", "country", "banner"],
"🇩🇲": ["dm", "dominica", "flag", "nation", "country", "banner"],
"🇩🇴": ["do", "dominican", "republic", "flag", "nation", "country", "banner"],
"🇪🇨": ["ec", "ecuador", "flag", "nation", "country", "banner"],
"🇪🇬": ["eg", "egypt", "flag", "nation", "country", "banner"],
"🇸🇻": ["sv", "el", "salvador", "flag", "nation", "country", "banner"],
"🇬🇶": ["gq", "equatorial", "guinea", "flag", "nation", "country", "banner"],
"🇪🇷": ["er", "eritrea", "flag", "nation", "country", "banner"],
"🇪🇪": ["ee", "estonia", "flag", "nation", "country", "banner"],
"🇪🇹": ["et", "ethiopia", "flag", "nation", "country", "banner"],
"🇪🇺": ["eu", "european", "union", "flag", "banner"],
"🇫🇰": ["fk", "falkland", "islands", "malvinas", "flag", "nation", "country", "banner"],
"🇫🇴": ["fo", "faroe", "islands", "flag", "nation", "country", "banner"],
"🇫🇯": ["fj", "fiji", "flag", "nation", "country", "banner"],
"🇫🇮": ["fi", "finland", "flag", "nation", "country", "banner"],
"🇫🇷": ["fr", "banner", "flag", "nation", "france", "french", "country"],
"🇬🇫": ["gf", "french", "guiana", "flag", "nation", "country", "banner"],
"🇵🇫": ["pf", "french", "polynesia", "flag", "nation", "country", "banner"],
"🇹🇫": ["tf", "french", "southern", "territories", "flag", "nation", "country", "banner"],
"🇬🇦": ["ga", "gabon", "flag", "nation", "country", "banner"],
"🇬🇲": ["gm", "gambia", "flag", "nation", "country", "banner"],
"🇬🇪": ["ge", "georgia", "flag", "nation", "country", "banner"],
"🇩🇪": ["de", "deutschland", "german", "nation", "flag", "country", "banner"],
"🇬🇭": ["gh", "ghana", "flag", "nation", "country", "banner"],
"🇬🇮": ["gi", "gibraltar", "flag", "nation", "country", "banner"],
"🇬🇷": ["gr", "greece", "flag", "nation", "country", "banner"],
"🇬🇱": ["gl", "green", "land", "flag", "nation", "country", "banner"],
"🇬🇩": ["gd", "grenada", "flag", "nation", "country", "banner"],
"🇬🇵": ["gp", "guadeloupe", "flag", "nation", "country", "banner"],
"🇬🇺": ["gu", "guam", "flag", "nation", "country", "banner"],
"🇬🇹": ["gt", "guatemala", "flag", "nation", "country", "banner"],
"🇬🇬": ["gg", "guernsey", "flag", "nation", "country", "banner"],
"🇬🇳": ["gn", "guinea", "flag", "nation", "country", "banner"],
"🇬🇼": ["gw", "guiana", "bissau", "flag", "nation", "country", "banner"],
"🇬🇾": ["gy", "guyana", "flag", "nation", "country", "banner"],
"🇭🇹": ["ht", "haiti", "flag", "nation", "country", "banner"],
"🇭🇳": ["hn", "honduras", "flag", "nation", "country", "banner"],
"🇭🇰": ["hk", "hong", "kong", "flag", "nation", "country", "banner"],
"🇭🇺": ["hu", "hungary", "flag", "nation", "country", "banner"],
"🇮🇸": ["is", "iceland", "Ísland", "flag", "nation", "country", "banner"],
"🇮🇳": ["in", "india", "flag", "nation", "country", "banner"],
"🇮🇩": ["id", "indonesia", "flag", "nation", "country", "banner"],
"🇮🇷": ["ir", "iran", "islamic", "republic", "flag", "nation", "country", "banner"],
"🇮🇶": ["iq", "iraq", "flag", "nation", "country", "banner"],
"🇮🇪": ["ie", "ireland", "flag", "nation", "country", "banner"],
"🇮🇲": ["im", "isle", "man", "flag", "nation", "country", "banner"],
"🇮🇱": ["il", "israel", "flag", "nation", "country", "banner"],
"🇮🇹": ["it", "italy", "flag", "nation", "country", "banner"],
"🇨🇮": ["ci", "cote", "divoire", "Côte", "d'Ivoire", "ivory", "coast", "flag", "nation", "country", "banner"],
"🇯🇲": ["jm", "jamaica", "flag", "nation", "country", "banner"],
"🇯🇵": ["jp", "japan", "japanese", "nation", "flag", "country", "banner"],
"🇯🇪": ["je", "jersey", "flag", "nation", "country", "banner"],
"🇯🇴": ["jo", "jordan", "flag", "nation", "country", "banner"],
"🇰🇿": ["kz", "kazakhstan", "flag", "nation", "country", "banner"],
"🇰🇪": ["ke", "kenya", "flag", "nation", "country", "banner"],
"🇰🇮": ["ki", "kiribati", "flag", "nation", "country", "banner"],
"🇽🇰": ["xk", "kosovo", "flag", "nation", "country", "banner"],
"🇰🇼": ["kw", "kuwait", "flag", "nation", "country", "banner"],
"🇰🇬": ["kg", "kyrgyzstan", "kyrgyz", "flag", "nation", "country", "banner"],
"🇱🇦": ["la", "laos", "lao", "democratic", "republic", "flag", "nation", "country", "banner"],
"🇱🇻": ["lv", "latvia", "flag", "nation", "country", "banner"],
"🇱🇧": ["lb", "lebanon", "flag", "nation", "country", "banner"],
"🇱🇸": ["ls", "lesotho", "flag", "nation", "country", "banner"],
"🇱🇷": ["lr", "liberia", "flag", "nation", "country", "banner"],
"🇱🇾": ["ly", "libya", "flag", "nation", "country", "banner"],
"🇱🇮": ["li", "liechtenstein", "flag", "nation", "country", "banner"],
"🇱🇹": ["lt", "lithuania", "flag", "nation", "country", "banner"],
"🇱🇺": ["lu", "luxembourg", "flag", "nation", "country", "banner"],
"🇲🇴": ["mo", "macao", "macau", "flag", "nation", "country", "banner"],
"🇲🇰": ["mk", "north", "macedonia", "flag", "nation", "country", "banner"],
"🇲🇬": ["mg", "madagascar", "flag", "nation", "country", "banner"],
"🇲🇼": ["mw", "malawi", "flag", "nation", "country", "banner"],
"🇲🇾": ["my", "malaysia", "flag", "nation", "country", "banner"],
"🇲🇻": ["mv", "maldives", "republic", "flag", "nation", "country", "banner"],
"🇲🇱": ["ml", "mali", "flag", "nation", "country", "banner"],
"🇲🇹": ["mt", "malta", "flag", "nation", "country", "banner"],
"🇲🇭": ["mh", "marshall", "islands", "flag", "nation", "country", "banner"],
"🇲🇶": ["mq", "martinique", "flag", "nation", "country", "banner"],
"🇲🇷": ["mr", "mauritania", "flag", "nation", "country", "banner"],
"🇲🇺": ["mu", "mauritius", "flag", "nation", "country", "banner"],
"🇾🇹": ["yt", "mayotte", "flag", "nation", "country", "banner"],
"🇲🇽": ["mx", "mexico", "flag", "nation", "country", "banner"],
"🇫🇲": ["fm", "micronesia", "federated", "states", "flag", "nation", "country", "banner"],
"🇲🇩": ["md", "moldova", "republic", "flag", "nation", "country", "banner"],
"🇲🇨": ["mc", "monaco", "flag", "nation", "country", "banner"],
"🇲🇳": ["mn", "mongolia", "flag", "nation", "country", "banner"],
"🇲🇪": ["me", "montenegro", "flag", "nation", "country", "banner"],
"🇲🇸": ["ms", "montserrat", "flag", "nation", "country", "banner"],
"🇲🇦": ["ma", "morocco", "flag", "nation", "country", "banner"],
"🇲🇿": ["mz", "mozambique", "flag", "nation", "country", "banner"],
"🇲🇲": ["mm", "myanmar", "flag", "nation", "country", "banner"],
"🇳🇦": ["na", "namibia", "flag", "nation", "country", "banner"],
"🇳🇷": ["nr", "nauru", "flag", "nation", "country", "banner"],
"🇳🇵": ["np", "nepal", "flag", "nation", "country", "banner"],
"🇳🇱": ["nl", "netherlands", "flag", "nation", "country", "banner"],
"🇳🇨": ["nc", "new", "caledonia", "flag", "nation", "country", "banner"],
"🇳🇿": ["nz", "new", "zealand", "flag", "nation", "country", "banner"],
"🇳🇮": ["ni", "nicaragua", "flag", "nation", "country", "banner"],
"🇳🇪": ["ne", "niger", "flag", "nation", "country", "banner"],
"🇳🇬": ["ng", "nigeria", "flag", "nation", "country", "banner"],
"🇳🇺": ["nu", "niue", "flag", "nation", "country", "banner"],
"🇳🇫": ["nf", "norfolk", "island", "flag", "nation", "country", "banner"],
"🇲🇵": ["mp", "northern", "mariana", "islands", "flag", "nation", "country", "banner"],
"🇰🇵": ["kp", "democratic", "people", "republic", "north", "korea", "nation", "flag", "country", "banner"],
"🇳🇴": ["no", "norway", "flag", "nation", "country", "banner"],
"🇴🇲": ["om", "oman", "flag", "nation", "country", "banner"],
"🇵🇰": ["pk", "pakistan", "flag", "nation", "country", "banner"],
"🇵🇼": ["pw", "palau", "flag", "nation", "country", "banner"],
"🇵🇸": ["ps", "palestine", "palestinian", "territories", "flag", "nation", "country", "banner"],
"🇵🇦": ["pa", "panama", "flag", "nation", "country", "banner"],
"🇵🇬": ["pg", "papua", "new", "guinea", "flag", "nation", "country", "banner"],
"🇵🇾": ["py", "paraguay", "flag", "nation", "country", "banner"],
"🇵🇪": ["pe", "peru", "flag", "nation", "country", "banner"],
"🇵🇭": ["ph", "philippines", "flag", "nation", "country", "banner"],
"🇵🇳": ["pn", "pitcairn", "flag", "nation", "country", "banner"],
"🇵🇱": ["pl", "poland", "flag", "nation", "country", "banner"],
"🇵🇹": ["pt", "portugal", "flag", "nation", "country", "banner"],
"🇵🇷": ["pr", "puerto", "rico", "flag", "nation", "country", "banner"],
"🇶🇦": ["qa", "qatar", "flag", "nation", "country", "banner"],
"🇷🇪": ["re", "reunion", "réunion", "flag", "nation", "country", "banner"],
"🇷🇴": ["ro", "romania", "flag", "nation", "country", "banner"],
"🇷🇺": ["ru", "russian", "federation", "flag", "nation", "country", "banner"],
"🇷🇼": ["rw", "rwanda", "flag", "nation", "country", "banner"],
"🇧🇱": ["bl", "saint", "barthélemy", "flag", "nation", "country", "banner"],
"🇸🇭": ["sh", "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner"],
"🇰🇳": ["kn", "saint", "kitts", "nevis", "flag", "nation", "country", "banner"],
"🇱🇨": ["lc", "saint", "lucia", "flag", "nation", "country", "banner"],
"🇵🇲": ["pm", "saint", "pierre", "miquelon", "flag", "nation", "country", "banner"],
"🇻🇨": ["vc", "saint", "vincent", "grenadines", "flag", "nation", "country", "banner"],
"🇼🇸": ["ws", "western", "samoa", "flag", "nation", "country", "banner"],
"🇸🇲": ["sm", "san", "marino", "flag", "nation", "country", "banner"],
"🇸🇹": ["st", "sao", "tome", "principe", "flag", "nation", "country", "banner"],
"🇸🇦": ["saudi", "arabia", "flag", "nation", "country", "banner"],
"🇸🇳": ["sn", "senegal", "flag", "nation", "country", "banner"],
"🇷🇸": ["rs", "serbia", "flag", "nation", "country", "banner"],
"🇸🇨": ["sc", "seychelles", "flag", "nation", "country", "banner"],
"🇸🇱": ["sl", "sierra", "leone", "flag", "nation", "country", "banner"],
"🇸🇬": ["sg", "singapore", "flag", "nation", "country", "banner"],
"🇸🇽": ["sx", "sint", "maarten", "dutch", "flag", "nation", "country", "banner"],
"🇸🇰": ["sk", "slovakia", "flag", "nation", "country", "banner"],
"🇸🇮": ["si", "slovenia", "flag", "nation", "country", "banner"],
"🇸🇧": ["sb", "solomon", "islands", "flag", "nation", "country", "banner"],
"🇸🇴": ["so", "somalia", "flag", "nation", "country", "banner"],
"🇿🇦": ["za", "south", "africa", "flag", "nation", "country", "banner"],
"🇬🇸": ["gs", "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner"],
"🇰🇷": ["kr", "south", "korea", "nation", "flag", "country", "banner"],
"🇸🇸": ["ss", "south", "sudan", "flag", "nation", "country", "banner"],
"🇪🇸": ["es", "spain", "españa", "flag", "nation", "country", "banner"],
"🇱🇰": ["lk", "sri", "lanka", "flag", "nation", "country", "banner"],
"🇸🇩": ["sd", "sudan", "flag", "nation", "country", "banner"],
"🇸🇷": ["sr", "suriname", "flag", "nation", "country", "banner"],
"🇸🇿": ["sz", "eswatini", "flag", "nation", "country", "banner"],
"🇸🇪": ["se", "sweden", "flag", "nation", "country", "banner"],
"🇨🇭": ["ch", "switzerland", "confoederatio", "helvetica", "flag", "nation", "country", "banner"],
"🇸🇾": ["sy", "syrian", "arab", "republic", "flag", "nation", "country", "banner"],
"🇹🇼": ["tw", "taiwan", "flag", "nation", "country", "banner"],
"🇹🇯": ["tj", "tajikistan", "flag", "nation", "country", "banner"],
"🇹🇿": ["tz", "tanzania", "united", "republic", "flag", "nation", "country", "banner"],
"🇹🇭": ["th", "thailand", "flag", "nation", "country", "banner"],
"🇹🇱": ["tl", "timor", "leste", "flag", "nation", "country", "banner"],
"🇹🇬": ["tg", "togo", "flag", "nation", "country", "banner"],
"🇹🇰": ["tk", "tokelau", "flag", "nation", "country", "banner"],
"🇹🇴": ["to", "tonga", "flag", "nation", "country", "banner"],
"🇹🇹": ["tt", "trinidad", "tobago", "flag", "nation", "country", "banner"],
"🇹🇦": ["ta", "tristan", "da", "cunha", "flag", "nation", "country", "banner"],
"🇹🇳": ["tn", "tunisia", "flag", "nation", "country", "banner"],
"🇹🇷": ["tr", "turkey", "türkiye", "flag", "nation", "country", "banner"],
"🇹🇲": ["tm", "turkmenistan", "flag", "nation", "country", "banner"],
"🇹🇨": ["tc", "turks", "caicos", "islands", "flag", "nation", "country", "banner"],
"🇹🇻": ["tv", "tuvalu", "flag", "nation", "country", "banner"],
"🇺🇬": ["ug", "uganda", "flag", "nation", "country", "banner"],
"🇺🇦": ["ua", "ukraine", "flag", "nation", "country", "banner"],
"🇦🇪": ["ae", "united", "arab", "emirates", "flag", "nation", "country", "banner"],
"🇬🇧": ["gb", "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "uk", "english", "england", "union jack"],
"🏴󠁧󠁢󠁥󠁮󠁧󠁿": ["flag", "english"],
"🏴󠁧󠁢󠁳󠁣󠁴󠁿": ["flag", "scottish"],
"🏴󠁧󠁢󠁷󠁬󠁳󠁿": ["flag", "welsh"],
"🇺🇸": ["united", "states", "america", "flag", "nation", "country", "banner"],
"🇻🇮": ["virgin", "islands", "us", "flag", "nation", "country", "banner"],
"🇺🇾": ["uy", "flag", "nation", "country", "banner"],
"🇺🇿": ["uz", "flag", "nation", "country", "banner"],
"🇻🇺": ["vu", "flag", "nation", "country", "banner"],
"🇻🇦": ["vatican", "city", "flag", "nation", "country", "banner"],
"🇻🇪": ["ve", "bolivarian", "republic", "flag", "nation", "country", "banner"],
"🇻🇳": ["viet", "nam", "flag", "nation", "country", "banner"],
"🇼🇫": ["wallis", "futuna", "flag", "nation", "country", "banner"],
"🇪🇭": ["western", "sahara", "flag", "nation", "country", "banner"],
"🇾🇪": ["ye", "flag", "nation", "country", "banner"],
"🇿🇲": ["zm", "flag", "nation", "country", "banner"],
"🇿🇼": ["zw", "flag", "nation", "country", "banner"],
"🇺🇳": ["un", "flag", "banner"],
"🇺🇸": ["us", "usa", "united", "states", "america", "flag", "nation", "country", "banner"],
"🇻🇮": ["vi", "virgin", "islands", "us", "flag", "nation", "country", "banner"],
"🇺🇾": ["uy", "uruguay", "flag", "nation", "country", "banner"],
"🇺🇿": ["uz", "uzbekistan", "flag", "nation", "country", "banner"],
"🇻🇺": ["vu", "vanuatu", "flag", "nation", "country", "banner"],
"🇻🇦": ["va", "vatican", "city", "flag", "nation", "country", "banner"],
"🇻🇪": ["ve", "venezuela", "flag", "nation", "country", "banner"],
"🇻🇳": ["vn", "viet", "nam", "flag", "nation", "country", "banner"],
"🇼🇫": ["wf", "wallis", "futuna", "flag", "nation", "country", "banner"],
"🇪🇭": ["eh", "western", "sahara", "flag", "nation", "country", "banner"],
"🇾🇪": ["ye", "yemen", "flag", "nation", "country", "banner"],
"🇿🇲": ["zm", "zambia", "flag", "nation", "country", "banner"],
"🇿🇼": ["zw", "zimbabwe", "flag", "nation", "country", "banner"],
"🇺🇳": ["un", "united", "nation", "flag", "banner"],
"🏴‍☠️": ["skull", "crossbones", "flag", "banner"]
}

View File

@@ -21,7 +21,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import XCalendar from './WidgetActivity.calendar.vue';
import XChart from './WidgetActivity.chart.vue';
import { GetFormResultType } from '@/scripts/form.js';

View File

@@ -11,7 +11,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { onMounted, onUnmounted, shallowRef } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
const name = 'ai';

View File

@@ -21,7 +21,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import { Interpreter, Parser, utils } from '@syuilo/aiscript';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import * as os from '@/os.js';
import MkContainer from '@/components/MkContainer.vue';

View File

@@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { onMounted, Ref, ref, watch } from 'vue';
import { Interpreter, Parser } from '@syuilo/aiscript';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import * as os from '@/os.js';
import { createAiScriptEnv } from '@/scripts/aiscript/api.js';

View File

@@ -13,7 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { Interpreter, Parser } from '@syuilo/aiscript';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import * as os from '@/os.js';
import { createAiScriptEnv } from '@/scripts/aiscript/api.js';

View File

@@ -39,7 +39,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import { i18n } from '@/i18n.js';
import { useInterval } from '@/scripts/use-interval.js';

View File

@@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';
import MkClickerGame from '@/components/MkClickerGame.vue';

View File

@@ -30,7 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { computed } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';
import MkAnalogClock from '@/components/MkAnalogClock.vue';

View File

@@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { computed } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import { timezones } from '@/scripts/timezones.js';
import MkDigitalClock from '@/components/MkDigitalClock.vue';

View File

@@ -26,7 +26,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';
import MkMiniChart from '@/components/MkMiniChart.vue';

View File

@@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { shallowRef } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';
import MkTagCloud from '@/components/MkTagCloud.vue';

View File

@@ -20,7 +20,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import { host } from '@/config.js';
import { instance } from '@/instance.js';

View File

@@ -52,7 +52,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { onUnmounted, reactive, ref } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import { useStream } from '@/stream.js';
import number from '@/filters/number.js';

View File

@@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref, watch } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';
import { defaultStore } from '@/store.js';

View File

@@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { defineAsyncComponent } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';
import XNotifications from '@/components/MkNotifications.vue';

View File

@@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import * as os from '@/os.js';
import { useInterval } from '@/scripts/use-interval.js';

View File

@@ -23,7 +23,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { onUnmounted, ref } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import { useStream } from '@/stream.js';
import { getStaticImageUrl } from '@/scripts/media-proxy.js';

View File

@@ -9,7 +9,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkPostForm from '@/components/MkPostForm.vue';

View File

@@ -22,7 +22,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import { $i } from '@/account.js';
import { userPage } from '@/filters/user.js';

View File

@@ -24,7 +24,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref, watch, computed } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';
import { url as base } from '@/config.js';

View File

@@ -28,7 +28,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref, watch, computed } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import MarqueeText from '@/components/MkMarquee.vue';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';

View File

@@ -18,7 +18,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { onMounted, ref, shallowRef } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import * as os from '@/os.js';
import { useInterval } from '@/scripts/use-interval.js';

View File

@@ -35,7 +35,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import * as os from '@/os.js';
import MkContainer from '@/components/MkContainer.vue';

View File

@@ -25,7 +25,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { ref } from 'vue';
import { useWidgetPropsManager, Widget, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { useWidgetPropsManager, WidgetComponentEmits, WidgetComponentExpose, WidgetComponentProps } from './widget.js';
import { GetFormResultType } from '@/scripts/form.js';
import MkContainer from '@/components/MkContainer.vue';
import MkMiniChart from '@/components/MkMiniChart.vue';

Some files were not shown because too many files have changed in this diff Show More