Merge tag '13.6.0' into io

This commit is contained in:
Cookie Ramen 2023-02-13 21:57:14 +09:00
commit d739c21c0f
No known key found for this signature in database
GPG key ID: 82A8B5D42246F02D
62 changed files with 545 additions and 1846 deletions

View file

@ -8,6 +8,26 @@
You should also include the user name that made the change. You should also include the user name that made the change.
--> -->
## 13.6.0 (2023/02/11)
### Improvements
- MkPageHeaderをごっそり変えた
* モバイルではヘッダーは上下に分割され、下段にタブが表示されるように
* iconOnlyのタブ項目がアクティブな場合にはタブのタイトルを表示するように
* メインタイムラインではタイトルを表示しない
* メインタイムラインかつモバイルで表示される左上のアバターを選択するとアカウントメニューが開くように
- ユーザーページのノート一覧をタブとして分離
- コンディショナルロールもバッジとして表示可能に
- enhance(client): ロールをより簡単に付与できるように
- enhance(client): 一度見たートのRenoteは省略して表示するように
- enhance(client): 迷惑になる可能性のある投稿を行う前に警告を表示
- リアクションの数が多い場合の表示を改善
- 一部のMFM構文をopt-outに
### Bugfixes
- Client: ユーザーページでタブがほとんど見れないことがないように
## 13.5.6 (2023/02/10) ## 13.5.6 (2023/02/10)
### Improvements ### Improvements

View file

@ -886,56 +886,6 @@ _nsfw:
respect: "اخف الوسائط ذات المحتوى الحساس" respect: "اخف الوسائط ذات المحتوى الحساس"
ignore: "اعرض الوسائط ذات المحتوى الحساس" ignore: "اعرض الوسائط ذات المحتوى الحساس"
force: "اخف كل الوسائط" force: "اخف كل الوسائط"
_mfm:
cheatSheet: "مرجع ملخص عن MFM"
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة كل تعابيرها مع كيفية استخدامها هنا."
mention: "أشر الى"
mentionDescription: "يمكنك الإشارة لمستخدم معيّن من خلال كتابة @ متبوعة باسم مستخدم."
hashtag: "الوسوم"
hashtagDescription: "يمكنك تعيين وسم من خلال كتابة # متبوعة بالنص المطلوب."
url: "الرابط"
urlDescription: "يمكن عرض الروابط"
link: "رابط"
bold: "عريض"
boldDescription: "جعل الحروف أثخن لإبرازها."
small: "صغير"
smallDescription: "يعرض المحتوى صغيرًا ورفيعًا."
center: "وسط"
centerDescription: "يمركز المحتوى في الوَسَط."
quote: "اقتبس"
quoteDescription: "يعرض المحتوى كاقتباس"
emoji: "إيموجي مخصص"
emojiDescription: "إحاطة اسم الإيموجي بنقطتي تفسير سيستبدله بصورة الإيموجي."
search: "البحث"
searchDescription: "يعرض نصًا في صندوق البحث"
flip: "اقلب"
flipDescription: "يقلب المحتوى عموديًا أو أفقيًا"
jelly: "تأثير (هلام)"
jellyDescription: "يمنح المحتوى حركة هلامية."
tada: "تأثير (تادا)"
tadaDescription: "يمنح للمحتوى تأثير تادا"
jump: "تأثير (قفز)"
jumpDescription: "يمنح للمحتوى حركة قفز."
bounce: "تأثير (ارتداد)"
bounceDescription: "يمنح للمحتوى حركة ارتدادية"
shake: "تأثير (اهتزاز)"
shakeDescription: "يمنح المحتوى حركة اهتزازية."
spin: "تأثير (دوران)"
spinDescription: "يمنح المحتوى حركة دورانية."
x2: "كبير"
x2Description: "يُكبر المحتوى"
x3: "كبير جداً"
x3Description: "يُضخم المحتوى"
x4: "هائل"
x4Description: "يُضخم المحتوى أكثر مما سبق."
blur: "طمس"
blurDescription: "يطمس المحتوى، لكن بالتمرير فوقه سيظهر بوضوح."
font: "الخط"
fontDescription: "الخط المستخدم لعرض المحتوى."
rainbow: "قوس قزح"
rainbowDescription: "اجعل المحتوى يظهر بألوان الطيف"
rotate: "تدوير"
rotateDescription: "يُدير المحتوى بزاوية معيّنة."
_instanceTicker: _instanceTicker:
none: "لا تظهره بتاتًا" none: "لا تظهره بتاتًا"
remote: "أظهر للمستخدمين البِعاد" remote: "أظهر للمستخدمين البِعاد"

View file

@ -455,7 +455,6 @@ youHaveNoGroups: "আপনার কোন গ্রুপ নেই "
joinOrCreateGroup: "একটি বিদ্যমান গ্রুপের আমন্ত্রণ পান বা একটি নতুন গ্রুপ তৈরি করুন৷" joinOrCreateGroup: "একটি বিদ্যমান গ্রুপের আমন্ত্রণ পান বা একটি নতুন গ্রুপ তৈরি করুন৷"
noHistory: "কোনো ইতিহাস নেই" noHistory: "কোনো ইতিহাস নেই"
signinHistory: "প্রবেশ করার ইতিহাস" signinHistory: "প্রবেশ করার ইতিহাস"
disableAnimatedMfm: "অ্যানিমেটেড MFM অক্ষম করুন"
doing: "প্রক্রিয়া করছে..." doing: "প্রক্রিয়া করছে..."
category: "বিভাগ" category: "বিভাগ"
tags: "ট‍্যাগসমূহ" tags: "ট‍্যাগসমূহ"
@ -923,70 +922,6 @@ _nsfw:
respect: "স্পর্শকাতর মিডিয়া লুকান" respect: "স্পর্শকাতর মিডিয়া লুকান"
ignore: "স্পর্শকাতর মিডিয়া লুকাবেন না" ignore: "স্পর্শকাতর মিডিয়া লুকাবেন না"
force: "সকল মিডিয়া লুকান" force: "সকল মিডিয়া লুকান"
_mfm:
cheatSheet: "MFM চিটশিট"
intro: "MFM একটি মার্কআপ ভাষা যা Misskey-এর মধ্যে বিভিন্ন জায়গায় ব্যবহার করা যেতে পারে। এখানে আপনি MFM-এর সিনট্যাক্সগুলির একটি তালিকা দেখতে পারবেন।"
dummy: "মিসকি ফেডিভার্সের বিশ্বকে প্রসারিত করে"
mention: "উল্লেখ"
mentionDescription: "@ চিহ্ন + ব্যবহারকারীর নাম একটি নির্দিষ্ট ব্যবহারকারীকে নির্দেশ করতে ব্যবহার করা যায়।"
hashtag: "হ্যাশট্যাগ"
hashtagDescription: "আপনি একটি # চিহ্ন + ট্যাগ সহ একটি হ্যাশট্যাগ নির্দেশ করতে পারেন।"
url: "URL"
urlDescription: "URL দেখানো সম্ভব।"
link: "লিংক"
linkDescription: "আপনি পাঠ্যের একটি নির্দিষ্ট অংশকে URL হিসাবে দেখাতে পারেন৷"
bold: "গাঢ়"
boldDescription: "অক্ষরগুলিকে মোটাকরে প্রদর্শন করা হবে।"
small: "ছোট"
smallDescription: "লেখা ছোট এবং পাতলা করে দেখানো হবে।"
center: "সেন্টার"
centerDescription: "লেখা মাঝ বরাবর দেখানো হবে"
inlineCode: "কোড (ইনলাইন)"
inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে"
blockCode: "কোড (ব্লক)"
blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।"
inlineMath: "গাণিতিক সূত্র (ইনলাইন)"
inlineMathDescription: "গাণিতিক সূত্র প্রদর্শন করুন (KaTeX) ইনলাইন।"
blockMath: "গাণিতিক সূত্র (ব্লক)"
blockMathDescription: "একটি ব্লকে একাধিক লাইনের গাণিতিক সূত্র প্রদর্শন করুন (KaTeX)।"
quote: "উদ্ধৃতি"
quoteDescription: "বিষয়বস্তুকে একটি উদ্ধৃতি হিসাবে দেখানো হবে।"
emoji: "স্বনির্ধারিত ইমোজিগুলি"
emojiDescription: "আপনি একটি কাস্টম ইমোজির নাম কোলনে আবদ্ধ করে কাস্টম ইমোজিটি দেখাতে পারেন৷"
search: "খুঁজুন"
searchDescription: "পূর্ব-টাইপ করা পাঠ্য সহ একটি অনুসন্ধান বাক্স প্রদর্শন করে।"
flip: "উল্টান"
flipDescription: "বিষয়বস্তু উপরে/নীচে বা বাম/ডানে উল্টান।"
jelly: "অ্যানিমেশন (জেলি)"
jellyDescription: "জেলির মত অ্যানিমেশন দেখায়।"
tada: "অ্যানিমেশন (টাডা)"
tadaDescription: "\"টাডা!\" এর মত অ্যানিমেশন দেখায়।"
jump: "অ্যানিমেশন (লাফ)"
jumpDescription: "বিষয়বস্তুতে লাফ মারার মত অ্যানিমেশন দেখায়।"
bounce: "অ্যানিমেশন (তিড়িং বিড়িং)"
bounceDescription: "তিড়িং বিড়িং করার মত অ্যানিমেশন দেখায়।"
shake: "অ্যানিমেশন (ঝাঁকি)"
shakeDescription: "ঝাঁকির মত অ্যানিমেশন দেখায়।"
twitch: "অ্যানিমেশন (মোচড়ানো)"
twitchDescription: "মোচড়ানোর মত অ্যানিমেশন দেখায়।"
spin: "অ্যানিমেশন (ঘুরা)"
spinDescription: "ঘুরার মত অ্যানিমেশন দেখায়।"
x2: "বড়"
x2Description: "বিষয়বস্তু বড় করে দেখায়।"
x3: "অনেক বড়"
x3Description: "বিষয়বস্তু আরও বড় করে দেখায়।"
x4: "অস্বাভাবিক বড়"
x4Description: "বিষয়বস্তুকে আগের থেকেও আরও বড় করে দেখায়।"
blur: "ব্লার"
blurDescription: "বিষয়বস্তুকে ব্লার করতে পারেন। আপনি এর উপর মাউস কার্সার রাখলে, এটি পরিষ্কারভাবে দেখতে পাবেন।"
font: "ফন্ট"
fontDescription: "বিষয়বস্তুকে কোন ফন্টে দেখানো হবে তা নির্ধারণ করে।"
rainbow: "রেইনবো"
rainbowDescription: "বিষয়বস্তুকে রংধনুর রং গুলিতে প্রদর্শন করে।"
sparkle: "চিক চিক"
sparkleDescription: "বিষয়বস্তুকে একটি চিকচিকে কণা প্রভাব দেয়।"
rotate: "ঘুরান"
rotateDescription: "বিষয়বস্তুকে একটি নির্দিষ্ট কোনে ঘুরায়।"
_instanceTicker: _instanceTicker:
none: "দেখাবেন না" none: "দেখাবেন না"
remote: "রিমোট ব্যাবহারকারীদের জন্য দেখান" remote: "রিমোট ব্যাবহারকারীদের জন্য দেখান"

View file

@ -375,11 +375,6 @@ file: "Fitxers"
_email: _email:
_follow: _follow:
title: "t'ha seguit" title: "t'ha seguit"
_mfm:
mention: "Menció"
quote: "Citar"
emoji: "Emojis personalitzats"
search: "Cercar"
_instanceMute: _instanceMute:
instanceMuteDescription: "Silencia tots els impulsos dels servidors seleccionats, també els usuaris que responen a altres d'un servidor silenciat." instanceMuteDescription: "Silencia tots els impulsos dels servidors seleccionats, també els usuaris que responen a altres d'un servidor silenciat."
_theme: _theme:

View file

@ -642,19 +642,6 @@ _registry:
_aboutMisskey: _aboutMisskey:
allContributors: "Všichni přispěvatelé" allContributors: "Všichni přispěvatelé"
source: "Zdrojový kód" source: "Zdrojový kód"
_mfm:
mention: "Zmínění"
hashtag: "Hashtag"
link: "Odkaz"
bold: "Tučně"
quote: "Citovat"
emoji: "Vlastní emoji"
search: "Vyhledávání"
flip: "Otočit"
tada: "Animace (tadá)"
blur: "Rozmazání"
font: "Font"
rainbow: "Duha"
_channel: _channel:
featured: "Trendy" featured: "Trendy"
_menuDisplay: _menuDisplay:

View file

@ -467,7 +467,6 @@ youHaveNoGroups: "Keine Gruppen vorhanden"
joinOrCreateGroup: "Lass dich zu einer Gruppe einladen oder erstelle deine eigene." joinOrCreateGroup: "Lass dich zu einer Gruppe einladen oder erstelle deine eigene."
noHistory: "Kein Verlauf gefunden" noHistory: "Kein Verlauf gefunden"
signinHistory: "Anmeldungsverlauf" signinHistory: "Anmeldungsverlauf"
disableAnimatedMfm: "MFM, die Animationen enthalten, deaktivieren"
doing: "In Bearbeitung …" doing: "In Bearbeitung …"
category: "Kategorie" category: "Kategorie"
tags: "Schlagwörter" tags: "Schlagwörter"
@ -1330,72 +1329,6 @@ _nsfw:
respect: "Als NSFW markierte Bilder verbergen" respect: "Als NSFW markierte Bilder verbergen"
ignore: "Als NSFW markierte Bilder nicht verbergen" ignore: "Als NSFW markierte Bilder nicht verbergen"
force: "Alle Medien verbergen" force: "Alle Medien verbergen"
_mfm:
cheatSheet: "MFM Spickzettel"
intro: "MFM ist eine Misskey-exklusive Markup-Sprache, die in Misskey an vielen Stellen verwendet werden kann. Hier kannst du eine Liste von verfügbarer MFM-Syntax einsehen."
dummy: "Misskey erweitert die Welt des Fediverse"
mention: "Erwähnung"
mentionDescription: "Mit At-Zeichen und Benutzername kann ein individueller Nutzer angegeben werden."
hashtag: "Hashtag"
hashtagDescription: "Mit einer Raute und Text kann ein Hashtag angegeben werden."
url: "URL"
urlDescription: "Zeigt URLs an."
link: "Link"
linkDescription: "Zeigt spezifische Textabschnitte als URL an."
bold: "Fett"
boldDescription: "Zeichen zur Betonung dicker erscheinen lassen."
small: "Klein"
smallDescription: "Inhalt klein und dünn erscheinen lassen."
center: "Zentrieren"
centerDescription: "Inhalt zentriert anzeigen."
inlineCode: "Code (Eingebettet)"
inlineCodeDescription: "Syntax-Hervorhebung für (Programm-)Code eingebettet anzeigen."
blockCode: "Code (Block)"
blockCodeDescription: "Syntax-Hervorhebung für mehrzeiligen (Programm-)Code als Block anzeigen."
inlineMath: "Mathe (Eingebettet)"
inlineMathDescription: "Mathematische Formeln (KaTeX) eingebettet anzeigen."
blockMath: "Mathe (Block)"
blockMathDescription: "Mehrzeilige mathematische Formeln (KaTeX) als Block einbetten."
quote: "Zitationen"
quoteDescription: "Inhalt als Zitat anzeigen."
emoji: "Benutzerdefinierte Emojis"
emojiDescription: "Durch das Umschließen von Emoji-Namen durch Doppelpunkte können benutzerdefinierte Emojis angezeigt werden."
search: "Suche"
searchDescription: "Eine vorgefertige Suchanfragebox anzeigen."
flip: "Spiegelung"
flipDescription: "Inhalt horizontal oder vertikal gespiegelt anzeigen."
jelly: "Animation (Dehnen)"
jellyDescription: "Verleiht Inhalt eine sich dehnende Animation."
tada: "Animation (Tada)"
tadaDescription: "Verleiht Inhalt eine Animation mit \"Tada!\"-Gefühl"
jump: "Animation (Sprung)"
jumpDescription: "Verleiht Inhalt eine springende Animation."
bounce: "Animation (Federn)"
bounceDescription: "Verleiht Inhalt eine federnde Animation."
shake: "Animation (Zittern)"
shakeDescription: "Verleiht Inhalt eine zitternde Animation."
twitch: "Animation (Zucken)"
twitchDescription: "Verleiht Inhalt eine sehr stark zuckende Animation."
spin: "Animation (Rotieren)"
spinDescription: "Verleiht Inhalt eine rotierende Animation."
x2: "Groß"
x2Description: "Inhalte größer anzeigen."
x3: "Sehr groß"
x3Description: "Inhalte noch größer anzeigen."
x4: "Unglaublich groß"
x4Description: "Lässt Inhalte noch größer als größer als groß angezeigt werden."
blur: "Weichzeichnen"
blurDescription: "Inhalte durch Weihzeichnung verschwimmen lassen. Durch das Bewegen des Mauszeigers über den Inhalt wird er klar angezeigt."
font: "Schriftart"
fontDescription: "Setzt die Schriftart des Inhaltes fest."
rainbow: "Regenbogen"
rainbowDescription: "Lässt den Inhalt in Regenbogenfarben erscheinen."
sparkle: "Glitzer"
sparkleDescription: "Verleiht Inhalt einen glitzernden Partikeleffekt."
rotate: "Drehen"
rotateDescription: "Dreht den Inhalt um einen angegebenen Winkel."
plain: "Schlicht"
plainDescription: "Deaktiviert jegliche MFM-Syntax, die sich innerhalb dieses MFM-Effekts befindet."
_instanceTicker: _instanceTicker:
none: "Nie anzeigen" none: "Nie anzeigen"
remote: "Für Benutzer fremder Instanzen anzeigen" remote: "Für Benutzer fremder Instanzen anzeigen"

View file

@ -298,11 +298,6 @@ cannotUploadBecauseNoFreeSpace: "Το ανέβασμα απέτυχε λόγω
_email: _email:
_follow: _follow:
title: "Έχετε ένα νέο ακόλουθο" title: "Έχετε ένα νέο ακόλουθο"
_mfm:
mention: "Επισήμανση"
quote: "Παράθεση"
emoji: "Επιπλέον emoji"
search: "Αναζήτηση"
_channel: _channel:
featured: "Δημοφιλή" featured: "Δημοφιλή"
_theme: _theme:

View file

@ -467,7 +467,6 @@ youHaveNoGroups: "You have no groups"
joinOrCreateGroup: "Get invited to a group or create your own." joinOrCreateGroup: "Get invited to a group or create your own."
noHistory: "No history available" noHistory: "No history available"
signinHistory: "Login history" signinHistory: "Login history"
disableAnimatedMfm: "Disable MFM with animation"
doing: "Processing..." doing: "Processing..."
category: "Category" category: "Category"
tags: "Tags" tags: "Tags"
@ -1330,72 +1329,6 @@ _nsfw:
respect: "Hide NSFW media" respect: "Hide NSFW media"
ignore: "Don't hide NSFW media" ignore: "Don't hide NSFW media"
force: "Hide all media" force: "Hide all media"
_mfm:
cheatSheet: "MFM Cheatsheet"
intro: "MFM is a Misskey-exclusive markup language that can be used in many places. Here you can view a list of all available MFM syntax."
dummy: "Misskey expands the world of the Fediverse"
mention: "Mention"
mentionDescription: "You can specify a user by using an At-Symbol and a username."
hashtag: "Hashtag"
hashtagDescription: "You can specify a hashtag using a number sign and text."
url: "URL"
urlDescription: "URLs can be displayed."
link: "Link"
linkDescription: "Specific parts of text can be displayed as a URL."
bold: "Bold"
boldDescription: "Highlights letters by making them thicker."
small: "Small"
smallDescription: "Displays content small and thin."
center: "Center"
centerDescription: "Displays content centered."
inlineCode: "Code (Inline)"
inlineCodeDescription: "Displays inline syntax highlighting for (program) code."
blockCode: "Code (Block)"
blockCodeDescription: "Displays syntax highlighting for multi-line (program) code in a block."
inlineMath: "Math (Inline)"
inlineMathDescription: "Display math formulas (KaTeX) in-line"
blockMath: "Math (Block)"
blockMathDescription: "Display multi-line math formulas (KaTeX) in a block"
quote: "Quote"
quoteDescription: "Displays content as a quote."
emoji: "Custom Emoji"
emojiDescription: "By surrounding a custom emoji name with colons, custom emoji can be displayed."
search: "Search"
searchDescription: "Displays a search box with pre-entered text."
flip: "Flip"
flipDescription: "Flips content horizontally or vertically."
jelly: "Animation (Jelly)"
jellyDescription: "Gives content a jelly-like animation."
tada: "Animation (Tada)"
tadaDescription: "Gives content a \"Tada!\"-like animation."
jump: "Animation (Jump)"
jumpDescription: "Gives content a jumping animation."
bounce: "Animation (Bounce)"
bounceDescription: "Gives content a bouncy animation."
shake: "Animation (Shake)"
shakeDescription: "Gives content a shaking animation."
twitch: "Animation (Twitch)"
twitchDescription: "Gives content a strongly twitching animation."
spin: "Animation (Spin)"
spinDescription: "Gives content a spinning animation."
x2: "Big"
x2Description: "Displays content bigger."
x3: "Very big"
x3Description: "Displays content even bigger."
x4: "Unbelievably big"
x4Description: "Displays content even bigger than bigger than big."
blur: "Blur"
blurDescription: "Blurs content. It will be displayed clearly when hovered over."
font: "Font"
fontDescription: "Sets the font to display content in."
rainbow: "Rainbow"
rainbowDescription: "Makes the content appear in rainbow colors."
sparkle: "Sparkle"
sparkleDescription: "Gives content a sparkling particle effect."
rotate: "Rotate"
rotateDescription: "Turns content by a specified angle."
plain: "Plain"
plainDescription: "Deactivates the effects of all MFM contained within this MFM effect."
_instanceTicker: _instanceTicker:
none: "Never show" none: "Never show"
remote: "Show for remote users" remote: "Show for remote users"

View file

@ -467,7 +467,6 @@ youHaveNoGroups: "Sin grupos"
joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo." joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su propio grupo."
noHistory: "No hay datos en el historial" noHistory: "No hay datos en el historial"
signinHistory: "Historial de ingresos" signinHistory: "Historial de ingresos"
disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones"
doing: "Voy en camino" doing: "Voy en camino"
category: "Categoría" category: "Categoría"
tags: "Etiqueta" tags: "Etiqueta"
@ -1328,72 +1327,6 @@ _nsfw:
respect: "Ocultar medios NSFW" respect: "Ocultar medios NSFW"
ignore: "No esconder medios NSFW " ignore: "No esconder medios NSFW "
force: "Ocultar todos los medios" force: "Ocultar todos los medios"
_mfm:
cheatSheet: "Hoja de referencia de MFM"
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares dentro de Misskey. Aquí puede ver una lista de sintaxis disponibles en MFM."
dummy: "Misskey expande el mundo de la Fediverso"
mention: "Menciones"
mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar para notificar a un usuario en particular."
hashtag: "Hashtag"
hashtagDescription: "Puede especificar un hashtag con un numeral y el texto."
url: "URL"
urlDescription: "Se pueden mostrar las URL"
link: "Vínculo"
linkDescription: "Se pueden asociar partes de texto a la URL"
bold: "Negrita"
boldDescription: "Muestra el texto con las letras más gruesas"
small: "Pequeño"
smallDescription: "Muestra el texto más pequeño y delgado"
center: "Centrar"
centerDescription: "Muestra el texto centrado"
inlineCode: "Código (insertado)"
inlineCodeDescription: "Muestra el código de un programa resaltando su sintaxis"
blockCode: "Código (bloque)"
blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias líneas con bloques."
inlineMath: "Fórmula (insertado)"
inlineMathDescription: "Muestra fórmulas (KaTeX) insertadas"
blockMath: "Fórmula (bloque)"
blockMathDescription: "Muestra fórmulas (KaTeX) de varias líneas en un bloque"
quote: "Citar"
quoteDescription: "Muestra el contenido como una cita"
emoji: "Emojis personalizados"
emojiDescription: "Muestra los emojis personalizados encerrados entre dos puntos."
search: "Buscar"
searchDescription: "Muestra una caja de búsqueda con texto pre-escrito"
flip: "Echar de un capirotazo"
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha."
jelly: "Animación (gelatina)"
jellyDescription: "Aplica un efecto de animación tipo gelatina"
tada: "Animación (tadá)"
tadaDescription: "Aplica un efecto de animación al estilo \"Tadá\""
jump: "Animación (saltar)"
jumpDescription: "Aplica un efecto de animación tipo salto"
bounce: "Animación (rebotar)"
bounceDescription: "Aplica un efecto de animación tipo rebote"
shake: "Animación (temblor)"
shakeDescription: "Aplica un efecto de animación tipo temblor"
twitch: "Animación (sacudida)"
twitchDescription: "Aplica un efecto de animación tipo sacudida"
spin: "Animación (giro)"
spinDescription: "Aplica un efecto de animación tipo rotación"
x2: "Grande"
x2Description: "Muestra el contenido más grande"
x3: "Muy grande"
x3Description: "Muestra el contenido mucho más grande"
x4: "Totalmente grande"
x4Description: "Muestra el contenido totalmente grande"
blur: "Desenfoque"
blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar el puntero encima."
font: "Fuente"
fontDescription: "Elegir la fuente del contenido"
rainbow: "Arcoíris"
rainbowDescription: "Muestra el contenido con los colores del arcoíris"
sparkle: "Parpadeante"
sparkleDescription: "Aplica un efecto de partículas parpadeantes"
rotate: "Rotar"
rotateDescription: "Rota el contenido a un ángulo especificado."
plain: "Plano"
plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto MFM."
_instanceTicker: _instanceTicker:
none: "No mostrar" none: "No mostrar"
remote: "Mostrar a usuarios remotos" remote: "Mostrar a usuarios remotos"

View file

@ -464,7 +464,6 @@ youHaveNoGroups: "Vous navez aucun groupe"
joinOrCreateGroup: "Vous pouvez être invité·e à rejoindre des groupes existants ou créer votre propre nouveau groupe." joinOrCreateGroup: "Vous pouvez être invité·e à rejoindre des groupes existants ou créer votre propre nouveau groupe."
noHistory: "Pas d'historique" noHistory: "Pas d'historique"
signinHistory: "Historique de connexion" signinHistory: "Historique de connexion"
disableAnimatedMfm: "Désactiver MFM ayant des animations"
doing: "En cours..." doing: "En cours..."
category: "Catégorie" category: "Catégorie"
tags: "Étiquettes" tags: "Étiquettes"
@ -1011,72 +1010,6 @@ _nsfw:
respect: "Cacher les médias marqués comme contenu sensible" respect: "Cacher les médias marqués comme contenu sensible"
ignore: "Afficher les médias sensibles" ignore: "Afficher les médias sensibles"
force: "Cacher tous les médias" force: "Cacher tous les médias"
_mfm:
cheatSheet: "Antisèche MFM"
intro: "MFM est un langage Markdown spécifique utilisable ici et là dans Misskey. Vous pouvez vérifier ici les structures utilisables avec MFM."
dummy: "La Fédiverse s'agrandit avec Misskey"
mention: "Mentionner"
mentionDescription: "Vous pouvez afficher un utilisateur spécifique en indiquant une arobase suivie d'un nom d'utilisateur"
hashtag: "Hashtags"
hashtagDescription: "Vous pouvez afficher un mot-dièse en utilisant un croisillon et du texte"
url: "URL"
urlDescription: "L'adresse web peut être affichée."
link: "Lien"
linkDescription: "Une partie précise d'une phrase peut être liée à l'adresse web."
bold: "Gras"
boldDescription: "Il est possible de mettre le texte en exergue en le mettant en gras."
small: "Diminuer l'emphase"
smallDescription: "Le contenu peut être affiché en petit et fin."
center: "Centrer"
centerDescription: "Le contenu peut être centré"
inlineCode: "Code (inline)"
inlineCodeDescription: "Coloration syntaxique des lignes de code."
blockCode: "Bloc de code"
blockCodeDescription: "Coloration syntaxique des lignes de code pour les blocs multi-lignes."
inlineMath: "Formule mathématique (inline)"
inlineMathDescription: "Afficher les formules mathématiques (KaTeX)."
blockMath: "Formule mathématique (bloc)"
blockMathDescription: "Afficher les formules mathématiques (KaTeX) multi-lignes dans un bloc."
quote: "Citer"
quoteDescription: "Affiche le contenu sous forme de citation."
emoji: "Émojis personnalisés"
emojiDescription: "Entourez le nom de l'émoji personnalisé de deux points pour l'afficher."
search: "Rechercher"
searchDescription: "Affiche une boîte de recherche avec du texte pré-saisi."
flip: "Inverser"
flipDescription: "Rotation verticale ou horizontale du contenu"
jelly: "Animation (Gelée)"
jellyDescription: "Donne une animation d'étirement."
tada: "Animation (Tada)"
tadaDescription: "Donne une animation qui donne une impression de \"Tada !\""
jump: "Animation (Saut)"
jumpDescription: "Donne une animation qui saute."
bounce: "Animation (Rebond)"
bounceDescription: "Donne une animation de rebondissement."
shake: "Animation (Secousse)"
shakeDescription: "Donne une animation tremblante."
twitch: "Animation (Tremblement)"
twitchDescription: "Donne une animation de tremblement intense."
spin: "Animation (Rotation)"
spinDescription: "Donne une animation de rotation."
x2: "Grand"
x2Description: "Afficher le contenu en grand."
x3: "Très grand"
x3Description: "Afficher le contenu en très grand."
x4: "Plus grand"
x4Description: "Afficher le contenu en plus grand."
blur: "Flou"
blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant avec le curseur."
font: "Police de caractères"
fontDescription: "Il est possible de choisir la police."
rainbow: "Arc-en-ciel"
rainbowDescription: "Permet d'afficher le contenu en couleurs arc-en-ciel."
sparkle: "Paillettes"
sparkleDescription: "Ajoute un effet scintillant au contenu."
rotate: "Pivoter"
rotateDescription: "Faire pivoter à un angle spécifié."
plain: "Vu texte non formaté"
plainDescription: "Désactive toute la syntaxe interne."
_instanceTicker: _instanceTicker:
none: "Cacher " none: "Cacher "
remote: "Montrer pour les utilisateur·ice·s distant·e·s" remote: "Montrer pour les utilisateur·ice·s distant·e·s"

View file

@ -464,7 +464,6 @@ youHaveNoGroups: "Kamu tidak memiliki grup"
joinOrCreateGroup: "Bergabunglah dengan grup atau kamu dapat membuat grupmu sendiri." joinOrCreateGroup: "Bergabunglah dengan grup atau kamu dapat membuat grupmu sendiri."
noHistory: "Tidak ada riwayat" noHistory: "Tidak ada riwayat"
signinHistory: "Riwayat masuk" signinHistory: "Riwayat masuk"
disableAnimatedMfm: "Nonaktifkan MFM dengan animasi"
doing: "Sedang berkerja..." doing: "Sedang berkerja..."
category: "Kategori" category: "Kategori"
tags: "Tandai" tags: "Tandai"
@ -1131,70 +1130,6 @@ _nsfw:
respect: "Sembunyikan media NSFW" respect: "Sembunyikan media NSFW"
ignore: "Jangan sembunyikan media NSFW" ignore: "Jangan sembunyikan media NSFW"
force: "Sembunyikan semua media" force: "Sembunyikan semua media"
_mfm:
cheatSheet: "Contekan MFM"
intro: "MFM adalah Misskey-exclusive Markup Language yang dapat digunakan di banyak tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada."
dummy: "Misskey membentangkan dunia Fediverse"
mention: "Sebut"
mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan simbol-At dan nama engguna mereka."
hashtag: "Tagar"
hashtagDescription: "Kamu dapat menentukan tagar dengan menggunakan angka dan teks."
url: "URL"
urlDescription: "URL dapat ditampilkan."
link: "Tautan"
linkDescription: "Bagian tertentu dari teks dapat ditampilka sebagai URL."
bold: "Tebal"
boldDescription: "Sorot tulisan dengan membuatnya tebal."
small: "Kecil"
smallDescription: "Tampilkan konten kecil dan tipis."
center: "Tengah"
centerDescription: "Tampilkan konten di tengah."
inlineCode: "Kode (Dalam baris)"
inlineCodeDescription: "Menampilkan sorotan sintaks dalam baris untuk kode(program-)."
blockCode: "Kode (Blok)"
blockCodeDescription: "Menampilkan sorotan sintaks untuk kode(program-) multi baris dalam sebuah blok."
inlineMath: "Matematika (Dalam baris)"
inlineMathDescription: "Menampilkan formula matematika (KaTeX) dalam baris."
blockMath: "Matematika (Blok)"
blockMathDescription: "Menampilkan formula matematika (KaTeX) multibaris dalam sebuah blok."
quote: "Kutip"
quoteDescription: "Menampilkan konten sebagai kutipan."
emoji: "Emoji kustom"
emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom menggunakan tanda titik dua."
search: "Penelusuran"
searchDescription: "Menampilkan kotak pencarian dengan teks yang sudah dimasukkan."
flip: "Balik"
flipDescription: "Balikkan konten secara horizontal atau vertikal."
jelly: "Animasi (Jelly)"
jellyDescription: "Menerapkan animasi seperti jelly"
tada: "Animasi (Tada)"
tadaDescription: "Menerapkan animasi seperti \"Kejutan!\"."
jump: "Animasi (Loncat)"
jumpDescription: "Menerapkan animasi melompat."
bounce: "Animasi (Melambung)"
bounceDescription: "Menerapkan animasi melambung."
shake: "Animasi (Goyang)"
shakeDescription: "Menerapkan animasi bergoyang."
twitch: "Animasi (Cubit)"
twitchDescription: "Terapkan animasi cubit yang kuat."
spin: "Animasi (Putar)"
spinDescription: "Terapkan animasi putar."
x2: "Besar"
x2Description: "Tampilkan konten menjadi besar."
x3: "Lebih besar"
x3Description: "Tampilkan konten menjadi lebih besar."
x4: "Sangat besar"
x4Description: "Tampilka konten menjadi sangat besar."
blur: "Buram"
blurDescription: "Konten dapat diburamkan dengan efek ini. Konten dapat ditampilkan dengan jelas dengan melayangkan kursor tetikus di atasnya."
font: "Font"
fontDescription: "Setel font yang ditampilkan untuk konten."
rainbow: "Pelangi"
rainbowDescription: "Membuat konten muncul dalam warna pelangi."
sparkle: "Kelap-kelip"
sparkleDescription: "Memberikan konten efek partikel kelap-kelip."
rotate: "Putar"
rotateDescription: "Putar konten sesuai sudut yang ditentukan."
_instanceTicker: _instanceTicker:
none: "Jangan tampilkan" none: "Jangan tampilkan"
remote: "Tampilkan untuk pengguna luar" remote: "Tampilkan untuk pengguna luar"

View file

@ -464,7 +464,6 @@ youHaveNoGroups: "Nessun gruppo"
joinOrCreateGroup: "Puoi creare il tuo gruppo o essere invitat@ a gruppi che già esistono." joinOrCreateGroup: "Puoi creare il tuo gruppo o essere invitat@ a gruppi che già esistono."
noHistory: "Nessuna cronologia" noHistory: "Nessuna cronologia"
signinHistory: "Storico degli accessi al profilo" signinHistory: "Storico degli accessi al profilo"
disableAnimatedMfm: "Disabilità i MFM animati"
doing: "In corso..." doing: "In corso..."
category: "Categoria" category: "Categoria"
tags: "Tag" tags: "Tag"
@ -1323,72 +1322,6 @@ _nsfw:
respect: "Nascondere i media segnati come sensibli" respect: "Nascondere i media segnati come sensibli"
ignore: "Visualizzare i media segnati come sensibili" ignore: "Visualizzare i media segnati come sensibili"
force: "Nascondere tutti i media" force: "Nascondere tutti i media"
_mfm:
cheatSheet: "Bigliettino MFM"
intro: "MFM è un linguaggio Markdown particolare che si può usare in diverse parti di Misskey. Qui puoi visualizzare a colpo d'occhio tutta la sintassi MFM utile."
dummy: "Il Fediverso si espande con Misskey"
mention: "Menzioni"
mentionDescription: "Si può menzionare un utente specifico digitando il suo nome utente subito dopo il segno @."
hashtag: "Hashtag"
hashtagDescription: "Per indicare un hashtag si può usare il segno numerico + tag."
url: "URL"
urlDescription: "È possibile indicare gli URL"
link: "Link"
linkDescription: "È possibile associare specifici intervalli di testo agli URL"
bold: "Grassetto"
boldDescription: "Il testo può essere grassettato per enfasi"
small: "vistosamente"
smallDescription: "Il contenuto può essere visualizzato più piccolo e più sottile"
center: "centratura"
centerDescription: "Il contenuto può essere centrato"
inlineCode: "Codice (inline)"
inlineCodeDescription: "Evidenziazione della sintassi in linea di programmi e altro codice"
blockCode: "Codice (blocco)"
blockCodeDescription: "Evidenziazione della sintassi di programmi multilinea e di altro codice in blocchi"
inlineMath: "Espressione matematica(Immersione)"
inlineMathDescription: "Visualizza le formule (KaTeX) in linea."
blockMath: "Formula matematica (blocco)"
blockMathDescription: "Visualizzazione di formule multilinea (KaTeX) in blocchi."
quote: "Cita il nota"
quoteDescription: "Può indicare che il contenuto è una citazione."
emoji: "Emoji personalizzati"
emojiDescription: "Utilizzare i due punti per racchiudere il nome di un'emoji personalizzata e visualizzarla."
search: "Cerca"
searchDescription: "È possibile visualizzare una casella di ricerca precompilata."
flip: "Inverti"
flipDescription: "Capovolgere il contenuto verso l'alto o verso il basso, a sinistra o a destra."
jelly: "Animazione (Biyon Biyon)."
jellyDescription: "Dà un'animazione di salto."
tada: "Animazione (jang)."
tadaDescription: "Ta-da! dà un'animazione che assomiglia a."
jump: "Animazione(salto)"
jumpDescription: "Da un animazione che salta su e giù."
bounce: "Animazione(rimbalzo)"
bounceDescription: "Rende il testo rimbalzante"
shake: "rimbalzante"
shakeDescription: "Rende il testo traballante"
twitch: "testo"
twitchDescription: "Fa tremare il testo"
spin: "Animazione (rotazione)"
spinDescription: "Fornisce un'animazione rotante."
x2: "Più grande"
x2Description: "Mostra il contenuto ingrandito."
x3: "Molto più grande"
x3Description: "Mostra il contenuto molto più ingrandito."
x4: "Estremamente più grande"
x4Description: "Mostra il contenuto estremamente più ingrandito."
blur: "Sfocatura"
blurDescription: "È possibile rendere sfocato il contenuto. Spostando il cursore su di esso tornerà visibile chiaramente."
font: "Tipo di carattere"
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
rainbow: "Arcobaleno"
rainbowDescription: "Arcobaleno il contenuto."
sparkle: "brillantini"
sparkleDescription: "Aggiungere effetti particellari scintillanti."
rotate: "Ruota"
rotateDescription: "Ruota con un angolo specificato."
plain: "Testo semplice"
plainDescription: "Disattiva tutta la sintassi interna."
_instanceTicker: _instanceTicker:
none: "Nascondi" none: "Nascondi"
remote: "Mostra solo per i profili remoti" remote: "Mostra solo per i profili remoti"

View file

@ -467,7 +467,8 @@ youHaveNoGroups: "グループがありません"
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。" joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
noHistory: "履歴はありません" noHistory: "履歴はありません"
signinHistory: "ログイン履歴" signinHistory: "ログイン履歴"
disableAnimatedMfm: "動きのあるMFMを無効にする" enableAdvancedMfm: "高度なMFMを有効にする"
enableAnimatedMfm: "動きのあるMFMを有効にする"
doing: "やっています" doing: "やっています"
category: "カテゴリ" category: "カテゴリ"
tags: "タグ" tags: "タグ"
@ -946,6 +947,10 @@ selectFromPresets: "プリセットから選択"
achievements: "実績" achievements: "実績"
gotInvalidResponseError: "サーバーの応答が無効です" gotInvalidResponseError: "サーバーの応答が無効です"
gotInvalidResponseErrorDescription: "サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから再度お試しください。" gotInvalidResponseErrorDescription: "サーバーがダウンまたはメンテナンスしている可能性があります。しばらくしてから再度お試しください。"
thisPostMayBeAnnoying: "この投稿は迷惑になる可能性があります。"
thisPostMayBeAnnoyingHome: "ホームに投稿"
thisPostMayBeAnnoyingCancel: "やめる"
thisPostMayBeAnnoyingIgnore: "このまま投稿"
_achievements: _achievements:
earnedAt: "獲得日時" earnedAt: "獲得日時"
@ -1347,73 +1352,6 @@ _nsfw:
ignore: "閲覧注意のメディアを隠さない" ignore: "閲覧注意のメディアを隠さない"
force: "常にメディアを隠す" force: "常にメディアを隠す"
_mfm:
cheatSheet: "MFMチートシート"
intro: "MFMは、Misskey内の様々な場所で使用できる専用のマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。"
dummy: "MisskeyでFediverseの世界が広がります"
mention: "メンション"
mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示すことができます。"
hashtag: "ハッシュタグ"
hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示すことができます。"
url: "URL"
urlDescription: "URLを示すことができます。"
link: "リンク"
linkDescription: "文章の特定の範囲を、URLに紐づけることができます。"
bold: "太字"
boldDescription: "文字を太く表示して強調することができます。"
small: "目立たなく"
smallDescription: "内容を小さく・薄く表示させることができます。"
center: "中央寄せ"
centerDescription: "内容を中央寄せで表示させることができます。"
inlineCode: "コード(インライン)"
inlineCodeDescription: "プログラムなどのコードをインラインでシンタックスハイライトします。"
blockCode: "コード(ブロック)"
blockCodeDescription: "複数行のプログラムなどのコードをブロックでシンタックスハイライトします。"
inlineMath: "数式(インライン)"
inlineMathDescription: "数式(KaTeX)をインラインで表示します。"
blockMath: "数式(ブロック)"
blockMathDescription: "複数行の数式(KaTeX)をブロックで表示します。"
quote: "引用"
quoteDescription: "内容が引用であることを示すことができます。"
emoji: "カスタム絵文字"
emojiDescription: "コロンでカスタム絵文字名を囲むと、カスタム絵文字を表示させることができます。"
search: "検索"
searchDescription: "入力済み検索ボックスを表示させることができます。"
flip: "反転"
flipDescription: "内容を上下または左右に反転させます。"
jelly: "アニメーション(びよんびよん)"
jellyDescription: "びよんびよんするアニメーションを与えます。"
tada: "アニメーション(じゃーん)"
tadaDescription: "ジャーン!という感じのアニメーションを与えます。"
jump: "アニメーション(ジャンプ)"
jumpDescription: "飛び跳ねるようなアニメーションを与えます。"
bounce: "アニメーション(バウンド)"
bounceDescription: "ぽよんぽよん弾むようなアニメーションを与えます。"
shake: "アニメーション(ぶるぶる)"
shakeDescription: "ぶるぶる震えるアニメーションを与えます。"
twitch: "アニメーション(ブレ)"
twitchDescription: "激しくブレるアニメーションを与えます。"
spin: "アニメーション(回転)"
spinDescription: "回転するアニメーションを与えます。"
x2: "大きく"
x2Description: "内容を大きく表示します。"
x3: "とても大きく"
x3Description: "内容をとても大きく表示します。"
x4: "究極に大きく"
x4Description: "内容を究極に大きく表示します。"
blur: "ぼかし"
blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。"
font: "フォント"
fontDescription: "内容のフォントを指定することができます。"
rainbow: "レインボー"
rainbowDescription: "内容をレインボーにします。"
sparkle: "キラキラ"
sparkleDescription: "キラキラしたパーティクルのエフェクトを追加します。"
rotate: "回転"
rotateDescription: "指定した角度で回転させます。"
plain: "プレーン"
plainDescription: "内側の構文を全て無効にします。"
_instanceTicker: _instanceTicker:
none: "表示しない" none: "表示しない"
remote: "リモートユーザーに表示" remote: "リモートユーザーに表示"

View file

@ -467,7 +467,8 @@ youHaveNoGroups: "グループがあらへんねぇ。"
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループ作ってからやってな" joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループ作ってからやってな"
noHistory: "履歴はあらへんねぇ。" noHistory: "履歴はあらへんねぇ。"
signinHistory: "ログイン履歴" signinHistory: "ログイン履歴"
disableAnimatedMfm: "動きがやかましいMFMを止める" enableAdvancedMfm: "ややこしいMFMもありにする"
enableAnimatedMfm: "動きがやかましいMFMも許したる"
doing: "やっとるがな" doing: "やっとるがな"
category: "カテゴリ" category: "カテゴリ"
tags: "タグ" tags: "タグ"
@ -1119,72 +1120,6 @@ _nsfw:
respect: "閲覧注意のメディアは隠すで" respect: "閲覧注意のメディアは隠すで"
ignore: "閲覧注意のメディアは隠さへんで" ignore: "閲覧注意のメディアは隠さへんで"
force: "常にメディアを隠すで" force: "常にメディアを隠すで"
_mfm:
cheatSheet: "MFMチートシート"
intro: "MFMは、Misskey内の色んな所で使える専用のマークアップ言語やで。このページでMFMで使える構文一覧が確認できるで。"
dummy: "MisskeyでFediverseの世界が広がります"
mention: "メンション"
mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示すことができるで。"
hashtag: "ハッシュタグ"
hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示すことができるで。"
url: "URL"
urlDescription: "URLを示すことができるで。"
link: "リンク"
linkDescription: "文章の特定の範囲をURLに紐づけることができるで"
bold: "太字"
boldDescription: "文字を太く表示して強調することができるで"
small: "目立たなく"
smallDescription: "内容を小さく・薄く表示することができるで"
center: "中央寄せ"
centerDescription: "内容を中央寄せで表示することができるで"
inlineCode: "コード(インライン)"
inlineCodeDescription: "プログラムとかのコードをインラインでシンタックスハイライトするで"
blockCode: "コード(ブロック)"
blockCodeDescription: "複数行のプログラムとかのコードをブロックでシンタックスハイライトするで"
inlineMath: "数式(インライン)"
inlineMathDescription: "数式(KaTeX)をインラインで表示するで"
blockMath: "数式(ブロック)"
blockMathDescription: "複数行の数式(KaTeX)をブロックで表示するで"
quote: "引用"
quoteDescription: "内容が引用ってことを示すことができるで"
emoji: "カスタム絵文字"
emojiDescription: "コロンでカスタム絵文字名を囲んだると、カスタム絵文字を表示させることができるで"
search: "探す"
searchDescription: "入力済み検索ボックスを表示することができるで"
flip: "反転"
flipDescription: "内容を上下または左右に反転するで"
jelly: "アニメーション(びよんびよん)"
jellyDescription: "びよんびよんするアニメーションやな。"
tada: "アニメーション(じゃーん)"
tadaDescription: "ジャーン!ってな感じのアニメーションやな。"
jump: "アニメーション(ジャンプ)"
jumpDescription: "飛び跳ねるようなアニメーションやな。"
bounce: "アニメーション(バウンド)"
bounceDescription: "ぽよんぽよん弾むようなアニメーションやな。"
shake: "アニメーション(ぶるぶる)"
shakeDescription: "ぶるぶる震えるアニメーションやな。"
twitch: "アニメーション(ブレ)"
twitchDescription: "激しくブレるアニメーションやな。"
spin: "アニメーション(回転)"
spinDescription: "回転するアニメーションやな。"
x2: "大きく"
x2Description: "内容を大きく表示するで"
x3: "とても大きく"
x3Description: "内容をとても大きく表示するで"
x4: "究極に大きく"
x4Description: "内容を究極に大きく表示するで"
blur: "ぼかし"
blurDescription: "内容をぼかすことができるで。ポインターを上に乗せるとはっきり見えるようになるで"
font: "フォント"
fontDescription: "内容のフォントを指定することができるで"
rainbow: "レインボー"
rainbowDescription: "内容をレインボーにするで"
sparkle: "キラキラ"
sparkleDescription: "キラキラしたバーティ来るのエフェクトを追加するで"
rotate: "回転"
rotateDescription: "指定した角度で回転させるで"
plain: "プレーン"
plainDescription: "内側の構文を全部無効にするで"
_instanceTicker: _instanceTicker:
none: "表示せん" none: "表示せん"
remote: "リモートユーザーに表示" remote: "リモートユーザーに表示"

View file

@ -61,10 +61,6 @@ account: "Imiḍan"
_email: _email:
_follow: _follow:
title: "Yeṭṭafaṛ-ik·em-id" title: "Yeṭṭafaṛ-ik·em-id"
_mfm:
mention: "Bder"
search: "Nadi"
font: "Tasefsit"
_theme: _theme:
keys: keys:
mention: "Bder" mention: "Bder"

View file

@ -64,8 +64,6 @@ file: "ಕಡತಗಳು"
_email: _email:
_follow: _follow:
title: "ಹಿಂಬಾಲಿಸಿದರು" title: "ಹಿಂಬಾಲಿಸಿದರು"
_mfm:
search: "ಹುಡುಕು"
_sfx: _sfx:
notification: "ಅಧಿಸೂಚನೆಗಳು" notification: "ಅಧಿಸೂಚನೆಗಳು"
_widgets: _widgets:

View file

@ -464,7 +464,6 @@ youHaveNoGroups: "그룹이 없습니다"
joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요." joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요."
noHistory: "기록이 없습니다" noHistory: "기록이 없습니다"
signinHistory: "로그인 기록" signinHistory: "로그인 기록"
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
doing: "잠시만요" doing: "잠시만요"
category: "카테고리" category: "카테고리"
tags: "태그" tags: "태그"
@ -1320,72 +1319,6 @@ _nsfw:
respect: "열람주의로 설정된 미디어 숨기기" respect: "열람주의로 설정된 미디어 숨기기"
ignore: "열람 주의 미디어 항상 표시" ignore: "열람 주의 미디어 항상 표시"
force: "미디어 항상 숨기기" force: "미디어 항상 숨기기"
_mfm:
cheatSheet: "MFM 도움말"
intro: "MFM는 Misskey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다."
dummy: "Misskey로 연합우주의 세계가 펼쳐집니다"
mention: "멘션"
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다."
hashtag: "해시태그"
hashtagDescription: "샵 또는 우물정자(#)를 앞에 붙여서 해시태그를 나타낼 수 있습니다."
url: "URL"
urlDescription: "URL을 나타낼 수 있습니다."
link: "링크"
linkDescription: "문장의 특정 범위를 URL로 표시합니다."
bold: "굵음/볼드체"
boldDescription: "문자를 굵게 강조합니다."
small: "눈에 띄지 않음"
smallDescription: "내용을 작고 연하게 보이게 합니다."
center: "가운데 정렬"
centerDescription: "내용을 가운데 정렬로 보이게 합니다."
inlineCode: "코드(인라인)"
inlineCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 인라인으로 표시합니다."
blockCode: "코드(블록)"
blockCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 블록으로 표시합니다."
inlineMath: "수식(인라인)"
inlineMathDescription: "수식(KaTeX)를 인라인으로 보이게 합니다."
blockMath: "수식(블록)"
blockMathDescription: "여러 줄의 수식(KaTeX)를 블록으로 보이게 합니다."
quote: "인용"
quoteDescription: "내용을 인용문으로 표시합니다."
emoji: "커스텀 이모지"
emojiDescription: "커스텀 이모지의 이름을 쌍점(:)으로 감싸서 커스텀 이모지를 사용합니다."
search: "검색"
searchDescription: "주어진 키워드가 입력된 검색창을 보이게 합니다."
flip: "플립"
flipDescription: "내용을 상하 또는 좌우로 반전시킵니다."
jelly: "애니메이션 (젤리)"
jellyDescription: "젤리처럼 탱글탱글한 느낌의 효과를 줍니다."
tada: "애니메이션 (짠!)"
tadaDescription: "짠! 하는 느낌의 효과를 줍니다."
jump: "애니메이션(점프)"
jumpDescription: "펄쩍 뛸 듯한 느낌의 효과를 줍니다."
bounce: "애니메이션 (바운스)"
bounceDescription: "통통 튀는 느낌의 효과를 줍니다."
shake: "애니메이션 (부들부들)"
shakeDescription: "부들부들 떠는 느낌의 효과를 줍니다."
twitch: "애니메이션 (경련)"
twitchDescription: "격하게 흔들리는 느낌의 효과를 줍니다."
spin: "애니메이션 (회전)"
spinDescription: "회전 효과를 줍니다."
x2: "크게"
x2Description: "내용을 크게 표시합니다."
x3: "더 크게"
x3Description: "내용을 더 크게 표시합니다."
x4: "매우 크게"
x4Description: "내용을 매우 크게 표시합니다."
blur: "흐림"
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
font: "폰트"
fontDescription: "내용의 글꼴을 지정할 수 있습니다."
rainbow: "무지개"
rainbowDescription: "내용을 무지개로 표시합니다."
sparkle: "반짝반짝"
sparkleDescription: "반짝이는 파티클 효과를 추가합니다."
rotate: "회전"
rotateDescription: "지정한 각도로 회전시킵니다."
plain: "평문"
plainDescription: "안에 있는 MFM 구문을 모두 무시하고 평문으로 표시합니다."
_instanceTicker: _instanceTicker:
none: "보이지 않음" none: "보이지 않음"
remote: "리모트 유저에게만 보이기" remote: "리모트 유저에게만 보이기"

View file

@ -187,11 +187,6 @@ file: "ໄຟລ໌"
_email: _email:
_follow: _follow:
title: "ໄດ້ຕິດຕາມທ່ານ" title: "ໄດ້ຕິດຕາມທ່ານ"
_mfm:
mention: "ໄດ້ກ່າວມາ"
quote: "ລວມຂໍ້ຄວາມອ້າງອີງ"
emoji: "ອີໂມຈິແບບກຳນົດເອງ"
search: "ຄົ້ນຫາ"
_theme: _theme:
keys: keys:
mention: "ໄດ້ກ່າວມາ" mention: "ໄດ້ກ່າວມາ"

View file

@ -427,11 +427,6 @@ loggedInAsBot: "Momenteel als bot ingelogd"
_email: _email:
_follow: _follow:
title: "volgde jou" title: "volgde jou"
_mfm:
mention: "Vermelding"
quote: "Quote"
emoji: "Maatwerk emoji"
search: "Zoeken"
_theme: _theme:
keys: keys:
mention: "Vermelding" mention: "Vermelding"

View file

@ -461,7 +461,6 @@ youHaveNoGroups: "Nie masz żadnych grup"
joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę." joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę."
noHistory: "Brak historii" noHistory: "Brak historii"
signinHistory: "Historia logowania" signinHistory: "Historia logowania"
disableAnimatedMfm: "Wyłącz MFM z animacją"
doing: "Przetwarzanie..." doing: "Przetwarzanie..."
category: "Kategoria" category: "Kategoria"
tags: "Tagi" tags: "Tagi"
@ -958,68 +957,6 @@ _nsfw:
respect: "Ukrywaj media NSFW" respect: "Ukrywaj media NSFW"
ignore: "Nie ukrywaj mediów NSFW" ignore: "Nie ukrywaj mediów NSFW"
force: "Ukrywaj wszystkie media" force: "Ukrywaj wszystkie media"
_mfm:
cheatSheet: "Ściąga MFM"
intro: "MFM to język składniowy wyjątkowy dla Misskey, który może być użyty w wielu miejscach. Tu znajdziesz listę wszystkich możliwych elementów składni MFM."
dummy: "Misskey rozszerza świat Fediwersum"
mention: "Wspomnij"
mentionDescription: "Używając znaku @ i nazwy użytkownika, możesz określić danego użytkownika."
hashtag: "Hashtag"
hashtagDescription: "Używając kratki i tekstu, możesz określić hashtag."
url: "Adres URL"
urlDescription: "Adresy URL mogą być wyświetlane"
link: "Odnośnik"
linkDescription: "Określone części tekstu mogą być wyświetlane jako adres URL."
bold: "Pogrubienie"
boldDescription: "Wyróżnia litery pogrubiając je."
small: "Małe"
smallDescription: "Wyświetla treść jako małą i cienką."
center: "Wyśrodkowanie"
centerDescription: "Wyśrodkowuje zawartość."
inlineCode: "Kod (w wierszu)"
blockCode: "Kod (blok)"
blockCodeDescription: "Wyświetla kod z podświetlaną składnią składający się z wielu linii."
blockMath: "Matematyka (Blok)"
quote: "Cytuj"
quoteDescription: "Wyświetla treść jako cytat."
emoji: "Niestandardowe emoji"
emojiDescription: "Otaczając nazwę niestandardowego emoji dwukropkami, możesz użyć niestandardowego emoji."
search: "Szukaj"
searchDescription: "Wyświetla pole wyszukiwania z wcześniej wpisanym tekstem."
flip: "Odwróć"
flipDescription: "Przerzuca treść poziomo lub pionowo."
jelly: "Animacja (Galaretka)"
jellyDescription: "Nadaje treści galaretowatą animację."
tada: "Animation (Tada)"
tadaDescription: "Nadaje treści animację podobną do \"Tada!\"."
jump: "Animacja (Skok)"
jumpDescription: "Nadaje treści animację skakania."
bounce: "Animacja (Odbijanie)"
bounceDescription: "Nadaje treści animację odbijania się."
shake: "Animacja (Wstrząsanie)"
shakeDescription: "Nadaje treści animację wstrząsania."
twitch: "Animacja (Drganie)"
twitchDescription: "Nadaje treści mocno drgającą animację."
spin: "Animacja (Obrót)"
spinDescription: "Nadaje treści animację obracania."
x2: "Duże"
x2Description: "Czyni treść większą."
x3: "Bardzo duże"
x3Description: "Czyni treść jeszcze większą."
x4: "Ogromne"
x4Description: "Czyni treść jeszcze większą niż jeszcze większa."
blur: "Rozmycie"
blurDescription: "Rozmywa treść. Zostanie wyraźnie wyświetlona po najechaniu."
font: "Czcionka"
fontDescription: "Wybiera czcionkę do wyświetlania treści."
rainbow: "Tęcza"
rainbowDescription: "Sprawia, że zawartość pojawia się w kolorach tęczy."
sparkle: "Blask"
sparkleDescription: "Nadaje zawartości efekt lśniącego brokatu."
rotate: "Obróć"
rotateDescription: "Obraca zawartość o określony kąt."
plain: "Zwyczajny"
plainDescription: "Wyłącza efekty wszystkich MFM zawartych w tym efekcie MFM."
_instanceTicker: _instanceTicker:
none: "Nigdy nie pokazuj" none: "Nigdy nie pokazuj"
remote: "Pokaż dla zdalnych użytkowników" remote: "Pokaż dla zdalnych użytkowników"

View file

@ -475,11 +475,6 @@ file: "Ficheiros"
_email: _email:
_follow: _follow:
title: "Você tem um novo seguidor" title: "Você tem um novo seguidor"
_mfm:
mention: "Menção"
quote: "Citar"
emoji: "Emoji personalizado"
search: "Buscar"
_theme: _theme:
keys: keys:
mention: "Menção" mention: "Menção"

View file

@ -455,7 +455,6 @@ youHaveNoGroups: "Nu ai niciun grup"
joinOrCreateGroup: "Primește o invitație într-un grup sau creează unul nou." joinOrCreateGroup: "Primește o invitație într-un grup sau creează unul nou."
noHistory: "Nu există istoric" noHistory: "Nu există istoric"
signinHistory: "Istoric autentificări" signinHistory: "Istoric autentificări"
disableAnimatedMfm: "Dezactivează MFM cu animații"
doing: "Se procesează..." doing: "Se procesează..."
category: "Categorie" category: "Categorie"
tags: "Etichete" tags: "Etichete"
@ -655,11 +654,6 @@ _role:
_email: _email:
_follow: _follow:
title: "te-a urmărit" title: "te-a urmărit"
_mfm:
mention: "Mențiune"
quote: "Citează"
emoji: "Emoji personalizat"
search: "Caută"
_theme: _theme:
description: "Descriere" description: "Descriere"
keys: keys:

View file

@ -462,7 +462,6 @@ youHaveNoGroups: "У вас нет ни одной группы"
joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные" joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные"
noHistory: "История пока пуста" noHistory: "История пока пуста"
signinHistory: "Журнал посещений" signinHistory: "Журнал посещений"
disableAnimatedMfm: "Отключение анимированной разметки MFM"
doing: "В процессе" doing: "В процессе"
category: "Категория" category: "Категория"
tags: "Метки" tags: "Метки"
@ -1309,72 +1308,6 @@ _nsfw:
respect: "Скрывать содержимое не для всех" respect: "Скрывать содержимое не для всех"
ignore: "Показывать содержимое не для всех" ignore: "Показывать содержимое не для всех"
force: "Скрывать вообще все файлы" force: "Скрывать вообще все файлы"
_mfm:
cheatSheet: "Подсказка по разметке MFM"
intro: "MFM — язык оформления текста, который придуман специально для Misskey и готов для применения во многих местах. На этой странице собраны и кратко изложены способы его использовать."
dummy: "Misskey расширяет границы Федиверса."
mention: "Упоминание"
mentionDescription: "При помощи знака «собака» перед именем можно упомянуть какого-нибудь пользователя."
hashtag: "Хэштег"
hashtagDescription: "При помощи знака «решётка» перед словом задаётся хэштег."
url: "Простая ссылка (URL)"
urlDescription: "Ссылки могут отображаться непосредственно."
link: "Ссылка с пояснением"
linkDescription: "Можно ссылку оформить в виде произвольного текста."
bold: "Жирный шрифт"
boldDescription: "Выделяет текст, делая буквы жирнее."
small: "Мелкий шрифт"
smallDescription: "Делает текст маленьким и незаметным."
center: "Выровнять элементы по центру"
centerDescription: "Так можно выровнять что-то по центру."
inlineCode: "Программа (в тексте)"
inlineCodeDescription: "Подсвечивает фрагмент программы внутри сплошного текста."
blockCode: "Программа (блок)"
blockCodeDescription: "Оформляет текст программы в виде отдельного блокоа. Он может состоять из множества строк."
inlineMath: "Математическое выражение (в тексте)"
inlineMathDescription: "Позволяет вставлять математические выражения внутрь текста при помощи языка KaTeX."
blockMath: "Математическое выражение (блок)"
blockMathDescription: "Оформляет математическое выражение (KaTeX) на отдельной строке."
quote: "Цитата"
quoteDescription: "Так можно процитировать чей-то текст."
emoji: "Собственные эмодзи"
emojiDescription: "Можно вставить эмодзи в текст, окружив название двоеточиями."
search: "Поиск"
searchDescription: "Можно добавить форму для поиска, сразу задав, что искать."
flip: "Переворот"
flipDescription: "Позволяет отразить текст зеркально по вертикали или горизонтали."
jelly: "Анимация желе (шлёп-плёп)"
jellyDescription: "Напоминает горку джема, дёргающуюся от шлепков."
tada: "Анимация (та-дам!)"
tadaDescription: "Получается нечто выпрыгивающее, как бы крича: «а вот и я!»"
jump: "Анимация прыжков (прыг-скок)"
jumpDescription: "Побуждает радостно подпрыгивать."
bounce: "Анимация отскоков (бум-бум)"
bounceDescription: "Это будет скакать как мяч."
shake: "Анимация дрожи (б-р-р-р)"
shakeDescription: "Такое дрожит, словно от холода. Или от страха."
twitch: "Анимация тряски"
twitchDescription: "Заставляет трястись как одержимого"
spin: "Вращение"
spinDescription: "Так можно крутить содержимое в разных направлениях."
x2: "Крупный шрифт"
x2Description: "Увеличивает содержимое."
x3: "Ещё крупнее"
x3Description: "Сильнее увеличивает содержимое."
x4: "Совсем крупно"
x4Description: "Увеличивает содержимое совсем сильно."
blur: "Размытие"
blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое стекло. Наведение указателя мыши на размытый текст возвращает чёткость."
font: "Шрифт"
fontDescription: "Так можно писать произвольным шрифтом."
rainbow: "Радуга"
rainbowDescription: "Заставлять содержимое отображаться в цветах радуги."
sparkle: "Искры"
sparkleDescription: "Добавляет эффект искрящихся частиц."
rotate: "Повернуть"
rotateDescription: "Поворачивает на заданный угол."
plain: "Буквально"
plainDescription: "MFM внутри отключается, и текст отображается как есть"
_instanceTicker: _instanceTicker:
none: "Не показывать" none: "Не показывать"
remote: "Только для других сайтов" remote: "Только для других сайтов"

View file

@ -464,7 +464,6 @@ youHaveNoGroups: "Nemáte žiadne skupiny"
joinOrCreateGroup: "Požiadajte o pozvanie do existujúcej skupiny alebo vytvorte novú." joinOrCreateGroup: "Požiadajte o pozvanie do existujúcej skupiny alebo vytvorte novú."
noHistory: "Žiadna história" noHistory: "Žiadna história"
signinHistory: "História prihlásení" signinHistory: "História prihlásení"
disableAnimatedMfm: "Vypnúť MFM s animáciou"
doing: "Pracujem..." doing: "Pracujem..."
category: "Kategórie" category: "Kategórie"
tags: "Značky" tags: "Značky"
@ -1013,72 +1012,6 @@ _nsfw:
respect: "Skryť NSFW médiá" respect: "Skryť NSFW médiá"
ignore: "Neskrývať NSFW médiá" ignore: "Neskrývať NSFW médiá"
force: "Skryť všetky médiá" force: "Skryť všetky médiá"
_mfm:
cheatSheet: "MFM Cheatsheet"
intro: "MFM je Misskey exkluzívny značkovací jazyk, ktorý sa dá používať na viacerých miestach. Tu môžete vidieť zoznam všetkej dostupnej MFM syntaxe."
dummy: "Misskey rozširuje svet Fediverza"
mention: "Zmienka"
mentionDescription: "Používateľa spomeniete použítím zavináča a mena používateľa"
hashtag: "Hashtag"
hashtagDescription: "Môžete zadať hashtag použitím mriežky a textu"
url: "URL"
urlDescription: "URL sa dajú zobraziť."
link: "Odkaz"
linkDescription: "Jednotlivé časti texty sa dajú zobraziť ako URL."
bold: "Tučné"
boldDescription: "Zvýrazní písmená tým, že budú tučnejšie."
small: "Malé"
smallDescription: "Zobrazí obsah malý a tenký."
center: "Vystrediť prvky"
centerDescription: "Zobrazí obsah v strede"
inlineCode: "Kód (inline)"
inlineCodeDescription: "Zobrazí kód so zvýraznením syntaxe."
blockCode: "Kód (blok)"
blockCodeDescription: "Zobrazí viacriadkový kód so zvýraznením syntaxe v bloku."
inlineMath: "Vzorec (inline)"
inlineMathDescription: "Zobrazí matematický vzorec (KaTeX) v riadku."
blockMath: "Vzorec (blok)"
blockMathDescription: "Zobrazí viacriadkový matematický vzorec (KaTeX) v bloku"
quote: "Citovať"
quoteDescription: "Zobrazí obsah ako citát."
emoji: "Vlastné emoji"
emojiDescription: "Pridaním dvojbodiek pred a za názov vlastnej emoji, sa dá zobraziť vlastná emoji."
search: "Hľadať"
searchDescription: "Zobrazí vyhľadávacie pole so zadaným textom."
flip: "Preklopiť"
flipDescription: "Preklopí obsah horizontálne alebo vertikálne"
jelly: "Animácia (želé)"
jellyDescription: "Obsah sa bude hýbať ako želé."
tada: "Animácia (tadá)"
tadaDescription: "Obsah sa bude hýbať ako Tada!"
jump: "Animácia (skok)"
jumpDescription: "Obsah skočí."
bounce: "Animácia (odraz)"
bounceDescription: "Obsah sa bude odrážať."
shake: "Animácia (trasenie)"
shakeDescription: "Obsah sa bude triasť."
twitch: "Animácia (myknutie)"
twitchDescription: "Obsahu dá animáciu silného trasenia."
spin: "Animácia (rotácia)"
spinDescription: "Obsahu pridá otáčajúcu animáciu."
x2: "Veľký"
x2Description: "Zobrazí obsah väčší."
x3: "Veľmi veľký"
x3Description: "Zobrazí obsah ešte väčší."
x4: "Neuveriteľne veľký"
x4Description: "Zobrazí obsah ešte viac veľký než veľmi veľký."
blur: "Rozmazanie"
blurDescription: "Týmto efektom môže byť obsah rozmazaný. Zaostrí sa keď ned neho príde kurzor."
font: "Písmo"
fontDescription: "Nastaví písmo, ktorým sa zobrazí text."
rainbow: "Dúha"
rainbowDescription: "Zobrazí obsah vo farbách dúhy."
sparkle: "Trblietky"
sparkleDescription: "Obsahu dodá trblietajúci efekt."
rotate: "Otáčať"
rotateDescription: "Otočí obsah o určitý uhol."
plain: "Obyčajné"
plainDescription: "Bez akejkoľvej syntaxe"
_instanceTicker: _instanceTicker:
none: "Nikdy nezobrazovať" none: "Nikdy nezobrazovať"
remote: "Zobraziť pre vzdialených používateľov" remote: "Zobraziť pre vzdialených používateľov"

View file

@ -371,11 +371,6 @@ pushNotificationNotSupported: "Din webbläsare eller instans har inte stöd för
_email: _email:
_follow: _follow:
title: "följde dig" title: "följde dig"
_mfm:
mention: "Nämn"
quote: "Citat"
emoji: "Anpassa emoji"
search: "Sök"
_channel: _channel:
setBanner: "Välj banner" setBanner: "Välj banner"
removeBanner: "Ta bort banner" removeBanner: "Ta bort banner"

View file

@ -465,7 +465,6 @@ youHaveNoGroups: "คุณยังไม่มีกลุ่ม"
joinOrCreateGroup: "รับเชิญเข้าร่วมกลุ่มหรือสร้างกลุ่มของคุณเองเลยนะ" joinOrCreateGroup: "รับเชิญเข้าร่วมกลุ่มหรือสร้างกลุ่มของคุณเองเลยนะ"
noHistory: "ไม่มีรายการ" noHistory: "ไม่มีรายการ"
signinHistory: "ประวัติการเข้าสู่ระบบ" signinHistory: "ประวัติการเข้าสู่ระบบ"
disableAnimatedMfm: "ปิดการใช้งาน MFM ด้วยแอนิเมชั่น"
doing: "กำลังประมวลผล......" doing: "กำลังประมวลผล......"
category: "หมวดหมู่" category: "หมวดหมู่"
tags: "แท็ก" tags: "แท็ก"
@ -1326,72 +1325,6 @@ _nsfw:
respect: "ซ่อนสื่อ NSFW" respect: "ซ่อนสื่อ NSFW"
ignore: "อย่าซ่อนสื่อ NSFW" ignore: "อย่าซ่อนสื่อ NSFW"
force: "ซ่อนสื่อทั้งหมด" force: "ซ่อนสื่อทั้งหมด"
_mfm:
cheatSheet: "โค้ด MFM Cheat Sheet"
intro: "MFM เป็นภาษามาร์กอัปพิเศษเฉพาะของ Misskey ที่สามารถใช้ได้ในหลายที่ คุณยังสามารถดูรายการไวยากรณ์ MFM ที่มีอยู่ทั้งหมดได้ที่นี่นะ"
dummy: "Misskey ขยายโลกของ Fediverse"
mention: "กล่าวถึง"
mentionDescription: "คุณสามารถระบุผู้ใช้โดยใช้ At-Symbol และชื่อผู้ใช้ได้นะ"
hashtag: "แฮชแท็ก"
hashtagDescription: "คุณสามารถระบุชื่อแฮชแท็กได้โดยใช้เครื่องหมายตัวเลขและข้อความได้นะ"
url: "URL"
urlDescription: "สามารถแสดง URL ได้นะ"
link: "ลิงก์"
linkDescription: "เจาะจงเฉพาะ ส่วนของข้อความที่สามารถแสดงเป็น URL ได้"
bold: "ตัวหนา"
boldDescription: "ไฮไลท์ตัวอักษรโดยทำให้หนาขึ้น"
small: "ขนาดเล็ก"
smallDescription: "แสดงผลเนื้อหาขนาดเล็กและบาง"
center: "เซ็นเตอร์"
centerDescription: "แสดงผลเนื้อหาเป็นศูนย์กลาง"
inlineCode: "โค้ด (อินไลน์)"
inlineCodeDescription: "แสดงผลการเน้นไวยากรณ์แบบอินไลน์สำหรับโค้ด (โปรแกรม)"
blockCode: "โค้ด (บล็อก)"
blockCodeDescription: "แสดงผลการเน้นไวยากรณ์สำหรับโค้ดหลายบรรทัด (โปรแกรม) ในบล็อก"
inlineMath: "คณิต (อินไลน์)"
inlineMathDescription: "แสดงผลสูตรคณิต (KaTeX) ในบรรทัด"
blockMath: "คณิต (บล็อก)"
blockMathDescription: "แสดงผลสูตรคณิตหลายบรรทัด (KaTeX) ในบล็อก"
quote: "อ้างคำพูด"
quoteDescription: "แสดงผลเนื้อหาเป็นใบเสนอราคา"
emoji: "กำหนดอีโมจิเอง"
emojiDescription: "โดยล้อมรอบชื่ออีโมจิที่กำหนดเองด้วยเครื่องหมายทวิภาค จะสามารถแสดงผลอีโมจิที่กำหนดเองได้"
search: "ค้นหา"
searchDescription: "แสดงผลกล่องค้นหาพร้อมกับข้อความที่ป้อนไว้ล่วงหน้า"
flip: "พลิก"
flipDescription: "พลิกเนื้อหาในแนวนอนหรือแนวตั้ง"
jelly: "แอนิเมชั่น (เยลลี่)"
jellyDescription: "ให้เนื้อหาเป็นแอนิเมชั่นเหมือนเยลลี่"
tada: "แอนิเมชั่น (ธาดา)"
tadaDescription: "ให้เนื้อหาเป็นแอนิเมชั่นเหมือน \"ทาด้า!\""
jump: "อนิเมชั่น (กระโดด)"
jumpDescription: "ให้เนื้อหามีภาพเคลื่อนไหวแบบกระโดด"
bounce: "อนิเมชั่น (เด้ง)"
bounceDescription: "ให้เนื้อหามีอนิเมชั่นเด้ง"
shake: "อนิเมชั่น (เขย่า)"
shakeDescription: "ให้เนื้อหามีภาพเคลื่อนไหวสั่น"
twitch: "แอนิเมชั่น (Twitch)"
twitchDescription: "ให้เนื้อหามีแอนิเมชั่นกระตุกอย่างแรง"
spin: "แอนิเมชั่น (สปิน)"
spinDescription: "ให้เนื้อหาเป็นภาพเคลื่อนไหวแบบหมุน"
x2: "ขนาดใหญ่"
x2Description: "แสดงเนื้อหาที่ใหญ่ขึ้น"
x3: "ใหญ่มาก"
x3Description: "แสดงเนื้อหาอีเว้นท์ที่ใหญ่ขึ้น"
x4: "ใหญ่อย่างไม่น่าเชื่อ"
x4Description: "แสดงผลเนื้อหาที่ใหญ่กว่าใหญ่กว่าขนาดใหญ่"
blur: "เบลอ"
blurDescription: "เบลอเนื้อหา จะแสดงผลอย่างชัดเจนต่อเมื่อวางเมาส์เหนือ"
font: "ตัวอักษร"
fontDescription: "ตั้งค่าตัวอักษรเพื่อแสดงเนื้อหาใน"
rainbow: "สายรุ้ง"
rainbowDescription: "ทำให้เนื้อหานั้นปรากฏเป็นสีรุ้ง"
sparkle: "กลิตเตอร์"
sparkleDescription: "ให้เนื้อหานั้นมีเอฟเฟกต์แบบอนุภาคประกาย"
rotate: "หมุนหน้าจอ"
rotateDescription: "เปลี่ยนเนื้อหาตามด้วยมุมที่ระบุไว้"
plain: "เรียบง่าย"
plainDescription: "ปิดการใช้งานเอฟเฟกต์ของ MFM ทั้งหมดที่มีอยู่ในเอฟเฟกต์ MFM นี้"
_instanceTicker: _instanceTicker:
none: "ไม่ต้องแสดง" none: "ไม่ต้องแสดง"
remote: "แสดงสำหรับผู้ใช้ระยะไกล" remote: "แสดงสำหรับผู้ใช้ระยะไกล"

View file

@ -48,8 +48,6 @@ smtpUser: "Kullanıcı Adı"
smtpPass: "Şifre" smtpPass: "Şifre"
user: "Kullanıcı" user: "Kullanıcı"
searchByGoogle: "Arama" searchByGoogle: "Arama"
_mfm:
search: "Arama"
_sfx: _sfx:
notification: "Bildirim" notification: "Bildirim"
_widgets: _widgets:

View file

@ -2,5 +2,3 @@
_lang_: "ياپونچە" _lang_: "ياپونچە"
search: "ئىزدەش" search: "ئىزدەش"
searchByGoogle: "ئىزدەش" searchByGoogle: "ئىزدەش"
_mfm:
search: "ئىزدەش"

View file

@ -461,7 +461,6 @@ youHaveNoGroups: "Немає груп"
joinOrCreateGroup: "Отримуйте запрошення до груп або створюйте свої власні групи." joinOrCreateGroup: "Отримуйте запрошення до груп або створюйте свої власні групи."
noHistory: "Історія порожня" noHistory: "Історія порожня"
signinHistory: "Історія входів" signinHistory: "Історія входів"
disableAnimatedMfm: "Відключити анімації MFM"
doing: "Виконується" doing: "Виконується"
category: "Категорія" category: "Категорія"
tags: "Теги" tags: "Теги"
@ -1191,65 +1190,6 @@ _nsfw:
respect: "Приховувати NSFW медіа" respect: "Приховувати NSFW медіа"
ignore: "Не приховувати NSFW медіа" ignore: "Не приховувати NSFW медіа"
force: "Приховувати всі медіа файли" force: "Приховувати всі медіа файли"
_mfm:
cheatSheet: " Довідка MFM"
intro: "MFM це ексклюзивна мова розмітки тексту в Misskey, яку можна використовувати в багатьох місцях. Тут ви можете переглянути приклади її синтаксису."
dummy: "Misskey розширює світ Федіверсу"
mention: "Згадка"
mentionDescription: "За допомогою знака \"@\" перед ім'ям можна згадати конкретного користувача."
hashtag: "Хештеґ"
hashtagDescription: "За допомогою знака \"решітка\" перед словом задається хештег."
url: "URL"
urlDescription: "Відображаються URL-адреси."
link: "Посилання"
linkDescription: "Окремі частини тексту можуть містити посилання"
bold: "Жирний шрифт"
boldDescription: "Виділяє літери, роблячи їх товще"
small: "Дрібний шрифт"
smallDescription: "Робить текст маленьким і тонким"
center: "По центру"
centerDescription: "Показує вміст у центрі"
inlineCode: "Код (у рядку)"
inlineCodeDescription: "Показує фрагмент тексту у рядку як програмний код"
blockCode: "Код (блок)"
blockCodeDescription: "Показує кілька рядків тексту як блок програмного кода"
inlineMath: "Формула (у рядку)"
inlineMathDescription: "Відображення математичних формул (KaTeX) у рядку"
blockMath: "Формули (блок)"
blockMathDescription: "Відображати багаторядкові формули (KaTeX) блоками"
quote: "Цитата"
quoteDescription: "Відображає зміст як цитату."
emoji: "Кастомні емоджі"
emojiDescription: "Щоб показати нетиповий емоджі, потрібно ввести його назву в двокрапках."
search: "Пошук"
searchDescription: "Відображає вікно пошуку з попередньо введеним текстом"
flip: "Перевернути"
flipDescription: "Віддзеркалює вміст по горизонталі або вертикалі"
jelly: "Анімація (желе)"
jellyDescription: "Створює желеподібну анімацію"
tada: "Анімація (Тада!)"
tadaDescription: "Створює анімацію з відчуттям \"Тада!\""
jump: "Анімація (стрибки)"
jumpDescription: "Показує стрибаючу анімацію"
bounce: "Анімація (пружина)"
bounceDescription: "Надає вмісту стрибаючу анімацію."
shake: "Анімація (Shake)"
shakeDescription: "Надає вмісту тремтливу анімацію."
twitch: "Анімація (Twitch)"
spin: "Анімація (Spin)"
x2: "Великий"
x2Description: "Показує контент збільшеним."
x3: "Дуже великий"
x3Description: "Показує контент ще більшим."
x4: "Надзвичайно великий"
x4Description: "Показує контент надзвичайно великим."
blur: "Розмиття"
blurDescription: "Цей ефект зробить контент розмитим. Контент можна зробити чітким, якщо навести на нього вказівник миші."
font: "Шрифт"
fontDescription: "Встановлює шрифт для контенту."
rotate: "Обертати"
plain: "Звичайний"
plainDescription: "Деактивує всі ефекти MFM, що містяться в цьому ефекті MFM."
_instanceTicker: _instanceTicker:
none: "Не відображати" none: "Не відображати"
remote: "Відображати для віддалених користувачів" remote: "Відображати для віддалених користувачів"

View file

@ -457,7 +457,6 @@ youHaveNoGroups: "Không có nhóm nào"
joinOrCreateGroup: "Tham gia hoặc tạo một nhóm mới." joinOrCreateGroup: "Tham gia hoặc tạo một nhóm mới."
noHistory: "Không có dữ liệu" noHistory: "Không có dữ liệu"
signinHistory: "Lịch sử đăng nhập" signinHistory: "Lịch sử đăng nhập"
disableAnimatedMfm: "Tắt MFM với chuyển động"
doing: "Đang xử lý..." doing: "Đang xử lý..."
category: "Phân loại" category: "Phân loại"
tags: "Thẻ" tags: "Thẻ"
@ -992,72 +991,6 @@ _nsfw:
respect: "Ẩn nội dung NSFW" respect: "Ẩn nội dung NSFW"
ignore: "Hiện nội dung NSFW" ignore: "Hiện nội dung NSFW"
force: "Ẩn mọi media" force: "Ẩn mọi media"
_mfm:
cheatSheet: "MFM Cheatsheet"
intro: "MFM là ngôn ngữ phát triển độc quyền của Misskey có thể được sử dụng ở nhiều nơi. Tại đây bạn có thể xem danh sách tất cả các cú pháp MFM có sẵn."
dummy: "Misskey mở rộng thế giới Fediverse"
mention: "Nhắc đến"
mentionDescription: "Bạn có thể nhắc đến ai đó bằng cách sử dụng @tên người dùng."
hashtag: "Hashtag"
hashtagDescription: "Bạn có thể tạo một hashtag bằng #chữ hoặc #số."
url: "URL"
urlDescription: "Những URL có thể hiển thị."
link: "Đường dẫn"
linkDescription: "Các phần cụ thể của văn bản có thể được hiển thị dưới dạng URL."
bold: "In đậm"
boldDescription: "Nổi bật các chữ cái bằng cách làm chúng dày hơn."
small: "Nhỏ"
smallDescription: "Hiển thị nội dung nhỏ và mỏng."
center: "Giữa"
centerDescription: "Hiển thị nội dung căn giữa."
inlineCode: "Mã (Trong dòng)"
inlineCodeDescription: "Hiển thị tô sáng cú pháp trong dòng cho mã (chương trình)."
blockCode: "Mã (Khối)"
blockCodeDescription: "Hiển thị tô sáng cú pháp cho mã nhiều dòng (chương trình) trong một khối."
inlineMath: "Toán học (Trong dòng)"
inlineMathDescription: "Hiển thị công thức toán (KaTeX) trong dòng"
blockMath: "Toán học (Khối)"
blockMathDescription: "Hiển thị công thức toán học nhiều dòng (KaTeX) trong một khối"
quote: "Trích dẫn"
quoteDescription: "Hiển thị nội dung dạng lời trích dạng."
emoji: "Tùy chỉnh emoji"
emojiDescription: "Hiển thị emoji với cú pháp :tên emoji:"
search: "Tìm kiếm"
searchDescription: "Hiển thị hộp tìm kiếm với văn bản được nhập trước."
flip: "Lật"
flipDescription: "Lật nội dung theo chiều ngang hoặc chiều dọc."
jelly: "Chuyển động (Thạch rau câu)"
jellyDescription: "Cho phép nội dung chuyển động giống như thạch rau câu."
tada: "Chuyển động (Tada)"
tadaDescription: "Cho phép nội dung chuyển động kiểu \"Tada!\"."
jump: "Chuyển động (Nhảy múa)"
jumpDescription: "Cho phép nội dung chuyển động nhảy nhót."
bounce: "Chuyển động (Cà tưng)"
bounceDescription: "Cho phép nội dung chuyển động cà tưng."
shake: "Chuyển động (Rung)"
shakeDescription: "Cho phép nội dung chuyển động rung lắc."
twitch: "Chuyển động (Co rút)"
twitchDescription: "Cho phép nội dung chuyển động co rút."
spin: "Chuyển động (Xoay tít)"
spinDescription: "Cho phép nội dung chuyển động xoay tít."
x2: "Lớn"
x2Description: "Hiển thị nội dung cỡ lớn hơn."
x3: "Rất lớn"
x3Description: "Hiển thị nội dung cỡ lớn hơn nữa."
x4: "Khổng lồ"
x4Description: "Hiển thị nội dung cỡ khổng lồ."
blur: "Làm mờ"
blurDescription: "Làm mờ nội dung. Nó sẽ được hiển thị rõ ràng khi di chuột qua."
font: "Phông chữ"
fontDescription: "Chọn phông chữ để hiển thị nội dung."
rainbow: "Cầu vồng"
rainbowDescription: "Làm cho nội dung hiển thị với màu sắc cầu vồng."
sparkle: "Lấp lánh"
sparkleDescription: "Làm cho nội dung hiệu ứng hạt lấp lánh."
rotate: "Xoay"
rotateDescription: "Xoay nội dung theo một góc cụ thể."
plain: "Đơn giản"
plainDescription: "Vô hiệu hóa mọi hiệu ứng MFM chứa trong hiệu ứng MFM này."
_instanceTicker: _instanceTicker:
none: "Không hiển thị" none: "Không hiển thị"
remote: "Hiện cho người dùng từ máy chủ khác" remote: "Hiện cho người dùng từ máy chủ khác"

View file

@ -467,7 +467,6 @@ youHaveNoGroups: "没有群组"
joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。" joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
noHistory: "没有历史记录" noHistory: "没有历史记录"
signinHistory: "登录历史" signinHistory: "登录历史"
disableAnimatedMfm: "禁用MFM动画"
doing: "正在进行" doing: "正在进行"
category: "类别" category: "类别"
tags: "标签" tags: "标签"
@ -1330,72 +1329,6 @@ _nsfw:
respect: "隐藏敏感内容" respect: "隐藏敏感内容"
ignore: "不隐藏敏感内容" ignore: "不隐藏敏感内容"
force: "总是隐藏内容" force: "总是隐藏内容"
_mfm:
cheatSheet: "MFM代码速查表"
intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。"
dummy: "通过Misskey扩展联邦宇宙的世界"
mention: "提及"
mentionDescription: "可以使用 @+用户名 来指示特定用户"
hashtag: "话题标签"
hashtagDescription: "可以使用井号+文字来表示话题标签。"
url: "URL"
urlDescription: "可以表示URL地址。"
link: "链接"
linkDescription: "可以将部分文字和URL关联起来。"
bold: "粗体"
boldDescription: "可以将文字显示为粗体来表示强调。"
small: "缩小"
smallDescription: "可以使内容文字变小、变淡。"
center: "居中"
centerDescription: "可以将内容居中显示。"
inlineCode: "代码(内嵌)"
inlineCodeDescription: "将文字中的程序代码语法高亮显示。"
blockCode: "代码(块)"
blockCodeDescription: "语法高亮显示整块程序代码。"
inlineMath: "数学公式(内嵌)"
inlineMathDescription: "显示内嵌的KaTex公式。"
blockMath: "数学公式(块)"
blockMathDescription: "显示整块的多行KaTex数学公式。"
quote: "引用"
quoteDescription: "可以用来表示引用的内容。"
emoji: "自定义表情符号"
emojiDescription: "可以将自定义表情符号使用冒号括起来,就可以显示自定义表情符号了。"
search: "搜索"
searchDescription: "显示含有搜索内容示例的搜索框。"
flip: "翻转"
flipDescription: "将内容上下或左右翻转。"
jelly: "动画(果冻)"
jellyDescription: "显示果冻一样的动画效果。"
tada: "动画(锵锵)"
tadaDescription: "显示\"锵锵!\"的动画效果。"
jump: "动画(跳动)"
jumpDescription: "显示跳动的动画效果。"
bounce: "动画(弹性)"
bounceDescription: "显示弹性一样的动画效果。"
shake: "动画(摇晃)"
shakeDescription: "显示摇晃的动画效果。"
twitch: "动画(颤抖)"
twitchDescription: "显示强烈颤抖的动画效果。"
spin: "动画(旋转)"
spinDescription: "显示旋转的动画效果。"
x2: "大"
x2Description: "以大尺寸显示内容。"
x3: "非常大"
x3Description: "以更大尺寸显示内容。"
x4: "最大"
x4Description: "以最大尺寸显示内容。"
blur: "模糊"
blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。"
font: "字体"
fontDescription: "可以设置内容所使用的字体。"
rainbow: "彩虹"
rainbowDescription: "用彩虹色来显示内容。"
sparkle: "闪光"
sparkleDescription: "添加发光粒子效果。"
rotate: "旋转"
rotateDescription: "旋转指定的角度。"
plain: "简洁"
plainDescription: "禁用所有内部语法。"
_instanceTicker: _instanceTicker:
none: "不显示" none: "不显示"
remote: "仅远程用户" remote: "仅远程用户"

View file

@ -467,7 +467,6 @@ youHaveNoGroups: "找不到群組"
joinOrCreateGroup: "請加入現有群組,或創建新群組。" joinOrCreateGroup: "請加入現有群組,或創建新群組。"
noHistory: "沒有歷史紀錄" noHistory: "沒有歷史紀錄"
signinHistory: "登入歷史" signinHistory: "登入歷史"
disableAnimatedMfm: "禁用MFM動畫"
doing: "正在進行" doing: "正在進行"
category: "類別" category: "類別"
tags: "標籤" tags: "標籤"
@ -1330,72 +1329,6 @@ _nsfw:
respect: "隱藏敏感內容" respect: "隱藏敏感內容"
ignore: "不隱藏敏感內容" ignore: "不隱藏敏感內容"
force: "隱藏所有內容" force: "隱藏所有內容"
_mfm:
cheatSheet: "MFM代碼小抄"
intro: "MFM是Misskey專用的標記語言可以在Misskey中的各個位置使用。 您可以這裏看到MFM可用語法列表。"
dummy: "Misskey拓展了Fediverse的世界"
mention: "提及"
mentionDescription: "透過 @+用戶名 來標示特定使用者。"
hashtag: "#tag"
hashtagDescription: "可以使用\"#\"符號後加文字表示話題標籤。"
url: "URL"
urlDescription: "可以展示URL位址。"
link: "鏈接"
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
bold: "粗體"
boldDescription: "可以將文字顯示为粗體来強調。"
small: "縮小"
smallDescription: "可以使內容文字變小、變淡。"
center: "置中"
centerDescription: "可以將內容置中顯示。"
inlineCode: "程式碼(内嵌)"
inlineCodeDescription: "在行內用高亮度顯示,例如程式碼語法。"
blockCode: "程式碼(區塊)"
blockCodeDescription: "在區塊中用高亮度顯示,例如複數行的程式碼語法。"
inlineMath: "數學公式(內嵌)"
inlineMathDescription: "顯示內嵌的KaTex數學公式。"
blockMath: "數學公式(方塊)"
blockMathDescription: "以區塊顯示複數行的KaTex數學式。"
quote: "引用"
quoteDescription: "可以用來表示引用的内容。"
emoji: "自訂表情符號"
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
search: "搜尋"
searchDescription: "您可以顯示所輸入的搜索框。"
flip: "翻轉"
flipDescription: "將內容上下或左右翻轉。"
jelly: "動畫(果凍)"
jellyDescription: "顯示果凍一樣的動畫效果。"
tada: "動畫(鏘~)"
tadaDescription: "顯示「鏘~!」這種感覺的動畫效果。"
jump: "動畫(跳動)"
jumpDescription: "顯示跳動的動畫效果。"
bounce: "動畫(反彈)"
bounceDescription: "顯示有彈性的動畫效果。"
shake: "動畫(搖晃)"
shakeDescription: "顯示顫抖的動畫效果。"
twitch: "動畫(顫抖)"
twitchDescription: "顯示強烈顫抖的動畫效果。"
spin: "動畫(旋轉)"
spinDescription: "顯示旋轉的動畫效果。"
x2: "大"
x2Description: "放大顯示內容。"
x3: "較大"
x3Description: "放大顯示內容。"
x4: "最大"
x4Description: "將顯示內容放至最大。"
blur: "模糊"
blurDescription: "產生模糊效果。将游標放在上面即可將内容顯示出來。"
font: "字型"
fontDescription: "您可以設定顯示內容的字型"
rainbow: "彩虹"
rainbowDescription: "用彩虹色來顯示內容。"
sparkle: "閃閃發光"
sparkleDescription: "添加閃閃發光的粒子效果。"
rotate: "旋轉"
rotateDescription: "以指定的角度旋轉。"
plain: "簡潔"
plainDescription: "停用全部的內部語法。"
_instanceTicker: _instanceTicker:
none: "隱藏" none: "隱藏"
remote: "向遠端使用者顯示" remote: "向遠端使用者顯示"

View file

@ -1,6 +1,6 @@
{ {
"name": "misskey", "name": "misskey",
"version": "13.5.6", "version": "13.6.0",
"codename": "nasubi", "codename": "nasubi",
"repository": { "repository": {
"type": "git", "type": "git",

View file

@ -116,7 +116,7 @@
"tsc-alias": "1.8.2", "tsc-alias": "1.8.2",
"tsconfig-paths": "4.1.2", "tsconfig-paths": "4.1.2",
"twemoji-parser": "14.0.0", "twemoji-parser": "14.0.0",
"typeorm": "0.3.12", "typeorm": "0.3.11",
"typescript": "4.9.5", "typescript": "4.9.5",
"ulid": "2.3.0", "ulid": "2.3.0",
"unzipper": "0.10.11", "unzipper": "0.10.11",

View file

@ -211,8 +211,14 @@ export class RoleService implements OnApplicationShutdown {
const assignedRoleIds = assigns.map(x => x.roleId); const assignedRoleIds = assigns.map(x => x.roleId);
const roles = await this.rolesCache.fetch(null, () => this.rolesRepository.findBy({})); const roles = await this.rolesCache.fetch(null, () => this.rolesRepository.findBy({}));
const assignedBadgeRoles = roles.filter(r => r.asBadge && assignedRoleIds.includes(r.id)); const assignedBadgeRoles = roles.filter(r => r.asBadge && assignedRoleIds.includes(r.id));
// コンディショナルロールも含めるのは負荷高そうだから一旦無し const badgeCondRoles = roles.filter(r => r.asBadge && (r.target === 'conditional'));
return assignedBadgeRoles; if (badgeCondRoles.length > 0) {
const user = roles.some(r => r.target === 'conditional') ? await this.userCacheService.findById(userId) : null;
const matchedBadgeCondRoles = badgeCondRoles.filter(r => this.evalCond(user!, r.condFormula));
return [...assignedBadgeRoles, ...matchedBadgeCondRoles];
} else {
return assignedBadgeRoles;
}
} }
@bindThis @bindThis

View file

@ -32,7 +32,7 @@
<MkButton v-if="showCancelButton || input || select" inline @click="cancel">{{ cancelText ?? i18n.ts.cancel }}</MkButton> <MkButton v-if="showCancelButton || input || select" inline @click="cancel">{{ cancelText ?? i18n.ts.cancel }}</MkButton>
</div> </div>
<div v-if="actions" :class="$style.buttons"> <div v-if="actions" :class="$style.buttons">
<MkButton v-for="action in actions" :key="action.text" inline :primary="action.primary" @click="() => { action.callback(); close(); }">{{ action.text }}</MkButton> <MkButton v-for="action in actions" :key="action.text" inline :primary="action.primary" @click="() => { action.callback(); modal?.close(); }">{{ action.text }}</MkButton>
</div> </div>
</div> </div>
</MkModal> </MkModal>

View file

@ -8,7 +8,7 @@
</div> </div>
</div> </div>
</div> </div>
<div v-else :class="$style.visible"> <div v-else :class="$style.visible" :style="defaultStore.state.darkMode ? '--c: rgb(255 255 255 / 2%);' : '--c: rgb(0 0 0 / 2%);'">
<a <a
:class="$style.imageContainer" :class="$style.imageContainer"
:href="image.url" :href="image.url"
@ -78,7 +78,6 @@ watch(() => props.image, () => {
position: relative; position: relative;
//box-shadow: 0 0 0 1px var(--divider) inset; //box-shadow: 0 0 0 1px var(--divider) inset;
background: var(--bg); background: var(--bg);
--c: rgb(0 0 0 / 2%);
background-image: linear-gradient(45deg, var(--c) 16.67%, var(--bg) 16.67%, var(--bg) 50%, var(--c) 50%, var(--c) 66.67%, var(--bg) 66.67%, var(--bg) 100%); background-image: linear-gradient(45deg, var(--c) 16.67%, var(--bg) 16.67%, var(--bg) 50%, var(--c) 50%, var(--c) 66.67%, var(--bg) 66.67%, var(--bg) 100%);
background-size: 16px 16px; background-size: 16px 16px;
} }

View file

@ -5,14 +5,14 @@
ref="el" ref="el"
v-hotkey="keymap" v-hotkey="keymap"
:class="$style.root" :class="$style.root"
:tabindex="!isDeleted ? '-1' : null" :tabindex="!isDeleted ? '-1' : undefined"
> >
<MkNoteSub v-if="appearNote.reply" :note="appearNote.reply" :class="$style.replyTo"/> <MkNoteSub v-if="appearNote.reply && !renoteCollapsed" :note="appearNote.reply" :class="$style.replyTo"/>
<div v-if="pinned" :class="$style.tip"><i class="ti ti-pin"></i> {{ i18n.ts.pinnedNote }}</div> <div v-if="pinned" :class="$style.tip"><i class="ti ti-pin"></i> {{ i18n.ts.pinnedNote }}</div>
<!--<div v-if="appearNote._prId_" class="tip"><i class="fas fa-bullhorn"></i> {{ i18n.ts.promotion }}<button class="_textButton hide" @click="readPromo()">{{ i18n.ts.hideThisNote }} <i class="ti ti-x"></i></button></div>--> <!--<div v-if="appearNote._prId_" class="tip"><i class="fas fa-bullhorn"></i> {{ i18n.ts.promotion }}<button class="_textButton hide" @click="readPromo()">{{ i18n.ts.hideThisNote }} <i class="ti ti-x"></i></button></div>-->
<!--<div v-if="appearNote._featuredId_" class="tip"><i class="ti ti-bolt"></i> {{ i18n.ts.featured }}</div>--> <!--<div v-if="appearNote._featuredId_" class="tip"><i class="ti ti-bolt"></i> {{ i18n.ts.featured }}</div>-->
<div v-if="isRenote" :class="$style.renote"> <div v-if="isRenote" :class="$style.renote">
<MkAvatar v-once :class="$style.renoteAvatar" :user="note.user" link preview/> <MkAvatar :class="$style.renoteAvatar" :user="note.user" link preview/>
<i class="ti ti-repeat" style="margin-right: 4px;"></i> <i class="ti ti-repeat" style="margin-right: 4px;"></i>
<I18n :src="i18n.ts.renotedBy" tag="span" :class="$style.renoteText"> <I18n :src="i18n.ts.renotedBy" tag="span" :class="$style.renoteText">
<template #user> <template #user>
@ -34,8 +34,12 @@
<span v-if="note.localOnly" style="margin-left: 0.5em;" :title="i18n.ts._visibility['localOnly']"><i class="ti ti-world-off"></i></span> <span v-if="note.localOnly" style="margin-left: 0.5em;" :title="i18n.ts._visibility['localOnly']"><i class="ti ti-world-off"></i></span>
</div> </div>
</div> </div>
<article :class="$style.article" @contextmenu.stop="onContextmenu"> <div v-if="renoteCollapsed" :class="$style.collapsedRenoteTarget">
<MkAvatar v-once :class="$style.avatar" :user="appearNote.user" link preview/> <MkAvatar :class="$style.collapsedRenoteTargetAvatar" :user="appearNote.user" link preview/>
<Mfm :text="getNoteSummary(appearNote)" :plain="true" :nowrap="true" :author="appearNote.user" :class="$style.collapsedRenoteTargetText" @click="renoteCollapsed = false"/>
</div>
<article v-else :class="$style.article" @contextmenu.stop="onContextmenu">
<MkAvatar :class="$style.avatar" :user="appearNote.user" link preview/>
<div :class="$style.main"> <div :class="$style.main">
<MkNoteHeader :class="$style.header" :note="appearNote" :mini="true"/> <MkNoteHeader :class="$style.header" :note="appearNote" :mini="true"/>
<MkInstanceTicker v-if="showTicker" :class="$style.ticker" :instance="appearNote.user.instance"/> <MkInstanceTicker v-if="showTicker" :class="$style.ticker" :instance="appearNote.user.instance"/>
@ -60,7 +64,7 @@
<div v-if="appearNote.files.length > 0" :class="$style.files"> <div v-if="appearNote.files.length > 0" :class="$style.files">
<MkMediaList :media-list="appearNote.files"/> <MkMediaList :media-list="appearNote.files"/>
</div> </div>
<MkPoll v-if="appearNote.poll" ref="pollViewer" :note="appearNote" :class="$style.poll"/> <MkPoll v-if="appearNote.poll" :note="appearNote" :class="$style.poll"/>
<MkUrlPreview v-for="url in urls" :key="url" :url="url" :compact="true" :detail="false" :class="$style.urlPreview"/> <MkUrlPreview v-for="url in urls" :key="url" :url="url" :compact="true" :detail="false" :class="$style.urlPreview"/>
<div v-if="appearNote.renote" :class="$style.quote"><MkNoteSimple :note="appearNote.renote" :class="$style.quoteNote"/></div> <div v-if="appearNote.renote" :class="$style.quote"><MkNoteSimple :note="appearNote.renote" :class="$style.quoteNote"/></div>
<button v-if="isLong && collapsed" :class="$style.collapsed" class="_button" @click="collapsed = false"> <button v-if="isLong && collapsed" :class="$style.collapsed" class="_button" @click="collapsed = false">
@ -73,7 +77,13 @@
<MkA v-if="appearNote.channel && !inChannel" :class="$style.channel" :to="`/channels/${appearNote.channel.id}`"><i class="ti ti-device-tv"></i> {{ appearNote.channel.name }}</MkA> <MkA v-if="appearNote.channel && !inChannel" :class="$style.channel" :to="`/channels/${appearNote.channel.id}`"><i class="ti ti-device-tv"></i> {{ appearNote.channel.name }}</MkA>
</div> </div>
<footer :class="$style.footer"> <footer :class="$style.footer">
<MkReactionsViewer ref="reactionsViewer" :note="appearNote"/> <MkReactionsViewer :note="appearNote" :max-number="16">
<template v-slot:more>
<button class="_button" :class="$style.reactionDetailsButton" @click="showReactions">
{{ i18n.ts.more }}
</button>
</template>
</MkReactionsViewer>
<button :class="$style.footerButton" class="_button" @click="reply()"> <button :class="$style.footerButton" class="_button" @click="reply()">
<i class="ti ti-arrow-back-up"></i> <i class="ti ti-arrow-back-up"></i>
<p v-if="appearNote.repliesCount > 0" :class="$style.footerButtonCount">{{ appearNote.repliesCount }}</p> <p v-if="appearNote.repliesCount > 0" :class="$style.footerButtonCount">{{ appearNote.repliesCount }}</p>
@ -116,7 +126,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, inject, onMounted, onUnmounted, reactive, ref, shallowRef, Ref } from 'vue'; import { computed, inject, onMounted, onUnmounted, reactive, ref, shallowRef, Ref, defineAsyncComponent } from 'vue';
import * as mfm from 'mfm-js'; import * as mfm from 'mfm-js';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import MkNoteSub from '@/components/MkNoteSub.vue'; import MkNoteSub from '@/components/MkNoteSub.vue';
@ -144,6 +154,8 @@ import { useNoteCapture } from '@/scripts/use-note-capture';
import { deepClone } from '@/scripts/clone'; import { deepClone } from '@/scripts/clone';
import { useTooltip } from '@/scripts/use-tooltip'; import { useTooltip } from '@/scripts/use-tooltip';
import { claimAchievement } from '@/scripts/achievements'; import { claimAchievement } from '@/scripts/achievements';
import { getNoteSummary } from '@/scripts/get-note-summary';
import { shownNoteIds } from '@/os';
const props = defineProps<{ const props = defineProps<{
note: misskey.entities.Note; note: misskey.entities.Note;
@ -180,18 +192,23 @@ const reactButton = shallowRef<HTMLElement>();
let appearNote = $computed(() => isRenote ? note.renote as misskey.entities.Note : note); let appearNote = $computed(() => isRenote ? note.renote as misskey.entities.Note : note);
const isMyRenote = $i && ($i.id === note.userId); const isMyRenote = $i && ($i.id === note.userId);
const showContent = ref(false); const showContent = ref(false);
const urls = appearNote.text ? extractUrlFromMfm(mfm.parse(appearNote.text)) : null;
const isLong = (appearNote.cw == null && appearNote.text != null && ( const isLong = (appearNote.cw == null && appearNote.text != null && (
(appearNote.text.split('\n').length > 9) || (appearNote.text.split('\n').length > 9) ||
(appearNote.text.length > 500) (appearNote.text.length > 500) ||
(appearNote.files.length >= 5) ||
(urls && urls.length >= 4)
)); ));
const collapsed = ref(appearNote.cw == null && isLong); const collapsed = ref(appearNote.cw == null && isLong);
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));
const translation = ref(null); const translation = ref<any>(null);
const translating = ref(false); const translating = ref(false);
const urls = appearNote.text ? extractUrlFromMfm(mfm.parse(appearNote.text)) : null;
const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.user.instance); const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.user.instance);
const canRenote = computed(() => ['public', 'home'].includes(appearNote.visibility) || appearNote.userId === $i.id); const canRenote = computed(() => ['public', 'home'].includes(appearNote.visibility) || appearNote.userId === $i.id);
let renoteCollapsed = $ref(isRenote && (($i && ($i.id === note.userId)) || shownNoteIds.has(appearNote.id)));
shownNoteIds.add(appearNote.id);
const keymap = { const keymap = {
'r': () => reply(true), 'r': () => reply(true),
@ -350,6 +367,12 @@ function readPromo() {
}); });
isDeleted.value = true; isDeleted.value = true;
} }
function showReactions(): void {
os.popup(defineAsyncComponent(() => import('@/components/MkReactedUsersDialog.vue')), {
noteId: appearNote.id,
}, {}, 'closed');
}
</script> </script>
<style lang="scss" module> <style lang="scss" module>
@ -433,7 +456,6 @@ function readPromo() {
width: 28px; width: 28px;
height: 28px; height: 28px;
margin: 0 8px 0 0; margin: 0 8px 0 0;
border-radius: 6px;
} }
.renoteText { .renoteText {
@ -461,6 +483,36 @@ function readPromo() {
margin-right: 4px; margin-right: 4px;
} }
.collapsedRenoteTarget {
display: flex;
align-items: center;
line-height: 28px;
white-space: pre;
padding: 0 32px 18px;
}
.collapsedRenoteTargetAvatar {
flex-shrink: 0;
display: inline-block;
width: 28px;
height: 28px;
margin: 0 8px 0 0;
}
.collapsedRenoteTargetText {
overflow: hidden;
flex-shrink: 1;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 90%;
opacity: 0.7;
cursor: pointer;
&:hover {
text-decoration: underline;
}
}
.article { .article {
display: flex; display: flex;
padding: 28px 32px 18px; padding: 28px 32px 18px;
@ -614,6 +666,11 @@ function readPromo() {
padding: 8px 16px 0 16px; padding: 8px 16px 0 16px;
} }
.collapsedRenoteTarget {
padding: 0 16px 9px;
margin-top: 4px;
}
.article { .article {
padding: 14px 16px 9px; padding: 14px 16px 9px;
} }
@ -652,4 +709,19 @@ function readPromo() {
text-align: center; text-align: center;
opacity: 0.7; opacity: 0.7;
} }
.reactionDetailsButton {
display: inline-block;
height: 32px;
margin: 2px;
padding: 0 6px;
border: dashed 1px var(--divider);
border-radius: 4px;
background: transparent;
opacity: .8;
&:hover {
background: var(--X5);
}
}
</style> </style>

View file

@ -1,6 +1,6 @@
<template> <template>
<header :class="$style.root"> <header :class="$style.root">
<MkA v-once v-user-preview="note.user.id" :class="$style.name" :to="userPage(note.user)"> <MkA v-user-preview="note.user.id" :class="$style.name" :to="userPage(note.user)">
<MkUserName :user="note.user"/> <MkUserName :user="note.user"/>
</MkA> </MkA>
<div v-if="note.user.isBot" :class="$style.isBot">bot</div> <div v-if="note.user.isBot" :class="$style.isBot">bot</div>
@ -90,7 +90,7 @@ defineProps<{
vertical-align: -20%; vertical-align: -20%;
& + .badgeRole { & + .badgeRole {
margin-left: .125em; margin-left: 0.2em;
} }
} }
</style> </style>

View file

@ -1,6 +1,6 @@
<template> <template>
<div ref="elRef" :class="$style.root"> <div ref="elRef" :class="$style.root">
<div v-once :class="$style.head"> <div :class="$style.head">
<MkAvatar v-if="notification.type === 'pollEnded'" :class="$style.icon" :user="notification.note.user" link preview/> <MkAvatar v-if="notification.type === 'pollEnded'" :class="$style.icon" :user="notification.note.user" link preview/>
<MkAvatar v-else-if="notification.type === 'achievementEarned'" :class="$style.icon" :user="$i" link preview/> <MkAvatar v-else-if="notification.type === 'achievementEarned'" :class="$style.icon" :user="$i" link preview/>
<MkAvatar v-else-if="notification.user" :class="$style.icon" :user="notification.user" link preview/> <MkAvatar v-else-if="notification.user" :class="$style.icon" :user="notification.user" link preview/>
@ -35,7 +35,7 @@
<span v-else>{{ notification.header }}</span> <span v-else>{{ notification.header }}</span>
<MkTime v-if="withTime" :time="notification.createdAt" :class="$style.headerTime"/> <MkTime v-if="withTime" :time="notification.createdAt" :class="$style.headerTime"/>
</header> </header>
<div v-once :class="$style.content"> <div :class="$style.content">
<MkA v-if="notification.type === 'reaction'" :class="$style.text" :to="notePage(notification.note)" :title="getNoteSummary(notification.note)"> <MkA v-if="notification.type === 'reaction'" :class="$style.text" :to="notePage(notification.note)" :title="getNoteSummary(notification.note)">
<i class="ti ti-quote" :class="$style.quote"></i> <i class="ti ti-quote" :class="$style.quote"></i>
<Mfm :text="getNoteSummary(notification.note)" :plain="true" :nowrap="true" :author="notification.note.user"/> <Mfm :text="getNoteSummary(notification.note)" :plain="true" :nowrap="true" :author="notification.note.user"/>

View file

@ -109,7 +109,7 @@ const props = withDefaults(defineProps<{
mention?: misskey.entities.User; mention?: misskey.entities.User;
specified?: misskey.entities.User; specified?: misskey.entities.User;
initialText?: string; initialText?: string;
initialVisibility?: typeof misskey.noteVisibilities; initialVisibility?: (typeof misskey.noteVisibilities)[number];
initialFiles?: misskey.entities.DriveFile[]; initialFiles?: misskey.entities.DriveFile[];
initialLocalOnly?: boolean; initialLocalOnly?: boolean;
initialVisibleUsers?: misskey.entities.User[]; initialVisibleUsers?: misskey.entities.User[];
@ -579,6 +579,36 @@ async function post(ev?: MouseEvent) {
os.popup(MkRippleEffect, { x, y }, {}, 'end'); os.popup(MkRippleEffect, { x, y }, {}, 'end');
} }
const annoying =
text.includes('$[x2') ||
text.includes('$[x3') ||
text.includes('$[x4') ||
text.includes('$[scale') ||
text.includes('$[position');
if (annoying) {
const { canceled, result } = await os.actions({
type: 'warning',
text: i18n.ts.thisPostMayBeAnnoying,
actions: [{
value: 'home',
text: i18n.ts.thisPostMayBeAnnoyingHome,
primary: true,
}, {
value: 'cancel',
text: i18n.ts.thisPostMayBeAnnoyingCancel,
}, {
value: 'ignore',
text: i18n.ts.thisPostMayBeAnnoyingIgnore,
}],
});
if (canceled) return;
if (result === 'cancel') return;
if (result === 'home') {
visibility = 'home';
}
}
let postData = { let postData = {
text: text === '' ? undefined : text, text: text === '' ? undefined : text,
fileIds: files.length > 0 ? files.map(f => f.id) : undefined, fileIds: files.length > 0 ? files.map(f => f.id) : undefined,

View file

@ -107,7 +107,7 @@ useTooltip(buttonEl, async (showing) => {
border-radius: 4px; border-radius: 4px;
&.canToggle { &.canToggle {
background: rgba(0, 0, 0, 0.05); background: var(--buttonBg);
&:hover { &:hover {
background: rgba(0, 0, 0, 0.1); background: rgba(0, 0, 0, 0.1);

View file

@ -7,23 +7,60 @@
:move-class="$store.state.animation ? $style.transition_x_move : ''" :move-class="$store.state.animation ? $style.transition_x_move : ''"
tag="div" :class="$style.root" tag="div" :class="$style.root"
> >
<XReaction v-for="(count, reaction) in note.reactions" :key="reaction" :reaction="reaction" :count="count" :is-initial="initialReactions.has(reaction)" :note="note"/> <XReaction v-for="[reaction, count] in reactions" :key="reaction" :reaction="reaction" :count="count" :is-initial="initialReactions.has(reaction)" :note="note"/>
<slot v-if="hasMoreReactions" name="more" />
</TransitionGroup> </TransitionGroup>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import { $i } from '@/account';
import XReaction from '@/components/MkReactionsViewer.reaction.vue'; import XReaction from '@/components/MkReactionsViewer.reaction.vue';
import { watch } from 'vue';
const props = defineProps<{ const props = withDefaults(defineProps<{
note: misskey.entities.Note; note: misskey.entities.Note;
}>(); maxNumber?: number;
}>(), {
maxNumber: Infinity,
});
const initialReactions = new Set(Object.keys(props.note.reactions)); const initialReactions = new Set(Object.keys(props.note.reactions));
const isMe = computed(() => $i && $i.id === props.note.userId); let reactions = $ref<[string, number][]>([]);
let hasMoreReactions = $ref(false);
if (props.note.myReaction && !Object.keys(reactions).includes(props.note.myReaction)) {
reactions[props.note.myReaction] = props.note.reactions[props.note.myReaction];
}
watch([() => props.note.reactions, () => props.maxNumber], ([newSource, maxNumber]) => {
let newReactions: [string, number][] = [];
hasMoreReactions = Object.keys(newSource).length > maxNumber;
for (let i = 0; i < reactions.length; i++) {
const reaction = reactions[i][0];
if (reaction in newSource && newSource[reaction] !== 0) {
reactions[i][1] = newSource[reaction];
newReactions.push(reactions[i]);
}
}
const newReactionsNames = newReactions.map(([x]) => x);
newReactions = [
...newReactions,
...Object.entries(newSource)
.sort(([, a], [, b]) => b - a)
.filter(([y], i) => i < maxNumber && !newReactionsNames.includes(y)),
]
newReactions = newReactions.slice(0, props.maxNumber);
if (props.note.myReaction && !newReactions.map(([x]) => x).includes(props.note.myReaction)) {
newReactions.push([props.note.myReaction, newSource[props.note.myReaction]]);
}
reactions = newReactions;
}, { immediate: true, deep: true });
</script> </script>
<style lang="scss" module> <style lang="scss" module>

View file

@ -24,6 +24,7 @@
<p>{{ $ts.followers }}</p><span>{{ user.followersCount }}</span> <p>{{ $ts.followers }}</p><span>{{ user.followersCount }}</span>
</div> </div>
</div> </div>
<button class="menu _button" @click="showMenu"><i class="ti ti-dots"></i></button>
<MkFollowButton v-if="$i && user.id != $i.id" class="koudoku-button" :user="user" mini/> <MkFollowButton v-if="$i && user.id != $i.id" class="koudoku-button" :user="user" mini/>
</div> </div>
<div v-else> <div v-else>
@ -40,6 +41,7 @@ import * as misskey from 'misskey-js';
import MkFollowButton from '@/components/MkFollowButton.vue'; import MkFollowButton from '@/components/MkFollowButton.vue';
import { userPage } from '@/filters/user'; import { userPage } from '@/filters/user';
import * as os from '@/os'; import * as os from '@/os';
import { getUserMenu } from '@/scripts/get-user-menu';
const props = defineProps<{ const props = defineProps<{
showing: boolean; showing: boolean;
@ -58,6 +60,10 @@ let user = $ref<misskey.entities.UserDetailed | null>(null);
let top = $ref(0); let top = $ref(0);
let left = $ref(0); let left = $ref(0);
function showMenu(ev: MouseEvent) {
os.popupMenu(getUserMenu(user), ev.currentTarget ?? ev.target);
}
onMounted(() => { onMounted(() => {
if (typeof props.q === 'object') { if (typeof props.q === 'object') {
user = props.q; user = props.q;
@ -174,6 +180,13 @@ onMounted(() => {
} }
} }
> .menu {
position: absolute;
top: 8px;
right: 42px;
padding: 8px;
}
> .koudoku-button { > .koudoku-button {
position: absolute; position: absolute;
top: 8px; top: 8px;

View file

@ -1,37 +1,62 @@
<template> <template>
<div v-if="show" ref="el" :class="[$style.root, { [$style.slim]: narrow, [$style.thin]: thin_ }]" :style="{ background: bg }" @click="onClick"> <div v-if="show" ref="el" :class="[$style.root]" :style="{ background: bg }">
<div v-if="narrow" :class="$style.buttonsLeft"> <div :class="[$style.upper, { [$style.slim]: narrow, [$style.thin]: thin_ }]">
<MkAvatar v-if="props.displayMyAvatar && $i" :class="$style.avatar" :user="$i"/> <div v-if="narrow && props.displayMyAvatar && $i" class="_button" :class="$style.buttonsLeft" @click="openAccountMenu">
</div> <MkAvatar :class="$style.avatar" :user="$i" />
<template v-if="metadata"> </div>
<div v-if="!hideTitle" :class="$style.titleContainer" @click="showTabsPopup"> <div v-else-if="narrow && !hideTitle" :class="$style.buttonsLeft" />
<MkAvatar v-if="metadata.avatar" :class="$style.titleAvatar" :user="metadata.avatar" indicator/>
<i v-else-if="metadata.icon" :class="[$style.titleIcon, metadata.icon]"></i>
<div :class="$style.title"> <template v-if="metadata">
<MkUserName v-if="metadata.userName" :user="metadata.userName" :nowrap="true"/> <div v-if="!hideTitle" :class="$style.titleContainer" @click="top">
<div v-else-if="metadata.title">{{ metadata.title }}</div> <MkAvatar v-if="metadata.avatar" :class="$style.titleAvatar" :user="metadata.avatar" indicator/>
<div v-if="!narrow && metadata.subtitle" :class="$style.subtitle"> <i v-else-if="metadata.icon" :class="[$style.titleIcon, metadata.icon]"></i>
{{ metadata.subtitle }}
</div> <div :class="$style.title">
<div v-if="narrow && hasTabs" :class="[$style.subtitle, $style.activeTab]"> <MkUserName v-if="metadata.userName" :user="metadata.userName" :nowrap="true"/>
{{ tabs.find(tab => tab.key === props.tab)?.title }} <div v-else-if="metadata.title">{{ metadata.title }}</div>
<i class="ti ti-chevron-down" :class="$style.chevron"></i> <div v-if="metadata.subtitle" :class="$style.subtitle">
{{ metadata.subtitle }}
</div>
</div> </div>
</div> </div>
<div v-if="!narrow || hideTitle" :class="$style.tabs" @wheel="onTabWheel">
<div :class="$style.tabsInner">
<button v-for="t in tabs" :ref="(el) => tabRefs[t.key] = (el as HTMLElement)" v-tooltip.noDelay="t.title" class="_button" :class="[$style.tab, { [$style.active]: t.key != null && t.key === props.tab }]" @mousedown="(ev) => onTabMousedown(t, ev)" @click="(ev) => onTabClick(t, ev)">
<div :class="$style.tabInner">
<i v-if="t.icon" :class="[$style.tabIcon, t.icon]"></i>
<div v-if="!t.iconOnly" :class="$style.tabTitle">{{ t.title }}</div>
<Transition
v-else
@enter="enter"
@after-enter="afterEnter"
@leave="leave"
@after-leave="afterLeave"
mode="in-out"
>
<div v-if="t.key === tab" :class="$style.tabTitle">{{ t.title }}</div>
</Transition>
</div>
</button>
</div>
<div ref="tabHighlightEl" :class="$style.tabHighlight"></div>
</div>
</template>
<div v-if="(narrow && !hideTitle) || (actions && actions.length > 0)" :class="$style.buttonsRight">
<template v-for="action in actions">
<button v-tooltip.noDelay="action.text" class="_button" :class="[$style.button, { [$style.highlighted]: action.highlighted }]" @click.stop="action.handler" @touchstart="preventDrag"><i :class="action.icon"></i></button>
</template>
</div> </div>
<div v-if="!narrow || hideTitle" :class="$style.tabs"> </div>
<button v-for="tab in tabs" :ref="(el) => tabRefs[tab.key] = (el as HTMLElement)" v-tooltip.noDelay="tab.title" class="_button" :class="[$style.tab, { [$style.active]: tab.key != null && tab.key === props.tab }]" @mousedown="(ev) => onTabMousedown(tab, ev)" @click="(ev) => onTabClick(tab, ev)"> <div v-if="(narrow && !hideTitle) && hasTabs" :class="[$style.lower, { [$style.slim]: narrow, [$style.thin]: thin_ }]">
<i v-if="tab.icon" :class="[$style.tabIcon, tab.icon]"></i> <div :class="$style.tabs" @wheel="onTabWheel">
<span v-if="!tab.iconOnly" :class="$style.tabTitle">{{ tab.title }}</span> <div :class="$style.tabsInner">
</button> <button v-for="tab in tabs" :ref="(el) => tabRefs[tab.key] = (el as HTMLElement)" v-tooltip.noDelay="tab.title" class="_button" :class="[$style.tab, { [$style.active]: tab.key != null && tab.key === props.tab }]" @mousedown="(ev) => onTabMousedown(tab, ev)" @click="(ev) => onTabClick(tab, ev)">
<i v-if="tab.icon" :class="[$style.tabIcon, tab.icon]"></i>
<span v-if="!tab.iconOnly" :class="$style.tabTitle">{{ tab.title }}</span>
</button>
</div>
<div ref="tabHighlightEl" :class="$style.tabHighlight"></div> <div ref="tabHighlightEl" :class="$style.tabHighlight"></div>
</div> </div>
</template>
<div :class="$style.buttonsRight">
<template v-for="action in actions">
<button v-tooltip.noDelay="action.text" class="_button" :class="[$style.button, { [$style.highlighted]: action.highlighted }]" @click.stop="action.handler" @touchstart="preventDrag"><i :class="action.icon"></i></button>
</template>
</div> </div>
</div> </div>
</template> </template>
@ -39,11 +64,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, onUnmounted, ref, inject, watch, nextTick } from 'vue'; import { onMounted, onUnmounted, ref, inject, watch, nextTick } from 'vue';
import tinycolor from 'tinycolor2'; import tinycolor from 'tinycolor2';
import { popupMenu } from '@/os';
import { scrollToTop } from '@/scripts/scroll'; import { scrollToTop } from '@/scripts/scroll';
import { globalEvents } from '@/events'; import { globalEvents } from '@/events';
import { injectPageMetadata } from '@/scripts/page-metadata'; import { injectPageMetadata } from '@/scripts/page-metadata';
import { $i } from '@/account'; import { $i, openAccountMenu as openAccountMenu_ } from '@/account';
type Tab = { type Tab = {
key: string; key: string;
@ -77,9 +101,9 @@ const metadata = injectPageMetadata();
const hideTitle = inject('shouldOmitHeaderTitle', false); const hideTitle = inject('shouldOmitHeaderTitle', false);
const thin_ = props.thin || inject('shouldHeaderThin', false); const thin_ = props.thin || inject('shouldHeaderThin', false);
const el = $shallowRef<HTMLElement | undefined>(undefined); let el = $shallowRef<HTMLElement | undefined>(undefined);
const tabRefs: Record<string, HTMLElement | null> = {}; const tabRefs: Record<string, HTMLElement | null> = {};
const tabHighlightEl = $shallowRef<HTMLElement | null>(null); let tabHighlightEl = $shallowRef<HTMLElement | null>(null);
const bg = ref<string | undefined>(undefined); const bg = ref<string | undefined>(undefined);
let narrow = $ref(false); let narrow = $ref(false);
const hasTabs = $computed(() => props.tabs.length > 0); const hasTabs = $computed(() => props.tabs.length > 0);
@ -88,32 +112,22 @@ const show = $computed(() => {
return !hideTitle || hasTabs || hasActions; return !hideTitle || hasTabs || hasActions;
}); });
const showTabsPopup = (ev: MouseEvent) => {
if (!hasTabs) return;
if (!narrow) return;
ev.preventDefault();
ev.stopPropagation();
const menu = props.tabs.map(tab => ({
text: tab.title,
icon: tab.icon,
active: tab.key != null && tab.key === props.tab,
action: (ev) => {
onTabClick(tab, ev);
},
}));
popupMenu(menu, (ev.currentTarget ?? ev.target) as HTMLElement);
};
const preventDrag = (ev: TouchEvent) => { const preventDrag = (ev: TouchEvent) => {
ev.stopPropagation(); ev.stopPropagation();
}; };
const onClick = () => { const top = () => {
if (el) { if (el) {
scrollToTop(el as HTMLElement, { behavior: 'smooth' }); scrollToTop(el as HTMLElement, { behavior: 'smooth' });
} }
}; };
function openAccountMenu(ev: MouseEvent) {
openAccountMenu_({
withExtraOperation: true,
}, ev);
}
function onTabMousedown(tab: Tab, ev: MouseEvent): void { function onTabMousedown(tab: Tab, ev: MouseEvent): void {
// mousedownonClick // mousedownonClick
if (tab.key) { if (tab.key) {
@ -121,14 +135,17 @@ function onTabMousedown(tab: Tab, ev: MouseEvent): void {
} }
} }
function onTabClick(tab: Tab, ev: MouseEvent): void { function onTabClick(t: Tab, ev: MouseEvent): void {
if (tab.onClick) { if (t.key === props.tab) {
top();
} else if (t.onClick) {
ev.preventDefault(); ev.preventDefault();
ev.stopPropagation(); ev.stopPropagation();
tab.onClick(ev); t.onClick(ev);
} }
if (tab.key) {
emit('update:tab', tab.key); if (t.key) {
emit('update:tab', t.key);
} }
} }
@ -139,56 +156,124 @@ const calcBg = () => {
bg.value = tinyBg.toRgbString(); bg.value = tinyBg.toRgbString();
}; };
let ro: ResizeObserver | null; let ro1: ResizeObserver | null;
let ro2: ResizeObserver | null;
function renderTab() {
const tabEl = props.tab ? tabRefs[props.tab] : undefined;
if (tabEl && tabHighlightEl && tabHighlightEl.parentElement) {
// offsetWidth offsetLeft getBoundingClientRect 使
// https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/offsetWidth#%E5%80%A4
const parentRect = tabHighlightEl.parentElement.getBoundingClientRect();
const rect = tabEl.getBoundingClientRect();
tabHighlightEl.style.width = rect.width + 'px';
tabHighlightEl.style.left = (rect.left - parentRect.left + tabHighlightEl.parentElement.scrollLeft) + 'px';
}
}
function onTabWheel(ev: WheelEvent) {
if (ev.deltaY !== 0 && ev.deltaX === 0) {
ev.preventDefault();
ev.stopPropagation();
(ev.currentTarget as HTMLElement).scrollBy({
left: ev.deltaY,
behavior: 'smooth',
});
}
return false;
}
function enter(el: HTMLElement) {
const elementWidth = el.getBoundingClientRect().width;
el.style.width = '0';
el.offsetWidth; // reflow
el.style.width = elementWidth + 'px';
setTimeout(renderTab, 70);
}
function afterEnter(el: HTMLElement) {
el.style.width = '';
nextTick(renderTab);
}
function leave(el: HTMLElement) {
const elementWidth = el.getBoundingClientRect().width;
el.style.width = elementWidth + 'px';
el.offsetWidth; // reflow
el.style.width = '0';
}
function afterLeave(el: HTMLElement) {
el.style.width = '';
}
onMounted(() => { onMounted(() => {
calcBg(); calcBg();
globalEvents.on('themeChanged', calcBg); globalEvents.on('themeChanged', calcBg);
watch(() => [props.tab, props.tabs], () => { watch([() => props.tab, () => props.tabs], () => {
nextTick(() => { nextTick(() => renderTab());
const tabEl = props.tab ? tabRefs[props.tab] : undefined;
if (tabEl && tabHighlightEl && tabEl.parentElement) {
// offsetWidth offsetLeft getBoundingClientRect 使
// https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/offsetWidth#%E5%80%A4
const parentRect = tabEl.parentElement.getBoundingClientRect();
const rect = tabEl.getBoundingClientRect();
tabHighlightEl.style.width = rect.width + 'px';
tabHighlightEl.style.left = (rect.left - parentRect.left) + 'px';
}
});
}, { }, {
immediate: true, immediate: true,
}); });
if (el && el.parentElement) { if (el && el.parentElement) {
narrow = el.parentElement.offsetWidth < 500; narrow = el.parentElement.offsetWidth < 500;
ro = new ResizeObserver((entries, observer) => { ro1 = new ResizeObserver((entries, observer) => {
if (el.parentElement && document.body.contains(el as HTMLElement)) { if (el && el.parentElement && document.body.contains(el as HTMLElement)) {
narrow = el.parentElement.offsetWidth < 500; narrow = el.parentElement.offsetWidth < 500;
} }
}); });
ro.observe(el.parentElement as HTMLElement); ro1.observe(el.parentElement as HTMLElement);
}
if (el) {
ro2 = new ResizeObserver((entries, observer) => {
if (document.body.contains(el as HTMLElement)) {
nextTick(() => renderTab());
}
});
ro2.observe(el);
} }
}); });
onUnmounted(() => { onUnmounted(() => {
globalEvents.off('themeChanged', calcBg); globalEvents.off('themeChanged', calcBg);
if (ro) ro.disconnect(); if (ro1) ro1.disconnect();
if (ro2) ro2.disconnect();
}); });
</script> </script>
<style lang="scss" module> <style lang="scss" module>
.root { .root {
--height: 50px;
display: flex;
width: 100%;
-webkit-backdrop-filter: var(--blur, blur(15px)); -webkit-backdrop-filter: var(--blur, blur(15px));
backdrop-filter: var(--blur, blur(15px)); backdrop-filter: var(--blur, blur(15px));
border-bottom: solid 0.5px var(--divider); border-bottom: solid 0.5px var(--divider);
contain: strict; width: 100%;
}
.upper,
.lower {
width: 100%;
background: transparent;
}
.upper {
--height: 50px;
display: flex;
height: var(--height); height: var(--height);
.tabs:first-child {
margin-left: auto;
}
.tabs:not(:first-child) {
padding-left: 16px;
mask-image: linear-gradient(90deg, rgba(0,0,0,0), rgb(0,0,0) 16px, rgb(0,0,0) 100%);
}
.tabs:last-child {
margin-right: auto;
}
.tabs:not(:last-child) {
margin-right: 0;
}
&.thin { &.thin {
--height: 42px; --height: 42px;
@ -205,6 +290,7 @@ onUnmounted(() => {
> .titleContainer { > .titleContainer {
flex: 1; flex: 1;
margin: 0 auto; margin: 0 auto;
max-width: 100%;
> *:first-child { > *:first-child {
margin-left: auto; margin-left: auto;
@ -217,6 +303,11 @@ onUnmounted(() => {
} }
} }
.lower {
--height: 40px;
height: var(--height);
}
.buttons { .buttons {
--margin: 8px; --margin: 8px;
display: flex; display: flex;
@ -247,15 +338,14 @@ onUnmounted(() => {
height: $size; height: $size;
vertical-align: bottom; vertical-align: bottom;
margin: 0 8px; margin: 0 8px;
pointer-events: none;
} }
.button { .button {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
height: calc(var(--height) - (var(--margin) * 2)); height: var(--height);
width: calc(var(--height) - (var(--margin) * 2)); width: calc(var(--height) - (var(--margin)));
box-sizing: border-box; box-sizing: border-box;
position: relative; position: relative;
border-radius: 5px; border-radius: 5px;
@ -278,7 +368,7 @@ onUnmounted(() => {
.titleContainer { .titleContainer {
display: flex; display: flex;
align-items: center; align-items: center;
max-width: 400px; max-width: min(30vw, 400px);
overflow: auto; overflow: auto;
white-space: nowrap; white-space: nowrap;
text-align: left; text-align: left;
@ -330,10 +420,24 @@ onUnmounted(() => {
} }
.tabs { .tabs {
display: block;
position: relative; position: relative;
margin-left: 16px; margin: 0;
height: var(--height);
font-size: 0.8em; font-size: 0.8em;
overflow: auto; text-align: center;
overflow-x: auto;
overflow-y: hidden;
scrollbar-width: none;
&::-webkit-scrollbar {
display: none;
}
}
.tabsInner {
display: inline-block;
height: var(--height);
white-space: nowrap; white-space: nowrap;
} }
@ -344,6 +448,7 @@ onUnmounted(() => {
height: 100%; height: 100%;
font-weight: normal; font-weight: normal;
opacity: 0.7; opacity: 0.7;
transition: opacity 0.2s ease;
&:hover { &:hover {
opacity: 1; opacity: 1;
@ -354,17 +459,27 @@ onUnmounted(() => {
} }
} }
.tabInner {
display: flex;
align-items: center;
}
.tabIcon + .tabTitle { .tabIcon + .tabTitle {
margin-left: 8px; margin-left: 8px;
} }
.tabTitle {
overflow: hidden;
transition: width 0.15s ease-in-out;
}
.tabHighlight { .tabHighlight {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
height: 3px; height: 3px;
background: var(--accent); background: var(--accent);
border-radius: 999px; border-radius: 999px;
transition: all 0.2s ease; transition: width 0.15s ease, left 0.15s ease;
pointer-events: none; pointer-events: none;
} }
</style> </style>

View file

@ -12,6 +12,7 @@ import MkSparkle from '@/components/MkSparkle.vue';
import MkA from '@/components/global/MkA.vue'; import MkA from '@/components/global/MkA.vue';
import { host } from '@/config'; import { host } from '@/config';
import { MFM_TAGS } from '@/scripts/mfm-tags'; import { MFM_TAGS } from '@/scripts/mfm-tags';
import { defaultStore } from '@/store';
const QUOTE_STYLE = ` const QUOTE_STYLE = `
display: block; display: block;
@ -64,6 +65,8 @@ export default defineComponent({
return t.match(/^[0-9.]+s$/) ? t : null; return t.match(/^[0-9.]+s$/) ? t : null;
}; };
const useAnim = defaultStore.state.advancedMfm && defaultStore.state.animatedMfm;
const genEl = (ast: mfm.MfmNode[]) => ast.map((token): VNode | string | (VNode | string)[] => { const genEl = (ast: mfm.MfmNode[]) => ast.map((token): VNode | string | (VNode | string)[] => {
switch (token.type) { switch (token.type) {
case 'text': { case 'text': {
@ -102,22 +105,22 @@ export default defineComponent({
switch (token.props.name) { switch (token.props.name) {
case 'tada': { case 'tada': {
const speed = validTime(token.props.args.speed) ?? '1s'; const speed = validTime(token.props.args.speed) ?? '1s';
style = 'font-size: 150%;' + (this.$store.state.animatedMfm ? `animation: tada ${speed} linear infinite both;` : ''); style = 'font-size: 150%;' + (useAnim ? `animation: tada ${speed} linear infinite both;` : '');
break; break;
} }
case 'jelly': { case 'jelly': {
const speed = validTime(token.props.args.speed) ?? '1s'; const speed = validTime(token.props.args.speed) ?? '1s';
style = (this.$store.state.animatedMfm ? `animation: mfm-rubberBand ${speed} linear infinite both;` : ''); style = (useAnim ? `animation: mfm-rubberBand ${speed} linear infinite both;` : '');
break; break;
} }
case 'twitch': { case 'twitch': {
const speed = validTime(token.props.args.speed) ?? '0.5s'; const speed = validTime(token.props.args.speed) ?? '0.5s';
style = this.$store.state.animatedMfm ? `animation: mfm-twitch ${speed} ease infinite;` : ''; style = useAnim ? `animation: mfm-twitch ${speed} ease infinite;` : '';
break; break;
} }
case 'shake': { case 'shake': {
const speed = validTime(token.props.args.speed) ?? '0.5s'; const speed = validTime(token.props.args.speed) ?? '0.5s';
style = this.$store.state.animatedMfm ? `animation: mfm-shake ${speed} ease infinite;` : ''; style = useAnim ? `animation: mfm-shake ${speed} ease infinite;` : '';
break; break;
} }
case 'spin': { case 'spin': {
@ -130,17 +133,17 @@ export default defineComponent({
token.props.args.y ? 'mfm-spinY' : token.props.args.y ? 'mfm-spinY' :
'mfm-spin'; 'mfm-spin';
const speed = validTime(token.props.args.speed) ?? '1.5s'; const speed = validTime(token.props.args.speed) ?? '1.5s';
style = this.$store.state.animatedMfm ? `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};` : ''; style = useAnim ? `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};` : '';
break; break;
} }
case 'jump': { case 'jump': {
const speed = validTime(token.props.args.speed) ?? '0.75s'; const speed = validTime(token.props.args.speed) ?? '0.75s';
style = this.$store.state.animatedMfm ? `animation: mfm-jump ${speed} linear infinite;` : ''; style = useAnim ? `animation: mfm-jump ${speed} linear infinite;` : '';
break; break;
} }
case 'bounce': { case 'bounce': {
const speed = validTime(token.props.args.speed) ?? '0.75s'; const speed = validTime(token.props.args.speed) ?? '0.75s';
style = this.$store.state.animatedMfm ? `animation: mfm-bounce ${speed} linear infinite; transform-origin: center bottom;` : ''; style = useAnim ? `animation: mfm-bounce ${speed} linear infinite; transform-origin: center bottom;` : '';
break; break;
} }
case 'flip': { case 'flip': {
@ -153,17 +156,17 @@ export default defineComponent({
} }
case 'x2': { case 'x2': {
return h('span', { return h('span', {
class: 'mfm-x2', class: defaultStore.state.advancedMfm ? 'mfm-x2' : '',
}, genEl(token.children)); }, genEl(token.children));
} }
case 'x3': { case 'x3': {
return h('span', { return h('span', {
class: 'mfm-x3', class: defaultStore.state.advancedMfm ? 'mfm-x3' : '',
}, genEl(token.children)); }, genEl(token.children));
} }
case 'x4': { case 'x4': {
return h('span', { return h('span', {
class: 'mfm-x4', class: defaultStore.state.advancedMfm ? 'mfm-x4' : '',
}, genEl(token.children)); }, genEl(token.children));
} }
case 'font': { case 'font': {
@ -185,11 +188,11 @@ export default defineComponent({
} }
case 'rainbow': { case 'rainbow': {
const speed = validTime(token.props.args.speed) ?? '1s'; const speed = validTime(token.props.args.speed) ?? '1s';
style = this.$store.state.animatedMfm ? `animation: mfm-rainbow ${speed} linear infinite;` : ''; style = useAnim ? `animation: mfm-rainbow ${speed} linear infinite;` : '';
break; break;
} }
case 'sparkle': { case 'sparkle': {
if (!this.$store.state.animatedMfm) { if (!useAnim) {
return genEl(token.children); return genEl(token.children);
} }
return h(MkSparkle, {}, genEl(token.children)); return h(MkSparkle, {}, genEl(token.children));
@ -200,12 +203,17 @@ export default defineComponent({
break; break;
} }
case 'position': { case 'position': {
if (!defaultStore.state.advancedMfm) break;
const x = parseFloat(token.props.args.x ?? '0'); const x = parseFloat(token.props.args.x ?? '0');
const y = parseFloat(token.props.args.y ?? '0'); const y = parseFloat(token.props.args.y ?? '0');
style = `transform: translateX(${x}em) translateY(${y}em);`; style = `transform: translateX(${x}em) translateY(${y}em);`;
break; break;
} }
case 'scale': { case 'scale': {
if (!defaultStore.state.advancedMfm) {
style = '';
break;
}
const x = Math.min(parseFloat(token.props.args.x ?? '1'), 5); const x = Math.min(parseFloat(token.props.args.x ?? '1'), 5);
const y = Math.min(parseFloat(token.props.args.y ?? '1'), 5); const y = Math.min(parseFloat(token.props.args.y ?? '1'), 5);
style = `transform: scale(${x}, ${y});`; style = `transform: scale(${x}, ${y});`;

View file

@ -186,6 +186,38 @@ export function confirm(props: {
}); });
} }
// TODO: const T extends ... にしたい
// https://zenn.dev/general_link/articles/813e47b7a0eef7#const-type-parameters
export function actions<T extends {
value: string;
text: string;
primary?: boolean,
}[]>(props: {
type: 'error' | 'info' | 'success' | 'warning' | 'waiting' | 'question';
title?: string | null;
text?: string | null;
actions: T;
}): Promise<{ canceled: true; result: undefined; } | {
canceled: false; result: T[number]['value'];
}> {
return new Promise((resolve, reject) => {
popup(MkDialog, {
...props,
actions: props.actions.map(a => ({
text: a.text,
primary: a.primary,
callback: () => {
resolve({ canceled: false, result: a.value });
},
})),
}, {
done: result => {
resolve(result ? result : { canceled: true });
},
}, 'closed');
});
}
export function inputText(props: { export function inputText(props: {
type?: 'text' | 'email' | 'password' | 'url'; type?: 'text' | 'email' | 'password' | 'url';
title?: string | null; title?: string | null;
@ -540,3 +572,9 @@ export function checkExistence(fileData: ArrayBuffer): Promise<any> {
}); });
}); });
}*/ }*/
export const shownNoteIds = new Set();
window.setInterval(() => {
shownNoteIds.clear();
}, 1000 * 60 * 5);

View file

@ -192,6 +192,7 @@ const patrons = [
'蝉暮せせせ', '蝉暮せせせ',
'ThatOneCalculator', 'ThatOneCalculator',
'pixeldesu', 'pixeldesu',
'あめ玉',
]; ];
let thereIsTreasure = $ref($i && !claimedAchievements.includes('foundTreasure')); let thereIsTreasure = $ref($i && !claimedAchievements.includes('foundTreasure'));

View file

@ -98,6 +98,7 @@ definePageMetadata(computed(() => antenna ? {
top: calc(var(--stickyTop, 0px) + 16px); top: calc(var(--stickyTop, 0px) + 16px);
z-index: 1000; z-index: 1000;
width: 100%; width: 100%;
margin: calc(-0.675em - 8px - var(--margin)) 0 calc(-0.675em - 8px);
> button { > button {
display: block; display: block;

View file

@ -1,377 +0,0 @@
<template>
<MkStickyContainer>
<template #header><MkPageHeader/></template>
<MkSpacer :content-max="800">
<div class="mwysmxbg">
<div>{{ i18n.ts._mfm.intro }}</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.mention }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.mentionDescription }}</p>
<div class="preview">
<Mfm :text="preview_mention"/>
<MkTextarea v-model="preview_mention"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.hashtag }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.hashtagDescription }}</p>
<div class="preview">
<Mfm :text="preview_hashtag"/>
<MkTextarea v-model="preview_hashtag"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.url }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.urlDescription }}</p>
<div class="preview">
<Mfm :text="preview_url"/>
<MkTextarea v-model="preview_url"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.link }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.linkDescription }}</p>
<div class="preview">
<Mfm :text="preview_link"/>
<MkTextarea v-model="preview_link"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.emoji }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.emojiDescription }}</p>
<div class="preview">
<Mfm :text="preview_emoji"/>
<MkTextarea v-model="preview_emoji"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.bold }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.boldDescription }}</p>
<div class="preview">
<Mfm :text="preview_bold"/>
<MkTextarea v-model="preview_bold"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.small }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.smallDescription }}</p>
<div class="preview">
<Mfm :text="preview_small"/>
<MkTextarea v-model="preview_small"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.quote }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.quoteDescription }}</p>
<div class="preview">
<Mfm :text="preview_quote"/>
<MkTextarea v-model="preview_quote"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.center }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.centerDescription }}</p>
<div class="preview">
<Mfm :text="preview_center"/>
<MkTextarea v-model="preview_center"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.inlineCode }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.inlineCodeDescription }}</p>
<div class="preview">
<Mfm :text="preview_inlineCode"/>
<MkTextarea v-model="preview_inlineCode"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.blockCode }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.blockCodeDescription }}</p>
<div class="preview">
<Mfm :text="preview_blockCode"/>
<MkTextarea v-model="preview_blockCode"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<!-- deprecated
<div class="section">
<div class="title">{{ i18n.ts._mfm.search }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.searchDescription }}</p>
<div class="preview">
<Mfm :text="preview_search"/>
<MkTextarea v-model="preview_search"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
-->
<div class="section">
<div class="title">{{ i18n.ts._mfm.flip }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.flipDescription }}</p>
<div class="preview">
<Mfm :text="preview_flip"/>
<MkTextarea v-model="preview_flip"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.font }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.fontDescription }}</p>
<div class="preview">
<Mfm :text="preview_font"/>
<MkTextarea v-model="preview_font"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.x2 }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.x2Description }}</p>
<div class="preview">
<Mfm :text="preview_x2"/>
<MkTextarea v-model="preview_x2"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.x3 }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.x3Description }}</p>
<div class="preview">
<Mfm :text="preview_x3"/>
<MkTextarea v-model="preview_x3"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.x4 }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.x4Description }}</p>
<div class="preview">
<Mfm :text="preview_x4"/>
<MkTextarea v-model="preview_x4"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.blur }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.blurDescription }}</p>
<div class="preview">
<Mfm :text="preview_blur"/>
<MkTextarea v-model="preview_blur"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.jelly }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.jellyDescription }}</p>
<div class="preview">
<Mfm :text="preview_jelly"/>
<MkTextarea v-model="preview_jelly"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.tada }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.tadaDescription }}</p>
<div class="preview">
<Mfm :text="preview_tada"/>
<MkTextarea v-model="preview_tada"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.jump }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.jumpDescription }}</p>
<div class="preview">
<Mfm :text="preview_jump"/>
<MkTextarea v-model="preview_jump"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.bounce }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.bounceDescription }}</p>
<div class="preview">
<Mfm :text="preview_bounce"/>
<MkTextarea v-model="preview_bounce"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.spin }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.spinDescription }}</p>
<div class="preview">
<Mfm :text="preview_spin"/>
<MkTextarea v-model="preview_spin"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.shake }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.shakeDescription }}</p>
<div class="preview">
<Mfm :text="preview_shake"/>
<MkTextarea v-model="preview_shake"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.twitch }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.twitchDescription }}</p>
<div class="preview">
<Mfm :text="preview_twitch"/>
<MkTextarea v-model="preview_twitch"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.rainbow }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.rainbowDescription }}</p>
<div class="preview">
<Mfm :text="preview_rainbow"/>
<MkTextarea v-model="preview_rainbow"><template #label>MFM</template></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.sparkle }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.sparkleDescription }}</p>
<div class="preview">
<Mfm :text="preview_sparkle"/>
<MkTextarea v-model="preview_sparkle"><span>MFM</span></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.rotate }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.rotateDescription }}</p>
<div class="preview">
<Mfm :text="preview_rotate"/>
<MkTextarea v-model="preview_rotate"><span>MFM</span></MkTextarea>
</div>
</div>
</div>
<div class="section">
<div class="title">{{ i18n.ts._mfm.plain }}</div>
<div class="content">
<p>{{ i18n.ts._mfm.plainDescription }}</p>
<div class="preview">
<Mfm :text="preview_plain"/>
<MkTextarea v-model="preview_plain"><span>MFM</span></MkTextarea>
</div>
</div>
</div>
</div>
</MkSpacer>
</MkStickyContainer>
</template>
<script lang="ts" setup>
import { defineComponent } from 'vue';
import MkTextarea from '@/components/MkTextarea.vue';
import { definePageMetadata } from '@/scripts/page-metadata';
import { i18n } from '@/i18n';
import { instance } from '@/instance';
import { customEmojis } from '@/custom-emojis';
let preview_mention = $ref('@example');
let preview_hashtag = $ref('#test');
let preview_url = $ref('https://example.com');
let preview_link = $ref(`[${i18n.ts._mfm.dummy}](https://example.com)`);
let preview_emoji = $ref(customEmojis.value.length ? `:${customEmojis.value[0].name}:` : ':emojiname:');
let preview_bold = $ref(`**${i18n.ts._mfm.dummy}**`);
let preview_small = $ref(`<small>${i18n.ts._mfm.dummy}</small>`);
let preview_center = $ref(`<center>${i18n.ts._mfm.dummy}</center>`);
let preview_inlineCode = $ref('`<: "Hello, world!"`');
let preview_blockCode = $ref('```\n~ (#i, 100) {\n\t<: ? ((i % 15) = 0) "FizzBuzz"\n\t\t.? ((i % 3) = 0) "Fizz"\n\t\t.? ((i % 5) = 0) "Buzz"\n\t\t. i\n}\n```');
let preview_quote = $ref(`> ${i18n.ts._mfm.dummy}`);
let preview_search = $ref(`${i18n.ts._mfm.dummy} 検索`);
let preview_jelly = $ref('$[jelly 🍮] $[jelly.speed=5s 🍮]');
let preview_tada = $ref('$[tada 🍮] $[tada.speed=5s 🍮]');
let preview_jump = $ref('$[jump 🍮] $[jump.speed=5s 🍮]');
let preview_bounce = $ref('$[bounce 🍮] $[bounce.speed=5s 🍮]');
let preview_shake = $ref('$[shake 🍮] $[shake.speed=5s 🍮]');
let preview_twitch = $ref('$[twitch 🍮] $[twitch.speed=5s 🍮]');
let preview_spin = $ref('$[spin 🍮] $[spin.left 🍮] $[spin.alternate 🍮]\n$[spin.x 🍮] $[spin.x,left 🍮] $[spin.x,alternate 🍮]\n$[spin.y 🍮] $[spin.y,left 🍮] $[spin.y,alternate 🍮]\n\n$[spin.speed=5s 🍮]');
let preview_flip = $ref(`$[flip ${i18n.ts._mfm.dummy}]\n$[flip.v ${i18n.ts._mfm.dummy}]\n$[flip.h,v ${i18n.ts._mfm.dummy}]`);
let preview_font = $ref(`$[font.serif ${i18n.ts._mfm.dummy}]\n$[font.monospace ${i18n.ts._mfm.dummy}]\n$[font.cursive ${i18n.ts._mfm.dummy}]\n$[font.fantasy ${i18n.ts._mfm.dummy}]`);
let preview_x2 = $ref('$[x2 🍮]');
let preview_x3 = $ref('$[x3 🍮]');
let preview_x4 = $ref('$[x4 🍮]');
let preview_blur = $ref(`$[blur ${i18n.ts._mfm.dummy}]`);
let preview_rainbow = $ref('$[rainbow 🍮] $[rainbow.speed=5s 🍮]');
let preview_sparkle = $ref('$[sparkle 🍮]');
let preview_rotate = $ref('$[rotate 🍮]');
let preview_plain = $ref('<plain>**bold** @mention #hashtag `code` $[x2 🍮]</plain>');
definePageMetadata({
title: i18n.ts._mfm.cheatSheet,
icon: 'ti ti-question-circle',
});
</script>
<style lang="scss" scoped>
.mwysmxbg {
background: var(--bg);
> .section {
> .title {
position: sticky;
z-index: 1;
top: var(--stickyTop, 0px);
padding: 16px;
font-weight: bold;
-webkit-backdrop-filter: var(--blur, blur(10px));
backdrop-filter: var(--blur, blur(10px));
background-color: var(--X16);
}
> .content {
> p {
margin: 0;
padding: 16px;
}
> .preview {
border-top: solid 0.5px var(--divider);
padding: 16px;
}
}
}
}
</style>

View file

@ -45,7 +45,8 @@
<div class="_gaps_m"> <div class="_gaps_m">
<div class="_gaps_s"> <div class="_gaps_s">
<MkSwitch v-model="disableAnimatedMfm">{{ i18n.ts.disableAnimatedMfm }}</MkSwitch> <MkSwitch v-model="advancedMfm">{{ i18n.ts.enableAdvancedMfm }}</MkSwitch>
<MkSwitch v-if="advancedMfm" v-model="animatedMfm">{{ i18n.ts.enableAnimatedMfm }}</MkSwitch>
<MkSwitch v-model="reduceAnimation">{{ i18n.ts.reduceUiAnimation }}</MkSwitch> <MkSwitch v-model="reduceAnimation">{{ i18n.ts.reduceUiAnimation }}</MkSwitch>
<MkSwitch v-model="useBlurEffect">{{ i18n.ts.useBlurEffect }}</MkSwitch> <MkSwitch v-model="useBlurEffect">{{ i18n.ts.useBlurEffect }}</MkSwitch>
<MkSwitch v-model="useBlurEffectForModal">{{ i18n.ts.useBlurEffectForModal }}</MkSwitch> <MkSwitch v-model="useBlurEffectForModal">{{ i18n.ts.useBlurEffectForModal }}</MkSwitch>
@ -142,7 +143,8 @@ const reduceAnimation = computed(defaultStore.makeGetterSetter('animation', v =>
const useBlurEffectForModal = computed(defaultStore.makeGetterSetter('useBlurEffectForModal')); const useBlurEffectForModal = computed(defaultStore.makeGetterSetter('useBlurEffectForModal'));
const useBlurEffect = computed(defaultStore.makeGetterSetter('useBlurEffect')); const useBlurEffect = computed(defaultStore.makeGetterSetter('useBlurEffect'));
const showGapBetweenNotesInTimeline = computed(defaultStore.makeGetterSetter('showGapBetweenNotesInTimeline')); const showGapBetweenNotesInTimeline = computed(defaultStore.makeGetterSetter('showGapBetweenNotesInTimeline'));
const disableAnimatedMfm = computed(defaultStore.makeGetterSetter('animatedMfm', v => !v, v => !v)); const animatedMfm = computed(defaultStore.makeGetterSetter('animatedMfm'));
const advancedMfm = computed(defaultStore.makeGetterSetter('advancedMfm'));
const emojiStyle = computed(defaultStore.makeGetterSetter('emojiStyle')); const emojiStyle = computed(defaultStore.makeGetterSetter('emojiStyle'));
const disableDrawer = computed(defaultStore.makeGetterSetter('disableDrawer')); const disableDrawer = computed(defaultStore.makeGetterSetter('disableDrawer'));
const disableShowingAnimatedImages = computed(defaultStore.makeGetterSetter('disableShowingAnimatedImages')); const disableShowingAnimatedImages = computed(defaultStore.makeGetterSetter('disableShowingAnimatedImages'));

View file

@ -62,6 +62,7 @@ const defaultStoreSaveKeys: (keyof typeof defaultStore['state'])[] = [
'nsfw', 'nsfw',
'animation', 'animation',
'animatedMfm', 'animatedMfm',
'advancedMfm',
'loadRawImages', 'loadRawImages',
'imageNewTab', 'imageNewTab',
'disableShowingAnimatedImages', 'disableShowingAnimatedImages',

View file

@ -2,7 +2,7 @@
<MkStickyContainer> <MkStickyContainer>
<template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template> <template #header><MkPageHeader :actions="headerActions" :tabs="headerTabs"/></template>
<MkSpacer :content-max="800"> <MkSpacer :content-max="800">
<XPostForm <MkPostForm
v-if="state === 'writing'" v-if="state === 'writing'"
fixed fixed
:instant="true" :instant="true"
@ -37,17 +37,17 @@ import { i18n } from '@/i18n';
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const localOnlyQuery = urlParams.get('localOnly'); const localOnlyQuery = urlParams.get('localOnly');
const visibilityQuery = urlParams.get('visibility'); const visibilityQuery = urlParams.get('visibility') as typeof noteVisibilities[number];
let state = $ref('fetching' as 'fetching' | 'writing' | 'posted'); let state = $ref('fetching' as 'fetching' | 'writing' | 'posted');
let title = $ref(urlParams.get('title')); let title = $ref(urlParams.get('title'));
const text = urlParams.get('text'); const text = urlParams.get('text');
const url = urlParams.get('url'); const url = urlParams.get('url');
let initialText = $ref(null as string | null); let initialText = $ref<string | undefined>();
let reply = $ref(null as Misskey.entities.Note | null); let reply = $ref<Misskey.entities.Note | undefined>();
let renote = $ref(null as Misskey.entities.Note | null); let renote = $ref<Misskey.entities.Note | undefined>();
let visibility = $ref(noteVisibilities.includes(visibilityQuery) ? visibilityQuery : null); let visibility = $ref(noteVisibilities.includes(visibilityQuery) ? visibilityQuery : undefined);
let localOnly = $ref(localOnlyQuery === '0' ? false : localOnlyQuery === '1' ? true : null); let localOnly = $ref(localOnlyQuery === '0' ? false : localOnlyQuery === '1' ? true : undefined);
let files = $ref([] as Misskey.entities.DriveFile[]); let files = $ref([] as Misskey.entities.DriveFile[]);
let visibleUsers = $ref([] as Misskey.entities.User[]); let visibleUsers = $ref([] as Misskey.entities.User[]);
@ -130,7 +130,7 @@ async function init() {
); );
} }
//#endregion //#endregion
} catch (err) { } catch (err: any) {
os.alert({ os.alert({
type: 'error', type: 'error',
title: err.message, title: err.message,

View file

@ -22,7 +22,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { defineAsyncComponent, computed, watch } from 'vue'; import { defineAsyncComponent, computed, watch, provide } from 'vue';
import XTimeline from '@/components/MkTimeline.vue'; import XTimeline from '@/components/MkTimeline.vue';
import MkPostForm from '@/components/MkPostForm.vue'; import MkPostForm from '@/components/MkPostForm.vue';
import { scroll } from '@/scripts/scroll'; import { scroll } from '@/scripts/scroll';
@ -33,6 +33,8 @@ import { instance } from '@/instance';
import { $i } from '@/account'; import { $i } from '@/account';
import { definePageMetadata } from '@/scripts/page-metadata'; import { definePageMetadata } from '@/scripts/page-metadata';
provide('shouldOmitHeaderTitle', true);
const XTutorial = defineAsyncComponent(() => import('./timeline.tutorial.vue')); const XTutorial = defineAsyncComponent(() => import('./timeline.tutorial.vue'));
const isLocalTimelineAvailable = ($i == null && instance.policies.ltlAvailable) || ($i != null && $i.policies.ltlAvailable); const isLocalTimelineAvailable = ($i == null && instance.policies.ltlAvailable) || ($i != null && $i.policies.ltlAvailable);
@ -177,6 +179,11 @@ definePageMetadata(computed(() => ({
top: calc(var(--stickyTop, 0px) + 16px); top: calc(var(--stickyTop, 0px) + 16px);
z-index: 1000; z-index: 1000;
width: 100%; width: 100%;
margin: calc(-0.675em - 8px) 0;
&:first-child {
margin-top: calc(-0.675em - 8px - var(--margin));
}
> button { > button {
display: block; display: block;

View file

@ -91,6 +91,7 @@ definePageMetadata(computed(() => list ? {
top: calc(var(--stickyTop, 0px) + 16px); top: calc(var(--stickyTop, 0px) + 16px);
z-index: 1000; z-index: 1000;
width: 100%; width: 100%;
margin: calc(-0.675em - 8px - var(--margin)) 0 calc(-0.675em - 8px);
> button { > button {
display: block; display: block;

View file

@ -101,9 +101,6 @@
<XActivity :key="user.id" :user="user"/> <XActivity :key="user.id" :user="user"/>
</template> </template>
</div> </div>
<div>
<XUserTimeline :user="user"/>
</div>
</div> </div>
<div v-if="!narrow" class="sub _gaps" style="container-type: inline-size;"> <div v-if="!narrow" class="sub _gaps" style="container-type: inline-size;">
<XPhotos :key="user.id" :user="user"/> <XPhotos :key="user.id" :user="user"/>
@ -117,7 +114,6 @@
import { defineAsyncComponent, computed, inject, onMounted, onUnmounted, watch } from 'vue'; import { defineAsyncComponent, computed, inject, onMounted, onUnmounted, watch } from 'vue';
import calcAge from 's-age'; import calcAge from 's-age';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import XUserTimeline from './index.timeline.vue';
import XNote from '@/components/MkNote.vue'; import XNote from '@/components/MkNote.vue';
import MkFollowButton from '@/components/MkFollowButton.vue'; import MkFollowButton from '@/components/MkFollowButton.vue';
import MkContainer from '@/components/MkContainer.vue'; import MkContainer from '@/components/MkContainer.vue';

View file

@ -1,14 +1,16 @@
<template> <template>
<MkStickyContainer> <MkSpacer :content-max="800" style="padding-top: 0">
<template #header> <MkStickyContainer>
<MkTab v-model="include" :class="$style.tab"> <template #header>
<option :value="null">{{ i18n.ts.notes }}</option> <MkTab v-model="include" :class="$style.tab">
<option value="replies">{{ i18n.ts.notesAndReplies }}</option> <option :value="null">{{ i18n.ts.notes }}</option>
<option value="files">{{ i18n.ts.withFiles }}</option> <option value="replies">{{ i18n.ts.notesAndReplies }}</option>
</MkTab> <option value="files">{{ i18n.ts.withFiles }}</option>
</template> </MkTab>
<XNotes :no-gap="true" :pagination="pagination"/> </template>
</MkStickyContainer> <XNotes :no-gap="true" :pagination="pagination" :class="$style.tl"/>
</MkStickyContainer>
</MkSpacer>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -42,4 +44,10 @@ const pagination = {
padding: calc(var(--margin) / 2) 0; padding: calc(var(--margin) / 2) 0;
background: var(--bg); background: var(--bg);
} }
.tl {
background: var(--bg);
border-radius: var(--radius);
overflow: clip;
}
</style> </style>

View file

@ -5,7 +5,7 @@
<Transition name="fade" mode="out-in"> <Transition name="fade" mode="out-in">
<div v-if="user"> <div v-if="user">
<XHome v-if="tab === 'home'" :user="user"/> <XHome v-if="tab === 'home'" :user="user"/>
<XActivity v-else-if="tab === 'activity'" :user="user"/> <XTimeline v-else-if="tab === 'notes'" :user="user" />
<XAchievements v-else-if="tab === 'achievements'" :user="user"/> <XAchievements v-else-if="tab === 'achievements'" :user="user"/>
<XReactions v-else-if="tab === 'reactions'" :user="user"/> <XReactions v-else-if="tab === 'reactions'" :user="user"/>
<XClips v-else-if="tab === 'clips'" :user="user"/> <XClips v-else-if="tab === 'clips'" :user="user"/>
@ -34,6 +34,7 @@ import { i18n } from '@/i18n';
import { $i } from '@/account'; import { $i } from '@/account';
const XHome = defineAsyncComponent(() => import('./home.vue')); const XHome = defineAsyncComponent(() => import('./home.vue'));
const XTimeline = defineAsyncComponent(() => import('./index.timeline.vue'));
const XActivity = defineAsyncComponent(() => import('./activity.vue')); const XActivity = defineAsyncComponent(() => import('./activity.vue'));
const XAchievements = defineAsyncComponent(() => import('./achievements.vue')); const XAchievements = defineAsyncComponent(() => import('./achievements.vue'));
const XReactions = defineAsyncComponent(() => import('./reactions.vue')); const XReactions = defineAsyncComponent(() => import('./reactions.vue'));
@ -74,6 +75,10 @@ const headerTabs = $computed(() => user ? [{
key: 'home', key: 'home',
title: i18n.ts.overview, title: i18n.ts.overview,
icon: 'ti ti-home', icon: 'ti ti-home',
}, {
key: 'notes',
title: i18n.ts.notes,
icon: 'ti ti-pencil',
}, { }, {
key: 'activity', key: 'activity',
title: i18n.ts.activity, title: i18n.ts.activity,

View file

@ -224,9 +224,6 @@ export const routes = [{
path: '/api-console', path: '/api-console',
component: page(() => import('./pages/api-console.vue')), component: page(() => import('./pages/api-console.vue')),
loginRequired: true, loginRequired: true,
}, {
path: '/mfm-cheat-sheet',
component: page(() => import('./pages/mfm-cheat-sheet.vue')),
}, { }, {
path: '/scratchpad', path: '/scratchpad',
component: page(() => import('./pages/scratchpad.vue')), component: page(() => import('./pages/scratchpad.vue')),

View file

@ -203,6 +203,20 @@ export function getUserMenu(user, router: Router = mainRouter) {
action: () => { action: () => {
router.push('/user-info/' + user.id + '#moderation'); router.push('/user-info/' + user.id + '#moderation');
}, },
}, {
icon: 'ti ti-badges',
text: i18n.ts.roles,
action: async () => {
const roles = await os.api('admin/roles/list');
const { canceled, result: roleId } = await os.select({
title: i18n.ts._role.chooseRoleToAssign,
items: roles.map(r => ({ text: r.name, value: r.id })),
});
if (canceled) return;
await os.apiWithDialog('admin/roles/assign', { roleId, userId: user.id });
},
}]); }]);
} }
} }

View file

@ -158,6 +158,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device', where: 'device',
default: false, default: false,
}, },
advancedMfm: {
where: 'device',
default: true,
},
loadRawImages: { loadRawImages: {
where: 'device', where: 'device',
default: false, default: false,

View file

@ -197,7 +197,7 @@ importers:
tsc-alias: 1.8.2 tsc-alias: 1.8.2
tsconfig-paths: 4.1.2 tsconfig-paths: 4.1.2
twemoji-parser: 14.0.0 twemoji-parser: 14.0.0
typeorm: 0.3.12 typeorm: 0.3.11
typescript: 4.9.5 typescript: 4.9.5
ulid: 2.3.0 ulid: 2.3.0
unzipper: 0.10.11 unzipper: 0.10.11
@ -301,7 +301,7 @@ importers:
tsc-alias: 1.8.2 tsc-alias: 1.8.2
tsconfig-paths: 4.1.2 tsconfig-paths: 4.1.2
twemoji-parser: 14.0.0 twemoji-parser: 14.0.0
typeorm: 0.3.12_ioredis@4.28.5+pg@8.9.0 typeorm: 0.3.11_ioredis@4.28.5+pg@8.9.0
typescript: 4.9.5 typescript: 4.9.5
ulid: 2.3.0 ulid: 2.3.0
unzipper: 0.10.11 unzipper: 0.10.11
@ -9493,12 +9493,6 @@ packages:
hasBin: true hasBin: true
dev: false dev: false
/mkdirp/2.1.3:
resolution: {integrity: sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==}
engines: {node: '>=10'}
hasBin: true
dev: false
/mnemonist/0.39.5: /mnemonist/0.39.5:
resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==}
dependencies: dependencies:
@ -12762,8 +12756,8 @@ packages:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
dev: false dev: false
/typeorm/0.3.12_ioredis@4.28.5+pg@8.9.0: /typeorm/0.3.11_ioredis@4.28.5+pg@8.9.0:
resolution: {integrity: sha512-sYSxBmCf1nJLLTcYtwqZ+lQIRtLPyUoO93rHTOKk9vJCyT4UfRtU7oRsJvfvKP3nnZTD1hzz2SEy2zwPEN6OyA==} resolution: {integrity: sha512-pzdOyWbVuz/z8Ww6gqvBW4nylsM0KLdUCDExr2gR20/x1khGSVxQkjNV/3YqliG90jrWzrknYbYscpk8yxFJVg==}
engines: {node: '>= 12.9.0'} engines: {node: '>= 12.9.0'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -12774,7 +12768,7 @@ packages:
ioredis: ^5.0.4 ioredis: ^5.0.4
mongodb: ^3.6.0 mongodb: ^3.6.0
mssql: ^7.3.0 mssql: ^7.3.0
mysql2: ^2.2.5 || ^3.0.1 mysql2: ^2.2.5
oracledb: ^5.1.0 oracledb: ^5.1.0
pg: ^8.5.1 pg: ^8.5.1
pg-native: ^3.0.0 pg-native: ^3.0.0
@ -12828,15 +12822,15 @@ packages:
date-fns: 2.29.3 date-fns: 2.29.3
debug: 4.3.4 debug: 4.3.4
dotenv: 16.0.3 dotenv: 16.0.3
glob: 8.1.0 glob: 7.2.3
ioredis: 4.28.5 ioredis: 4.28.5
js-yaml: 4.1.0 js-yaml: 4.1.0
mkdirp: 2.1.3 mkdirp: 1.0.4
pg: 8.9.0 pg: 8.9.0
reflect-metadata: 0.1.13 reflect-metadata: 0.1.13
sha.js: 2.4.11 sha.js: 2.4.11
tslib: 2.5.0 tslib: 2.5.0
uuid: 9.0.0 uuid: 8.3.2
xml2js: 0.4.23 xml2js: 0.4.23
yargs: 17.6.2 yargs: 17.6.2
transitivePeerDependencies: transitivePeerDependencies: