diff --git a/CHANGELOG.md b/CHANGELOG.md
index b445c47625..158b10e321 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,23 @@
-->
+## 12.x.x (unreleased)
+
+### Improvements
+- API: /antennas/notes API で日付による絞り込みができるように
+- クライアント: アンケートに投票する際に確認ダイアログを出すように
+- クライアント: Renoteなノート詳細ページから元のノートページに遷移できるように
+
+### Bugfixes
+- クライアント: ログインにおいてパスワードが誤っている際のエラーメッセージが正しく表示されない問題を修正
+- クライアント: リアクションツールチップ、Renoteツールチップのユーザーの並び順を修正
+- クライアント: サウンドのマスターボリュームが正しく保存されない問題を修正
+- クライアント: 一部環境において通知が表示されると操作不能になる問題を修正
+- クライアント: モバイルでタップしたときにツールチップが表示される問題を修正
+
+### Changes
+- クライアント: ノートにモデレーターバッジを表示するのを廃止
+
## 12.97.0 (2021/11/19)
### Improvements
diff --git a/README.md b/README.md
index ce94a054ce..799be299d5 100644
--- a/README.md
+++ b/README.md
@@ -1,116 +1,57 @@
[![Misskey](https://github.com/misskey-dev/assets/blob/main/banner.png?raw=true)](https://join.misskey.page/)
-
Misskey
-
-[![Dependencies](https://img.shields.io/david/misskey-dev/misskey.svg?style=for-the-badge&logo=npm)](https://david-dm.org/misskey-dev/misskey)
-[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge&logo=github)](http://makeapullrequest.com)
-[![Awesome Humane Tech](https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true)](https://github.com/humanetech-community/awesome-humane-tech)
+**🌎 A forever evolving, interplanetary microblogging platform. 🚀**
-**A forever evolving, interplanetary microblogging platform.**
+**Misskey** is a distributed microblogging platform with advanced features such as Reactions and a highly customizable UI.
-
Misskey is a decentralized microblogging platform born on Earth.
-Since it exists within the Fediverse (a universe where various social media platforms are organized),
-it is mutually linked with other social media platforms.
-Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?
Find an instance!
+[Learn more](https://misskey-hub.net/)
+
+---
+
+[✨ Find an instance](https://misskey-hub.net/instances.html)
+•
+[📦 Create your own instance](https://misskey-hub.net/docs/install.html)
+•
+[🛠️ Contribute](./CONTRIBUTING.md)
+•
+[🚀 Join the community](https://discord.gg/Wp8gVStHW3)
+
+---
----
+
-Do you have a question? Or are you experiencing trouble?
-Visit [our forum](https://forum.misskey.io/)!
+
----
+## ✨ Features
+- **ActivityPub support**\
+ It is possible to interact with other software.
+- **Reactions**\
+ You can add "reactions" to each post, making it easy for you to express your feelings.
+- **Drive**\
+ An interface to manage uploaded files such as images, videos, sounds, etc.
+ You can also organize your favorite content into folders, making it easy to share again.
+- **Rich Web UI**\
+ Misskey has a rich WebUI by default.
+ It is highly customizable by flexibly changing the layout and installing various widgets and themes.
+ Furthermore, plug-ins can be created using AiScript, a original programming language.
+- and more...
-![](https://ja.mstdn.wiki/images/e/ed/Deck.jpg)
+
-:sparkles: Features
-----------------------------------------------------------------
-
+
-Posting
-
-Post your ideas, discussion topics, fun moments, or anything else you want to share! Misskey supports text, emoji, pictures, videos, and polls!
-
-
----
-
-Reactions
-
-Reactions are the simplest way to respond to others' posts. Simply pick a reaction emote from the list! Reactions on Misskey are much more expressive than other social media services which only allow “liking”.
-
-
----
-
-Interface
-
-Customize the UI to your own tastes! No UI will work for everyone, so Misskey is completely customizable. Make Misskey *yours* by editing the style, adjusting timeline layouts, and placing widgets.
-
-
----
-
-Misskey Drive
-
-Organize and store your files! Want to post a picture you have already uploaded? Wish you could organize your files into folders? Misskey Drive is a solution!
-
-
----
-
-...and more!
-
-:package: Create your own instance
-----------------------------------------------------------------
-Please see the [Setup and Installation Guide](https://misskey-hub.net/docs/install/install.html).
-
-:wrench: Contribution
-----------------------------------------------------------------
-Please see the [Contribution Guide](./CONTRIBUTING.md).
-
-### Collaborators
-
-
----
-
-To receive updates of this repo, follow [@repo@misskey.io](https://misskey.io/@repo) on fediverse.
-
-Related projects
-----------------------------------------------------------------
-- [misskey.js](https://github.com/misskey-dev/misskey.js) - Misskey SDK for JavaScript
-- [mfm.js](https://github.com/misskey-dev/mfm.js) - MFM parser
-
-Sponsors
-----------------------------------------------------------------
+## Sponsors
-:heart: Backers
-----------------------------------------------------------------
+## Backers
diff --git a/locales/en-US.yml b/locales/en-US.yml
index 37da6fdc95..c5c8afb50f 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -931,6 +931,8 @@ _mfm:
rainbowDescription: "Makes the content appear in rainbow colors."
sparkle: "Sparkle"
sparkleDescription: "Gives content a sparkling particle effect."
+ rotate: "Rotate"
+ rotateDescription: "Rotates the content by 90 degrees"
_reversi:
reversi: "Reversi"
gameSettings: "Game settings"
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 9877248eb3..d5fcd2d406 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -808,6 +808,8 @@ ffVisibility: "つながりの公開範囲"
ffVisibilityDescription: "自分のフォロー/フォロワー情報の公開範囲を設定できます。"
continueThread: "さらにスレッドを見る"
deleteAccountConfirm: "アカウントが削除されます。よろしいですか?"
+incorrectPassword: "パスワードが間違っています。"
+voteConfirm: "「{choice}」に投票しますか?"
_emailUnavailable:
used: "既に使用されています"
@@ -823,7 +825,7 @@ _ffVisibility:
_signup:
almostThere: "ほとんど完了です"
- emailAddressInfo: "あなたが使っているメールアドレスを入力してください。"
+ emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。"
_accountDelete:
@@ -944,6 +946,8 @@ _mfm:
rainbowDescription: "内容をレインボーにします。"
sparkle: "キラキラ"
sparkleDescription: "キラキラしたパーティクルのエフェクトを追加します。"
+ rotate: "回転"
+ rotateDescription: "指定した角度で回転させます。"
_reversi:
reversi: "リバーシ"
diff --git a/packages/backend/src/server/api/endpoints/antennas/notes.ts b/packages/backend/src/server/api/endpoints/antennas/notes.ts
index 1759e95b4c..02fec2778b 100644
--- a/packages/backend/src/server/api/endpoints/antennas/notes.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/notes.ts
@@ -33,6 +33,14 @@ export const meta = {
untilId: {
validator: $.optional.type(ID),
},
+
+ sinceDate: {
+ validator: $.optional.num,
+ },
+
+ untilDate: {
+ validator: $.optional.num,
+ },
},
errors: {
@@ -68,7 +76,8 @@ export default define(meta, async (ps, user) => {
.select('joining.noteId')
.where('joining.antennaId = :antennaId', { antennaId: antenna.id });
- const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
+ const query = makePaginationQuery(Notes.createQueryBuilder('note'),
+ ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere(`note.id IN (${ antennaQuery.getQuery() })`)
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('note.reply', 'reply')
diff --git a/packages/backend/tools/accept-migration.ts b/packages/backend/src/tools/accept-migration.ts
similarity index 100%
rename from packages/backend/tools/accept-migration.ts
rename to packages/backend/src/tools/accept-migration.ts
diff --git a/packages/backend/tools/add-emoji.ts b/packages/backend/src/tools/add-emoji.ts
similarity index 83%
rename from packages/backend/tools/add-emoji.ts
rename to packages/backend/src/tools/add-emoji.ts
index 9ffe7dfa81..6c750bcab0 100644
--- a/packages/backend/tools/add-emoji.ts
+++ b/packages/backend/src/tools/add-emoji.ts
@@ -1,7 +1,10 @@
-import { Emojis } from '@/models/index';
+import { initDb } from '@/db/postgre';
import { genId } from '@/misc/gen-id';
async function main(name: string, url: string, alias?: string): Promise {
+ await initDb();
+ const { Emojis } = await import('@/models/index');
+
const aliases = alias != null ? [ alias ] : [];
await Emojis.save({
diff --git a/packages/backend/tools/demote-admin.ts b/packages/backend/src/tools/demote-admin.ts
similarity index 81%
rename from packages/backend/tools/demote-admin.ts
rename to packages/backend/src/tools/demote-admin.ts
index d7c6d1cec2..b326c946ef 100644
--- a/packages/backend/tools/demote-admin.ts
+++ b/packages/backend/src/tools/demote-admin.ts
@@ -1,13 +1,11 @@
import { initDb } from '../db/postgre';
-import { getRepository } from 'typeorm';
-import { User } from '@/models/entities/user';
async function main(username: string) {
if (!username) throw `username required`;
username = username.replace(/^@/, '');
await initDb();
- const Users = getRepository(User);
+ const { Users } = await import('@/models/index');
const res = await Users.update({
usernameLower: username.toLowerCase(),
diff --git a/packages/backend/tools/mark-admin.ts b/packages/backend/src/tools/mark-admin.ts
similarity index 81%
rename from packages/backend/tools/mark-admin.ts
rename to packages/backend/src/tools/mark-admin.ts
index 62ed0f09ee..0833f22266 100644
--- a/packages/backend/tools/mark-admin.ts
+++ b/packages/backend/src/tools/mark-admin.ts
@@ -1,13 +1,11 @@
import { initDb } from '../db/postgre';
-import { getRepository } from 'typeorm';
-import { User } from '@/models/entities/user';
async function main(username: string) {
if (!username) throw `username required`;
username = username.replace(/^@/, '');
await initDb();
- const Users = getRepository(User);
+ const { Users } = await import('@/models/index');
const res = await Users.update({
usernameLower: username.toLowerCase(),
diff --git a/packages/backend/tools/refresh-question.ts b/packages/backend/src/tools/refresh-question.ts
similarity index 63%
rename from packages/backend/tools/refresh-question.ts
rename to packages/backend/src/tools/refresh-question.ts
index 98a3c2865f..3bbb781ae7 100644
--- a/packages/backend/tools/refresh-question.ts
+++ b/packages/backend/src/tools/refresh-question.ts
@@ -1,6 +1,9 @@
-import { updateQuestion } from '@/remote/activitypub/models/question';
+import { initDb } from '@/db/postgre';
async function main(uri: string): Promise {
+ await initDb();
+ const { updateQuestion } = await import('@/remote/activitypub/models/question');
+
return await updateQuestion(uri);
}
diff --git a/packages/backend/tools/resync-remote-user.ts b/packages/backend/src/tools/resync-remote-user.ts
similarity index 100%
rename from packages/backend/tools/resync-remote-user.ts
rename to packages/backend/src/tools/resync-remote-user.ts
diff --git a/packages/backend/tools/show-signin-history.ts b/packages/backend/src/tools/show-signin-history.ts
similarity index 91%
rename from packages/backend/tools/show-signin-history.ts
rename to packages/backend/src/tools/show-signin-history.ts
index ad92316314..1291a1b22f 100644
--- a/packages/backend/tools/show-signin-history.ts
+++ b/packages/backend/src/tools/show-signin-history.ts
@@ -1,4 +1,4 @@
-import { Users, Signins } from '@/models/index';
+import { initDb } from '@/db/postgre';
// node built/tools/show-signin-history username
// => {Success} {Date} {IPAddrsss}
@@ -10,6 +10,9 @@ import { Users, Signins } from '@/models/index';
// with full request headers
async function main(username: string, headers?: string[]) {
+ await initDb();
+ const { Users, Signins } = await import('@/models/index');
+
const user = await Users.findOne({
host: null,
usernameLower: username.toLowerCase(),
diff --git a/packages/backend/tools/accept-migration.js b/packages/backend/tools/accept-migration.js
deleted file mode 100644
index 309a4ab5e3..0000000000
--- a/packages/backend/tools/accept-migration.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-// ex) node built/tools/accept-migration Yo 1000000000001
-Object.defineProperty(exports, "__esModule", { value: true });
-const typeorm_1 = require("typeorm");
-const index_1 = require("@/config/index");
-(0, typeorm_1.createConnection)({
- type: 'postgres',
- host: index_1.default.db.host,
- port: index_1.default.db.port,
- username: index_1.default.db.user,
- password: index_1.default.db.pass,
- database: index_1.default.db.db,
- extra: index_1.default.db.extra,
- synchronize: false,
- dropSchema: false,
-}).then(c => {
- c.query(`INSERT INTO migrations(timestamp,name) VALUES (${process.argv[3]}, '${process.argv[2]}${process.argv[3]}');`).then(() => {
- console.log('done');
- process.exit(0);
- }).catch(e => {
- console.log('ERROR:');
- console.log(e);
- process.exit(1);
- });
-});
-//# sourceMappingURL=accept-migration.js.map
\ No newline at end of file
diff --git a/packages/backend/tools/accept-migration.js.map b/packages/backend/tools/accept-migration.js.map
deleted file mode 100644
index c158a49661..0000000000
--- a/packages/backend/tools/accept-migration.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"accept-migration.js","sourceRoot":"","sources":["accept-migration.ts"],"names":[],"mappings":";AAAA,yDAAyD;;AAEzD,qCAA2C;AAC3C,0CAAoC;AAEpC,IAAA,0BAAgB,EAAC;IAChB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,eAAM,CAAC,EAAE,CAAC,IAAI;IACpB,IAAI,EAAE,eAAM,CAAC,EAAE,CAAC,IAAI;IACpB,QAAQ,EAAE,eAAM,CAAC,EAAE,CAAC,IAAI;IACxB,QAAQ,EAAE,eAAM,CAAC,EAAE,CAAC,IAAI;IACxB,QAAQ,EAAE,eAAM,CAAC,EAAE,CAAC,EAAE;IACtB,KAAK,EAAE,eAAM,CAAC,EAAE,CAAC,KAAK;IACtB,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;CACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;IACX,CAAC,CAAC,KAAK,CAAC,kDAAkD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;QAChI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACZ,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/packages/backend/tools/add-emoji.js b/packages/backend/tools/add-emoji.js
deleted file mode 100644
index df02f554a5..0000000000
--- a/packages/backend/tools/add-emoji.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const index_1 = require("@/models/index");
-const gen_id_1 = require("@/misc/gen-id");
-async function main(name, url, alias) {
- const aliases = alias != null ? [alias] : [];
- await index_1.Emojis.save({
- id: (0, gen_id_1.genId)(),
- host: null,
- name,
- url,
- aliases,
- updatedAt: new Date()
- });
-}
-const args = process.argv.slice(2);
-const name = args[0];
-const url = args[1];
-if (!name)
- throw new Error('require name');
-if (!url)
- throw new Error('require url');
-main(name, url).then(() => {
- console.log('success');
- process.exit(0);
-}).catch(e => {
- console.warn(e);
- process.exit(1);
-});
-//# sourceMappingURL=add-emoji.js.map
\ No newline at end of file
diff --git a/packages/backend/tools/add-emoji.js.map b/packages/backend/tools/add-emoji.js.map
deleted file mode 100644
index 03bf31b984..0000000000
--- a/packages/backend/tools/add-emoji.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"add-emoji.js","sourceRoot":"","sources":["add-emoji.ts"],"names":[],"mappings":";;AAAA,0CAAwC;AACxC,0CAAsC;AAEtC,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,GAAW,EAAE,KAAc;IAC5D,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAE,KAAK,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,MAAM,cAAM,CAAC,IAAI,CAAC;QACjB,EAAE,EAAE,IAAA,cAAK,GAAE;QACX,IAAI,EAAE,IAAI;QACV,IAAI;QACJ,GAAG;QACH,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE;KACrB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACrB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAEpB,IAAI,CAAC,IAAI;IAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;AAC3C,IAAI,CAAC,GAAG;IAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AAEzC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/packages/backend/tools/demote-admin.js b/packages/backend/tools/demote-admin.js
deleted file mode 100644
index d6a296883a..0000000000
--- a/packages/backend/tools/demote-admin.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const postgre_1 = require("../db/postgre");
-const typeorm_1 = require("typeorm");
-const user_1 = require("@/models/entities/user");
-async function main(username) {
- if (!username)
- throw `username required`;
- username = username.replace(/^@/, '');
- await (0, postgre_1.initDb)();
- const Users = (0, typeorm_1.getRepository)(user_1.User);
- const res = await Users.update({
- usernameLower: username.toLowerCase(),
- host: null
- }, {
- isAdmin: false
- });
- if (res.affected !== 1) {
- throw 'Failed';
- }
-}
-const args = process.argv.slice(2);
-main(args[0]).then(() => {
- console.log('Success');
- process.exit(0);
-}).catch(e => {
- console.error(`Error: ${e.message || e}`);
- process.exit(1);
-});
-//# sourceMappingURL=demote-admin.js.map
\ No newline at end of file
diff --git a/packages/backend/tools/demote-admin.js.map b/packages/backend/tools/demote-admin.js.map
deleted file mode 100644
index 4403e2bab0..0000000000
--- a/packages/backend/tools/demote-admin.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"demote-admin.js","sourceRoot":"","sources":["demote-admin.ts"],"names":[],"mappings":";;AAAA,2CAAuC;AACvC,qCAAwC;AACxC,iDAA8C;AAE9C,KAAK,UAAU,IAAI,CAAC,QAAgB;IACnC,IAAI,CAAC,QAAQ;QAAE,MAAM,mBAAmB,CAAC;IACzC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtC,MAAM,IAAA,gBAAM,GAAE,CAAC;IACf,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,WAAI,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAC9B,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE;QACrC,IAAI,EAAE,IAAI;KACV,EAAE;QACF,OAAO,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE;QACvB,MAAM,QAAQ,CAAC;KACf;AACF,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACZ,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/packages/backend/tools/mark-admin.js b/packages/backend/tools/mark-admin.js
deleted file mode 100644
index 4563d9c332..0000000000
--- a/packages/backend/tools/mark-admin.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const postgre_1 = require("../db/postgre");
-const typeorm_1 = require("typeorm");
-const user_1 = require("@/models/entities/user");
-async function main(username) {
- if (!username)
- throw `username required`;
- username = username.replace(/^@/, '');
- await (0, postgre_1.initDb)();
- const Users = (0, typeorm_1.getRepository)(user_1.User);
- const res = await Users.update({
- usernameLower: username.toLowerCase(),
- host: null
- }, {
- isAdmin: true
- });
- if (res.affected !== 1) {
- throw 'Failed';
- }
-}
-const args = process.argv.slice(2);
-main(args[0]).then(() => {
- console.log('Success');
- process.exit(0);
-}).catch(e => {
- console.error(`Error: ${e.message || e}`);
- process.exit(1);
-});
-//# sourceMappingURL=mark-admin.js.map
\ No newline at end of file
diff --git a/packages/backend/tools/mark-admin.js.map b/packages/backend/tools/mark-admin.js.map
deleted file mode 100644
index 5633e2f894..0000000000
--- a/packages/backend/tools/mark-admin.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mark-admin.js","sourceRoot":"","sources":["mark-admin.ts"],"names":[],"mappings":";;AAAA,2CAAuC;AACvC,qCAAwC;AACxC,iDAA8C;AAE9C,KAAK,UAAU,IAAI,CAAC,QAAgB;IACnC,IAAI,CAAC,QAAQ;QAAE,MAAM,mBAAmB,CAAC;IACzC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtC,MAAM,IAAA,gBAAM,GAAE,CAAC;IACf,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,WAAI,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAC9B,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE;QACrC,IAAI,EAAE,IAAI;KACV,EAAE;QACF,OAAO,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE;QACvB,MAAM,QAAQ,CAAC;KACf;AACF,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACZ,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/packages/backend/tools/refresh-question.js b/packages/backend/tools/refresh-question.js
deleted file mode 100644
index 0536c38207..0000000000
--- a/packages/backend/tools/refresh-question.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const question_1 = require("@/remote/activitypub/models/question");
-async function main(uri) {
- return await (0, question_1.updateQuestion)(uri);
-}
-const args = process.argv.slice(2);
-const uri = args[0];
-main(uri).then(result => {
- console.log(`Done: ${result}`);
-}).catch(e => {
- console.warn(e);
-});
-//# sourceMappingURL=refresh-question.js.map
\ No newline at end of file
diff --git a/packages/backend/tools/refresh-question.js.map b/packages/backend/tools/refresh-question.js.map
deleted file mode 100644
index 3db6d0b8bb..0000000000
--- a/packages/backend/tools/refresh-question.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"refresh-question.js","sourceRoot":"","sources":["refresh-question.ts"],"names":[],"mappings":";;AAAA,mEAAsE;AAEtE,KAAK,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,MAAM,IAAA,yBAAc,EAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAEpB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;IACvB,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/packages/backend/tools/resync-remote-user.js b/packages/backend/tools/resync-remote-user.js
deleted file mode 100644
index 05d76ecc97..0000000000
--- a/packages/backend/tools/resync-remote-user.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const postgre_1 = require("@/db/postgre");
-const Acct = require("misskey-js/built/acct");
-async function main(acct) {
- await (0, postgre_1.initDb)();
- const { resolveUser } = await Promise.resolve().then(() => require('@/remote/resolve-user'));
- const { username, host } = Acct.parse(acct);
- await resolveUser(username, host, {}, true);
-}
-// get args
-const args = process.argv.slice(2);
-let acct = args[0];
-// normalize args
-acct = acct.replace(/^@/, '');
-// check args
-if (!acct.match(/^\w+@\w/)) {
- throw `Invalid acct format. Valid format are user@host`;
-}
-console.log(`resync ${acct}`);
-main(acct).then(() => {
- console.log('Done');
-}).catch(e => {
- console.warn(e);
-});
-//# sourceMappingURL=resync-remote-user.js.map
\ No newline at end of file
diff --git a/packages/backend/tools/resync-remote-user.js.map b/packages/backend/tools/resync-remote-user.js.map
deleted file mode 100644
index 456d7da1d1..0000000000
--- a/packages/backend/tools/resync-remote-user.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"resync-remote-user.js","sourceRoot":"","sources":["resync-remote-user.ts"],"names":[],"mappings":";;AAAA,0CAAsC;AACtC,8CAA8C;AAE9C,KAAK,UAAU,IAAI,CAAC,IAAY;IAC/B,MAAM,IAAA,gBAAM,GAAE,CAAC;IACf,MAAM,EAAE,WAAW,EAAE,GAAG,2CAAa,uBAAuB,EAAC,CAAC;IAE9D,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,WAAW;AACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAEnB,iBAAiB;AACjB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAE9B,aAAa;AACb,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;IAC3B,MAAM,iDAAiD,CAAC;CACxD;AAED,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;AAE9B,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/packages/backend/tools/show-signin-history.js b/packages/backend/tools/show-signin-history.js
deleted file mode 100644
index daeea84613..0000000000
--- a/packages/backend/tools/show-signin-history.js
+++ /dev/null
@@ -1,47 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const index_1 = require("@/models/index");
-// node built/tools/show-signin-history username
-// => {Success} {Date} {IPAddrsss}
-// node built/tools/show-signin-history username user-agent,x-forwarded-for
-// with user-agent and x-forwarded-for
-// node built/tools/show-signin-history username all
-// with full request headers
-async function main(username, headers) {
- const user = await index_1.Users.findOne({
- host: null,
- usernameLower: username.toLowerCase(),
- });
- if (user == null)
- throw new Error('User not found');
- const history = await index_1.Signins.find({
- userId: user.id
- });
- for (const signin of history) {
- console.log(`${signin.success ? 'OK' : 'NG'} ${signin.createdAt ? signin.createdAt.toISOString() : 'Unknown'} ${signin.ip}`);
- // headers
- if (headers != null) {
- for (const key of Object.keys(signin.headers)) {
- if (headers.includes('all') || headers.includes(key)) {
- console.log(` ${key}: ${signin.headers[key]}`);
- }
- }
- }
- }
-}
-// get args
-const args = process.argv.slice(2);
-let username = args[0];
-let headers;
-if (args[1] != null) {
- headers = args[1].split(/,/).map(header => header.toLowerCase());
-}
-// normalize args
-username = username.replace(/^@/, '');
-main(username, headers).then(() => {
- process.exit(0);
-}).catch(e => {
- console.warn(e);
- process.exit(1);
-});
-//# sourceMappingURL=show-signin-history.js.map
\ No newline at end of file
diff --git a/packages/backend/tools/show-signin-history.js.map b/packages/backend/tools/show-signin-history.js.map
deleted file mode 100644
index b421825bce..0000000000
--- a/packages/backend/tools/show-signin-history.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"show-signin-history.js","sourceRoot":"","sources":["show-signin-history.ts"],"names":[],"mappings":";;AAAA,0CAAgD;AAEhD,gDAAgD;AAChD,mCAAmC;AAEnC,2EAA2E;AAC3E,uCAAuC;AAEvC,oDAAoD;AACpD,6BAA6B;AAE7B,KAAK,UAAU,IAAI,CAAC,QAAgB,EAAE,OAAkB;IACvD,MAAM,IAAI,GAAG,MAAM,aAAK,CAAC,OAAO,CAAC;QAChC,IAAI,EAAE,IAAI;QACV,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE;KACrC,CAAC,CAAC;IAEH,IAAI,IAAI,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,MAAM,eAAO,CAAC,IAAI,CAAC;QAClC,MAAM,EAAE,IAAI,CAAC,EAAE;KACf,CAAC,CAAC;IAEH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAE7H,UAAU;QACV,IAAI,OAAO,IAAI,IAAI,EAAE;YACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;gBAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBACrD,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACjD;aACD;SACD;KACD;AACF,CAAC;AAED,WAAW;AACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACvB,IAAI,OAA6B,CAAC;AAElC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;IACpB,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;CACjE;AAED,iBAAiB;AACjB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAEtC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/packages/client/src/components/dialog.vue b/packages/client/src/components/dialog.vue
index 1b03e65a3d..5d6678531d 100644
--- a/packages/client/src/components/dialog.vue
+++ b/packages/client/src/components/dialog.vue
@@ -14,7 +14,9 @@
-
+
+
+
{{ item.text }}
@@ -165,6 +167,10 @@ export default defineComponent({
> .icon {
font-size: 32px;
+ &.info {
+ color: #55c4dd;
+ }
+
&.success {
color: var(--success);
}
diff --git a/packages/client/src/components/emoji-picker-dialog.vue b/packages/client/src/components/emoji-picker-dialog.vue
index 4517a90db9..c1a9f73bcc 100644
--- a/packages/client/src/components/emoji-picker-dialog.vue
+++ b/packages/client/src/components/emoji-picker-dialog.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/packages/client/src/components/form/group.vue b/packages/client/src/components/form/group.vue
new file mode 100644
index 0000000000..2fc203f1b9
--- /dev/null
+++ b/packages/client/src/components/form/group.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
diff --git a/packages/client/src/components/form/input.vue b/packages/client/src/components/form/input.vue
index 99267f9231..c990b693f1 100644
--- a/packages/client/src/components/form/input.vue
+++ b/packages/client/src/components/form/input.vue
@@ -5,6 +5,7 @@
- {{ $ts.save }}
+ {{ $ts.save }}
@@ -114,9 +115,9 @@ export default defineComponent({
const changed = ref(false);
const invalid = ref(false);
const filled = computed(() => v.value !== '' && v.value != null);
- const inputEl = ref(null);
- const prefixEl = ref(null);
- const suffixEl = ref(null);
+ const inputEl = ref();
+ const prefixEl = ref();
+ const suffixEl = ref();
const focus = () => inputEl.value.focus();
const onInput = (ev) => {
@@ -208,7 +209,7 @@ export default defineComponent({
.matxzzsk {
> .label {
font-size: 0.85em;
- padding: 0 0 8px 12px;
+ padding: 0 0 8px 0;
user-select: none;
&:empty {
@@ -217,8 +218,8 @@ export default defineComponent({
}
> .caption {
- font-size: 0.8em;
- padding: 8px 0 0 12px;
+ font-size: 0.85em;
+ padding: 8px 0 0 0;
color: var(--fgTransparentWeak);
&:empty {
@@ -242,8 +243,7 @@ export default defineComponent({
font-weight: normal;
font-size: 1em;
color: var(--fg);
- background: var(--panel);
- border: solid 0.5px var(--inputBorder);
+ border: solid 0.5px var(--panel);
border-radius: 6px;
outline: none;
box-shadow: none;
@@ -311,5 +311,9 @@ export default defineComponent({
}
}
}
+
+ > .save {
+ margin: 8px 0 0 0;
+ }
}
diff --git a/packages/client/src/components/form/link.vue b/packages/client/src/components/form/link.vue
new file mode 100644
index 0000000000..3eb74425b0
--- /dev/null
+++ b/packages/client/src/components/form/link.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
diff --git a/packages/client/src/components/form/pagination.vue b/packages/client/src/components/form/pagination.vue
new file mode 100644
index 0000000000..3d3b40a783
--- /dev/null
+++ b/packages/client/src/components/form/pagination.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+ {{ $ts.loadMore }}
+
+
+
+
+
+
+
+
+
diff --git a/packages/client/src/components/form/radio.vue b/packages/client/src/components/form/radio.vue
index 0f31d8fa0a..f0b8c71376 100644
--- a/packages/client/src/components/form/radio.vue
+++ b/packages/client/src/components/form/radio.vue
@@ -1,5 +1,6 @@
* {
@@ -68,6 +70,14 @@ export default defineComponent({
}
&.checked {
+ background: var(--accentedBg) !important;
+ border-color: var(--accent);
+ color: var(--accent);
+
+ &, * {
+ cursor: default !important;
+ }
+
> .button {
border-color: var(--accent);
@@ -79,6 +89,11 @@ export default defineComponent({
}
}
+ &:hover {
+ border-color: var(--inputBorderHover);
+ color: var(--accent);
+ }
+
> input {
position: absolute;
width: 0;
@@ -89,8 +104,8 @@ export default defineComponent({
> .button {
position: absolute;
- width: 20px;
- height: 20px;
+ width: 14px;
+ height: 14px;
background: none;
border: solid 2px var(--inputBorder);
border-radius: 100%;
@@ -114,7 +129,6 @@ export default defineComponent({
> .label {
margin-left: 28px;
display: block;
- font-size: 16px;
line-height: 20px;
cursor: pointer;
}
diff --git a/packages/client/src/components/form/radios.vue b/packages/client/src/components/form/radios.vue
index 998a738202..ff5d51f9c7 100644
--- a/packages/client/src/components/form/radios.vue
+++ b/packages/client/src/components/form/radios.vue
@@ -23,6 +23,8 @@ export default defineComponent({
},
render() {
let options = this.$slots.default();
+ const label = this.$slots.label && this.$slots.label();
+ const caption = this.$slots.caption && this.$slots.caption();
// なぜかFragmentになることがあるため
if (options.length === 1 && options[0].props == null) options = options[0].children;
@@ -30,12 +32,21 @@ export default defineComponent({
return h('div', {
class: 'novjtcto'
}, [
- ...options.map(option => h(MkRadio, {
- key: option.key,
- value: option.props.value,
- modelValue: this.value,
- 'onUpdate:modelValue': value => this.value = value,
- }, option.children))
+ ...(label ? [h('div', {
+ class: 'label'
+ }, [label])] : []),
+ h('div', {
+ class: 'body'
+ }, options.map(option => h(MkRadio, {
+ key: option.key,
+ value: option.props.value,
+ modelValue: this.value,
+ 'onUpdate:modelValue': value => this.value = value,
+ }, option.children)),
+ ),
+ ...(caption ? [h('div', {
+ class: 'caption'
+ }, [caption])] : []),
]);
}
});
@@ -43,12 +54,30 @@ export default defineComponent({
diff --git a/packages/client/src/components/form/range.vue b/packages/client/src/components/form/range.vue
index dd771abfe2..79a83d6a93 100644
--- a/packages/client/src/components/form/range.vue
+++ b/packages/client/src/components/form/range.vue
@@ -1,29 +1,27 @@
-
-
-
-
+
diff --git a/packages/client/src/components/form/select.vue b/packages/client/src/components/form/select.vue
index fe2a4e3a7d..9ecff1aa6f 100644
--- a/packages/client/src/components/form/select.vue
+++ b/packages/client/src/components/form/select.vue
@@ -3,7 +3,7 @@
@@ -118,10 +118,14 @@ export default defineComponent({
transition: inherit;
}
- > p {
- margin: 0;
+ > .caption {
+ margin: 8px 0 0 0;
color: var(--fgTransparentWeak);
- font-size: 90%;
+ font-size: 0.85em;
+
+ &:empty {
+ display: none;
+ }
}
}
diff --git a/packages/client/src/components/form/textarea.vue b/packages/client/src/components/form/textarea.vue
index f3a2c394f1..98fd0da94b 100644
--- a/packages/client/src/components/form/textarea.vue
+++ b/packages/client/src/components/form/textarea.vue
@@ -4,6 +4,7 @@
@@ -174,7 +175,7 @@ export default defineComponent({
.adhpbeos {
> .label {
font-size: 0.85em;
- padding: 0 0 8px 12px;
+ padding: 0 0 8px 0;
user-select: none;
&:empty {
@@ -183,8 +184,8 @@ export default defineComponent({
}
> .caption {
- font-size: 0.8em;
- padding: 8px 0 0 12px;
+ font-size: 0.85em;
+ padding: 8px 0 0 0;
color: var(--fgTransparentWeak);
&:empty {
@@ -209,8 +210,7 @@ export default defineComponent({
font-weight: normal;
font-size: 1em;
color: var(--fg);
- background: var(--panel);
- border: solid 0.5px var(--inputBorder);
+ border: solid 0.5px var(--panel);
border-radius: 6px;
outline: none;
box-shadow: none;
@@ -248,5 +248,9 @@ export default defineComponent({
}
}
}
+
+ > .save {
+ margin: 8px 0 0 0;
+ }
}
diff --git a/packages/client/src/components/global/spacer.vue b/packages/client/src/components/global/spacer.vue
index 1129d54c71..34297a3c8b 100644
--- a/packages/client/src/components/global/spacer.vue
+++ b/packages/client/src/components/global/spacer.vue
@@ -15,19 +15,29 @@ export default defineComponent({
type: Number,
required: false,
default: null,
- }
+ },
+ marginMin: {
+ type: Number,
+ required: false,
+ default: 12,
+ },
+ marginMax: {
+ type: Number,
+ required: false,
+ default: 32,
+ },
},
setup(props, context) {
let ro: ResizeObserver;
- const root = ref
(null);
- const content = ref(null);
+ const root = ref();
+ const content = ref();
const margin = ref(0);
const adjust = (rect: { width: number; height: number; }) => {
if (rect.width > (props.contentMax || 500)) {
- margin.value = 32;
+ margin.value = props.marginMax;
} else {
- margin.value = 12;
+ margin.value = props.marginMin;
}
};
@@ -40,14 +50,14 @@ export default defineComponent({
});
*/
adjust({
- width: root.value.offsetWidth,
- height: root.value.offsetHeight,
+ width: root.value!.offsetWidth,
+ height: root.value!.offsetHeight,
});
});
- ro.observe(root.value);
+ ro.observe(root.value!);
if (props.contentMax) {
- content.value.style.maxWidth = `${props.contentMax}px`;
+ content.value!.style.maxWidth = `${props.contentMax}px`;
}
});
diff --git a/packages/client/src/components/key-value.vue b/packages/client/src/components/key-value.vue
new file mode 100644
index 0000000000..6a9a948ce9
--- /dev/null
+++ b/packages/client/src/components/key-value.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts
index d41cf6fc2b..d1da365d9a 100644
--- a/packages/client/src/components/mfm.ts
+++ b/packages/client/src/components/mfm.ts
@@ -184,6 +184,11 @@ export default defineComponent({
count, speed,
}, genEl(token.children));
}
+ case 'rotate': {
+ const degrees = parseInt(token.props.args.deg) || '90';
+ style = `transform: rotate(${degrees}deg); transform-origin: center center;`;
+ break;
+ }
}
if (style == null) {
return h('span', {}, ['$[', token.props.name, ' ', ...genEl(token.children), ']']);
diff --git a/packages/client/src/components/note-detailed.vue b/packages/client/src/components/note-detailed.vue
index 5fd8e9f6e2..03f6a767f2 100644
--- a/packages/client/src/components/note-detailed.vue
+++ b/packages/client/src/components/note-detailed.vue
@@ -42,8 +42,6 @@
bot
-
-
@@ -86,7 +84,9 @@