diff --git a/src/App.scss b/src/App.scss index be6929f69..00a8e9547 100644 --- a/src/App.scss +++ b/src/App.scss @@ -21,7 +21,7 @@ } html { - font-size: var(--textSize, 14px); + font-size: var(--textSize, 1rem); --navbar-height: var(--navbarSize, 3.5rem); --emoji-size: var(--emojiSize, 32px); @@ -382,6 +382,10 @@ nav { font-family: sans-serif; font-family: var(--font); + &.-transparent { + backdrop-filter: blur(0.125em) contrast(60%); + } + &::-moz-focus-inner { border: none; } diff --git a/src/components/button.style.js b/src/components/button.style.js index ecbf54d9e..c32a232f4 100644 --- a/src/components/button.style.js +++ b/src/components/button.style.js @@ -64,6 +64,26 @@ export default { opacity: 0.5 } }, + { + component: 'Text', + parent: { + component: 'Button', + variant: 'transparent' + }, + directives: { + textColor: '--text' + } + }, + { + component: 'Icon', + parent: { + component: 'Button', + variant: 'transparent' + }, + directives: { + textColor: '--text' + } + }, { state: ['hover'], directives: { diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index f9b306fb4..8e572d1d2 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -140,7 +140,7 @@ const EmojiPicker = { }, updateEmojiSize () { const css = window.getComputedStyle(this.$refs.popover.$el) - const fontSize = css.getPropertyValue('font-size') || '14px' + const fontSize = css.getPropertyValue('font-size') || '1rem' const emojiSize = css.getPropertyValue('--emojiSize') || '2.2rem' const fontSizeUnit = fontSize.replace(/[0-9,.]+/, '').trim() diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js index 247b73848..3edf21de7 100644 --- a/src/components/notification/notification.js +++ b/src/components/notification/notification.js @@ -42,6 +42,7 @@ library.add( const Notification = { data () { return { + selecting: false, statusExpanded: false, unmuted: false, showingApproveConfirmDialog: false, @@ -62,11 +63,35 @@ const Notification = { UserLink, ConfirmModal }, + mounted () { + document.addEventListener('selectionchange', this.onContentSelect) + }, + unmounted () { + document.removeEventListener('selectionchange', this.onContentSelect) + }, methods: { toggleStatusExpanded () { if (!this.expandable) return this.statusExpanded = !this.statusExpanded }, + onContentSelect () { + const { isCollapsed, anchorNode, offsetNode } = document.getSelection() + if (isCollapsed) { + this.selecting = false + return + } + const within = this.$refs.root.contains(anchorNode) || this.$refs.root.contains(offsetNode) + if (within) { + this.selecting = true + } else { + this.selecting = false + } + }, + onContentClick (e) { + if (!this.selecting && !e.target.closest('a') && !e.target.closest('button')) { + this.toggleStatusExpanded() + } + }, generateUserProfileLink (user) { return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames) }, @@ -138,7 +163,7 @@ const Notification = { return highlightStyle(highlight[user.screen_name]) }, expandable () { - return (new Set(['like', '-pleroma:emoji_reaction', 'repeat'])).has(this.notification.type) + return (new Set(['like', 'pleroma:emoji_reaction', 'repeat'])).has(this.notification.type) }, user () { return this.$store.getters.findUser(this.notification.from_profile.id) diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue index 6a8352b65..118c1ba0e 100644 --- a/src/components/notification/notification.vue +++ b/src/components/notification/notification.vue @@ -1,6 +1,7 @@ diff --git a/src/components/rich_content/rich_content.jsx b/src/components/rich_content/rich_content.jsx index cdad60f74..cbc170e5b 100644 --- a/src/components/rich_content/rich_content.jsx +++ b/src/components/rich_content/rich_content.jsx @@ -92,6 +92,12 @@ export default { required: false, type: Boolean, default: true + }, + // Collapse newlines + collapse: { + required: false, + type: Boolean, + default: false } }, // NEVER EVER TOUCH DATA INSIDE RENDER @@ -290,11 +296,20 @@ export default { const pass1 = convertHtmlToTree(html).map(processItem) const pass2 = [...pass1].reverse().map(processItemReverse).reverse() + // DO NOT USE SLOTS they cause a re-render feedback loop here. // slots updated -> rerender -> emit -> update up the tree -> rerender -> ... // at least until vue3? - const result = - { pass2 } + const result = + + { + this.collapse + ? pass2.map(x => { + if (!Array.isArray(x)) return x.replace(/\n/g, ' ') + return x.map(y => y.type === 'br' ? ' ' : y) + }) + : pass2 + } const event = { diff --git a/src/components/status/status.scss b/src/components/status/status.scss index 0f325ea7f..09b37aa14 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -245,8 +245,8 @@ margin-right: 0; .emoji { - width: 14px; - height: 14px; + width: 1em; + height: 1em; vertical-align: middle; object-fit: contain; } diff --git a/src/components/status_body/status_body.js b/src/components/status_body/status_body.js index 8739fd0d5..9a56060e8 100644 --- a/src/components/status_body/status_body.js +++ b/src/components/status_body/status_body.js @@ -41,6 +41,7 @@ const StatusBody = { parseReadyDone: false } }, + emits: ['parseReady'], computed: { localCollapseSubjectDefault () { return this.mergedConfig.collapseMessageWithSubject diff --git a/src/components/status_body/status_body.vue b/src/components/status_body/status_body.vue index ae2bdf206..677781d97 100644 --- a/src/components/status_body/status_body.vue +++ b/src/components/status_body/status_body.vue @@ -39,7 +39,8 @@ v-if="!hideSubjectStatus && !(singleLine && status.summary_raw_html)" :class="{ '-single-line': singleLine }" class="text media-body" - :html="collapse ? collapsedStatus : status.raw_html" + :html="status.raw_html" + :collapse="collapse" :emoji="status.emojis" :handle-links="true" :faint="compact" @@ -59,32 +60,6 @@ @click.prevent="toggleShowMore" > {{ toggleText }} - diff --git a/src/components/status_content/status_content.js b/src/components/status_content/status_content.js index f61ba0d05..364123f49 100644 --- a/src/components/status_content/status_content.js +++ b/src/components/status_content/status_content.js @@ -65,6 +65,7 @@ const StatusContent = { 'controlledShowingLongSubject', 'controlledToggleShowingLongSubject' ], + emits: ['parseReady', 'mediaplay', 'mediapause'], data () { return { uncontrolledShowingTall: this.fullContent || (this.inConversation && this.focused), diff --git a/src/components/status_content/status_content.vue b/src/components/status_content/status_content.vue index fb08186b4..bab4f70a5 100644 --- a/src/components/status_content/status_content.vue +++ b/src/components/status_content/status_content.vue @@ -24,7 +24,7 @@ /> -
+
diff --git a/src/modules/instance.js b/src/modules/instance.js index 93f81e4d8..7317debf8 100644 --- a/src/modules/instance.js +++ b/src/modules/instance.js @@ -108,7 +108,7 @@ const defaultState = { palette: null, style: null, emojiReactionsScale: 0.5, - textSize: '14px', + textSize: '1rem', emojiSize: '2.2rem', navbarSize: '3.5rem', panelHeaderSize: '3.2rem',