Merge pull request 'develop' (#9588) from develop into beta
Reviewed-on: https://codeberg.org/calckey/calckey/pulls/9588
This commit is contained in:
commit
12e16fa03f
7347
CHANGELOG.md
7347
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
|
@ -97,9 +97,10 @@ If you have access to a server that supports one of the sources below, I recomme
|
||||||
```sh
|
```sh
|
||||||
git clone --depth 1 https://codeberg.org/calckey/calckey.git
|
git clone --depth 1 https://codeberg.org/calckey/calckey.git
|
||||||
cd calckey/
|
cd calckey/
|
||||||
# git checkout main # if you want only stable versions
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
By default, you're on the development branch. Run `git checkout beta` or `git checkout main` to switch to the Beta/Main branches.
|
||||||
|
|
||||||
## 📩 Install dependencies
|
## 📩 Install dependencies
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|
|
@ -1786,3 +1786,20 @@ _deck:
|
||||||
list: "List"
|
list: "List"
|
||||||
mentions: "Mentions"
|
mentions: "Mentions"
|
||||||
direct: "Direct messages"
|
direct: "Direct messages"
|
||||||
|
_apps:
|
||||||
|
apps: "Apps"
|
||||||
|
crossPlatform: "Cross platform"
|
||||||
|
mobile: "Mobile"
|
||||||
|
firstParty: "First party"
|
||||||
|
firstClass: "First class"
|
||||||
|
secondClass: "Second class"
|
||||||
|
thirdClass: "Third class"
|
||||||
|
free: "Free"
|
||||||
|
paid: "Paid"
|
||||||
|
pwa: "Install PWA"
|
||||||
|
kaiteki: "Kaiteki"
|
||||||
|
milktea: "Milktea"
|
||||||
|
subwayTooter: "Subway Tooter"
|
||||||
|
kimis: "Kimis"
|
||||||
|
theDesk: "TheDesk"
|
||||||
|
lesskey: "Lesskey"
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "calckey",
|
"name": "calckey",
|
||||||
"version": "13.1.3-beta",
|
"version": "13.1.3-rc",
|
||||||
"codename": "aqua",
|
"codename": "aqua",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://codeberg.org/calckey/calckey.git"
|
"url": "https://codeberg.org/calckey/calckey.git"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@7.26.3",
|
"packageManager": "pnpm@7.27.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp",
|
"rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp",
|
||||||
|
|
|
@ -7,12 +7,14 @@
|
||||||
"lint": "pnpm rome check \"src/**/*.{ts,vue}\""
|
"lint": "pnpm rome check \"src/**/*.{ts,vue}\""
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@khmyznikov/pwa-install": "^0.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@discordapp/twemoji": "14.0.2",
|
||||||
"@rollup/plugin-alias": "3.1.9",
|
"@rollup/plugin-alias": "3.1.9",
|
||||||
"@rollup/plugin-json": "4.1.0",
|
"@rollup/plugin-json": "4.1.0",
|
||||||
"@rollup/pluginutils": "^4.2.1",
|
"@rollup/pluginutils": "^4.2.1",
|
||||||
|
"@syuilo/aiscript": "0.11.1",
|
||||||
"@types/escape-regexp": "0.0.1",
|
"@types/escape-regexp": "0.0.1",
|
||||||
"@types/glob": "8.0.0",
|
"@types/glob": "8.0.0",
|
||||||
"@types/gulp": "4.0.10",
|
"@types/gulp": "4.0.10",
|
||||||
|
@ -26,13 +28,6 @@
|
||||||
"@types/uuid": "8.3.4",
|
"@types/uuid": "8.3.4",
|
||||||
"@vitejs/plugin-vue": "4.0.0",
|
"@vitejs/plugin-vue": "4.0.0",
|
||||||
"@vue/compiler-sfc": "3.2.45",
|
"@vue/compiler-sfc": "3.2.45",
|
||||||
"cross-env": "7.0.3",
|
|
||||||
"cypress": "10.11.0",
|
|
||||||
"rollup": "3.9.1",
|
|
||||||
"start-server-and-test": "1.15.2",
|
|
||||||
"typescript": "4.9.4",
|
|
||||||
"@discordapp/twemoji": "14.0.2",
|
|
||||||
"@syuilo/aiscript": "0.11.1",
|
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "5.0.2",
|
"autosize": "5.0.2",
|
||||||
"blurhash": "1.1.5",
|
"blurhash": "1.1.5",
|
||||||
|
@ -45,6 +40,8 @@
|
||||||
"chartjs-plugin-zoom": "1.2.1",
|
"chartjs-plugin-zoom": "1.2.1",
|
||||||
"compare-versions": "5.0.3",
|
"compare-versions": "5.0.3",
|
||||||
"cropperjs": "2.0.0-beta.2",
|
"cropperjs": "2.0.0-beta.2",
|
||||||
|
"cross-env": "7.0.3",
|
||||||
|
"cypress": "10.11.0",
|
||||||
"date-fns": "2.29.3",
|
"date-fns": "2.29.3",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eventemitter3": "4.0.7",
|
"eventemitter3": "4.0.7",
|
||||||
|
@ -59,9 +56,11 @@
|
||||||
"punycode": "2.1.1",
|
"punycode": "2.1.1",
|
||||||
"querystring": "0.2.1",
|
"querystring": "0.2.1",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
|
"rollup": "3.9.1",
|
||||||
"s-age": "1.1.2",
|
"s-age": "1.1.2",
|
||||||
"sass": "1.57.1",
|
"sass": "1.57.1",
|
||||||
"seedrandom": "3.0.5",
|
"seedrandom": "3.0.5",
|
||||||
|
"start-server-and-test": "1.15.2",
|
||||||
"strict-event-emitter-types": "2.0.0",
|
"strict-event-emitter-types": "2.0.0",
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"swiper": "^8.4.5",
|
"swiper": "^8.4.5",
|
||||||
|
@ -73,6 +72,7 @@
|
||||||
"tsc-alias": "1.8.2",
|
"tsc-alias": "1.8.2",
|
||||||
"tsconfig-paths": "4.1.2",
|
"tsconfig-paths": "4.1.2",
|
||||||
"twemoji-parser": "14.0.0",
|
"twemoji-parser": "14.0.0",
|
||||||
|
"typescript": "4.9.4",
|
||||||
"uuid": "9.0.0",
|
"uuid": "9.0.0",
|
||||||
"vanilla-tilt": "1.8.0",
|
"vanilla-tilt": "1.8.0",
|
||||||
"vite": "^4.1.1",
|
"vite": "^4.1.1",
|
||||||
|
|
|
@ -1,12 +1,21 @@
|
||||||
<template>
|
<template>
|
||||||
<button
|
<button
|
||||||
class="kpoogebi _button"
|
class="kpoogebi _button"
|
||||||
:class="{ wait, active: isFollowing || hasPendingFollowRequestFromYou, full, large }"
|
:class="{
|
||||||
|
wait,
|
||||||
|
active: isFollowing || hasPendingFollowRequestFromYou,
|
||||||
|
full,
|
||||||
|
large,
|
||||||
|
blocking: isBlocking
|
||||||
|
}"
|
||||||
:disabled="wait"
|
:disabled="wait"
|
||||||
@click="onClick"
|
@click="onClick"
|
||||||
>
|
>
|
||||||
<template v-if="!wait">
|
<template v-if="!wait">
|
||||||
<template v-if="hasPendingFollowRequestFromYou && user.isLocked">
|
<template v-if="isBlocking">
|
||||||
|
<span v-if="full">{{ i18n.ts.blocked }}</span><i class="ph-prohibit-bold ph-lg"></i>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="hasPendingFollowRequestFromYou && user.isLocked">
|
||||||
<span v-if="full">{{ i18n.ts.followRequestPending }}</span><i class="ph-hourglass-medium-bold ph-lg"></i>
|
<span v-if="full">{{ i18n.ts.followRequestPending }}</span><i class="ph-hourglass-medium-bold ph-lg"></i>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked">
|
<template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked">
|
||||||
|
@ -30,12 +39,13 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onBeforeUnmount, onMounted } from 'vue';
|
import { computed, onBeforeUnmount, onMounted } from 'vue';
|
||||||
import type * as Misskey from 'calckey-js';
|
import type * as Misskey from 'calckey-js';
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
import { stream } from '@/stream';
|
import { stream } from '@/stream';
|
||||||
import { i18n } from '@/i18n';
|
import { i18n } from '@/i18n';
|
||||||
|
|
||||||
|
const emit = defineEmits(['refresh'])
|
||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
user: Misskey.entities.UserDetailed,
|
user: Misskey.entities.UserDetailed,
|
||||||
full?: boolean,
|
full?: boolean,
|
||||||
|
@ -45,6 +55,8 @@ const props = withDefaults(defineProps<{
|
||||||
large: false,
|
large: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const isBlocking = computed(() => props.user.isBlocking);
|
||||||
|
|
||||||
let isFollowing = $ref(props.user.isFollowing);
|
let isFollowing = $ref(props.user.isFollowing);
|
||||||
let hasPendingFollowRequestFromYou = $ref(props.user.hasPendingFollowRequestFromYou);
|
let hasPendingFollowRequestFromYou = $ref(props.user.hasPendingFollowRequestFromYou);
|
||||||
let wait = $ref(false);
|
let wait = $ref(false);
|
||||||
|
@ -68,7 +80,24 @@ async function onClick() {
|
||||||
wait = true;
|
wait = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (isFollowing) {
|
if (isBlocking.value) {
|
||||||
|
const { canceled } = await os.confirm({
|
||||||
|
type: 'warning',
|
||||||
|
text: i18n.t('unblockConfirm'),
|
||||||
|
});
|
||||||
|
if (canceled) return
|
||||||
|
|
||||||
|
await os.api("blocking/delete", {
|
||||||
|
userId: props.user.id,
|
||||||
|
})
|
||||||
|
if (props.user.isMuted) {
|
||||||
|
await os.api("mute/delete", {
|
||||||
|
userId: props.user.id,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
emit('refresh')
|
||||||
|
}
|
||||||
|
else if (isFollowing) {
|
||||||
const { canceled } = await os.confirm({
|
const { canceled } = await os.confirm({
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
text: i18n.t('unfollowConfirm', { name: props.user.name || props.user.username }),
|
text: i18n.t('unfollowConfirm', { name: props.user.name || props.user.username }),
|
||||||
|
@ -184,4 +213,9 @@ onBeforeUnmount(() => {
|
||||||
margin-right: 6px;
|
margin-right: 6px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.blocking {
|
||||||
|
background-color: var(--bg) !important;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
<span>{{ item.text }}</span>
|
<span>{{ item.text }}</span>
|
||||||
<span v-if="item.indicate" class="indicator"><i class="ph-circle-fill"></i></span>
|
<span v-if="item.indicate" class="indicator"><i class="ph-circle-fill"></i></span>
|
||||||
</a>
|
</a>
|
||||||
<button v-else-if="item.type === 'user'" :tabindex="i" class="_button item" :class="{ active: item.active }" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
<button v-else-if="item.type === 'user' && !items.hidden" :tabindex="i" class="_button item" :class="{ active: item.active }" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
||||||
<MkAvatar :user="item.user" class="avatar"/><MkUserName :user="item.user"/>
|
<MkAvatar :user="item.user" class="avatar"/><MkUserName :user="item.user"/>
|
||||||
<span v-if="item.indicate" class="indicator"><i class="ph-circle-fill"></i></span>
|
<span v-if="item.indicate" class="indicator"><i class="ph-circle-fill"></i></span>
|
||||||
</button>
|
</button>
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
<span>{{ item.text }}</span>
|
<span>{{ item.text }}</span>
|
||||||
<span class="caret"><i class="ph-caret-right-bold ph-lg ph-fw ph-lg"></i></span>
|
<span class="caret"><i class="ph-caret-right-bold ph-lg ph-fw ph-lg"></i></span>
|
||||||
</button>
|
</button>
|
||||||
<button v-else :tabindex="i" class="_button item" :class="{ danger: item.danger, active: item.active }" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
<button v-else-if="!item.hidden" :tabindex="i" class="_button item" :class="{ danger: item.danger, active: item.active }" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
|
||||||
<i v-if="item.icon" class="ph-fw ph-lg" :class="item.icon"></i>
|
<i v-if="item.icon" class="ph-fw ph-lg" :class="item.icon"></i>
|
||||||
<MkAvatar v-if="item.avatar" :user="item.avatar" class="avatar"/>
|
<MkAvatar v-if="item.avatar" :user="item.avatar" class="avatar"/>
|
||||||
<span>{{ item.text }}</span>
|
<span>{{ item.text }}</span>
|
||||||
|
|
|
@ -5,6 +5,10 @@ import * as os from "@/os";
|
||||||
import { i18n } from "@/i18n";
|
import { i18n } from "@/i18n";
|
||||||
import { ui } from "@/config";
|
import { ui } from "@/config";
|
||||||
import { unisonReload } from "@/scripts/unison-reload";
|
import { unisonReload } from "@/scripts/unison-reload";
|
||||||
|
import { defaultStore } from '@/store';
|
||||||
|
import { instance } from '@/instance';
|
||||||
|
import { host } from '@/config';
|
||||||
|
import XTutorial from '@/components/MkTutorialDialog.vue';
|
||||||
|
|
||||||
export const navbarItemDef = reactive({
|
export const navbarItemDef = reactive({
|
||||||
notifications: {
|
notifications: {
|
||||||
|
@ -144,4 +148,59 @@ export const navbarItemDef = reactive({
|
||||||
location.reload();
|
location.reload();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
help: {
|
||||||
|
title: "help",
|
||||||
|
icon: "ph-question-bold ph-lg",
|
||||||
|
action: (ev) => {
|
||||||
|
os.popupMenu([{
|
||||||
|
text: instance.name ?? host,
|
||||||
|
type: 'label',
|
||||||
|
}, {
|
||||||
|
type: 'link',
|
||||||
|
text: i18n.ts.instanceInfo,
|
||||||
|
icon: 'ph-info-bold ph-lg',
|
||||||
|
to: '/about',
|
||||||
|
}, {
|
||||||
|
type: 'link',
|
||||||
|
text: i18n.ts.aboutMisskey,
|
||||||
|
icon: 'ph-lightbulb-bold ph-lg',
|
||||||
|
to: '/about-calckey',
|
||||||
|
}, {
|
||||||
|
type: 'link',
|
||||||
|
text: i18n.ts._apps.apps,
|
||||||
|
icon: 'ph-device-mobile-bold ph-lg',
|
||||||
|
to: '/apps',
|
||||||
|
}, {
|
||||||
|
type: 'button',
|
||||||
|
action: async () => {
|
||||||
|
defaultStore.set('tutorial', 0);
|
||||||
|
os.popup(XTutorial, {}, {}, 'closed');
|
||||||
|
},
|
||||||
|
text: i18n.ts.replayTutorial,
|
||||||
|
icon: 'ph-circle-wavy-question-bold ph-lg',
|
||||||
|
}, null, {
|
||||||
|
type: 'parent',
|
||||||
|
text: i18n.ts.developer,
|
||||||
|
icon: 'ph-code-bold ph-lg',
|
||||||
|
children: [{
|
||||||
|
type: 'link',
|
||||||
|
to: '/api-console',
|
||||||
|
text: 'API Console',
|
||||||
|
icon: 'ph-terminal-window-bold ph-lg',
|
||||||
|
}, {
|
||||||
|
text: i18n.ts.document,
|
||||||
|
icon: 'ph-file-doc-bold ph-lg',
|
||||||
|
action: () => {
|
||||||
|
window.open('/api-doc', '_blank');
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
type: 'link',
|
||||||
|
to: '/scratchpad',
|
||||||
|
text: 'AiScript Scratchpad',
|
||||||
|
icon: 'ph-scribble-loop-bold ph-lg',
|
||||||
|
}]
|
||||||
|
}], ev.currentTarget ?? ev.target,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
<template>
|
||||||
|
<MkStickyContainer>
|
||||||
|
<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
|
||||||
|
<div style="overflow: clip;">
|
||||||
|
<MkSpacer :content-max="600" :margin-min="20">
|
||||||
|
<div class="_formRoot">
|
||||||
|
<FormSection>
|
||||||
|
<template #label>{{ i18n.ts._apps.crossPlatform }}</template>
|
||||||
|
<div class="_formBlock" style="text-align: center;">
|
||||||
|
<pwa-install/>
|
||||||
|
<MkButton primary rounded inline @click="installPwa">{{ i18n.ts._apps.pwa }}</MkButton>
|
||||||
|
</div>
|
||||||
|
<div class="_formLinks">
|
||||||
|
<FormLink to="https://kaiteki.app" external>
|
||||||
|
<template #icon>
|
||||||
|
<i class="ph-android-logo-bold ph-xl"/>
|
||||||
|
<i class="ph-windows-logo-bold ph-xl"/>
|
||||||
|
<i class="ph-linux-logo-bold ph-xl"/>
|
||||||
|
</template>
|
||||||
|
{{ i18n.ts._apps.kaiteki }}
|
||||||
|
<template #suffix>{{ i18n.ts._apps.firstClass }}, {{ i18n.ts._apps.free }}</template>
|
||||||
|
</FormLink>
|
||||||
|
</div>
|
||||||
|
</FormSection>
|
||||||
|
<FormSection>
|
||||||
|
<template #label>{{ i18n.ts._apps.mobile }}</template>
|
||||||
|
<div class="_formLinks">
|
||||||
|
<FormLink to="https://play.google.com/store/apps/details?id=jp.panta.misskeyandroidclient" external>
|
||||||
|
<template #icon>
|
||||||
|
<i class="ph-android-logo-bold ph-xl"/>
|
||||||
|
</template>
|
||||||
|
{{ i18n.ts._apps.milktea }}
|
||||||
|
<template #suffix>{{ i18n.ts._apps.firstClass }}, {{ i18n.ts._apps.free }}</template>
|
||||||
|
</FormLink>
|
||||||
|
<FormLink to="https://play.google.com/store/apps/details?id=jp.juggler.subwaytooter&gl=US" external>
|
||||||
|
<template #icon>
|
||||||
|
<i class="ph-android-logo-bold ph-xl"/>
|
||||||
|
</template>
|
||||||
|
{{ i18n.ts._apps.subwayTooter }}
|
||||||
|
<template #suffix>{{ i18n.ts._apps.secondClass }}, {{ i18n.ts._apps.free }}</template>
|
||||||
|
</FormLink>
|
||||||
|
<!-- <FormLink to="https://apps.apple.com/app/kimis-a-client-for-misskey/id1667275125" external>
|
||||||
|
<template #icon>
|
||||||
|
<i class="ph-apple-logo-bold ph-xl"/>
|
||||||
|
</template>
|
||||||
|
{{ i18n.ts._apps.kimis }}
|
||||||
|
<template #suffix>{{ i18n.ts._apps.secondClass }}, {{ i18n.ts._apps.paid }}</template>
|
||||||
|
</FormLink> -->
|
||||||
|
</div>
|
||||||
|
</FormSection>
|
||||||
|
<FormSection>
|
||||||
|
<template #label>{{ i18n.ts.desktop }}</template>
|
||||||
|
<div class="_formLinks">
|
||||||
|
<FormLink to="https://thedesk.top/" external>
|
||||||
|
<template #icon>
|
||||||
|
<i class="ph-apple-logo-bold ph-xl"/>
|
||||||
|
<i class="ph-windows-logo-bold ph-xl"/>
|
||||||
|
<i class="ph-linux-logo-bold ph-xl"/>
|
||||||
|
</template>
|
||||||
|
{{ i18n.ts._apps.theDesk }}
|
||||||
|
<template #suffix>{{ i18n.ts._apps.secondClass }}, {{ i18n.ts._apps.free }}</template>
|
||||||
|
</FormLink>
|
||||||
|
<FormLink to="https://github.com/AsPulse/lesskey" external>
|
||||||
|
<template #icon>
|
||||||
|
<i class="ph-terminal-window-bold ph-xl"/>
|
||||||
|
</template>
|
||||||
|
{{ i18n.ts._apps.lesskey }}
|
||||||
|
<template #suffix>{{ i18n.ts._apps.secondClass }}, {{ i18n.ts._apps.free }}</template>
|
||||||
|
</FormLink>
|
||||||
|
</div>
|
||||||
|
</FormSection>
|
||||||
|
</div>
|
||||||
|
</MkSpacer>
|
||||||
|
</div>
|
||||||
|
</MkStickyContainer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import FormLink from '@/components/form/link.vue';
|
||||||
|
import FormSection from '@/components/form/section.vue';
|
||||||
|
import MkButton from '@/components/MkButton.vue';
|
||||||
|
import { i18n } from '@/i18n';
|
||||||
|
import { definePageMetadata } from '@/scripts/page-metadata';
|
||||||
|
import '@khmyznikov/pwa-install';
|
||||||
|
|
||||||
|
const headerActions = $computed(() => []);
|
||||||
|
|
||||||
|
const headerTabs = $computed(() => []);
|
||||||
|
|
||||||
|
function installPwa(ev: MouseEvent) {
|
||||||
|
const pwaInstall = document.getElementsByTagName('pwa-install')[0];
|
||||||
|
pwaInstall.showDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
definePageMetadata({
|
||||||
|
title: i18n.ts._apps.apps,
|
||||||
|
icon: null,
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -44,7 +44,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="follow-container">
|
<div class="follow-container">
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<MkFollowButton v-if="$i != null && $i.id != user.id" :user="user" :inline="true" :transparent="false" :full="!narrow" class="koudoku"/>
|
<MkFollowButton v-if="$i != null && $i.id != user.id" :user="user" @refresh="emit('refresh')" :inline="true" :transparent="false" :full="!narrow" class="koudoku"/>
|
||||||
<button class="menu _button" @click="menu"><i class="ph-dots-three-outline-bold ph-lg"></i></button>
|
<button class="menu _button" @click="menu"><i class="ph-dots-three-outline-bold ph-lg"></i></button>
|
||||||
<!-- <MkFollowButton v-else-if="$i == null" :user="user" :remote="true" :inline="true" :transparent="false" :full="true" class="koudoku"/> -->
|
<!-- <MkFollowButton v-else-if="$i == null" :user="user" :remote="true" :inline="true" :transparent="false" :full="true" class="koudoku"/> -->
|
||||||
</div>
|
</div>
|
||||||
|
@ -142,6 +142,7 @@ import { host } from '@/config';
|
||||||
const XPhotos = defineAsyncComponent(() => import('./index.photos.vue'));
|
const XPhotos = defineAsyncComponent(() => import('./index.photos.vue'));
|
||||||
const XActivity = defineAsyncComponent(() => import('./index.activity.vue'));
|
const XActivity = defineAsyncComponent(() => import('./index.activity.vue'));
|
||||||
|
|
||||||
|
const emit = defineEmits(['refresh']);
|
||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
user: misskey.entities.UserDetailed;
|
user: misskey.entities.UserDetailed;
|
||||||
}>(), {
|
}>(), {
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<div>
|
<div>
|
||||||
<transition name="fade" mode="out-in">
|
<transition name="fade" mode="out-in">
|
||||||
<div v-if="user">
|
<div v-if="user">
|
||||||
<XHome v-if="tab === 'home'" :user="user"/>
|
<XHome v-if="tab === 'home'" :user="user" @refresh="fetchUser()"/>
|
||||||
<XReactions v-else-if="tab === 'reactions'" :user="user"/>
|
<XReactions v-else-if="tab === 'reactions'" :user="user"/>
|
||||||
<XClips v-else-if="tab === 'clips'" :user="user"/>
|
<XClips v-else-if="tab === 'clips'" :user="user"/>
|
||||||
<XPages v-else-if="tab === 'pages'" :user="user"/>
|
<XPages v-else-if="tab === 'pages'" :user="user"/>
|
||||||
|
|
|
@ -282,6 +282,10 @@ export const routes = [
|
||||||
path: "/about-calckey",
|
path: "/about-calckey",
|
||||||
component: page(() => import("./pages/about-calckey.vue")),
|
component: page(() => import("./pages/about-calckey.vue")),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/apps",
|
||||||
|
component: page(() => import("./pages/apps.vue")),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "/theme-editor",
|
path: "/theme-editor",
|
||||||
component: page(() => import("./pages/theme-editor.vue")),
|
component: page(() => import("./pages/theme-editor.vue")),
|
||||||
|
|
|
@ -125,11 +125,20 @@ export function getUserMenu(user, router: Router = mainRouter) {
|
||||||
)
|
)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
os.apiWithDialog(user.isBlocking ? "blocking/delete" : "blocking/create", {
|
await os.apiWithDialog(user.isBlocking ? "blocking/delete" : "blocking/create", {
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
}).then(() => {
|
})
|
||||||
user.isBlocking = !user.isBlocking;
|
user.isBlocking = !user.isBlocking;
|
||||||
});
|
await os.api(user.isBlocking ? "mute/create" : "mute/delete", {
|
||||||
|
userId: user.id,
|
||||||
|
})
|
||||||
|
user.isMuted = user.isBlocking;
|
||||||
|
if (user.isBlocking) {
|
||||||
|
await os.api('following/delete', {
|
||||||
|
userId: user.id,
|
||||||
|
});
|
||||||
|
user.isFollowing = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function toggleSilence() {
|
async function toggleSilence() {
|
||||||
|
@ -252,6 +261,7 @@ export function getUserMenu(user, router: Router = mainRouter) {
|
||||||
{
|
{
|
||||||
icon: user.isMuted ? "ph-eye-bold ph-lg" : "ph-eye-slash-bold ph-lg",
|
icon: user.isMuted ? "ph-eye-bold ph-lg" : "ph-eye-slash-bold ph-lg",
|
||||||
text: user.isMuted ? i18n.ts.unmute : i18n.ts.mute,
|
text: user.isMuted ? i18n.ts.unmute : i18n.ts.mute,
|
||||||
|
hidden: user.isBlocking === true,
|
||||||
action: toggleMute,
|
action: toggleMute,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,6 +28,7 @@ export type MenuUser = {
|
||||||
user: Misskey.entities.User;
|
user: Misskey.entities.User;
|
||||||
active?: boolean;
|
active?: boolean;
|
||||||
indicate?: boolean;
|
indicate?: boolean;
|
||||||
|
hidden?: boolean;
|
||||||
action: MenuAction;
|
action: MenuAction;
|
||||||
};
|
};
|
||||||
export type MenuSwitch = {
|
export type MenuSwitch = {
|
||||||
|
@ -43,6 +44,7 @@ export type MenuButton = {
|
||||||
indicate?: boolean;
|
indicate?: boolean;
|
||||||
danger?: boolean;
|
danger?: boolean;
|
||||||
active?: boolean;
|
active?: boolean;
|
||||||
|
hidden?: boolean;
|
||||||
avatar?: Misskey.entities.User;
|
avatar?: Misskey.entities.User;
|
||||||
action: MenuAction;
|
action: MenuAction;
|
||||||
};
|
};
|
||||||
|
|
|
@ -34,9 +34,6 @@
|
||||||
<button class="item _button post" data-cy-open-post-form @click="os.post">
|
<button class="item _button post" data-cy-open-post-form @click="os.post">
|
||||||
<i class="icon ph-pencil-bold ph-lg ph-fw ph-lg"></i><span class="text">{{ i18n.ts.note }}</span>
|
<i class="icon ph-pencil-bold ph-lg ph-fw ph-lg"></i><span class="text">{{ i18n.ts.note }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button v-click-anime v-tooltip.noDelay.right="$instance.name ?? i18n.ts.instance" class="item _button instance" @click="openInstanceMenu">
|
|
||||||
<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" alt="" class="icon"/>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -44,12 +41,10 @@
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, defineAsyncComponent, defineComponent, ref, toRef, watch } from 'vue';
|
import { computed, defineAsyncComponent, defineComponent, ref, toRef, watch } from 'vue';
|
||||||
import { host } from '@/config';
|
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
import { navbarItemDef } from '@/navbar';
|
import { navbarItemDef } from '@/navbar';
|
||||||
import { openAccountMenu as openAccountMenu_ } from '@/account';
|
import { openAccountMenu as openAccountMenu_ } from '@/account';
|
||||||
import { defaultStore } from '@/store';
|
import { defaultStore } from '@/store';
|
||||||
import { instance } from '@/instance';
|
|
||||||
import { i18n } from '@/i18n';
|
import { i18n } from '@/i18n';
|
||||||
|
|
||||||
const menu = toRef(defaultStore.state, 'menu');
|
const menu = toRef(defaultStore.state, 'menu');
|
||||||
|
@ -67,50 +62,6 @@ function openAccountMenu(ev: MouseEvent) {
|
||||||
}, ev);
|
}, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
function openInstanceMenu(ev: MouseEvent) {
|
|
||||||
os.popupMenu([{
|
|
||||||
text: instance.name ?? host,
|
|
||||||
type: 'label',
|
|
||||||
}, {
|
|
||||||
type: 'link',
|
|
||||||
text: i18n.ts.instanceInfo,
|
|
||||||
icon: 'ph-info-bold ph-lg',
|
|
||||||
to: '/about',
|
|
||||||
}, null, {
|
|
||||||
type: 'parent',
|
|
||||||
text: i18n.ts.help,
|
|
||||||
icon: 'ph-question-bold ph-lg',
|
|
||||||
children: [{
|
|
||||||
type: 'link',
|
|
||||||
to: '/mfm-cheat-sheet',
|
|
||||||
text: i18n.ts._mfm.cheatSheet,
|
|
||||||
icon: 'ph-code-bold ph-lg',
|
|
||||||
}, {
|
|
||||||
type: 'link',
|
|
||||||
to: '/scratchpad',
|
|
||||||
text: i18n.ts.scratchpad,
|
|
||||||
icon: 'ph-terminal-window-bold ph-lg',
|
|
||||||
}, {
|
|
||||||
type: 'link',
|
|
||||||
to: '/api-console',
|
|
||||||
text: 'API Console',
|
|
||||||
icon: 'ph-terminal-window-bold ph-lg',
|
|
||||||
}, null, {
|
|
||||||
text: i18n.ts.document,
|
|
||||||
icon: 'ph-question-bold ph-lg',
|
|
||||||
action: () => {
|
|
||||||
window.open('/api-doc', '_blank');
|
|
||||||
},
|
|
||||||
}],
|
|
||||||
}, {
|
|
||||||
type: 'link',
|
|
||||||
text: i18n.ts.aboutMisskey,
|
|
||||||
to: '/about-calckey',
|
|
||||||
}], ev.currentTarget ?? ev.target, {
|
|
||||||
align: 'left',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function more() {
|
function more() {
|
||||||
os.popup(defineAsyncComponent(() => import('@/components/MkLaunchPad.vue')), {}, {
|
os.popup(defineAsyncComponent(() => import('@/components/MkLaunchPad.vue')), {}, {
|
||||||
}, 'closed');
|
}, 'closed');
|
||||||
|
|
|
@ -44,9 +44,14 @@
|
||||||
<button v-tooltip.noDelay.right="i18n.ts.note" class="item _button post" data-cy-open-post-form @click="os.post">
|
<button v-tooltip.noDelay.right="i18n.ts.note" class="item _button post" data-cy-open-post-form @click="os.post">
|
||||||
<i class="icon ph-pencil-bold ph-lg ph-fw ph-lg"></i><span class="text">{{ i18n.ts.note }}</span>
|
<i class="icon ph-pencil-bold ph-lg ph-fw ph-lg"></i><span class="text">{{ i18n.ts.note }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button v-click-anime v-tooltip.noDelay.right="$instance.name ?? i18n.ts.instance" class="item _button instance" @click="openInstanceMenu">
|
<!-- <div class="help">
|
||||||
|
<button v-tooltip.noDelay.right="i18n.ts.help" class="item _button" @click="openHelpMenu">
|
||||||
|
<i class="icon ph-info-bold ph-xl ph-fw ph-lg"></i>
|
||||||
|
</button>
|
||||||
|
</div> -->
|
||||||
|
<!-- <button v-click-anime v-tooltip.noDelay.right="$instance.name ?? i18n.ts.instance" class="item _button instance" @click="openInstanceMenu">
|
||||||
<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" alt="" class="icon"/>
|
<img :src="$instance.iconUrl || $instance.faviconUrl || '/favicon.ico'" alt="" class="icon"/>
|
||||||
</button>
|
</button> -->
|
||||||
<!-- <button v-click-anime v-tooltip.noDelay.right="`${i18n.ts.account}: @${$i.username}`" class="item _button account" @click="openAccountMenu">
|
<!-- <button v-click-anime v-tooltip.noDelay.right="`${i18n.ts.account}: @${$i.username}`" class="item _button account" @click="openAccountMenu">
|
||||||
<MkAvatar :user="$i" class="account"/><MkAcct class="text" :user="$i"/>
|
<MkAvatar :user="$i" class="account"/><MkAcct class="text" :user="$i"/>
|
||||||
</button> -->
|
</button> -->
|
||||||
|
@ -57,14 +62,13 @@
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, defineAsyncComponent, ref, watch } from 'vue';
|
import { computed, defineAsyncComponent, ref, watch } from 'vue';
|
||||||
import XTutorial from '@/components/MkTutorialDialog.vue';
|
|
||||||
import * as os from '@/os';
|
import * as os from '@/os';
|
||||||
import { navbarItemDef } from '@/navbar';
|
import { navbarItemDef } from '@/navbar';
|
||||||
import { $i, openAccountMenu as openAccountMenu_ } from '@/account';
|
import { $i, openAccountMenu as openAccountMenu_ } from '@/account';
|
||||||
import { defaultStore } from '@/store';
|
import { defaultStore } from '@/store';
|
||||||
import { i18n } from '@/i18n';
|
import { i18n } from '@/i18n';
|
||||||
import { instance } from '@/instance';
|
import { instance } from '@/instance';
|
||||||
import { host, version } from '@/config';
|
import { version } from '@/config';
|
||||||
|
|
||||||
const isEmpty = (x: string | null) => x == null || x === '';
|
const isEmpty = (x: string | null) => x == null || x === '';
|
||||||
|
|
||||||
|
@ -122,58 +126,6 @@ function openAccountMenu(ev: MouseEvent) {
|
||||||
}, ev);
|
}, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
function openInstanceMenu(ev: MouseEvent) {
|
|
||||||
os.popupMenu([{
|
|
||||||
text: instance.name ?? host,
|
|
||||||
type: 'label',
|
|
||||||
}, {
|
|
||||||
type: 'link',
|
|
||||||
text: i18n.ts.instanceInfo,
|
|
||||||
icon: 'ph-info-bold ph-lg',
|
|
||||||
to: '/about',
|
|
||||||
}, null, {
|
|
||||||
type: 'parent',
|
|
||||||
text: i18n.ts.help,
|
|
||||||
icon: 'ph-question-bold ph-lg',
|
|
||||||
children: [{
|
|
||||||
type: 'link',
|
|
||||||
to: '/mfm-cheat-sheet',
|
|
||||||
text: i18n.ts._mfm.cheatSheet,
|
|
||||||
icon: 'ph-code-bold ph-lg',
|
|
||||||
}, {
|
|
||||||
type: 'button',
|
|
||||||
action: async () => {
|
|
||||||
defaultStore.set('tutorial', 0);
|
|
||||||
os.popup(XTutorial, {}, {}, 'closed');
|
|
||||||
},
|
|
||||||
text: i18n.ts.replayTutorial,
|
|
||||||
icon: 'ph-circle-wavy-question-bold ph-lg',
|
|
||||||
}, {
|
|
||||||
type: 'link',
|
|
||||||
to: '/scratchpad',
|
|
||||||
text: i18n.ts.scratchpad,
|
|
||||||
icon: 'ph-terminal-window-bold ph-lg',
|
|
||||||
}, {
|
|
||||||
type: 'link',
|
|
||||||
to: '/api-console',
|
|
||||||
text: 'API Console',
|
|
||||||
icon: 'ph-terminal-window-bold ph-lg',
|
|
||||||
}, null, {
|
|
||||||
text: i18n.ts.document,
|
|
||||||
icon: 'ph-question-bold ph-lg',
|
|
||||||
action: () => {
|
|
||||||
window.open('https://misskey-hub.net/help.html', '_blank');
|
|
||||||
},
|
|
||||||
}],
|
|
||||||
}, {
|
|
||||||
type: 'link',
|
|
||||||
text: i18n.ts.aboutMisskey,
|
|
||||||
to: '/about-calckey',
|
|
||||||
}], ev.currentTarget ?? ev.target, {
|
|
||||||
align: 'left',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function more(ev: MouseEvent) {
|
function more(ev: MouseEvent) {
|
||||||
os.popup(defineAsyncComponent(() => import('@/components/MkLaunchPad.vue')), {
|
os.popup(defineAsyncComponent(() => import('@/components/MkLaunchPad.vue')), {
|
||||||
src: ev.currentTarget ?? ev.target,
|
src: ev.currentTarget ?? ev.target,
|
||||||
|
@ -296,7 +248,6 @@ function more(ev: MouseEvent) {
|
||||||
> .text {
|
> .text {
|
||||||
margin-left: 1rem;
|
margin-left: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
> .instance {
|
> .instance {
|
||||||
|
|
|
@ -383,6 +383,7 @@ importers:
|
||||||
packages/client:
|
packages/client:
|
||||||
specifiers:
|
specifiers:
|
||||||
'@discordapp/twemoji': 14.0.2
|
'@discordapp/twemoji': 14.0.2
|
||||||
|
'@khmyznikov/pwa-install': ^0.2.0
|
||||||
'@rollup/plugin-alias': 3.1.9
|
'@rollup/plugin-alias': 3.1.9
|
||||||
'@rollup/plugin-json': 4.1.0
|
'@rollup/plugin-json': 4.1.0
|
||||||
'@rollup/pluginutils': ^4.2.1
|
'@rollup/pluginutils': ^4.2.1
|
||||||
|
@ -453,6 +454,8 @@ importers:
|
||||||
vue-plyr: ^7.0.0
|
vue-plyr: ^7.0.0
|
||||||
vue-prism-editor: 2.0.0-alpha.2
|
vue-prism-editor: 2.0.0-alpha.2
|
||||||
vuedraggable: 4.1.0
|
vuedraggable: 4.1.0
|
||||||
|
dependencies:
|
||||||
|
'@khmyznikov/pwa-install': 0.2.0
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@discordapp/twemoji': 14.0.2
|
'@discordapp/twemoji': 14.0.2
|
||||||
'@rollup/plugin-alias': 3.1.9_rollup@3.9.1
|
'@rollup/plugin-alias': 3.1.9_rollup@3.9.1
|
||||||
|
@ -1186,6 +1189,13 @@ packages:
|
||||||
'@jridgewell/resolve-uri': 3.1.0
|
'@jridgewell/resolve-uri': 3.1.0
|
||||||
'@jridgewell/sourcemap-codec': 1.4.14
|
'@jridgewell/sourcemap-codec': 1.4.14
|
||||||
|
|
||||||
|
/@khmyznikov/pwa-install/0.2.0:
|
||||||
|
resolution: {integrity: sha512-Lz8lvCf47/DCVzXgLyCGt46HDpie2U/lga++vOgVwil3B8bSMj8fL1+a/8oBhDikHjtLKinTCMf0jZvgW2xCZQ==}
|
||||||
|
dependencies:
|
||||||
|
'@lit/localize': 0.11.4
|
||||||
|
lit: 2.6.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@koa/cors/3.4.3:
|
/@koa/cors/3.4.3:
|
||||||
resolution: {integrity: sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw==}
|
resolution: {integrity: sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw==}
|
||||||
engines: {node: '>= 8.0.0'}
|
engines: {node: '>= 8.0.0'}
|
||||||
|
@ -1219,6 +1229,23 @@ packages:
|
||||||
resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==}
|
resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@lit-labs/ssr-dom-shim/1.0.0:
|
||||||
|
resolution: {integrity: sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@lit/localize/0.11.4:
|
||||||
|
resolution: {integrity: sha512-RRIwIX2tAm3+DuEndoXSJrFjGrAK5cb5IXo5K6jcJ6sbgD829B8rSqHC5MaKVUmXTVLIR1bk5IZOZDf9wFereA==}
|
||||||
|
dependencies:
|
||||||
|
'@lit/reactive-element': 1.6.1
|
||||||
|
lit: 2.6.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@lit/reactive-element/1.6.1:
|
||||||
|
resolution: {integrity: sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==}
|
||||||
|
dependencies:
|
||||||
|
'@lit-labs/ssr-dom-shim': 1.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@mapbox/node-pre-gyp/1.0.9:
|
/@mapbox/node-pre-gyp/1.0.9:
|
||||||
resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==}
|
resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
@ -2457,6 +2484,10 @@ packages:
|
||||||
resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==}
|
resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@types/trusted-types/2.0.2:
|
||||||
|
resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@types/undertaker-registry/1.0.1:
|
/@types/undertaker-registry/1.0.1:
|
||||||
resolution: {integrity: sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==}
|
resolution: {integrity: sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -3256,7 +3287,7 @@ packages:
|
||||||
/axios/0.25.0_debug@4.3.4:
|
/axios/0.25.0_debug@4.3.4:
|
||||||
resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
|
resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
|
||||||
dependencies:
|
dependencies:
|
||||||
follow-redirects: 1.15.2
|
follow-redirects: 1.15.2_debug@4.3.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- debug
|
- debug
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -6196,6 +6227,19 @@ packages:
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
debug:
|
debug:
|
||||||
optional: true
|
optional: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/follow-redirects/1.15.2_debug@4.3.4:
|
||||||
|
resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
|
||||||
|
engines: {node: '>=4.0'}
|
||||||
|
peerDependencies:
|
||||||
|
debug: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
debug:
|
||||||
|
optional: true
|
||||||
|
dependencies:
|
||||||
|
debug: 4.3.4
|
||||||
|
dev: true
|
||||||
|
|
||||||
/for-each/0.3.3:
|
/for-each/0.3.3:
|
||||||
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
|
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
|
||||||
|
@ -8349,6 +8393,27 @@ packages:
|
||||||
wrap-ansi: 7.0.0
|
wrap-ansi: 7.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/lit-element/3.2.2:
|
||||||
|
resolution: {integrity: sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==}
|
||||||
|
dependencies:
|
||||||
|
'@lit/reactive-element': 1.6.1
|
||||||
|
lit-html: 2.6.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/lit-html/2.6.1:
|
||||||
|
resolution: {integrity: sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==}
|
||||||
|
dependencies:
|
||||||
|
'@types/trusted-types': 2.0.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/lit/2.6.1:
|
||||||
|
resolution: {integrity: sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==}
|
||||||
|
dependencies:
|
||||||
|
'@lit/reactive-element': 1.6.1
|
||||||
|
lit-element: 3.2.2
|
||||||
|
lit-html: 2.6.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/load-json-file/1.1.0:
|
/load-json-file/1.1.0:
|
||||||
resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==}
|
resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"version": "13.1.0",
|
"version": "13.1.3-rc",
|
||||||
"notes": "This release includes many changes, including:\n\n• New post and thread layout\n• Automatic subdomain blocks\n• Customizable default reactions\n• Federation improvements\n• Many bug fixes and performance improvements",
|
"notes": "This release candidate has the following changes:\n• Better blocking/muting\n• Better user refreshing\n• New help menu with app list (More! > Help)\n• Bug fixes and performance improvements",
|
||||||
"screenshots": []
|
"screenshots": []
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue