mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-04 15:34:13 +00:00 
			
		
		
		
	refactor(frontend): frontend-embed/src/to-be-sharedを共通化 (#14536)
* refactor(frontend): shouldCollapsedを共通化 * refactor(frontend): config.js, worker-multi-dispatch.js, intl-const.jsを共通化 * fix(frontend-shared): fix type error * refactor(frontend): is-link.jsと、同一の振る舞いをする記述を共通化 * fix * fix lint * lint fixes
This commit is contained in:
		
							parent
							
								
									0c2cfe31a3
								
							
						
					
					
						commit
						837a8e15d8
					
				
					 118 changed files with 181 additions and 309 deletions
				
			
		| 
						 | 
					@ -17,7 +17,7 @@ import { applyTheme, assertIsTheme } from '@/theme.js';
 | 
				
			||||||
import { fetchCustomEmojis } from '@/custom-emojis.js';
 | 
					import { fetchCustomEmojis } from '@/custom-emojis.js';
 | 
				
			||||||
import { DI } from '@/di.js';
 | 
					import { DI } from '@/di.js';
 | 
				
			||||||
import { serverMetadata } from '@/server-metadata.js';
 | 
					import { serverMetadata } from '@/server-metadata.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { parseEmbedParams } from '@@/js/embed-page.js';
 | 
					import { parseEmbedParams } from '@@/js/embed-page.js';
 | 
				
			||||||
import { postMessageToParentWindow, setIframeId } from '@/post-message.js';
 | 
					import { postMessageToParentWindow, setIframeId } from '@/post-message.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import { toUnicode } from 'punycode/';
 | 
					import { toUnicode } from 'punycode/';
 | 
				
			||||||
import { host as hostRaw } from '@/config.js';
 | 
					import { host as hostRaw } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
defineProps<{
 | 
					defineProps<{
 | 
				
			||||||
	user: Misskey.entities.UserLite;
 | 
						user: Misskey.entities.UserLite;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import DrawBlurhash from '@/workers/draw-blurhash?worker';
 | 
					import DrawBlurhash from '@/workers/draw-blurhash?worker';
 | 
				
			||||||
import TestWebGL2 from '@/workers/test-webgl2?worker';
 | 
					import TestWebGL2 from '@/workers/test-webgl2?worker';
 | 
				
			||||||
import { WorkerMultiDispatch } from '@/to-be-shared/worker-multi-dispatch.js';
 | 
					import { WorkerMultiDispatch } from '@@/js/worker-multi-dispatch.js';
 | 
				
			||||||
import { extractAvgColorFromBlurhash } from '@@/js/extract-avg-color-from-blurhash.js';
 | 
					import { extractAvgColorFromBlurhash } from '@@/js/extract-avg-color-from-blurhash.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const canvasPromise = new Promise<WorkerMultiDispatch | HTMLCanvasElement>(resolve => {
 | 
					const canvasPromise = new Promise<WorkerMultiDispatch | HTMLCanvasElement>(resolve => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { ref } from 'vue';
 | 
					import { ref } from 'vue';
 | 
				
			||||||
import EmA from './EmA.vue';
 | 
					import EmA from './EmA.vue';
 | 
				
			||||||
import { url as local } from '@/config.js';
 | 
					import { url as local } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = withDefaults(defineProps<{
 | 
					const props = withDefaults(defineProps<{
 | 
				
			||||||
	url: string;
 | 
						url: string;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
import { toUnicode } from 'punycode';
 | 
					import { toUnicode } from 'punycode';
 | 
				
			||||||
import { } from 'vue';
 | 
					import { } from 'vue';
 | 
				
			||||||
import tinycolor from 'tinycolor2';
 | 
					import tinycolor from 'tinycolor2';
 | 
				
			||||||
import { host as localHost } from '@/config.js';
 | 
					import { host as localHost } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = defineProps<{
 | 
					const props = defineProps<{
 | 
				
			||||||
	username: string;
 | 
						username: string;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ import EmMention from '@/components/EmMention.vue';
 | 
				
			||||||
import EmEmoji from '@/components/EmEmoji.vue';
 | 
					import EmEmoji from '@/components/EmEmoji.vue';
 | 
				
			||||||
import EmCustomEmoji from '@/components/EmCustomEmoji.vue';
 | 
					import EmCustomEmoji from '@/components/EmCustomEmoji.vue';
 | 
				
			||||||
import EmA from '@/components/EmA.vue';
 | 
					import EmA from '@/components/EmA.vue';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function safeParseFloat(str: unknown): number | null {
 | 
					function safeParseFloat(str: unknown): number | null {
 | 
				
			||||||
	if (typeof str !== 'string' || str === '') return null;
 | 
						if (typeof str !== 'string' || str === '') return null;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,8 +121,8 @@ import EmUserName from '@/components/EmUserName.vue';
 | 
				
			||||||
import EmTime from '@/components/EmTime.vue';
 | 
					import EmTime from '@/components/EmTime.vue';
 | 
				
			||||||
import { userPage } from '@/utils.js';
 | 
					import { userPage } from '@/utils.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { shouldCollapsed } from '@/to-be-shared/collapsed.js';
 | 
					import { shouldCollapsed } from '@@/js/collapsed.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getAppearNote(note: Misskey.entities.Note) {
 | 
					function getAppearNote(note: Misskey.entities.Note) {
 | 
				
			||||||
	return Misskey.note.isPureRenote(note) ? note.renote : note;
 | 
						return Misskey.note.isPureRenote(note) ? note.renote : note;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -142,9 +142,9 @@ import EmAcct from '@/components/EmAcct.vue';
 | 
				
			||||||
import { userPage } from '@/utils.js';
 | 
					import { userPage } from '@/utils.js';
 | 
				
			||||||
import { notePage } from '@/utils.js';
 | 
					import { notePage } from '@/utils.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { shouldCollapsed } from '@/to-be-shared/collapsed.js';
 | 
					import { shouldCollapsed } from '@@/js/collapsed.js';
 | 
				
			||||||
import { serverMetadata } from '@/server-metadata.js';
 | 
					import { serverMetadata } from '@/server-metadata.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import EmMfm from '@/components/EmMfm.js';
 | 
					import EmMfm from '@/components/EmMfm.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = defineProps<{
 | 
					const props = defineProps<{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,8 +35,8 @@ import * as Misskey from 'misskey-js';
 | 
				
			||||||
import EmMediaList from '@/components/EmMediaList.vue';
 | 
					import EmMediaList from '@/components/EmMediaList.vue';
 | 
				
			||||||
import EmPoll from '@/components/EmPoll.vue';
 | 
					import EmPoll from '@/components/EmPoll.vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { shouldCollapsed } from '@/to-be-shared/collapsed.js';
 | 
					import { shouldCollapsed } from '@@/js/collapsed.js';
 | 
				
			||||||
import EmA from '@/components/EmA.vue';
 | 
					import EmA from '@/components/EmA.vue';
 | 
				
			||||||
import EmMfm from '@/components/EmMfm.js';
 | 
					import EmMfm from '@/components/EmMfm.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { onMounted, onUnmounted, ref, computed } from 'vue';
 | 
					import { onMounted, onUnmounted, ref, computed } from 'vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { dateTimeFormat } from '@/to-be-shared/intl-const.js';
 | 
					import { dateTimeFormat } from '@@/js/intl-const.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = withDefaults(defineProps<{
 | 
					const props = withDefaults(defineProps<{
 | 
				
			||||||
	time: Date | string | number | null;
 | 
						time: Date | string | number | null;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
import { ref } from 'vue';
 | 
					import { ref } from 'vue';
 | 
				
			||||||
import { toUnicode as decodePunycode } from 'punycode/';
 | 
					import { toUnicode as decodePunycode } from 'punycode/';
 | 
				
			||||||
import EmA from './EmA.vue';
 | 
					import EmA from './EmA.vue';
 | 
				
			||||||
import { url as local } from '@/config.js';
 | 
					import { url as local } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function safeURIDecode(str: string): string {
 | 
					function safeURIDecode(str: string): string {
 | 
				
			||||||
	try {
 | 
						try {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@
 | 
				
			||||||
import { markRaw } from 'vue';
 | 
					import { markRaw } from 'vue';
 | 
				
			||||||
import { I18n } from '@@/js/i18n.js';
 | 
					import { I18n } from '@@/js/i18n.js';
 | 
				
			||||||
import type { Locale } from '../../../locales/index.js';
 | 
					import type { Locale } from '../../../locales/index.js';
 | 
				
			||||||
import { locale } from '@/config.js';
 | 
					import { locale } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const i18n = markRaw(new I18n<Locale>(locale, _DEV_));
 | 
					export const i18n = markRaw(new I18n<Locale>(locale, _DEV_));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import { ref } from 'vue';
 | 
					import { ref } from 'vue';
 | 
				
			||||||
import { apiUrl } from '@/config.js';
 | 
					import { apiUrl } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const pendingApiRequestsCount = ref(0);
 | 
					export const pendingApiRequestsCount = ref(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,8 +50,8 @@ import EmTimelineContainer from '@/components/EmTimelineContainer.vue';
 | 
				
			||||||
import { misskeyApi } from '@/misskey-api.js';
 | 
					import { misskeyApi } from '@/misskey-api.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { serverMetadata } from '@/server-metadata.js';
 | 
					import { serverMetadata } from '@/server-metadata.js';
 | 
				
			||||||
import { url, instanceName } from '@/config.js';
 | 
					import { url, instanceName } from '@@/js/config.js';
 | 
				
			||||||
import { isLink } from '@/to-be-shared/is-link.js';
 | 
					import { isLink } from '@@/js/is-link.js';
 | 
				
			||||||
import { defaultEmbedParams } from '@@/js/embed-page.js';
 | 
					import { defaultEmbedParams } from '@@/js/embed-page.js';
 | 
				
			||||||
import { DI } from '@/di.js';
 | 
					import { DI } from '@/di.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,8 +46,8 @@ import XNotFound from '@/pages/not-found.vue';
 | 
				
			||||||
import EmTimelineContainer from '@/components/EmTimelineContainer.vue';
 | 
					import EmTimelineContainer from '@/components/EmTimelineContainer.vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { serverMetadata } from '@/server-metadata.js';
 | 
					import { serverMetadata } from '@/server-metadata.js';
 | 
				
			||||||
import { url, instanceName } from '@/config.js';
 | 
					import { url, instanceName } from '@@/js/config.js';
 | 
				
			||||||
import { isLink } from '@/to-be-shared/is-link.js';
 | 
					import { isLink } from '@@/js/is-link.js';
 | 
				
			||||||
import { DI } from '@/di.js';
 | 
					import { DI } from '@/di.js';
 | 
				
			||||||
import { defaultEmbedParams } from '@@/js/embed-page.js';
 | 
					import { defaultEmbedParams } from '@@/js/embed-page.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,7 +59,7 @@ import EmTimelineContainer from '@/components/EmTimelineContainer.vue';
 | 
				
			||||||
import { misskeyApi } from '@/misskey-api.js';
 | 
					import { misskeyApi } from '@/misskey-api.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { serverMetadata } from '@/server-metadata.js';
 | 
					import { serverMetadata } from '@/server-metadata.js';
 | 
				
			||||||
import { url, instanceName } from '@/config.js';
 | 
					import { url, instanceName } from '@@/js/config.js';
 | 
				
			||||||
import { defaultEmbedParams } from '@@/js/embed-page.js';
 | 
					import { defaultEmbedParams } from '@@/js/embed-page.js';
 | 
				
			||||||
import { DI } from '@/di.js';
 | 
					import { DI } from '@/di.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,82 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * SPDX-FileCopyrightText: syuilo and misskey-project
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function defaultUseWorkerNumber(prev: number, totalWorkers: number) {
 | 
					 | 
				
			||||||
	return prev + 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export class WorkerMultiDispatch<POST = any, RETURN = any> {
 | 
					 | 
				
			||||||
	private symbol = Symbol('WorkerMultiDispatch');
 | 
					 | 
				
			||||||
	private workers: Worker[] = [];
 | 
					 | 
				
			||||||
	private terminated = false;
 | 
					 | 
				
			||||||
	private prevWorkerNumber = 0;
 | 
					 | 
				
			||||||
	private getUseWorkerNumber = defaultUseWorkerNumber;
 | 
					 | 
				
			||||||
	private finalizationRegistry: FinalizationRegistry<symbol>;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	constructor(workerConstructor: () => Worker, concurrency: number, getUseWorkerNumber = defaultUseWorkerNumber) {
 | 
					 | 
				
			||||||
		this.getUseWorkerNumber = getUseWorkerNumber;
 | 
					 | 
				
			||||||
		for (let i = 0; i < concurrency; i++) {
 | 
					 | 
				
			||||||
			this.workers.push(workerConstructor());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		this.finalizationRegistry = new FinalizationRegistry(() => {
 | 
					 | 
				
			||||||
			this.terminate();
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
		this.finalizationRegistry.register(this, this.symbol);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (_DEV_) console.log('WorkerMultiDispatch: Created', this);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public postMessage(message: POST, options?: Transferable[] | StructuredSerializeOptions, useWorkerNumber: typeof defaultUseWorkerNumber = this.getUseWorkerNumber) {
 | 
					 | 
				
			||||||
		let workerNumber = useWorkerNumber(this.prevWorkerNumber, this.workers.length);
 | 
					 | 
				
			||||||
		workerNumber = Math.abs(Math.round(workerNumber)) % this.workers.length;
 | 
					 | 
				
			||||||
		if (_DEV_) console.log('WorkerMultiDispatch: Posting message to worker', workerNumber, useWorkerNumber);
 | 
					 | 
				
			||||||
		this.prevWorkerNumber = workerNumber;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// 不毛だがunionをoverloadに突っ込めない
 | 
					 | 
				
			||||||
		// https://stackoverflow.com/questions/66507585/overload-signatures-union-types-and-no-overload-matches-this-call-error
 | 
					 | 
				
			||||||
		// https://github.com/microsoft/TypeScript/issues/14107
 | 
					 | 
				
			||||||
		if (Array.isArray(options)) {
 | 
					 | 
				
			||||||
			this.workers[workerNumber].postMessage(message, options);
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			this.workers[workerNumber].postMessage(message, options);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return workerNumber;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public addListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
 | 
					 | 
				
			||||||
		this.workers.forEach(worker => {
 | 
					 | 
				
			||||||
			worker.addEventListener('message', callback, options);
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public removeListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
 | 
					 | 
				
			||||||
		this.workers.forEach(worker => {
 | 
					 | 
				
			||||||
			worker.removeEventListener('message', callback, options);
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public terminate() {
 | 
					 | 
				
			||||||
		this.terminated = true;
 | 
					 | 
				
			||||||
		if (_DEV_) console.log('WorkerMultiDispatch: Terminating', this);
 | 
					 | 
				
			||||||
		this.workers.forEach(worker => {
 | 
					 | 
				
			||||||
			worker.terminate();
 | 
					 | 
				
			||||||
		});
 | 
					 | 
				
			||||||
		this.workers = [];
 | 
					 | 
				
			||||||
		this.finalizationRegistry.unregister(this);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public isTerminated() {
 | 
					 | 
				
			||||||
		return this.terminated;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public getWorkers() {
 | 
					 | 
				
			||||||
		return this.workers;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public getSymbol() {
 | 
					 | 
				
			||||||
		return this.symbol;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const acct = (user: Misskey.Acct) => {
 | 
					export const acct = (user: Misskey.Acct) => {
 | 
				
			||||||
	return Misskey.acct.toString(user);
 | 
						return Misskey.acct.toString(user);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										25
									
								
								packages/frontend-shared/@types/global.d.ts
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								packages/frontend-shared/@types/global.d.ts
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * SPDX-FileCopyrightText: syuilo and misskey-project
 | 
				
			||||||
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
				
			||||||
 | 
					type FIXME = any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare const _LANGS_: string[][];
 | 
				
			||||||
 | 
					declare const _VERSION_: string;
 | 
				
			||||||
 | 
					declare const _ENV_: string;
 | 
				
			||||||
 | 
					declare const _DEV_: boolean;
 | 
				
			||||||
 | 
					declare const _PERF_PREFIX_: string;
 | 
				
			||||||
 | 
					declare const _DATA_TRANSFER_DRIVE_FILE_: string;
 | 
				
			||||||
 | 
					declare const _DATA_TRANSFER_DRIVE_FOLDER_: string;
 | 
				
			||||||
 | 
					declare const _DATA_TRANSFER_DECK_COLUMN_: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// for dev-mode
 | 
				
			||||||
 | 
					declare const _LANGS_FULL_: string[][];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TagCanvas
 | 
				
			||||||
 | 
					interface Window {
 | 
				
			||||||
 | 
						// eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
				
			||||||
 | 
						TagCanvas: any;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,11 @@ export default [
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	...pluginVue.configs['flat/recommended'],
 | 
						...pluginVue.configs['flat/recommended'],
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		files: ['js/**/*.{ts,vue}', '**/*.vue'],
 | 
							files: [
 | 
				
			||||||
 | 
								'@types/**/*.ts',
 | 
				
			||||||
 | 
								'js/**/*.ts',
 | 
				
			||||||
 | 
								'**/*.vue',
 | 
				
			||||||
 | 
							],
 | 
				
			||||||
		languageOptions: {
 | 
							languageOptions: {
 | 
				
			||||||
			globals: {
 | 
								globals: {
 | 
				
			||||||
				...Object.fromEntries(Object.entries(globals.node).map(([key]) => [key, 'off'])),
 | 
									...Object.fromEntries(Object.entries(globals.node).map(([key]) => [key, 'off'])),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,7 +7,7 @@ import * as Misskey from 'misskey-js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function shouldCollapsed(note: Misskey.entities.Note, urls: string[]): boolean {
 | 
					export function shouldCollapsed(note: Misskey.entities.Note, urls: string[]): boolean {
 | 
				
			||||||
	const collapsed = note.cw == null && (
 | 
						const collapsed = note.cw == null && (
 | 
				
			||||||
		note.text != null && (
 | 
							(note.text != null && (
 | 
				
			||||||
			(note.text.includes('$[x2')) ||
 | 
								(note.text.includes('$[x2')) ||
 | 
				
			||||||
			(note.text.includes('$[x3')) ||
 | 
								(note.text.includes('$[x3')) ||
 | 
				
			||||||
			(note.text.includes('$[x4')) ||
 | 
								(note.text.includes('$[x4')) ||
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@ export function shouldCollapsed(note: Misskey.entities.Note, urls: string[]): bo
 | 
				
			||||||
			(note.text.split('\n').length > 9) ||
 | 
								(note.text.split('\n').length > 9) ||
 | 
				
			||||||
			(note.text.length > 500) ||
 | 
								(note.text.length > 500) ||
 | 
				
			||||||
			(urls.length >= 4)
 | 
								(urls.length >= 4)
 | 
				
			||||||
		) || note.files.length >= 5
 | 
							)) || (note.files != null && note.files.length >= 5)
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return collapsed;
 | 
						return collapsed;
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,9 @@
 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import type { Locale } from '../../../locales/index.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
 | 
				
			||||||
const address = new URL(document.querySelector<HTMLMetaElement>('meta[property="instance_url"]')?.content || location.href);
 | 
					const address = new URL(document.querySelector<HTMLMetaElement>('meta[property="instance_url"]')?.content || location.href);
 | 
				
			||||||
const siteName = document.querySelector<HTMLMetaElement>('meta[property="og:site_name"]')?.content;
 | 
					const siteName = document.querySelector<HTMLMetaElement>('meta[property="og:site_name"]')?.content;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,9 +13,16 @@ export const host = address.host;
 | 
				
			||||||
export const hostname = address.hostname;
 | 
					export const hostname = address.hostname;
 | 
				
			||||||
export const url = address.origin;
 | 
					export const url = address.origin;
 | 
				
			||||||
export const apiUrl = location.origin + '/api';
 | 
					export const apiUrl = location.origin + '/api';
 | 
				
			||||||
 | 
					export const wsOrigin = location.origin;
 | 
				
			||||||
export const lang = localStorage.getItem('lang') ?? 'en-US';
 | 
					export const lang = localStorage.getItem('lang') ?? 'en-US';
 | 
				
			||||||
export const langs = _LANGS_;
 | 
					export const langs = _LANGS_;
 | 
				
			||||||
const preParseLocale = localStorage.getItem('locale');
 | 
					const preParseLocale = localStorage.getItem('locale');
 | 
				
			||||||
export const locale = preParseLocale ? JSON.parse(preParseLocale) : null;
 | 
					export let locale: Locale = preParseLocale ? JSON.parse(preParseLocale) : null;
 | 
				
			||||||
export const instanceName = siteName === 'Misskey' || siteName == null ? host : siteName;
 | 
					export const version = _VERSION_;
 | 
				
			||||||
 | 
					export const instanceName = (siteName === 'Misskey' || siteName == null) ? host : siteName;
 | 
				
			||||||
 | 
					export const ui = localStorage.getItem('ui');
 | 
				
			||||||
export const debug = localStorage.getItem('debug') === 'true';
 | 
					export const debug = localStorage.getItem('debug') === 'true';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function updateLocale(newLocale: Locale): void {
 | 
				
			||||||
 | 
						locale = newLocale;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ export function char2fluentEmojiFilePath(char: string): string {
 | 
				
			||||||
	// Fluent Emojiは国旗非対応 https://github.com/microsoft/fluentui-emoji/issues/25
 | 
						// Fluent Emojiは国旗非対応 https://github.com/microsoft/fluentui-emoji/issues/25
 | 
				
			||||||
	if (codes[0]?.startsWith('1f1')) return char2twemojiFilePath(char);
 | 
						if (codes[0]?.startsWith('1f1')) return char2twemojiFilePath(char);
 | 
				
			||||||
	if (!codes.includes('200d')) codes = codes.filter(x => x !== 'fe0f');
 | 
						if (!codes.includes('200d')) codes = codes.filter(x => x !== 'fe0f');
 | 
				
			||||||
	codes = codes.filter(x => x && x.length);
 | 
						codes = codes.filter(x => x != null && x.length > 0);
 | 
				
			||||||
	const fileName = codes.map(x => x!.padStart(4, '0')).join('-');
 | 
						const fileName = (codes as string[]).map(x => x.padStart(4, '0')).join('-');
 | 
				
			||||||
	return `${fluentEmojiPngBase}/${fileName}.png`;
 | 
						return `${fluentEmojiPngBase}/${fileName}.png`;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,8 +3,9 @@
 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { lang } from '@/config.js';
 | 
					import { lang } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
				
			||||||
export const versatileLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP');
 | 
					export const versatileLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let _dateTimeFormat: Intl.DateTimeFormat;
 | 
					let _dateTimeFormat: Intl.DateTimeFormat;
 | 
				
			||||||
| 
						 | 
					@ -3,16 +3,18 @@
 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function defaultUseWorkerNumber(prev: number, totalWorkers: number) {
 | 
					function defaultUseWorkerNumber(prev: number) {
 | 
				
			||||||
	return prev + 1;
 | 
						return prev + 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class WorkerMultiDispatch<POST = any, RETURN = any> {
 | 
					type WorkerNumberGetter = (prev: number, totalWorkers: number) => number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class WorkerMultiDispatch<POST = unknown, RETURN = unknown> {
 | 
				
			||||||
	private symbol = Symbol('WorkerMultiDispatch');
 | 
						private symbol = Symbol('WorkerMultiDispatch');
 | 
				
			||||||
	private workers: Worker[] = [];
 | 
						private workers: Worker[] = [];
 | 
				
			||||||
	private terminated = false;
 | 
						private terminated = false;
 | 
				
			||||||
	private prevWorkerNumber = 0;
 | 
						private prevWorkerNumber = 0;
 | 
				
			||||||
	private getUseWorkerNumber = defaultUseWorkerNumber;
 | 
						private getUseWorkerNumber: WorkerNumberGetter;
 | 
				
			||||||
	private finalizationRegistry: FinalizationRegistry<symbol>;
 | 
						private finalizationRegistry: FinalizationRegistry<symbol>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	constructor(workerConstructor: () => Worker, concurrency: number, getUseWorkerNumber = defaultUseWorkerNumber) {
 | 
						constructor(workerConstructor: () => Worker, concurrency: number, getUseWorkerNumber = defaultUseWorkerNumber) {
 | 
				
			||||||
| 
						 | 
					@ -29,7 +31,7 @@ export class WorkerMultiDispatch<POST = any, RETURN = any> {
 | 
				
			||||||
		if (_DEV_) console.log('WorkerMultiDispatch: Created', this);
 | 
							if (_DEV_) console.log('WorkerMultiDispatch: Created', this);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public postMessage(message: POST, options?: Transferable[] | StructuredSerializeOptions, useWorkerNumber: typeof defaultUseWorkerNumber = this.getUseWorkerNumber) {
 | 
						public postMessage(message: POST, options?: Transferable[] | StructuredSerializeOptions, useWorkerNumber: WorkerNumberGetter = this.getUseWorkerNumber) {
 | 
				
			||||||
		let workerNumber = useWorkerNumber(this.prevWorkerNumber, this.workers.length);
 | 
							let workerNumber = useWorkerNumber(this.prevWorkerNumber, this.workers.length);
 | 
				
			||||||
		workerNumber = Math.abs(Math.round(workerNumber)) % this.workers.length;
 | 
							workerNumber = Math.abs(Math.round(workerNumber)) % this.workers.length;
 | 
				
			||||||
		if (_DEV_) console.log('WorkerMultiDispatch: Posting message to worker', workerNumber, useWorkerNumber);
 | 
							if (_DEV_) console.log('WorkerMultiDispatch: Posting message to worker', workerNumber, useWorkerNumber);
 | 
				
			||||||
| 
						 | 
					@ -46,12 +48,14 @@ export class WorkerMultiDispatch<POST = any, RETURN = any> {
 | 
				
			||||||
		return workerNumber;
 | 
							return workerNumber;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
				
			||||||
	public addListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
 | 
						public addListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
 | 
				
			||||||
		this.workers.forEach(worker => {
 | 
							this.workers.forEach(worker => {
 | 
				
			||||||
			worker.addEventListener('message', callback, options);
 | 
								worker.addEventListener('message', callback, options);
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
				
			||||||
	public removeListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
 | 
						public removeListener(callback: (this: Worker, ev: MessageEvent<RETURN>) => any, options?: boolean | AddEventListenerOptions) {
 | 
				
			||||||
		this.workers.forEach(worker => {
 | 
							this.workers.forEach(worker => {
 | 
				
			||||||
			worker.removeEventListener('message', callback, options);
 | 
								worker.removeEventListener('message', callback, options);
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,13 @@
 | 
				
			||||||
		"experimentalDecorators": true,
 | 
							"experimentalDecorators": true,
 | 
				
			||||||
		"noImplicitReturns": true,
 | 
							"noImplicitReturns": true,
 | 
				
			||||||
		"esModuleInterop": true,
 | 
							"esModuleInterop": true,
 | 
				
			||||||
 | 
							"baseUrl": ".",
 | 
				
			||||||
 | 
							"paths": {
 | 
				
			||||||
 | 
								"@/*": ["./*"],
 | 
				
			||||||
 | 
								"@@/*": ["./*"]
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		"typeRoots": [
 | 
							"typeRoots": [
 | 
				
			||||||
 | 
								"./@types",
 | 
				
			||||||
			"./node_modules/@types"
 | 
								"./node_modules/@types"
 | 
				
			||||||
		],
 | 
							],
 | 
				
			||||||
		"lib": [
 | 
							"lib": [
 | 
				
			||||||
| 
						 | 
					@ -25,6 +31,7 @@
 | 
				
			||||||
		]
 | 
							]
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
	"include": [
 | 
						"include": [
 | 
				
			||||||
 | 
							"@types/**/*.ts",
 | 
				
			||||||
		"js/**/*"
 | 
							"js/**/*"
 | 
				
			||||||
	],
 | 
						],
 | 
				
			||||||
	"exclude": [
 | 
						"exclude": [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { miLocalStorage } from '@/local-storage.js';
 | 
					import { miLocalStorage } from '@/local-storage.js';
 | 
				
			||||||
import { MenuButton } from '@/types/menu.js';
 | 
					import { MenuButton } from '@/types/menu.js';
 | 
				
			||||||
import { del, get, set } from '@/scripts/idb-proxy.js';
 | 
					import { del, get, set } from '@/scripts/idb-proxy.js';
 | 
				
			||||||
import { apiUrl } from '@/config.js';
 | 
					import { apiUrl } from '@@/js/config.js';
 | 
				
			||||||
import { waiting, popup, popupMenu, success, alert } from '@/os.js';
 | 
					import { waiting, popup, popupMenu, success, alert } from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { unisonReload, reloadChannel } from '@/scripts/unison-reload.js';
 | 
					import { unisonReload, reloadChannel } from '@/scripts/unison-reload.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ import { compareVersions } from 'compare-versions';
 | 
				
			||||||
import widgets from '@/widgets/index.js';
 | 
					import widgets from '@/widgets/index.js';
 | 
				
			||||||
import directives from '@/directives/index.js';
 | 
					import directives from '@/directives/index.js';
 | 
				
			||||||
import components from '@/components/index.js';
 | 
					import components from '@/components/index.js';
 | 
				
			||||||
import { version, lang, updateLocale, locale } from '@/config.js';
 | 
					import { version, lang, updateLocale, locale } from '@@/js/config.js';
 | 
				
			||||||
import { applyTheme } from '@/scripts/theme.js';
 | 
					import { applyTheme } from '@/scripts/theme.js';
 | 
				
			||||||
import { isDeviceDarkmode } from '@/scripts/is-device-darkmode.js';
 | 
					import { isDeviceDarkmode } from '@/scripts/is-device-darkmode.js';
 | 
				
			||||||
import { updateI18n } from '@/i18n.js';
 | 
					import { updateI18n } from '@/i18n.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@
 | 
				
			||||||
import { createApp, defineAsyncComponent, markRaw } from 'vue';
 | 
					import { createApp, defineAsyncComponent, markRaw } from 'vue';
 | 
				
			||||||
import { common } from './common.js';
 | 
					import { common } from './common.js';
 | 
				
			||||||
import type * as Misskey from 'misskey-js';
 | 
					import type * as Misskey from 'misskey-js';
 | 
				
			||||||
import { ui } from '@/config.js';
 | 
					import { ui } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { alert, confirm, popup, post, toast } from '@/os.js';
 | 
					import { alert, confirm, popup, post, toast } from '@/os.js';
 | 
				
			||||||
import { useStream } from '@/stream.js';
 | 
					import { useStream } from '@/stream.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ import { ref } from 'vue';
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import MkMention from './MkMention.vue';
 | 
					import MkMention from './MkMention.vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { host as localHost } from '@/config.js';
 | 
					import { host as localHost } from '@@/js/config.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const user = ref<Misskey.entities.UserLite>();
 | 
					const user = ref<Misskey.entities.UserLite>();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ import MkModalWindow from '@/components/MkModalWindow.vue';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
import { apiUrl } from '@/config.js';
 | 
					import { apiUrl } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { getProxiedImageUrl } from '@/scripts/media-proxy.js';
 | 
					import { getProxiedImageUrl } from '@/scripts/media-proxy.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkLink from '@/components/MkLink.vue';
 | 
					import MkLink from '@/components/MkLink.vue';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { miLocalStorage } from '@/local-storage.js';
 | 
					import { miLocalStorage } from '@/local-storage.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,7 +103,7 @@ import MkInfo from '@/components/MkInfo.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
					import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
				
			||||||
import { normalizeEmbedParams, getEmbedCode } from '@/scripts/get-embed-code.js';
 | 
					import { normalizeEmbedParams, getEmbedCode } from '@/scripts/get-embed-code.js';
 | 
				
			||||||
import { embedRouteWithScrollbar } from '@@/js/embed-page.js';
 | 
					import { embedRouteWithScrollbar } from '@@/js/embed-page.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@ import { useStream } from '@/stream.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { claimAchievement } from '@/scripts/achievements.js';
 | 
					import { claimAchievement } from '@/scripts/achievements.js';
 | 
				
			||||||
import { pleaseLogin } from '@/scripts/please-login.js';
 | 
					import { pleaseLogin } from '@/scripts/please-login.js';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
import DrawBlurhash from '@/workers/draw-blurhash?worker';
 | 
					import DrawBlurhash from '@/workers/draw-blurhash?worker';
 | 
				
			||||||
import TestWebGL2 from '@/workers/test-webgl2?worker';
 | 
					import TestWebGL2 from '@/workers/test-webgl2?worker';
 | 
				
			||||||
import { WorkerMultiDispatch } from '@/scripts/worker-multi-dispatch.js';
 | 
					import { WorkerMultiDispatch } from '@@/js/worker-multi-dispatch.js';
 | 
				
			||||||
import { extractAvgColorFromBlurhash } from '@@/js/extract-avg-color-from-blurhash.js';
 | 
					import { extractAvgColorFromBlurhash } from '@@/js/extract-avg-color-from-blurhash.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const canvasPromise = new Promise<WorkerMultiDispatch | HTMLCanvasElement>(resolve => {
 | 
					const canvasPromise = new Promise<WorkerMultiDispatch | HTMLCanvasElement>(resolve => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { computed } from 'vue';
 | 
					import { computed } from 'vue';
 | 
				
			||||||
import { instanceName } from '@/config.js';
 | 
					import { instanceName } from '@@/js/config.js';
 | 
				
			||||||
import { instance as Instance } from '@/instance.js';
 | 
					import { instance as Instance } from '@/instance.js';
 | 
				
			||||||
import { getProxiedImageUrlNullable } from '@/scripts/media-proxy.js';
 | 
					import { getProxiedImageUrlNullable } from '@/scripts/media-proxy.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { defineAsyncComponent, ref } from 'vue';
 | 
					import { defineAsyncComponent, ref } from 'vue';
 | 
				
			||||||
import { url as local } from '@/config.js';
 | 
					import { url as local } from '@@/js/config.js';
 | 
				
			||||||
import { useTooltip } from '@/scripts/use-tooltip.js';
 | 
					import { useTooltip } from '@/scripts/use-tooltip.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { isEnabledUrlPreview } from '@/instance.js';
 | 
					import { isEnabledUrlPreview } from '@/instance.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
import { toUnicode } from 'punycode';
 | 
					import { toUnicode } from 'punycode';
 | 
				
			||||||
import { computed } from 'vue';
 | 
					import { computed } from 'vue';
 | 
				
			||||||
import tinycolor from 'tinycolor2';
 | 
					import tinycolor from 'tinycolor2';
 | 
				
			||||||
import { host as localHost } from '@/config.js';
 | 
					import { host as localHost } from '@@/js/config.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
import { getStaticImageUrl } from '@/scripts/media-proxy.js';
 | 
					import { getStaticImageUrl } from '@/scripts/media-proxy.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -163,6 +163,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
import { computed, inject, onMounted, ref, shallowRef, Ref, watch, provide } from 'vue';
 | 
					import { computed, inject, onMounted, ref, shallowRef, Ref, watch, provide } from 'vue';
 | 
				
			||||||
import * as mfm from 'mfm-js';
 | 
					import * as mfm from 'mfm-js';
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
 | 
					import { isLink } from '@@/js/is-link.js';
 | 
				
			||||||
import MkNoteSub from '@/components/MkNoteSub.vue';
 | 
					import MkNoteSub from '@/components/MkNoteSub.vue';
 | 
				
			||||||
import MkNoteHeader from '@/components/MkNoteHeader.vue';
 | 
					import MkNoteHeader from '@/components/MkNoteHeader.vue';
 | 
				
			||||||
import MkNoteSimple from '@/components/MkNoteSimple.vue';
 | 
					import MkNoteSimple from '@/components/MkNoteSimple.vue';
 | 
				
			||||||
| 
						 | 
					@ -195,8 +196,8 @@ import { getNoteSummary } from '@/scripts/get-note-summary.js';
 | 
				
			||||||
import { MenuItem } from '@/types/menu.js';
 | 
					import { MenuItem } from '@/types/menu.js';
 | 
				
			||||||
import MkRippleEffect from '@/components/MkRippleEffect.vue';
 | 
					import MkRippleEffect from '@/components/MkRippleEffect.vue';
 | 
				
			||||||
import { showMovedDialog } from '@/scripts/show-moved-dialog.js';
 | 
					import { showMovedDialog } from '@/scripts/show-moved-dialog.js';
 | 
				
			||||||
import { shouldCollapsed } from '@/scripts/collapsed.js';
 | 
					import { shouldCollapsed } from '@@/js/collapsed.js';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import { isEnabledUrlPreview } from '@/instance.js';
 | 
					import { isEnabledUrlPreview } from '@/instance.js';
 | 
				
			||||||
import { type Keymap } from '@/scripts/hotkey.js';
 | 
					import { type Keymap } from '@/scripts/hotkey.js';
 | 
				
			||||||
import { focusPrev, focusNext } from '@/scripts/focus.js';
 | 
					import { focusPrev, focusNext } from '@/scripts/focus.js';
 | 
				
			||||||
| 
						 | 
					@ -506,16 +507,6 @@ function onContextmenu(ev: MouseEvent): void {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const isLink = (el: HTMLElement): boolean => {
 | 
					 | 
				
			||||||
		if (el.tagName === 'A') return true;
 | 
					 | 
				
			||||||
		// 再生速度の選択などのために、Audio要素のコンテキストメニューはブラウザデフォルトとする。
 | 
					 | 
				
			||||||
		if (el.tagName === 'AUDIO') return true;
 | 
					 | 
				
			||||||
		if (el.parentElement) {
 | 
					 | 
				
			||||||
			return isLink(el.parentElement);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (ev.target && isLink(ev.target as HTMLElement)) return;
 | 
						if (ev.target && isLink(ev.target as HTMLElement)) return;
 | 
				
			||||||
	if (window.getSelection()?.toString() !== '') return;
 | 
						if (window.getSelection()?.toString() !== '') return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -199,6 +199,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
import { computed, inject, onMounted, provide, ref, shallowRef } from 'vue';
 | 
					import { computed, inject, onMounted, provide, ref, shallowRef } from 'vue';
 | 
				
			||||||
import * as mfm from 'mfm-js';
 | 
					import * as mfm from 'mfm-js';
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
 | 
					import { isLink } from '@@/js/is-link.js';
 | 
				
			||||||
import MkNoteSub from '@/components/MkNoteSub.vue';
 | 
					import MkNoteSub from '@/components/MkNoteSub.vue';
 | 
				
			||||||
import MkNoteSimple from '@/components/MkNoteSimple.vue';
 | 
					import MkNoteSimple from '@/components/MkNoteSimple.vue';
 | 
				
			||||||
import MkReactionsViewer from '@/components/MkReactionsViewer.vue';
 | 
					import MkReactionsViewer from '@/components/MkReactionsViewer.vue';
 | 
				
			||||||
| 
						 | 
					@ -222,7 +223,7 @@ import { reactionPicker } from '@/scripts/reaction-picker.js';
 | 
				
			||||||
import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm.js';
 | 
					import { extractUrlFromMfm } from '@/scripts/extract-url-from-mfm.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import { getNoteClipMenu, getNoteMenu, getRenoteMenu } from '@/scripts/get-note-menu.js';
 | 
					import { getNoteClipMenu, getNoteMenu, getRenoteMenu } from '@/scripts/get-note-menu.js';
 | 
				
			||||||
import { useNoteCapture } from '@/scripts/use-note-capture.js';
 | 
					import { useNoteCapture } from '@/scripts/use-note-capture.js';
 | 
				
			||||||
import { deepClone } from '@/scripts/clone.js';
 | 
					import { deepClone } from '@/scripts/clone.js';
 | 
				
			||||||
| 
						 | 
					@ -468,14 +469,6 @@ function toggleReact() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function onContextmenu(ev: MouseEvent): void {
 | 
					function onContextmenu(ev: MouseEvent): void {
 | 
				
			||||||
	const isLink = (el: HTMLElement): boolean => {
 | 
					 | 
				
			||||||
		if (el.tagName === 'A') return true;
 | 
					 | 
				
			||||||
		if (el.parentElement) {
 | 
					 | 
				
			||||||
			return isLink(el.parentElement);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (ev.target && isLink(ev.target as HTMLElement)) return;
 | 
						if (ev.target && isLink(ev.target as HTMLElement)) return;
 | 
				
			||||||
	if (window.getSelection()?.toString() !== '') return;
 | 
						if (window.getSelection()?.toString() !== '') return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@ import RouterView from '@/components/global/RouterView.vue';
 | 
				
			||||||
import MkWindow from '@/components/MkWindow.vue';
 | 
					import MkWindow from '@/components/MkWindow.vue';
 | 
				
			||||||
import { popout as _popout } from '@/scripts/popout.js';
 | 
					import { popout as _popout } from '@/scripts/popout.js';
 | 
				
			||||||
import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
					import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { useScrollPositionManager } from '@/nirax.js';
 | 
					import { useScrollPositionManager } from '@/nirax.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { PageMetadata, provideMetadataReceiver, provideReactiveMetadata } from '@/scripts/page-metadata.js';
 | 
					import { PageMetadata, provideMetadataReceiver, provideReactiveMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ import { pleaseLogin } from '@/scripts/please-login.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import { useInterval } from '@@/js/use-interval.js';
 | 
					import { useInterval } from '@@/js/use-interval.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = defineProps<{
 | 
					const props = defineProps<{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,7 +109,7 @@ import MkNoteSimple from '@/components/MkNoteSimple.vue';
 | 
				
			||||||
import MkNotePreview from '@/components/MkNotePreview.vue';
 | 
					import MkNotePreview from '@/components/MkNotePreview.vue';
 | 
				
			||||||
import XPostFormAttaches from '@/components/MkPostFormAttaches.vue';
 | 
					import XPostFormAttaches from '@/components/MkPostFormAttaches.vue';
 | 
				
			||||||
import MkPollEditor, { type PollEditorModelValue } from '@/components/MkPollEditor.vue';
 | 
					import MkPollEditor, { type PollEditorModelValue } from '@/components/MkPollEditor.vue';
 | 
				
			||||||
import { host, url } from '@/config.js';
 | 
					import { host, url } from '@@/js/config.js';
 | 
				
			||||||
import { erase, unique } from '@/scripts/array.js';
 | 
					import { erase, unique } from '@/scripts/array.js';
 | 
				
			||||||
import { extractMentions } from '@/scripts/extract-mentions.js';
 | 
					import { extractMentions } from '@/scripts/extract-mentions.js';
 | 
				
			||||||
import { formatTimeString } from '@/scripts/format-time-string.js';
 | 
					import { formatTimeString } from '@/scripts/format-time-string.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,7 +42,7 @@ import MkSwitch from '@/components/MkSwitch.vue';
 | 
				
			||||||
import MkTextarea from '@/components/MkTextarea.vue';
 | 
					import MkTextarea from '@/components/MkTextarea.vue';
 | 
				
			||||||
import MkRadio from '@/components/MkRadio.vue';
 | 
					import MkRadio from '@/components/MkRadio.vue';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import * as config from '@/config.js';
 | 
					import * as config from '@@/js/config.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const text = ref('');
 | 
					const text = ref('');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ import { showSuspendedDialog } from '@/scripts/show-suspended-dialog.js';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkInput from '@/components/MkInput.vue';
 | 
					import MkInput from '@/components/MkInput.vue';
 | 
				
			||||||
import MkInfo from '@/components/MkInfo.vue';
 | 
					import MkInfo from '@/components/MkInfo.vue';
 | 
				
			||||||
import { host as configHost } from '@/config.js';
 | 
					import { host as configHost } from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { login } from '@/account.js';
 | 
					import { login } from '@/account.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,7 +84,7 @@ import * as Misskey from 'misskey-js';
 | 
				
			||||||
import MkButton from './MkButton.vue';
 | 
					import MkButton from './MkButton.vue';
 | 
				
			||||||
import MkInput from './MkInput.vue';
 | 
					import MkInput from './MkInput.vue';
 | 
				
			||||||
import MkCaptcha, { type Captcha } from '@/components/MkCaptcha.vue';
 | 
					import MkCaptcha, { type Captcha } from '@/components/MkCaptcha.vue';
 | 
				
			||||||
import * as config from '@/config.js';
 | 
					import * as config from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { login } from '@/account.js';
 | 
					import { login } from '@/account.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { instance } from '@/instance.js';
 | 
					import { instance } from '@/instance.js';
 | 
				
			||||||
import { miLocalStorage } from '@/local-storage.js';
 | 
					import { miLocalStorage } from '@/local-storage.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,7 +35,7 @@ import * as Misskey from 'misskey-js';
 | 
				
			||||||
import MkMediaList from '@/components/MkMediaList.vue';
 | 
					import MkMediaList from '@/components/MkMediaList.vue';
 | 
				
			||||||
import MkPoll from '@/components/MkPoll.vue';
 | 
					import MkPoll from '@/components/MkPoll.vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { shouldCollapsed } from '@/scripts/collapsed.js';
 | 
					import { shouldCollapsed } from '@@/js/collapsed.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = defineProps<{
 | 
					const props = defineProps<{
 | 
				
			||||||
	note: Misskey.entities.Note;
 | 
						note: Misskey.entities.Note;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -158,7 +158,7 @@ import XSensitive from '@/components/MkTutorialDialog.Sensitive.vue';
 | 
				
			||||||
import MkAnimBg from '@/components/MkAnimBg.vue';
 | 
					import MkAnimBg from '@/components/MkAnimBg.vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { instance } from '@/instance.js';
 | 
					import { instance } from '@/instance.js';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import { claimAchievement } from '@/scripts/achievements.js';
 | 
					import { claimAchievement } from '@/scripts/achievements.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ import { onMounted, shallowRef } from 'vue';
 | 
				
			||||||
import MkModal from '@/components/MkModal.vue';
 | 
					import MkModal from '@/components/MkModal.vue';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkSparkle from '@/components/MkSparkle.vue';
 | 
					import MkSparkle from '@/components/MkSparkle.vue';
 | 
				
			||||||
import { version } from '@/config.js';
 | 
					import { version } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { confetti } from '@/scripts/confetti.js';
 | 
					import { confetti } from '@/scripts/confetti.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,12 +85,12 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { defineAsyncComponent, onDeactivated, onUnmounted, ref } from 'vue';
 | 
					import { defineAsyncComponent, onDeactivated, onUnmounted, ref } from 'vue';
 | 
				
			||||||
import type { summaly } from '@misskey-dev/summaly';
 | 
					import type { summaly } from '@misskey-dev/summaly';
 | 
				
			||||||
import { url as local } from '@/config.js';
 | 
					import { url as local } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { deviceKind } from '@/scripts/device-kind.js';
 | 
					import { deviceKind } from '@/scripts/device-kind.js';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import { versatileLang } from '@/scripts/intl-const.js';
 | 
					import { versatileLang } from '@@/js/intl-const.js';
 | 
				
			||||||
import { transformPlayerUrl } from '@/scripts/player-url-transform.js';
 | 
					import { transformPlayerUrl } from '@/scripts/player-url-transform.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,7 @@ import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import { host as currentHost, hostname } from '@/config.js';
 | 
					import { host as currentHost, hostname } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const emit = defineEmits<{
 | 
					const emit = defineEmits<{
 | 
				
			||||||
	(ev: 'ok', selected: Misskey.entities.UserDetailed): void;
 | 
						(ev: 'ok', selected: Misskey.entities.UserDetailed): void;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -137,7 +137,7 @@ import XPrivacy from '@/components/MkUserSetupDialog.Privacy.vue';
 | 
				
			||||||
import MkAnimBg from '@/components/MkAnimBg.vue';
 | 
					import MkAnimBg from '@/components/MkAnimBg.vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { instance } from '@/instance.js';
 | 
					import { instance } from '@/instance.js';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import MkPushNotificationAllowButton from '@/components/MkPushNotificationAllowButton.vue';
 | 
					import MkPushNotificationAllowButton from '@/components/MkPushNotificationAllowButton.vue';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,7 +58,7 @@ import XSignupDialog from '@/components/MkSignupDialog.vue';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkTimeline from '@/components/MkTimeline.vue';
 | 
					import MkTimeline from '@/components/MkTimeline.vue';
 | 
				
			||||||
import MkInfo from '@/components/MkInfo.vue';
 | 
					import MkInfo from '@/components/MkInfo.vue';
 | 
				
			||||||
import { instanceName } from '@/config.js';
 | 
					import { instanceName } from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,6 +57,7 @@ import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import { widgets as widgetDefs } from '@/widgets/index.js';
 | 
					import { widgets as widgetDefs } from '@/widgets/index.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
 | 
					import { isLink } from '@@/js/is-link.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.default));
 | 
					const Sortable = defineAsyncComponent(() => import('vuedraggable').then(x => x.default));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -98,13 +99,6 @@ const updateWidget = (id, data) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function onContextmenu(widget: Widget, ev: MouseEvent) {
 | 
					function onContextmenu(widget: Widget, ev: MouseEvent) {
 | 
				
			||||||
	const element = ev.target as HTMLElement | null;
 | 
						const element = ev.target as HTMLElement | null;
 | 
				
			||||||
	const isLink = (el: HTMLElement): boolean => {
 | 
					 | 
				
			||||||
		if (el.tagName === 'A') return true;
 | 
					 | 
				
			||||||
		if (el.parentElement) {
 | 
					 | 
				
			||||||
			return isLink(el.parentElement);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
	if (element && isLink(element)) return;
 | 
						if (element && isLink(element)) return;
 | 
				
			||||||
	if (element && (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes(element.tagName) || element.attributes['contenteditable'])) return;
 | 
						if (element && (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes(element.tagName) || element.attributes['contenteditable'])) return;
 | 
				
			||||||
	if (window.getSelection()?.toString() !== '') return;
 | 
						if (window.getSelection()?.toString() !== '') return;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { ref } from 'vue';
 | 
					import { ref } from 'vue';
 | 
				
			||||||
import MkWindow from '@/components/MkWindow.vue';
 | 
					import MkWindow from '@/components/MkWindow.vue';
 | 
				
			||||||
import { versatileLang } from '@/scripts/intl-const.js';
 | 
					import { versatileLang } from '@@/js/intl-const.js';
 | 
				
			||||||
import { transformPlayerUrl } from '@/scripts/player-url-transform.js';
 | 
					import { transformPlayerUrl } from '@/scripts/player-url-transform.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ export type MkABehavior = 'window' | 'browser' | null;
 | 
				
			||||||
import { computed, inject, shallowRef } from 'vue';
 | 
					import { computed, inject, shallowRef } from 'vue';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
					import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { useRouter } from '@/router/supplier.js';
 | 
					import { useRouter } from '@/router/supplier.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import { toUnicode } from 'punycode/';
 | 
					import { toUnicode } from 'punycode/';
 | 
				
			||||||
import { host as hostRaw } from '@/config.js';
 | 
					import { host as hostRaw } from '@@/js/config.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
defineProps<{
 | 
					defineProps<{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
import { ref, computed } from 'vue';
 | 
					import { ref, computed } from 'vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { instance } from '@/instance.js';
 | 
					import { instance } from '@/instance.js';
 | 
				
			||||||
import { url as local, host } from '@/config.js';
 | 
					import { url as local, host } from '@@/js/config.js';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,7 @@ import MkCodeInline from '@/components/MkCodeInline.vue';
 | 
				
			||||||
import MkGoogle from '@/components/MkGoogle.vue';
 | 
					import MkGoogle from '@/components/MkGoogle.vue';
 | 
				
			||||||
import MkSparkle from '@/components/MkSparkle.vue';
 | 
					import MkSparkle from '@/components/MkSparkle.vue';
 | 
				
			||||||
import MkA, { MkABehavior } from '@/components/global/MkA.vue';
 | 
					import MkA, { MkABehavior } from '@/components/global/MkA.vue';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function safeParseFloat(str: unknown): number | null {
 | 
					function safeParseFloat(str: unknown): number | null {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ import { expect } from '@storybook/test';
 | 
				
			||||||
import { StoryObj } from '@storybook/vue3';
 | 
					import { StoryObj } from '@storybook/vue3';
 | 
				
			||||||
import MkTime from './MkTime.vue';
 | 
					import MkTime from './MkTime.vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { dateTimeFormat } from '@/scripts/intl-const.js';
 | 
					import { dateTimeFormat } from '@@/js/intl-const.js';
 | 
				
			||||||
const now = new Date('2023-04-01T00:00:00.000Z');
 | 
					const now = new Date('2023-04-01T00:00:00.000Z');
 | 
				
			||||||
const future = new Date('2024-04-01T00:00:00.000Z');
 | 
					const future = new Date('2024-04-01T00:00:00.000Z');
 | 
				
			||||||
const oneHourAgo = new Date(now.getTime() - 3600000);
 | 
					const oneHourAgo = new Date(now.getTime() - 3600000);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
import isChromatic from 'chromatic/isChromatic';
 | 
					import isChromatic from 'chromatic/isChromatic';
 | 
				
			||||||
import { onMounted, onUnmounted, ref, computed } from 'vue';
 | 
					import { onMounted, onUnmounted, ref, computed } from 'vue';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { dateTimeFormat } from '@/scripts/intl-const.js';
 | 
					import { dateTimeFormat } from '@@/js/intl-const.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = withDefaults(defineProps<{
 | 
					const props = withDefaults(defineProps<{
 | 
				
			||||||
	time: Date | string | number | null;
 | 
						time: Date | string | number | null;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { defineAsyncComponent, ref } from 'vue';
 | 
					import { defineAsyncComponent, ref } from 'vue';
 | 
				
			||||||
import { toUnicode as decodePunycode } from 'punycode/';
 | 
					import { toUnicode as decodePunycode } from 'punycode/';
 | 
				
			||||||
import { url as local } from '@/config.js';
 | 
					import { url as local } from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { useTooltip } from '@/scripts/use-tooltip.js';
 | 
					import { useTooltip } from '@/scripts/use-tooltip.js';
 | 
				
			||||||
import { isEnabledUrlPreview } from '@/instance.js';
 | 
					import { isEnabledUrlPreview } from '@/instance.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,27 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * SPDX-FileCopyrightText: syuilo and misskey-project
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import { miLocalStorage } from '@/local-storage.js';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const address = new URL(document.querySelector<HTMLMetaElement>('meta[property="instance_url"]')?.content || location.href);
 | 
					 | 
				
			||||||
const siteName = document.querySelector<HTMLMetaElement>('meta[property="og:site_name"]')?.content;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export const host = address.host;
 | 
					 | 
				
			||||||
export const hostname = address.hostname;
 | 
					 | 
				
			||||||
export const url = address.origin;
 | 
					 | 
				
			||||||
export const apiUrl = location.origin + '/api';
 | 
					 | 
				
			||||||
export const wsOrigin = location.origin;
 | 
					 | 
				
			||||||
export const lang = miLocalStorage.getItem('lang') ?? 'en-US';
 | 
					 | 
				
			||||||
export const langs = _LANGS_;
 | 
					 | 
				
			||||||
const preParseLocale = miLocalStorage.getItem('locale');
 | 
					 | 
				
			||||||
export let locale = preParseLocale ? JSON.parse(preParseLocale) : null;
 | 
					 | 
				
			||||||
export const version = _VERSION_;
 | 
					 | 
				
			||||||
export const instanceName = siteName === 'Misskey' || siteName == null ? host : siteName;
 | 
					 | 
				
			||||||
export const ui = miLocalStorage.getItem('ui');
 | 
					 | 
				
			||||||
export const debug = miLocalStorage.getItem('debug') === 'true';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export function updateLocale(newLocale): void {
 | 
					 | 
				
			||||||
	locale = newLocale;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { dateTimeFormat } from '@/scripts/intl-const.js';
 | 
					import { dateTimeFormat } from '@@/js/intl-const.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default (d: Date | number | undefined) => dateTimeFormat.format(d);
 | 
					export default (d: Date | number | undefined) => dateTimeFormat.format(d);
 | 
				
			||||||
export const dateString = (d: string) => dateTimeFormat.format(new Date(d));
 | 
					export const dateString = (d: string) => dateTimeFormat.format(new Date(d));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,6 @@
 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { numberFormat } from '@/scripts/intl-const.js';
 | 
					import { numberFormat } from '@@/js/intl-const.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default n => n == null ? 'N/A' : numberFormat.format(n);
 | 
					export default n => n == null ? 'N/A' : numberFormat.format(n);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const acct = (user: Misskey.Acct) => {
 | 
					export const acct = (user: Misskey.Acct) => {
 | 
				
			||||||
	return Misskey.acct.toString(user);
 | 
						return Misskey.acct.toString(user);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@
 | 
				
			||||||
import { markRaw } from 'vue';
 | 
					import { markRaw } from 'vue';
 | 
				
			||||||
import { I18n } from '@@/js/i18n.js';
 | 
					import { I18n } from '@@/js/i18n.js';
 | 
				
			||||||
import type { Locale } from '../../../locales/index.js';
 | 
					import type { Locale } from '../../../locales/index.js';
 | 
				
			||||||
import { locale } from '@/config.js';
 | 
					import { locale } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const i18n = markRaw(new I18n<Locale>(locale, _DEV_));
 | 
					export const i18n = markRaw(new I18n<Locale>(locale, _DEV_));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,7 @@ import { openInstanceMenu, openToolsMenu } from '@/ui/_common_/common.js';
 | 
				
			||||||
import { lookup } from '@/scripts/lookup.js';
 | 
					import { lookup } from '@/scripts/lookup.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { ui } from '@/config.js';
 | 
					import { ui } from '@@/js/config.js';
 | 
				
			||||||
import { unisonReload } from '@/scripts/unison-reload.js';
 | 
					import { unisonReload } from '@/scripts/unison-reload.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const navbarItemDef = reactive({
 | 
					export const navbarItemDef = reactive({
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@ import { ref, computed } from 'vue';
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkLink from '@/components/MkLink.vue';
 | 
					import MkLink from '@/components/MkLink.vue';
 | 
				
			||||||
import { version } from '@/config.js';
 | 
					import { version } from '@@/js/config.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { unisonReload } from '@/scripts/unison-reload.js';
 | 
					import { unisonReload } from '@/scripts/unison-reload.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -132,7 +132,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { nextTick, onBeforeUnmount, ref, shallowRef, computed } from 'vue';
 | 
					import { nextTick, onBeforeUnmount, ref, shallowRef, computed } from 'vue';
 | 
				
			||||||
import { version } from '@/config.js';
 | 
					import { version } from '@@/js/config.js';
 | 
				
			||||||
import FormLink from '@/components/form/link.vue';
 | 
					import FormLink from '@/components/form/link.vue';
 | 
				
			||||||
import FormSection from '@/components/form/section.vue';
 | 
					import FormSection from '@/components/form/section.vue';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,7 +126,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts" setup>
 | 
					<script lang="ts" setup>
 | 
				
			||||||
import { host, version } from '@/config.js';
 | 
					import { host, version } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { instance } from '@/instance.js';
 | 
					import { instance } from '@/instance.js';
 | 
				
			||||||
import number from '@/filters/number.js';
 | 
					import number from '@/filters/number.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -220,7 +220,7 @@ import MkFileListForAdmin from '@/components/MkFileListForAdmin.vue';
 | 
				
			||||||
import MkInfo from '@/components/MkInfo.vue';
 | 
					import MkInfo from '@/components/MkInfo.vue';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { acct } from '@/filters/user.js';
 | 
					import { acct } from '@/filters/user.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,7 +117,7 @@ import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkColorInput from '@/components/MkColorInput.vue';
 | 
					import MkColorInput from '@/components/MkColorInput.vue';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const iconUrl = ref<string | null>(null);
 | 
					const iconUrl = ref<string | null>(null);
 | 
				
			||||||
const app192IconUrl = ref<string | null>(null);
 | 
					const app192IconUrl = ref<string | null>(null);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ import { ref, computed, type Ref } from 'vue';
 | 
				
			||||||
import XQueue from './queue.chart.vue';
 | 
					import XQueue from './queue.chart.vue';
 | 
				
			||||||
import XHeader from './_header_.vue';
 | 
					import XHeader from './_header_.vue';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import * as config from '@/config.js';
 | 
					import * as config from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,7 +82,7 @@ import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import { deviceKind } from '@/scripts/device-kind.js';
 | 
					import { deviceKind } from '@/scripts/device-kind.js';
 | 
				
			||||||
import MkNotes from '@/components/MkNotes.vue';
 | 
					import MkNotes from '@/components/MkNotes.vue';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { favoritedChannelsCache } from '@/cache.js';
 | 
					import { favoritedChannelsCache } from '@/cache.js';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkInput from '@/components/MkInput.vue';
 | 
					import MkInput from '@/components/MkInput.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ import { i18n } from '@/i18n.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import { clipsCache } from '@/cache.js';
 | 
					import { clipsCache } from '@/cache.js';
 | 
				
			||||||
import { isSupportShare } from '@/scripts/navigator.js';
 | 
					import { isSupportShare } from '@/scripts/navigator.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,7 +206,7 @@ import { defaultStore } from '@/store.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { useInterval } from '@@/js/use-interval.js';
 | 
					import { useInterval } from '@@/js/use-interval.js';
 | 
				
			||||||
import { apiUrl } from '@/config.js';
 | 
					import { apiUrl } from '@@/js/config.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import * as sound from '@/scripts/sound.js';
 | 
					import * as sound from '@/scripts/sound.js';
 | 
				
			||||||
import MkRange from '@/components/MkRange.vue';
 | 
					import MkRange from '@/components/MkRange.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@ import { Interpreter, Parser, values } from '@syuilo/aiscript';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import MkAsUi from '@/components/MkAsUi.vue';
 | 
					import MkAsUi from '@/components/MkAsUi.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ import MkContainer from '@/components/MkContainer.vue';
 | 
				
			||||||
import MkPagination from '@/components/MkPagination.vue';
 | 
					import MkPagination from '@/components/MkPagination.vue';
 | 
				
			||||||
import MkGalleryPostPreview from '@/components/MkGalleryPostPreview.vue';
 | 
					import MkGalleryPostPreview from '@/components/MkGalleryPostPreview.vue';
 | 
				
			||||||
import MkFollowButton from '@/components/MkFollowButton.vue';
 | 
					import MkFollowButton from '@/components/MkFollowButton.vue';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,7 +69,7 @@ import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkSelect from '@/components/MkSelect.vue';
 | 
					import MkSelect from '@/components/MkSelect.vue';
 | 
				
			||||||
import MkSwitch from '@/components/MkSwitch.vue';
 | 
					import MkSwitch from '@/components/MkSwitch.vue';
 | 
				
			||||||
import MkInput from '@/components/MkInput.vue';
 | 
					import MkInput from '@/components/MkInput.vue';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { selectFile } from '@/scripts/select-file.js';
 | 
					import { selectFile } from '@/scripts/select-file.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,7 +104,7 @@ import XPage from '@/components/page/page.vue';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import MkMediaImage from '@/components/MkMediaImage.vue';
 | 
					import MkMediaImage from '@/components/MkMediaImage.vue';
 | 
				
			||||||
import MkImgWithBlurhash from '@/components/MkImgWithBlurhash.vue';
 | 
					import MkImgWithBlurhash from '@/components/MkImgWithBlurhash.vue';
 | 
				
			||||||
import MkFollowButton from '@/components/MkFollowButton.vue';
 | 
					import MkFollowButton from '@/components/MkFollowButton.vue';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,7 @@ import MkSwitch from '@/components/MkSwitch.vue';
 | 
				
			||||||
import { deepClone } from '@/scripts/clone.js';
 | 
					import { deepClone } from '@/scripts/clone.js';
 | 
				
			||||||
import { useInterval } from '@@/js/use-interval.js';
 | 
					import { useInterval } from '@@/js/use-interval.js';
 | 
				
			||||||
import { signinRequired } from '@/account.js';
 | 
					import { signinRequired } from '@/account.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { userPage } from '@/filters/user.js';
 | 
					import { userPage } from '@/filters/user.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ import { useStream } from '@/stream.js';
 | 
				
			||||||
import { signinRequired } from '@/account.js';
 | 
					import { signinRequired } from '@/account.js';
 | 
				
			||||||
import { useRouter } from '@/router/supplier.js';
 | 
					import { useRouter } from '@/router/supplier.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { useInterval } from '@@/js/use-interval.js';
 | 
					import { useInterval } from '@@/js/use-interval.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@ import MkUserList from '@/components/MkUserList.vue';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import MkTimeline from '@/components/MkTimeline.vue';
 | 
					import MkTimeline from '@/components/MkTimeline.vue';
 | 
				
			||||||
import { instanceName } from '@/config.js';
 | 
					import { instanceName } from '@@/js/config.js';
 | 
				
			||||||
import { serverErrorImageUrl, infoImageUrl } from '@/instance.js';
 | 
					import { serverErrorImageUrl, infoImageUrl } from '@/instance.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = withDefaults(defineProps<{
 | 
					const props = withDefaults(defineProps<{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -254,7 +254,7 @@ import FormSection from '@/components/form/section.vue';
 | 
				
			||||||
import FormLink from '@/components/form/link.vue';
 | 
					import FormLink from '@/components/form/link.vue';
 | 
				
			||||||
import MkLink from '@/components/MkLink.vue';
 | 
					import MkLink from '@/components/MkLink.vue';
 | 
				
			||||||
import MkInfo from '@/components/MkInfo.vue';
 | 
					import MkInfo from '@/components/MkInfo.vue';
 | 
				
			||||||
import { langs } from '@/config.js';
 | 
					import { langs } from '@@/js/config.js';
 | 
				
			||||||
import { defaultStore } from '@/store.js';
 | 
					import { defaultStore } from '@/store.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,7 @@ import { unisonReload } from '@/scripts/unison-reload.js';
 | 
				
			||||||
import { useStream } from '@/stream.js';
 | 
					import { useStream } from '@/stream.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { version, host } from '@/config.js';
 | 
					import { version, host } from '@@/js/config.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import { miLocalStorage } from '@/local-storage.js';
 | 
					import { miLocalStorage } from '@/local-storage.js';
 | 
				
			||||||
const { t, ts } = i18n;
 | 
					const { t, ts } = i18n;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,7 +88,7 @@ import MkFolder from '@/components/MkFolder.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import { Theme, applyTheme } from '@/scripts/theme.js';
 | 
					import { Theme, applyTheme } from '@/scripts/theme.js';
 | 
				
			||||||
import { host } from '@/config.js';
 | 
					import { host } from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { ColdDeviceStorage, defaultStore } from '@/store.js';
 | 
					import { ColdDeviceStorage, defaultStore } from '@/store.js';
 | 
				
			||||||
import { addTheme } from '@/theme-store.js';
 | 
					import { addTheme } from '@/theme-store.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
import { ref } from 'vue';
 | 
					import { ref } from 'vue';
 | 
				
			||||||
import MkButton from '@/components/MkButton.vue';
 | 
					import MkButton from '@/components/MkButton.vue';
 | 
				
			||||||
import MkInput from '@/components/MkInput.vue';
 | 
					import MkInput from '@/components/MkInput.vue';
 | 
				
			||||||
import { host, version } from '@/config.js';
 | 
					import { host, version } from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { login } from '@/account.js';
 | 
					import { login } from '@/account.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@ import { computed, ref } from 'vue';
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import XSetup from './welcome.setup.vue';
 | 
					import XSetup from './welcome.setup.vue';
 | 
				
			||||||
import XEntrance from './welcome.entrance.a.vue';
 | 
					import XEntrance from './welcome.entrance.a.vue';
 | 
				
			||||||
import { instanceName } from '@/config.js';
 | 
					import { instanceName } from '@@/js/config.js';
 | 
				
			||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
					import { definePageMetadata } from '@/scripts/page-metadata.js';
 | 
				
			||||||
import { fetchInstance } from '@/instance.js';
 | 
					import { fetchInstance } from '@/instance.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { $i } from '@/account.js';
 | 
					import { $i } from '@/account.js';
 | 
				
			||||||
import { miLocalStorage } from '@/local-storage.js';
 | 
					import { miLocalStorage } from '@/local-storage.js';
 | 
				
			||||||
import { customEmojis } from '@/custom-emojis.js';
 | 
					import { customEmojis } from '@/custom-emojis.js';
 | 
				
			||||||
import { url, lang } from '@/config.js';
 | 
					import { url, lang } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function aiScriptReadline(q: string): Promise<string> {
 | 
					export function aiScriptReadline(q: string): Promise<string> {
 | 
				
			||||||
	return new Promise(ok => {
 | 
						return new Promise(ok => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,22 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * SPDX-FileCopyrightText: syuilo and misskey-project
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export function shouldCollapsed(note: Misskey.entities.Note, urls: string[]): boolean {
 | 
					 | 
				
			||||||
	const collapsed = note.cw == null && (
 | 
					 | 
				
			||||||
		note.text != null && (
 | 
					 | 
				
			||||||
			(note.text.includes('$[x2')) ||
 | 
					 | 
				
			||||||
			(note.text.includes('$[x3')) ||
 | 
					 | 
				
			||||||
			(note.text.includes('$[x4')) ||
 | 
					 | 
				
			||||||
			(note.text.includes('$[scale')) ||
 | 
					 | 
				
			||||||
			(note.text.split('\n').length > 9) ||
 | 
					 | 
				
			||||||
			(note.text.length > 500) ||
 | 
					 | 
				
			||||||
			(urls.length >= 4)
 | 
					 | 
				
			||||||
		) || note.files.length >= 5
 | 
					 | 
				
			||||||
	);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return collapsed;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import { host as localHost } from '@/config.js';
 | 
					import { host as localHost } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function genSearchQuery(v: any, q: string) {
 | 
					export async function genSearchQuery(v: any, q: string) {
 | 
				
			||||||
	let host: string;
 | 
						let host: string;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
import { defineAsyncComponent } from 'vue';
 | 
					import { defineAsyncComponent } from 'vue';
 | 
				
			||||||
import { v4 as uuid } from 'uuid';
 | 
					import { v4 as uuid } from 'uuid';
 | 
				
			||||||
import type { EmbedParams, EmbeddableEntity } from '@@/js/embed-page.js';
 | 
					import type { EmbedParams, EmbeddableEntity } from '@@/js/embed-page.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
					import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
				
			||||||
import { defaultEmbedParams, embedRouteWithScrollbar } from '@@/js/embed-page.js';
 | 
					import { defaultEmbedParams, embedRouteWithScrollbar } from '@@/js/embed-page.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@ import { instance } from '@/instance.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
					import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
				
			||||||
import { url } from '@/config.js';
 | 
					import { url } from '@@/js/config.js';
 | 
				
			||||||
import { defaultStore, noteActions } from '@/store.js';
 | 
					import { defaultStore, noteActions } from '@/store.js';
 | 
				
			||||||
import { miLocalStorage } from '@/local-storage.js';
 | 
					import { miLocalStorage } from '@/local-storage.js';
 | 
				
			||||||
import { getUserMenu } from '@/scripts/get-user-menu.js';
 | 
					import { getUserMenu } from '@/scripts/get-user-menu.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ import { defineAsyncComponent, ref, watch } from 'vue';
 | 
				
			||||||
import * as Misskey from 'misskey-js';
 | 
					import * as Misskey from 'misskey-js';
 | 
				
			||||||
import { i18n } from '@/i18n.js';
 | 
					import { i18n } from '@/i18n.js';
 | 
				
			||||||
import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
					import { copyToClipboard } from '@/scripts/copy-to-clipboard.js';
 | 
				
			||||||
import { host, url } from '@/config.js';
 | 
					import { host, url } from '@@/js/config.js';
 | 
				
			||||||
import * as os from '@/os.js';
 | 
					import * as os from '@/os.js';
 | 
				
			||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
					import { misskeyApi } from '@/scripts/misskey-api.js';
 | 
				
			||||||
import { defaultStore, userActions } from '@/store.js';
 | 
					import { defaultStore, userActions } from '@/store.js';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { lang } from '@/config.js';
 | 
					import { lang } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export async function initializeSw() {
 | 
					export async function initializeSw() {
 | 
				
			||||||
	if (!('serviceWorker' in navigator)) return;
 | 
						if (!('serviceWorker' in navigator)) return;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 * SPDX-License-Identifier: AGPL-3.0-only
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { lang } from '@/config.js';
 | 
					import { lang } from '@@/js/config.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const versatileLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP');
 | 
					export const versatileLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * SPDX-FileCopyrightText: syuilo and misskey-project
 | 
					 | 
				
			||||||
 * SPDX-License-Identifier: AGPL-3.0-only
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export function isLink(el: HTMLElement) {
 | 
					 | 
				
			||||||
	if (el.tagName === 'A') return true;
 | 
					 | 
				
			||||||
	if (el.parentElement) {
 | 
					 | 
				
			||||||
		return isLink(el.parentElement);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		
		Reference in a new issue