wip
This commit is contained in:
parent
7355ae4f8a
commit
d14b0e815c
Binary file not shown.
After Width: | Height: | Size: 6.1 KiB |
|
@ -6,7 +6,6 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<template>
|
<template>
|
||||||
<component :is="link ? EmA : 'span'" v-bind="bound" class="_noSelect" :class="[$style.root, { [$style.cat]: user.isCat }]" @click="onClick">
|
<component :is="link ? EmA : 'span'" v-bind="bound" class="_noSelect" :class="[$style.root, { [$style.cat]: user.isCat }]" @click="onClick">
|
||||||
<EmImgWithBlurhash :class="$style.inner" :src="url" :hash="user.avatarBlurhash" :cover="true" :onlyAvgColor="true"/>
|
<EmImgWithBlurhash :class="$style.inner" :src="url" :hash="user.avatarBlurhash" :cover="true" :onlyAvgColor="true"/>
|
||||||
<EmUserOnlineIndicator v-if="indicator" :class="$style.indicator" :user="user"/>
|
|
||||||
<div v-if="user.isCat" :class="[$style.ears]">
|
<div v-if="user.isCat" :class="[$style.ears]">
|
||||||
<div :class="$style.earLeft">
|
<div :class="$style.earLeft">
|
||||||
<div v-if="false" :class="$style.layer">
|
<div v-if="false" :class="$style.layer">
|
||||||
|
@ -43,7 +42,6 @@ import * as Misskey from 'misskey-js';
|
||||||
import EmImgWithBlurhash from './EmImgWithBlurhash.vue';
|
import EmImgWithBlurhash from './EmImgWithBlurhash.vue';
|
||||||
import EmA from './EmA.vue';
|
import EmA from './EmA.vue';
|
||||||
import { userPage } from '@/utils.js';
|
import { userPage } from '@/utils.js';
|
||||||
import EmUserOnlineIndicator from '@/components/EmUserOnlineIndicator.vue';
|
|
||||||
|
|
||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
user: Misskey.entities.User;
|
user: Misskey.entities.User;
|
||||||
|
|
|
@ -30,11 +30,14 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import type { OpenOnRemoteOptions } from '@/scripts/please-login.js';
|
import type { OpenOnRemoteOptions } from '@/scripts/please-login.js';
|
||||||
import { sum } from '@/scripts/array.js';
|
|
||||||
import { i18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
import { host } from '@/config.js';
|
import { host } from '@/config.js';
|
||||||
import { useInterval } from '@/to-be-shared/use-interval.js';
|
import { useInterval } from '@/to-be-shared/use-interval.js';
|
||||||
|
|
||||||
|
function sum(xs: number[]): number {
|
||||||
|
return xs.reduce((a, b) => a + b, 0);
|
||||||
|
}
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
noteId: string;
|
noteId: string;
|
||||||
poll: NonNullable<Misskey.entities.Note['poll']>;
|
poll: NonNullable<Misskey.entities.Note['poll']>;
|
||||||
|
|
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
class="_button"
|
class="_button"
|
||||||
:class="[$style.root, { [$style.reacted]: note.myReaction == reaction }]"
|
:class="[$style.root, { [$style.reacted]: note.myReaction == reaction }]"
|
||||||
>
|
>
|
||||||
<MkReactionIcon :class="$style.limitWidth" :reaction="reaction" :emojiUrl="note.reactionEmojis[reaction.substring(1, reaction.length - 1)]"/>
|
<EmReactionIcon :class="$style.limitWidth" :reaction="reaction" :emojiUrl="note.reactionEmojis[reaction.substring(1, reaction.length - 1)]"/>
|
||||||
<span :class="$style.count">{{ count }}</span>
|
<span :class="$style.count">{{ count }}</span>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
|
@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { } from 'vue';
|
import { } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import MkReactionIcon from '@/components/MkReactionIcon.vue';
|
import EmReactionIcon from '@/components/EmReactionIcon.vue';
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
reaction: string;
|
reaction: string;
|
||||||
|
|
|
@ -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 '@/scripts/intl-const.js';
|
import { dateTimeFormat } from '@/to-be-shared/intl-const.js';
|
||||||
|
|
||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
time: Date | string | number | null;
|
time: Date | string | number | null;
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { lang } from '@/config.js';
|
||||||
|
|
||||||
|
export const versatileLang = (lang ?? 'ja-JP').replace('ja-KS', 'ja-JP');
|
||||||
|
|
||||||
|
let _dateTimeFormat: Intl.DateTimeFormat;
|
||||||
|
try {
|
||||||
|
_dateTimeFormat = new Intl.DateTimeFormat(versatileLang, {
|
||||||
|
year: 'numeric',
|
||||||
|
month: 'numeric',
|
||||||
|
day: 'numeric',
|
||||||
|
hour: 'numeric',
|
||||||
|
minute: 'numeric',
|
||||||
|
second: 'numeric',
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(err);
|
||||||
|
if (_DEV_) console.log('[Intl] Fallback to en-US');
|
||||||
|
|
||||||
|
// Fallback to en-US
|
||||||
|
_dateTimeFormat = new Intl.DateTimeFormat('en-US', {
|
||||||
|
year: 'numeric',
|
||||||
|
month: 'numeric',
|
||||||
|
day: 'numeric',
|
||||||
|
hour: 'numeric',
|
||||||
|
minute: 'numeric',
|
||||||
|
second: 'numeric',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
export const dateTimeFormat = _dateTimeFormat;
|
||||||
|
|
||||||
|
export const timeZone = dateTimeFormat.resolvedOptions().timeZone;
|
||||||
|
|
||||||
|
export const hemisphere = /^(australia|pacific|antarctica|indian)\//i.test(timeZone) ? 'S' : 'N';
|
||||||
|
|
||||||
|
let _numberFormat: Intl.NumberFormat;
|
||||||
|
try {
|
||||||
|
_numberFormat = new Intl.NumberFormat(versatileLang);
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(err);
|
||||||
|
if (_DEV_) console.log('[Intl] Fallback to en-US');
|
||||||
|
|
||||||
|
// Fallback to en-US
|
||||||
|
_numberFormat = new Intl.NumberFormat('en-US');
|
||||||
|
}
|
||||||
|
export const numberFormat = _numberFormat;
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { render } from 'buraha';
|
||||||
|
|
||||||
|
const canvas = new OffscreenCanvas(64, 64);
|
||||||
|
|
||||||
|
onmessage = (event) => {
|
||||||
|
// console.log(event.data);
|
||||||
|
if (!('id' in event.data && typeof event.data.id === 'string')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!('hash' in event.data && typeof event.data.hash === 'string')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
render(event.data.hash, canvas);
|
||||||
|
const bitmap = canvas.transferToImageBitmap();
|
||||||
|
postMessage({ id: event.data.id, bitmap });
|
||||||
|
};
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
const canvas = globalThis.OffscreenCanvas && new OffscreenCanvas(1, 1);
|
||||||
|
// 環境によってはOffscreenCanvasが存在しないため
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
||||||
|
const gl = canvas?.getContext('webgl2');
|
||||||
|
if (gl) {
|
||||||
|
postMessage({ result: true });
|
||||||
|
} else {
|
||||||
|
postMessage({ result: false });
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": ["esnext", "webworker"],
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue