diff --git a/CHANGELOG.md b/CHANGELOG.md index 984061f23882f793ba8780c6194d433b69a74294..a0c760b47ee29df0a38b443f0af636eeb9c637d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ You should also include the user name that made the change. ### Improvements - コンディショナルãƒãƒ¼ãƒ«ã‚‚ãƒãƒƒã‚¸ã¨ã—ã¦è¡¨ç¤ºå¯èƒ½ã« - enhance(client): 一度見ãŸãƒŽãƒ¼ãƒˆã®Renoteã¯çœç•¥ã—ã¦è¡¨ç¤ºã™ã‚‹ã‚ˆã†ã« +- 一部ã®MFM構文をopt-inã« ### Bugfixes - diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 79b78f3f985d3d01125cec31785ecb16e9aff75e..031e90215f98555411b310f1d0a02100f80a2a0f 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -467,7 +467,8 @@ youHaveNoGroups: "グループãŒã‚ã‚Šã¾ã›ã‚“" joinOrCreateGroup: "æ—¢å˜ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‹›å¾…ã—ã¦ã‚‚らã†ã‹ã€æ–°ã—ãグループを作æˆã—ã¦ãã ã•ã„。" noHistory: "å±¥æ´ã¯ã‚ã‚Šã¾ã›ã‚“" signinHistory: "ãƒã‚°ã‚¤ãƒ³å±¥æ´" -disableAnimatedMfm: "å‹•ãã®ã‚ã‚‹MFMを無効ã«ã™ã‚‹" +enableAdvancedMfm: "高度ãªMFMを有効ã«ã™ã‚‹" +enableAnimatedMfm: "å‹•ãã®ã‚ã‚‹MFMを有効ã«ã™ã‚‹" doing: "ã‚„ã£ã¦ã„ã¾ã™" category: "カテゴリ" tags: "ã‚¿ã‚°" @@ -1347,73 +1348,6 @@ _nsfw: ignore: "閲覧注æ„ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’éš ã•ãªã„" 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: none: "表示ã—ãªã„" remote: "リモートユーザーã«è¡¨ç¤º" diff --git a/packages/frontend/src/components/mfm.ts b/packages/frontend/src/components/mfm.ts index 8cc35e478134c3ed393d94fd67d04ab485ffa43a..816a42a5fb7d12b0483bfb6fc3ad060d2e1fb828 100644 --- a/packages/frontend/src/components/mfm.ts +++ b/packages/frontend/src/components/mfm.ts @@ -65,6 +65,8 @@ export default defineComponent({ 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)[] => { switch (token.type) { case 'text': { @@ -103,22 +105,22 @@ export default defineComponent({ switch (token.props.name) { case 'tada': { const speed = validTime(token.props.args.speed) ?? '1s'; - style = 'font-size: 150%;' + (defaultStore.state.animatedMfm ? `animation: tada ${speed} linear infinite both;` : ''); + style = 'font-size: 150%;' + (useAnim ? `animation: tada ${speed} linear infinite both;` : ''); break; } case 'jelly': { const speed = validTime(token.props.args.speed) ?? '1s'; - style = (defaultStore.state.animatedMfm ? `animation: mfm-rubberBand ${speed} linear infinite both;` : ''); + style = (useAnim ? `animation: mfm-rubberBand ${speed} linear infinite both;` : ''); break; } case 'twitch': { const speed = validTime(token.props.args.speed) ?? '0.5s'; - style = defaultStore.state.animatedMfm ? `animation: mfm-twitch ${speed} ease infinite;` : ''; + style = useAnim ? `animation: mfm-twitch ${speed} ease infinite;` : ''; break; } case 'shake': { const speed = validTime(token.props.args.speed) ?? '0.5s'; - style = defaultStore.state.animatedMfm ? `animation: mfm-shake ${speed} ease infinite;` : ''; + style = useAnim ? `animation: mfm-shake ${speed} ease infinite;` : ''; break; } case 'spin': { @@ -131,17 +133,17 @@ export default defineComponent({ token.props.args.y ? 'mfm-spinY' : 'mfm-spin'; const speed = validTime(token.props.args.speed) ?? '1.5s'; - style = defaultStore.state.animatedMfm ? `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};` : ''; + style = useAnim ? `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};` : ''; break; } case 'jump': { const speed = validTime(token.props.args.speed) ?? '0.75s'; - style = defaultStore.state.animatedMfm ? `animation: mfm-jump ${speed} linear infinite;` : ''; + style = useAnim ? `animation: mfm-jump ${speed} linear infinite;` : ''; break; } case 'bounce': { const speed = validTime(token.props.args.speed) ?? '0.75s'; - style = defaultStore.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; } case 'flip': { @@ -154,17 +156,17 @@ export default defineComponent({ } case 'x2': { return h('span', { - class: 'mfm-x2', + class: defaultStore.state.advancedMfm ? 'mfm-x2' : '', }, genEl(token.children)); } case 'x3': { return h('span', { - class: 'mfm-x3', + class: defaultStore.state.advancedMfm ? 'mfm-x3' : '', }, genEl(token.children)); } case 'x4': { return h('span', { - class: 'mfm-x4', + class: defaultStore.state.advancedMfm ? 'mfm-x4' : '', }, genEl(token.children)); } case 'font': { @@ -186,11 +188,11 @@ export default defineComponent({ } case 'rainbow': { const speed = validTime(token.props.args.speed) ?? '1s'; - style = defaultStore.state.animatedMfm ? `animation: mfm-rainbow ${speed} linear infinite;` : ''; + style = useAnim ? `animation: mfm-rainbow ${speed} linear infinite;` : ''; break; } case 'sparkle': { - if (!defaultStore.state.animatedMfm) { + if (!useAnim) { return genEl(token.children); } return h(MkSparkle, {}, genEl(token.children)); @@ -201,12 +203,17 @@ export default defineComponent({ break; } case 'position': { + if (!defaultStore.state.advancedMfm) break; const x = parseFloat(token.props.args.x ?? '0'); const y = parseFloat(token.props.args.y ?? '0'); style = `transform: translateX(${x}em) translateY(${y}em);`; break; } case 'scale': { + if (!defaultStore.state.advancedMfm) { + style = ''; + break; + } const x = Math.min(parseFloat(token.props.args.x ?? '1'), 5); const y = Math.min(parseFloat(token.props.args.y ?? '1'), 5); style = `transform: scale(${x}, ${y});`; diff --git a/packages/frontend/src/pages/mfm-cheat-sheet.vue b/packages/frontend/src/pages/mfm-cheat-sheet.vue deleted file mode 100644 index 73a571623624442de61e88fab17d31db766099df..0000000000000000000000000000000000000000 --- a/packages/frontend/src/pages/mfm-cheat-sheet.vue +++ /dev/null @@ -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> diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue index 0ce66b065fe0026093b2f6f83d9249d4ea8f6b54..b4851df1767336c10e5e55eeaf541bf85e444540 100644 --- a/packages/frontend/src/pages/settings/general.vue +++ b/packages/frontend/src/pages/settings/general.vue @@ -45,7 +45,8 @@ <div class="_gaps_m"> <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="useBlurEffect">{{ i18n.ts.useBlurEffect }}</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 useBlurEffect = computed(defaultStore.makeGetterSetter('useBlurEffect')); 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 disableDrawer = computed(defaultStore.makeGetterSetter('disableDrawer')); const disableShowingAnimatedImages = computed(defaultStore.makeGetterSetter('disableShowingAnimatedImages')); diff --git a/packages/frontend/src/pages/settings/preferences-backups.vue b/packages/frontend/src/pages/settings/preferences-backups.vue index 87a08612fc89aed2b84b3aa98721076bf8838c41..0512a8d0c90cf704691dbf056ee46f6db2f84234 100644 --- a/packages/frontend/src/pages/settings/preferences-backups.vue +++ b/packages/frontend/src/pages/settings/preferences-backups.vue @@ -62,6 +62,7 @@ const defaultStoreSaveKeys: (keyof typeof defaultStore['state'])[] = [ 'nsfw', 'animation', 'animatedMfm', + 'advancedMfm', 'loadRawImages', 'imageNewTab', 'disableShowingAnimatedImages', diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index 87d42c5c87ce5d382a55e9fc232d7632ab9a4ded..900426268967c91b09e924133982d869962d19e5 100644 --- a/packages/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -224,9 +224,6 @@ export const routes = [{ path: '/api-console', component: page(() => import('./pages/api-console.vue')), loginRequired: true, -}, { - path: '/mfm-cheat-sheet', - component: page(() => import('./pages/mfm-cheat-sheet.vue')), }, { path: '/scratchpad', component: page(() => import('./pages/scratchpad.vue')), diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 94892ff5267013e2eb2c833c72ed6dfa1bf5577b..9ad931ee804eebcb95bf48196cb5e3c938b46818 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -158,6 +158,10 @@ export const defaultStore = markRaw(new Storage('base', { where: 'device', default: false, }, + advancedMfm: { + where: 'device', + default: false, + }, loadRawImages: { where: 'device', default: false,