diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-04-16 00:21:56 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-04-16 00:21:56 +0900 |
| commit | 5e1d17dff24fefd8e306ae597601f0593fa40b09 (patch) | |
| tree | 97b78f715bfe5d8456a594b2f8924c1dea509742 | |
| parent | Merge branch 'develop' (diff) | |
| parent | 12.76.1 (diff) | |
| download | misskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.tar.gz misskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.tar.bz2 misskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.zip | |
Merge branch 'develop'
| -rw-r--r-- | locales/ja-JP.yml | 2 | ||||
| -rw-r--r-- | package.json | 4 | ||||
| -rw-r--r-- | src/client/components/date-separated-list.vue | 14 | ||||
| -rw-r--r-- | src/client/components/mfm.ts | 11 | ||||
| -rw-r--r-- | src/client/components/notifications.vue | 5 | ||||
| -rw-r--r-- | src/client/components/post-form.vue | 48 | ||||
| -rw-r--r-- | src/client/pages/messaging/messaging-room.message.vue | 7 | ||||
| -rw-r--r-- | src/client/pages/mfm-cheat-sheet.vue | 239 | ||||
| -rw-r--r-- | src/client/pages/page.vue | 6 | ||||
| -rw-r--r-- | src/client/pages/settings/general.vue | 6 | ||||
| -rw-r--r-- | src/client/pages/timeline.vue | 17 | ||||
| -rw-r--r-- | src/client/pages/user/index.vue | 3 | ||||
| -rw-r--r-- | src/client/store.ts | 4 | ||||
| -rw-r--r-- | src/client/style.scss | 10 | ||||
| -rw-r--r-- | src/client/themes/d-dark.json5 | 2 | ||||
| -rw-r--r-- | src/client/ui/default.vue | 2 | ||||
| -rw-r--r-- | src/client/ui/universal.vue | 9 | ||||
| -rw-r--r-- | src/client/widgets/job-queue.vue | 2 | ||||
| -rw-r--r-- | yarn.lock | 8 |
19 files changed, 229 insertions, 170 deletions
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 33d7e760a0..741a5a6191 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -717,6 +717,8 @@ unlikeConfirm: "いいね解除しますか?" fullView: "フルビュー" quitFullView: "フルビュー解除" addDescription: "説明を追加" +userPagePinTip: "個々のノートのメニューから「ピン留め」を選択することで、ここにノートを表示しておくことができます。" +notSpecifiedMentionWarning: "宛先に含まれていないメンションがあります" _email: _follow: diff --git a/package.json b/package.json index e6f3b71b74..825341d040 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "syuilo <syuilotan@yahoo.co.jp>", - "version": "12.76.0", + "version": "12.76.1", "codename": "indigo", "repository": { "type": "git", @@ -181,7 +181,7 @@ "markdown-it": "12.0.4", "markdown-it-anchor": "7.1.0", "matter-js": "0.16.1", - "mfm-js": "0.14.0", + "mfm-js": "0.15.0", "mocha": "8.3.2", "moji": "0.5.1", "ms": "2.1.3", diff --git a/src/client/components/date-separated-list.vue b/src/client/components/date-separated-list.vue index 433655d6ed..833cdfc898 100644 --- a/src/client/components/date-separated-list.vue +++ b/src/client/components/date-separated-list.vue @@ -24,11 +24,9 @@ export default defineComponent({ methods: { focus() { this.$slots.default[0].elm.focus(); - } - }, + }, - render() { - const getDateText = (time: string) => { + getDateText(time: string) { const date = new Date(time).getDate(); const month = new Date(time).getMonth() + 1; return this.$t('monthAndDay', { @@ -36,9 +34,13 @@ export default defineComponent({ day: date.toString() }); } + }, + render() { const noGap = [...document.querySelectorAll('._noGap_')].some(el => el.contains(this.$parent.$el)); + if (this.items.length === 0) return; + return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? { class: 'sqadhkmv' + (noGap ? ' _block' : ''), name: 'list', @@ -72,10 +74,10 @@ export default defineComponent({ class: 'icon', icon: faAngleUp, }), - getDateText(item.createdAt) + this.getDateText(item.createdAt) ]), h('span', [ - getDateText(this.items[i + 1].createdAt), + this.getDateText(this.items[i + 1].createdAt), h(FontAwesomeIcon, { class: 'icon', icon: faAngleDown, diff --git a/src/client/components/mfm.ts b/src/client/components/mfm.ts index b8e948a188..3b08c83c7f 100644 --- a/src/client/components/mfm.ts +++ b/src/client/components/mfm.ts @@ -58,10 +58,13 @@ export default defineComponent({ const text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n'); if (!this.plain) { - const x = text.split('\n') - .map(t => t == '' ? [h('br')] : [t, h('br')]); - x[x.length - 1].pop(); - return x; + const res = []; + for (const t of text.split('\n')) { + res.push(h('br')); + res.push(t); + } + res.shift(); + return res; } else { return [text.replace(/\n/g, ' ')]; } diff --git a/src/client/components/notifications.vue b/src/client/components/notifications.vue index baafa86f4d..0891108d8b 100644 --- a/src/client/components/notifications.vue +++ b/src/client/components/notifications.vue @@ -1,7 +1,6 @@ <template> -<div class="mfcuwfyp _noGap_"> - <div class="_magnet"></div> - <XList class="notifications" :items="items" v-slot="{ item: notification }"> +<div class="mfcuwfyp _noGap_ _magnetParent"> + <XList class="notifications _magnetChild" :items="items" v-slot="{ item: notification }"> <XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/> <XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/> </XList> diff --git a/src/client/components/post-form.vue b/src/client/components/post-form.vue index ce79f34d62..4c6a9ebc95 100644 --- a/src/client/components/post-form.vue +++ b/src/client/components/post-form.vue @@ -34,6 +34,7 @@ <button @click="addVisibleUser" class="_buttonPrimary"><Fa :icon="faPlus" fixed-width/></button> </div> </div> + <MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo> <input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown"> <textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" /> <XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/> @@ -71,12 +72,14 @@ import { selectFile } from '@client/scripts/select-file'; import { notePostInterruptors, postFormActions } from '@client/store'; import { isMobile } from '@client/scripts/is-mobile'; import { throttle } from 'throttle-debounce'; +import MkInfo from '@client/components/ui/info.vue'; export default defineComponent({ components: { XNotePreview, XPostFormAttaches: defineAsyncComponent(() => import('./post-form-attaches.vue')), - XPollEditor: defineAsyncComponent(() => import('./poll-editor.vue')) + XPollEditor: defineAsyncComponent(() => import('./poll-editor.vue')), + MkInfo, }, inject: ['modal'], @@ -143,6 +146,7 @@ export default defineComponent({ autocomplete: null, draghover: false, quoteId: null, + hasNotSpecifiedMentions: false, recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'), imeText: '', typing: throttle(3000, () => { @@ -214,6 +218,18 @@ export default defineComponent({ } }, + watch: { + text() { + this.checkMissingMention(); + }, + visibleUsers: { + handler() { + this.checkMissingMention(); + }, + deep: true + } + }, + mounted() { if (this.initialText) { this.text = this.initialText; @@ -338,6 +354,32 @@ export default defineComponent({ this.$watch('localOnly', () => this.saveDraft()); }, + checkMissingMention() { + if (this.visibility === 'specified') { + const ast = mfm.parse(this.text); + + for (const x of extractMentions(ast)) { + if (!this.visibleUsers.some(u => (u.username === x.username) && (u.host == x.host))) { + this.hasNotSpecifiedMentions = true; + return; + } + } + this.hasNotSpecifiedMentions = false; + } + }, + + addMissingMention() { + const ast = mfm.parse(this.text); + + for (const x of extractMentions(ast)) { + if (!this.visibleUsers.some(u => (u.username === x.username) && (u.host == x.host))) { + os.api('users/show', { username: x.username, host: x.host }).then(user => { + this.visibleUsers.push(user); + }); + } + } + }, + togglePoll() { if (this.poll) { this.poll = null; @@ -741,6 +783,10 @@ export default defineComponent({ } } + > .hasNotSpecifiedMentions { + margin: 0 20px 16px 20px; + } + > .cw, > .text { display: block; diff --git a/src/client/pages/messaging/messaging-room.message.vue b/src/client/pages/messaging/messaging-room.message.vue index 3755bc2b5c..8c275d5e33 100644 --- a/src/client/pages/messaging/messaging-room.message.vue +++ b/src/client/pages/messaging/messaging-room.message.vue @@ -85,6 +85,8 @@ export default defineComponent({ display: flex; > .avatar { + position: sticky; + top: calc(var(--stickyTop, 0px) + 16px); display: block; width: 54px; height: 54px; @@ -274,6 +276,11 @@ export default defineComponent({ background: $me-balloon-color; text-align: left; + ::selection { + color: var(--accent); + background-color: #fff; + } + &.noText { background: transparent; } diff --git a/src/client/pages/mfm-cheat-sheet.vue b/src/client/pages/mfm-cheat-sheet.vue index b30c3414e2..1fe7b18222 100644 --- a/src/client/pages/mfm-cheat-sheet.vue +++ b/src/client/pages/mfm-cheat-sheet.vue @@ -1,265 +1,261 @@ <template> <div class="mwysmxbg"> - <div class="_section"> - <div class="_content"> - <p>{{ $ts._mfm.intro }}</p> - </div> - </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.mention }}</div> - <div class="_content"> + <div class="_isolated">{{ $ts._mfm.intro }}</div> + <div class="section _block"> + <div class="title">{{ $ts._mfm.mention }}</div> + <div class="content"> <p>{{ $ts._mfm.mentionDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_mention"/> <MkTextarea v-model:value="preview_mention"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.hashtag }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.hashtag }}</div> + <div class="content"> <p>{{ $ts._mfm.hashtagDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_hashtag"/> <MkTextarea v-model:value="preview_hashtag"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.url }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.url }}</div> + <div class="content"> <p>{{ $ts._mfm.urlDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_url"/> <MkTextarea v-model:value="preview_url"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.link }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.link }}</div> + <div class="content"> <p>{{ $ts._mfm.linkDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_link"/> <MkTextarea v-model:value="preview_link"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.emoji }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.emoji }}</div> + <div class="content"> <p>{{ $ts._mfm.emojiDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_emoji"/> <MkTextarea v-model:value="preview_emoji"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.bold }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.bold }}</div> + <div class="content"> <p>{{ $ts._mfm.boldDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_bold"/> <MkTextarea v-model:value="preview_bold"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.small }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.small }}</div> + <div class="content"> <p>{{ $ts._mfm.smallDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_small"/> <MkTextarea v-model:value="preview_small"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.quote }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.quote }}</div> + <div class="content"> <p>{{ $ts._mfm.quoteDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_quote"/> <MkTextarea v-model:value="preview_quote"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.center }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.center }}</div> + <div class="content"> <p>{{ $ts._mfm.centerDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_center"/> <MkTextarea v-model:value="preview_center"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.inlineCode }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.inlineCode }}</div> + <div class="content"> <p>{{ $ts._mfm.inlineCodeDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_inlineCode"/> <MkTextarea v-model:value="preview_inlineCode"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.blockCode }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.blockCode }}</div> + <div class="content"> <p>{{ $ts._mfm.blockCodeDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_blockCode"/> <MkTextarea v-model:value="preview_blockCode"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.inlineMath }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.inlineMath }}</div> + <div class="content"> <p>{{ $ts._mfm.inlineMathDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_inlineMath"/> <MkTextarea v-model:value="preview_inlineMath"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.search }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.search }}</div> + <div class="content"> <p>{{ $ts._mfm.searchDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_search"/> <MkTextarea v-model:value="preview_search"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.flip }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.flip }}</div> + <div class="content"> <p>{{ $ts._mfm.flipDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_flip"/> <MkTextarea v-model:value="preview_flip"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.font }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.font }}</div> + <div class="content"> <p>{{ $ts._mfm.fontDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_font"/> <MkTextarea v-model:value="preview_font"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.x2 }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.x2 }}</div> + <div class="content"> <p>{{ $ts._mfm.x2Description }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_x2"/> <MkTextarea v-model:value="preview_x2"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.x3 }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.x3 }}</div> + <div class="content"> <p>{{ $ts._mfm.x3Description }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_x3"/> <MkTextarea v-model:value="preview_x3"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.x4 }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.x4 }}</div> + <div class="content"> <p>{{ $ts._mfm.x4Description }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_x4"/> <MkTextarea v-model:value="preview_x4"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.blur }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.blur }}</div> + <div class="content"> <p>{{ $ts._mfm.blurDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_blur"/> <MkTextarea v-model:value="preview_blur"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.jelly }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.jelly }}</div> + <div class="content"> <p>{{ $ts._mfm.jellyDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_jelly"/> <MkTextarea v-model:value="preview_jelly"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.tada }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.tada }}</div> + <div class="content"> <p>{{ $ts._mfm.tadaDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_tada"/> <MkTextarea v-model:value="preview_tada"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.jump }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.jump }}</div> + <div class="content"> <p>{{ $ts._mfm.jumpDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_jump"/> <MkTextarea v-model:value="preview_jump"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.bounce }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.bounce }}</div> + <div class="content"> <p>{{ $ts._mfm.bounceDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_bounce"/> <MkTextarea v-model:value="preview_bounce"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.spin }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.spin }}</div> + <div class="content"> <p>{{ $ts._mfm.spinDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_spin"/> <MkTextarea v-model:value="preview_spin"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.shake }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.shake }}</div> + <div class="content"> <p>{{ $ts._mfm.shakeDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_shake"/> <MkTextarea v-model:value="preview_shake"><span>MFM</span></MkTextarea> </div> </div> </div> - <div class="_section"> - <div class="_title">{{ $ts._mfm.twitch }}</div> - <div class="_content"> + <div class="section _block"> + <div class="title">{{ $ts._mfm.twitch }}</div> + <div class="content"> <p>{{ $ts._mfm.twitchDescription }}</p> - <div class="preview _panel"> + <div class="preview"> <Mfm :text="preview_twitch"/> <MkTextarea v-model:value="preview_twitch"><span>MFM</span></MkTextarea> </div> @@ -318,8 +314,29 @@ export default defineComponent({ <style lang="scss" scoped> .mwysmxbg { - .preview { - padding: 16px; + > .section { + > .title { + position: sticky; + z-index: 1; + top: var(--stickyTop, 0px); + padding: 16px; + font-weight: bold; + -webkit-backdrop-filter: blur(10px); + backdrop-filter: 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/src/client/pages/page.vue b/src/client/pages/page.vue index 57bbeba6b2..6ff09e2b68 100644 --- a/src/client/pages/page.vue +++ b/src/client/pages/page.vue @@ -1,8 +1,6 @@ <template> -<div class="xcukqgmh _root" v-if="page" :key="page.id" v-size="{ max: [450] }"> - <div class="_magnet"></div> - - <div class="_block main"> +<div class="xcukqgmh _root _magnetParent" v-if="page" :key="page.id" v-size="{ max: [450] }"> + <div class="_block _magnetChild main"> <!-- <div class="header"> <h1>{{ page.title }}</h1> diff --git a/src/client/pages/settings/general.vue b/src/client/pages/settings/general.vue index 7e80e2249f..2963ddf432 100644 --- a/src/client/pages/settings/general.vue +++ b/src/client/pages/settings/general.vue @@ -1,6 +1,5 @@ <template> <FormBase> - <FormSwitch v-model:value="titlebar">{{ $ts.showTitlebar }}</FormSwitch> <FormSwitch v-model:value="showFixedPostForm">{{ $ts.showFixedPostForm }}</FormSwitch> <FormSelect v-model:value="lang"> @@ -137,7 +136,6 @@ export default defineComponent({ useOsNativeEmojis: defaultStore.makeGetterSetter('useOsNativeEmojis'), disableShowingAnimatedImages: defaultStore.makeGetterSetter('disableShowingAnimatedImages'), loadRawImages: defaultStore.makeGetterSetter('loadRawImages'), - titlebar: defaultStore.makeGetterSetter('titlebar'), imageNewTab: defaultStore.makeGetterSetter('imageNewTab'), nsfw: defaultStore.makeGetterSetter('nsfw'), disablePagesScript: defaultStore.makeGetterSetter('disablePagesScript'), @@ -182,10 +180,6 @@ export default defineComponent({ this.reloadAsk(); }, - titlebar() { - this.reloadAsk(); - }, - instanceTicker() { this.reloadAsk(); }, diff --git a/src/client/pages/timeline.vue b/src/client/pages/timeline.vue index 751137c942..0e0116465c 100644 --- a/src/client/pages/timeline.vue +++ b/src/client/pages/timeline.vue @@ -1,11 +1,10 @@ <template> -<div class="cmuxhskf _root" v-hotkey.global="keymap"> - <div class="new" v-if="queue > 0" :style="{ width: width + 'px' }"><button class="_buttonPrimary" @click="top()">{{ $ts.newNoteRecived }}</button></div> +<div class="cmuxhskf _root _magnetParent" v-hotkey.global="keymap"> + <div class="new" v-if="queue > 0"><button class="_buttonPrimary" @click="top()">{{ $ts.newNoteRecived }}</button></div> - <div class="_magnet"></div> <XTutorial v-if="$store.reactiveState.tutorial.value != -1" class="tutorial _block"/> <XPostForm v-if="$store.reactiveState.showFixedPostForm.value" class="post-form _block" fixed/> - <div class="tabs _block"> + <div class="tabs _block _magnetChild"> <div class="left"> <button class="_button tab" @click="() => { src = 'home'; saveSrc(); }" :class="{ active: src === 'home' }" v-tooltip="$ts._timelines.home"><Fa :icon="faHome"/></button> <button class="_button tab" @click="() => { src = 'local'; saveSrc(); }" :class="{ active: src === 'local' }" v-tooltip="$ts._timelines.local" v-if="isLocalTimelineAvailable"><Fa :icon="faComments"/></button> @@ -64,7 +63,6 @@ export default defineComponent({ channel: null, menuOpened: false, queue: 0, - width: 0, [symbols.PAGE_INFO]: computed(() => ({ title: this.$ts.timeline, icon: this.src === 'local' ? faComments : this.src === 'social' ? faShareAlt : this.src === 'global' ? faGlobe : faHome, @@ -126,10 +124,6 @@ export default defineComponent({ } }, - mounted() { - this.width = this.$el.offsetWidth; - }, - methods: { before() { Progress.start(); @@ -140,7 +134,6 @@ export default defineComponent({ }, queueUpdated(q) { - if (this.$el.offsetWidth !== 0) this.width = this.$el.offsetWidth; this.queue = q; }, @@ -223,8 +216,10 @@ export default defineComponent({ <style lang="scss" scoped> .cmuxhskf { > .new { - position: fixed; + position: sticky; + top: calc(var(--stickyTop, 0px) + 16px); z-index: 1000; + width: 100%; > button { display: block; diff --git a/src/client/pages/user/index.vue b/src/client/pages/user/index.vue index 52b2725964..e8d54402ec 100644 --- a/src/client/pages/user/index.vue +++ b/src/client/pages/user/index.vue @@ -198,6 +198,7 @@ <div v-if="user.pinnedNotes.length > 0"> <XNote v-for="note in user.pinnedNotes" class="note _block" :note="note" @update:note="pinnedNoteUpdated(note, $event)" :key="note.id" :pinned="true"/> </div> + <MkInfo v-else-if="$i && $i.id === user.id">{{ $ts.userPagePinTip }}</MkInfo> <XPhotos :user="user" :key="user.id"/> <XActivity :user="user" :key="user.id"/> </div> @@ -229,6 +230,7 @@ import MkContainer from '@client/components/ui/container.vue'; import MkFolder from '@client/components/ui/folder.vue'; import MkRemoteCaution from '@client/components/remote-caution.vue'; import MkTab from '@client/components/tab.vue'; +import MkInfo from '@client/components/ui/info.vue'; import Progress from '@client/scripts/loading'; import parseAcct from '@/misc/acct/parse'; import { getScrollPosition } from '@client/scripts/scroll'; @@ -247,6 +249,7 @@ export default defineComponent({ MkRemoteCaution, MkFolder, MkTab, + MkInfo, XFollowList: defineAsyncComponent(() => import('./follow-list.vue')), XClips: defineAsyncComponent(() => import('./clips.vue')), XPages: defineAsyncComponent(() => import('./pages.vue')), diff --git a/src/client/store.ts b/src/client/store.ts index cdc244537f..0d34a02364 100644 --- a/src/client/store.ts +++ b/src/client/store.ts @@ -184,10 +184,6 @@ export const defaultStore = markRaw(new Storage('base', { where: 'device', default: 'full' as 'full' | 'icon' }, - titlebar: { - where: 'device', - default: true - }, reportError: { where: 'device', default: false diff --git a/src/client/style.scss b/src/client/style.scss index e9c28f1827..63433109ff 100644 --- a/src/client/style.scss +++ b/src/client/style.scss @@ -366,10 +366,6 @@ hr { border-radius: var(--radius); } - ._magnet { - margin-bottom: calc(var(--margin) * -1); - } - @media (max-width: 500px) { ._root { --root-margin: 0; @@ -377,6 +373,12 @@ hr { } } +._magnetParent { + ._magnetChild:not(* + ._magnetChild) { + margin-top: 0; + } +} + ._narrow_ ._card { > ._title { padding: 16px; diff --git a/src/client/themes/d-dark.json5 b/src/client/themes/d-dark.json5 index 337eaa6396..fba7fe7582 100644 --- a/src/client/themes/d-dark.json5 +++ b/src/client/themes/d-dark.json5 @@ -16,8 +16,6 @@ panelShadow: '" 0 8px 24px rgb(0 0 0 / 25%)', panelHeaderBg: '@panel', panelHeaderDivider: '@divider', - infoFg: '@accent', - infoBg: 'rgb(0, 0, 0)', header: ':alpha<0.7<@panel', navBg: '#363636', renote: '@accent', diff --git a/src/client/ui/default.vue b/src/client/ui/default.vue index ec59bf0039..1745f1f3d4 100644 --- a/src/client/ui/default.vue +++ b/src/client/ui/default.vue @@ -6,7 +6,7 @@ </div> <main class="main _panel" @contextmenu.stop="onContextmenu"> - <header v-if="$store.state.titlebar" class="header" @click="onHeaderClick"> + <header class="header" @click="onHeaderClick"> <XHeader :info="pageInfo"/> </header> <div class="content" :class="{ _flat_: !fullView }"> diff --git a/src/client/ui/universal.vue b/src/client/ui/universal.vue index 3e2ee28817..6df09937df 100644 --- a/src/client/ui/universal.vue +++ b/src/client/ui/universal.vue @@ -2,8 +2,8 @@ <div class="mk-app" :class="{ wallpaper }"> <XSidebar ref="nav" class="sidebar"/> - <div class="contents" ref="contents" :class="{ withHeader: $store.state.titlebar }" @contextmenu.stop="onContextmenu"> - <header v-if="$store.state.titlebar" class="header" ref="header" @click="onHeaderClick"> + <div class="contents" ref="contents" @contextmenu.stop="onContextmenu"> + <header class="header" ref="header" @click="onHeaderClick"> <XHeader :info="pageInfo"/> </header> <main ref="main"> @@ -260,10 +260,7 @@ export default defineComponent({ width: 100%; min-width: 0; --stickyTop: #{$header-height}; - - &.withHeader { - padding-top: $header-height; - } + padding-top: $header-height; > .header { position: fixed; diff --git a/src/client/widgets/job-queue.vue b/src/client/widgets/job-queue.vue index 0b560ca56e..007fd412c8 100644 --- a/src/client/widgets/job-queue.vue +++ b/src/client/widgets/job-queue.vue @@ -22,7 +22,7 @@ </div> </div> <div class="deliver"> - <div class="label">Deliver queue<Fa :icon="faExclamationTriangle" v-if="inbox.waiting > 0" class="icon"/></div> + <div class="label">Deliver queue<Fa :icon="faExclamationTriangle" v-if="deliver.waiting > 0" class="icon"/></div> <div class="values"> <div> <div>Process</div> @@ -6613,10 +6613,10 @@ methods@^1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -mfm-js@0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/mfm-js/-/mfm-js-0.14.0.tgz#0952ed6f0dd8553866bde7e646c3d5d3d23aeae9" - integrity sha512-snCiszquj6DIOARdgJfI8b6o9PbojAmJe1thrsBkUTxG+XG27rCOmjEL1kc1705XraJo0aVCLR9vE6YmjHiUQg== +mfm-js@0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/mfm-js/-/mfm-js-0.15.0.tgz#b7dea4225a992ac4fd873ad6b2cad069f171dc24" + integrity sha512-JW7AAQzXejo60JGwx+wzodkp45XKYBEq4bYlMDcxjmi2e+P0IOhAcpz2HPBbzxnO/4X3WPuklU8B16RUZpFFdg== dependencies: twemoji-parser "13.0.x" |