mirror of
https://activitypub.software/TransFem-org/Sharkey
synced 2024-12-22 16:30:13 +00:00
Merge branch 'develop' into hazelnoot/following-timeline
This commit is contained in:
commit
705ae79eb1
23 changed files with 132 additions and 29 deletions
|
@ -53,7 +53,7 @@ services:
|
||||||
# restart: always
|
# restart: always
|
||||||
# image: mcaptcha/mcaptcha:latest
|
# image: mcaptcha/mcaptcha:latest
|
||||||
# networks:
|
# networks:
|
||||||
# shonks:
|
# shonk:
|
||||||
# aliases:
|
# aliases:
|
||||||
# - localhost
|
# - localhost
|
||||||
# ports:
|
# ports:
|
||||||
|
@ -63,6 +63,8 @@ services:
|
||||||
# environment:
|
# environment:
|
||||||
# PORT: 7493
|
# PORT: 7493
|
||||||
# MCAPTCHA_redis_URL: "redis://mcaptcha_redis/"
|
# MCAPTCHA_redis_URL: "redis://mcaptcha_redis/"
|
||||||
|
# MCAPTCHA_allow_registration: true
|
||||||
|
# MCAPTCHA_server_DOMAIN: "example.tld"
|
||||||
# depends_on:
|
# depends_on:
|
||||||
# db:
|
# db:
|
||||||
# condition: service_healthy
|
# condition: service_healthy
|
||||||
|
@ -72,7 +74,7 @@ services:
|
||||||
# mcaptcha_redis:
|
# mcaptcha_redis:
|
||||||
# image: mcaptcha/cache:latest
|
# image: mcaptcha/cache:latest
|
||||||
# networks:
|
# networks:
|
||||||
# - shonks
|
# - shonk
|
||||||
# healthcheck:
|
# healthcheck:
|
||||||
# test: "redis-cli ping"
|
# test: "redis-cli ping"
|
||||||
# interval: 5s
|
# interval: 5s
|
||||||
|
|
|
@ -1456,6 +1456,9 @@ _serverSettings:
|
||||||
appIconUsageExample: "E.g. As PWA, or when displayed as a home screen bookmark on a phone"
|
appIconUsageExample: "E.g. As PWA, or when displayed as a home screen bookmark on a phone"
|
||||||
appIconStyleRecommendation: "As the icon may be cropped to a square or circle, an icon with colored margin around the content is recommended."
|
appIconStyleRecommendation: "As the icon may be cropped to a square or circle, an icon with colored margin around the content is recommended."
|
||||||
appIconResolutionMustBe: "The minimum resolution is {resolution}."
|
appIconResolutionMustBe: "The minimum resolution is {resolution}."
|
||||||
|
sidebarLogoUrl: "Logo URL"
|
||||||
|
sidebarLogoDescription: "Specifies the logo to use instead of the regular icon in high definition, dynamic-width scenarios."
|
||||||
|
sidebarLogoUsageExample: "E.g. In the sidebar, to visitors and in the \"About\" page."
|
||||||
manifestJsonOverride: "manifest.json Override"
|
manifestJsonOverride: "manifest.json Override"
|
||||||
shortName: "Short name"
|
shortName: "Short name"
|
||||||
shortNameDescription: "A shorthand for the instance's name that can be displayed if the full official name is long."
|
shortNameDescription: "A shorthand for the instance's name that can be displayed if the full official name is long."
|
||||||
|
|
12
locales/index.d.ts
vendored
12
locales/index.d.ts
vendored
|
@ -5796,6 +5796,18 @@ export interface Locale extends ILocale {
|
||||||
* 解像度は必ず{resolution}である必要があります。
|
* 解像度は必ず{resolution}である必要があります。
|
||||||
*/
|
*/
|
||||||
"appIconResolutionMustBe": ParameterizedString<"resolution">;
|
"appIconResolutionMustBe": ParameterizedString<"resolution">;
|
||||||
|
/**
|
||||||
|
* ロゴURL
|
||||||
|
*/
|
||||||
|
"sidebarLogoUrl": string;
|
||||||
|
/**
|
||||||
|
* 高精細、ダイナミック幅のシナリオで通常のアイコンの代わりに使用するロゴを指定します。
|
||||||
|
*/
|
||||||
|
"sidebarLogoDescription": string;
|
||||||
|
/**
|
||||||
|
* 例:サイドバー、訪問者用、「情報」ページ
|
||||||
|
*/
|
||||||
|
"sidebarLogoUsageExample": string;
|
||||||
/**
|
/**
|
||||||
* manifest.jsonのオーバーライド
|
* manifest.jsonのオーバーライド
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1464,6 +1464,9 @@ _serverSettings:
|
||||||
appIconUsageExample: "例: PWAや、スマートフォンのホーム画面にブックマークとして追加された時など"
|
appIconUsageExample: "例: PWAや、スマートフォンのホーム画面にブックマークとして追加された時など"
|
||||||
appIconStyleRecommendation: "円形もしくは角丸にクロップされる場合があるため、塗り潰された余白のある背景を持つことが推奨されます。"
|
appIconStyleRecommendation: "円形もしくは角丸にクロップされる場合があるため、塗り潰された余白のある背景を持つことが推奨されます。"
|
||||||
appIconResolutionMustBe: "解像度は必ず{resolution}である必要があります。"
|
appIconResolutionMustBe: "解像度は必ず{resolution}である必要があります。"
|
||||||
|
sidebarLogoUrl: "ロゴURL"
|
||||||
|
sidebarLogoDescription: "高精細、ダイナミック幅のシナリオで通常のアイコンの代わりに使用するロゴを指定します。"
|
||||||
|
sidebarLogoUsageExample: "例:サイドバー、訪問者用、「情報」ページ"
|
||||||
manifestJsonOverride: "manifest.jsonのオーバーライド"
|
manifestJsonOverride: "manifest.jsonのオーバーライド"
|
||||||
shortName: "略称"
|
shortName: "略称"
|
||||||
shortNameDescription: "サーバーの正式名称が長い場合に、代わりに表示することのできる略称や通称。"
|
shortNameDescription: "サーバーの正式名称が長い場合に、代わりに表示することのできる略称や通称。"
|
||||||
|
|
16
packages/backend/migration/1727027985575-SidebarLogo.js
Normal file
16
packages/backend/migration/1727027985575-SidebarLogo.js
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: piuvas and other Sharkey contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class SidebarLogo1727027985575 {
|
||||||
|
name = 'SidebarLogo1727027985575';
|
||||||
|
|
||||||
|
async up(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" ADD "sidebarLogoUrl" character varying(1024)`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async down(queryRunner) {
|
||||||
|
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "sidebarLogoUrl"`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -105,6 +105,7 @@ export class MetaEntityService {
|
||||||
serverErrorImageUrl: instance.serverErrorImageUrl,
|
serverErrorImageUrl: instance.serverErrorImageUrl,
|
||||||
notFoundImageUrl: instance.notFoundImageUrl,
|
notFoundImageUrl: instance.notFoundImageUrl,
|
||||||
iconUrl: instance.iconUrl,
|
iconUrl: instance.iconUrl,
|
||||||
|
sidebarLogoUrl: instance.sidebarLogoUrl,
|
||||||
backgroundImageUrl: instance.backgroundImageUrl,
|
backgroundImageUrl: instance.backgroundImageUrl,
|
||||||
logoImageUrl: instance.logoImageUrl,
|
logoImageUrl: instance.logoImageUrl,
|
||||||
maxNoteTextLength: this.config.maxNoteLength,
|
maxNoteTextLength: this.config.maxNoteLength,
|
||||||
|
|
|
@ -22,14 +22,14 @@ export const getNoteSummary = (note: Packed<'Note'>): string => {
|
||||||
|
|
||||||
// 本文
|
// 本文
|
||||||
if (note.cw != null) {
|
if (note.cw != null) {
|
||||||
summary += note.cw;
|
summary += `CW: ${note.cw}`;
|
||||||
} else {
|
} else if (note.text) {
|
||||||
summary += note.text ? note.text : '';
|
summary += note.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ファイルが添付されているとき
|
// ファイルが添付されているとき
|
||||||
if ((note.files ?? []).length !== 0) {
|
if (note.files && note.files.length !== 0) {
|
||||||
summary += ` (📎${note.files!.length})`;
|
summary += ` (📎${note.files.length})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 投票が添付されているとき
|
// 投票が添付されているとき
|
||||||
|
@ -39,7 +39,7 @@ export const getNoteSummary = (note: Packed<'Note'>): string => {
|
||||||
|
|
||||||
// 返信のとき
|
// 返信のとき
|
||||||
if (note.replyId) {
|
if (note.replyId) {
|
||||||
if (note.reply) {
|
if (note.reply && !note.cw) {
|
||||||
summary += `\n\nRE: ${getNoteSummary(note.reply)}`;
|
summary += `\n\nRE: ${getNoteSummary(note.reply)}`;
|
||||||
} else {
|
} else {
|
||||||
summary += '\n\nRE: ...';
|
summary += '\n\nRE: ...';
|
||||||
|
@ -48,7 +48,7 @@ export const getNoteSummary = (note: Packed<'Note'>): string => {
|
||||||
|
|
||||||
// Renoteのとき
|
// Renoteのとき
|
||||||
if (note.renoteId) {
|
if (note.renoteId) {
|
||||||
if (note.renote) {
|
if (note.renote && !note.cw) {
|
||||||
summary += `\n\nRN: ${getNoteSummary(note.renote)}`;
|
summary += `\n\nRN: ${getNoteSummary(note.renote)}`;
|
||||||
} else {
|
} else {
|
||||||
summary += '\n\nRN: ...';
|
summary += '\n\nRN: ...';
|
||||||
|
|
|
@ -139,6 +139,12 @@ export class MiMeta {
|
||||||
})
|
})
|
||||||
public app512IconUrl: string | null;
|
public app512IconUrl: string | null;
|
||||||
|
|
||||||
|
@Column('varchar', {
|
||||||
|
length: 1024,
|
||||||
|
nullable: true,
|
||||||
|
})
|
||||||
|
public sidebarLogoUrl: string | null;
|
||||||
|
|
||||||
@Column('varchar', {
|
@Column('varchar', {
|
||||||
length: 1024,
|
length: 1024,
|
||||||
nullable: true,
|
nullable: true,
|
||||||
|
|
|
@ -110,6 +110,10 @@ export const meta = {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
optional: false, nullable: true,
|
optional: false, nullable: true,
|
||||||
},
|
},
|
||||||
|
sidebarLogoUrl: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: true,
|
||||||
|
},
|
||||||
enableEmail: {
|
enableEmail: {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
optional: false, nullable: false,
|
optional: false, nullable: false,
|
||||||
|
@ -582,6 +586,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
iconUrl: instance.iconUrl,
|
iconUrl: instance.iconUrl,
|
||||||
app192IconUrl: instance.app192IconUrl,
|
app192IconUrl: instance.app192IconUrl,
|
||||||
app512IconUrl: instance.app512IconUrl,
|
app512IconUrl: instance.app512IconUrl,
|
||||||
|
sidebarLogoUrl: instance.sidebarLogoUrl,
|
||||||
backgroundImageUrl: instance.backgroundImageUrl,
|
backgroundImageUrl: instance.backgroundImageUrl,
|
||||||
logoImageUrl: instance.logoImageUrl,
|
logoImageUrl: instance.logoImageUrl,
|
||||||
defaultLightTheme: instance.defaultLightTheme,
|
defaultLightTheme: instance.defaultLightTheme,
|
||||||
|
|
|
@ -55,6 +55,7 @@ export const paramDef = {
|
||||||
iconUrl: { type: 'string', nullable: true },
|
iconUrl: { type: 'string', nullable: true },
|
||||||
app192IconUrl: { type: 'string', nullable: true },
|
app192IconUrl: { type: 'string', nullable: true },
|
||||||
app512IconUrl: { type: 'string', nullable: true },
|
app512IconUrl: { type: 'string', nullable: true },
|
||||||
|
sidebarLogoUrl: { type: 'string', nullable: true },
|
||||||
backgroundImageUrl: { type: 'string', nullable: true },
|
backgroundImageUrl: { type: 'string', nullable: true },
|
||||||
logoImageUrl: { type: 'string', nullable: true },
|
logoImageUrl: { type: 'string', nullable: true },
|
||||||
name: { type: 'string', nullable: true },
|
name: { type: 'string', nullable: true },
|
||||||
|
@ -250,6 +251,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
set.app512IconUrl = ps.app512IconUrl;
|
set.app512IconUrl = ps.app512IconUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ps.sidebarLogoUrl !== undefined) {
|
||||||
|
set.sidebarLogoUrl = ps.sidebarLogoUrl;
|
||||||
|
}
|
||||||
|
|
||||||
if (ps.serverErrorImageUrl !== undefined) {
|
if (ps.serverErrorImageUrl !== undefined) {
|
||||||
set.serverErrorImageUrl = ps.serverErrorImageUrl;
|
set.serverErrorImageUrl = ps.serverErrorImageUrl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,14 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div v-show="props.modelValue.length != 0" :class="$style.root">
|
<div v-show="props.modelValue.length != 0" :class="$style.root">
|
||||||
<Sortable :modelValue="props.modelValue" :class="$style.files" itemKey="id" :animation="150" :delay="100" :delayOnTouchOnly="true" @update:modelValue="v => emit('update:modelValue', v)">
|
<Sortable :modelValue="props.modelValue" :class="$style.files" itemKey="id" :animation="150" :delay="100" :delayOnTouchOnly="true" @update:modelValue="v => emit('update:modelValue', v)">
|
||||||
<template #item="{element}">
|
<template #item="{element}">
|
||||||
<div :class="$style.file" @click="showFileMenu(element, $event)" @contextmenu.prevent="showFileMenu(element, $event)">
|
<div
|
||||||
|
:class="$style.file"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
@click="showFileMenu(element, $event)"
|
||||||
|
@keydown.space.enter="showFileMenu(element, $event)"
|
||||||
|
@contextmenu.prevent="showFileMenu(element, $event)"
|
||||||
|
>
|
||||||
<MkDriveFileThumbnail :data-id="element.id" :class="$style.thumbnail" :file="element" fit="cover"/>
|
<MkDriveFileThumbnail :data-id="element.id" :class="$style.thumbnail" :file="element" fit="cover"/>
|
||||||
<div v-if="element.isSensitive" :class="$style.sensitive">
|
<div v-if="element.isSensitive" :class="$style.sensitive">
|
||||||
<i class="ti ti-eye-exclamation" style="margin: auto;"></i>
|
<i class="ti ti-eye-exclamation" style="margin: auto;"></i>
|
||||||
|
@ -132,7 +139,7 @@ async function crop(file: Misskey.entities.DriveFile): Promise<void> {
|
||||||
emit('replaceFile', file, newFile);
|
emit('replaceFile', file, newFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showFileMenu(file: Misskey.entities.DriveFile, ev: MouseEvent): void {
|
function showFileMenu(file: Misskey.entities.DriveFile, ev: MouseEvent | KeyboardEvent): void {
|
||||||
if (menuShowing) return;
|
if (menuShowing) return;
|
||||||
|
|
||||||
const isImage = file.type.startsWith('image/');
|
const isImage = file.type.startsWith('image/');
|
||||||
|
@ -187,6 +194,10 @@ function showFileMenu(file: Misskey.entities.DriveFile, ev: MouseEvent): void {
|
||||||
border-radius: var(--radius-xs);
|
border-radius: var(--radius-xs);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
cursor: move;
|
cursor: move;
|
||||||
|
|
||||||
|
&:focus-visible {
|
||||||
|
outline-offset: 4px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.thumbnail {
|
.thumbnail {
|
||||||
|
|
|
@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<template>
|
<template>
|
||||||
<div v-if="instance" :class="$style.root">
|
<div v-if="instance" :class="$style.root">
|
||||||
<div :class="[$style.main, $style.panel]">
|
<div :class="[$style.main, $style.panel]">
|
||||||
<img :src="instance.iconUrl || '/apple-touch-icon.png'" alt="" :class="$style.mainIcon"/>
|
<img :src="instance.sidebarLogoUrl || instance.iconUrl || '/apple-touch-icon.png'" alt="" :class="instance.sidebarLogoUrl ? $style.wideIcon : $style.mainIcon"/>
|
||||||
<button class="_button _acrylic" :class="$style.mainMenu" @click="showMenu"><i class="ti ti-dots"></i></button>
|
<button class="_button _acrylic" :class="$style.mainMenu" @click="showMenu"><i class="ti ti-dots"></i></button>
|
||||||
<div :class="$style.mainFg">
|
<div :class="$style.mainFg">
|
||||||
<h1 :class="$style.mainTitle">
|
<h1 :class="$style.mainTitle">
|
||||||
|
@ -126,6 +126,14 @@ function showMenu(ev: MouseEvent) {
|
||||||
filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.5));
|
filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wideIcon {
|
||||||
|
min-width: 85px;
|
||||||
|
max-width: 60%;
|
||||||
|
margin-top: -47px;
|
||||||
|
vertical-align: bottom;
|
||||||
|
filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.5));
|
||||||
|
}
|
||||||
|
|
||||||
.mainMenu {
|
.mainMenu {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 16px;
|
top: 16px;
|
||||||
|
|
|
@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div class="_gaps_m">
|
<div class="_gaps_m">
|
||||||
<div :class="$style.banner" :style="{ backgroundImage: `url(${ instance.bannerUrl })` }">
|
<div :class="$style.banner" :style="{ backgroundImage: `url(${ instance.bannerUrl })` }">
|
||||||
<div style="overflow: clip;">
|
<div style="overflow: clip;">
|
||||||
<img :src="instance.iconUrl ?? instance.faviconUrl ?? '/favicon.ico'" alt="" :class="$style.bannerIcon"/>
|
<img :src="instance.sidebarLogoUrl ?? instance.iconUrl ?? instance.faviconUrl ?? '/favicon.ico'" alt="" :class="$style.bannerIcon"/>
|
||||||
<div :class="$style.bannerName">
|
<div :class="$style.bannerName">
|
||||||
<b>{{ instance.name ?? host }}</b>
|
<b>{{ instance.name ?? host }}</b>
|
||||||
</div>
|
</div>
|
||||||
|
@ -160,7 +160,7 @@ const initStats = () => misskeyApi('stats', {});
|
||||||
.bannerIcon {
|
.bannerIcon {
|
||||||
display: block;
|
display: block;
|
||||||
margin: 16px auto 0 auto;
|
margin: 16px auto 0 auto;
|
||||||
height: 64px;
|
max-height: 96px;
|
||||||
border-radius: var(--radius-sm);;
|
border-radius: var(--radius-sm);;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,15 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</template>
|
</template>
|
||||||
</MkInput>
|
</MkInput>
|
||||||
|
|
||||||
|
<MkInput v-model="sidebarLogoUrl" type="url">
|
||||||
|
<template #prefix><i class="ti ti-link"></i></template>
|
||||||
|
<template #label>{{ i18n.ts._serverSettings.sidebarLogoUrl }}</template>
|
||||||
|
<template #caption>
|
||||||
|
<div>{{ i18n.ts._serverSettings.sidebarLogoDescription }}</div>
|
||||||
|
<div>({{ i18n.ts._serverSettings.sidebarLogoUsageExample }})</div>
|
||||||
|
</template>
|
||||||
|
</MkInput>
|
||||||
|
|
||||||
<MkInput v-model="bannerUrl" type="url">
|
<MkInput v-model="bannerUrl" type="url">
|
||||||
<template #prefix><i class="ti ti-link"></i></template>
|
<template #prefix><i class="ti ti-link"></i></template>
|
||||||
<template #label>{{ i18n.ts.bannerUrl }}</template>
|
<template #label>{{ i18n.ts.bannerUrl }}</template>
|
||||||
|
@ -128,6 +137,7 @@ import MkColorInput from '@/components/MkColorInput.vue';
|
||||||
import { host } from '@/config.js';
|
import { host } from '@/config.js';
|
||||||
|
|
||||||
const iconUrl = ref<string | null>(null);
|
const iconUrl = ref<string | null>(null);
|
||||||
|
const sidebarLogoUrl = ref<string | null>(null);
|
||||||
const app192IconUrl = ref<string | null>(null);
|
const app192IconUrl = ref<string | null>(null);
|
||||||
const app512IconUrl = ref<string | null>(null);
|
const app512IconUrl = ref<string | null>(null);
|
||||||
const bannerUrl = ref<string | null>(null);
|
const bannerUrl = ref<string | null>(null);
|
||||||
|
@ -146,6 +156,7 @@ const manifestJsonOverride = ref<string>('{}');
|
||||||
async function init() {
|
async function init() {
|
||||||
const meta = await misskeyApi('admin/meta');
|
const meta = await misskeyApi('admin/meta');
|
||||||
iconUrl.value = meta.iconUrl;
|
iconUrl.value = meta.iconUrl;
|
||||||
|
sidebarLogoUrl.value = meta.sidebarLogoUrl;
|
||||||
app192IconUrl.value = meta.app192IconUrl;
|
app192IconUrl.value = meta.app192IconUrl;
|
||||||
app512IconUrl.value = meta.app512IconUrl;
|
app512IconUrl.value = meta.app512IconUrl;
|
||||||
bannerUrl.value = meta.bannerUrl;
|
bannerUrl.value = meta.bannerUrl;
|
||||||
|
@ -165,6 +176,7 @@ async function init() {
|
||||||
function save() {
|
function save() {
|
||||||
os.apiWithDialog('admin/update-meta', {
|
os.apiWithDialog('admin/update-meta', {
|
||||||
iconUrl: iconUrl.value,
|
iconUrl: iconUrl.value,
|
||||||
|
sidebarLogoUrl: sidebarLogoUrl.value,
|
||||||
app192IconUrl: app192IconUrl.value,
|
app192IconUrl: app192IconUrl.value,
|
||||||
app512IconUrl: app512IconUrl.value,
|
app512IconUrl: app512IconUrl.value,
|
||||||
bannerUrl: bannerUrl.value,
|
bannerUrl: bannerUrl.value,
|
||||||
|
|
|
@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<MkStickyContainer>
|
<MkStickyContainer>
|
||||||
<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
|
<template #header><MkPageHeader :actions="headerActions" :displayBackButton="true" :tabs="headerTabs"/></template>
|
||||||
<MkSpacer :contentMax="800">
|
<MkSpacer :contentMax="800">
|
||||||
<div ref="rootEl">
|
<div ref="rootEl">
|
||||||
<div v-if="queue > 0" :class="$style.new"><button class="_buttonPrimary" :class="$style.newButton" @click="top()">{{ i18n.ts.newNoteRecived }}</button></div>
|
<div v-if="queue > 0" :class="$style.new"><button class="_buttonPrimary" :class="$style.newButton" @click="top()">{{ i18n.ts.newNoteRecived }}</button></div>
|
||||||
|
|
|
@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<MkStickyContainer>
|
<MkStickyContainer>
|
||||||
<template #header><MkPageHeader v-model:tab="tab" :tabs="headerTabs"/></template>
|
<template #header><MkPageHeader v-model:tab="tab" :displayBackButton="true" :tabs="headerTabs"/></template>
|
||||||
<MKSpacer v-if="!(typeof error === 'undefined')" :contentMax="1200">
|
<MKSpacer v-if="!(typeof error === 'undefined')" :contentMax="1200">
|
||||||
<div :class="$style.root">
|
<div :class="$style.root">
|
||||||
<img :class="$style.img" :src="serverErrorImageUrl" class="_ghost"/>
|
<img :class="$style.img" :src="serverErrorImageUrl" class="_ghost"/>
|
||||||
|
|
|
@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<MkStickyContainer>
|
<MkStickyContainer>
|
||||||
<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
|
<template #header><MkPageHeader :actions="headerActions" :displayBackButton="true" :tabs="headerTabs"/></template>
|
||||||
<MkSpacer :contentMax="800">
|
<MkSpacer :contentMax="800">
|
||||||
<MkNotes ref="notes" class="" :pagination="pagination"/>
|
<MkNotes ref="notes" class="" :pagination="pagination"/>
|
||||||
</MkSpacer>
|
</MkSpacer>
|
||||||
|
|
|
@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<MkStickyContainer>
|
<MkStickyContainer>
|
||||||
<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
|
<template #header><MkPageHeader :actions="headerActions" :displayBackButton="true" :tabs="headerTabs"/></template>
|
||||||
<MkSpacer :contentMax="800">
|
<MkSpacer :contentMax="800">
|
||||||
<div ref="rootEl">
|
<div ref="rootEl">
|
||||||
<div v-if="queue > 0" :class="$style.new"><button class="_buttonPrimary" :class="$style.newButton" @click="top()">{{ i18n.ts.newNoteRecived }}</button></div>
|
<div v-if="queue > 0" :class="$style.new"><button class="_buttonPrimary" :class="$style.newButton" @click="top()">{{ i18n.ts.newNoteRecived }}</button></div>
|
||||||
|
|
|
@ -27,13 +27,13 @@ export const getNoteSummary = (note?: Misskey.entities.Note | null): string => {
|
||||||
|
|
||||||
// 本文
|
// 本文
|
||||||
if (note.cw != null) {
|
if (note.cw != null) {
|
||||||
summary += note.cw;
|
summary += `CW: ${note.cw}`;
|
||||||
} else {
|
} else if (note.text) {
|
||||||
summary += note.text ? note.text : '';
|
summary += note.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ファイルが添付されているとき
|
// ファイルが添付されているとき
|
||||||
if ((note.files || []).length !== 0) {
|
if (note.files && note.files.length !== 0) {
|
||||||
summary += ` (${i18n.tsx.withNFiles({ n: note.files.length })})`;
|
summary += ` (${i18n.tsx.withNFiles({ n: note.files.length })})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ export const getNoteSummary = (note?: Misskey.entities.Note | null): string => {
|
||||||
|
|
||||||
// 返信のとき
|
// 返信のとき
|
||||||
if (note.replyId) {
|
if (note.replyId) {
|
||||||
if (note.reply) {
|
if (note.reply && !note.cw) {
|
||||||
summary += `\n\nRE: ${getNoteSummary(note.reply)}`;
|
summary += `\n\nRE: ${getNoteSummary(note.reply)}`;
|
||||||
} else {
|
} else {
|
||||||
summary += '\n\nRE: ...';
|
summary += '\n\nRE: ...';
|
||||||
|
@ -53,7 +53,7 @@ export const getNoteSummary = (note?: Misskey.entities.Note | null): string => {
|
||||||
|
|
||||||
// Renoteのとき
|
// Renoteのとき
|
||||||
if (note.renoteId) {
|
if (note.renoteId) {
|
||||||
if (note.renote) {
|
if (note.renote && !note.cw) {
|
||||||
summary += `\n\nRN: ${getNoteSummary(note.renote)}`;
|
summary += `\n\nRN: ${getNoteSummary(note.renote)}`;
|
||||||
} else {
|
} else {
|
||||||
summary += '\n\nRN: ...';
|
summary += '\n\nRN: ...';
|
||||||
|
|
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div :class="$style.top">
|
<div :class="$style.top">
|
||||||
<div :class="$style.banner" :style="{ backgroundImage: `url(${ instance.bannerUrl })` }"></div>
|
<div :class="$style.banner" :style="{ backgroundImage: `url(${ instance.bannerUrl })` }"></div>
|
||||||
<button class="_button" :class="$style.instance" @click="openInstanceMenu">
|
<button class="_button" :class="$style.instance" @click="openInstanceMenu">
|
||||||
<img :src="instance.iconUrl || instance.faviconUrl || '/favicon.ico'" alt="" :class="$style.instanceIcon"/>
|
<img :src="instance.sidebarLogoUrl || instance.iconUrl || '/apple-touch-icon.png'" alt="" :class="instance.sidebarLogoUrl ? $style.wideInstanceIcon : $style.instanceIcon"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div :class="$style.middle">
|
<div :class="$style.middle">
|
||||||
|
@ -121,6 +121,13 @@ function more() {
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wideInstanceIcon {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 38px;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
.bottom {
|
.bottom {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
|
|
@ -9,7 +9,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div :class="$style.top">
|
<div :class="$style.top">
|
||||||
<div :class="$style.banner" :style="{ backgroundImage: `url(${ instance.bannerUrl })` }"></div>
|
<div :class="$style.banner" :style="{ backgroundImage: `url(${ instance.bannerUrl })` }"></div>
|
||||||
<button v-tooltip.noDelay.right="instance.name ?? i18n.ts.instance" class="_button" :class="$style.instance" @click="openInstanceMenu">
|
<button v-tooltip.noDelay.right="instance.name ?? i18n.ts.instance" class="_button" :class="$style.instance" @click="openInstanceMenu">
|
||||||
<img :src="instance.iconUrl || instance.faviconUrl || '/favicon.ico'" alt="" :class="$style.instanceIcon"/>
|
<img :src="instance.sidebarLogoUrl && !iconOnly ? instance.sidebarLogoUrl : instance.iconUrl || '/apple-touch-icon.png'" alt="" :class="instance.sidebarLogoUrl && !iconOnly ? $style.wideInstanceIcon : $style.instanceIcon"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div :class="$style.middle">
|
<div :class="$style.middle">
|
||||||
|
@ -183,6 +183,13 @@ function more(ev: MouseEvent) {
|
||||||
aspect-ratio: 1;
|
aspect-ratio: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wideInstanceIcon {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 38px;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
.bottom {
|
.bottom {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
|
|
@ -41,7 +41,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
<div class="about">
|
<div class="about">
|
||||||
<button v-click-anime class="item _button" @click="openInstanceMenu">
|
<button v-click-anime class="item _button" @click="openInstanceMenu">
|
||||||
<img :src="instance.iconUrl ?? instance.faviconUrl ?? '/favicon.ico'" class="_ghost"/>
|
<img :src="instance.sidebarLogoUrl && !iconOnly ? instance.sidebarLogoUrl : instance.iconUrl ?? instance.faviconUrl ?? '/favicon.ico'" :class="{ wideIcon: instance.sidebarLogoUrl && !iconOnly }" class="_ghost" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<!--<MisskeyLogo class="misskey"/>-->
|
<!--<MisskeyLogo class="misskey"/>-->
|
||||||
|
@ -180,12 +180,15 @@ watch(defaultStore.reactiveState.menuDisplay, () => {
|
||||||
|
|
||||||
> .item {
|
> .item {
|
||||||
display: block;
|
display: block;
|
||||||
width: 32px;
|
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 32px;
|
||||||
|
&.wideIcon {
|
||||||
|
width: 80%;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5207,6 +5207,7 @@ export type operations = {
|
||||||
infoImageUrl: string | null;
|
infoImageUrl: string | null;
|
||||||
notFoundImageUrl: string | null;
|
notFoundImageUrl: string | null;
|
||||||
iconUrl: string | null;
|
iconUrl: string | null;
|
||||||
|
sidebarLogoUrl: string | null;
|
||||||
app192IconUrl: string | null;
|
app192IconUrl: string | null;
|
||||||
app512IconUrl: string | null;
|
app512IconUrl: string | null;
|
||||||
enableEmail: boolean;
|
enableEmail: boolean;
|
||||||
|
@ -9720,6 +9721,7 @@ export type operations = {
|
||||||
infoImageUrl?: string | null;
|
infoImageUrl?: string | null;
|
||||||
notFoundImageUrl?: string | null;
|
notFoundImageUrl?: string | null;
|
||||||
iconUrl?: string | null;
|
iconUrl?: string | null;
|
||||||
|
sidebarLogoUrl?: string | null;
|
||||||
app192IconUrl?: string | null;
|
app192IconUrl?: string | null;
|
||||||
app512IconUrl?: string | null;
|
app512IconUrl?: string | null;
|
||||||
backgroundImageUrl?: string | null;
|
backgroundImageUrl?: string | null;
|
||||||
|
|
Loading…
Reference in a new issue