Compare commits
16 Commits
12.106.2-s
...
12.107.0-s
Author | SHA1 | Date | |
---|---|---|---|
6e7e11e061 | |||
8d568d533b | |||
348a5f3d7c | |||
2de4978a31 | |||
642a51a558 | |||
1c6ab5447d | |||
e7d6bd19eb | |||
f6e40a9092 | |||
720d5db041 | |||
fd3ce321c5 | |||
7df8cd2b5d | |||
64f4231283 | |||
0589171ceb | |||
3cf9c30974 | |||
c1f0fa5bd6 | |||
b01a0325ba |
19
CHANGELOG.md
19
CHANGELOG.md
@ -10,6 +10,25 @@
|
|||||||
You should also include the user name that made the change.
|
You should also include the user name that made the change.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
## 12.107.0 (2022/02/12)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- クライアント: テーマを追加 @syuilo
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- API: stats APIで内部エラーが発生する問題を修正 @syuilo
|
||||||
|
- クライアント: ソフトミュートですべてがマッチしてしまう場合があるのを修正 @tamaina
|
||||||
|
- クライアント: デバイスのスクリーンのセーフエリアを考慮するように @syuilo
|
||||||
|
- クライアント: 一部環境でサイドバーの投稿ボタンが表示されない問題を修正 @syuilo
|
||||||
|
|
||||||
|
## 12.106.3 (2022/02/11)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
- クライアント: スマートフォンでの余白を調整 @syuilo
|
||||||
|
|
||||||
|
### Bugfixes
|
||||||
|
- クライアント: ノートの詳細が表示されない問題を修正 @syuilo
|
||||||
|
|
||||||
## 12.106.2 (2022/02/11)
|
## 12.106.2 (2022/02/11)
|
||||||
|
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
|
@ -831,6 +831,8 @@ smartphone: "Smartphone"
|
|||||||
tablet: "Tablet"
|
tablet: "Tablet"
|
||||||
auto: "Automatisch"
|
auto: "Automatisch"
|
||||||
themeColor: "Instanzfarbe"
|
themeColor: "Instanzfarbe"
|
||||||
|
size: "Größe"
|
||||||
|
numberOfColumn: "Spaltenanzahl"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "Diese Email-Adresse wird bereits verwendet"
|
used: "Diese Email-Adresse wird bereits verwendet"
|
||||||
format: "Das Format dieser Email-Adresse ist ungültig"
|
format: "Das Format dieser Email-Adresse ist ungültig"
|
||||||
|
@ -829,6 +829,8 @@ smartphone: "Smartphone"
|
|||||||
tablet: "Tablet"
|
tablet: "Tablet"
|
||||||
auto: "Auto"
|
auto: "Auto"
|
||||||
themeColor: "Theme Color"
|
themeColor: "Theme Color"
|
||||||
|
size: "Size"
|
||||||
|
numberOfColumn: "Number of columns"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "This email address is already being used"
|
used: "This email address is already being used"
|
||||||
format: "The format of this email address is invalid"
|
format: "The format of this email address is invalid"
|
||||||
|
@ -830,6 +830,8 @@ smartphone: "Smartfón"
|
|||||||
tablet: "Tablet"
|
tablet: "Tablet"
|
||||||
auto: "Automaticky"
|
auto: "Automaticky"
|
||||||
themeColor: "Farba témy"
|
themeColor: "Farba témy"
|
||||||
|
size: "Veľkosť"
|
||||||
|
numberOfColumn: "Počet stĺpcov"
|
||||||
_emailUnavailable:
|
_emailUnavailable:
|
||||||
used: "Táto emailová adresa sa už používa"
|
used: "Táto emailová adresa sa už používa"
|
||||||
format: "Formát emailovej adresy je nesprávny"
|
format: "Formát emailovej adresy je nesprávny"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "12.106.2",
|
"version": "12.107.0",
|
||||||
"codename": "indigo",
|
"codename": "indigo",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import define from '../define';
|
import define from '../define';
|
||||||
import { NoteReactions, Notes, Users } from '@/models/index';
|
import { Instances, NoteReactions, Notes, Users } from '@/models/index';
|
||||||
import { federationChart, driveChart } from '@/services/chart/index';
|
import { } from '@/services/chart/index';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
requireCredential: false,
|
requireCredential: false,
|
||||||
@ -63,7 +63,7 @@ export default define(meta, async () => {
|
|||||||
Users.count({ where: { host: null }, cache: 3600000 }),
|
Users.count({ where: { host: null }, cache: 3600000 }),
|
||||||
NoteReactions.count({ cache: 3600000 }), // 1 hour
|
NoteReactions.count({ cache: 3600000 }), // 1 hour
|
||||||
//NoteReactions.count({ where: { userHost: null }, cache: 3600000 }),
|
//NoteReactions.count({ where: { userHost: null }, cache: 3600000 }),
|
||||||
federationChart.getChart('hour', 1, null).then(chart => chart.instance.total[0]),
|
Instances.count({ cache: 3600000 }),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { deviceKind } from '@/scripts/device-kind';
|
||||||
import { defineComponent, inject, onMounted, onUnmounted, ref } from 'vue';
|
import { defineComponent, inject, onMounted, onUnmounted, ref } from 'vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -35,7 +36,7 @@ export default defineComponent({
|
|||||||
const margin = ref(0);
|
const margin = ref(0);
|
||||||
const shouldSpacerMin = inject('shouldSpacerMin', false);
|
const shouldSpacerMin = inject('shouldSpacerMin', false);
|
||||||
const adjust = (rect: { width: number; height: number; }) => {
|
const adjust = (rect: { width: number; height: number; }) => {
|
||||||
if (shouldSpacerMin) {
|
if (shouldSpacerMin || deviceKind === 'smartphone') {
|
||||||
margin.value = props.marginMin;
|
margin.value = props.marginMin;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -154,11 +154,13 @@ const props = defineProps<{
|
|||||||
|
|
||||||
const inChannel = inject('inChannel', null);
|
const inChannel = inject('inChannel', null);
|
||||||
|
|
||||||
|
const note = $ref(JSON.parse(JSON.stringify(props.note)));
|
||||||
|
|
||||||
const isRenote = (
|
const isRenote = (
|
||||||
props.note.renote != null &&
|
note.renote != null &&
|
||||||
props.note.text == null &&
|
note.text == null &&
|
||||||
props.note.fileIds.length === 0 &&
|
note.fileIds.length === 0 &&
|
||||||
props.note.poll == null
|
note.poll == null
|
||||||
);
|
);
|
||||||
|
|
||||||
const el = ref<HTMLElement>();
|
const el = ref<HTMLElement>();
|
||||||
@ -166,8 +168,8 @@ const menuButton = ref<HTMLElement>();
|
|||||||
const renoteButton = ref<InstanceType<typeof XRenoteButton>>();
|
const renoteButton = ref<InstanceType<typeof XRenoteButton>>();
|
||||||
const renoteTime = ref<HTMLElement>();
|
const renoteTime = ref<HTMLElement>();
|
||||||
const reactButton = ref<HTMLElement>();
|
const reactButton = ref<HTMLElement>();
|
||||||
let appearNote = $ref(isRenote ? props.note.renote as misskey.entities.Note : props.note);
|
let appearNote = $ref(isRenote ? note.renote as misskey.entities.Note : note);
|
||||||
const isMyRenote = $i && ($i.id === props.note.userId);
|
const isMyRenote = $i && ($i.id === note.userId);
|
||||||
const showContent = ref(false);
|
const showContent = ref(false);
|
||||||
const isDeleted = ref(false);
|
const isDeleted = ref(false);
|
||||||
const muted = ref(checkWordMute(appearNote, $i, defaultStore.state.mutedWords));
|
const muted = ref(checkWordMute(appearNote, $i, defaultStore.state.mutedWords));
|
||||||
@ -188,8 +190,9 @@ const keymap = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
useNoteCapture({
|
useNoteCapture({
|
||||||
appearNote: $$(appearNote),
|
|
||||||
rootEl: el,
|
rootEl: el,
|
||||||
|
note: $$(appearNote),
|
||||||
|
isDeletedRef: isDeleted,
|
||||||
});
|
});
|
||||||
|
|
||||||
function reply(viaKeyboard = false): void {
|
function reply(viaKeyboard = false): void {
|
||||||
@ -237,12 +240,12 @@ function onContextmenu(ev: MouseEvent): void {
|
|||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
react();
|
react();
|
||||||
} else {
|
} else {
|
||||||
os.contextMenu(getNoteMenu({ note: props.note, translating, translation, menuButton }), ev).then(focus);
|
os.contextMenu(getNoteMenu({ note: note, translating, translation, menuButton }), ev).then(focus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function menu(viaKeyboard = false): void {
|
function menu(viaKeyboard = false): void {
|
||||||
os.popupMenu(getNoteMenu({ note: props.note, translating, translation, menuButton }), menuButton.value, {
|
os.popupMenu(getNoteMenu({ note: note, translating, translation, menuButton }), menuButton.value, {
|
||||||
viaKeyboard
|
viaKeyboard
|
||||||
}).then(focus);
|
}).then(focus);
|
||||||
}
|
}
|
||||||
@ -255,7 +258,7 @@ function showRenoteMenu(viaKeyboard = false): void {
|
|||||||
danger: true,
|
danger: true,
|
||||||
action: () => {
|
action: () => {
|
||||||
os.api('notes/delete', {
|
os.api('notes/delete', {
|
||||||
noteId: props.note.id
|
noteId: note.id
|
||||||
});
|
});
|
||||||
isDeleted.value = true;
|
isDeleted.value = true;
|
||||||
}
|
}
|
||||||
|
@ -180,7 +180,7 @@ const keymap = {
|
|||||||
useNoteCapture({
|
useNoteCapture({
|
||||||
rootEl: el,
|
rootEl: el,
|
||||||
note: $$(appearNote),
|
note: $$(appearNote),
|
||||||
isDeletedRef: $$(isDeleted),
|
isDeletedRef: isDeleted,
|
||||||
});
|
});
|
||||||
|
|
||||||
function reply(viaKeyboard = false): void {
|
function reply(viaKeyboard = false): void {
|
||||||
|
@ -180,12 +180,12 @@ const setPosition = () => {
|
|||||||
el.value.style.top = top + 'px';
|
el.value.style.top = top + 'px';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let loopHandler;
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
setPosition();
|
setPosition();
|
||||||
|
|
||||||
let loopHandler;
|
|
||||||
|
|
||||||
const loop = () => {
|
const loop = () => {
|
||||||
loopHandler = window.requestAnimationFrame(() => {
|
loopHandler = window.requestAnimationFrame(() => {
|
||||||
setPosition();
|
setPosition();
|
||||||
@ -194,12 +194,12 @@ onMounted(() => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
loop();
|
loop();
|
||||||
|
|
||||||
onUnmounted(() => {
|
|
||||||
window.cancelAnimationFrame(loopHandler);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
window.cancelAnimationFrame(loopHandler);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@ -95,8 +95,7 @@ window.addEventListener('resize', () => {
|
|||||||
if (['smartphone', 'tablet'].includes(deviceKind)) {
|
if (['smartphone', 'tablet'].includes(deviceKind)) {
|
||||||
const viewport = document.getElementsByName('viewport').item(0);
|
const viewport = document.getElementsByName('viewport').item(0);
|
||||||
viewport.setAttribute('content',
|
viewport.setAttribute('content',
|
||||||
`${viewport.getAttribute('content')},minimum-scale=1,maximum-scale=1,user-scalable=no`);
|
`${viewport.getAttribute('content')}, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover`);
|
||||||
document.head.appendChild(viewport);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//#region Set lang attr
|
//#region Set lang attr
|
||||||
|
@ -7,7 +7,11 @@ export function checkWordMute(note: Record<string, any>, me: Record<string, any>
|
|||||||
|
|
||||||
const matched = mutedWords.some(filter => {
|
const matched = mutedWords.some(filter => {
|
||||||
if (Array.isArray(filter)) {
|
if (Array.isArray(filter)) {
|
||||||
return filter.every(keyword => note.text!.includes(keyword));
|
// Clean up
|
||||||
|
const filteredFilter = filter.filter(keyword => keyword !== '');
|
||||||
|
if (filteredFilter.length === 0) return false;
|
||||||
|
|
||||||
|
return filteredFilter.every(keyword => note.text!.includes(keyword));
|
||||||
} else {
|
} else {
|
||||||
// represents RegExp
|
// represents RegExp
|
||||||
const regexp = filter.match(/^\/(.+)\/(.*)$/);
|
const regexp = filter.match(/^\/(.+)\/(.*)$/);
|
||||||
|
@ -20,6 +20,7 @@ export const builtinThemes = [
|
|||||||
require('@/themes/l-apricot.json5'),
|
require('@/themes/l-apricot.json5'),
|
||||||
require('@/themes/l-rainy.json5'),
|
require('@/themes/l-rainy.json5'),
|
||||||
require('@/themes/l-vivid.json5'),
|
require('@/themes/l-vivid.json5'),
|
||||||
|
require('@/themes/l-cherry.json5'),
|
||||||
require('@/themes/l-sushi.json5'),
|
require('@/themes/l-sushi.json5'),
|
||||||
|
|
||||||
require('@/themes/d-dark.json5'),
|
require('@/themes/d-dark.json5'),
|
||||||
@ -27,6 +28,7 @@ export const builtinThemes = [
|
|||||||
require('@/themes/d-astro.json5'),
|
require('@/themes/d-astro.json5'),
|
||||||
require('@/themes/d-future.json5'),
|
require('@/themes/d-future.json5'),
|
||||||
require('@/themes/d-botanical.json5'),
|
require('@/themes/d-botanical.json5'),
|
||||||
|
require('@/themes/d-cherry.json5'),
|
||||||
require('@/themes/d-pumpkin.json5'),
|
require('@/themes/d-pumpkin.json5'),
|
||||||
require('@/themes/d-black.json5'),
|
require('@/themes/d-black.json5'),
|
||||||
] as Theme[];
|
] as Theme[];
|
||||||
|
20
packages/client/src/themes/d-cherry.json5
Normal file
20
packages/client/src/themes/d-cherry.json5
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
id: '679b3b87-a4e9-4789-8696-b56c15cc33b0',
|
||||||
|
|
||||||
|
name: 'Mi Cherry Dark',
|
||||||
|
author: 'syuilo',
|
||||||
|
|
||||||
|
base: 'dark',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
accent: 'rgb(255, 89, 117)',
|
||||||
|
bg: 'rgb(28, 28, 37)',
|
||||||
|
fg: 'rgb(236, 239, 244)',
|
||||||
|
panel: 'rgb(35, 35, 47)',
|
||||||
|
renote: '@accent',
|
||||||
|
link: '@accent',
|
||||||
|
mention: '@accent',
|
||||||
|
hashtag: '@accent',
|
||||||
|
divider: 'rgb(63, 63, 80)',
|
||||||
|
},
|
||||||
|
}
|
21
packages/client/src/themes/l-cherry.json5
Normal file
21
packages/client/src/themes/l-cherry.json5
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
id: 'ac168876-f737-4074-a3fc-a370c732ef48',
|
||||||
|
|
||||||
|
name: 'Mi Cherry Light',
|
||||||
|
author: 'syuilo',
|
||||||
|
|
||||||
|
base: 'light',
|
||||||
|
|
||||||
|
props: {
|
||||||
|
accent: 'rgb(219, 96, 114)',
|
||||||
|
bg: 'rgb(254, 248, 249)',
|
||||||
|
fg: 'rgb(152, 13, 26)',
|
||||||
|
panel: 'rgb(255, 255, 255)',
|
||||||
|
renote: '@accent',
|
||||||
|
link: 'rgb(156, 187, 5)',
|
||||||
|
mention: '@accent',
|
||||||
|
hashtag: '@accent',
|
||||||
|
divider: 'rgba(134, 51, 51, 0.1)',
|
||||||
|
inputBorderHover: 'rgb(238, 221, 222)',
|
||||||
|
},
|
||||||
|
}
|
@ -305,7 +305,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
&.post:before {
|
&.post:before {
|
||||||
width: calc(100% - 28px);
|
width: calc(100% - 28px);
|
||||||
height: min-content;
|
height: auto;
|
||||||
aspect-ratio: 1/1;
|
aspect-ratio: 1/1;
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
}
|
}
|
||||||
|
@ -276,7 +276,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
font-size: 22px;
|
font-size: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:disabled {
|
&:disabled {
|
||||||
|
@ -340,13 +340,14 @@ const wallpaper = localStorage.getItem('wallpaper') != null;
|
|||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
padding: 16px;
|
padding: 16px 16px calc(env(safe-area-inset-bottom, 0px) + 16px) 16px;
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
-webkit-backdrop-filter: var(--blur, blur(32px));
|
-webkit-backdrop-filter: var(--blur, blur(32px));
|
||||||
backdrop-filter: var(--blur, blur(32px));
|
backdrop-filter: var(--blur, blur(32px));
|
||||||
background-color: var(--header);
|
background-color: var(--header);
|
||||||
|
border-top: solid 0.5px var(--divider);
|
||||||
|
|
||||||
> .button {
|
> .button {
|
||||||
position: relative;
|
position: relative;
|
||||||
@ -392,7 +393,7 @@ const wallpaper = localStorage.getItem('wallpaper') != null;
|
|||||||
}
|
}
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
font-size: 22px;
|
font-size: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:disabled {
|
&:disabled {
|
||||||
|
Reference in New Issue
Block a user