docs: change branding Pawkey (#1)
- Change string instances from Sharkey to Pawkey - Change logos and art to Pawkey - Change repository URL where possible to our git repo - Puppy > Shonks - Change repo in compose_example.yml Co-Authored-By: Bluey Heeler <bluey@pawkey.dev>
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 264 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 223 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 314 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 314 KiB After Width: | Height: | Size: 48 KiB |
@@ -6,8 +6,8 @@
|
||||
export class AddSomeUrls1557761316509 {
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "ToSUrl" character varying(512)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "repositoryUrl" character varying(512) NOT NULL DEFAULT 'https://git.joinsharkey.org/Sharkey/Sharkey'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "feedbackUrl" character varying(512) DEFAULT 'https://git.joinsharkey.org/Sharkey/Sharkey/issues/new/choose'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "repositoryUrl" character varying(512) NOT NULL DEFAULT 'https://git.leafus.net/pawkey/pawkey'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "feedbackUrl" character varying(512) DEFAULT 'https://git.leafus.net/pawkey/pawkey/issues/new/choose'`);
|
||||
}
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "feedbackUrl"`);
|
||||
|
||||
@@ -8,7 +8,7 @@ export class instancePinnedPages1605585339718 {
|
||||
this.name = 'instancePinnedPages1605585339718';
|
||||
}
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedPages" character varying(512) array NOT NULL DEFAULT '{"/featured", "/channels", "/explore", "/pages", "/about-sharkey"}'::varchar[]`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedPages" character varying(512) array NOT NULL DEFAULT '{"/featured", "/channels", "/explore", "/pages", "/about-pawkey"}'::varchar[]`);
|
||||
}
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedPages"`);
|
||||
|
||||
@@ -13,6 +13,6 @@ export class removeUnused1678427401214 {
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedClipId" character varying(32)`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedPages" character varying(512) array NOT NULL DEFAULT '{/featured,/channels,/explore,/pages,/about-sharkey}'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedPages" character varying(512) array NOT NULL DEFAULT '{/featured,/channels,/explore,/pages,/about-pawkey}'`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,16 +7,16 @@ export class SharkeyRepositoryUrl1708342829000 {
|
||||
name = 'SharkeyRepositoryUrl1708342829000'
|
||||
|
||||
async up(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "repositoryUrl" SET DEFAULT 'https://activitypub.software/TransFem-org/Sharkey/'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "feedbackUrl" SET DEFAULT 'https://activitypub.software/TransFem-org/Sharkey/-/issues/new'`);
|
||||
await queryRunner.query(`UPDATE "meta" SET "repositoryUrl"=DEFAULT WHERE "repositoryUrl" IN ('https://git.joinsharkey.org/Sharkey/Sharkey','https://github.com/transfem-org/sharkey','https://github.com/misskey-dev/misskey')`);
|
||||
await queryRunner.query(`UPDATE "meta" SET "feedbackUrl"=DEFAULT WHERE "feedbackUrl" IN ('https://git.joinsharkey.org/Sharkey/Sharkey/issues/new/choose','https://github.com/transfem-org/sharkey/issues/new','https://github.com/misskey-dev/misskey/issues/new')`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "repositoryUrl" SET DEFAULT 'https://git.leafus.net/pawkey/pawkey'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "feedbackUrl" SET DEFAULT 'https://git.leafus.net/pawkey/pawkey/-/issues/new'`);
|
||||
await queryRunner.query(`UPDATE "meta" SET "repositoryUrl"=DEFAULT WHERE "repositoryUrl" IN ('https://git.joinsharkey.org/Sharkey/Sharkey','https://github.com/transfem-org/sharkey','https://github.com/misskey-dev/misskey','https://activitypub.software/TransFem-org/Sharkey/')`);
|
||||
await queryRunner.query(`UPDATE "meta" SET "feedbackUrl"=DEFAULT WHERE "feedbackUrl" IN ('https://git.joinsharkey.org/Sharkey/Sharkey/issues/new/choose','https://github.com/transfem-org/sharkey/issues/new','https://github.com/misskey-dev/misskey/issues/new','https://activitypub.software/TransFem-org/Sharkey/-/issues/new')`);
|
||||
}
|
||||
|
||||
async down(queryRunner) {
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "repositoryUrl" SET DEFAULT 'https://git.joinsharkey.org/Sharkey/Sharkey'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "feedbackUrl" SET DEFAULT 'https://git.joinsharkey.org/Sharkey/Sharkey/issues/new/choose'`);
|
||||
await queryRunner.query(`UPDATE "meta" SET "repositoryUrl"=DEFAULT WHERE "repositoryUrl" IN ('https://git.joinsharkey.org/Sharkey/Sharkey','https://github.com/transfem-org/sharkey','https://github.com/misskey-dev/misskey')`);
|
||||
await queryRunner.query(`UPDATE "meta" SET "feedbackUrl"=DEFAULT WHERE "feedbackUrl" IN ('https://git.joinsharkey.org/Sharkey/Sharkey/issues/new/choose','https://github.com/transfem-org/sharkey/issues/new','https://github.com/misskey-dev/misskey/issues/new')`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "repositoryUrl" SET DEFAULT 'https://activitypub.software/TransFem-org/Sharkey/'`);
|
||||
await queryRunner.query(`ALTER TABLE "meta" ALTER COLUMN "feedbackUrl" SET DEFAULT 'https://activitypub.software/TransFem-org/Sharkey/-/issues/new'`);
|
||||
await queryRunner.query(`UPDATE "meta" SET "repositoryUrl"=DEFAULT WHERE "repositoryUrl" IN ('https://git.leafus.net/pawkey/pawkey')`);
|
||||
await queryRunner.query(`UPDATE "meta" SET "feedbackUrl"=DEFAULT WHERE "feedbackUrl" IN ('https://git.leafus.net/pawkey/pawkey/-/issues/new')`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,26 +32,24 @@ const themeColor = chalk.hex('#86b300');
|
||||
|
||||
function greet() {
|
||||
if (!envOption.quiet) {
|
||||
//#region Misskey logo
|
||||
console.log(themeColor(' _____ _ _ '));
|
||||
console.log(themeColor('/ ___| | | | '));
|
||||
console.log(themeColor('\\ `--.| |__ __ _ _ __| | _____ _ _ '));
|
||||
console.log(themeColor(' `--. \\ \'_ \\ / _` | \'__| |/ / _ \\ | | |'));
|
||||
console.log(themeColor('/\\__/ / | | | (_| | | | < __/ |_| |'));
|
||||
console.log(themeColor('\\____/|_| |_|\\__,_|_| |_|\\_\\___|\\__, |'));
|
||||
console.log(themeColor(' __/ |'));
|
||||
console.log(themeColor(' |___/ '));
|
||||
//#region Pawkey logo
|
||||
console.log(themeColor(' ____ _ '));
|
||||
console.log(themeColor('| _ \\ __ ___ _| | _____ _ _ '));
|
||||
console.log(themeColor('| |_) / _` \\ \\ /\\ / / |/ / _ \\ | | |'));
|
||||
console.log(themeColor('| __/ (_| |\\ V V /| < __/ |_| |'));
|
||||
console.log(themeColor('|_| \\__,_| \\_/\\_/ |_|\\_\\___|\\__, |'));
|
||||
console.log(themeColor(' |___/ '));
|
||||
//#endregion
|
||||
|
||||
console.log(' Sharkey is an open-source decentralized microblogging platform.');
|
||||
console.log(chalk.rgb(255, 136, 0)(' If you like Sharkey, please donate to support development. https://opencollective.com/sharkey'));
|
||||
console.log(' Pawkey is an open-source decentralized microblogging platform.');
|
||||
console.log(chalk.rgb(255, 136, 0)(' If you like Pawkey, please donate to support development. https://leafus.net/donate'));
|
||||
|
||||
console.log('');
|
||||
console.log(chalkTemplate`--- ${os.hostname()} {gray (PID: ${process.pid.toString()})} ---`);
|
||||
}
|
||||
|
||||
bootLogger.info('Welcome to Sharkey!');
|
||||
bootLogger.info(`Sharkey v${meta.version}`, null, true);
|
||||
bootLogger.info('Welcome to Pawkey!');
|
||||
bootLogger.info(`Pawkey v${meta.version}`, null, true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -74,7 +72,7 @@ export async function masterMain() {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
bootLogger.info('Sharkey initialized');
|
||||
bootLogger.succ('Pawkey initialized');
|
||||
|
||||
if (config.sentryForBackend) {
|
||||
Sentry.init({
|
||||
@@ -91,7 +89,7 @@ export async function masterMain() {
|
||||
maxBreadcrumbs: 0,
|
||||
|
||||
// Set release version
|
||||
release: 'Sharkey@' + meta.version,
|
||||
release: 'Pawkey@' + meta.version,
|
||||
|
||||
...config.sentryForBackend.options,
|
||||
});
|
||||
|
||||
@@ -37,7 +37,7 @@ export async function workerMain() {
|
||||
maxBreadcrumbs: 0,
|
||||
|
||||
// Set release version
|
||||
release: "Sharkey@" + meta.version,
|
||||
release: "Pawkey@" + meta.version,
|
||||
|
||||
...config.sentryForBackend.options,
|
||||
});
|
||||
|
||||
@@ -579,7 +579,7 @@ const extension_context_definition = {
|
||||
firefish: 'https://joinfirefish.org/ns#',
|
||||
speakAsCat: 'firefish:speakAsCat',
|
||||
// Sharkey
|
||||
sharkey: 'https://joinsharkey.org/ns#',
|
||||
sharkey: 'https://leafus.net/pawkey',
|
||||
hideOnlineStatus: 'sharkey:hideOnlineStatus',
|
||||
backgroundUrl: 'sharkey:backgroundUrl',
|
||||
listenbrainz: 'sharkey:listenbrainz',
|
||||
|
||||
@@ -430,14 +430,14 @@ export class MiMeta {
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1024,
|
||||
default: 'https://activitypub.software/TransFem-org/Sharkey/',
|
||||
nullable: true,
|
||||
default: 'https://git.leafus.net/pawkey/pawkey/',
|
||||
nullable: false,
|
||||
})
|
||||
public repositoryUrl: string | null;
|
||||
|
||||
@Column('varchar', {
|
||||
length: 1024,
|
||||
default: 'https://activitypub.software/TransFem-org/Sharkey/-/issues/new',
|
||||
default: 'https://git.leafus.net/pawkey/pawkey/-/issues/new',
|
||||
nullable: true,
|
||||
})
|
||||
public feedbackUrl: string | null;
|
||||
|
||||
@@ -46,7 +46,7 @@ function generateModeratorInactivityMail(remainingTime: ModeratorInactivityRemai
|
||||
'To Moderators,',
|
||||
'',
|
||||
`No moderator has been active for a period of time. After further ${timeVariant} of inactivity, the instance will switch to invitation only.`,
|
||||
'If you do not wish that to happen, please log into Sharkey to update your last active date and time.',
|
||||
'If you do not wish that to happen, please log into Pawkey to update your last active date and time.',
|
||||
];
|
||||
|
||||
const html = message.join('<br>');
|
||||
|
||||
@@ -76,7 +76,7 @@ export class NodeinfoServerService {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const document: any = {
|
||||
software: {
|
||||
name: 'sharkey',
|
||||
name: 'pawkey',
|
||||
version: this.config.version,
|
||||
homepage: nodeinfo_homepage,
|
||||
repository: meta.repositoryUrl,
|
||||
|
||||
@@ -9,7 +9,7 @@ import { SponsorsService } from '@/core/SponsorsService.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['meta'],
|
||||
description: 'Get Sharkey Sponsors or Instance Sponsors',
|
||||
description: 'Get Pawkey Sponsors or Instance Sponsors',
|
||||
|
||||
requireCredential: false,
|
||||
requireCredentialPrivateMode: false,
|
||||
|
||||
@@ -40,10 +40,10 @@ export class ApiInstanceMastodon {
|
||||
const instance = data.data;
|
||||
const response: MastodonEntity.Instance = {
|
||||
uri: this.config.host,
|
||||
title: this.meta.name || 'Sharkey',
|
||||
description: this.meta.description || 'This is a vanilla Sharkey Instance. It doesn\'t seem to have a description.',
|
||||
title: this.meta.name || 'Pawkey',
|
||||
description: this.meta.description || 'This is a vanilla Pawkey Instance. It doesn\'t seem to have a description.',
|
||||
email: instance.email || '',
|
||||
version: `3.0.0 (compatible; Sharkey ${this.config.version}; like Akkoma)`,
|
||||
version: `3.0.0 (compatible; Pawkey ${this.config.version}; like Akkoma)`,
|
||||
urls: instance.urls,
|
||||
stats: {
|
||||
user_count: instance.stats.user_count,
|
||||
|
||||
66
packages/backend/src/server/api/mastodon/endpoints/meta.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: marie and other Pawkey contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
import { Entity } from 'megalodon';
|
||||
import { FILE_TYPE_BROWSERSAFE } from '@/const.js';
|
||||
import type { Config } from '@/config.js';
|
||||
import type { MiMeta } from '@/models/Meta.js';
|
||||
|
||||
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
|
||||
export async function getInstance(
|
||||
response: Entity.Instance,
|
||||
contact: Entity.Account,
|
||||
config: Config,
|
||||
meta: MiMeta,
|
||||
) {
|
||||
return {
|
||||
uri: config.url,
|
||||
title: meta.name || 'Pawkey',
|
||||
short_description: meta.description || 'This is a vanilla Pawkey Instance. It doesn\'t seem to have a description.',
|
||||
description: meta.description || 'This is a vanilla Pawkey Instance. It doesn\'t seem to have a description.',
|
||||
email: response.email || '',
|
||||
version: `3.0.0 (compatible; Pawkey ${config.version})`,
|
||||
urls: response.urls,
|
||||
stats: {
|
||||
user_count: response.stats.user_count,
|
||||
status_count: response.stats.status_count,
|
||||
domain_count: response.stats.domain_count,
|
||||
},
|
||||
thumbnail: meta.backgroundImageUrl || '/static-assets/transparent.png',
|
||||
languages: meta.langs,
|
||||
registrations: !meta.disableRegistration || response.registrations,
|
||||
approval_required: meta.approvalRequiredForSignup,
|
||||
invites_enabled: response.registrations,
|
||||
configuration: {
|
||||
accounts: {
|
||||
max_featured_tags: 20,
|
||||
},
|
||||
statuses: {
|
||||
max_characters: config.maxNoteLength,
|
||||
max_media_attachments: 16,
|
||||
characters_reserved_per_url: response.uri.length,
|
||||
},
|
||||
media_attachments: {
|
||||
supported_mime_types: FILE_TYPE_BROWSERSAFE,
|
||||
image_size_limit: 10485760,
|
||||
image_matrix_limit: 16777216,
|
||||
video_size_limit: 41943040,
|
||||
video_frame_rate_limit: 60,
|
||||
video_matrix_limit: 2304000,
|
||||
},
|
||||
polls: {
|
||||
max_options: 10,
|
||||
max_characters_per_option: 150,
|
||||
min_expiration: 50,
|
||||
max_expiration: 2629746,
|
||||
},
|
||||
reactions: {
|
||||
max_reactions: 1,
|
||||
},
|
||||
},
|
||||
contact_account: contact,
|
||||
rules: [],
|
||||
};
|
||||
}
|
||||
@@ -19,7 +19,7 @@ export function genOpenapiSpec(config: Config, includeSelfRef = false) {
|
||||
|
||||
externalDocs: {
|
||||
description: 'Repository',
|
||||
url: 'https://activitypub.software/TransFem-org/Sharkey',
|
||||
url: 'https://git.leafus.net/pawkey/pawkey',
|
||||
},
|
||||
|
||||
servers: [{
|
||||
@@ -97,7 +97,7 @@ export function genOpenapiSpec(config: Config, includeSelfRef = false) {
|
||||
description: desc,
|
||||
externalDocs: {
|
||||
description: 'Source code',
|
||||
url: `https://activitypub.software/TransFem-org/Sharkey/-/tree/develop/packages/backend/src/server/api/endpoints/${endpoint.name}.ts`,
|
||||
url: `https://git.leafus.net/pawkey/pawkey/-/tree/stable/packages/backend/src/server/api/endpoints/${endpoint.name}.ts`,
|
||||
},
|
||||
...(endpoint.meta.tags ? {
|
||||
tags: [endpoint.meta.tags[0]],
|
||||
|
||||
@@ -206,7 +206,7 @@ export class ClientServerService {
|
||||
@bindThis
|
||||
private async generateCommonPugData(meta: MiMeta) {
|
||||
return {
|
||||
instanceName: meta.name ?? 'Sharkey',
|
||||
instanceName: meta.name ?? 'Pawkey',
|
||||
icon: meta.iconUrl,
|
||||
appleTouchIcon: meta.app512IconUrl,
|
||||
themeColor: meta.themeColor,
|
||||
@@ -435,7 +435,7 @@ export class ClientServerService {
|
||||
|
||||
// OpenSearch XML
|
||||
fastify.get('/opensearch.xml', async (request, reply) => {
|
||||
const name = this.meta.name ?? 'Sharkey';
|
||||
const name = this.meta.name ?? 'Pawkey';
|
||||
let content = '';
|
||||
content += '<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/">';
|
||||
content += `<ShortName>${name}</ShortName>`;
|
||||
@@ -456,7 +456,7 @@ export class ClientServerService {
|
||||
return await reply.view('base', {
|
||||
img: this.meta.bannerUrl,
|
||||
url: this.config.url,
|
||||
title: this.meta.name ?? 'Sharkey',
|
||||
title: this.meta.name ?? 'Pawkey',
|
||||
desc: this.meta.description,
|
||||
customHead: this.config.customHtml.head,
|
||||
...await this.generateCommonPugData(this.meta),
|
||||
@@ -822,7 +822,7 @@ export class ClientServerService {
|
||||
|
||||
reply.header('Cache-Control', 'public, max-age=3600');
|
||||
return await reply.view('base-embed', {
|
||||
title: this.meta.name ?? 'Sharkey',
|
||||
title: this.meta.name ?? 'Pawkey',
|
||||
...await this.generateCommonPugData(this.meta),
|
||||
embedCtx: htmlSafeJsonStringify({
|
||||
user: _user,
|
||||
@@ -845,7 +845,7 @@ export class ClientServerService {
|
||||
|
||||
reply.header('Cache-Control', 'public, max-age=3600');
|
||||
return await reply.view('base-embed', {
|
||||
title: this.meta.name ?? 'Sharkey',
|
||||
title: this.meta.name ?? 'Pawkey',
|
||||
...await this.generateCommonPugData(this.meta),
|
||||
embedCtx: htmlSafeJsonStringify({
|
||||
note: _note,
|
||||
@@ -866,7 +866,7 @@ export class ClientServerService {
|
||||
|
||||
reply.header('Cache-Control', 'public, max-age=3600');
|
||||
return await reply.view('base-embed', {
|
||||
title: this.meta.name ?? 'Sharkey',
|
||||
title: this.meta.name ?? 'Pawkey',
|
||||
...await this.generateCommonPugData(this.meta),
|
||||
embedCtx: htmlSafeJsonStringify({
|
||||
clip: _clip,
|
||||
@@ -879,7 +879,7 @@ export class ClientServerService {
|
||||
|
||||
reply.header('Cache-Control', 'public, max-age=3600');
|
||||
return await reply.view('base-embed', {
|
||||
title: this.meta.name ?? 'Sharkey',
|
||||
title: this.meta.name ?? 'Pawkey',
|
||||
...await this.generateCommonPugData(this.meta),
|
||||
});
|
||||
});
|
||||
|
||||
@@ -62,7 +62,7 @@ export class FeedService {
|
||||
id: author.link,
|
||||
title: `${author.name} (@${user.username}@${this.config.host})`,
|
||||
updated: notes.length !== 0 ? this.idService.parse(notes[0].id).date : undefined,
|
||||
generator: 'Sharkey',
|
||||
generator: 'Pawkey',
|
||||
description: `${user.notesCount} Notes, ${profile.followingVisibility === 'public' ? user.followingCount : '?'} Following, ${profile.followersVisibility === 'public' ? user.followersCount : '?'} Followers${profile.description ? ` · ${profile.description}` : ''}`,
|
||||
link: author.link,
|
||||
image: (user.avatarId == null ? null : user.avatarUrl) ?? this.userEntityService.getIdenticonUrl(user),
|
||||
|
||||
@@ -106,18 +106,18 @@
|
||||
|
||||
const locale = JSON.parse(localStorage.getItem('locale') || '{}');
|
||||
|
||||
const title = locale?._bootErrors?.title || 'Failed to initialize Sharkey';
|
||||
const title = locale?._bootErrors?.title || 'Failed to initialize Pawkey';
|
||||
const reload = locale?.reload || 'Reload';
|
||||
|
||||
document.body.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /><path d="M12 9v4" /><path d="M12 16v.01" /></svg>
|
||||
<div class="message">${title}</div>
|
||||
<div class="submessage">Failed to initialize Sharkey</div>
|
||||
<div class="message">読み込みに失敗しました</div>
|
||||
<div class="submessage">Failed to initialize Pawkey</div>
|
||||
<div class="submessage">Error Code: ${code}</div>
|
||||
<button onclick="location.reload(!0)">
|
||||
<div>${reload}</div>
|
||||
</button>`;
|
||||
addStyle(`
|
||||
#sharkey_app,
|
||||
#pawkey_app,
|
||||
#splash {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
|
||||
//#region Theme
|
||||
const theme = localStorage.getItem('theme');
|
||||
const themeFontFaceName = 'sharkey-theme-font-face';
|
||||
const themeFontFaceName = 'pawkey-theme-font-face';
|
||||
if (theme) {
|
||||
let existingFontFace;
|
||||
document.fonts.forEach((v) => { if (v.family === themeFontFaceName) existingFontFace = v;});
|
||||
@@ -164,7 +164,7 @@
|
||||
const locale = JSON.parse(localStorage.getItem('locale') || '{}');
|
||||
|
||||
const messages = Object.assign({
|
||||
title: 'Failed to initialize Sharkey',
|
||||
title: 'Failed to initialize Pawkey',
|
||||
solution: 'The following actions may solve the problem.',
|
||||
solution1: 'Update your os and browser',
|
||||
solution2: 'Disable an adblocker',
|
||||
@@ -234,7 +234,7 @@
|
||||
font-family: BIZ UDGothic, Roboto, HelveticaNeue, Arial, sans-serif;
|
||||
}
|
||||
|
||||
#sharkey_app,
|
||||
#pawkey_app,
|
||||
#splash {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
font-family: BIZ UDGothic, Roboto, HelveticaNeue, Arial, sans-serif;
|
||||
}
|
||||
|
||||
#sharkey_app,
|
||||
#pawkey_app,
|
||||
#splash {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
const locale = JSON.parse(localStorage.getItem('locale') || '{}');
|
||||
|
||||
const messages = Object.assign({
|
||||
title: 'Failed to initialize Sharkey',
|
||||
title: 'Failed to initialize Pawkey',
|
||||
serverError: 'If reloading after a period of time does not resolve the problem, contact the server administrator with the following ERROR ID.',
|
||||
solution: 'The following actions may solve the problem.',
|
||||
solution1: 'Update your os and browser',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"short_name": "Sharkey",
|
||||
"name": "Sharkey",
|
||||
"short_name": "Pawkey",
|
||||
"name": "Pawkey",
|
||||
"start_url": "/",
|
||||
"display": "standalone",
|
||||
"background_color": "#313a42",
|
||||
|
||||
@@ -9,11 +9,11 @@ html(class='embed')
|
||||
|
||||
head
|
||||
meta(charset='utf-8')
|
||||
meta(name='application-name' content='Sharkey')
|
||||
meta(name='application-name' content='Pawkey')
|
||||
meta(name='referrer' content='origin')
|
||||
meta(name='theme-color' content= themeColor || '#86b300')
|
||||
meta(name='theme-color-orig' content= themeColor || '#86b300')
|
||||
meta(property='og:site_name' content= instanceName || 'Sharkey')
|
||||
meta(property='og:site_name' content= instanceName || 'Pawkey')
|
||||
meta(property='instance_url' content= instanceUrl)
|
||||
meta(name='viewport' content='width=device-width, initial-scale=1')
|
||||
meta(name='format-detection' content='telephone=no,date=no,address=no,email=no,url=no')
|
||||
@@ -32,7 +32,7 @@ html(class='embed')
|
||||
|
||||
title
|
||||
block title
|
||||
= title || 'Sharkey'
|
||||
= title || 'Pawkey'
|
||||
|
||||
block meta
|
||||
meta(name='robots' content='noindex')
|
||||
|
||||
@@ -8,36 +8,32 @@ doctype html
|
||||
|
||||
//
|
||||
-
|
||||
_____ _ _
|
||||
/ ___| | | |
|
||||
\ `--.| |__ __ _ _ __| | _____ _ _
|
||||
`--. \ '_ \ / _` | '__| |/ / _ \ | | |
|
||||
/\__/ / | | | (_| | | | < __/ |_| |
|
||||
\____/|_| |_|\__,_|_| |_|\_\___|\__, |
|
||||
__/ |
|
||||
|___/
|
||||
|
||||
Thank you for using Sharkey!
|
||||
If you are reading this message... how about joining the development?
|
||||
https://activitypub.software/TransFem-org/Sharkey
|
||||
____ _
|
||||
| _ \ __ ___ _| | _____ _ _
|
||||
| |_) / _` \ \ /\ / / |/ / _ \ | | |
|
||||
| __/ (_| |\ V V /| < __/ |_| |
|
||||
|_| \__,_| \_/\_/ |_|\_\___|\__, |
|
||||
|___/
|
||||
|
||||
Thank you for using Pawkey!
|
||||
If you are reading this message... You like gay femboy furries >:3
|
||||
|
||||
html
|
||||
|
||||
head
|
||||
meta(charset='utf-8')
|
||||
meta(name='application-name' content='Sharkey')
|
||||
meta(name='application-name' content='Pawkey')
|
||||
meta(name='referrer' content='origin')
|
||||
meta(name='theme-color' content= themeColor || '#86b300')
|
||||
meta(name='theme-color-orig' content= themeColor || '#86b300')
|
||||
meta(property='og:site_name' content= instanceName || 'Sharkey')
|
||||
meta(property='og:site_name' content= instanceName || 'Pawkey')
|
||||
meta(property='instance_url' content= instanceUrl)
|
||||
meta(name='viewport' content='width=device-width, initial-scale=1')
|
||||
meta(name='format-detection' content='telephone=no,date=no,address=no,email=no,url=no')
|
||||
link(rel='icon' href= icon || '/favicon.ico')
|
||||
link(rel='apple-touch-icon' href= appleTouchIcon || '/apple-touch-icon.png')
|
||||
link(rel='manifest' href='/manifest.json')
|
||||
link(rel='search' type='application/opensearchdescription+xml' title=(title || "Sharkey") href=`${baseUrl}/opensearch.xml`)
|
||||
link(rel='search' type='application/opensearchdescription+xml' title=(title || "Pawkey") href=`${baseUrl}/opensearch.xml`)
|
||||
link(rel='prefetch' href=serverErrorImageUrl)
|
||||
link(rel='prefetch' href=infoImageUrl)
|
||||
link(rel='prefetch' href=notFoundImageUrl)
|
||||
@@ -56,7 +52,7 @@ html
|
||||
|
||||
title
|
||||
block title
|
||||
= title || 'Sharkey'
|
||||
= title || 'Pawkey'
|
||||
|
||||
if noindex
|
||||
meta(name='robots' content='noindex')
|
||||
@@ -67,7 +63,7 @@ html
|
||||
block meta
|
||||
|
||||
block og
|
||||
meta(property='og:title' content= title || 'Sharkey')
|
||||
meta(property='og:title' content= title || 'Pawkey')
|
||||
meta(property='og:description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨')
|
||||
meta(property='og:image' content= img)
|
||||
meta(property='twitter:card' content='summary')
|
||||
|
||||
@@ -4,8 +4,8 @@ html
|
||||
|
||||
head
|
||||
meta(charset='utf-8')
|
||||
meta(name='application-name' content='Sharkey')
|
||||
title Sharkey Repair Tool
|
||||
meta(name='application-name' content='Pawkey')
|
||||
title Pawkey Repair Tool
|
||||
style
|
||||
include ../bios.css
|
||||
script
|
||||
@@ -13,7 +13,7 @@ html
|
||||
|
||||
body
|
||||
header
|
||||
h1 Sharkey Repair Tool #{version}
|
||||
h1 Pawkey Repair Tool #{version}
|
||||
main
|
||||
div.tabs
|
||||
button#ls edit local storage
|
||||
|
||||
@@ -4,8 +4,8 @@ html
|
||||
|
||||
head
|
||||
meta(charset='utf-8')
|
||||
meta(name='application-name' content='Sharkey')
|
||||
title Sharkey Cli
|
||||
meta(name='application-name' content='Pawkey')
|
||||
title Pawkey Cli
|
||||
style
|
||||
include ../cli.css
|
||||
script
|
||||
@@ -13,7 +13,7 @@ html
|
||||
|
||||
body
|
||||
header
|
||||
h1 Sharkey Cli #{version}
|
||||
h1 Pawkey Cli #{version}
|
||||
main
|
||||
div#form
|
||||
textarea#text
|
||||
|
||||
@@ -2,18 +2,14 @@ doctype html
|
||||
|
||||
//
|
||||
-
|
||||
_____ _ _
|
||||
/ ___| | | |
|
||||
\ `--.| |__ __ _ _ __| | _____ _ _
|
||||
`--. \ '_ \ / _` | '__| |/ / _ \ | | |
|
||||
/\__/ / | | | (_| | | | < __/ |_| |
|
||||
\____/|_| |_|\__,_|_| |_|\_\___|\__, |
|
||||
__/ |
|
||||
|___/
|
||||
____ _
|
||||
| _ \ __ ___ _| | _____ _ _
|
||||
| |_) / _` \ \ /\ / / |/ / _ \ | | |
|
||||
| __/ (_| |\ V V /| < __/ |_| |
|
||||
|_| \__,_| \_/\_/ |_|\_\___|\__, |
|
||||
|___/
|
||||
|
||||
Thank you for using Sharkey!
|
||||
If you are reading this message... how about joining the development?
|
||||
https://activitypub.software/TransFem-org/Sharkey
|
||||
Thank you for using Pawkey!
|
||||
|
||||
|
||||
html
|
||||
@@ -21,12 +17,12 @@ html
|
||||
head
|
||||
meta(charset='utf-8')
|
||||
meta(name='viewport' content='width=device-width, initial-scale=1')
|
||||
meta(name='application-name' content='Sharkey')
|
||||
meta(name='application-name' content='Pawkey')
|
||||
meta(name='referrer' content='origin')
|
||||
|
||||
title
|
||||
block title
|
||||
= 'An error has occurred... | Sharkey'
|
||||
= 'An error has occurred... | Pawkey'
|
||||
|
||||
style
|
||||
include ../error.css
|
||||
@@ -40,7 +36,7 @@ body
|
||||
path(d="M12 9v2m0 4v.01")
|
||||
path(d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75")
|
||||
|
||||
h1(data-i18n="title") Failed to initialize Sharkey
|
||||
h1(data-i18n="title") Failed to initialize Pawkey
|
||||
|
||||
button.button-big(onclick="location.reload();")
|
||||
span.button-label-big(data-i18n-reload) Reload
|
||||
|
||||
@@ -4,7 +4,7 @@ html
|
||||
#msg
|
||||
script.
|
||||
const msg = document.getElementById('msg');
|
||||
const successText = `\nSuccess Flush! <a href="/">Back to Sharkey</a>\n成功しました。<a href="/">Sharkeyを開き直してください。</a>`;
|
||||
const successText = `\nSuccess Flush! <a href="/">Back to Pawkey</a>\n成功しました。<a href="/">Pawkeyを開き直してください。</a>`;
|
||||
|
||||
message('Start flushing.');
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ html
|
||||
|
||||
head
|
||||
meta(charset='utf-8')
|
||||
meta(name='application-name' content='Sharkey')
|
||||
meta(name='application-name' content='Pawkey')
|
||||
title= meta.name || host
|
||||
style.
|
||||
html, body {
|
||||
|
||||
@@ -23,7 +23,7 @@ import { i18n, updateI18n } from '@/i18n.js';
|
||||
|
||||
import type { Theme } from '@/theme.js';
|
||||
|
||||
console.log('Sharkey Embed');
|
||||
console.log('Pawkey Embed');
|
||||
|
||||
//#region Embedパラメータの取得・パース
|
||||
const params = new URLSearchParams(location.search);
|
||||
@@ -117,7 +117,7 @@ app.provide(DI.embedParams, embedParams);
|
||||
// https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210
|
||||
// なぜか2回実行されることがあるため、mountするdivを1つに制限する
|
||||
const rootEl = ((): HTMLElement => {
|
||||
const MISSKEY_MOUNT_DIV_ID = 'sharkey_app';
|
||||
const MISSKEY_MOUNT_DIV_ID = 'pawkey_app';
|
||||
|
||||
const currentRoot = document.getElementById(MISSKEY_MOUNT_DIV_ID);
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ html, body {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
#sharkey_app {
|
||||
#pawkey_app {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
|
||||
BIN
packages/frontend/assets/icon.png
Normal file
|
After Width: | Height: | Size: 223 KiB |
BIN
packages/frontend/assets/pawkey.png
Normal file
|
After Width: | Height: | Size: 418 KiB |
@@ -28,8 +28,8 @@ import { fetchCustomEmojis } from '@/custom-emojis.js';
|
||||
import { prefer } from '@/preferences.js';
|
||||
import { $i } from '@/i.js';
|
||||
|
||||
export async function common(createVue: () => Promise<App<Element>>) {
|
||||
console.info(`Sharkey v${version}`);
|
||||
export async function common(createVue: () => App<Element>) {
|
||||
console.info(`Pawkey v${version}`);
|
||||
|
||||
if (_DEV_) {
|
||||
console.warn('Development mode!!!');
|
||||
@@ -267,7 +267,7 @@ export async function common(createVue: () => Promise<App<Element>>) {
|
||||
// https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210
|
||||
// なぜか2回実行されることがあるため、mountするdivを1つに制限する
|
||||
const rootEl = ((): HTMLElement => {
|
||||
const MISSKEY_MOUNT_DIV_ID = 'sharkey_app';
|
||||
const MISSKEY_MOUNT_DIV_ID = 'pawkey_app';
|
||||
|
||||
const currentRoot = window.document.getElementById(MISSKEY_MOUNT_DIV_ID);
|
||||
|
||||
|
||||
@@ -335,7 +335,7 @@ export async function mainBoot() {
|
||||
}
|
||||
|
||||
const modifiedVersionMustProminentlyOfferInAgplV3Section13Read = miLocalStorage.getItem('modifiedVersionMustProminentlyOfferInAgplV3Section13Read');
|
||||
if (modifiedVersionMustProminentlyOfferInAgplV3Section13Read !== 'true' && instance.repositoryUrl !== 'https://activitypub.software/TransFem-org/Sharkey/') {
|
||||
if (modifiedVersionMustProminentlyOfferInAgplV3Section13Read !== 'true' && instance.repositoryUrl !== 'https://git.leafus.net/pawkey/pawkey') {
|
||||
const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkSourceCodeAvailablePopup.vue')), {}, {
|
||||
closed: () => dispose(),
|
||||
});
|
||||
|
||||
@@ -47,7 +47,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<template #label>{{ i18n.ts.basicNotesBeforeCreateAccount }}</template>
|
||||
<template #suffix><i v-if="agreeNote" class="ti ti-check" style="color: var(--MI_THEME-success)"></i></template>
|
||||
|
||||
<a href="https://activitypub.software/TransFem-org/Sharkey/-/blob/stable/IMPORTANT_NOTES.md" class="_link" target="_blank">{{ i18n.ts.basicNotesBeforeCreateAccount }} <i class="ti ti-external-link"></i></a>
|
||||
<a href="https://git.leafus.net/pawkey/pawkey/-/blob/stable/IMPORTANT_NOTES.md" class="_link" target="_blank">{{ i18n.ts.basicNotesBeforeCreateAccount }} <i class="ti ti-external-link"></i></a>
|
||||
|
||||
<MkSwitch :modelValue="agreeNote" style="margin-top: 16px;" data-cy-signup-rules-notes-agree @update:modelValue="updateAgreeNote">{{ i18n.ts.agree }}</MkSwitch>
|
||||
</MkFolder>
|
||||
|
||||
@@ -27,7 +27,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
</I18n>
|
||||
<I18n :src="i18n.ts.correspondingSourceIsAvailable" tag="span">
|
||||
<template #anchor>
|
||||
<MkA to="/about-sharkey" class="_link">{{ i18n.ts.aboutMisskey }}</MkA>
|
||||
<MkA to="/about-pawkey" class="_link">{{ i18n.ts.aboutMisskey }}</MkA>
|
||||
</template>
|
||||
</I18n>
|
||||
</div>
|
||||
|
||||
@@ -67,7 +67,7 @@ const exampleNote = reactive<Misskey.entities.Note>({
|
||||
onlineStatus: 'unknown',
|
||||
badgeRoles: [],
|
||||
},
|
||||
text: 'just setting up my shonk',
|
||||
text: 'getting a pawjob rn',
|
||||
cw: null,
|
||||
visibility: 'public',
|
||||
localOnly: false,
|
||||
|
||||
@@ -27,7 +27,7 @@ const modal = useTemplateRef('modal');
|
||||
|
||||
const whatIsNew = () => {
|
||||
modal.value?.close();
|
||||
window.open(`https://activitypub.software/TransFem-org/Sharkey/-/releases/${version}`, '_blank');
|
||||
window.open(`https://git.leafus.net/pawkey/pawkey/-/releases/${version}`, '_blank');
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
@@ -11,8 +11,8 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<div class="_gaps_m znqjceqz">
|
||||
<div v-panel class="about">
|
||||
<div ref="containerEl" class="container" :class="{ playing: easterEggEngine != null }">
|
||||
<img src="/client-assets/about-icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/>
|
||||
<div class="misskey">Sharkey</div>
|
||||
<img src="/client-assets/icon.png" alt="" class="icon" draggable="false" @load="iconLoaded" @click="gravity"/>
|
||||
<div class="misskey">Pawkey</div>
|
||||
<div class="version">v{{ version }}</div>
|
||||
<span v-for="emoji in easterEggEmojis" :key="emoji.id" class="emoji" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }">
|
||||
<MkCustomEmoji v-if="emoji.emoji[0] === ':'" class="emoji" :name="emoji.emoji" :normal="true" :noStyle="true" :fallbackToImage="true"/>
|
||||
@@ -22,16 +22,13 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<button v-if="thereIsTreasure" class="_button treasure" @click="getTreasure"><img src="/fluent-emoji/1f3c6.png" class="treasureImg"></button>
|
||||
</div>
|
||||
<div style="text-align: center;">
|
||||
{{ i18n.ts._aboutMisskey.about }}<br><a href="https://joinsharkey.org/" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
|
||||
{{ i18n.ts._aboutMisskey.about }}<br><a href="https://leafus.net/pawkey" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
|
||||
</div>
|
||||
<div v-if="$i != null" style="text-align: center;">
|
||||
<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Sharkey</MkButton>
|
||||
<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Pawkey</MkButton>
|
||||
</div>
|
||||
<FormSection v-if="instance.repositoryUrl !== 'https://activitypub.software/TransFem-org/Sharkey/'">
|
||||
<FormSection v-if="instance.repositoryUrl !== 'https://git.leafus.net/pawkey/pawkey'">
|
||||
<div class="_gaps_s">
|
||||
<MkInfo>
|
||||
{{ i18n.tsx._aboutMisskey.thisIsModifiedVersion({ name: instance.name ?? '' }) }}
|
||||
</MkInfo>
|
||||
<FormLink v-if="instance.repositoryUrl" :to="instance.repositoryUrl" external>
|
||||
<template #icon><i class="ti ti-code"></i></template>
|
||||
{{ i18n.ts._aboutMisskey.source }}
|
||||
@@ -48,16 +45,11 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
</FormSection>
|
||||
<FormSection>
|
||||
<div class="_gaps_s">
|
||||
<FormLink to="https://activitypub.software/TransFem-org/Sharkey/" external>
|
||||
<FormLink to="https://git.leafus.net/pawkey/pawkey" external>
|
||||
<template #icon><i class="ph-code ph-bold ph-lg"></i></template>
|
||||
{{ i18n.ts._aboutMisskey.source }} ({{ i18n.ts._aboutMisskey.original_sharkey }})
|
||||
{{ i18n.ts._aboutMisskey.source }} ({{ i18n.ts._aboutMisskey.original_pawkey }})
|
||||
<template #suffix>GitLab</template>
|
||||
</FormLink>
|
||||
<FormLink to="https://opencollective.com/sharkey" external>
|
||||
<template #icon><i class="ph-piggy-bank ph-bold ph-lg"></i></template>
|
||||
{{ i18n.ts._aboutMisskey.donate_sharkey }}
|
||||
<template #suffix>OpenCollective</template>
|
||||
</FormLink>
|
||||
</div>
|
||||
</FormSection>
|
||||
<FormSection>
|
||||
@@ -133,7 +125,17 @@ const easterEggEmojis = ref<{
|
||||
const easterEggEngine = ref<{ stop: () => void } | null>(null);
|
||||
const everyone = ref<Section[]>([
|
||||
{
|
||||
heading: i18n.ts._aboutMisskey.projectMembers,
|
||||
heading: 'Pawkey Creators',
|
||||
people: fisher_yates([
|
||||
{
|
||||
handle: '@Leafus',
|
||||
avatar: 'https://git.leafus.net/uploads/-/system/user/avatar/2/avatar.png?width=192',
|
||||
link: 'https://leafus.net',
|
||||
},
|
||||
]),
|
||||
},
|
||||
{
|
||||
heading: 'Sharkey Contributors',
|
||||
link: {
|
||||
label: i18n.ts._aboutMisskey.allContributors,
|
||||
url: 'https://activitypub.software/TransFem-org/Sharkey/-/graphs/develop',
|
||||
@@ -182,7 +184,7 @@ const everyone = ref<Section[]>([
|
||||
]),
|
||||
},
|
||||
{
|
||||
heading: i18n.ts._aboutMisskey.testers,
|
||||
heading: 'Sharkey Testers',
|
||||
people: [
|
||||
{
|
||||
handle: '@lucent',
|
||||
@@ -322,7 +324,7 @@ function gravity() {
|
||||
|
||||
function iLoveMisskey() {
|
||||
os.post({
|
||||
initialText: 'I $[jelly ❤] #Sharkey',
|
||||
initialText: 'I $[jelly ❤] #Pawkey',
|
||||
instant: true,
|
||||
});
|
||||
}
|
||||
@@ -22,13 +22,12 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<FormSection>
|
||||
<div class="_gaps_m">
|
||||
<MkKeyValue :copy="version">
|
||||
<!-- TODO translate -->
|
||||
<template #key>Sharkey</template>
|
||||
<template #key>Pawkey</template>
|
||||
<template #value>{{ version }}</template>
|
||||
</MkKeyValue>
|
||||
<div v-html="i18n.tsx.poweredByMisskeyDescription({ name: instance.name ?? host })">
|
||||
</div>
|
||||
<FormLink to="/about-sharkey">
|
||||
<FormLink to="/about-pawkey">
|
||||
<template #icon><i class="ti ti-info-circle"></i></template>
|
||||
{{ i18n.ts.aboutMisskey }}
|
||||
</FormLink>
|
||||
|
||||
623
packages/frontend/src/pages/settings/general.vue
Normal file
@@ -0,0 +1,623 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
SPDX-License-Identifier: AGPL-3.0-only
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="_gaps_m">
|
||||
<MkSelect v-model="lang">
|
||||
<template #label>{{ i18n.ts.uiLanguage }}</template>
|
||||
<option v-for="x in langs" :key="x[0]" :value="x[0]">{{ x[1] }}</option>
|
||||
<template #caption>
|
||||
<I18n :src="i18n.ts.i18nInfo" tag="span">
|
||||
<template #link>
|
||||
<MkLink url="https://crowdin.com/project/misskey">Crowdin</MkLink>
|
||||
</template>
|
||||
</I18n>
|
||||
</template>
|
||||
</MkSelect>
|
||||
|
||||
<MkRadios v-model="overridedDeviceKind">
|
||||
<template #label>{{ i18n.ts.overridedDeviceKind }}</template>
|
||||
<option :value="null">{{ i18n.ts.auto }}</option>
|
||||
<option value="smartphone"><i class="ti ti-device-mobile"/> {{ i18n.ts.smartphone }}</option>
|
||||
<option value="tablet"><i class="ti ti-device-tablet"/> {{ i18n.ts.tablet }}</option>
|
||||
<option value="desktop"><i class="ti ti-device-desktop"/> {{ i18n.ts.desktop }}</option>
|
||||
</MkRadios>
|
||||
|
||||
<FormSection>
|
||||
<div class="_gaps_s">
|
||||
<MkSwitch v-model="showFixedPostForm">{{ i18n.ts.showFixedPostForm }}</MkSwitch>
|
||||
<MkSwitch v-model="showFixedPostFormInChannel">{{ i18n.ts.showFixedPostFormInChannel }}</MkSwitch>
|
||||
<MkFolder>
|
||||
<template #label>{{ i18n.ts.pinnedList }}</template>
|
||||
<!-- 複数ピン止め管理できるようにしたいけどめんどいので一旦ひとつのみ -->
|
||||
<MkButton v-if="defaultStore.reactiveState.pinnedUserLists.value.length === 0" @click="setPinnedList()">{{ i18n.ts.add }}</MkButton>
|
||||
<MkButton v-else danger @click="removePinnedList()"><i class="ti ti-trash"></i> {{ i18n.ts.remove }}</MkButton>
|
||||
</MkFolder>
|
||||
</div>
|
||||
</FormSection>
|
||||
|
||||
<FormSection>
|
||||
<template #label>{{ i18n.ts.displayOfNote }}</template>
|
||||
|
||||
<div class="_gaps_m">
|
||||
<div class="_gaps_s">
|
||||
<MkSwitch v-model="collapseRenotes">
|
||||
<template #label>{{ i18n.ts.collapseRenotes }}</template>
|
||||
<template #caption>{{ i18n.ts.collapseRenotesDescription }}</template>
|
||||
</MkSwitch>
|
||||
<MkSwitch v-model="collapseNotesRepliedTo">{{ i18n.ts.collapseNotesRepliedTo }}</MkSwitch>
|
||||
<MkSwitch v-model="collapseFiles">{{ i18n.ts.collapseFiles }}</MkSwitch>
|
||||
<MkSwitch v-model="uncollapseCW">{{ i18n.ts.uncollapseCW }}</MkSwitch>
|
||||
<MkSwitch v-model="expandLongNote">{{ i18n.ts.expandLongNote }}</MkSwitch>
|
||||
<MkSwitch v-model="showNoteActionsOnlyHover">{{ i18n.ts.showNoteActionsOnlyHover }}</MkSwitch>
|
||||
<MkSwitch v-model="showClipButtonInNoteFooter">{{ i18n.ts.showClipButtonInNoteFooter }}</MkSwitch>
|
||||
<MkSwitch v-model="autoloadConversation">{{ i18n.ts.autoloadConversation }}</MkSwitch>
|
||||
<MkSwitch v-model="advancedMfm">{{ i18n.ts.enableAdvancedMfm }}</MkSwitch>
|
||||
<MkSwitch v-if="advancedMfm" v-model="animatedMfm">{{ i18n.ts.enableAnimatedMfm }}</MkSwitch>
|
||||
<MkSwitch v-if="advancedMfm" v-model="enableQuickAddMfmFunction">{{ i18n.ts.enableQuickAddMfmFunction }}</MkSwitch>
|
||||
<MkSwitch v-model="showReactionsCount">{{ i18n.ts.showReactionsCount }}</MkSwitch>
|
||||
<MkSwitch v-model="showGapBetweenNotesInTimeline">{{ i18n.ts.showGapBetweenNotesInTimeline }}</MkSwitch>
|
||||
<MkSwitch v-model="loadRawImages">{{ i18n.ts.loadRawImages }}</MkSwitch>
|
||||
<MkSwitch v-model="showTickerOnReplies">{{ i18n.ts.showTickerOnReplies }}</MkSwitch>
|
||||
<MkSwitch v-model="disableCatSpeak">{{ i18n.ts.disableCatSpeak }}</MkSwitch>
|
||||
<MkSelect v-model="searchEngine" placeholder="Other">
|
||||
<template #label>{{ i18n.ts.searchEngine }}</template>
|
||||
<option
|
||||
v-for="[key, value] in Object.entries(searchEngineMap)" :key="key" :value="key"
|
||||
>
|
||||
{{ value }}
|
||||
</option>
|
||||
<!-- If the user is on Other and enters a domain add this one so that the dropdown doesnt go blank -->
|
||||
<option v-if="useCustomSearchEngine" :value="searchEngine">
|
||||
{{ i18n.ts.searchEngineOther }}
|
||||
</option>
|
||||
<!-- If one of the other options is selected show this as a blank other -->
|
||||
<option v-if="!useCustomSearchEngine" value="">{{ i18n.ts.searchEngineOther }}</option>
|
||||
</MkSelect>
|
||||
|
||||
<div v-if="useCustomSearchEngine">
|
||||
<MkInput v-model="searchEngine" :max="300" :manualSave="true">
|
||||
<template #label>{{ i18n.ts.searchEngineCusomURI }}</template>
|
||||
<template #caption>{{ i18n.ts.searchEngineCustomURIDescription }}</template>
|
||||
</MkInput>
|
||||
</div>
|
||||
|
||||
<MkRadios v-model="reactionsDisplaySize">
|
||||
<template #label>{{ i18n.ts.reactionsDisplaySize }}</template>
|
||||
<option value="small">{{ i18n.ts.small }}</option>
|
||||
<option value="medium">{{ i18n.ts.medium }}</option>
|
||||
<option value="large">{{ i18n.ts.large }}</option>
|
||||
</MkRadios>
|
||||
<MkRadios v-model="noteDesign">
|
||||
<template #label>Note Design</template>
|
||||
<option value="sharkey"><i class="ph-paw-print ph-bold ph-lg" style="top: 2px;position: relative;"></i> Pawkey</option>
|
||||
<option value="misskey"><i class="sk-icons sk-misskey sk-icons-lg" style="top: 2px;position: relative;"></i> Misskey</option>
|
||||
</MkRadios>
|
||||
<MkSwitch v-model="limitWidthOfReaction">{{ i18n.ts.limitWidthOfReaction }}</MkSwitch>
|
||||
</div>
|
||||
|
||||
<MkSelect v-if="instance.federation !== 'none'" v-model="instanceTicker">
|
||||
<template #label>{{ i18n.ts.instanceTicker }}</template>
|
||||
<option value="none">{{ i18n.ts._instanceTicker.none }}</option>
|
||||
<option value="remote">{{ i18n.ts._instanceTicker.remote }}</option>
|
||||
<option value="always">{{ i18n.ts._instanceTicker.always }}</option>
|
||||
</MkSelect>
|
||||
|
||||
<MkSelect v-model="nsfw">
|
||||
<template #label>{{ i18n.ts.displayOfSensitiveMedia }}</template>
|
||||
<option value="respect">{{ i18n.ts._displayOfSensitiveMedia.respect }}</option>
|
||||
<option value="ignore">{{ i18n.ts._displayOfSensitiveMedia.ignore }}</option>
|
||||
<option value="force">{{ i18n.ts._displayOfSensitiveMedia.force }}</option>
|
||||
</MkSelect>
|
||||
|
||||
<MkRadios v-model="mediaListWithOneImageAppearance">
|
||||
<template #label>{{ i18n.ts.mediaListWithOneImageAppearance }}</template>
|
||||
<option value="expand">{{ i18n.ts.default }}</option>
|
||||
<option value="16_9">{{ i18n.tsx.limitTo({ x: '16:9' }) }}</option>
|
||||
<option value="1_1">{{ i18n.tsx.limitTo({ x: '1:1' }) }}</option>
|
||||
<option value="2_3">{{ i18n.tsx.limitTo({ x: '2:3' }) }}</option>
|
||||
</MkRadios>
|
||||
|
||||
<MkRange v-model="numberOfReplies" :min="2" :max="20" :step="1" easing>
|
||||
<template #label>{{ i18n.ts.numberOfReplies }}</template>
|
||||
<template #caption>{{ i18n.ts.numberOfRepliesDescription }}</template>
|
||||
</MkRange>
|
||||
</div>
|
||||
</FormSection>
|
||||
|
||||
<FormSection>
|
||||
<template #label>{{ i18n.ts.notificationDisplay }}</template>
|
||||
|
||||
<div class="_gaps_m">
|
||||
<MkSwitch v-model="useGroupedNotifications">{{ i18n.ts.useGroupedNotifications }}</MkSwitch>
|
||||
|
||||
<MkSwitch v-model="enableFaviconNotificationDot">
|
||||
{{ i18n.ts.enableFaviconNotificationDot }}
|
||||
<template #caption>
|
||||
<I18n :src="i18n.ts.notificationDotNotWorkingAdvice" tag="span">
|
||||
<template #link>
|
||||
<MkLink url="https://docs.joinsharkey.org/docs/install/faqs/#ive-enabled-the-notification-dot-but-it-doesnt-show">{{ i18n.ts._mfm.link }}</MkLink>
|
||||
</template>
|
||||
</I18n>
|
||||
</template>
|
||||
</MkSwitch>
|
||||
|
||||
<MkButton @click="testNotificationDot">{{ i18n.ts.verifyNotificationDotWorkingButton }}</MkButton>
|
||||
<MkRadios v-model="notificationPosition">
|
||||
<template #label>{{ i18n.ts.position }}</template>
|
||||
<option value="leftTop"><i class="ti ti-align-box-left-top"></i> {{ i18n.ts.leftTop }}</option>
|
||||
<option value="rightTop"><i class="ti ti-align-box-right-top"></i> {{ i18n.ts.rightTop }}</option>
|
||||
<option value="leftBottom"><i class="ti ti-align-box-left-bottom"></i> {{ i18n.ts.leftBottom }}</option>
|
||||
<option value="rightBottom"><i class="ti ti-align-box-right-bottom"></i> {{ i18n.ts.rightBottom }}</option>
|
||||
</MkRadios>
|
||||
|
||||
<MkRadios v-model="notificationStackAxis">
|
||||
<template #label>{{ i18n.ts.stackAxis }}</template>
|
||||
<option value="vertical"><i class="ti ti-carousel-vertical"></i> {{ i18n.ts.vertical }}</option>
|
||||
<option value="horizontal"><i class="ti ti-carousel-horizontal"></i> {{ i18n.ts.horizontal }}</option>
|
||||
</MkRadios>
|
||||
|
||||
<MkSwitch v-model="notificationClickable">{{ i18n.ts.allowClickingNotifications }}</MkSwitch>
|
||||
|
||||
<MkButton @click="testNotification">{{ i18n.ts._notification.checkNotificationBehavior }}</MkButton>
|
||||
</div>
|
||||
</FormSection>
|
||||
|
||||
<FormSection>
|
||||
<template #label>{{ i18n.ts.appearance }}</template>
|
||||
|
||||
<div class="_gaps_m">
|
||||
<div class="_gaps_s">
|
||||
<MkSwitch v-model="reduceAnimation">{{ i18n.ts.reduceUiAnimation }}</MkSwitch>
|
||||
<MkSwitch v-model="useBlurEffect">{{ i18n.ts.useBlurEffect }}</MkSwitch>
|
||||
<MkSwitch v-model="useBlurEffectForModal">{{ i18n.ts.useBlurEffectForModal }}</MkSwitch>
|
||||
<MkSwitch v-model="disableShowingAnimatedImages">{{ i18n.ts.disableShowingAnimatedImages }}</MkSwitch>
|
||||
<MkSwitch v-model="highlightSensitiveMedia">{{ i18n.ts.highlightSensitiveMedia }}</MkSwitch>
|
||||
<MkSwitch v-model="squareAvatars">{{ i18n.ts.squareAvatars }}</MkSwitch>
|
||||
<MkSwitch v-model="showAvatarDecorations">{{ i18n.ts.showAvatarDecorations }}</MkSwitch>
|
||||
<MkSwitch v-model="useSystemFont">{{ i18n.ts.useSystemFont }}</MkSwitch>
|
||||
<MkSwitch v-model="forceShowAds">{{ i18n.ts.forceShowAds }}</MkSwitch>
|
||||
<MkSwitch v-model="oneko">{{ i18n.ts.oneko }}</MkSwitch>
|
||||
<MkSwitch v-model="enableSeasonalScreenEffect">{{ i18n.ts.seasonalScreenEffect }}</MkSwitch>
|
||||
<MkSwitch v-model="useNativeUIForVideoAudioPlayer">{{ i18n.ts.useNativeUIForVideoAudioPlayer }}</MkSwitch>
|
||||
</div>
|
||||
|
||||
<MkSelect v-model="menuStyle">
|
||||
<template #label>{{ i18n.ts.menuStyle }}</template>
|
||||
<option value="auto">{{ i18n.ts.auto }}</option>
|
||||
<option value="popup">{{ i18n.ts.popup }}</option>
|
||||
<option value="drawer">{{ i18n.ts.drawer }}</option>
|
||||
</MkSelect>
|
||||
|
||||
<div>
|
||||
<MkRadios v-model="emojiStyle">
|
||||
<template #label>{{ i18n.ts.emojiStyle }}</template>
|
||||
<option value="native">{{ i18n.ts.native }}</option>
|
||||
<option value="fluentEmoji">Fluent Emoji</option>
|
||||
<option value="twemoji">Twemoji</option>
|
||||
<option value="tossface">Tossface</option>
|
||||
</MkRadios>
|
||||
<div style="margin: 8px 0 0 0; font-size: 1.5em;"><Mfm :key="emojiStyle" text="🍮🍦🍭🍩🍰🍫🍬🥞🍪"/></div>
|
||||
</div>
|
||||
|
||||
<MkRadios v-model="fontSize">
|
||||
<template #label>{{ i18n.ts.fontSize }}</template>
|
||||
<option :value="null"><span style="font-size: 14px;">Aa</span></option>
|
||||
<option value="1"><span style="font-size: 15px;">Aa</span></option>
|
||||
<option value="2"><span style="font-size: 16px;">Aa</span></option>
|
||||
<option value="3"><span style="font-size: 17px;">Aa</span></option>
|
||||
</MkRadios>
|
||||
|
||||
<MkRadios v-model="cornerRadius">
|
||||
<template #label>{{ i18n.ts.cornerRadius }}</template>
|
||||
<option :value="null"><i class="ph-paw-print ph-bold ph-lg" style="top: 2px;position: relative;"></i> Pawkey</option>
|
||||
<option value="misskey"><i class="sk-icons sk-misskey sk-icons-lg" style="top: 2px;position: relative;"></i> Misskey</option>
|
||||
</MkRadios>
|
||||
</div>
|
||||
</FormSection>
|
||||
|
||||
<FormSection>
|
||||
<template #label>{{ i18n.ts.behavior }}</template>
|
||||
|
||||
<div class="_gaps_m">
|
||||
<div class="_gaps_s">
|
||||
<MkSwitch v-model="warnMissingAltText">{{ i18n.ts.warnForMissingAltText }}</MkSwitch>
|
||||
<MkSwitch v-model="imageNewTab">{{ i18n.ts.openImageInNewTab }}</MkSwitch>
|
||||
<MkSwitch v-model="useReactionPickerForContextMenu">{{ i18n.ts.useReactionPickerForContextMenu }}</MkSwitch>
|
||||
<MkSwitch v-model="enableInfiniteScroll">{{ i18n.ts.enableInfiniteScroll }}</MkSwitch>
|
||||
<MkSwitch v-model="keepScreenOn">{{ i18n.ts.keepScreenOn }}</MkSwitch>
|
||||
<MkSwitch v-model="clickToOpen">{{ i18n.ts.clickToOpen }}</MkSwitch>
|
||||
<MkSwitch v-model="disableStreamingTimeline">{{ i18n.ts.disableStreamingTimeline }}</MkSwitch>
|
||||
<MkSwitch v-model="enableHorizontalSwipe">{{ i18n.ts.enableHorizontalSwipe }}</MkSwitch>
|
||||
<MkSwitch v-model="alwaysConfirmFollow">{{ i18n.ts.alwaysConfirmFollow }}</MkSwitch>
|
||||
<MkSwitch v-model="confirmWhenRevealingSensitiveMedia">{{ i18n.ts.confirmWhenRevealingSensitiveMedia }}</MkSwitch>
|
||||
<MkSwitch v-model="warnExternalUrl">{{ i18n.ts.warnExternalUrl }}</MkSwitch>
|
||||
</div>
|
||||
<MkSelect v-model="serverDisconnectedBehavior">
|
||||
<template #label>{{ i18n.ts.whenServerDisconnected }}</template>
|
||||
<option value="dialog">{{ i18n.ts._serverDisconnectedBehavior.dialog }}</option>
|
||||
<option value="quiet">{{ i18n.ts._serverDisconnectedBehavior.quiet }}</option>
|
||||
<option value="disabled">{{ i18n.ts._serverDisconnectedBehavior.disabled }}</option>
|
||||
</MkSelect>
|
||||
<MkSelect v-model="contextMenu">
|
||||
<template #label>{{ i18n.ts._contextMenu.title }}</template>
|
||||
<option value="app">{{ i18n.ts._contextMenu.app }}</option>
|
||||
<option value="appWithShift">{{ i18n.ts._contextMenu.appWithShift }}</option>
|
||||
<option value="native">{{ i18n.ts._contextMenu.native }}</option>
|
||||
</MkSelect>
|
||||
<MkRange v-model="numberOfPageCache" :min="1" :max="10" :step="1" easing>
|
||||
<template #label>{{ i18n.ts.numberOfPageCache }}</template>
|
||||
<template #caption>{{ i18n.ts.numberOfPageCacheDescription }}</template>
|
||||
</MkRange>
|
||||
|
||||
<MkFolder>
|
||||
<template #label>{{ i18n.ts.boostSettings }}</template>
|
||||
<div class="_gaps_m">
|
||||
<MkSwitch v-model="showVisibilitySelectorOnBoost">
|
||||
{{ i18n.ts.showVisibilitySelectorOnBoost }}
|
||||
<template #caption>{{ i18n.ts.showVisibilitySelectorOnBoostDescription }}</template>
|
||||
</MkSwitch>
|
||||
<MkSelect v-model="visibilityOnBoost">
|
||||
<template #label>{{ i18n.ts.visibilityOnBoost }}</template>
|
||||
<option value="public">{{ i18n.ts._visibility['public'] }}</option>
|
||||
<option value="home">{{ i18n.ts._visibility['home'] }}</option>
|
||||
<option value="followers">{{ i18n.ts._visibility['followers'] }}</option>
|
||||
</MkSelect>
|
||||
</div>
|
||||
</MkFolder>
|
||||
|
||||
<MkFolder>
|
||||
<template #label>{{ i18n.ts.dataSaver }}</template>
|
||||
|
||||
<div class="_gaps_m">
|
||||
<MkInfo>{{ i18n.ts.reloadRequiredToApplySettings }}</MkInfo>
|
||||
|
||||
<div class="_buttons">
|
||||
<MkButton inline @click="enableAllDataSaver">{{ i18n.ts.enableAll }}</MkButton>
|
||||
<MkButton inline @click="disableAllDataSaver">{{ i18n.ts.disableAll }}</MkButton>
|
||||
</div>
|
||||
<div class="_gaps_m">
|
||||
<MkSwitch v-model="dataSaver.media">
|
||||
{{ i18n.ts._dataSaver._media.title }}
|
||||
<template #caption>{{ i18n.ts._dataSaver._media.description }}</template>
|
||||
</MkSwitch>
|
||||
<MkSwitch v-model="dataSaver.avatar">
|
||||
{{ i18n.ts._dataSaver._avatar.title }}
|
||||
<template #caption>{{ i18n.ts._dataSaver._avatar.description }}</template>
|
||||
</MkSwitch>
|
||||
<MkSwitch v-model="dataSaver.urlPreview">
|
||||
{{ i18n.ts._dataSaver._urlPreview.title }}
|
||||
<template #caption>{{ i18n.ts._dataSaver._urlPreview.description }}</template>
|
||||
</MkSwitch>
|
||||
<MkSwitch v-model="dataSaver.code">
|
||||
{{ i18n.ts._dataSaver._code.title }}
|
||||
<template #caption>{{ i18n.ts._dataSaver._code.description }}</template>
|
||||
</MkSwitch>
|
||||
</div>
|
||||
</div>
|
||||
</MkFolder>
|
||||
</div>
|
||||
</FormSection>
|
||||
|
||||
<FormSection>
|
||||
<template #label>{{ i18n.ts.other }}</template>
|
||||
|
||||
<div class="_gaps">
|
||||
<MkRadios v-model="hemisphere">
|
||||
<template #label>{{ i18n.ts.hemisphere }}</template>
|
||||
<option value="N">{{ i18n.ts._hemisphere.N }}</option>
|
||||
<option value="S">{{ i18n.ts._hemisphere.S }}</option>
|
||||
<template #caption>{{ i18n.ts._hemisphere.caption }}</template>
|
||||
</MkRadios>
|
||||
<MkFolder>
|
||||
<template #label>{{ i18n.ts.additionalEmojiDictionary }}</template>
|
||||
<div class="_buttons">
|
||||
<template v-for="lang in emojiIndexLangs" :key="lang">
|
||||
<MkButton v-if="defaultStore.reactiveState.additionalUnicodeEmojiIndexes.value[lang]" danger @click="removeEmojiIndex(lang)"><i class="ti ti-trash"></i> {{ i18n.ts.remove }} ({{ getEmojiIndexLangName(lang) }})</MkButton>
|
||||
<MkButton v-else @click="downloadEmojiIndex(lang)"><i class="ti ti-download"></i> {{ getEmojiIndexLangName(lang) }}{{ defaultStore.reactiveState.additionalUnicodeEmojiIndexes.value[lang] ? ` (${ i18n.ts.installed })` : '' }}</MkButton>
|
||||
</template>
|
||||
</div>
|
||||
</MkFolder>
|
||||
<FormLink to="/settings/deck">{{ i18n.ts.deck }}</FormLink>
|
||||
<FormLink to="/settings/custom-css"><template #icon><i class="ti ti-code"></i></template>{{ i18n.ts.customCss }}</FormLink>
|
||||
</div>
|
||||
</FormSection>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref, watch } from 'vue';
|
||||
import * as Misskey from 'misskey-js';
|
||||
import { langs } from '@@/js/config.js';
|
||||
import MkSwitch from '@/components/MkSwitch.vue';
|
||||
import MkSelect from '@/components/MkSelect.vue';
|
||||
import MkRadios from '@/components/MkRadios.vue';
|
||||
import MkInput from '@/components/MkInput.vue';
|
||||
import MkRange from '@/components/MkRange.vue';
|
||||
import MkFolder from '@/components/MkFolder.vue';
|
||||
import MkButton from '@/components/MkButton.vue';
|
||||
import FormSection from '@/components/form/section.vue';
|
||||
import FormLink from '@/components/form/link.vue';
|
||||
import MkLink from '@/components/MkLink.vue';
|
||||
import MkInfo from '@/components/MkInfo.vue';
|
||||
import { searchEngineMap } from '@/scripts/search-engine-map.js';
|
||||
import { defaultStore } from '@/store.js';
|
||||
import * as os from '@/os.js';
|
||||
import { instance } from '@/instance.js';
|
||||
import { misskeyApi } from '@/scripts/misskey-api.js';
|
||||
import { reloadAsk } from '@/scripts/reload-ask.js';
|
||||
import { i18n } from '@/i18n.js';
|
||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
|
||||
import { miLocalStorage } from '@/local-storage.js';
|
||||
import { globalEvents } from '@/events.js';
|
||||
import { claimAchievement } from '@/scripts/achievements.js';
|
||||
import { worksOnInstance } from '@/scripts/favicon-dot.js';
|
||||
|
||||
const lang = ref(miLocalStorage.getItem('lang'));
|
||||
const fontSize = ref(miLocalStorage.getItem('fontSize'));
|
||||
const cornerRadius = ref(miLocalStorage.getItem('cornerRadius'));
|
||||
const useSystemFont = ref(miLocalStorage.getItem('useSystemFont') != null);
|
||||
const dataSaver = ref(defaultStore.state.dataSaver);
|
||||
|
||||
const hemisphere = computed(defaultStore.makeGetterSetter('hemisphere'));
|
||||
const overridedDeviceKind = computed(defaultStore.makeGetterSetter('overridedDeviceKind'));
|
||||
const serverDisconnectedBehavior = computed(defaultStore.makeGetterSetter('serverDisconnectedBehavior'));
|
||||
const showNoteActionsOnlyHover = computed(defaultStore.makeGetterSetter('showNoteActionsOnlyHover'));
|
||||
const showClipButtonInNoteFooter = computed(defaultStore.makeGetterSetter('showClipButtonInNoteFooter'));
|
||||
const reactionsDisplaySize = computed(defaultStore.makeGetterSetter('reactionsDisplaySize'));
|
||||
const limitWidthOfReaction = computed(defaultStore.makeGetterSetter('limitWidthOfReaction'));
|
||||
const collapseRenotes = computed(defaultStore.makeGetterSetter('collapseRenotes'));
|
||||
const collapseNotesRepliedTo = computed(defaultStore.makeGetterSetter('collapseNotesRepliedTo'));
|
||||
const clickToOpen = computed(defaultStore.makeGetterSetter('clickToOpen'));
|
||||
const collapseFiles = computed(defaultStore.makeGetterSetter('collapseFiles'));
|
||||
const autoloadConversation = computed(defaultStore.makeGetterSetter('autoloadConversation'));
|
||||
const reduceAnimation = computed(defaultStore.makeGetterSetter('animation', v => !v, v => !v));
|
||||
const useBlurEffectForModal = computed(defaultStore.makeGetterSetter('useBlurEffectForModal'));
|
||||
const useBlurEffect = computed(defaultStore.makeGetterSetter('useBlurEffect'));
|
||||
const showGapBetweenNotesInTimeline = computed(defaultStore.makeGetterSetter('showGapBetweenNotesInTimeline'));
|
||||
const animatedMfm = computed(defaultStore.makeGetterSetter('animatedMfm'));
|
||||
const advancedMfm = computed(defaultStore.makeGetterSetter('advancedMfm'));
|
||||
const showReactionsCount = computed(defaultStore.makeGetterSetter('showReactionsCount'));
|
||||
const enableQuickAddMfmFunction = computed(defaultStore.makeGetterSetter('enableQuickAddMfmFunction'));
|
||||
const emojiStyle = computed(defaultStore.makeGetterSetter('emojiStyle'));
|
||||
const menuStyle = computed(defaultStore.makeGetterSetter('menuStyle'));
|
||||
const disableShowingAnimatedImages = computed(defaultStore.makeGetterSetter('disableShowingAnimatedImages'));
|
||||
const forceShowAds = computed(defaultStore.makeGetterSetter('forceShowAds'));
|
||||
const oneko = computed(defaultStore.makeGetterSetter('oneko'));
|
||||
const loadRawImages = computed(defaultStore.makeGetterSetter('loadRawImages'));
|
||||
const disableCatSpeak = computed(defaultStore.makeGetterSetter('disableCatSpeak'));
|
||||
const highlightSensitiveMedia = computed(defaultStore.makeGetterSetter('highlightSensitiveMedia'));
|
||||
const imageNewTab = computed(defaultStore.makeGetterSetter('imageNewTab'));
|
||||
const enableFaviconNotificationDot = computed(defaultStore.makeGetterSetter('enableFaviconNotificationDot'));
|
||||
const warnMissingAltText = computed(defaultStore.makeGetterSetter('warnMissingAltText'));
|
||||
const nsfw = computed(defaultStore.makeGetterSetter('nsfw'));
|
||||
const showFixedPostForm = computed(defaultStore.makeGetterSetter('showFixedPostForm'));
|
||||
const showFixedPostFormInChannel = computed(defaultStore.makeGetterSetter('showFixedPostFormInChannel'));
|
||||
const numberOfPageCache = computed(defaultStore.makeGetterSetter('numberOfPageCache'));
|
||||
const numberOfReplies = computed(defaultStore.makeGetterSetter('numberOfReplies'));
|
||||
const instanceTicker = computed(defaultStore.makeGetterSetter('instanceTicker'));
|
||||
const enableInfiniteScroll = computed(defaultStore.makeGetterSetter('enableInfiniteScroll'));
|
||||
const useReactionPickerForContextMenu = computed(defaultStore.makeGetterSetter('useReactionPickerForContextMenu'));
|
||||
const squareAvatars = computed(defaultStore.makeGetterSetter('squareAvatars'));
|
||||
const showAvatarDecorations = computed(defaultStore.makeGetterSetter('showAvatarDecorations'));
|
||||
const mediaListWithOneImageAppearance = computed(defaultStore.makeGetterSetter('mediaListWithOneImageAppearance'));
|
||||
const notificationPosition = computed(defaultStore.makeGetterSetter('notificationPosition'));
|
||||
const notificationStackAxis = computed(defaultStore.makeGetterSetter('notificationStackAxis'));
|
||||
const notificationClickable = computed(defaultStore.makeGetterSetter('notificationClickable'));
|
||||
const keepScreenOn = computed(defaultStore.makeGetterSetter('keepScreenOn'));
|
||||
const disableStreamingTimeline = computed(defaultStore.makeGetterSetter('disableStreamingTimeline'));
|
||||
const useGroupedNotifications = computed(defaultStore.makeGetterSetter('useGroupedNotifications'));
|
||||
const showTickerOnReplies = computed(defaultStore.makeGetterSetter('showTickerOnReplies'));
|
||||
const searchEngine = computed(defaultStore.makeGetterSetter('searchEngine'));
|
||||
|
||||
const noteDesign = computed(defaultStore.makeGetterSetter('noteDesign'));
|
||||
const uncollapseCW = computed(defaultStore.makeGetterSetter('uncollapseCW'));
|
||||
const expandLongNote = computed(defaultStore.makeGetterSetter('expandLongNote'));
|
||||
const enableSeasonalScreenEffect = computed(defaultStore.makeGetterSetter('enableSeasonalScreenEffect'));
|
||||
const showVisibilitySelectorOnBoost = computed(defaultStore.makeGetterSetter('showVisibilitySelectorOnBoost'));
|
||||
const visibilityOnBoost = computed(defaultStore.makeGetterSetter('visibilityOnBoost'));
|
||||
const enableHorizontalSwipe = computed(defaultStore.makeGetterSetter('enableHorizontalSwipe'));
|
||||
const useNativeUIForVideoAudioPlayer = computed(defaultStore.makeGetterSetter('useNativeUIForVideoAudioPlayer'));
|
||||
const alwaysConfirmFollow = computed(defaultStore.makeGetterSetter('alwaysConfirmFollow'));
|
||||
const confirmWhenRevealingSensitiveMedia = computed(defaultStore.makeGetterSetter('confirmWhenRevealingSensitiveMedia'));
|
||||
const contextMenu = computed(defaultStore.makeGetterSetter('contextMenu'));
|
||||
const warnExternalUrl = computed(defaultStore.makeGetterSetter('warnExternalUrl'));
|
||||
|
||||
watch(lang, () => {
|
||||
miLocalStorage.setItem('lang', lang.value as string);
|
||||
miLocalStorage.removeItem('locale');
|
||||
miLocalStorage.removeItem('localeVersion');
|
||||
});
|
||||
|
||||
watch(fontSize, () => {
|
||||
if (fontSize.value == null) {
|
||||
miLocalStorage.removeItem('fontSize');
|
||||
} else {
|
||||
miLocalStorage.setItem('fontSize', fontSize.value);
|
||||
}
|
||||
});
|
||||
|
||||
watch(cornerRadius, () => {
|
||||
if (cornerRadius.value == null) {
|
||||
miLocalStorage.removeItem('cornerRadius');
|
||||
} else {
|
||||
miLocalStorage.setItem('cornerRadius', cornerRadius.value);
|
||||
}
|
||||
});
|
||||
|
||||
watch(useSystemFont, () => {
|
||||
if (useSystemFont.value) {
|
||||
miLocalStorage.setItem('useSystemFont', 't');
|
||||
} else {
|
||||
miLocalStorage.removeItem('useSystemFont');
|
||||
}
|
||||
});
|
||||
|
||||
watch(noteDesign, async (newval) => {
|
||||
if (noteDesign.value === newval) {
|
||||
await reloadAsk({});
|
||||
}
|
||||
});
|
||||
|
||||
watch([
|
||||
hemisphere,
|
||||
lang,
|
||||
fontSize,
|
||||
cornerRadius,
|
||||
useSystemFont,
|
||||
enableInfiniteScroll,
|
||||
squareAvatars,
|
||||
showNoteActionsOnlyHover,
|
||||
showGapBetweenNotesInTimeline,
|
||||
instanceTicker,
|
||||
overridedDeviceKind,
|
||||
mediaListWithOneImageAppearance,
|
||||
reactionsDisplaySize,
|
||||
limitWidthOfReaction,
|
||||
highlightSensitiveMedia,
|
||||
keepScreenOn,
|
||||
disableStreamingTimeline,
|
||||
enableSeasonalScreenEffect,
|
||||
showVisibilitySelectorOnBoost,
|
||||
visibilityOnBoost,
|
||||
alwaysConfirmFollow,
|
||||
confirmWhenRevealingSensitiveMedia,
|
||||
contextMenu,
|
||||
warnExternalUrl,
|
||||
], async () => {
|
||||
await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true });
|
||||
});
|
||||
|
||||
const emojiIndexLangs = ['en-US', 'ja-JP', 'ja-JP_hira'] as const;
|
||||
|
||||
function getEmojiIndexLangName(targetLang: typeof emojiIndexLangs[number]) {
|
||||
if (langs.find(x => x[0] === targetLang)) {
|
||||
return langs.find(x => x[0] === targetLang)![1];
|
||||
} else {
|
||||
// 絵文字辞書限定の言語定義
|
||||
switch (targetLang) {
|
||||
case 'ja-JP_hira': return 'ひらがな';
|
||||
default: return targetLang;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function downloadEmojiIndex(lang: typeof emojiIndexLangs[number]) {
|
||||
async function main() {
|
||||
const currentIndexes = defaultStore.state.additionalUnicodeEmojiIndexes;
|
||||
|
||||
function download() {
|
||||
switch (lang) {
|
||||
case 'en-US': return import('../../unicode-emoji-indexes/en-US.json').then(x => x.default);
|
||||
case 'ja-JP': return import('../../unicode-emoji-indexes/ja-JP.json').then(x => x.default);
|
||||
case 'ja-JP_hira': return import('../../unicode-emoji-indexes/ja-JP_hira.json').then(x => x.default);
|
||||
default: throw new Error('unrecognized lang: ' + lang);
|
||||
}
|
||||
}
|
||||
|
||||
currentIndexes[lang] = await download();
|
||||
await defaultStore.set('additionalUnicodeEmojiIndexes', currentIndexes);
|
||||
}
|
||||
|
||||
os.promiseDialog(main());
|
||||
}
|
||||
|
||||
function removeEmojiIndex(lang: string) {
|
||||
async function main() {
|
||||
const currentIndexes = defaultStore.state.additionalUnicodeEmojiIndexes;
|
||||
delete currentIndexes[lang];
|
||||
await defaultStore.set('additionalUnicodeEmojiIndexes', currentIndexes);
|
||||
}
|
||||
|
||||
os.promiseDialog(main());
|
||||
}
|
||||
|
||||
async function setPinnedList() {
|
||||
const lists = await misskeyApi('users/lists/list');
|
||||
const { canceled, result: list } = await os.select({
|
||||
title: i18n.ts.selectList,
|
||||
items: lists.map(x => ({
|
||||
value: x, text: x.name,
|
||||
})),
|
||||
});
|
||||
if (canceled) return;
|
||||
|
||||
defaultStore.set('pinnedUserLists', [list]);
|
||||
}
|
||||
|
||||
function removePinnedList() {
|
||||
defaultStore.set('pinnedUserLists', []);
|
||||
}
|
||||
|
||||
let smashCount = 0;
|
||||
let smashTimer: number | null = null;
|
||||
|
||||
function testNotification(): void {
|
||||
const notification: Misskey.entities.Notification = {
|
||||
id: Math.random().toString(),
|
||||
createdAt: new Date().toUTCString(),
|
||||
isRead: false,
|
||||
type: 'test',
|
||||
};
|
||||
|
||||
globalEvents.emit('clientNotification', notification);
|
||||
|
||||
// セルフ通知破壊 実績関連
|
||||
smashCount++;
|
||||
if (smashCount >= 10) {
|
||||
claimAchievement('smashTestNotificationButton');
|
||||
smashCount = 0;
|
||||
}
|
||||
if (smashTimer) {
|
||||
clearTimeout(smashTimer);
|
||||
}
|
||||
smashTimer = window.setTimeout(() => {
|
||||
smashCount = 0;
|
||||
}, 300);
|
||||
}
|
||||
|
||||
async function testNotificationDot() {
|
||||
const success = await worksOnInstance();
|
||||
|
||||
if (success) {
|
||||
os.toast(i18n.ts.notificationDotWorking);
|
||||
} else {
|
||||
os.toast(i18n.ts.notificationDotNotWorking);
|
||||
}
|
||||
}
|
||||
|
||||
function enableAllDataSaver() {
|
||||
const g = { ...defaultStore.state.dataSaver };
|
||||
|
||||
Object.keys(g).forEach((key) => { g[key] = true; });
|
||||
|
||||
dataSaver.value = g;
|
||||
}
|
||||
|
||||
function disableAllDataSaver() {
|
||||
const g = { ...defaultStore.state.dataSaver };
|
||||
|
||||
Object.keys(g).forEach((key) => { g[key] = false; });
|
||||
|
||||
dataSaver.value = g;
|
||||
}
|
||||
|
||||
watch(dataSaver, (to) => {
|
||||
defaultStore.set('dataSaver', to);
|
||||
}, {
|
||||
deep: true,
|
||||
});
|
||||
|
||||
const headerActions = computed(() => []);
|
||||
|
||||
const headerTabs = computed(() => []);
|
||||
|
||||
definePageMetadata(() => ({
|
||||
title: i18n.ts.general,
|
||||
icon: 'ti ti-adjustments',
|
||||
}));
|
||||
|
||||
const useCustomSearchEngine = computed(() => !Object.keys(searchEngineMap).includes(searchEngine.value));
|
||||
</script>
|
||||
@@ -13,7 +13,13 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<div :class="$style.poweredBy">Powered by</div>
|
||||
<img :src="misskeysvg" :class="$style.misskey"/>
|
||||
</div>
|
||||
<div :class="$style.contents">
|
||||
<div class="emojis">
|
||||
<MkEmoji :normal="true" :noStyle="true" emoji="🐾"/>
|
||||
<MkEmoji :normal="true" :noStyle="true" emoji="🐶"/>
|
||||
<MkEmoji :normal="true" :noStyle="true" emoji="🩷"/>
|
||||
<MkEmoji :normal="true" :noStyle="true" emoji="🌸"/>
|
||||
</div>
|
||||
<div class="contents">
|
||||
<MkVisitorDashboard/>
|
||||
</div>
|
||||
<div v-if="instances && instances.length > 0" :class="$style.federation">
|
||||
@@ -34,8 +40,8 @@ import * as Misskey from 'misskey-js';
|
||||
import XTimeline from './welcome.timeline.vue';
|
||||
import MarqueeText from '@/components/MkMarquee.vue';
|
||||
import MkFeaturedPhotos from '@/components/MkFeaturedPhotos.vue';
|
||||
import misskeysvg from '/client-assets/sharkey.svg';
|
||||
import { misskeyApiGet } from '@/utility/misskey-api.js';
|
||||
import misskeysvg from '/client-assets/pawkey.png';
|
||||
import { misskeyApiGet } from '@/scripts/misskey-api.js';
|
||||
import MkVisitorDashboard from '@/components/MkVisitorDashboard.vue';
|
||||
import { getProxiedImageUrl } from '@/utility/media-proxy.js';
|
||||
import { instance as meta } from '@/instance.js';
|
||||
|
||||
@@ -8,8 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<div :class="$style.formContainer">
|
||||
<form :class="$style.form" class="_panel" @submit.prevent="submit()">
|
||||
<div :class="$style.title">
|
||||
<!-- TODO translate -->
|
||||
<div>Welcome to Sharkey!</div>
|
||||
<div>Welcome to Pawkey!</div>
|
||||
<div :class="$style.version">v{{ version }}</div>
|
||||
</div>
|
||||
<div class="_gaps_m" style="padding: 32px;">
|
||||
|
||||
@@ -204,8 +204,8 @@ export const ROUTE_DEF = [{
|
||||
path: '/contact',
|
||||
component: page(() => import('@/pages/contact.vue')),
|
||||
}, {
|
||||
path: '/about-sharkey',
|
||||
component: page(() => import('@/pages/about-sharkey.vue')),
|
||||
path: '/about-pawkey',
|
||||
component: page(() => import('@/pages/about-pawkey.vue')),
|
||||
}, {
|
||||
path: '/invite',
|
||||
name: 'invite',
|
||||
|
||||
@@ -167,8 +167,8 @@ export function openInstanceMenu(ev: MouseEvent) {
|
||||
menuItems.push({
|
||||
type: 'link',
|
||||
text: i18n.ts.aboutMisskey,
|
||||
icon: 'sk-icons sk-shark sk-icons-lg',
|
||||
to: '/about-sharkey',
|
||||
icon: 'ph-paw-print ph-bold ph-lg',
|
||||
to: '/about-pawkey',
|
||||
});
|
||||
|
||||
os.popupMenu(menuItems, ev.currentTarget ?? ev.target, {
|
||||
|
||||
@@ -223,6 +223,28 @@ window.document.documentElement.style.overflowY = 'hidden';
|
||||
window.document.documentElement.style.scrollBehavior = 'auto';
|
||||
</script>
|
||||
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: clip;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
overscroll-behavior: none;
|
||||
}
|
||||
|
||||
#pawkey_app {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: clip;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" module>
|
||||
.root {
|
||||
--MI-margin: var(--MI-marginHalf);
|
||||
|
||||
@@ -125,6 +125,28 @@ const onContextmenu = (ev) => {
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: clip;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
overscroll-behavior: none;
|
||||
}
|
||||
|
||||
#pawkey_app {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: clip;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss" module>
|
||||
$ui-font-size: 1em; // TODO: どこかに集約したい
|
||||
$widgets-hide-threshold: 1090px;
|
||||
|
||||
@@ -12,7 +12,7 @@ import { prefer } from '@/preferences';
|
||||
import { store } from '@/store.js';
|
||||
|
||||
/*
|
||||
this script should eventually contain all Sharkey-specific bits of
|
||||
this script should eventually contain all Pawkey-specific bits of
|
||||
boosting and quoting that we would otherwise have to replicate in
|
||||
`{M,S}kNote{,Detailed,Sub}.vue`
|
||||
*/
|
||||
|
||||
@@ -4455,7 +4455,7 @@ declare module '../api.js' {
|
||||
): Promise<SwitchCaseResponseType<E, P>>;
|
||||
|
||||
/**
|
||||
* Get Sharkey Sponsors or Instance Sponsors
|
||||
* Get Pawkey Sponsors or Instance Sponsors
|
||||
*
|
||||
* **Credential required**: *No*
|
||||
*/
|
||||
|
||||
@@ -3841,7 +3841,7 @@ export type paths = {
|
||||
'/sponsors': {
|
||||
/**
|
||||
* sponsors
|
||||
* @description Get Sharkey Sponsors or Instance Sponsors
|
||||
* @description Get Pawkey Sponsors or Instance Sponsors
|
||||
*
|
||||
* **Credential required**: *No*
|
||||
*/
|
||||
@@ -30970,7 +30970,7 @@ export type operations = {
|
||||
};
|
||||
/**
|
||||
* sponsors
|
||||
* @description Get Sharkey Sponsors or Instance Sponsors
|
||||
* @description Get Pawkey Sponsors or Instance Sponsors
|
||||
*
|
||||
* **Credential required**: *No*
|
||||
*/
|
||||
|
||||
@@ -321,7 +321,7 @@ export async function createEmptyNotification(): Promise<void> {
|
||||
await globalThis.registration.showNotification(
|
||||
(new URL(origin)).host,
|
||||
{
|
||||
body: `Sharkey v${_VERSION_}`,
|
||||
body: `Pawkey v${_VERSION_}`,
|
||||
silent: true,
|
||||
badge: iconUrl('null'),
|
||||
tag: 'read_notification',
|
||||
|
||||