From 2c4e80aab3946e6a16b0768d45723f4ff8e47f72 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Fri, 29 Mar 2019 11:49:32 -0400 Subject: [PATCH 01/81] #101 - add emoji selector basic mockup --- src/components/emoji-input/emoji-input.js | 5 ++ src/components/emoji-input/emoji-input.vue | 1 + .../emoji-selector/emoji-selector.js | 26 ++++++++ .../emoji-selector/emoji-selector.vue | 65 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 src/components/emoji-selector/emoji-selector.js create mode 100644 src/components/emoji-selector/emoji-selector.vue diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index a5bb6eaf..48e89409 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -1,4 +1,6 @@ import Completion from '../../services/completion/completion.js' +import EmojiSelector from '../emoji-selector/emoji-selector.vue' + import { take, filter, map } from 'lodash' const EmojiInput = { @@ -14,6 +16,9 @@ const EmojiInput = { caret: 0 } }, + components: { + EmojiSelector + }, computed: { suggestions () { const firstchar = this.textAtCaret.charAt(0) diff --git a/src/components/emoji-input/emoji-input.vue b/src/components/emoji-input/emoji-input.vue index 338b77cd..a1ddd7f9 100644 --- a/src/components/emoji-input/emoji-input.vue +++ b/src/components/emoji-input/emoji-input.vue @@ -1,5 +1,6 @@ <template> <div class="emoji-input"> + <EmojiSelector /> <input v-if="type !== 'textarea'" :class="classname" diff --git a/src/components/emoji-selector/emoji-selector.js b/src/components/emoji-selector/emoji-selector.js new file mode 100644 index 00000000..77107573 --- /dev/null +++ b/src/components/emoji-selector/emoji-selector.js @@ -0,0 +1,26 @@ +const EmojiSelector = { + data () { + return { + open: false + } + }, + mounted () { + console.log(this.$store.state.instance.emoji) + console.log(this.$store.state.instance.customEmoji) + }, + methods: { + togglePanel () { + this.open = !this.open + } + }, + computed: { + standardEmoji () { + return this.$store.state.instance.emoji || [] + }, + customEmoji () { + return this.$store.state.instance.customEmoji || [] + } + } +} + +export default EmojiSelector diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue new file mode 100644 index 00000000..ebacc0c4 --- /dev/null +++ b/src/components/emoji-selector/emoji-selector.vue @@ -0,0 +1,65 @@ +<template> + <div class="emoji-dropdown"> + <span class="emoji-dropdown-toggle" @click="togglePanel">Emoji</span> + <div class="emoji-dropdown-menu" v-if="open"> + <span v-for="emoji in standardEmoji" :key="'standard' + emoji.shortcode" :title="emoji.shortcode" class="emoji-item"> + <span v-if="!emoji.image_url">{{emoji.utf}}</span> + <img :src="emoji.utf" v-else> + </span> + <span v-for="emoji in customEmoji" :key="'custom' + emoji.shortcode" :title="emoji.shortcode" class="emoji-item"> + <span v-if="!emoji.image_url">{{emoji.utf}}</span> + <img :src="'https://bikeshed.party' + emoji.image_url" v-else> + </span> + </div> + </div> +</template> + +<script src="./emoji-selector.js"></script> + +<style lang="scss"> +@import '../../_variables.scss'; + +.emoji { + &-dropdown { + position: relative; + + &-toggle { + cursor: pointer; + } + + &-menu { + position: absolute; + z-index: 1; + right: 0; + width: 300px; + height: 300px; + background: white; + border: 1px solid $fallback--faint; + display: flex; + align-items: center; + flex-wrap: wrap; + overflow: auto; + margin-bottom: 5px; + + img { + max-width: 100%; + max-height: 100%; + } + } + } + + &-item { + width: 34px; + height: 34px; + box-sizing: border-box; + display: flex; + font-size: 16px; + align-items: center; + justify-content: center; + color: black; + padding: 5px; + cursor: pointer; + } + +} +</style> From f9071dac254af0d99ca239c50931a00fbd11de6d Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Fri, 29 Mar 2019 12:48:52 -0400 Subject: [PATCH 02/81] #101 - show emojis in groups, clean up --- .../emoji-selector/emoji-selector.js | 31 ++++--- .../emoji-selector/emoji-selector.vue | 87 +++++++++++++++---- 2 files changed, 89 insertions(+), 29 deletions(-) diff --git a/src/components/emoji-selector/emoji-selector.js b/src/components/emoji-selector/emoji-selector.js index 77107573..4771f4c6 100644 --- a/src/components/emoji-selector/emoji-selector.js +++ b/src/components/emoji-selector/emoji-selector.js @@ -1,24 +1,35 @@ +const filterByKeyword = (list, keyword = '') => { + return list.filter(x => x.shortcode.indexOf(keyword) !== -1) +} + const EmojiSelector = { data () { return { - open: false + open: false, + keyword: '' } }, - mounted () { - console.log(this.$store.state.instance.emoji) - console.log(this.$store.state.instance.customEmoji) - }, methods: { togglePanel () { this.open = !this.open } }, computed: { - standardEmoji () { - return this.$store.state.instance.emoji || [] - }, - customEmoji () { - return this.$store.state.instance.customEmoji || [] + emojis () { + const standardEmojis = this.$store.state.instance.emoji || [] + const customEmojis = this.$store.state.instance.customEmoji || [] + return { + standard: { + text: 'Standard', + icon: 'icon-star', + emojis: filterByKeyword(standardEmojis, this.keyword) + }, + custom: { + text: 'Custom', + icon: 'icon-picture', + emojis: filterByKeyword(customEmojis, this.keyword) + } + } } } } diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index ebacc0c4..576ca16e 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -1,15 +1,26 @@ <template> <div class="emoji-dropdown"> <span class="emoji-dropdown-toggle" @click="togglePanel">Emoji</span> - <div class="emoji-dropdown-menu" v-if="open"> - <span v-for="emoji in standardEmoji" :key="'standard' + emoji.shortcode" :title="emoji.shortcode" class="emoji-item"> - <span v-if="!emoji.image_url">{{emoji.utf}}</span> - <img :src="emoji.utf" v-else> - </span> - <span v-for="emoji in customEmoji" :key="'custom' + emoji.shortcode" :title="emoji.shortcode" class="emoji-item"> - <span v-if="!emoji.image_url">{{emoji.utf}}</span> - <img :src="'https://bikeshed.party' + emoji.image_url" v-else> - </span> + <div class="emoji-dropdown-menu panel panel-default" v-if="open"> + <div class="panel-heading emoji-tabs"> + <span class="emoji-tabs-item" v-for="(value, key) in emojis" :key="key" :title="value.text"> + <i :class="value.icon"></i> + </span> + </div> + <div class="panel-body emoji-dropdown-menu-content"> + <div class="emoji-search"> + <input type="text" class="form-control" v-model="keyword" /> + </div> + <div class="emoji-groups"> + <div v-for="(value, key) in emojis" :key="key" class="emoji-group"> + <h6 class="emoji-group-title">{{value.text}}</h6> + <span v-for="emoji in value.emojis" :key="key + emoji.shortcode" :title="emoji.shortcode" class="emoji-item"> + <span v-if="!emoji.image_url">{{emoji.utf}}</span> + <img :src="'https://bikeshed.party' + emoji.image_url" v-else> + </span> + </div> + </div> + </div> </div> </div> </template> @@ -33,21 +44,55 @@ right: 0; width: 300px; height: 300px; - background: white; - border: 1px solid $fallback--faint; display: flex; - align-items: center; - flex-wrap: wrap; - overflow: auto; - margin-bottom: 5px; + flex-direction: column; - img { - max-width: 100%; - max-height: 100%; + &-content { + flex: 1 1 1px; + display: flex; + flex-direction: column; } } } + &-tabs { + &-item { + padding: 0 5px; + + &:first-child, &.active { + border-bottom: 4px solid; + + i { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } + } + } + } + + &-search { + padding: 5px; + } + + &-groups { + flex: 1 1 1px; + overflow: auto; + } + + &-group { + display: flex; + align-items: center; + flex-wrap: wrap; + width: 100%; + + &-title { + font-size: 12px; + width: 100%; + margin: 0; + padding: 5px; + } + } + &-item { width: 34px; height: 34px; @@ -56,9 +101,13 @@ font-size: 16px; align-items: center; justify-content: center; - color: black; padding: 5px; cursor: pointer; + + img { + max-width: 100%; + max-height: 100%; + } } } From 3172b4e7c18d07a36477a77fcebe6b521cfa15d0 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Fri, 29 Mar 2019 15:56:50 -0400 Subject: [PATCH 03/81] #101 - insert emoji from emoji selector --- src/components/emoji-input/emoji-input.js | 5 +++++ src/components/emoji-input/emoji-input.vue | 6 +++++- src/components/emoji-selector/emoji-selector.js | 5 +++++ .../emoji-selector/emoji-selector.vue | 17 +++++++++++++++-- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index 48e89409..8f7598ca 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -105,6 +105,11 @@ const EmojiInput = { }, setCaret ({target: {selectionStart}}) { this.caret = selectionStart + }, + onEmoji (emoji) { + const newValue = this.value.substr(0, this.caret) + emoji + this.value.substr(this.caret) + this.$refs.input.focus() + this.$emit('input', newValue) } } } diff --git a/src/components/emoji-input/emoji-input.vue b/src/components/emoji-input/emoji-input.vue index a1ddd7f9..151861de 100644 --- a/src/components/emoji-input/emoji-input.vue +++ b/src/components/emoji-input/emoji-input.vue @@ -1,6 +1,5 @@ <template> <div class="emoji-input"> - <EmojiSelector /> <input v-if="type !== 'textarea'" :class="classname" @@ -16,6 +15,7 @@ @keydown.shift.tab="cycleBackward" @keydown.tab="cycleForward" @keydown.enter="replaceEmoji" + ref="input" /> <textarea v-else @@ -31,7 +31,9 @@ @keydown.shift.tab="cycleBackward" @keydown.tab="cycleForward" @keydown.enter="replaceEmoji" + ref="input" ></textarea> + <EmojiSelector @emoji="onEmoji" /> <div class="autocomplete-panel" v-if="suggestions"> <div class="autocomplete-panel-body"> <div @@ -58,6 +60,8 @@ @import '../../_variables.scss'; .emoji-input { + position: relative; + .form-control { width: 100%; } diff --git a/src/components/emoji-selector/emoji-selector.js b/src/components/emoji-selector/emoji-selector.js index 4771f4c6..07ea0442 100644 --- a/src/components/emoji-selector/emoji-selector.js +++ b/src/components/emoji-selector/emoji-selector.js @@ -12,6 +12,11 @@ const EmojiSelector = { methods: { togglePanel () { this.open = !this.open + }, + onEmoji (emoji) { + const value = emoji.image_url ? `:${emoji.shortcode}:` : emoji.utf + this.$emit('emoji', ` ${value} `) + this.open = false } }, computed: { diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index 576ca16e..70752714 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -14,7 +14,13 @@ <div class="emoji-groups"> <div v-for="(value, key) in emojis" :key="key" class="emoji-group"> <h6 class="emoji-group-title">{{value.text}}</h6> - <span v-for="emoji in value.emojis" :key="key + emoji.shortcode" :title="emoji.shortcode" class="emoji-item"> + <span + v-for="emoji in value.emojis" + :key="key + emoji.shortcode" + :title="emoji.shortcode" + class="emoji-item" + @click="onEmoji(emoji)" + > <span v-if="!emoji.image_url">{{emoji.utf}}</span> <img :src="'https://bikeshed.party' + emoji.image_url" v-else> </span> @@ -32,20 +38,27 @@ .emoji { &-dropdown { - position: relative; + position: absolute; + right: 10px; + top: 2px; + z-index: 1; &-toggle { cursor: pointer; + position: absolute; + right: 0; } &-menu { position: absolute; z-index: 1; right: 0; + top: 25px; width: 300px; height: 300px; display: flex; flex-direction: column; + margin: 0 !important; &-content { flex: 1 1 1px; From 2ee8d213669c101baad726ece5dc37b5eea7da94 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Fri, 29 Mar 2019 16:34:59 -0400 Subject: [PATCH 04/81] #101 - update emoji with fontello icon --- .../emoji-selector/emoji-selector.vue | 16 +++++++++---- static/font/config.json | 12 ++++++++++ static/font/css/fontello-codes.css | 2 ++ static/font/css/fontello-embedded.css | 14 ++++++----- static/font/css/fontello-ie7-codes.css | 2 ++ static/font/css/fontello-ie7.css | 2 ++ static/font/css/fontello.css | 16 +++++++------ static/font/demo.html | 22 +++++++++++------- static/font/font/fontello.eot | Bin 17760 -> 18372 bytes static/font/font/fontello.svg | 4 ++++ static/font/font/fontello.ttf | Bin 17592 -> 18204 bytes static/font/font/fontello.woff | Bin 10752 -> 11180 bytes static/font/font/fontello.woff2 | Bin 9148 -> 9460 bytes 13 files changed, 63 insertions(+), 27 deletions(-) diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index 70752714..c9593971 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -1,6 +1,8 @@ <template> <div class="emoji-dropdown"> - <span class="emoji-dropdown-toggle" @click="togglePanel">Emoji</span> + <span class="emoji-dropdown-toggle" @click="togglePanel"> + <i class="icon-smile"></i> + </span> <div class="emoji-dropdown-menu panel panel-default" v-if="open"> <div class="panel-heading emoji-tabs"> <span class="emoji-tabs-item" v-for="(value, key) in emojis" :key="key" :title="value.text"> @@ -39,21 +41,25 @@ .emoji { &-dropdown { position: absolute; - right: 10px; - top: 2px; + right: 0; + top: 100%; z-index: 1; &-toggle { cursor: pointer; position: absolute; - right: 0; + top: -25px; + right: 2px; + + i { + font-size: 18px; + } } &-menu { position: absolute; z-index: 1; right: 0; - top: 25px; width: 300px; height: 300px; display: flex; diff --git a/static/font/config.json b/static/font/config.json index d72b622c..8102330b 100755 --- a/static/font/config.json +++ b/static/font/config.json @@ -239,6 +239,18 @@ "css": "pencil", "code": 59416, "src": "fontawesome" + }, + { + "uid": "c64623255a4a7c72436b199b05296c4f", + "css": "emo-happy", + "code": 59417, + "src": "fontelico" + }, + { + "uid": "d862a10e1448589215be19702f98f2c1", + "css": "smile", + "code": 61720, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/static/font/css/fontello-codes.css b/static/font/css/fontello-codes.css index 49175c8f..594a17a5 100755 --- a/static/font/css/fontello-codes.css +++ b/static/font/css/fontello-codes.css @@ -24,6 +24,7 @@ .icon-adjust:before { content: '\e816'; } /* '' */ .icon-edit:before { content: '\e817'; } /* '' */ .icon-pencil:before { content: '\e818'; } /* '' */ +.icon-emo-happy:before { content: '\e819'; } /* '' */ .icon-spin3:before { content: '\e832'; } /* '' */ .icon-spin4:before { content: '\e834'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ @@ -33,6 +34,7 @@ .icon-comment-empty:before { content: '\f0e5'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ +.icon-smile:before { content: '\f118'; } /* '' */ .icon-lock-open-alt:before { content: '\f13e'; } /* '' */ .icon-play-circled:before { content: '\f144'; } /* '' */ .icon-thumbs-up-alt:before { content: '\f164'; } /* '' */ diff --git a/static/font/css/fontello-embedded.css b/static/font/css/fontello-embedded.css index c43ad321..7c9ca640 100755 --- a/static/font/css/fontello-embedded.css +++ b/static/font/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?21048049'); - src: url('../font/fontello.eot?21048049#iefix') format('embedded-opentype'), - url('../font/fontello.svg?21048049#fontello') format('svg'); + src: url('../font/fontello.eot?44981686'); + src: url('../font/fontello.eot?44981686#iefix') format('embedded-opentype'), + url('../font/fontello.svg?44981686#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?21048049#fontello') format('svg'); + src: url('../font/fontello.svg?44981686#fontello') format('svg'); } } */ @@ -77,6 +77,7 @@ .icon-adjust:before { content: '\e816'; } /* '' */ .icon-edit:before { content: '\e817'; } /* '' */ .icon-pencil:before { content: '\e818'; } /* '' */ +.icon-emo-happy:before { content: '\e819'; } /* '' */ .icon-spin3:before { content: '\e832'; } /* '' */ .icon-spin4:before { content: '\e834'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ @@ -86,6 +87,7 @@ .icon-comment-empty:before { content: '\f0e5'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ +.icon-smile:before { content: '\f118'; } /* '' */ .icon-lock-open-alt:before { content: '\f13e'; } /* '' */ .icon-play-circled:before { content: '\f144'; } /* '' */ .icon-thumbs-up-alt:before { content: '\f164'; } /* '' */ diff --git a/static/font/css/fontello-ie7-codes.css b/static/font/css/fontello-ie7-codes.css index 56e11447..86ca4e4b 100755 --- a/static/font/css/fontello-ie7-codes.css +++ b/static/font/css/fontello-ie7-codes.css @@ -24,6 +24,7 @@ .icon-adjust { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-emo-happy { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-spin3 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-spin4 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-link-ext { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -33,6 +34,7 @@ .icon-comment-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-smile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-lock-open-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-play-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-thumbs-up-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/static/font/css/fontello-ie7.css b/static/font/css/fontello-ie7.css index edced9cb..125f0c31 100755 --- a/static/font/css/fontello-ie7.css +++ b/static/font/css/fontello-ie7.css @@ -35,6 +35,7 @@ .icon-adjust { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-pencil { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-emo-happy { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-spin3 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-spin4 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-link-ext { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -44,6 +45,7 @@ .icon-comment-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-smile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-lock-open-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-play-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-thumbs-up-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/static/font/css/fontello.css b/static/font/css/fontello.css index 64a7a938..93a525dd 100755 --- a/static/font/css/fontello.css +++ b/static/font/css/fontello.css @@ -1,11 +1,11 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?40679575'); - src: url('../font/fontello.eot?40679575#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?40679575') format('woff2'), - url('../font/fontello.woff?40679575') format('woff'), - url('../font/fontello.ttf?40679575') format('truetype'), - url('../font/fontello.svg?40679575#fontello') format('svg'); + src: url('../font/fontello.eot?67796422'); + src: url('../font/fontello.eot?67796422#iefix') format('embedded-opentype'), + url('../font/fontello.woff2?67796422') format('woff2'), + url('../font/fontello.woff?67796422') format('woff'), + url('../font/fontello.ttf?67796422') format('truetype'), + url('../font/fontello.svg?67796422#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?40679575#fontello') format('svg'); + src: url('../font/fontello.svg?67796422#fontello') format('svg'); } } */ @@ -80,6 +80,7 @@ .icon-adjust:before { content: '\e816'; } /* '' */ .icon-edit:before { content: '\e817'; } /* '' */ .icon-pencil:before { content: '\e818'; } /* '' */ +.icon-emo-happy:before { content: '\e819'; } /* '' */ .icon-spin3:before { content: '\e832'; } /* '' */ .icon-spin4:before { content: '\e834'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ @@ -89,6 +90,7 @@ .icon-comment-empty:before { content: '\f0e5'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ +.icon-smile:before { content: '\f118'; } /* '' */ .icon-lock-open-alt:before { content: '\f13e'; } /* '' */ .icon-play-circled:before { content: '\f144'; } /* '' */ .icon-thumbs-up-alt:before { content: '\f164'; } /* '' */ diff --git a/static/font/demo.html b/static/font/demo.html index 2c89a505..89869d27 100755 --- a/static/font/demo.html +++ b/static/font/demo.html @@ -229,11 +229,11 @@ body { } @font-face { font-family: 'fontello'; - src: url('./font/fontello.eot?50378338'); - src: url('./font/fontello.eot?50378338#iefix') format('embedded-opentype'), - url('./font/fontello.woff?50378338') format('woff'), - url('./font/fontello.ttf?50378338') format('truetype'), - url('./font/fontello.svg?50378338#fontello') format('svg'); + src: url('./font/fontello.eot?37046490'); + src: url('./font/fontello.eot?37046490#iefix') format('embedded-opentype'), + url('./font/fontello.woff?37046490') format('woff'), + url('./font/fontello.ttf?37046490') format('truetype'), + url('./font/fontello.svg?37046490#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -335,25 +335,29 @@ body { </div> <div class="row"> <div class="the-icons span3" title="Code: 0xe818"><i class="demo-icon icon-pencil"></i> <span class="i-name">icon-pencil</span><span class="i-code">0xe818</span></div> + <div class="the-icons span3" title="Code: 0xe819"><i class="demo-icon icon-emo-happy"></i> <span class="i-name">icon-emo-happy</span><span class="i-code">0xe819</span></div> <div class="the-icons span3" title="Code: 0xe832"><i class="demo-icon icon-spin3 animate-spin"></i> <span class="i-name">icon-spin3</span><span class="i-code">0xe832</span></div> <div class="the-icons span3" title="Code: 0xe834"><i class="demo-icon icon-spin4 animate-spin"></i> <span class="i-name">icon-spin4</span><span class="i-code">0xe834</span></div> - <div class="the-icons span3" title="Code: 0xf08e"><i class="demo-icon icon-link-ext"></i> <span class="i-name">icon-link-ext</span><span class="i-code">0xf08e</span></div> </div> <div class="row"> + <div class="the-icons span3" title="Code: 0xf08e"><i class="demo-icon icon-link-ext"></i> <span class="i-name">icon-link-ext</span><span class="i-code">0xf08e</span></div> <div class="the-icons span3" title="Code: 0xf08f"><i class="demo-icon icon-link-ext-alt"></i> <span class="i-name">icon-link-ext-alt</span><span class="i-code">0xf08f</span></div> <div class="the-icons span3" title="Code: 0xf0c9"><i class="demo-icon icon-menu"></i> <span class="i-name">icon-menu</span><span class="i-code">0xf0c9</span></div> <div class="the-icons span3" title="Code: 0xf0e0"><i class="demo-icon icon-mail-alt"></i> <span class="i-name">icon-mail-alt</span><span class="i-code">0xf0e0</span></div> - <div class="the-icons span3" title="Code: 0xf0e5"><i class="demo-icon icon-comment-empty"></i> <span class="i-name">icon-comment-empty</span><span class="i-code">0xf0e5</span></div> </div> <div class="row"> + <div class="the-icons span3" title="Code: 0xf0e5"><i class="demo-icon icon-comment-empty"></i> <span class="i-name">icon-comment-empty</span><span class="i-code">0xf0e5</span></div> <div class="the-icons span3" title="Code: 0xf0fe"><i class="demo-icon icon-plus-squared"></i> <span class="i-name">icon-plus-squared</span><span class="i-code">0xf0fe</span></div> <div class="the-icons span3" title="Code: 0xf112"><i class="demo-icon icon-reply"></i> <span class="i-name">icon-reply</span><span class="i-code">0xf112</span></div> - <div class="the-icons span3" title="Code: 0xf13e"><i class="demo-icon icon-lock-open-alt"></i> <span class="i-name">icon-lock-open-alt</span><span class="i-code">0xf13e</span></div> - <div class="the-icons span3" title="Code: 0xf144"><i class="demo-icon icon-play-circled"></i> <span class="i-name">icon-play-circled</span><span class="i-code">0xf144</span></div> + <div class="the-icons span3" title="Code: 0xf118"><i class="demo-icon icon-smile"></i> <span class="i-name">icon-smile</span><span class="i-code">0xf118</span></div> </div> <div class="row"> + <div class="the-icons span3" title="Code: 0xf13e"><i class="demo-icon icon-lock-open-alt"></i> <span class="i-name">icon-lock-open-alt</span><span class="i-code">0xf13e</span></div> + <div class="the-icons span3" title="Code: 0xf144"><i class="demo-icon icon-play-circled"></i> <span class="i-name">icon-play-circled</span><span class="i-code">0xf144</span></div> <div class="the-icons span3" title="Code: 0xf164"><i class="demo-icon icon-thumbs-up-alt"></i> <span class="i-name">icon-thumbs-up-alt</span><span class="i-code">0xf164</span></div> <div class="the-icons span3" title="Code: 0xf1e5"><i class="demo-icon icon-binoculars"></i> <span class="i-name">icon-binoculars</span><span class="i-code">0xf1e5</span></div> + </div> + <div class="row"> <div class="the-icons span3" title="Code: 0xf234"><i class="demo-icon icon-user-plus"></i> <span class="i-name">icon-user-plus</span><span class="i-code">0xf234</span></div> </div> </div> diff --git a/static/font/font/fontello.eot b/static/font/font/fontello.eot index a72671b0d0dfe2fc4d11a57efae27916b5d236e6..b7d4832772f373d883174af526dca1f724381a07 100755 GIT binary patch delta 1272 zcmZuwZ%kWN6hG(P_os#OTG~gU1zM=ke{_YF+Om#x45r9L!U)kVS)d&QN&;&GsNfcB z7GlhjG1=RqACzda=+qA;BPPT&`axnOnTcOa^ot=zlq}JdWtv3?^*o**_Q7}ad%ycT z_ndRjJ@>t>E4XnD#f@Hoy51Er#_t8XS68~;&YQ+w_#Oan1Mrrym*yM9(*6U0qdWjK zOynkKuB^OyhIA7^d2TX2mm|9cAn}OUFgd+AF?-+j5I|T5Xbon@)90&{n|}dBf1&kQ zh78gsF91AQN4hC9Gr#cG)zVL-yGY-j&W`n^|M~EDKN)t&@cc}AA&2>j4=7f1Xt<D` z8Nd6kyODGXfcrL=otrOIJo*CQNE;P>H#a+;+dke>0C@U_`W}9DQ~{(oKpEJ<EJR#J zkqYqevzCzt9c{<46WNItuN60oTgC0-{;qYmMtz5C#2U501!y}YzoCOM4F5A!j-8VH z5FkfUO|yq;j+L8D2Rmzx(VoCshHu5ZL)(m`lQ^OSYKfydfcjEg)&cdz*K~l3cvA<s ziMMo6Sy0^80aRykUk7*qcC9+#3E~<ZNuZ0{P3nMV;uAW+OMG4j_=qW~2B5pRPsM4V zGjxhmt~@K1O7F8B<^vNrAOX*IJ!9kyT7$C;k;iNq@*<xFQ4q5rNRluNf*_p+Ns#($ zopJ@j;WnSQvB8<BO(?bshwP9<FrlejP+HI<qvFCy5~E>kd|cQ(W)vkEeR*#yddaKW z?nZmHy(u0$hOu}o>P4Zxy}mxu8F9HH_@zsugZUl1*))_H|8XKSWVW=pEu3gPcX0vn z<%?-SWM((>`ML*se7>H6?#E_(A6ZO;Edl29511|35VA1Ac(%2b9X3WrDXcQ&hP7Kw z4r5*@?UmNqD6@i%uCEzl&;#9F$LbZ1W7rEu5SdX-3CMWlkZ~#M6G#XtkPHTC7$nJX z8Vr)5|9Dq*wcV!J91d%lP~U<whSBFu(iy2Av3L?)*sO>iZ<4bM#9`EyqTxK}kvSJj zvbZ9nC(I==;zDk*Dz`kV@N%7#m-|Ofn)y1XW&hV;BE<QVUTg?<`nga?_-bP0_2oCt zc5)r5rR$f^#rkHy-udQ&_)6iy=dU9640D4|$xfrm66)v(ndLI)wkvoLS@$1*(zldy zbZEg#Bb|J7;?i?3Zp_bb+|ynFYlTBMgu2!4z}~32^G_&e+CL3HYy{{V)LETwk7H21 z)jq|3E0t7Jw25bDN_%Qs^rYXsZdtB$RTivH>uc7c?Xv9;<%IHGRif&W-DAI3eUnm9 xBO$o98ZBp(<m31tk3nov|BioFW*nc%9?GP1xkdHUj#HvAH#0Roe&<Na^e;m1B<27B delta 640 zcmZXQOK1~O6o&tsNn@HcHkqbUw2#!LHTb|1(`jo(6yibyp)H7X)eOz6lGwopsi1V_ zrVG<>MT)2d1ks&32n8)f>?TkbZc1@uPy@5@F>Q4tCH16t>0Cbk`=4{qJ?GA9o>dl@ zEp`D|4i{{Sbvv@+DV$rH_YXe*1+Zs;^nL0^&S%@L{RW1L0DMU;m0c(-PLMAFPA#R* zY7}>qUm~@qGB=Y?N^e$yhI_yXM>?U#y{|rR0l^~Wl{5wRm8}x_4f6hUHaE8z+5JL( zhkP+JGj&n@`eQu_oO(!s@vJ(hvD>bv<W2IvYic&J_Nc2H2vJkZ2W@6HH{rVSlJ2h1 z(97EOgjPL&>@5)P=SB8@*bYW@U=~PwyW^w|s<gw3bxL&7@DlbLZAQ=tnR&BpR?Mnd z+m!iZOE-UK33M<z6Wv>*_-}ECG^S5VO|0=-y$yXw^qlo1n-2m8frF$W0S*D?T>;uj z^8$2`mIc%cW<`K5(y9PH(wYGD`b}AY!=z^g=phXY`rxNcT!3Cux~LBNfGrxR4$T^~ zO?T=ad)pdy*3TQ-Ju8vz$>uYE;FJu?V}nPjfl&TpV2}m4F)+<9D?R*{a>?&@xF2|i zJoi02az?JTTx}_Nk9sq$a_gr9cc`lV=L7mr#VJwU-{DanJ^h-yM#l8`NUZ4}2$Zpy diff --git a/static/font/font/fontello.svg b/static/font/font/fontello.svg index 91aba5ef..2c1ee1f4 100755 --- a/static/font/font/fontello.svg +++ b/static/font/font/fontello.svg @@ -56,6 +56,8 @@ <glyph glyph-name="pencil" unicode="" d="M203 0l50 51-131 131-51-51v-60h72v-71h60z m291 518q0 12-12 12-5 0-9-4l-303-302q-4-4-4-10 0-12 13-12 5 0 9 4l303 302q3 4 3 10z m-30 107l232-232-464-465h-232v233z m381-54q0-29-20-50l-93-93-232 233 93 92q20 21 50 21 29 0 51-21l131-131q20-22 20-51z" horiz-adv-x="857.1" /> +<glyph glyph-name="emo-happy" unicode="" d="M261 807c-60 0-109-65-109-144 0-80 49-145 109-145s110 65 110 145c0 79-49 144-110 144z m477 0c-61 0-110-65-110-144 0-80 49-145 110-145 60 0 110 65 110 145 0 79-50 144-110 144z m208-599c-13 0-27-5-37-16-4-4-8-8-12-12-111-109-253-164-396-165-142-2-285 50-396 155l-3 3-12 12c-21 21-54 20-75-1-20-21-20-55 1-76 3-4 8-8 14-14l3-3c132-124 301-186 469-184 169 1 337 67 468 195 5 5 9 10 14 14 20 22 20 56-1 77-10 10-23 15-37 15z" horiz-adv-x="999" /> + <glyph glyph-name="spin3" unicode="" d="M494 857c-266 0-483-210-494-472-1-19 13-20 13-20l84 0c16 0 19 10 19 18 10 199 176 358 378 358 107 0 205-45 273-118l-58-57c-11-12-11-27 5-31l247-50c21-5 46 11 37 44l-58 227c-2 9-16 22-29 13l-65-60c-89 91-214 148-352 148z m409-508c-16 0-19-10-19-18-10-199-176-358-377-358-108 0-205 45-274 118l59 57c10 12 10 27-5 31l-248 50c-21 5-46-11-37-44l58-227c2-9 16-22 30-13l64 60c89-91 214-148 353-148 265 0 482 210 493 473 1 18-13 19-13 19l-84 0z" horiz-adv-x="1000" /> <glyph glyph-name="spin4" unicode="" d="M498 857c-114 0-228-39-320-116l0 0c173 140 428 130 588-31 134-134 164-332 89-495-10-29-5-50 12-68 21-20 61-23 84 0 3 3 12 15 15 24 71 180 33 393-112 539-99 98-228 147-356 147z m-409-274c-14 0-29-5-39-16-3-3-13-15-15-24-71-180-34-393 112-539 185-185 479-195 676-31l0 0c-173-140-428-130-589 31-134 134-163 333-89 495 11 29 6 50-12 68-11 11-27 17-44 16z" horiz-adv-x="1001" /> @@ -74,6 +76,8 @@ <glyph glyph-name="reply" unicode="" d="M1000 232q0-93-71-252-1-4-6-13t-7-17-7-12q-7-10-16-10-8 0-13 6t-5 14q0 5 1 15t2 13q3 38 3 69 0 56-10 101t-27 77-45 56-59 39-74 24-86 12-98 3h-125v-143q0-14-10-25t-26-11-25 11l-285 286q-11 10-11 25t11 25l285 286q11 10 25 10t26-10 10-25v-143h125q398 0 488-225 30-75 30-186z" horiz-adv-x="1000" /> +<glyph glyph-name="smile" unicode="" d="M633 257q-21-67-77-109t-127-41-128 41-77 109q-4 14 3 27t21 18q14 4 27-2t17-22q14-44 52-72t85-28 84 28 52 72q4 15 18 22t27 2 21-18 2-27z m-276 243q0-30-21-51t-50-21-51 21-21 51 21 50 51 21 50-21 21-50z m286 0q0-30-21-51t-51-21-50 21-21 51 21 50 50 21 51-21 21-50z m143-143q0 73-29 139t-76 114-114 76-138 28-139-28-114-76-76-114-29-139 29-139 76-113 114-77 139-28 138 28 114 77 76 113 29 139z m71 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" /> + <glyph glyph-name="lock-open-alt" unicode="" d="M589 428q23 0 38-15t16-38v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v179q0 103 74 177t176 73 177-73 73-177q0-14-10-25t-25-11h-36q-14 0-25 11t-11 25q0 59-42 101t-101 42-101-42-41-101v-179h410z" horiz-adv-x="642.9" /> <glyph glyph-name="play-circled" unicode="" d="M429 786q116 0 215-58t156-156 57-215-57-215-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58z m214-460q18 10 18 31t-18 31l-304 178q-17 11-35 1-18-11-18-31v-358q0-20 18-31 9-4 17-4 10 0 18 5z" horiz-adv-x="857.1" /> diff --git a/static/font/font/fontello.ttf b/static/font/font/fontello.ttf index 9d36bc11823cf06fd839b4e954b8710de81bd438..8c337900b1c8c34988be2dee417e2bbb59921346 100755 GIT binary patch delta 1265 zcmZvbe@t6d6vxkbKU*kmX&;3acr6{YrR@qUwXGfL7~l^k5=MwJvp_p2l!UGgpn_Yh zS%{e?V?WB`KWbu3bjH6XF(HPiiNr`U6aO*Mf6QV;n<bi-;Ic%Zp2zc#{o%X$zRx}P z-gED{=ia;V7QVZRH#+mW$rpbFz&ik(aq^W#hfq1(131Y6fMYs0lX?5*jdNtT0#xT_ zk_$O%Hv+`=iJF<Y<>~od`4IrW0np)1r;<~3((Q);q2H)KoTdhGo8tkVXd=5compIZ z=UU|#vU|wBGnbtlNdEKjpB`!`Qo{?G<WdgvH6M|$GQe>$nMvJy&)!0I0)Y8Gmt9!g ztl9q(;K@!3`d)56mD@S(+XQ%e?dGFzPD+5}2B-)2sOBeDk)s40{Hjbyg?3i77K6o5 z>3V6qbicGyIxL&Y4TU{ysc9(3%l+l4^3HCkQYqYJ>~<uNk)tvS|5FMtF=s^&w9}fx zhj$q?(IUE|5R?QdU;FykYzOA8%Bp1Ah(T4*NDQe0%1>!k6*LpCs{)z0tqSbK`>H4^ zDD9|%7UH2QZ~~Mm2t{y=*q|y7bb#f!Drh72s{$8sN)@<?G^rw>Gufr!6ww~m_*ps6 zRw|Vb*dptuEm|Q4&-Fa3Wi(2rvn(Qq*(&4&E(-!LWPuk&eiV3K90QRT2ODkr8iW&_ zZdZ%L7Hf=2<{GQsDhi-OT{SQH(5XjB#$X&n0c?5PFgpz>h<bGAT^;D6QS}x(TIwyW zk?<)DN5UZ&^37e%&B5-VEC=x`S;0~LGmAktl1}|RogOh5eRd-wXfIq^LVWd7k{4Km zoprl=hx**^zM<a7Y6qVfb;G`P*6kTG7}4Q3vb^?uM+bXC8=N4wTE89E_m5e%dA@Q` z*<dGF6PW4v+8_*l(A#sWSz;I#p8+ihtX4?y$a2Ua%OsQ=DIz35)M&&}5Jk-xXhhB6 z>7M#}i&-*Tt)?oz*@t=zpxYIvJyJfxkvPiOCJ9bgoU!o404iOfK%Q~x8JUf<5lN5E z029ZcjLdRfZgpPb^i4KSKRABIz%|*7hrfGce#R4bp~KtlVf@j+wb=NZt5?r=GttD# ztt%J81M}Y&zq=^Bwz>Dk>xg}$%<xlsn^tG^N27j&zRI>EdyhPu{^O?uD+y~<ab6kk z=0ek#pMQC4adGQ`@&j0xj<4}e@AtMJOc=WVhH6%M+wjv?JKaH*g{@!&y@mbYEc*vN zw5hIEjy+d7C|vD2<1uU)S8L_kO_R;^hN)z}V*X3&mwu>=)m^qYEf4B%(-f3Q@UB1X rs%B{tCNj*S7k!11$mdnsR3>{ooy_Hy3u5%Fz%OKG=Thrq(S+__y6Gqt delta 636 zcmZXRT}V@59LAq>j?=YiZgYl}A2X+|FO;>ZlZXNdN)YuXc2!IFVQhKG5q1$?bx{{O zc_ShW27%N?7d3)G21ect47v!BZW`5K7ez<=po=kkw)e90@;lG_y#Mq6;JnKVO7@PD z>YH~DJpBPEPXO)P<c*}OcDMWs7)%3jMf7Om?ouj9zXn+KXlPdFxsCn-)f|oAj67a@ zwGNo>0Vgc6aA?Z;;?oY`O*7sf<3U}nMx)=NcgGURxzxz+XZjL-IzBUbKJ?}LW&}97 z%!7$UXiisdHLTDZ^sZ~6M0n#-M<?K8Q}vxbGn))HTzt;jc@CY`uZQ)**<-7~aNpA3 zw*fO0ra@7mRd>g!7ABfegG~n7IlG3v#g?MC=rb0LoRK#QMtR#I{wSSdzv^jI_|0f_ zjp4r~uBhWITr1wFCGlRZYpkz!`&xPPIh@(hdX;%EP$W1&^+|9LFcu_er7lX)M$Jjs z7)D-#4r)OH7qu(_|HQUKf<x5P5_D0AB|UI+GbKScm4zyx2iW026*z0wG~J##(%rHr z6YLeHR{QIbpO+d>{f1R5GL9`V$_7$}**~Co#2Npzc;@dCAN&{GHjC|{eb9d2UUI}8 t<)*7mYtEz2c(bGV<G$O>s$7F7bFSa2F>fL;CRPG3MR;gDvpRIS{vXK9uAKk? diff --git a/static/font/font/fontello.woff b/static/font/font/fontello.woff index 35eea15d73495423f65271dfa0d9dbc0459951cb..592f528e1147196dcce7a5314bf8ad6299001624 100755 GIT binary patch delta 8957 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 Su{^;m7Y5RSKuKYY{{I6m<{E_n delta 8526 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 BRDS>f diff --git a/static/font/font/fontello.woff2 b/static/font/font/fontello.woff2 index c88c4b24f60e58032feb8176557ed610cd47b99d..6d82e24d4ef7844b588560fe2b29fcb0a71f83d4 100755 GIT binary patch literal 9460 zcmV<QBn#VjPew8T0RR9103`GP4*&oF07o1E03?|J0RR9100000000000000000000 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 GVE_n^6mjqX literal 9148 zcmV;tBSYMGPew8T0RR9103*Br4*&oF07SR|03%`m0RR9100000000000000000000 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 G0002L)|8(B From 79efe0646cb6fc88952e33e13a8ce61205d3aad6 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Tue, 2 Apr 2019 10:53:33 -0400 Subject: [PATCH 05/81] merge develop --- BREAKING_CHANGES.md | 10 + README.md | 2 +- src/App.js | 27 +- src/App.scss | 32 -- src/App.vue | 11 +- src/boot/after_store.js | 50 ++- .../features_panel/features_panel.js | 2 +- .../features_panel/features_panel.vue | 2 +- src/components/mobile_nav/mobile_nav.js | 77 ++++ src/components/mobile_nav/mobile_nav.vue | 140 ++++++++ src/components/notification/notification.js | 9 + src/components/notification/notification.vue | 4 +- src/components/notifications/notifications.js | 3 + .../notifications/notifications.vue | 2 +- .../post_status_form/post_status_form.js | 25 +- .../post_status_form/post_status_form.vue | 12 +- .../scope_selector/scope_selector.js | 54 +++ .../scope_selector/scope_selector.vue | 30 ++ src/components/settings/settings.js | 10 +- src/components/settings/settings.vue | 6 + src/components/side_drawer/side_drawer.vue | 5 - src/components/status/status.js | 6 + src/components/status/status.vue | 14 +- src/components/user_profile/user_profile.js | 3 - src/components/user_settings/user_settings.js | 6 +- .../user_settings/user_settings.vue | 10 +- src/i18n/en.json | 5 +- src/i18n/oc.json | 2 + src/i18n/pl.json | 332 +++++++++++++++++- src/i18n/ru.json | 10 + src/modules/config.js | 3 +- src/modules/instance.js | 2 +- src/modules/interface.js | 10 +- src/modules/statuses.js | 11 +- .../user_profile_link_generator.js | 2 +- src/services/window_utils/window_utils.js | 5 + static/config.json | 4 +- static/font/LICENSE.txt | 0 static/font/README.txt | 0 static/font/config.json | 6 + static/font/css/fontello-codes.css | 1 + static/font/css/fontello-embedded.css | 13 +- static/font/css/fontello-ie7-codes.css | 1 + static/font/css/fontello-ie7.css | 1 + static/font/css/fontello.css | 15 +- static/font/demo.html | 15 +- static/font/font/fontello.eot | Bin 18372 -> 18720 bytes static/font/font/fontello.svg | 2 + static/font/font/fontello.ttf | Bin 18204 -> 18552 bytes static/font/font/fontello.woff | Bin 11180 -> 11296 bytes static/font/font/fontello.woff2 | Bin 9460 -> 9592 bytes 51 files changed, 835 insertions(+), 157 deletions(-) create mode 100644 BREAKING_CHANGES.md create mode 100644 src/components/mobile_nav/mobile_nav.js create mode 100644 src/components/mobile_nav/mobile_nav.vue create mode 100644 src/components/scope_selector/scope_selector.js create mode 100644 src/components/scope_selector/scope_selector.vue create mode 100644 src/services/window_utils/window_utils.js mode change 100755 => 100644 static/font/LICENSE.txt mode change 100755 => 100644 static/font/README.txt diff --git a/BREAKING_CHANGES.md b/BREAKING_CHANGES.md new file mode 100644 index 00000000..924c38da --- /dev/null +++ b/BREAKING_CHANGES.md @@ -0,0 +1,10 @@ +# v1.0 +## Removed features/radically changed behavior +### minimalScopesMode +As of !633, `scopeOptions` is no longer available and instead is changed for `minimalScopesMode` (default: `false`) + +Reasoning is that scopeOptions option originally existed mostly as a backwards-compatibility with GNU Social which only had `public` scope available and using scope selector would''t work. Since at some point we dropped GNU Social support, this option was mostly a nuisance (being default `false`'), however some people think scopes are an annoyance to a certain degree and want as less of that feature as possible. + +Solution - to only show minimal set among: *Direct*, *User default* and *Scope of post replying to*. This also makes it impossible to reply to a DM with a non-DM post from UI. + +*This setting is admin-default, user-configurable. Admin can choose different default for their instance but user can override it.* diff --git a/README.md b/README.md index 80938c45..889f0837 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ FE Build process also leaves current commit hash in global variable `___pleromaf # Configuration -Edit config.json for configuration. scopeOptionsEnabled gives you input fields for CWs and the scope settings. +Edit config.json for configuration. ## Options diff --git a/src/App.js b/src/App.js index 5c27a3df..46145b16 100644 --- a/src/App.js +++ b/src/App.js @@ -9,7 +9,8 @@ import ChatPanel from './components/chat_panel/chat_panel.vue' import MediaModal from './components/media_modal/media_modal.vue' import SideDrawer from './components/side_drawer/side_drawer.vue' import MobilePostStatusModal from './components/mobile_post_status_modal/mobile_post_status_modal.vue' -import { unseenNotificationsFromStore } from './services/notification_utils/notification_utils' +import MobileNav from './components/mobile_nav/mobile_nav.vue' +import { windowWidth } from './services/window_utils/window_utils' export default { name: 'app', @@ -24,7 +25,8 @@ export default { ChatPanel, MediaModal, SideDrawer, - MobilePostStatusModal + MobilePostStatusModal, + MobileNav }, data: () => ({ mobileActivePanel: 'timeline', @@ -40,6 +42,10 @@ export default { created () { // Load the locale from the storage this.$i18n.locale = this.$store.state.config.interfaceLanguage + window.addEventListener('resize', this.updateMobileState) + }, + destroyed () { + window.removeEventListener('resize', this.updateMobileState) }, computed: { currentUser () { return this.$store.state.users.currentUser }, @@ -82,13 +88,8 @@ export default { chat () { return this.$store.state.chat.channel.state === 'joined' }, suggestionsEnabled () { return this.$store.state.instance.suggestionsEnabled }, showInstanceSpecificPanel () { return this.$store.state.instance.showInstanceSpecificPanel }, - unseenNotifications () { - return unseenNotificationsFromStore(this.$store) - }, - unseenNotificationsCount () { - return this.unseenNotifications.length - }, - showFeaturesPanel () { return this.$store.state.instance.showFeaturesPanel } + showFeaturesPanel () { return this.$store.state.instance.showFeaturesPanel }, + isMobileLayout () { return this.$store.state.interface.mobileLayout } }, methods: { scrollToTop () { @@ -101,8 +102,12 @@ export default { onFinderToggled (hidden) { this.finderHidden = hidden }, - toggleMobileSidebar () { - this.$refs.sideDrawer.toggleDrawer() + updateMobileState () { + const mobileLayout = windowWidth() <= 800 + const changed = mobileLayout !== this.isMobileLayout + if (changed) { + this.$store.dispatch('setMobileLayout', mobileLayout) + } } } } diff --git a/src/App.scss b/src/App.scss index ae068e4f..5fc0dd27 100644 --- a/src/App.scss +++ b/src/App.scss @@ -484,24 +484,6 @@ nav { } } -.menu-button { - display: none; - position: relative; -} - -.alert-dot { - border-radius: 100%; - height: 8px; - width: 8px; - position: absolute; - left: calc(50% - 4px); - top: calc(50% - 4px); - margin-left: 6px; - margin-top: -6px; - background-color: $fallback--cRed; - background-color: var(--badgeNotification, $fallback--cRed); -} - .fade-enter-active, .fade-leave-active { transition: opacity .2s } @@ -530,20 +512,6 @@ nav { display: none; } -.panel-switcher { - display: none; - width: 100%; - height: 46px; - - button { - display: block; - flex: 1; - max-height: 32px; - margin: 0.5em; - padding: 0.5em; - } -} - @media all and (min-width: 800px) { body { overflow-y: scroll; diff --git a/src/App.vue b/src/App.vue index 4fff3d1d..3b8623ad 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,17 +1,14 @@ <template> <div id="app" v-bind:style="bgAppStyle"> <div class="app-bg-wrapper" v-bind:style="bgStyle"></div> - <nav class='nav-bar container' @click="scrollToTop()" id="nav"> + <MobileNav v-if="isMobileLayout" /> + <nav v-else class='nav-bar container' @click="scrollToTop()" id="nav"> <div class='logo' :style='logoBgStyle'> <div class='mask' :style='logoMaskStyle'></div> <img :src='logo' :style='logoStyle'> </div> <div class='inner-nav'> <div class='item'> - <a href="#" class="menu-button" @click.stop.prevent="toggleMobileSidebar()"> - <i class="button-icon icon-menu"></i> - <div class="alert-dot" v-if="unseenNotificationsCount"></div> - </a> <router-link class="site-name" :to="{ name: 'root' }" active-class="home">{{sitename}}</router-link> </div> <div class='item right'> @@ -22,8 +19,7 @@ </div> </nav> <div v-if="" class="container" id="content"> - <side-drawer ref="sideDrawer" :logout="logout"></side-drawer> - <div class="sidebar-flexer mobile-hidden"> + <div class="sidebar-flexer mobile-hidden" v-if="!isMobileLayout"> <div class="sidebar-bounds"> <div class="sidebar-scroller"> <div class="sidebar"> @@ -50,7 +46,6 @@ <media-modal></media-modal> </div> <chat-panel :floating="true" v-if="currentUser && chat" class="floating-chat mobile-hidden"></chat-panel> - <MobilePostStatusModal /> </div> </template> diff --git a/src/boot/after_store.js b/src/boot/after_store.js index f5add8ad..862a534d 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -1,8 +1,8 @@ import Vue from 'vue' import VueRouter from 'vue-router' import routes from './routes' - import App from '../App.vue' +import { windowWidth } from '../services/window_utils/window_utils' const getStatusnetConfig = async ({ store }) => { try { @@ -95,7 +95,7 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => { copyInstanceOption('redirectRootNoLogin') copyInstanceOption('redirectRootLogin') copyInstanceOption('showInstanceSpecificPanel') - copyInstanceOption('scopeOptionsEnabled') + copyInstanceOption('minimalScopesMode') copyInstanceOption('formattingOptionsEnabled') copyInstanceOption('hideMutedPosts') copyInstanceOption('collapseMessageWithSubject') @@ -219,6 +219,28 @@ const getNodeInfo = async ({ store }) => { } } +const setConfig = async ({ store }) => { + // apiConfig, staticConfig + const configInfos = await Promise.all([getStatusnetConfig({ store }), getStaticConfig()]) + const apiConfig = configInfos[0] + const staticConfig = configInfos[1] + + await setSettings({ store, apiConfig, staticConfig }) +} + +const checkOAuthToken = async ({ store }) => { + return new Promise(async (resolve, reject) => { + if (store.state.oauth.token) { + try { + await store.dispatch('loginUser', store.state.oauth.token) + } catch (e) { + console.log(e) + } + } + resolve() + }) +} + const afterStoreSetup = async ({ store, i18n }) => { if (store.state.config.customTheme) { // This is a hack to deal with async loading of config.json and themes @@ -230,19 +252,19 @@ const afterStoreSetup = async ({ store, i18n }) => { }) } - const apiConfig = await getStatusnetConfig({ store }) - const staticConfig = await getStaticConfig() - await setSettings({ store, apiConfig, staticConfig }) - await getTOS({ store }) - await getInstancePanel({ store }) - await getStaticEmoji({ store }) - await getCustomEmoji({ store }) - await getNodeInfo({ store }) + const width = windowWidth() + store.dispatch('setMobileLayout', width <= 800) - // Now we have the server settings and can try logging in - if (store.state.oauth.token) { - await store.dispatch('loginUser', store.state.oauth.token) - } + // Now we can try getting the server settings and logging in + await Promise.all([ + checkOAuthToken({ store }), + setConfig({ store }), + getTOS({ store }), + getInstancePanel({ store }), + getStaticEmoji({ store }), + getCustomEmoji({ store }), + getNodeInfo({ store }) + ]) const router = new VueRouter({ mode: 'history', diff --git a/src/components/features_panel/features_panel.js b/src/components/features_panel/features_panel.js index e0b7a118..5f0b7b25 100644 --- a/src/components/features_panel/features_panel.js +++ b/src/components/features_panel/features_panel.js @@ -6,7 +6,7 @@ const FeaturesPanel = { gopher: function () { return this.$store.state.instance.gopherAvailable }, whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled }, mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable }, - scopeOptions: function () { return this.$store.state.instance.scopeOptionsEnabled }, + minimalScopesMode: function () { return this.$store.state.instance.minimalScopesMode }, textlimit: function () { return this.$store.state.instance.textlimit } } } diff --git a/src/components/features_panel/features_panel.vue b/src/components/features_panel/features_panel.vue index 445143e9..7a263e01 100644 --- a/src/components/features_panel/features_panel.vue +++ b/src/components/features_panel/features_panel.vue @@ -12,7 +12,7 @@ <li v-if="gopher">{{$t('features_panel.gopher')}}</li> <li v-if="whoToFollow">{{$t('features_panel.who_to_follow')}}</li> <li v-if="mediaProxy">{{$t('features_panel.media_proxy')}}</li> - <li v-if="scopeOptions">{{$t('features_panel.scope_options')}}</li> + <li>{{$t('features_panel.scope_options')}}</li> <li>{{$t('features_panel.text_limit')}} = {{textlimit}}</li> </ul> </div> diff --git a/src/components/mobile_nav/mobile_nav.js b/src/components/mobile_nav/mobile_nav.js new file mode 100644 index 00000000..bc63d2ba --- /dev/null +++ b/src/components/mobile_nav/mobile_nav.js @@ -0,0 +1,77 @@ +import SideDrawer from '../side_drawer/side_drawer.vue' +import Notifications from '../notifications/notifications.vue' +import MobilePostStatusModal from '../mobile_post_status_modal/mobile_post_status_modal.vue' +import { unseenNotificationsFromStore } from '../../services/notification_utils/notification_utils' +import GestureService from '../../services/gesture_service/gesture_service' + +const MobileNav = { + components: { + SideDrawer, + Notifications, + MobilePostStatusModal + }, + data: () => ({ + notificationsCloseGesture: undefined, + notificationsOpen: false + }), + created () { + this.notificationsCloseGesture = GestureService.swipeGesture( + GestureService.DIRECTION_RIGHT, + this.closeMobileNotifications, + 50 + ) + }, + computed: { + currentUser () { + return this.$store.state.users.currentUser + }, + unseenNotifications () { + return unseenNotificationsFromStore(this.$store) + }, + unseenNotificationsCount () { + return this.unseenNotifications.length + }, + sitename () { return this.$store.state.instance.name } + }, + methods: { + toggleMobileSidebar () { + this.$refs.sideDrawer.toggleDrawer() + }, + openMobileNotifications () { + this.notificationsOpen = true + }, + closeMobileNotifications () { + if (this.notificationsOpen) { + // make sure to mark notifs seen only when the notifs were open and not + // from close-calls. + this.notificationsOpen = false + this.markNotificationsAsSeen() + } + }, + notificationsTouchStart (e) { + GestureService.beginSwipe(e, this.notificationsCloseGesture) + }, + notificationsTouchMove (e) { + GestureService.updateSwipe(e, this.notificationsCloseGesture) + }, + scrollToTop () { + window.scrollTo(0, 0) + }, + logout () { + this.$router.replace('/main/public') + this.$store.dispatch('logout') + }, + markNotificationsAsSeen () { + this.$refs.notifications.markAsSeen() + } + }, + watch: { + $route () { + // handles closing notificaitons when you press any router-link on the + // notifications. + this.closeMobileNotifications() + } + } +} + +export default MobileNav diff --git a/src/components/mobile_nav/mobile_nav.vue b/src/components/mobile_nav/mobile_nav.vue new file mode 100644 index 00000000..5fa41638 --- /dev/null +++ b/src/components/mobile_nav/mobile_nav.vue @@ -0,0 +1,140 @@ +<template> + <nav class='nav-bar container' id="nav"> + <div class='mobile-inner-nav' @click="scrollToTop()"> + <div class='item'> + <a href="#" class="mobile-nav-button" @click.stop.prevent="toggleMobileSidebar()"> + <i class="button-icon icon-menu"></i> + </a> + <router-link class="site-name" :to="{ name: 'root' }" active-class="home">{{sitename}}</router-link> + </div> + <div class='item right'> + <a class="mobile-nav-button" v-if="currentUser" href="#" @click.stop.prevent="openMobileNotifications()"> + <i class="button-icon icon-bell-alt"></i> + <div class="alert-dot" v-if="unseenNotificationsCount"></div> + </a> + </div> + </div> + <SideDrawer ref="sideDrawer" :logout="logout"/> + <div v-if="currentUser" + class="mobile-notifications-drawer" + :class="{ 'closed': !notificationsOpen }" + @touchstart="notificationsTouchStart" + @touchmove="notificationsTouchMove" + > + <div class="mobile-notifications-header"> + <span class="title">{{$t('notifications.notifications')}}</span> + <a class="mobile-nav-button" @click.stop.prevent="closeMobileNotifications()"> + <i class="button-icon icon-cancel"/> + </a> + </div> + <div v-if="currentUser" class="mobile-notifications"> + <Notifications ref="notifications" noHeading="true"/> + </div> + </div> + <MobilePostStatusModal /> + </nav> +</template> + +<script src="./mobile_nav.js"></script> + +<style lang="scss"> +@import '../../_variables.scss'; + +.mobile-inner-nav { + width: 100%; + display: flex; + align-items: center; +} + +.mobile-nav-button { + display: flex; + justify-content: center; + width: 50px; + position: relative; + cursor: pointer; +} + +.alert-dot { + border-radius: 100%; + height: 8px; + width: 8px; + position: absolute; + left: calc(50% - 4px); + top: calc(50% - 4px); + margin-left: 6px; + margin-top: -6px; + background-color: $fallback--cRed; + background-color: var(--badgeNotification, $fallback--cRed); +} + +.mobile-notifications-drawer { + width: 100%; + height: 100vh; + overflow-x: hidden; + position: fixed; + top: 0; + left: 0; + box-shadow: 1px 1px 4px rgba(0,0,0,.6); + box-shadow: var(--panelShadow); + transition-property: transform; + transition-duration: 0.25s; + transform: translateX(0); + + &.closed { + transform: translateX(100%); + } +} + +.mobile-notifications-header { + display: flex; + align-items: center; + justify-content: space-between; + z-index: 1; + width: 100%; + height: 50px; + line-height: 50px; + position: absolute; + color: var(--topBarText); + background-color: $fallback--fg; + background-color: var(--topBar, $fallback--fg); + box-shadow: 0px 0px 4px rgba(0,0,0,.6); + box-shadow: var(--topBarShadow); + + .title { + font-size: 1.3em; + margin-left: 0.6em; + } +} + +.mobile-notifications { + margin-top: 50px; + width: 100vw; + height: calc(100vh - 50px); + overflow-x: hidden; + overflow-y: scroll; + + color: $fallback--text; + color: var(--text, $fallback--text); + background-color: $fallback--bg; + background-color: var(--bg, $fallback--bg); + + .notifications { + padding: 0; + border-radius: 0; + box-shadow: none; + .panel { + border-radius: 0; + margin: 0; + box-shadow: none; + } + .panel:after { + border-radius: 0; + } + .panel .panel-heading { + border-radius: 0; + box-shadow: none; + } + } +} + +</style> diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js index fe5b7018..42a48f3f 100644 --- a/src/components/notification/notification.js +++ b/src/components/notification/notification.js @@ -31,6 +31,15 @@ const Notification = { const highlight = this.$store.state.config.highlight const user = this.notification.action.user return highlightStyle(highlight[user.screen_name]) + }, + userInStore () { + return this.$store.getters.findUser(this.notification.action.user.id) + }, + user () { + if (this.userInStore) { + return this.userInStore + } + return {} } } } diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue index 5e9cef97..8f532747 100644 --- a/src/components/notification/notification.vue +++ b/src/components/notification/notification.vue @@ -1,11 +1,11 @@ <template> <status v-if="notification.type === 'mention'" :compact="true" :statusoid="notification.status"></status> - <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]"v-else> + <div class="non-mention" :class="[userClass, { highlighted: userStyle }]" :style="[ userStyle ]" v-else> <a class='avatar-container' :href="notification.action.user.statusnet_profile_url" @click.stop.prevent.capture="toggleUserExpanded"> <UserAvatar :compact="true" :betterShadow="betterShadow" :src="notification.action.user.profile_image_url_original"/> </a> <div class='notification-right'> - <UserCard :user="notification.action.user" :rounded="true" :bordered="true" v-if="userExpanded"/> + <UserCard :user="user" :rounded="true" :bordered="true" v-if="userExpanded"/> <span class="notification-details"> <div class="name-and-action"> <span class="username" v-if="!!notification.action.user.name_html" :title="'@'+notification.action.user.screen_name" v-html="notification.action.user.name_html"></span> diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 9fc5e38a..d3db4b29 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -7,6 +7,9 @@ import { } from '../../services/notification_utils/notification_utils.js' const Notifications = { + props: [ + 'noHeading' + ], created () { const store = this.$store const credentials = store.state.users.currentUser.credentials diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue index 6f162b62..634a03ac 100644 --- a/src/components/notifications/notifications.vue +++ b/src/components/notifications/notifications.vue @@ -1,7 +1,7 @@ <template> <div class="notifications"> <div class="panel panel-default"> - <div class="panel-heading"> + <div v-if="!noHeading" class="panel-heading"> <div class="title"> {{$t('notifications.notifications')}} <span class="badge badge-notification unseen-count" v-if="unseenCount">{{unseenCount}}</span> diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 229aefb7..40e2610e 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -1,5 +1,6 @@ import statusPoster from '../../services/status_poster/status_poster.service.js' import MediaUpload from '../media_upload/media_upload.vue' +import ScopeSelector from '../scope_selector/scope_selector.vue' import EmojiInput from '../emoji-input/emoji-input.vue' import fileTypeService from '../../services/file_type/file_type.service.js' import Completion from '../../services/completion/completion.js' @@ -30,6 +31,7 @@ const PostStatusForm = { ], components: { MediaUpload, + ScopeSelector, EmojiInput }, mounted () { @@ -80,14 +82,6 @@ const PostStatusForm = { } }, computed: { - vis () { - return { - public: { selected: this.newStatus.visibility === 'public' }, - unlisted: { selected: this.newStatus.visibility === 'unlisted' }, - private: { selected: this.newStatus.visibility === 'private' }, - direct: { selected: this.newStatus.visibility === 'direct' } - } - }, candidates () { const firstchar = this.textAtCaret.charAt(0) if (firstchar === '@') { @@ -135,6 +129,15 @@ const PostStatusForm = { users () { return this.$store.state.users.users }, + userDefaultScope () { + return this.$store.state.users.currentUser.default_scope + }, + showAllScopes () { + const minimalScopesMode = typeof this.$store.state.config.minimalScopesMode === 'undefined' + ? this.$store.state.instance.minimalScopesMode + : this.$store.state.config.minimalScopesMode + return !minimalScopesMode + }, emoji () { return this.$store.state.instance.emoji || [] }, @@ -159,8 +162,8 @@ const PostStatusForm = { isOverLengthLimit () { return this.hasStatusLengthLimit && (this.charactersLeft < 0) }, - scopeOptionsEnabled () { - return this.$store.state.instance.scopeOptionsEnabled + minimalScopesMode () { + return this.$store.state.instance.minimalScopesMode }, alwaysShowSubject () { if (typeof this.$store.state.config.alwaysShowSubjectInput !== 'undefined') { @@ -168,7 +171,7 @@ const PostStatusForm = { } else if (typeof this.$store.state.instance.alwaysShowSubjectInput !== 'undefined') { return this.$store.state.instance.alwaysShowSubjectInput } else { - return this.$store.state.instance.scopeOptionsEnabled + return true } }, formattingOptionsEnabled () { diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 9f9f16ba..3d3a1082 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -48,12 +48,12 @@ </label> </span> - <div v-if="scopeOptionsEnabled"> - <i v-on:click="changeVis('direct')" class="icon-mail-alt" :class="vis.direct" :title="$t('post_status.scope.direct')"></i> - <i v-on:click="changeVis('private')" class="icon-lock" :class="vis.private" :title="$t('post_status.scope.private')"></i> - <i v-on:click="changeVis('unlisted')" class="icon-lock-open-alt" :class="vis.unlisted" :title="$t('post_status.scope.unlisted')"></i> - <i v-on:click="changeVis('public')" class="icon-globe" :class="vis.public" :title="$t('post_status.scope.public')"></i> - </div> + <scope-selector + :showAll="showAllScopes" + :userDefault="userDefaultScope" + :originalScope="copyMessageScope" + :initialScope="newStatus.visibility" + :onScopeChange="changeVis"/> </div> </div> <div class="autocomplete-panel" v-if="candidates"> diff --git a/src/components/scope_selector/scope_selector.js b/src/components/scope_selector/scope_selector.js new file mode 100644 index 00000000..8a42ee7b --- /dev/null +++ b/src/components/scope_selector/scope_selector.js @@ -0,0 +1,54 @@ +const ScopeSelector = { + props: [ + 'showAll', + 'userDefault', + 'originalScope', + 'initialScope', + 'onScopeChange' + ], + data () { + return { + currentScope: this.initialScope + } + }, + computed: { + showNothing () { + return !this.showPublic && !this.showUnlisted && !this.showPrivate && !this.showDirect + }, + showPublic () { + return this.originalScope !== 'direct' && this.shouldShow('public') + }, + showUnlisted () { + return this.originalScope !== 'direct' && this.shouldShow('unlisted') + }, + showPrivate () { + return this.originalScope !== 'direct' && this.shouldShow('private') + }, + showDirect () { + return this.shouldShow('direct') + }, + css () { + return { + public: {selected: this.currentScope === 'public'}, + unlisted: {selected: this.currentScope === 'unlisted'}, + private: {selected: this.currentScope === 'private'}, + direct: {selected: this.currentScope === 'direct'} + } + } + }, + methods: { + shouldShow (scope) { + return this.showAll || + this.currentScope === scope || + this.originalScope === scope || + this.userDefault === scope || + scope === 'direct' + }, + changeVis (scope) { + this.currentScope = scope + this.onScopeChange && this.onScopeChange(scope) + } + } +} + +export default ScopeSelector diff --git a/src/components/scope_selector/scope_selector.vue b/src/components/scope_selector/scope_selector.vue new file mode 100644 index 00000000..33ea488f --- /dev/null +++ b/src/components/scope_selector/scope_selector.vue @@ -0,0 +1,30 @@ +<template> +<div v-if="!showNothing"> + <i class="icon-mail-alt" + :class="css.direct" + :title="$t('post_status.scope.direct')" + v-if="showDirect" + @click="changeVis('direct')"> + </i> + <i class="icon-lock" + :class="css.private" + :title="$t('post_status.scope.private')" + v-if="showPrivate" + v-on:click="changeVis('private')"> + </i> + <i class="icon-lock-open-alt" + :class="css.unlisted" + :title="$t('post_status.scope.unlisted')" + v-if="showUnlisted" + @click="changeVis('unlisted')"> + </i> + <i class="icon-globe" + :class="css.public" + :title="$t('post_status.scope.public')" + v-if="showPublic" + @click="changeVis('public')"> + </i> +</div> +</template> + +<script src="./scope_selector.js"></script> diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js index 1d5f75ed..a85ab674 100644 --- a/src/components/settings/settings.js +++ b/src/components/settings/settings.js @@ -70,13 +70,18 @@ const settings = { alwaysShowSubjectInputLocal: typeof user.alwaysShowSubjectInput === 'undefined' ? instance.alwaysShowSubjectInput : user.alwaysShowSubjectInput, - alwaysShowSubjectInputDefault: instance.alwaysShowSubjectInput, + alwaysShowSubjectInputDefault: this.$t('settings.values.' + instance.alwaysShowSubjectInput), scopeCopyLocal: typeof user.scopeCopy === 'undefined' ? instance.scopeCopy : user.scopeCopy, scopeCopyDefault: this.$t('settings.values.' + instance.scopeCopy), + minimalScopesModeLocal: typeof user.minimalScopesMode === 'undefined' + ? instance.minimalScopesMode + : user.minimalScopesMode, + minimalScopesModeDefault: this.$t('settings.values.' + instance.minimalScopesMode), + stopGifs: user.stopGifs, webPushNotificationsLocal: user.webPushNotifications, loopVideoSilentOnlyLocal: user.loopVideosSilentOnly, @@ -200,6 +205,9 @@ const settings = { postContentTypeLocal (value) { this.$store.dispatch('setOption', { name: 'postContentType', value }) }, + minimalScopesModeLocal (value) { + this.$store.dispatch('setOption', { name: 'minimalScopesMode', value }) + }, stopGifs (value) { this.$store.dispatch('setOption', { name: 'stopGifs', value }) }, diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue index 33dad549..6ee103c7 100644 --- a/src/components/settings/settings.vue +++ b/src/components/settings/settings.vue @@ -118,6 +118,12 @@ </label> </div> </li> + <li> + <input type="checkbox" id="minimalScopesMode" v-model="minimalScopesModeLocal"> + <label for="minimalScopesMode"> + {{$t('settings.minimal_scopes_mode')}} {{$t('settings.instance_default', { value: minimalScopesModeDefault })}} + </label> + </li> </ul> </div> diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue index e5046496..9abb8cef 100644 --- a/src/components/side_drawer/side_drawer.vue +++ b/src/components/side_drawer/side_drawer.vue @@ -21,11 +21,6 @@ {{ $t("login.login") }} </router-link> </li> - <li v-if="currentUser" @click="toggleDrawer"> - <router-link :to="{ name: 'notifications', params: { username: currentUser.screen_name } }"> - {{ $t("notifications.notifications") }} {{ unseenNotificationsCount > 0 ? `(${unseenNotificationsCount})` : '' }} - </router-link> - </li> <li v-if="currentUser" @click="toggleDrawer"> <router-link :to="{ name: 'dms', params: { username: currentUser.screen_name } }"> {{ $t("nav.dms") }} diff --git a/src/components/status/status.js b/src/components/status/status.js index 550fe76f..0295cd04 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -251,6 +251,12 @@ const Status = { }, maxThumbnails () { return this.$store.state.config.maxThumbnails + }, + contentHtml () { + if (!this.status.summary_html) { + return this.status.statusnet_html + } + return this.status.summary_html + '<br />' + this.status.statusnet_html } }, components: { diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 1f415534..690e8318 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -98,16 +98,16 @@ </div> <div class="status-content-wrapper" :class="{ 'tall-status': !showingLongSubject }" v-if="longSubject"> - <a class="tall-status-hider" :class="{ 'tall-status-hider_focused': isFocused }" v-if="!showingLongSubject" href="#" @click.prevent="showingLongSubject=true">Show more</a> - <div @click.prevent="linkClicked" class="status-content media-body" v-html="status.statusnet_html"></div> - <a v-if="showingLongSubject" href="#" class="status-unhider" @click.prevent="showingLongSubject=false">Show less</a> + <a class="tall-status-hider" :class="{ 'tall-status-hider_focused': isFocused }" v-if="!showingLongSubject" href="#" @click.prevent="showingLongSubject=true">{{$t("general.show_more")}}</a> + <div @click.prevent="linkClicked" class="status-content media-body" v-html="contentHtml"></div> + <a v-if="showingLongSubject" href="#" class="status-unhider" @click.prevent="showingLongSubject=false">{{$t("general.show_less")}}</a> </div> <div :class="{'tall-status': hideTallStatus}" class="status-content-wrapper" v-else> - <a class="tall-status-hider" :class="{ 'tall-status-hider_focused': isFocused }" v-if="hideTallStatus" href="#" @click.prevent="toggleShowMore">Show more</a> - <div @click.prevent="linkClicked" class="status-content media-body" v-html="status.statusnet_html" v-if="!hideSubjectStatus"></div> + <a class="tall-status-hider" :class="{ 'tall-status-hider_focused': isFocused }" v-if="hideTallStatus" href="#" @click.prevent="toggleShowMore">{{$t("general.show_more")}}</a> + <div @click.prevent="linkClicked" class="status-content media-body" v-html="contentHtml" v-if="!hideSubjectStatus"></div> <div @click.prevent="linkClicked" class="status-content media-body" v-html="status.summary_html" v-else></div> - <a v-if="hideSubjectStatus" href="#" class="cw-status-hider" @click.prevent="toggleShowMore">Show more</a> - <a v-if="showingMore" href="#" class="status-unhider" @click.prevent="toggleShowMore">Show less</a> + <a v-if="hideSubjectStatus" href="#" class="cw-status-hider" @click.prevent="toggleShowMore">{{$t("general.show_more")}}</a> + <a v-if="showingMore" href="#" class="status-unhider" @click.prevent="toggleShowMore">{{$t("general.show_less")}}</a> </div> <div v-if="status.attachments && (!hideSubjectStatus || showingLongSubject)" class="attachments media-body"> diff --git a/src/components/user_profile/user_profile.js b/src/components/user_profile/user_profile.js index 82df4510..1df06fe6 100644 --- a/src/components/user_profile/user_profile.js +++ b/src/components/user_profile/user_profile.js @@ -72,9 +72,6 @@ const UserProfile = { return this.$store.getters.findUser(this.fetchedUserId || routeParams.name || routeParams.id) }, user () { - if (this.timeline.statuses[0]) { - return this.timeline.statuses[0].user - } if (this.userInStore) { return this.userInStore } diff --git a/src/components/user_settings/user_settings.js b/src/components/user_settings/user_settings.js index 5cb23b97..b6a0479d 100644 --- a/src/components/user_settings/user_settings.js +++ b/src/components/user_settings/user_settings.js @@ -4,6 +4,7 @@ import get from 'lodash/get' import TabSwitcher from '../tab_switcher/tab_switcher.js' import ImageCropper from '../image_cropper/image_cropper.vue' import StyleSwitcher from '../style_switcher/style_switcher.vue' +import ScopeSelector from '../scope_selector/scope_selector.vue' import fileSizeFormatService from '../../services/file_size_format/file_size_format.js' import BlockCard from '../block_card/block_card.vue' import MuteCard from '../mute_card/mute_card.vue' @@ -67,6 +68,7 @@ const UserSettings = { }, components: { StyleSwitcher, + ScopeSelector, TabSwitcher, ImageCropper, BlockList, @@ -80,8 +82,8 @@ const UserSettings = { pleromaBackend () { return this.$store.state.instance.pleromaBackend }, - scopeOptionsEnabled () { - return this.$store.state.instance.scopeOptionsEnabled + minimalScopesMode () { + return this.$store.state.instance.minimalScopesMode }, vis () { return { diff --git a/src/components/user_settings/user_settings.vue b/src/components/user_settings/user_settings.vue index 52df143c..c08698dc 100644 --- a/src/components/user_settings/user_settings.vue +++ b/src/components/user_settings/user_settings.vue @@ -38,13 +38,13 @@ <input type="checkbox" v-model="newLocked" id="account-locked"> <label for="account-locked">{{$t('settings.lock_account_description')}}</label> </p> - <div v-if="scopeOptionsEnabled"> + <div> <label for="default-vis">{{$t('settings.default_vis')}}</label> <div id="default-vis" class="visibility-tray"> - <i v-on:click="changeVis('direct')" class="icon-mail-alt" :class="vis.direct" :title="$t('post_status.scope.direct')" ></i> - <i v-on:click="changeVis('private')" class="icon-lock" :class="vis.private" :title="$t('post_status.scope.private')"></i> - <i v-on:click="changeVis('unlisted')" class="icon-lock-open-alt" :class="vis.unlisted" :title="$t('post_status.scope.unlisted')"></i> - <i v-on:click="changeVis('public')" class="icon-globe" :class="vis.public" :title="$t('post_status.scope.public')"></i> + <scope-selector + :showAll="true" + :userDefault="newDefaultScope" + :onScopeChange="changeVis"/> </div> </div> <p> diff --git a/src/i18n/en.json b/src/i18n/en.json index c501c6a7..026546cc 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -20,7 +20,9 @@ "submit": "Submit", "more": "More", "generic_error": "An error occured", - "optional": "optional" + "optional": "optional", + "show_more": "Show more", + "show_less": "Show less" }, "image_cropper": { "crop_picture": "Crop picture", @@ -215,6 +217,7 @@ "saving_ok": "Settings saved", "security_tab": "Security", "scope_copy": "Copy scope when replying (DMs are always copied)", + "minimal_scopes_mode": "Minimize post scope selection options", "set_new_avatar": "Set new avatar", "set_new_profile_background": "Set new profile background", "set_new_profile_banner": "Set new profile banner", diff --git a/src/i18n/oc.json b/src/i18n/oc.json index ecc4df61..9214799d 100644 --- a/src/i18n/oc.json +++ b/src/i18n/oc.json @@ -25,6 +25,7 @@ "image_cropper": { "crop_picture": "Talhar l’imatge", "save": "Salvar", + "save_without_cropping": "Salvar sens talhada", "cancel": "Anullar" }, "login": { @@ -152,6 +153,7 @@ "general": "General", "hide_attachments_in_convo": "Rescondre las pèças juntas dins las conversacions", "hide_attachments_in_tl": "Rescondre las pèças juntas", + "hide_muted_posts": "Rescondre las publicacions del monde rescondut", "max_thumbnails": "Nombre maximum de vinhetas per publicacion", "hide_isp": "Amagar lo panèl especial instància", "preload_images": "Precargar los imatges", diff --git a/src/i18n/pl.json b/src/i18n/pl.json index 2e1d7488..8efce168 100644 --- a/src/i18n/pl.json +++ b/src/i18n/pl.json @@ -2,48 +2,114 @@ "chat": { "title": "Czat" }, + "features_panel": { + "chat": "Czat", + "gopher": "Gopher", + "media_proxy": "Proxy mediów", + "scope_options": "Ustawienia zakresu", + "text_limit": "Limit tekstu", + "title": "Funkcje", + "who_to_follow": "Propozycje obserwacji" + }, "finder": { "error_fetching_user": "Błąd przy pobieraniu profilu", "find_user": "Znajdź użytkownika" }, "general": { "apply": "Zastosuj", - "submit": "Wyślij" + "submit": "Wyślij", + "more": "Więcej", + "generic_error": "Wystąpił błąd", + "optional": "nieobowiązkowe" + }, + "image_cropper": { + "crop_picture": "Przytnij obrazek", + "save": "Zapisz", + "save_without_cropping": "Zapisz bez przycinania", + "cancel": "Anuluj" }, "login": { "login": "Zaloguj", + "description": "Zaloguj używając OAuth", "logout": "Wyloguj", "password": "Hasło", "placeholder": "n.p. lain", "register": "Zarejestruj", - "username": "Użytkownik" + "username": "Użytkownik", + "hint": "Zaloguj się, aby dołączyć do dyskusji" + }, + "media_modal": { + "previous": "Poprzednie", + "next": "Następne" }, "nav": { + "about": "O nas", + "back": "Wróć", "chat": "Lokalny czat", + "friend_requests": "Prośby o możliwość obserwacji", "mentions": "Wzmianki", + "dms": "Wiadomości prywatne", "public_tl": "Publiczna oś czasu", "timeline": "Oś czasu", - "twkn": "Cała znana sieć" + "twkn": "Cała znana sieć", + "user_search": "Wyszukiwanie użytkowników", + "who_to_follow": "Sugestie obserwacji", + "preferences": "Preferencje" }, "notifications": { - "favorited_you": "dodał twój status do ulubionych", + "broken_favorite": "Nieznany status, szukam go…", + "favorited_you": "dodał(-a) twój status do ulubionych", "followed_you": "obserwuje cię", + "load_older": "Załaduj starsze powiadomienia", "notifications": "Powiadomienia", "read": "Przeczytane!", - "repeated_you": "powtórzył twój status" + "repeated_you": "powtórzył(-a) twój status", + "no_more_notifications": "Nie masz więcej powiadomień" }, "post_status": { + "new_status": "Dodaj nowy status", + "account_not_locked_warning": "Twoje konto nie jest {0}. Każdy może cię zaobserwować aby zobaczyć wpisy tylko dla obserwujących.", + "account_not_locked_warning_link": "zablokowane", + "attachments_sensitive": "Oznacz załączniki jako wrażliwe", + "content_type": { + "text/plain": "Czysty tekst", + "text/html": "HTML", + "text/markdown": "Markdown" + }, + "content_warning": "Temat (nieobowiązkowy)", "default": "Właśnie wróciłem z kościoła", - "posting": "Wysyłanie" + "direct_warning": "Ten wpis zobaczą tylko osoby, o których wspomniałeś(-aś).", + "posting": "Wysyłanie", + "scope": { + "direct": "Bezpośredni – Tylko dla wspomnianych użytkowników", + "private": "Tylko dla obserwujących – Umieść dla osób, które cię obserwują", + "public": "Publiczny – Umieść na publicznych osiach czasu", + "unlisted": "Niewidoczny – Nie umieszczaj na publicznych osiach czasu" + } }, "registration": { "bio": "Bio", - "email": "Email", + "email": "E-mail", "fullname": "Wyświetlana nazwa profilu", "password_confirm": "Potwierdzenie hasła", - "registration": "Rejestracja" + "registration": "Rejestracja", + "token": "Token zaproszenia", + "captcha": "CAPTCHA", + "new_captcha": "Naciśnij na obrazek, aby dostać nowy kod captcha", + "username_placeholder": "np. lain", + "fullname_placeholder": "np. Lain Iwakura", + "bio_placeholder": "e.g.\nCześć, jestem Lain.\nJestem dziewczynką z anime żyjącą na peryferiach Japonii. Możesz znać mnie z Wired.", + "validations": { + "username_required": "nie może być pusta", + "fullname_required": "nie może być pusta", + "email_required": "nie może być pusty", + "password_required": "nie może być puste", + "password_confirmation_required": "nie może być puste", + "password_confirmation_match": "musi być takie jak hasło" + } }, "settings": { + "app_name": "Nazwa aplikacji", "attachmentRadius": "Załączniki", "attachments": "Załączniki", "autoload": "Włącz automatyczne ładowanie po przewinięciu do końca strony", @@ -52,6 +118,7 @@ "avatarRadius": "Awatary", "background": "Tło", "bio": "Bio", + "blocks_tab": "Bloki", "btnRadius": "Przyciski", "cBlue": "Niebieski (odpowiedz, obserwuj)", "cGreen": "Zielony (powtórzenia)", @@ -59,15 +126,21 @@ "cRed": "Czerwony (anuluj)", "change_password": "Zmień hasło", "change_password_error": "Podczas zmiany hasła wystąpił problem.", - "changed_password": "Hasło zmienione poprawnie!", + "changed_password": "Pomyślnie zmieniono hasło!", + "collapse_subject": "Zwijaj posty z tematami", + "composing": "Pisanie", "confirm_new_password": "Potwierdź nowe hasło", "current_avatar": "Twój obecny awatar", "current_password": "Obecne hasło", "current_profile_banner": "Twój obecny banner profilu", + "data_import_export_tab": "Import/eksport danych", + "default_vis": "Domyślny zakres widoczności", "delete_account": "Usuń konto", "delete_account_description": "Trwale usuń konto i wszystkie posty.", "delete_account_error": "Wystąpił problem z usuwaniem twojego konta. Jeżeli problem powtarza się, poinformuj administratora swojej instancji.", "delete_account_instructions": "Wprowadź swoje hasło w poniższe pole aby potwierdzić usunięcie konta.", + "avatar_size_instruction": "Zalecany minimalny rozmiar awatarów to 150x150 pikseli.", + "export_theme": "Zapisz motyw", "filtering": "Filtrowanie", "filtering_explanation": "Wszystkie statusy zawierające te słowa będą wyciszone. Jedno słowo na linijkę.", "follow_export": "Eksport obserwowanych", @@ -77,14 +150,49 @@ "follow_import_error": "Błąd przy importowaniu obserwowanych", "follows_imported": "Obserwowani zaimportowani! Przetwarzanie może trochę potrwać.", "foreground": "Pierwszy plan", - "hide_attachments_in_convo": "Ukryj załączniki w rozmowach", - "hide_attachments_in_tl": "Ukryj załączniki w osi czasu", + "general": "Ogólne", + "hide_attachments_in_convo": "Ukrywaj załączniki w rozmowach", + "hide_attachments_in_tl": "Ukrywaj załączniki w osi czasu", + "hide_muted_posts": "Ukrywaj wpisy wyciszonych użytkowników", + "max_thumbnails": "Maksymalna liczba miniatur w poście", + "hide_isp": "Ukryj panel informacji o instancji", + "preload_images": "Ładuj wstępnie obrazy", + "use_one_click_nsfw": "Otwieraj załączniki NSFW jednym kliknięciem", + "hide_post_stats": "Ukrywaj statysyki postów (np. liczbę polubień)", + "hide_user_stats": "Ukrywaj statysyki użytkowników (np. liczbę obserwujących)", + "hide_filtered_statuses": "Ukrywaj filtrowane statusy", "import_followers_from_a_csv_file": "Importuj obserwowanych z pliku CSV", + "import_theme": "Załaduj motyw", "inputRadius": "Pola tekstowe", + "checkboxRadius": "Pola wyboru", + "instance_default": "(domyślny: {value})", + "instance_default_simple": "(domyślny)", + "interface": "Interfejs", + "interfaceLanguage": "Język interfejsu", + "invalid_theme_imported": "Wybrany plik nie jest obsługiwanym motywem Pleromy. Nie dokonano zmian w twoim motywie.", + "limited_availability": "Niedostępne w twojej przeglądarce", "links": "Łącza", + "lock_account_description": "Ogranicz swoje konto dla zatwierdzonych obserwowanych", + "loop_video": "Zapętlaj filmy", + "loop_video_silent_only": "Zapętlaj tylko filmy bez dźwięku (np. mastodonowe „gify”)", + "mutes_tab": "Wyciszenia", + "play_videos_in_modal": "Odtwarzaj filmy bezpośrednio w przeglądarce mediów", + "use_contain_fit": "Nie przycinaj załączników na miniaturach", "name": "Imię", "name_bio": "Imię i bio", "new_password": "Nowe hasło", + "notification_visibility": "Rodzaje powiadomień do wyświetlania", + "notification_visibility_follows": "Obserwacje", + "notification_visibility_likes": "Ulubione", + "notification_visibility_mentions": "Wzmianki", + "notification_visibility_repeats": "Powtórzenia", + "no_rich_text_description": "Usuwaj formatowanie ze wszystkich postów", + "no_blocks": "Bez blokad", + "no_mutes": "Bez wyciszeń", + "hide_follows_description": "Nie pokazuj kogo obserwuję", + "hide_followers_description": "Nie pokazuj kto mnie obserwuje", + "show_admin_badge": "Pokazuj odznakę Administrator na moim profilu", + "show_moderator_badge": "Pokazuj odznakę Moderator na moim profilu", "nsfw_clickthrough": "Włącz domyślne ukrywanie załączników o treści nieprzyzwoitej (NSFW)", "oauth_tokens": "Tokeny OAuth", "token": "Token", @@ -92,47 +200,235 @@ "valid_until": "Ważne do", "revoke_token": "Odwołać", "panelRadius": "Panele", + "pause_on_unfocused": "Wstrzymuj strumieniowanie kiedy karta nie jest aktywna", "presets": "Gotowe motywy", "profile_background": "Tło profilu", "profile_banner": "Banner profilu", + "profile_tab": "Profil", "radii_help": "Ustaw zaokrąglenie krawędzi interfejsu (w pikselach)", + "replies_in_timeline": "Odpowiedzi na osi czasu", "reply_link_preview": "Włącz dymek z podglądem postu po najechaniu na znak odpowiedzi", + "reply_visibility_all": "Pokazuj wszystkie odpowiedzi", + "reply_visibility_following": "Pokazuj tylko odpowiedzi skierowane do mnie i osób które obserwuję", + "reply_visibility_self": "Pokazuj tylko odpowiedzi skierowane do mnie", + "saving_err": "Nie udało się zapisać ustawień", + "saving_ok": "Zapisano ustawienia", + "security_tab": "Bezpieczeństwo", + "scope_copy": "Kopiuj zakres podczas odpowiadania (DM-y zawsze są kopiowane)", "set_new_avatar": "Ustaw nowy awatar", "set_new_profile_background": "Ustaw nowe tło profilu", "set_new_profile_banner": "Ustaw nowy banner profilu", "settings": "Ustawienia", + "subject_input_always_show": "Zawsze pokazuj pole tematu", + "subject_line_behavior": "Kopiuj temat podczas odpowiedzi", + "subject_line_email": "Jak w mailach – „re: temat”", + "subject_line_mastodon": "Jak na Mastodonie – po prostu kopiuj", + "subject_line_noop": "Nie kopiuj", + "post_status_content_type": "Post status content type", "stop_gifs": "Odtwarzaj GIFy po najechaniu kursorem", - "streaming": "Włącz automatycznie strumieniowanie nowych postów gdy na początku strony", + "streaming": "Włącz automatycznie strumieniowanie nowych postów gdy jesteś na początku strony", "text": "Tekst", "theme": "Motyw", "theme_help": "Użyj kolorów w notacji szesnastkowej (#rrggbb), by stworzyć swój motyw.", + "theme_help_v2_1": "Możesz też zastąpić kolory i widoczność poszczególnych komponentów przełączając pola wyboru, użyj „Wyczyść wszystko” aby usunąć wszystkie zastąpienia.", + "theme_help_v2_2": "Ikony pod niektórych wpisami są wskaźnikami kontrastu pomiędzy tłem a tekstem, po najechaniu na nie otrzymasz szczegółowe informacje. Zapamiętaj, że jeżeli używasz przezroczystości, wskaźniki pokazują najgorszy możliwy przypadek.", "tooltipRadius": "Etykiety/alerty", - "user_settings": "Ustawienia użytkownika" + "upload_a_photo": "Wyślij zdjęcie", + "user_settings": "Ustawienia użytkownika", + "values": { + "false": "nie", + "true": "tak" + }, + "notifications": "Powiadomienia", + "enable_web_push_notifications": "Włącz powiadomienia push", + "style": { + "switcher": { + "keep_color": "Zachowaj kolory", + "keep_shadows": "Zachowaj cienie", + "keep_opacity": "Zachowaj widoczność", + "keep_roundness": "Zachowaj zaokrąglenie", + "keep_fonts": "Zachowaj czcionki", + "save_load_hint": "Opcje „zachowaj” pozwalają na pozostanie przy obecnych opcjach po wybraniu lub załadowaniu motywu, jak i przechowywanie ich podczas eksportowania motywu. Jeżeli wszystkie są odznaczone, eksportowanie motywu spowoduje zapisanie wszystkiego.", + "reset": "Wyzeruj", + "clear_all": "Wyczyść wszystko", + "clear_opacity": "Wyczyść widoczność" + }, + "common": { + "color": "Kolor", + "opacity": "Widoczność", + "contrast": { + "hint": "Współczynnik kontrastu wynosi {ratio}, {level} {context}", + "level": { + "aa": "spełnia wymogi poziomu AA (minimalne)", + "aaa": "spełnia wymogi poziomu AAA (zalecane)", + "bad": "nie spełnia żadnych wymogów dostępności" + }, + "context": { + "18pt": "dla dużego tekstu (18pt+)", + "text": "dla tekstu" + } + } + }, + "common_colors": { + "_tab_label": "Ogólne", + "main": "Ogólne kolory", + "foreground_hint": "Zajrzyj do karty „Zaawansowane”, aby uzyskać dokładniejszą kontrolę", + "rgbo": "Ikony, wyróżnienia, odznaki" + }, + "advanced_colors": { + "_tab_label": "Zaawansowane", + "alert": "Tło alertu", + "alert_error": "Błąd", + "badge": "Tło odznaki", + "badge_notification": "Powiadomienie", + "panel_header": "Nagłówek panelu", + "top_bar": "Górny pasek", + "borders": "Granice", + "buttons": "Przyciski", + "inputs": "Pola wejścia", + "faint_text": "Zanikający tekst" + }, + "radii": { + "_tab_label": "Zaokrąglenie" + }, + "shadows": { + "_tab_label": "Cień i podświetlenie", + "component": "Komponent", + "override": "Zastąp", + "shadow_id": "Cień #{value}", + "blur": "Rozmycie", + "spread": "Szerokość", + "inset": "Inset", + "hint": "Możesz też używać --zmiennych jako kolorów, aby wykorzystać zmienne CSS3. Pamiętaj, że ustawienie widoczności nie będzie wtedy działać.", + "filter_hint": { + "always_drop_shadow": "Ostrzeżenie, ten cień zawsze używa {0} jeżeli to obsługiwane przez przeglądarkę.", + "drop_shadow_syntax": "{0} nie obsługuje parametru {1} i słowa kluczowego {2}.", + "avatar_inset": "Pamiętaj że użycie jednocześnie cieni inset i nie inset na awatarach może daćnieoczekiwane wyniki z przezroczystymi awatarami.", + "spread_zero": "Cienie o ujemnej szerokości będą widoczne tak, jakby wynosiła ona zero", + "inset_classic": "Cienie inset będą używały {0}" + }, + "components": { + "panel": "Panel", + "panelHeader": "Nagłówek panelu", + "topBar": "Górny pasek", + "avatar": "Awatar użytkownika (w widoku profilu)", + "avatarStatus": "Awatar użytkownika (w widoku wpisu)", + "popup": "Wyskakujące okna i podpowiedzi", + "button": "Przycisk", + "buttonHover": "Przycisk (po najechaniu)", + "buttonPressed": "Przycisk (naciśnięty)", + "buttonPressedHover": "Przycisk(naciśnięty+najechany)", + "input": "Pole wejścia" + } + }, + "fonts": { + "_tab_label": "Czcionki", + "help": "Wybierz czcionkę używaną przez elementy UI. Jeżeli wybierzesz niestandardową, musisz wpisać dokładnie tę nazwę, pod którą pojawia się w systemie.", + "components": { + "interface": "Interfejs", + "input": "Pola wejścia", + "post": "Tekst postu", + "postCode": "Tekst o stałej szerokości znaków w sformatowanym poście" + }, + "family": "Nazwa czcionki", + "size": "Rozmiar (w pikselach)", + "weight": "Grubość", + "custom": "Niestandardowa" + }, + "preview": { + "header": "Podgląd", + "content": "Zawartość", + "error": "Przykładowy błąd", + "button": "Przycisk", + "text": "Trochę więcej {0} i {1}", + "mono": "treści", + "input": "Właśnie wróciłem z kościoła", + "faint_link": "pomocny podręcznik", + "fine_print": "Przeczytaj nasz {0}, aby nie nauczyć się niczego przydatnego!", + "header_faint": "W porządku", + "checkbox": "Przeleciałem przez zasady użytkowania", + "link": "i fajny mały odnośnik" + } + }, + "version": { + "title": "Wersja", + "backend_version": "Wersja back-endu", + "frontend_version": "Wersja front-endu" + } }, "timeline": { "collapse": "Zwiń", "conversation": "Rozmowa", "error_fetching": "Błąd pobierania", "load_older": "Załaduj starsze statusy", + "no_retweet_hint": "Wpis oznaczony jako tylko dla obserwujących lub bezpośredni nie może zostać powtórzony", "repeated": "powtórzono", "show_new": "Pokaż nowe", - "up_to_date": "Na bieżąco" + "up_to_date": "Na bieżąco", + "no_more_statuses": "Brak kolejnych statusów", + "no_statuses": "Brak statusów" + }, + "status": { + "reply_to": "Odpowiedź dla", + "replies_list": "Odpowiedzi:" }, "user_card": { + "approve": "Przyjmij", "block": "Zablokuj", "blocked": "Zablokowany!", + "deny": "Odrzuć", + "favorites": "Ulubione", "follow": "Obserwuj", + "follow_sent": "Wysłano prośbę!", + "follow_progress": "Wysyłam prośbę…", + "follow_again": "Wysłać prośbę ponownie?", + "follow_unfollow": "Przestań obserwować", "followees": "Obserwowani", "followers": "Obserwujący", "following": "Obserwowany!", "follows_you": "Obserwuje cię!", + "its_you": "To ty!", + "media": "Media", "mute": "Wycisz", - "muted": "Wyciszony", + "muted": "Wyciszony(-a)", "per_day": "dziennie", "remote_follow": "Zdalna obserwacja", - "statuses": "Statusy" + "statuses": "Statusy", + "unblock": "Odblokuj", + "unblock_progress": "Odblokowuję…", + "block_progress": "Blokuję…", + "unmute": "Cofnij wyciszenie", + "unmute_progress": "Cofam wyciszenie…", + "mute_progress": "Wyciszam…" }, "user_profile": { - "timeline_title": "Oś czasu użytkownika" + "timeline_title": "Oś czasu użytkownika", + "profile_does_not_exist": "Przepraszamy, ten profil nie istnieje.", + "profile_loading_error": "Przepraszamy, wystąpił błąd podczas ładowania tego profilu." + }, + "who_to_follow": { + "more": "Więcej", + "who_to_follow": "Propozycje obserwacji" + }, + "tool_tip": { + "media_upload": "Wyślij media", + "repeat": "Powtórz", + "reply": "Odpowiedz", + "favorite": "Dodaj do ulubionych", + "user_settings": "Ustawienia użytkownika" + }, + "upload":{ + "error": { + "base": "Wysyłanie nie powiodło się.", + "file_too_big": "Zbyt duży plik [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", + "default": "Spróbuj ponownie później" + }, + "file_size_units": { + "B": "B", + "KiB": "KiB", + "MiB": "MiB", + "GiB": "GiB", + "TiB": "TiB" + } } -} +} \ No newline at end of file diff --git a/src/i18n/ru.json b/src/i18n/ru.json index 6799cc96..89aa43f4 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -111,6 +111,8 @@ "import_theme": "Загрузить Тему", "inputRadius": "Поля ввода", "checkboxRadius": "Чекбоксы", + "instance_default": "(по умолчанию: {value})", + "instance_default_simple": "(по умолчанию)", "interface": "Интерфейс", "interfaceLanguage": "Язык интерфейса", "limited_availability": "Не доступно в вашем браузере", @@ -149,7 +151,11 @@ "reply_visibility_all": "Показывать все ответы", "reply_visibility_following": "Показывать только ответы мне и тех на кого я подписан", "reply_visibility_self": "Показывать только ответы мне", + "saving_err": "Не удалось сохранить настройки", + "saving_ok": "Сохранено", "security_tab": "Безопасность", + "scope_copy": "Копировать видимость поста при ответе (всегда включено для Личных Сообщений)", + "minimal_scopes_mode": "Минимизировать набор опций видимости поста", "set_new_avatar": "Загрузить новый аватар", "set_new_profile_background": "Загрузить новый фон профиля", "set_new_profile_banner": "Загрузить новый баннер профиля", @@ -164,6 +170,10 @@ "theme_help_v2_2": "Под некоторыми полями ввода это идикаторы контрастности, наведите на них мышью чтобы узнать больше. Приспользовании прозрачности контраст расчитывается для наихудшего варианта.", "tooltipRadius": "Всплывающие подсказки/уведомления", "user_settings": "Настройки пользователя", + "values": { + "false": "нет", + "true": "да" + }, "style": { "switcher": { "keep_color": "Оставить цвета", diff --git a/src/modules/config.js b/src/modules/config.js index c5491c01..1666a2c5 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -33,7 +33,8 @@ const defaultState = { scopeCopy: undefined, // instance default subjectLineBehavior: undefined, // instance default alwaysShowSubjectInput: undefined, // instance default - postContentType: undefined // instance default + postContentType: undefined, // instance default + minimalScopesMode: undefined // instance default } const config = { diff --git a/src/modules/instance.js b/src/modules/instance.js index f778ac4d..3a559ba0 100644 --- a/src/modules/instance.js +++ b/src/modules/instance.js @@ -15,7 +15,6 @@ const defaultState = { redirectRootNoLogin: '/main/all', redirectRootLogin: '/main/friends', showInstanceSpecificPanel: false, - scopeOptionsEnabled: true, formattingOptionsEnabled: false, alwaysShowSubjectInput: true, hideMutedPosts: false, @@ -32,6 +31,7 @@ const defaultState = { vapidPublicKey: undefined, noAttachmentLinks: false, showFeaturesPanel: true, + minimalScopesMode: false, // Nasty stuff pleromaBackend: true, diff --git a/src/modules/interface.js b/src/modules/interface.js index 956c9cb3..71554787 100644 --- a/src/modules/interface.js +++ b/src/modules/interface.js @@ -11,7 +11,8 @@ const defaultState = { window.CSS.supports('filter', 'drop-shadow(0 0)') || window.CSS.supports('-webkit-filter', 'drop-shadow(0 0)') ) - } + }, + mobileLayout: false } const interfaceMod = { @@ -31,6 +32,9 @@ const interfaceMod = { }, setNotificationPermission (state, permission) { state.notificationPermission = permission + }, + setMobileLayout (state, value) { + state.mobileLayout = value } }, actions: { @@ -42,6 +46,10 @@ const interfaceMod = { }, setNotificationPermission ({ commit }, permission) { commit('setNotificationPermission', permission) + }, + setMobileLayout ({ commit }, value) { + console.log('setMobileLayout called') + commit('setMobileLayout', value) } } } diff --git a/src/modules/statuses.js b/src/modules/statuses.js index 944b45c1..8e0203e3 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -123,7 +123,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us const maxNew = statuses.length > 0 ? maxBy(statuses, 'id').id : 0 const minNew = statuses.length > 0 ? minBy(statuses, 'id').id : 0 - const newer = timeline && maxNew > timelineObject.maxId && statuses.length > 0 + const newer = timeline && (maxNew > timelineObject.maxId || timelineObject.maxId === 0) && statuses.length > 0 const older = timeline && (minNew < timelineObject.minId || timelineObject.minId === 0) && statuses.length > 0 if (!noIdUpdate && newer) { @@ -363,6 +363,15 @@ export const mutations = { }, setRetweeted (state, { status, value }) { const newStatus = state.allStatusesObject[status.id] + + if (newStatus.repeated !== value) { + if (value) { + newStatus.repeat_num++ + } else { + newStatus.repeat_num-- + } + } + newStatus.repeated = value }, setDeleted (state, { status }) { diff --git a/src/services/user_profile_link_generator/user_profile_link_generator.js b/src/services/user_profile_link_generator/user_profile_link_generator.js index a214ca48..16f1531d 100644 --- a/src/services/user_profile_link_generator/user_profile_link_generator.js +++ b/src/services/user_profile_link_generator/user_profile_link_generator.js @@ -1,7 +1,7 @@ import { includes } from 'lodash' const generateProfileLink = (id, screenName, restrictedNicknames) => { - const complicated = (isExternal(screenName) || includes(restrictedNicknames, screenName)) + const complicated = !screenName || (isExternal(screenName) || includes(restrictedNicknames, screenName)) return { name: (complicated ? 'external-user-profile' : 'user-profile'), params: (complicated ? { id } : { name: screenName }) diff --git a/src/services/window_utils/window_utils.js b/src/services/window_utils/window_utils.js new file mode 100644 index 00000000..faff6cb9 --- /dev/null +++ b/src/services/window_utils/window_utils.js @@ -0,0 +1,5 @@ + +export const windowWidth = () => + window.innerWidth || + document.documentElement.clientWidth || + document.body.clientWidth diff --git a/static/config.json b/static/config.json index 533a5b08..04cbb97b 100644 --- a/static/config.json +++ b/static/config.json @@ -8,7 +8,6 @@ "redirectRootLogin": "/main/friends", "chatDisabled": false, "showInstanceSpecificPanel": false, - "scopeOptionsEnabled": false, "formattingOptionsEnabled": false, "collapseMessageWithSubject": false, "scopeCopy": true, @@ -21,5 +20,6 @@ "webPushNotifications": false, "noAttachmentLinks": false, "nsfwCensorImage": "", - "showFeaturesPanel": true + "showFeaturesPanel": true, + "minimalScopesMode": false } diff --git a/static/font/LICENSE.txt b/static/font/LICENSE.txt old mode 100755 new mode 100644 diff --git a/static/font/README.txt b/static/font/README.txt old mode 100755 new mode 100644 diff --git a/static/font/config.json b/static/font/config.json index 8102330b..380912c9 100755 --- a/static/font/config.json +++ b/static/font/config.json @@ -251,6 +251,12 @@ "css": "smile", "code": 61720, "src": "fontawesome" + }, + { + "uid": "671f29fa10dda08074a4c6a341bb4f39", + "css": "bell-alt", + "code": 61683, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/static/font/css/fontello-codes.css b/static/font/css/fontello-codes.css index 594a17a5..b19319a7 100755 --- a/static/font/css/fontello-codes.css +++ b/static/font/css/fontello-codes.css @@ -32,6 +32,7 @@ .icon-menu:before { content: '\f0c9'; } /* '' */ .icon-mail-alt:before { content: '\f0e0'; } /* '' */ .icon-comment-empty:before { content: '\f0e5'; } /* '' */ +.icon-bell-alt:before { content: '\f0f3'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ .icon-smile:before { content: '\f118'; } /* '' */ diff --git a/static/font/css/fontello-embedded.css b/static/font/css/fontello-embedded.css index 7c9ca640..16b44010 100755 --- a/static/font/css/fontello-embedded.css +++ b/static/font/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?44981686'); - src: url('../font/fontello.eot?44981686#iefix') format('embedded-opentype'), - url('../font/fontello.svg?44981686#fontello') format('svg'); + src: url('../font/fontello.eot?72267163'); + src: url('../font/fontello.eot?72267163#iefix') format('embedded-opentype'), + url('../font/fontello.svg?72267163#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?44981686#fontello') format('svg'); + src: url('../font/fontello.svg?72267163#fontello') format('svg'); } } */ @@ -85,6 +85,7 @@ .icon-menu:before { content: '\f0c9'; } /* '' */ .icon-mail-alt:before { content: '\f0e0'; } /* '' */ .icon-comment-empty:before { content: '\f0e5'; } /* '' */ +.icon-bell-alt:before { content: '\f0f3'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ .icon-smile:before { content: '\f118'; } /* '' */ diff --git a/static/font/css/fontello-ie7-codes.css b/static/font/css/fontello-ie7-codes.css index 86ca4e4b..e6391508 100755 --- a/static/font/css/fontello-ie7-codes.css +++ b/static/font/css/fontello-ie7-codes.css @@ -32,6 +32,7 @@ .icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-comment-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-bell-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-smile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/static/font/css/fontello-ie7.css b/static/font/css/fontello-ie7.css index 125f0c31..0cd48ac0 100755 --- a/static/font/css/fontello-ie7.css +++ b/static/font/css/fontello-ie7.css @@ -43,6 +43,7 @@ .icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-comment-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-bell-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-smile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/static/font/css/fontello.css b/static/font/css/fontello.css index 93a525dd..a580a9d2 100755 --- a/static/font/css/fontello.css +++ b/static/font/css/fontello.css @@ -1,11 +1,11 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?67796422'); - src: url('../font/fontello.eot?67796422#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?67796422') format('woff2'), - url('../font/fontello.woff?67796422') format('woff'), - url('../font/fontello.ttf?67796422') format('truetype'), - url('../font/fontello.svg?67796422#fontello') format('svg'); + src: url('../font/fontello.eot?23060348'); + src: url('../font/fontello.eot?23060348#iefix') format('embedded-opentype'), + url('../font/fontello.woff2?23060348') format('woff2'), + url('../font/fontello.woff?23060348') format('woff'), + url('../font/fontello.ttf?23060348') format('truetype'), + url('../font/fontello.svg?23060348#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?67796422#fontello') format('svg'); + src: url('../font/fontello.svg?23060348#fontello') format('svg'); } } */ @@ -88,6 +88,7 @@ .icon-menu:before { content: '\f0c9'; } /* '' */ .icon-mail-alt:before { content: '\f0e0'; } /* '' */ .icon-comment-empty:before { content: '\f0e5'; } /* '' */ +.icon-bell-alt:before { content: '\f0f3'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ .icon-smile:before { content: '\f118'; } /* '' */ diff --git a/static/font/demo.html b/static/font/demo.html index 89869d27..54d0aad6 100755 --- a/static/font/demo.html +++ b/static/font/demo.html @@ -229,11 +229,11 @@ body { } @font-face { font-family: 'fontello'; - src: url('./font/fontello.eot?37046490'); - src: url('./font/fontello.eot?37046490#iefix') format('embedded-opentype'), - url('./font/fontello.woff?37046490') format('woff'), - url('./font/fontello.ttf?37046490') format('truetype'), - url('./font/fontello.svg?37046490#fontello') format('svg'); + src: url('./font/fontello.eot?40419282'); + src: url('./font/fontello.eot?40419282#iefix') format('embedded-opentype'), + url('./font/fontello.woff?40419282') format('woff'), + url('./font/fontello.ttf?40419282') format('truetype'), + url('./font/fontello.svg?40419282#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -347,17 +347,18 @@ body { </div> <div class="row"> <div class="the-icons span3" title="Code: 0xf0e5"><i class="demo-icon icon-comment-empty"></i> <span class="i-name">icon-comment-empty</span><span class="i-code">0xf0e5</span></div> + <div class="the-icons span3" title="Code: 0xf0f3"><i class="demo-icon icon-bell-alt"></i> <span class="i-name">icon-bell-alt</span><span class="i-code">0xf0f3</span></div> <div class="the-icons span3" title="Code: 0xf0fe"><i class="demo-icon icon-plus-squared"></i> <span class="i-name">icon-plus-squared</span><span class="i-code">0xf0fe</span></div> <div class="the-icons span3" title="Code: 0xf112"><i class="demo-icon icon-reply"></i> <span class="i-name">icon-reply</span><span class="i-code">0xf112</span></div> - <div class="the-icons span3" title="Code: 0xf118"><i class="demo-icon icon-smile"></i> <span class="i-name">icon-smile</span><span class="i-code">0xf118</span></div> </div> <div class="row"> + <div class="the-icons span3" title="Code: 0xf118"><i class="demo-icon icon-smile"></i> <span class="i-name">icon-smile</span><span class="i-code">0xf118</span></div> <div class="the-icons span3" title="Code: 0xf13e"><i class="demo-icon icon-lock-open-alt"></i> <span class="i-name">icon-lock-open-alt</span><span class="i-code">0xf13e</span></div> <div class="the-icons span3" title="Code: 0xf144"><i class="demo-icon icon-play-circled"></i> <span class="i-name">icon-play-circled</span><span class="i-code">0xf144</span></div> <div class="the-icons span3" title="Code: 0xf164"><i class="demo-icon icon-thumbs-up-alt"></i> <span class="i-name">icon-thumbs-up-alt</span><span class="i-code">0xf164</span></div> - <div class="the-icons span3" title="Code: 0xf1e5"><i class="demo-icon icon-binoculars"></i> <span class="i-name">icon-binoculars</span><span class="i-code">0xf1e5</span></div> </div> <div class="row"> + <div class="the-icons span3" title="Code: 0xf1e5"><i class="demo-icon icon-binoculars"></i> <span class="i-name">icon-binoculars</span><span class="i-code">0xf1e5</span></div> <div class="the-icons span3" title="Code: 0xf234"><i class="demo-icon icon-user-plus"></i> <span class="i-name">icon-user-plus</span><span class="i-code">0xf234</span></div> </div> </div> diff --git a/static/font/font/fontello.eot b/static/font/font/fontello.eot index b7d4832772f373d883174af526dca1f724381a07..9600cdc8509f1e9be3ee642b96255e735d2df8d3 100755 GIT binary patch delta 801 zcmZ`$O-vI(7=1IlT}oS`Vq1$4DE*;IK@dudKuk?cfMApZk^%;)P>RypRjOiQ0tXNH z6AJFdNH83T@!+9JPa3?D7!pl981zKEkn~{8D(V3d{L1Q0XY%sC_x-$?%q*wa!UHDR z+kx@6S;;SMt(vB1gZCzG0jv{1_h39MAF1D*BK;H)D+aG8?b6QnH=t#J>h@td8oxU` z(?fa^Fv`*Jm`wS-q(j8|Xzb>2(cGDRfbK0&+dmQs4_Qi6j{tuy)%_!s$XgMmTu9nA z5>JlLUF+Uiqr`nmJc}g;!#{U)FM&WK=}<g8F0;vkC!}Xc+b@UXk=OHO<)qU9e<LTx zk~fB)*8@$Hbm{l<)rh=)!n*{ts>%ZEWAn-uiv~);Xd280VK=HGHqd-2M0}!x19pmd zwkTVd^{FX!Mg6F*s~gHg?qnOv3x3o|!_?KaySwqvtr&!}tTNLtn3#d<bLY{j%p}DW z8{Gg@0$D)a)&TPSQm6qgVw(oIiH~bQ1@TD@@DLAaz#-yw4LA&Z^=UvQkQtEjJrh@i zWuX@)`0zMrJXpY)1jfNzJJRKyp`Zs$5+o+XbxeRHV3giM0w0AWncBd)7=kDki0#E4 zX&1G-{@2bSa`9YlN@_0-x*;(s0Vc3SW6oGekS!A6qR6}cxN`ASPfyTL<|uSJ_ZQ~r zioH6Y(@_!dIV@&tpw6w7TdO#GrSw@n%8b>OiB#9<OQub$Tj%$*e1}oU<{tIKiu=c3 zR?-at=2fx{ca*sQqRm`lo-(glE?M4Lt=6Rjw{11MAMVY3_8SH2+dS6AS(S3S=~uq~ ULL?Te4#$#8M{{pxvDt3=4dbl4dH?_b delta 575 zcmZutUr19?82_E!yPG-xVRxo5+Wb?t86`5eawaOG;FE+-DxxlPZV%pe(;+KDpEY96 zlLSSwC-Z#>JxC(#MKI_k=qV%|j6k`HMc_93uJ^U`@#A-X-*>+6obyXBvuu({*&)C& zl#+a6(cQnA>U}l;0$?Kmf+1DWDnjGmNUsB8O=vdmlFmveKtQCrYf_7-i>amiq+0-+ z7Exw2%GUs01>&;E)bq*d<12pw>nGrrCmL2J?DEPVz`IX%Uz8FTc0?=C=^)(_RpW`b zuY+elDA7xa^{H4$IsJHWophdbP*oBdo3C7>UZd`Ms;J@J56(u?PXNmoEjAP1tSo#6 z?zGdRceUxTmg{TV1P0&mG<(S2^8$->%3#zDRt4dFcZ0Z``elgtY0Rad59S;49eJ;w z)OYkfJ;&c!n)#Nc-N~qW?>t8FpWwB^7>$+qGoi%yELI*9t>w({!&vUjoS0;fN`Ov4 z6L3^(0?owrCO~!`^_aj_;sF!5Mm%8xt;9JKAcu~<Cg_TUbg?zFakH(=vD)u0KCbTm z4Vz#Xi0@f9jW(GVe17KPUjG8$_J`{)9m)gpS9_QJWnEL<ugfcR%5ce(>A7ta=-hB% Rl&1qlzSjL9!|pmO{sG(TnfU+! diff --git a/static/font/font/fontello.svg b/static/font/font/fontello.svg index 2c1ee1f4..9f788daa 100755 --- a/static/font/font/fontello.svg +++ b/static/font/font/fontello.svg @@ -72,6 +72,8 @@ <glyph glyph-name="comment-empty" unicode="" d="M500 643q-114 0-213-39t-157-105-59-142q0-62 40-119t113-98l48-28-15-53q-13-51-39-97 85 36 154 96l24 21 32-3q38-5 72-5 114 0 213 39t157 105 59 142-59 142-157 105-213 39z m500-286q0-97-67-179t-182-130-251-48q-39 0-81 4-110-97-257-135-27-8-63-12h-3q-8 0-15 6t-9 15v1q-2 2 0 6t1 6 2 5l4 5t4 5 4 5q4 5 17 19t20 22 17 22 18 28 15 33 15 42q-88 50-138 123t-51 157q0 97 67 179t182 130 251 48 251-48 182-130 67-179z" horiz-adv-x="1000" /> +<glyph glyph-name="bell-alt" unicode="" d="M509-89q0 8-9 8-33 0-57 24t-23 57q0 9-9 9t-9-9q0-41 29-70t69-28q9 0 9 9z m455 160q0-29-21-50t-50-21h-250q0-59-42-101t-101-42-101 42-42 101h-250q-29 0-50 21t-21 50q28 24 51 49t47 67 42 89 27 115 11 145q0 84 66 157t171 89q-5 10-5 21 0 23 16 38t38 16 38-16 16-38q0-11-5-21 106-16 171-89t66-157q0-78 11-145t28-115 41-89 48-67 50-49z" horiz-adv-x="1000" /> + <glyph glyph-name="plus-squared" unicode="" d="M714 321v72q0 14-10 25t-25 10h-179v179q0 15-11 25t-25 11h-71q-15 0-25-11t-11-25v-179h-178q-15 0-25-10t-11-25v-72q0-14 11-25t25-10h178v-179q0-14 11-25t25-11h71q15 0 25 11t11 25v179h179q14 0 25 10t10 25z m143 304v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" /> <glyph glyph-name="reply" unicode="" d="M1000 232q0-93-71-252-1-4-6-13t-7-17-7-12q-7-10-16-10-8 0-13 6t-5 14q0 5 1 15t2 13q3 38 3 69 0 56-10 101t-27 77-45 56-59 39-74 24-86 12-98 3h-125v-143q0-14-10-25t-26-11-25 11l-285 286q-11 10-11 25t11 25l285 286q11 10 25 10t26-10 10-25v-143h125q398 0 488-225 30-75 30-186z" horiz-adv-x="1000" /> diff --git a/static/font/font/fontello.ttf b/static/font/font/fontello.ttf index 8c337900b1c8c34988be2dee417e2bbb59921346..67943c64971c14f85e8758c6c9d8104e379c9d2b 100755 GIT binary patch delta 820 zcmZ`%Ur19?9RAL^cX!K8G~3o}Hs}6Xx>9sH6^R9ri9r%erbRV%&T?zFT%{1`Lk||E zllzw0OCUY;AnYm7hoA_-zz3<Gq!(ciJ=`)y%3Qy>daHZ*&iDI%f4+Op<vyKc+bNcE zj@<)TCxEWLcvwDO|6_vm3qbVr-AUS|?Cy7<^(xiv19CL}a5~jZdK}Qp(eSWL`C`%` zVqG*gI#4=uZa<(|0ctM~M#B9j+td@Fv6kwMgOt!NiBc{k?HY_HM`mt!W!EV2h!QVj ziN5g9tY#7LH<1p-!y_^qFPtNtB5l7Bjz^Yf%PUCF1N^<57*5{pe^n2(jMJe%%C{o& z`pN1ApiQ0LzQ|^kAdC8KU^EP7fv^{Oi3@1l1`%JV;DDVXo+-`LWqj(Cx}<(q*VPS0 zWlomcjf#gKc9H>g2KQDM{<)N1enC@3jgs=3?<gx=TV%++nd@>pJyq#tVTz4y04jm( zpzh`Y^8Z?r2VBIKJm4likq11)r}980aep2-LcE>_jso9&d4P_RyKr`kuky#_Y71B$ zrN!FxvS!mWc2jsG^uPcgo(1%W3OSR&ICxvfd_`v{P)U~%Bqqc)On@X{h;AW)4?&U) zXTZ4_f+!Y>?beQY7qz?o*Ulkw@ltL|YPSa5keHMJ6Ih}tXDlSh771`s<iS6#Ts+&| z9VjSwlsKISO0*hlwZ`Xkc>F$x$!PZ1xs_3qm$P?D+El4zOs@2zw?<bsY51^nrKoii zdLfhh(4UsvTYp*6HTYSz5@>j!yluE<F_sx8jBBRrrd6}qym0WorDpG^s7{}5)C<&i fzB$O5SD9=6wNKX@iN%hEV@c(COHX>I#cucw3pBvF delta 547 zcmZutOGq106g@8=YmKo|Cw?H9X#6FXHb_ipBGQVu7KxFxNF8EK5Jv|MB`pQlEm|W_ z?ZVbY7uNl3T!<jJ5ft1gu0)D~Ahe93mOwRn$JzE>4(FZwd7o3ru&<w4#x?sMVEq6h zF-ermV?#%zHvm&*>}|?fa$EcZgiKU-j>!q>(_$t{x(Tqz32{cId?gUPCN51(yc?U& z*B1cuCh*LYjEkc-VfioMJEyuoNr?x0CNt1!C*72kQt2=Ak=s*Byr9I!#8gcD_v2R^ z=^W{ZB&KCHYh9;Vt?rx@rTG3gM+4~*z;GZ>&7`)h*W18zFFkr+o{r1em+f0X-_l~? zHCyFjmgp3~Xc(*l#{1n9;xZZ+V8T!BSPJ@It}fS+^QjB!o_eNcd7im=jlt_+R2{gF zF#Z#K+%Tx@7%Z%eX&z|HtsEN{*l-b031|c^AM1dNxK;<q!pm+QXeRE}ffnLX9cU%a z>HxWt_vxT34$Ti+73<UXQu|tu`{vD~t}9rKnrS%Mb<@#0^RPd_Jbcdok=F&{wN<}` pUg6Ldw0)><tiGsOrY_AIkFpZ57^&}jFw6_V8(s{(Qleds@;e?Gl9K=c diff --git a/static/font/font/fontello.woff b/static/font/font/fontello.woff index 592f528e1147196dcce7a5314bf8ad6299001624..a2f3cc5ccc73bba9058afd2365dcebfb900e680b 100755 GIT binary patch delta 9048 zcmV-eBd6S~SD;uFcTYw}00961001l?01p5F002mMkrY3Fd}D24Z~y=S*Z=?lTmS$B zCN4Ajh+}qiAOHXZGynhq6951JAO`>b^k#5pZ2$lRNB{r@kN^M+aEg(TS!ZE$Z~y=Z z*Z=?k2mk;82mk;85NB+8W&i*P-~a#~(f|N3UKyKD5ol#$WB>psv;Y7AG5`PoHWeO^ znrLWcVE_PsC+GkG03ZMW03-*=1O{krba(&&C<p)m0Ac_D0IZvJ|K4nGV_^UQC~N=# z09XJ309gC~1-)%ycyIs!D8v8&03ZMW03ZQ?4W@2kZDjxeDC7VD0e1iZ0?o{wA0cpW zb94XzDqH{n0Y(4-0oQkAxifHbWpDrhE2IDb0D1tEQ2|K-%afY{Ie)+mGXQv;-P1`< z0#Ou3;X@;$Vuu~}eMcM_#*SEmaRsag*5xjkklcZT_h63xk9()eTq+-_s#K^~+*7~` zP?Hy_L-m4+_Na7pwz4>1V|{VH&X<mFxYAzLj_uWYX_P+GI8D+l&2u|<@>}lbL7q%| z-``*?t{MJy&5}<=_kVj|Y#+aD<(jJ2Sl5#@Sf$CD*1JKAO}5x(hh5t2vCjdA9MR#J z6HYnfoC_}XG}pSvEqC1Wz#~sQ)76hQmagspe_G|M+Ki)anW!seSkS+Zg;J7*Qj>*J znFUP=3z`=eG&wA2hFB=|S<qauP*!I_v&Mp^js?vh3n~E%YGMKlssjt^1Pdw#3u*@o zst60}2@5I<3u+7ts!i{KQ+HU;sX)@usYTMrsY=qPQ=g=<Q>mnhQ?sO*Q@y0QQ^(}C zQ_<v(Q`_V>r^?BFr{2i}r}D`Yr+0v9&(Zw>VqTx3voHg&1%C~29LJSjzwVx%pPilk zo1Iwzi^XDp@h1@6UkaqaB|s9S2$CQOQ2<3k5JgfFK@yTqwrELI6qCoIVwu$Obc)KZ zlg&g{-9?t8BOP0bW9iB#*%vCQlFnyJ@g-F`+fk8rqPP-WF2#t;yq;ZvpnhWCRi(06 z%+5^zO!w=4-+%kwdqaSbYyXq}CH*qVkVLI5)e=-Wp)ksT5;_l9yx)%7HdkW3SvvqC zwG32w$dy(@ULGoi4yek5gT<~x|1vNZ><hl|0v^VK@;7+>IuLl_g}}p(Jo&~q0-vlH z=$91;$1%Oi&ayJmNQiWk8d+Z(DdTf>LUB~1L>KzJ27f{o^F(FpJT{<wQUQj;rHsrH z&gm51qGPwLN*B|qLiXlZ*ihPgv!$Fx6Huux{6=k&?o8$K<x<5hCSWBLD%E1aVWJnX zNKMNkJTzwM&<l3Lrm@!8m+fSjI`P>0r1Q~RZUU0d2WBOGI#uz1;3U7J$4=XU(*YY! zyOGcpBa>PR41b(FdEQAT9XvosS64>@CY&qS!m+OOVH4v@h~P)A%{wTEQPM%$Ypvmc z!I>f#hb*p5yX`W??FE#5Bx+mWtxm37sz&ninDtghaoE|wg#j~a{_iWMW5U2&RtLl$ z_a)7v5KF?Z&A^-W%cd^~>ha@h*x(wtZwAb$(p7iedVd!_ad8|vu13C=iMQC6U)NNj zFfeZ%P&VT_;UH7&UZ^eu+!1QkjWkA=PJPDc=%fGaR|oF<FE4ff_{Vh|r)zxrIJ;j= z{p2U97k@QB59b;~j(^60@gv84jStXcq?3%0;o9mHa3Qxf4nYNRNC&}H!RIvG=PFQj zR_;1JiGN#%OeugDW5YG4GaKu4qFoVh@7N-bTV)yaLot+2^+R)0$ZZnslxGY2kt<bJ zLb<bXR_!b}9gu)%2=^7eU}#q_D}thS!5pr)b{;2pPIs(1SfeY`9QJAF%%tzUhIi_( z$vcKdW87;nXE|Zj1j;y=u+?cZE}G^=BW}Y*aeq+xncukR_g^&HoQvw5;y19GLN!)D z=b$W5AlELiOY~J-zg99t){@)F?X}5L8zp?ZK$V&pp+LunyYr}20{AFVxH69-M0J8g z1O$HPh+z1gBa9thA}S&!HMS|z-;%N0Ri(8zTkVHxsVY<lN;x$pqPA10pn4Tiv+Ss# zD1V}K%3J+@i67M=C>Go*7Ne9L)rp`uBaUn1B3Y2e(rPYWO(3p7rFUQjq@K8K1`Y&$ z>-Pqo;MxIS@WRSpu8b>&x>j!)KT+`cc6{`Y3xy8FV3sfA13fym@elbGpOc^b507;} z{O9Y|>`s^WBz^a9O&_>rWN^*#r{Nyl_J4cV`GP^;z}n#FINVp?d0#=#3q$S69N8S| z2_JjTsOUo20+jmIEl;#TtYsz=$=o!1;8x@KeS2%GGkYo#+;7*eU3&m^#74~OB$G9x z1J%JoNTQ>gUg;d4syR|>z!9B*FbZrIvCL05w$<7Zv*`WTOBsVn0>GvS12#7OU4J)i zN5YEI(hH@25VkV}V9RZWa_px=JV8-fh`YzmynP10kmwt<U*G%a_?dfabk)IAFPu8K z3f8?Ig(vShL!Z6yoOr7KmG++K>+6ONJpE5j9UkPv`=8zX=-$_(O`Um_?POt`!vV6c zHoR|oYz-%Tr9pv|y4r#qN7UFHxPMCspO+9dk0XY8oD#zwL-+5xWBay^8+v<E$w*jL z92|5mWdZJiECMPnzUsJ+jcc2iGr(0wq(wx?=kkaQc=UEe)zdNw%BW-2+`=~Lzzh6C zkd}J|H%-B9cBXnNMpsT8nV>r!+5vG*z1Q$Xx`YxK_p9pWmR4Qm!N)W+*nj436+yAy z;fmH}1hoCC28MF4X1Uo$U2Su$Ro7VPG1Rm`+})}K)D1T0dZV%d`&Ld)etvTDh%65# zqHP6XiRd^etNhwnJZPx*=;kU#)Dns%%t9dE764QA>bA5dZ&FRw9$!+`w^C6?;?1h9 zL4;Co4G3X#^a9DF-9y~65q~NWU<FmEP!17=Q3bV-Gr~AIBsEk3os}1C5_MB*BqL)^ zx+U9_&8tcq;+7Kt6cL)Sa;W4<FY0=?^68XNL$>1<3keD~qGBp{3#8=%ajS^pcU*8_ zA7TS&+PRULnUQmv0noV2mY|aPwxEa~!dHLC7k92$4%#m#?t^8%GJg##mQLBs2%H?5 zF*KhpP`J1m>PN64ryBHGzWUpS9XRV)7ZC~1qG8nW#)94ZfPIG!5Sz5r96z8sjG`0> z?lZ|p+_1EHh~TL_G$@FxH^G>_RNsRZx4y^c+l{}_1zo<lxyuL7*6;TD;17KXW0%iY ze-Cf_cKPD?tZVgakAJdP**#=A>8Qo!vpw}AQ@H1Wi~;HCCd*;Dv}kTBkKhIsR|1kM zC77$=C7ue`smfE_t9X&1&AT7&U%P?tfM1W#^sP5r$LqPS*<?cW!C0)+TK{%m%rs*T z{Irl<RjJg&!+h_FTjAHTC^+%E8`l5n3^r^v*Z0lJhDI{Bw|@t=w3cGnuvMd6HvD|h zD%8VcC-(3fd=TrG4W;}zV$rL7nWx7A<POWoZMBJZ8$l<4bF%!V&MApUksxttxg~o# zM9?ZS5KO`oqP`?iisFI1G9@*BEEMeT&81u1U`MDU5(#S_>#(GWO8`VW%T*V$osA8J zHm{Nom2z$f(SICmW;N8XgRpOC=MaABs*gT6w-eeS@zF8VDO0ecs3OL;Qud=`nF^G$ z>}a+`V>b=a;T^+#uzuyr-1%u}Ka0k5r>v;a7d0b%b*Hxl>5KA*_$2;%b8gIdHQ7q; zL~!~C<TUvj`RC+~TFcWls%s~om`!qpA6bE*J3fFAOMiG1psOSrHmRmZwb=;hLEwtc zXG4C9`bniVoecmpP<}`-eJbuody3e$-$n!<`n$EXZJ1o_0qn8qTJBpfz4%X`|LU{P zoO<fS@y8$g{O=r|+rM|_jvbR*HkHfe9R8Jy4ssB;j5ZauwjFFoa#e)L9O9>Ujl9*n z&Ns_ZtA8tii-7!A;6gY>Tom|N`-N*Y+PG#|Uv1WRvA)~vUzW@MtIhu9wcEU2+P)fU z@acsGzi0<GNKn87eCjD(=~(sc-Ys}JU|)UndJzjb)~H8`@%WP)s=d3U<g<<&ZrDtj z>yQ1#^<lifq)q)UNXUZv&+tfpZ#01A!BITF`hTVCZQ*;+?iJL3F5CQ@Pw(m%*Bjq+ zHJmM#vh)LQk4jwo5q*elLR@oew(j8?S%9^8n4-PZn-sFDFF+fj8a;r37WeH&1na85 z*Mzp`4Y<F4mtpM266lsVCo9N`3mEz%`rN{^;KpaUuJ<hJc$8J5XtfET^i=&_=x+2X zQGXO4lQ4E0^iS&V)!+3_4fvY(cyAc;IcRadLpL|DT7etg0oV4hIxDUF;?$b6VlVAN zIL3b8YtHR?Ig{so5AMQebmP+uS&joRnv-HUrw7;@Y$q|1#}1RrHIpEHhtaM!B*^PG zy<(vn_o{${0A-&CV|QaCKrco5gxVC*G=FmgvJ^2zgz$@vZ4J%uyP*l4`%P^!*rxll z+E6srV%K6*j`*<b<8?K(-x{C2-bM&I*?a~SW7E^qHM1iX?s7uuNLWY3S4wD>tEH6G z!$P(*7b^ABltrUK#YO^UOQ%ZO_aR<I#Y1vE1Wwde(M;J123PgY0SFIv>Gh}R#eY9& zElnJpD7DfTd)lucmATU16Yn3$gz547lw@C0Iq*erQUe3i+CZnScMrlJ{}FV@SFK2; zR;-HG-~FTZ9wb03d)i}#$(fUzC(i^8pPQhmsLu$VncQ+>cA~VvVdyc$VimEtr<O<3 zf(wOHKZKJ+_W{7OEHH(X7sk?&Y=0#Z6zDueIuTGTaFwRvKqG>FITDeAqejt1I1lYO zWPrDm&ehAF-yM49-#$yjc>2wQD<|prEobYmIe0$`!{}Kb-2coo`wu1vyLJ_M?KF<Z zgzv-O(uX&_qK{9lSw+52zDHg~^YAP=Nrc>9Xe@A)c=l8BV`Nv;WE*a?A%9XNNzy_L zoDPNO;W>B~o`NsIBk(!c2X`Z^|26qfxFrQTlG|Z3bYXjq2>1~G3f_UY;7{Q-SOG=6 z2l74{#Vusu^GBLbKZzDt`mEoVo&lcyzaN82Msd!7&jPZ(?f;)3rl-A?sFl$LQW;eb z5mhi%`kERO8tMr!4dxKJ4u2z7BDtN!AHt>-PLckOHN;pO<bXC-VfzSG6{^l*A4;PS zrO}6Sy$?lc^r7s)xhuD}{XL&NJ-w#IV~X#=MfjKSUAP@~kROpZ$-f}qCVxV{MZQ2j zk1`S{M?@(6H}G+GFBB4zGD)`$Bqc8lK^eWBikp*;&T0_3vaObKqJP}aB~Hp{iQNNs zN~F|EK9@#zS?s4sLGd<1wMgIz!ngE+L<&!G(tlFre<7z1L0Wd2cccr2`crgD`GQwL zxUw=nAdlT*ulbz3P5^pS=&z@QqoVKSNHdQPS+(Tmg<6nZxm6b%tB#5zz@|b?P`m1= zo)f0#bHXXgemZbKRe#aJ&@C0RzcSWBZk+F@W$D2oH!kA13klxAoC5ZWjjJgyK!Rvh zDPu2qkh9NK+(HGXi_@}2G+mL#5bvug)nYjug1pYlaUt<2;XIrQ_Jjj=stJnHsZ<?A zg&{!SvfM8tex5W6SR;j_L3h%T$Es7w4MDV8Ny{-x0T;?B5Pyasil(Z9eyIEg0B06O zdG+I}1t3?+Nx4@<)Pg8F1fDm5o~&yN2VQ>YhYvpZ!%KgDSUmEtAwo3<l(SGYf;5+E zg5i>JZYY9-hJeTz$BzJk<Wb=QYl3Ei66cJfkA)ATs*Y9AU&4k4<%*v%+lp`veLkRy zP9dTTP8DIGIe)>;&xDS>A^TJqx``Yt)feDFhP`qPH2H%aGo<}tg_$Nko|-LfOeji3 zVLtBn;e!O%xX!l~xO6ue#0(sR!sR%n9}3h^)i76eX}_q2*VIBcf(A5(T{8tZnr`et zF;&VmrmKz+ilzm*js0Nf%wilJZY^X`{D4C7iZYX-KYu7ig^K9I=TOaN=x9<oZv~}< zU*IvOGaLZ(Q%j12V~M~qpqw~YHAOW!UZ69qcmpvx4P$dEolt6MC@LXTMK_K6erFs^ z@MHU^gbgWZ#YCOQ56F=lxIz>~jg@d9+!p|<8^FR3z46O89`X+L{|FkDVKR*=KCFga zpiiQDa(@LXOhuqv(Zn(D2A)$*iWP9?xYjDuR72&8P)xZsaB8NGLQ!xEEJT^5$@@&l zWn}^^ZeW)RPRrn`s)DX)s)j;hQkJ+K48|;3tZ;NE3@t#J1TzZ-zy<!{Aa2^q<*IWL zFmMd$$631Vqaa!-T3Ig8t7R;RGUl41aqz|bihqf-=B8$G3k;u)KD&Y<$F&GEgL7TR zE)7q>G^mB;{>5<^s^u*u$~&k8Bo<R2P8u(H%+f7Im!Ve_H3}WoM4<uPBOpVX482HB zH58;p4MUN!O`opFt$}NRbLOZJC;|aEJ!~k~9S?PX^fozX8BCOVfTE@bLsv^d>7vUe z>wn1oB>Pd~T1dBalk%YI#kan}PO}UmvP)964y462q)2XplojawB0p|(QXXx!MLvZv zk(Uev8LKM8QpjH6?QcE0ZSC3#n0jOio=<kxe_&6nfT85fJCD5rUHN}Bam&;c{7rHu zS^q(G(#8U`9oPN_ImrKD)99aeq8;5^Gk@D~y{Yc;qR|GaY$qr?+?0o;36}064hY4% z3+<MvAdyTF6z;r?7tUX=fy*od7JN!pMQ2iXSLD%JNIsQa;vY(XEgvc6<qcIt-G)cU zz>)DY$+dD-gv$cDWQKZBHM|3=s;WMMhEzAzdo)vnZ`x5k75?bOa7vHb@UouDrGIuF z&<sPv1DNju;I=~qxrQcJ(BMZOq|>1=x<ctR3x{mG>6f4|!pOzaq`Q_wBFsIp->=|o z2$NYH=EYtZ8A}(l>7q9gnT^S(n<<%UIo(Lvcrhv&&~ha?WZ|T9De251@w?=4!%GQw z4o~F8Yx3@8j~QNW-j(T>OG!dKZhv^E$5n08TkBd7ESLHZlU#z{l-wO-goHz;59_HR zMTz!iLn)a=TD0hB+~MWzPmR;blN1(Az=!|p@iLvAc<P0xCSc%mO$2%94KF5-)BOcL zSKyAg8M)O4P;1fJ(8?exib{A%CbLG@pr)*E@SFjnBFL)z5Rn9$?8AX_!hiUzh8IEs zaVL>TFo}Cbj#r_QANi!G(yXt-Z_yz3_j*um`O+qwz@gvRM*27oA!|o&S+%^sJC|s4 zA}9%A>r%4SJktHBG`vFcmq;^BS8jwAaP_bt??pD$W~Aa4j}JJ^g>)Izd@~^lzpmX@ zD??P*-_XPOpP3n{56Czsynmfe=uB<X48K_)@Zw1DcDAHsv{?0Q{mHX*zIe76><iu& zd}GaRYdR`$W}%DvYX=$~49_4uM?@UawUll4v0lX<G&ueB`jcOW{?ge}AaGl-ubI!> z%y53vOC}j|qK1>8O1opJXs%kAWR<wlyjWBimmq(GqB9w2M_*Q2D1QzU_yhcQDd<gY zs6n5oN#;LUak>^Jq%#?Fg8^Oh1g)Z=i%mhJcd3Gi+QkC;=6O$sb^w}Ee5-J*xB>1o z6<&Xb`;k>FV~I=kflF+&z5CK`d!=*CE*>kc8b#B`>wm%V2>twlOZ8=!;VbRY-IsSo zqsJV?ziZddvP&$F*nitX2Fa${1|3bl94*eA!#vsqflwe6F;5V6yuG4M5miyg+FC6? zkmUpUTxYU%ux-$e_*<+NRiHa(`eddtWr2+Zc1UJOI+tEVBqf#E21(=azUyTUoJ`fr zEL2K4P}+;_?S)l^M4|w%C*+TJe$EM)6Zh`>_xtai2n2gOf`3%#dmcRk@bIH|p?wc@ zuzY@a%Sb*yvSoP5+0{P|n&Z9QEZ?;y5QJo3kSY4EWy{#|!kySE)Ym~gym^5A3hh9i zjFVStR>nbANXLdtl0h{?kvZa-OLho#7L6XClX>qcf!JwoXhviezp@aDNPnU>ml4}t z*Bi++Q}@SfiGN0*mwqDBi<;?ncL5n)w|rUGc=xy+HVu-8yyl5oGF{b1IZCQ5^Dzj$ zt}3Kphd}0SkRa!CkcxWQ9hvLHebf-Yr1`6*{BfVjrX{=$9~^t&(8xL*0iTR0<>L0+ z@7{W<G^kVaZ+*7G2WePevv%h$D0+oE?jGN;uDnvCzJLGKEH!FtckbT*#Rm=#dwsC! z+R)tLf2bif4)58%ZQ1gn6*ub<R$#gl{JG{6tJdeb>by~uOnkCTw*I1~QO``toZcSx zOI)iCvW9G|Nis%YbUDD<hU6pHbEI&XNl6owbbv|MdA`XgVE=RtcW-CXj*t%M;0r=r zjuMcrlYi?-*C7Ei?^ThGjTD|IWZ^W*QBuqCD)0Gs6<H|<|NZuDlWTVzJaEr}t;3z2 zB5Sn<iy>yvG-Pv6&)iX0Vgcz`WN0S0;f_Zi{=(6_WaT-moK&)!u)=J*J#q88sGUe| z9p171{I>44AcR;z?EJIo-B0JT^$&tvXx`O^JAX2%Sj)C0b)%hDm@MY1E_r)-H91;~ zbRhu<A)%@EBSGy%9>$x*CPUCmLBhJ2zd{LdFK;EIdb@}ara;N{5%h)T|8I4d<hZ75 z#$a2vT*($?nhS2U5e`xw@i7D8QH4mzdrM+56q(PJD#cF89u{rGlal?^A6~QyhL+Kc zi+@hsx2OJ$667`H{s;H?91Ge5Hf%q)Xb!x3i?-k#(jxe&3=~rn8wycVEU#hQaTar} zGA0!xU8GQ37Dh*fc%jqAjzXhBKP4YruG%d{FB=>x<?=Ye4xEb&2OxAe6f4pUo-Ig% zUa$l84`Y$=c>SW!ce9MK_G~i(LW`cB8GpHYSq`7NBQvlaOq|b6L0K(f+>E2|8TT;* z%2zMp<Yw2<nEWA)I4mA^(zlwqmTIlk1zgccgGnn$>J%@!DSfxuB`Gy&oW^82BUkk3 zX|x&UD>p{UqK$Vfyw`D>*XgC#({}Kq|K<hSS;&jAf9BQPl6X7>7bEy!gC*ngmVXzb zU(oSa*=2eGt<nl|Q>{n7W5jSB8VT)&Q*guh5w<deMJ{vOi}@|7rwNLLS}HOA;e8PR zi{{gfH%4T%rC+)c-d4L*%6@bqQ-PL_3uDRL+BO;=?&`SnyUAFk`!7mmGnMdDGZ9Mo zQ{wk$!|7Gf-^(gk{omEsHTLB9+JBrUtFhKNw8q`Fk2$aRjkljk=k+kUp+;DXvwg#s zJCW%fY{p{I-dw`@x#SkIr)HKUxaEA(^KDui7YzU`yqX~0GF&?5XQ+<}DTVu&6iY@- z776imEd*rcU?$bx77h{@T+uYfo_#<BLn|xy<Ph!mXfhfDiEAEv&sB0>%ztZ$u9i+! zX$X?YpFe!?hY!K{#({vp^|p1fWG;o*^vDn3i4*Ui%=aAr{k9C#EOaX=Gr8YZ?VuW% z+6yP%hv54s=&>!w$A%v4j+cx5nN?AyY&rhi@h$bA-SxsOzbmJ46J0GNYXQY_w0Jzy zQ#dn;MYAs~$f%K5D3RxDzJFHqc!f+YEQlyiK%hU)4oNRXFfxaYgpA}PaLMF=biTNs zFIeQvXH}<&ZF~{#vJJSC?@!2zlDv6#13l--W~Y=(b8K{^!s)bpp`z_$ser#r_#b}s zTZa69n;`#n{7R!YyQVfIv-BMxIgCu4qY3n8FT);l=rRFOWj+O+Lw`v$WS)bIv2r<G zbkdo$ro?+2smR6rVtOIzxR6;aqqF*H$acP=<mWtfKi9Z8Z#k!KfVMSK_0M}%&Np!2 zyaa*sHmv?QxPdpXORP+KrGJ{k8A&kUxH!n8=VcmW-b-)EFhSal+~P_w&f2O)8}GKE z`j<=nif51(Gix$^k$-ei^GCtpiW)Ky8ST`Hp&dJ_NA09u|GCcx?Y?-79)(jo6PI>> zjfaEWFp+VwT*r!?wSh!foVFYvBxLF>Vc3Dwf4zw)i@s}w#7UM^8gII_+YJQMaqH<~ z)?0-|Bvxf=U)3~qlBlXoQK{P4nwsl65j)b-;=Lsamej}`Zhs=AB`EqKq-|Nb$%d$- z;BP<3qDBTP!G>6Mi3d!-5WWA@gEqI~t=t-$xi!G!t-<>HJ%fF;YbXcFo>g76Z$<x? z2WL*4I=O2VT`_z7%oq1mHZJj(0Y)b2_&TdqH-mjER`dldqxC;0dc2nL=I=`zkI$}< zZI92a;-&qMZGT?sS~p@0^cd=Mn(S|AWD-FP$t^iV1sW-ZG-CTmqorA8UT`J*=~Wok zk*q_KV}|6o76Fp%Xp7mAprs3vhO{bC4@vOHlU51D!N%)NrCdt5QM%a+ODxS?*@2AZ zcqy%KCfuc|tMm6fL!Z7+Zc?d==See8;pMPME6LT;i+>~&Jg|_tGzw!tT4D{y$RnCd z6AqP9KARKK5IRA~6>f-AkB7tcw?mn*9@cJ%be4=B<D4&Q*S})>P&mxfjicUsB{6av z*;3ndD`;v*n@kj;eOw;Gaqv;xUg|v2n1+7nqDv~F?EWPNM3IrZv1NVH%<5dZk>sqF zWPCjV4SzjPFG#Y0n@)A2j_P>X2U#MwXWlCxqG)aLFvN<51Q#yOR%#+PI_<QhzPH;u z?cmov&HsA9q0e;a(4y<Qqa-u8ZpiK^^sI|uq1`qZ&xH+3C|m@iftH?_tqDp^&6L5@ zulCmDyP95q&{zMe*Bk8fIK@D^CESzhNOwes@_)S$wgRz*vRZn1*htwiCzf)|aBD0X z_DB01o12!XHQ&j6z~jzAVx#UZBR7-3s=38(s%prbX?xUfq8rCXIVds$B(2a*!el-U zDpf&dQWcddbJ&rpkU1TsHX9(5)g1S~pDfs-zRzwXD;{3bQbjE&{D$gS5$jLN`sxmB ztADAtqJc_=LWESyh2=N(cI7jvjzn8a$PU?&FwQPe^()Z^S6bAN2oj-CIs}V1<bSc? zW~1q5NKaWjgC`xU`NqYUxF5cD%6n-<UgGz^`gwimO+!1Y8Srr9m%dn^#FF~!jdf~= zOJ@BDoUEITmo_X|ga6+&Up{(N1}?p0^MBofSNRbZ!M)u_wvvZy5A|iKp(Z;l#%Liz zxyD8bsEGcmq0U=C48KAAhltNl{XTjKxfk*K4F9YEiioRGHcK?lwMn9Bd`g$81ys(> zn{M5(Zta@YmE!Vc-Cdbfyv>b<gNBZ<qk$Ii=o12Of(oT5jfQ>wMRf1Yyv3-eRDTQC zd+R6KaC=Haid$&lHG1SO+RrFFIsG_&<U2>iarm=0y!WQwFvXl^yy?Ajg~FP{lls1% z_S3nW>#>muZiW-N!A_sAZ*uQspU<~(;Andf?0fu`C+K6}eq`e(+cr9_zuw*lzZ>5& zl2|cZS&?d`MhZVhrKg?zA6>^S9W(#{c${NkWME(b;yzxXka&KZuMFJGFMuKpH%_X4 zgVF!L{!e15U`_{eIT)Bgq5xT84OWwSCmaS10HZ?&){~qkP8R=RW<dB5eW>OE-BiZF z007~qG`s)+ll&(}7!({7h!oxxY8BKL78bl0gcvUX0RR91E3;ZCmH~g+V$(1X^fW$V zlR#VUvrtM~2zr7alI2Y-vX+Dng8v>nfj9PH_MV;1&a#s=+5c^WGc1s!K#2-V)M)Sk zE3EMlk8q9)T;egF;3=NrIbPr;Ug0&~;4R+a3h(g&*Z7DVe8Mg6aF5UUf(^cArIJPw zm&vh}T^^$J%?yGD7sr3fQ#=sGibfK4yDbArulj|uyOQnBrdW6OV1#vKN*SY6edV-@ z$y4!5cVru{cYQqeYo_ffs**eUyd~zGt=bnmwk;K{Pob|T9x_o|lRHkKl--XMVosfo z<+P+U*ECqsOXtQSIBmWi@%xgs*$es|SN{SbIpzbIv>c@7Ia@?4J4}Um`ffSjpUbQH zkO)7M^wbre98b)HW?IkUj#~eY$x$fn6;rp4eHz*zreCI3(`sW?V(CMj0(mhrX4xMD K7lCP$E-QZCj!H`a delta 8968 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 Y$P!SdMZr$@i{%MkxiF9}sen1~f3rd%u>b%7 diff --git a/static/font/font/fontello.woff2 b/static/font/font/fontello.woff2 index 6d82e24d4ef7844b588560fe2b29fcb0a71f83d4..79c35f114f4e536a89705bae21d959e29862c9f7 100755 GIT binary patch literal 9592 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 literal 9460 zcmV<QBn#VjPew8T0RR9103`GP4*&oF07o1E03?|J0RR9100000000000000000000 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 GVE_n^6mjqX From 3b78c9c755563823adc7716a964505853b579561 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Tue, 2 Apr 2019 13:38:07 -0400 Subject: [PATCH 06/81] #101 - update hard-coded server url --- src/components/emoji-selector/emoji-selector.js | 3 +++ src/components/emoji-selector/emoji-selector.vue | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/emoji-selector/emoji-selector.js b/src/components/emoji-selector/emoji-selector.js index 07ea0442..133506b7 100644 --- a/src/components/emoji-selector/emoji-selector.js +++ b/src/components/emoji-selector/emoji-selector.js @@ -35,6 +35,9 @@ const EmojiSelector = { emojis: filterByKeyword(customEmojis, this.keyword) } } + }, + serverUrl () { + return this.$store.state.instance.server } } } diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index c9593971..f05ff1e9 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -24,7 +24,7 @@ @click="onEmoji(emoji)" > <span v-if="!emoji.image_url">{{emoji.utf}}</span> - <img :src="'https://bikeshed.party' + emoji.image_url" v-else> + <img :src="serverUrl + emoji.image_url" v-else> </span> </div> </div> From b4e53576f29d247bd890e890316d2ed026a3d057 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Fri, 5 Apr 2019 14:51:25 -0400 Subject: [PATCH 07/81] #101 - bind scroll event, highlight relevent section by tabs --- src/components/emoji-selector/emoji-selector.js | 17 ++++++++++++++++- .../emoji-selector/emoji-selector.vue | 9 +++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/components/emoji-selector/emoji-selector.js b/src/components/emoji-selector/emoji-selector.js index 133506b7..6d45df1f 100644 --- a/src/components/emoji-selector/emoji-selector.js +++ b/src/components/emoji-selector/emoji-selector.js @@ -6,7 +6,8 @@ const EmojiSelector = { data () { return { open: false, - keyword: '' + keyword: '', + activeGroup: 'standard' } }, methods: { @@ -17,6 +18,20 @@ const EmojiSelector = { const value = emoji.image_url ? `:${emoji.shortcode}:` : emoji.utf this.$emit('emoji', ` ${value} `) this.open = false + }, + highlight (key) { + const ref = this.$refs['group-' + key] + const top = ref[0].offsetTop + this.$refs['emoji-groups'].scrollTop = top + 1 + this.activeGroup = key + }, + scrolledGroup (e) { + const top = e.target.scrollTop + Object.keys(this.emojis).forEach(key => { + if (this.$refs['group-' + key][0].offsetTop < top) { + this.activeGroup = key + } + }) } }, computed: { diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index f05ff1e9..ddab2659 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -5,7 +5,7 @@ </span> <div class="emoji-dropdown-menu panel panel-default" v-if="open"> <div class="panel-heading emoji-tabs"> - <span class="emoji-tabs-item" v-for="(value, key) in emojis" :key="key" :title="value.text"> + <span class="emoji-tabs-item" :class="{'active': activeGroup === key}" v-for="(value, key) in emojis" :key="key" :title="value.text" @click.prevent="highlight(key)"> <i :class="value.icon"></i> </span> </div> @@ -13,9 +13,9 @@ <div class="emoji-search"> <input type="text" class="form-control" v-model="keyword" /> </div> - <div class="emoji-groups"> + <div class="emoji-groups" ref="emoji-groups" @scroll="scrolledGroup"> <div v-for="(value, key) in emojis" :key="key" class="emoji-group"> - <h6 class="emoji-group-title">{{value.text}}</h6> + <h6 class="emoji-group-title" :ref="'group-' + key">{{value.text}}</h6> <span v-for="emoji in value.emojis" :key="key + emoji.shortcode" @@ -78,7 +78,7 @@ &-item { padding: 0 5px; - &:first-child, &.active { + &.active { border-bottom: 4px solid; i { @@ -96,6 +96,7 @@ &-groups { flex: 1 1 1px; overflow: auto; + position: relative; } &-group { From 820a6543c7dc4e99d2a193c5ce05cc0c9453a8d8 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Mon, 8 Apr 2019 11:10:26 -0400 Subject: [PATCH 08/81] #101 - update caret pos after emoji's inserted --- src/components/emoji-input/emoji-input.js | 19 +++++++++++++++++++ src/components/emoji-input/emoji-input.vue | 1 + .../emoji-selector/emoji-selector.vue | 3 ++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index 8f7598ca..99dba1cb 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -110,6 +110,25 @@ const EmojiInput = { const newValue = this.value.substr(0, this.caret) + emoji + this.value.substr(this.caret) this.$refs.input.focus() this.$emit('input', newValue) + this.caret += emoji.length + setTimeout(() => { + this.updateCaretPos() + }) + }, + updateCaretPos () { + const elem = this.$refs.input + if (elem.createTextRange) { + const range = elem.createTextRange() + range.move('character', this.caret) + range.select() + } else { + if (elem.selectionStart) { + elem.focus() + elem.setSelectionRange(this.caret, this.caret) + } else { + elem.focus() + } + } } } } diff --git a/src/components/emoji-input/emoji-input.vue b/src/components/emoji-input/emoji-input.vue index 151861de..26d7c32a 100644 --- a/src/components/emoji-input/emoji-input.vue +++ b/src/components/emoji-input/emoji-input.vue @@ -6,6 +6,7 @@ :type="type" :value="value" :placeholder="placeholder" + id="good" @input="onInput" @click="setCaret" @keyup="setCaret" diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index ddab2659..d5d63543 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -42,7 +42,7 @@ &-dropdown { position: absolute; right: 0; - top: 100%; + top: 28px; z-index: 1; &-toggle { @@ -50,6 +50,7 @@ position: absolute; top: -25px; right: 2px; + line-height: 1; i { font-size: 18px; From 2ab915b48680b3c176a201700b2dd7e859329b05 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Mon, 8 Apr 2019 11:50:12 -0400 Subject: [PATCH 09/81] #101 - click outside of emoji implementation --- src/components/emoji-selector/emoji-selector.js | 12 ++++++++++++ src/components/emoji-selector/emoji-selector.vue | 6 +++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/emoji-selector/emoji-selector.js b/src/components/emoji-selector/emoji-selector.js index 6d45df1f..969b880b 100644 --- a/src/components/emoji-selector/emoji-selector.js +++ b/src/components/emoji-selector/emoji-selector.js @@ -3,6 +3,12 @@ const filterByKeyword = (list, keyword = '') => { } const EmojiSelector = { + mounted () { + document.body.addEventListener('click', this.outsideClicked) + }, + destroyed () { + document.body.removeEventListener('click', this.outsideClicked) + }, data () { return { open: false, @@ -14,6 +20,12 @@ const EmojiSelector = { togglePanel () { this.open = !this.open }, + insideClicked (e) { + e.stopPropagation() + }, + outsideClicked () { + this.open = false + }, onEmoji (emoji) { const value = emoji.image_url ? `:${emoji.shortcode}:` : emoji.utf this.$emit('emoji', ` ${value} `) diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index d5d63543..98d2642e 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -1,6 +1,6 @@ <template> - <div class="emoji-dropdown"> - <span class="emoji-dropdown-toggle" @click="togglePanel"> + <div class="emoji-dropdown" @click.prevent="insideClicked"> + <span class="emoji-dropdown-toggle" @click.prevent="togglePanel"> <i class="icon-smile"></i> </span> <div class="emoji-dropdown-menu panel panel-default" v-if="open"> @@ -48,7 +48,7 @@ &-toggle { cursor: pointer; position: absolute; - top: -25px; + top: -23px; right: 2px; line-height: 1; From 885f4c9924aa0372d8949666078c3630a38333ae Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Mon, 8 Apr 2019 12:02:50 -0400 Subject: [PATCH 10/81] #101 - bind outside click, add emoji to post status form --- src/components/emoji-input/emoji-input.js | 1 - .../emoji-selector/emoji-selector.vue | 4 ++ .../post_status_form/post_status_form.js | 27 ++++++++++- .../post_status_form/post_status_form.vue | 48 +++++++++++-------- 4 files changed, 59 insertions(+), 21 deletions(-) diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index 99dba1cb..112fd148 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -108,7 +108,6 @@ const EmojiInput = { }, onEmoji (emoji) { const newValue = this.value.substr(0, this.caret) + emoji + this.value.substr(this.caret) - this.$refs.input.focus() this.$emit('input', newValue) this.caret += emoji.length setTimeout(() => { diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-selector/emoji-selector.vue index 98d2642e..0630772c 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-selector/emoji-selector.vue @@ -92,6 +92,10 @@ &-search { padding: 5px; + + input { + width: 100%; + } } &-groups { diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index c65c27e2..8b0031de 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -2,6 +2,7 @@ import statusPoster from '../../services/status_poster/status_poster.service.js' import MediaUpload from '../media_upload/media_upload.vue' import ScopeSelector from '../scope_selector/scope_selector.vue' import EmojiInput from '../emoji-input/emoji-input.vue' +import EmojiSelector from '../emoji-selector/emoji-selector.vue' import fileTypeService from '../../services/file_type/file_type.service.js' import Completion from '../../services/completion/completion.js' import { take, filter, reject, map, uniqBy } from 'lodash' @@ -32,7 +33,8 @@ const PostStatusForm = { components: { MediaUpload, ScopeSelector, - EmojiInput + EmojiInput, + EmojiSelector }, mounted () { this.resize(this.$refs.textarea) @@ -233,6 +235,29 @@ const PostStatusForm = { onKeydown (e) { e.stopPropagation() }, + onEmoji (emoji) { + const newValue = this.newStatus.status.substr(0, this.caret) + emoji + this.newStatus.status.substr(this.caret) + this.newStatus.status = newValue + this.caret += emoji.length + setTimeout(() => { + this.updateCaretPos() + }) + }, + updateCaretPos () { + const elem = this.$refs.textarea + if (elem.createTextRange) { + const range = elem.createTextRange() + range.move('character', this.caret) + range.select() + } else { + if (elem.selectionStart) { + elem.focus() + elem.setSelectionRange(this.caret, this.caret) + } else { + elem.focus() + } + } + }, setCaret ({target: {selectionStart}}) { this.caret = selectionStart }, diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 1ce2b647..102cb484 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -20,25 +20,28 @@ v-model="newStatus.spoilerText" classname="form-control" /> - <textarea - ref="textarea" - @click="setCaret" - @keyup="setCaret" v-model="newStatus.status" :placeholder="$t('post_status.default')" rows="1" class="form-control" - @keydown="onKeydown" - @keydown.down="cycleForward" - @keydown.up="cycleBackward" - @keydown.shift.tab="cycleBackward" - @keydown.tab="cycleForward" - @keydown.enter="replaceCandidate" - @keydown.meta.enter="postStatus(newStatus)" - @keyup.ctrl.enter="postStatus(newStatus)" - @drop="fileDrop" - @dragover.prevent="fileDrag" - @input="resize" - @paste="paste" - :disabled="posting" - > - </textarea> + <div class="status-input-wrapper"> + <textarea + ref="textarea" + @click="setCaret" + @keyup="setCaret" v-model="newStatus.status" :placeholder="$t('post_status.default')" rows="1" class="form-control" + @keydown="onKeydown" + @keydown.down="cycleForward" + @keydown.up="cycleBackward" + @keydown.shift.tab="cycleBackward" + @keydown.tab="cycleForward" + @keydown.enter="replaceCandidate" + @keydown.meta.enter="postStatus(newStatus)" + @keyup.ctrl.enter="postStatus(newStatus)" + @drop="fileDrop" + @dragover.prevent="fileDrag" + @input="resize" + @paste="paste" + :disabled="posting" + > + </textarea> + <EmojiSelector @emoji="onEmoji" /> + </div> <div class="visibility-tray"> <span class="text-format" v-if="formattingOptionsEnabled"> <label for="post-content-type" class="select"> @@ -179,6 +182,13 @@ } } + .status-input-wrapper { + display: flex; + position: relative; + width: 100%; + flex-direction: column; + } + .attachments { padding: 0 0.5em; From 7f6f025792dcb3a10c94c8952d0312abd0b46989 Mon Sep 17 00:00:00 2001 From: jared <jaredrmain@gmail.com> Date: Mon, 8 Apr 2019 13:32:39 -0400 Subject: [PATCH 11/81] #101 - remove unused code --- src/components/emoji-input/emoji-input.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/emoji-input/emoji-input.vue b/src/components/emoji-input/emoji-input.vue index 26d7c32a..151861de 100644 --- a/src/components/emoji-input/emoji-input.vue +++ b/src/components/emoji-input/emoji-input.vue @@ -6,7 +6,6 @@ :type="type" :value="value" :placeholder="placeholder" - id="good" @input="onInput" @click="setCaret" @keyup="setCaret" From 259e8c52eeb4b1e52bdbf60e94b081e3af771950 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 28 Jul 2019 13:33:05 +0300 Subject: [PATCH 12/81] post-merge fix --- src/components/emoji-input/emoji-input.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index c3c5c88b..ddabcf3a 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -1,4 +1,5 @@ import Completion from '../../services/completion/completion.js' +import EmojiSelector from '../emoji-selector/emoji-selector.vue' import { take } from 'lodash' /** From 4c78fdb3934745ccbc87c10daf56552f0bfc0edc Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 28 Jul 2019 13:56:08 +0300 Subject: [PATCH 13/81] rename emoji-selector to emoji-picker --- src/components/emoji-input/emoji-input.js | 4 ++-- .../emoji-selector.js => emoji-picker/emoji-picker.js} | 4 ++-- .../emoji-selector.vue => emoji-picker/emoji-picker.vue} | 2 +- src/components/post_status_form/post_status_form.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/components/{emoji-selector/emoji-selector.js => emoji-picker/emoji-picker.js} (97%) rename src/components/{emoji-selector/emoji-selector.vue => emoji-picker/emoji-picker.vue} (98%) diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index ddabcf3a..62c58446 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -1,5 +1,5 @@ import Completion from '../../services/completion/completion.js' -import EmojiSelector from '../emoji-selector/emoji-selector.vue' +import EmojiPicker from '../emoji-picker/emoji-picker.vue' import { take } from 'lodash' /** @@ -65,7 +65,7 @@ const EmojiInput = { } }, components: { - EmojiSelector + EmojiPicker }, computed: { suggestions () { diff --git a/src/components/emoji-selector/emoji-selector.js b/src/components/emoji-picker/emoji-picker.js similarity index 97% rename from src/components/emoji-selector/emoji-selector.js rename to src/components/emoji-picker/emoji-picker.js index 969b880b..9d2595aa 100644 --- a/src/components/emoji-selector/emoji-selector.js +++ b/src/components/emoji-picker/emoji-picker.js @@ -2,7 +2,7 @@ const filterByKeyword = (list, keyword = '') => { return list.filter(x => x.shortcode.indexOf(keyword) !== -1) } -const EmojiSelector = { +const EmojiPicker = { mounted () { document.body.addEventListener('click', this.outsideClicked) }, @@ -69,4 +69,4 @@ const EmojiSelector = { } } -export default EmojiSelector +export default EmojiPicker diff --git a/src/components/emoji-selector/emoji-selector.vue b/src/components/emoji-picker/emoji-picker.vue similarity index 98% rename from src/components/emoji-selector/emoji-selector.vue rename to src/components/emoji-picker/emoji-picker.vue index 0630772c..663d9e2e 100644 --- a/src/components/emoji-selector/emoji-selector.vue +++ b/src/components/emoji-picker/emoji-picker.vue @@ -33,7 +33,7 @@ </div> </template> -<script src="./emoji-selector.js"></script> +<script src="./emoji-picker.js"></script> <style lang="scss"> @import '../../_variables.scss'; diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 5aaac8e6..3e1b83b5 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -2,7 +2,7 @@ import statusPoster from '../../services/status_poster/status_poster.service.js' import MediaUpload from '../media_upload/media_upload.vue' import ScopeSelector from '../scope_selector/scope_selector.vue' import EmojiInput from '../emoji-input/emoji-input.vue' -import EmojiSelector from '../emoji-selector/emoji-selector.vue' +import EmojiPicker from '../emoji-picker/emoji-picker.vue' import PollForm from '../poll/poll_form.vue' import StickerPicker from '../sticker_picker/sticker_picker.vue' import fileTypeService from '../../services/file_type/file_type.service.js' From 03c2f29b0aa31eb502db29e5a809da8bc1c1af28 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 28 Jul 2019 16:07:01 +0300 Subject: [PATCH 14/81] cleanup and appropriation for new emoji-input component API, styles updates --- src/boot/after_store.js | 12 ++-- src/components/emoji-input/emoji-input.js | 30 ++++++++- src/components/emoji-input/emoji-input.vue | 54 ++++++++++++++++- src/components/emoji-picker/emoji-picker.js | 33 +++------- src/components/emoji-picker/emoji-picker.vue | 57 ++++++++---------- .../post_status_form/post_status_form.js | 2 - .../post_status_form/post_status_form.vue | 2 + static/font/LICENSE.txt | 0 static/font/README.txt | 0 static/font/config.json | 4 +- static/font/css/animation.css | 0 static/font/css/fontello-codes.css | 1 + static/font/css/fontello-embedded.css | 13 ++-- static/font/css/fontello-ie7-codes.css | 1 + static/font/css/fontello-ie7.css | 1 + static/font/css/fontello.css | 15 ++--- static/font/demo.html | 15 +++-- static/font/font/fontello.eot | Bin 19060 -> 19376 bytes static/font/font/fontello.svg | 2 + static/font/font/fontello.ttf | Bin 18892 -> 19208 bytes static/font/font/fontello.woff | Bin 11596 -> 11808 bytes static/font/font/fontello.woff2 | Bin 9856 -> 10044 bytes 22 files changed, 153 insertions(+), 89 deletions(-) mode change 100755 => 100644 static/font/LICENSE.txt mode change 100755 => 100644 static/font/README.txt mode change 100755 => 100644 static/font/config.json mode change 100755 => 100644 static/font/css/animation.css mode change 100755 => 100644 static/font/css/fontello-codes.css mode change 100755 => 100644 static/font/css/fontello-embedded.css mode change 100755 => 100644 static/font/css/fontello-ie7-codes.css mode change 100755 => 100644 static/font/css/fontello-ie7.css mode change 100755 => 100644 static/font/css/fontello.css mode change 100755 => 100644 static/font/demo.html mode change 100755 => 100644 static/font/font/fontello.eot mode change 100755 => 100644 static/font/font/fontello.svg mode change 100755 => 100644 static/font/font/fontello.ttf mode change 100755 => 100644 static/font/font/fontello.woff mode change 100755 => 100644 static/font/font/fontello.woff2 diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 3799359f..0e59358b 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -190,7 +190,7 @@ const getStaticEmoji = async ({ store }) => { imageUrl: false, replacement: values[key] } - }) + }).sort((a, b) => a.displayText - b.displayText) store.dispatch('setInstanceOption', { name: 'emoji', value: emoji }) } else { throw (res) @@ -209,14 +209,16 @@ const getCustomEmoji = async ({ store }) => { if (res.ok) { const result = await res.json() const values = Array.isArray(result) ? Object.assign({}, ...result) : result - const emoji = Object.keys(values).map((key) => { - const imageUrl = values[key].image_url + const emoji = Object.entries(values).map(([key, value]) => { + const imageUrl = value.image_url return { displayText: key, - imageUrl: imageUrl ? store.state.instance.server + imageUrl : values[key], + imageUrl: imageUrl ? store.state.instance.server + imageUrl : value, + tags: imageUrl ? value.tags.sort((a, b) => a > b ? 1 : 0) : ['utf'], replacement: `:${key}: ` } - }) + // Technically could use tags but those are kinda useless right now, should have been "pack" field, that would be more useful + }).sort((a, b) => a.displayText.toLowerCase() > b.displayText.toLowerCase() ? 1 : 0) store.dispatch('setInstanceOption', { name: 'customEmoji', value: emoji }) store.dispatch('setInstanceOption', { name: 'pleromaBackend', value: true }) } else { diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index 62c58446..1c49c710 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -53,6 +53,11 @@ const EmojiInput = { */ required: true, type: String + }, + emojiPicker: { + required: false, + type: Boolean, + default: false } }, data () { @@ -61,7 +66,8 @@ const EmojiInput = { highlighted: 0, caret: 0, focused: false, - blurTimeout: null + blurTimeout: null, + showPicker: false, } }, components: { @@ -83,12 +89,15 @@ const EmojiInput = { highlighted: index === this.highlighted })) }, - showPopup () { + showSuggestions () { return this.focused && this.suggestions && this.suggestions.length > 0 }, textAtCaret () { return (this.wordAtCaret || {}).word || '' }, + pickerIconBottom () { + return this.input && this.input.tag === 'textarea' + }, wordAtCaret () { if (this.value && this.caret) { const word = Completion.wordAtPosition(this.value, this.caret - 1) || {} @@ -124,11 +133,22 @@ const EmojiInput = { } }, methods: { + togglePicker () { + this.showPicker = !this.showPicker + }, replace (replacement) { const newValue = Completion.replaceWord(this.value, this.wordAtCaret, replacement) this.$emit('input', newValue) this.caret = 0 }, + insert (insertion) { + const newValue = [ + this.value.substring(0, this.caret), + insertion, + this.value.substring(this.caret) + ].join('') + this.$emit('input', newValue) + }, replaceText (e, suggestion) { const len = this.suggestions.length || 0 if (this.textAtCaret.length === 1) { return } @@ -195,6 +215,7 @@ const EmojiInput = { this.blurTimeout = null } + this.showPicker = false this.focused = true this.setCaret(e) this.resize() @@ -231,6 +252,7 @@ const EmojiInput = { } }, onInput (e) { + this.showPicker = false this.setCaret(e) this.$emit('input', e.target.value) }, @@ -239,6 +261,9 @@ const EmojiInput = { this.resize() this.$emit('input', e.target.value) }, + onClickOutside () { + this.showPicker = false + }, setCaret ({ target: { selectionStart } }) { this.caret = selectionStart }, @@ -247,6 +272,7 @@ const EmojiInput = { if (!panel) return const { offsetHeight, offsetTop } = this.input.elm this.$refs.panel.style.top = (offsetTop + offsetHeight) + 'px' + this.$refs.picker.$el.style.top = (offsetTop + offsetHeight) + 'px' } } } diff --git a/src/components/emoji-input/emoji-input.vue b/src/components/emoji-input/emoji-input.vue index 48739ec8..605882e8 100644 --- a/src/components/emoji-input/emoji-input.vue +++ b/src/components/emoji-input/emoji-input.vue @@ -1,10 +1,29 @@ <template> - <div class="emoji-input"> +<div + class="emoji-input" + v-click-outside="onClickOutside" + > <slot /> + <template v-if="emojiPicker"> + <div + @click.prevent="togglePicker" + class="emoji-picker-icon" + :class="pickerIconBottom ? 'picker-icon-bottom': 'picker-icon-right'" + > + <i class="icon-smile"></i> + </div> + <EmojiPicker + v-if="emojiPicker" + :class="{ hide: !showPicker }" + ref="picker" + class="emoji-picker-panel" + @emoji="insert" + /> + </template> <div ref="panel" class="autocomplete-panel" - :class="{ hide: !showPopup }" + :class="{ hide: !showSuggestions }" > <div class="autocomplete-panel-body"> <div @@ -39,6 +58,37 @@ .emoji-input { display: flex; flex-direction: column; + position: relative; + + .emoji-picker-icon { + position: absolute; + margin: 0 .25em; + font-size: 16px; + cursor: pointer; + + &:hover i { + color: $fallback--text; + color: var(--text, $fallback--text); + } + + &.picker-icon-bottom { + bottom: 0; + left: 0; + } + &.picker-icon-right { + top: 0; + right: 0; + } + } + .emoji-picker-panel { + position: absolute; + z-index: 9; + margin-top: 2px; + + &.hide { + display: none + } + } .autocomplete { &-panel { diff --git a/src/components/emoji-picker/emoji-picker.js b/src/components/emoji-picker/emoji-picker.js index 9d2595aa..92d517b7 100644 --- a/src/components/emoji-picker/emoji-picker.js +++ b/src/components/emoji-picker/emoji-picker.js @@ -1,33 +1,17 @@ const filterByKeyword = (list, keyword = '') => { - return list.filter(x => x.shortcode.indexOf(keyword) !== -1) + return list.filter(x => x.displayText.includes(keyword)) } const EmojiPicker = { - mounted () { - document.body.addEventListener('click', this.outsideClicked) - }, - destroyed () { - document.body.removeEventListener('click', this.outsideClicked) - }, data () { return { - open: false, keyword: '', activeGroup: 'standard' } }, methods: { - togglePanel () { - this.open = !this.open - }, - insideClicked (e) { - e.stopPropagation() - }, - outsideClicked () { - this.open = false - }, onEmoji (emoji) { - const value = emoji.image_url ? `:${emoji.shortcode}:` : emoji.utf + const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement this.$emit('emoji', ` ${value} `) this.open = false }, @@ -51,20 +35,17 @@ const EmojiPicker = { const standardEmojis = this.$store.state.instance.emoji || [] const customEmojis = this.$store.state.instance.customEmoji || [] return { - standard: { - text: 'Standard', - icon: 'icon-star', - emojis: filterByKeyword(standardEmojis, this.keyword) - }, custom: { text: 'Custom', icon: 'icon-picture', emojis: filterByKeyword(customEmojis, this.keyword) + }, + standard: { + text: 'Standard', + icon: 'icon-star', + emojis: filterByKeyword(standardEmojis, this.keyword) } } - }, - serverUrl () { - return this.$store.state.instance.server } } } diff --git a/src/components/emoji-picker/emoji-picker.vue b/src/components/emoji-picker/emoji-picker.vue index 663d9e2e..ea93e6fc 100644 --- a/src/components/emoji-picker/emoji-picker.vue +++ b/src/components/emoji-picker/emoji-picker.vue @@ -1,36 +1,31 @@ <template> - <div class="emoji-dropdown" @click.prevent="insideClicked"> - <span class="emoji-dropdown-toggle" @click.prevent="togglePanel"> - <i class="icon-smile"></i> +<div class="emoji-dropdown-menu panel panel-default"> + <div class="panel-heading emoji-tabs"> + <span class="emoji-tabs-item" :class="{'active': activeGroup === key}" v-for="(value, key) in emojis" :key="key" :title="value.text" @click.prevent="highlight(key)"> + <i :class="value.icon"></i> </span> - <div class="emoji-dropdown-menu panel panel-default" v-if="open"> - <div class="panel-heading emoji-tabs"> - <span class="emoji-tabs-item" :class="{'active': activeGroup === key}" v-for="(value, key) in emojis" :key="key" :title="value.text" @click.prevent="highlight(key)"> - <i :class="value.icon"></i> + </div> + <div class="panel-body emoji-dropdown-menu-content"> + <div class="emoji-search"> + <input type="text" class="form-control" v-model="keyword" /> + </div> + <div class="emoji-groups" ref="emoji-groups" @scroll="scrolledGroup"> + <div v-for="(value, key) in emojis" :key="key" class="emoji-group"> + <h6 class="emoji-group-title" :ref="'group-' + key">{{value.text}}</h6> + <span + v-for="emoji in value.emojis" + :key="key + emoji.displayText" + :title="emoji.displayText" + class="emoji-item" + @click="onEmoji(emoji)" + > + <span v-if="!emoji.imageUrl">{{emoji.replacement}}</span> + <img :src="emoji.imageUrl" v-else> </span> </div> - <div class="panel-body emoji-dropdown-menu-content"> - <div class="emoji-search"> - <input type="text" class="form-control" v-model="keyword" /> - </div> - <div class="emoji-groups" ref="emoji-groups" @scroll="scrolledGroup"> - <div v-for="(value, key) in emojis" :key="key" class="emoji-group"> - <h6 class="emoji-group-title" :ref="'group-' + key">{{value.text}}</h6> - <span - v-for="emoji in value.emojis" - :key="key + emoji.shortcode" - :title="emoji.shortcode" - class="emoji-item" - @click="onEmoji(emoji)" - > - <span v-if="!emoji.image_url">{{emoji.utf}}</span> - <img :src="serverUrl + emoji.image_url" v-else> - </span> - </div> - </div> - </div> </div> </div> +</div> </template> <script src="./emoji-picker.js"></script> @@ -119,14 +114,14 @@ } &-item { - width: 34px; - height: 34px; + width: 32px; + height: 32px; box-sizing: border-box; display: flex; - font-size: 16px; + font-size: 32px; align-items: center; justify-content: center; - padding: 5px; + margin: 2px; cursor: pointer; img { diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 3e1b83b5..40bbf6d4 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -2,7 +2,6 @@ import statusPoster from '../../services/status_poster/status_poster.service.js' import MediaUpload from '../media_upload/media_upload.vue' import ScopeSelector from '../scope_selector/scope_selector.vue' import EmojiInput from '../emoji-input/emoji-input.vue' -import EmojiPicker from '../emoji-picker/emoji-picker.vue' import PollForm from '../poll/poll_form.vue' import StickerPicker from '../sticker_picker/sticker_picker.vue' import fileTypeService from '../../services/file_type/file_type.service.js' @@ -37,7 +36,6 @@ const PostStatusForm = { EmojiInput, PollForm, StickerPicker, - EmojiSelector, ScopeSelector }, mounted () { diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index d15c75ad..0b3db30d 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -61,6 +61,7 @@ <EmojiInput v-if="newStatus.spoilerText || alwaysShowSubject" v-model="newStatus.spoilerText" + emojiPicker :suggest="emojiSuggestor" class="form-control" > @@ -75,6 +76,7 @@ <EmojiInput v-model="newStatus.status" :suggest="emojiUserSuggestor" + emojiPicker class="form-control main-input" > <textarea diff --git a/static/font/LICENSE.txt b/static/font/LICENSE.txt old mode 100755 new mode 100644 diff --git a/static/font/README.txt b/static/font/README.txt old mode 100755 new mode 100644 diff --git a/static/font/config.json b/static/font/config.json old mode 100755 new mode 100644 index 6a68019c..7655e4d1 --- a/static/font/config.json +++ b/static/font/config.json @@ -238,7 +238,7 @@ "uid": "266d5d9adf15a61800477a5acf9a4462", "css": "chart-bar", "code": 59419, - "src": "fontelico" + "src": "fontawesome" }, { "uid": "d862a10e1448589215be19702f98f2c1", @@ -293,4 +293,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/static/font/css/animation.css b/static/font/css/animation.css old mode 100755 new mode 100644 diff --git a/static/font/css/fontello-codes.css b/static/font/css/fontello-codes.css old mode 100755 new mode 100644 index 273fce35..837b79d9 --- a/static/font/css/fontello-codes.css +++ b/static/font/css/fontello-codes.css @@ -37,6 +37,7 @@ .icon-bell-alt:before { content: '\f0f3'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ +.icon-smile:before { content: '\f118'; } /* '' */ .icon-lock-open-alt:before { content: '\f13e'; } /* '' */ .icon-ellipsis:before { content: '\f141'; } /* '' */ .icon-play-circled:before { content: '\f144'; } /* '' */ diff --git a/static/font/css/fontello-embedded.css b/static/font/css/fontello-embedded.css old mode 100755 new mode 100644 index 44b26e90..ca7dc40a --- a/static/font/css/fontello-embedded.css +++ b/static/font/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?36125818'); - src: url('../font/fontello.eot?36125818#iefix') format('embedded-opentype'), - url('../font/fontello.svg?36125818#fontello') format('svg'); + src: url('../font/fontello.eot?88512238'); + src: url('../font/fontello.eot?88512238#iefix') format('embedded-opentype'), + url('../font/fontello.svg?88512238#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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KyNhOC2wOSywABawAyWwAiVHI0cjYbAAVFguIDwjIRuwAiWwAiVHI0cjYSCwBSWwBCVHI0cjYbAGJbAFJUmwAiVhuQgACABjYyMgWGIbIVljuAQAYiCwAFBYsEBgWWawAWNgIy4jICA8ijgjIVktsDossAAWILAIQyAuRyNHI2EgYLAgYGawAmIgsABQWLBAYFlmsAFjIyAgPIo4LbA7LCMgLkawAiVGUlggPFkusSsBFCstsDwsIyAuRrACJUZQWCA8WS6xKwEUKy2wPSwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xKwEUKy2wPiywNSsjIC5GsAIlRlJYIDxZLrErARQrLbA/LLA2K4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?36125818#fontello') format('svg'); + src: url('../font/fontello.svg?88512238#fontello') format('svg'); } } */ @@ -90,6 +90,7 @@ .icon-bell-alt:before { content: '\f0f3'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ +.icon-smile:before { content: '\f118'; } /* '' */ .icon-lock-open-alt:before { content: '\f13e'; } /* '' */ .icon-ellipsis:before { content: '\f141'; } /* '' */ .icon-play-circled:before { content: '\f144'; } /* '' */ diff --git a/static/font/css/fontello-ie7-codes.css b/static/font/css/fontello-ie7-codes.css old mode 100755 new mode 100644 index 5df45a1d..bfaead9f --- a/static/font/css/fontello-ie7-codes.css +++ b/static/font/css/fontello-ie7-codes.css @@ -37,6 +37,7 @@ .icon-bell-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-smile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-lock-open-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-ellipsis { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-play-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/static/font/css/fontello-ie7.css b/static/font/css/fontello-ie7.css old mode 100755 new mode 100644 index f700ae78..e0e0af3b --- a/static/font/css/fontello-ie7.css +++ b/static/font/css/fontello-ie7.css @@ -48,6 +48,7 @@ .icon-bell-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-smile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-lock-open-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-ellipsis { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-play-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/static/font/css/fontello.css b/static/font/css/fontello.css old mode 100755 new mode 100644 index 6c14be64..653ada3c --- a/static/font/css/fontello.css +++ b/static/font/css/fontello.css @@ -1,11 +1,11 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?91349539'); - src: url('../font/fontello.eot?91349539#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?91349539') format('woff2'), - url('../font/fontello.woff?91349539') format('woff'), - url('../font/fontello.ttf?91349539') format('truetype'), - url('../font/fontello.svg?91349539#fontello') format('svg'); + src: url('../font/fontello.eot?94788965'); + src: url('../font/fontello.eot?94788965#iefix') format('embedded-opentype'), + url('../font/fontello.woff2?94788965') format('woff2'), + url('../font/fontello.woff?94788965') format('woff'), + url('../font/fontello.ttf?94788965') format('truetype'), + url('../font/fontello.svg?94788965#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?91349539#fontello') format('svg'); + src: url('../font/fontello.svg?94788965#fontello') format('svg'); } } */ @@ -93,6 +93,7 @@ .icon-bell-alt:before { content: '\f0f3'; } /* '' */ .icon-plus-squared:before { content: '\f0fe'; } /* '' */ .icon-reply:before { content: '\f112'; } /* '' */ +.icon-smile:before { content: '\f118'; } /* '' */ .icon-lock-open-alt:before { content: '\f13e'; } /* '' */ .icon-ellipsis:before { content: '\f141'; } /* '' */ .icon-play-circled:before { content: '\f144'; } /* '' */ diff --git a/static/font/demo.html b/static/font/demo.html old mode 100755 new mode 100644 index 61dfae76..1a28bc77 --- a/static/font/demo.html +++ b/static/font/demo.html @@ -229,11 +229,11 @@ body { } @font-face { font-family: 'fontello'; - src: url('./font/fontello.eot?82370835'); - src: url('./font/fontello.eot?82370835#iefix') format('embedded-opentype'), - url('./font/fontello.woff?82370835') format('woff'), - url('./font/fontello.ttf?82370835') format('truetype'), - url('./font/fontello.svg?82370835#fontello') format('svg'); + src: url('./font/fontello.eot?31206390'); + src: url('./font/fontello.eot?31206390#iefix') format('embedded-opentype'), + url('./font/fontello.woff?31206390') format('woff'), + url('./font/fontello.ttf?31206390') format('truetype'), + url('./font/fontello.svg?31206390#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -354,13 +354,16 @@ body { <div class="row"> <div class="the-icons span3" title="Code: 0xf0fe"><i class="demo-icon icon-plus-squared"></i> <span class="i-name">icon-plus-squared</span><span class="i-code">0xf0fe</span></div> <div class="the-icons span3" title="Code: 0xf112"><i class="demo-icon icon-reply"></i> <span class="i-name">icon-reply</span><span class="i-code">0xf112</span></div> + <div class="the-icons span3" title="Code: 0xf118"><i class="demo-icon icon-smile"></i> <span class="i-name">icon-smile</span><span class="i-code">0xf118</span></div> <div class="the-icons span3" title="Code: 0xf13e"><i class="demo-icon icon-lock-open-alt"></i> <span class="i-name">icon-lock-open-alt</span><span class="i-code">0xf13e</span></div> - <div class="the-icons span3" title="Code: 0xf141"><i class="demo-icon icon-ellipsis"></i> <span class="i-name">icon-ellipsis</span><span class="i-code">0xf141</span></div> </div> <div class="row"> + <div class="the-icons span3" title="Code: 0xf141"><i class="demo-icon icon-ellipsis"></i> <span class="i-name">icon-ellipsis</span><span class="i-code">0xf141</span></div> <div class="the-icons span3" title="Code: 0xf144"><i class="demo-icon icon-play-circled"></i> <span class="i-name">icon-play-circled</span><span class="i-code">0xf144</span></div> <div class="the-icons span3" title="Code: 0xf164"><i class="demo-icon icon-thumbs-up-alt"></i> <span class="i-name">icon-thumbs-up-alt</span><span class="i-code">0xf164</span></div> <div class="the-icons span3" title="Code: 0xf1e5"><i class="demo-icon icon-binoculars"></i> <span class="i-name">icon-binoculars</span><span class="i-code">0xf1e5</span></div> + </div> + <div class="row"> <div class="the-icons span3" title="Code: 0xf234"><i class="demo-icon icon-user-plus"></i> <span class="i-name">icon-user-plus</span><span class="i-code">0xf234</span></div> </div> </div> diff --git a/static/font/font/fontello.eot b/static/font/font/fontello.eot old mode 100755 new mode 100644 index ca8d57f6df5a71bbf02fcf19c0089526a018b0b6..197a604204720591bf46f3c9f0ee25dc3fe14d46 GIT binary patch delta 883 zcmZ{iUr1AN6vxl`-MhO@Z5ui_U2CnW%eJ*h)^?M1b7_Rr!2S@aVOu)2aCOxs7Lj2R zQDoW#d#I?O2zoL0A|cd6L{ULcLJ-tLixEMa*-M%0%++K3_}<U?p7T4u1Bbgfg)`GA z%rpV0nkEG=KOeNUPS#x>83Mo-065SY4a?uA?yMsJ0DwQ(ITW)B+2ut5DNS{2x7-uG zG&#`<uw4gGDEEX1Wy(`5rHHDYzEj=0eNT!21hO?3dL!X3!`??<0mO@x@b*$d`I1+Y ze@ecxHyRth=RJ`9K#5P3nC&~!8FoBhy%%8X4e}k)@UV>MSKTMSMBaKl9F4rbxpo~u ztr>v5kxvZ9ZsT2g&`(3~mpl-WlL6-(K=54rHn!t*d<lEDxd5pf&<@;6<RTVOzYBQy zNrg(VQpBfLr)pB3^wsps^v85E{XM;$DbAF|Z?P(ESw_kPG7XuoOme}K&Bpt=iVCE@ zwv}@T{&V8RT)Sc;O%@XU977$@YF6gv0I)GJ%D=)rWdIoxtS3r&K{YXu7i=Il<OL35 zS6<*GCi4Opz=9_)dUi_K;v7+Ae`ja8!(1_xfElX53-z$0Zu=TNV;t@RH3*zq2q}=` zks-%Ixz#8ULZDQsl>0%cR2>ABQq>%&Ga3yg`jYbU;sV7QCu-1*>+KR6j25i%`Xsbq zm0qyfC1y|%-IyzR+#}4UVHQr}e0mMq+)Tn63$jzC^7w$B*O*Pbrnw`i<;^DD@@Ge_ zi&aZ@v^xCN%q6<7)OK7Lzj(;c#L(Ea(Iei*f#<0g$A!~#i;vGD*6(L6J2fVCk<KNG zF0H1(l(aZjI?aFiuyHI@F6NrYI{dt+`^@f>&tkD>UveLS#EZ=hg1OZeoIkAf|A0a+ z_w&NLPT$&pj8}_3bjL&D4W4Vw{*Et+M@#L72}8>0FupCjUS3ZZX<Oh<3~eps=;o-u Xjp3%md%qh6#bESkUnEf=9V_|+j=J4{ delta 552 zcmdlmo$<>QMz#_!28J`96WPpI<izrNCOUN2S1>Rz1~4!%geB)D7M$PsTMx)z!N9=c zlw4M#!1n*&7X}8~EkJpNw1V{9u89*Of&42B4BQ3jiNys#aRDHI4UpzYo^FkfNE zz`**3fx$2@BQ-HaOs)6_1A}=CP~I#9D8PP_g#*Z+0_3Y?<d#${yc72S5l~<UP+&_= zesZE<uyi;BgGCOIACsF{QNY;5y9~%b0pu&>CFZ7{nJcdd<iB8GU^-inUtF>{WS=Vo zgEde;<L82+)Pkpu+ItunJY6O)V2oy*Ir$G`y0sDmBTzR3qYMKxn56@xxq$kW7+4rS z040<d6o4$I7t$|`UYLC7|8VldgAY$XeE#t7qtN69OsbQQGwCTZ0#!wTVH5*aI9ZB0 z8fZM*<VNN{lRq%A^Yei0WKsZ;K%ld^hvhV*J1}fM0x^R+kamP%1`QzX0>KQLKsp72 z8MJ`(QwV0zW?=Ya0>KPA3=ErBu$gLa{%YjRCexEACKu0d^Ob>{85kxE3^#oxRAKbw z5KD7L-N`+cb0+IpWeT#0#fZ%lcah+c*bWW{-Oa14xS4?pw%JB)7P8Z0-0Wtb#RC9? C36pgI diff --git a/static/font/font/fontello.svg b/static/font/font/fontello.svg old mode 100755 new mode 100644 index 7849638e..6d9903ca --- a/static/font/font/fontello.svg +++ b/static/font/font/fontello.svg @@ -82,6 +82,8 @@ <glyph glyph-name="reply" unicode="" d="M1000 232q0-93-71-252-1-4-6-13t-7-17-7-12q-7-10-16-10-8 0-13 6t-5 14q0 5 1 15t2 13q3 38 3 69 0 56-10 101t-27 77-45 56-59 39-74 24-86 12-98 3h-125v-143q0-14-10-25t-26-11-25 11l-285 286q-11 10-11 25t11 25l285 286q11 10 25 10t26-10 10-25v-143h125q398 0 488-225 30-75 30-186z" horiz-adv-x="1000" /> +<glyph glyph-name="smile" unicode="" d="M633 257q-21-67-77-109t-127-41-128 41-77 109q-4 14 3 27t21 18q14 4 27-2t17-22q14-44 52-72t85-28 84 28 52 72q4 15 18 22t27 2 21-18 2-27z m-276 243q0-30-21-51t-50-21-51 21-21 51 21 50 51 21 50-21 21-50z m286 0q0-30-21-51t-51-21-50 21-21 51 21 50 50 21 51-21 21-50z m143-143q0 73-29 139t-76 114-114 76-138 28-139-28-114-76-76-114-29-139 29-139 76-113 114-77 139-28 138 28 114 77 76 113 29 139z m71 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" /> + <glyph glyph-name="lock-open-alt" unicode="" d="M589 428q23 0 38-15t16-38v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v179q0 103 74 177t176 73 177-73 73-177q0-14-10-25t-25-11h-36q-14 0-25 11t-11 25q0 59-42 101t-101 42-101-42-41-101v-179h410z" horiz-adv-x="642.9" /> <glyph glyph-name="ellipsis" unicode="" d="M214 446v-107q0-22-15-38t-38-15h-107q-23 0-38 15t-16 38v107q0 23 16 38t38 16h107q22 0 38-16t15-38z m286 0v-107q0-22-16-38t-38-15h-107q-22 0-38 15t-15 38v107q0 23 15 38t38 16h107q23 0 38-16t16-38z m286 0v-107q0-22-16-38t-38-15h-107q-22 0-38 15t-16 38v107q0 23 16 38t38 16h107q23 0 38-16t16-38z" horiz-adv-x="785.7" /> diff --git a/static/font/font/fontello.ttf b/static/font/font/fontello.ttf old mode 100755 new mode 100644 index e0fd784f6bc90b538c00cd762f805a7a40f90daf..6ec04a304334c68b5f43d48fd4ee57e46f4400a1 GIT binary patch delta 856 zcmZ{iT}V@57{{OIJ!fZ|+7zApYOQ5CZ9AT5tZmskX%?Xvlu4+CZR(tfvxBavh>Vhu zpt4R>7X=j*L07RGiJ&ebl0K-LAaClT#fYHU7h&mow$)|4{Lk<CKVL7roM$RdT*S%c zV+R0m8vyL=jYpKv7p^ZNe;a`B=sl2d3fYBk0CI-v&VD5pKXq=h6JSFbK(P{wj4G6; zSWXjlv7tl#Wjh{}00?BgCkLXDK2zJ>PXNIQO85sTp`GUS<R6k>F%VB2yy@SWeM^b= zl$aXY*Bfy^Ufc$-_6qs#c;ujhCl=iz|C_vXI1-OOySj84K)oG+Jy-UPCa&QPS{R~B z@Ru?YRZ@+f`v5J+&i&klm(+HQtrr1l7|;b=J`#yVG%f-Ub5vLXPKx;S;<PvI%bd+j zXWnH}nXj3J+45P7`U9)cqT1N1YFa_PUHP*c{&Unpwo6k-t%CZB&8ZDcUrO(hzbyxV zy5tP^6t`OdW=T*(lna7dVq-zDlDMfLa1;9q0uM1&5QqR@d<D_kPntEJF->+pJH_qc z%Ao@6Pz`=)f{hIumKYi1a0}=`;PgURgB*_xITp@6h!!CXTAfbY4qC0Q19VzlYh#1i zY^pF;Sgqwnnk61IpoBFp8BJyfdi?<z9awD?s$4QNX^0Z$N<L|fRT-FrlevJ=fK?Kc z(d$5Vs8TsIV&n~W8*gasZYkyMwz7o}?s}2c$}V)eL$yo{N~i0)PoA0B9b&=o`1#{K z{^pU#=_kX&;rrk29Yt(vXWKR#Z2FQiF&Gp}4Mnz;!=0bB|K*+L@vt?R8y@ct@xJ~e zTlYUoBp!XteE^cq)tdx+XI0DVJ*A=VP|W52Sa{PLSo)9Zu|NPNbt-U$=Q^|VYI|^R xrOPyFN}Jv0mzK-cCTgVD0x9_-Sj<u9%(^aytCGHugo0)?zIP~^>{&lp@&^kH(Ov)m delta 521 zcmeB}#&~8j;{@gU3I+zo00stzu;kptg7X`H>jC*I7#LWblFLdI*#7_f!oXm=1t_nO zR*;_CHE}{Dkbi}Nfx93*vA6&zE&$}O0n!}lIhAP!<}2(N7+BvhFc{`#q$Z|_sTKcV zU@(sX%9~{X1=vrrZ~*yJfP9sV+>(lgcf$TZ0t)N^3T(;APfipJmJVlNu*d=OV{#KK z3K*MsmjU@FfP96##N5;~bLAC*{1*%iOlJ%7i%S-V>~m#cum<X9{9I6!TJY3Sdk+JH zr_012(Tp=EhcKpFD={zvH8U{EFffBzIzXBWs9lMHh2aBGLWw~E$YOdS{le&l$%p<A zCqF#+@btsy5C1+2P5!~CI$54cPmvL*Dgq3n7_h?0MNH9~&ol8baw>o<0|K4RPnb_L zx&uSwBM>vF18GMHX3zlAE)dM138YgXm_Z9jKZRfhZ3c!<CJ@Y^!@#hK%~X4{uaPsG zOi!MeTs*(cR|aloU?4Cs-1L=Dh0&AOSeP^FPJUuBXL5^WrXY)0jMzMJ7YQDT?O>nl ZZf3ILW(F$YvyIxEWvj=yd7fPs4*+_Li;@5U diff --git a/static/font/font/fontello.woff b/static/font/font/fontello.woff old mode 100755 new mode 100644 index 286c7d4dbdc73a5fd0019799366688dfea3bcabe..231c2c460bc3ea24df9adffb9ce13fcfd74db20b GIT binary patch delta 9629 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 TO@TaLMi<3j*e8tQlh7=DDj=2O delta 9451 zcmX|{WlWu2(}fQl+?^IXP@uRLE$$R|cXxNYDehXVP~6?!U5b_B?(R?=UY_L3x05S7 zYqHkt%-@~K*7>c4<1Q~Q4uS%`9|jo^`hWMg-|;vCfQPZIp#um6weXG!2m~WMS@Xnb z?B+rW0)ctoUD)rC!o9uTm^ql+zSk5$AlNt%2-zVbK2Foz(D^-!u<`Ce_&+erZ9L81 z<pBr;*#v=D?3g)=`7KNh-+NR4e)q7x!-4nN`QGBa2m%2#?;1q<4h8%O41$HNiw6iq z^Pe_&r#@%pZOg{q_}xh3|E_iZ15=q$-PX|K{b8DwcTM^qPywigc80d5@3rUmLEJ$g z=<(mbAY=~q&MqJj-8)d)?_B4pbc#7RnZ9S~r`~g3phQKeZ%`wN=}=t2oeK&R$RlHQ zW<;)60VnjbDvV2>3t5hfj;?PhC@7S<(wD@SalIFHL~{+<`vTxLFFUclCbyl*Z_23Z z{!~q>TOv{+Qb1nXSgBTbj9flZIsfhJxkFCg&xVslufs3C1?Oxs+iWA_&k0YSaqHI( zf79i9Qdh4p=lPr)r6#?BU#Iq6C%c(H=QQTi*))vOa4X!ST{#v^B5mC)YR5>Ph#ZD7 zhcc#e$7#$nj%^ulqv$GIHj{bIJU8Ntt^k$jmgA?lWv_=4-G0p`nc1YT^cK(>)a;tn zVw%(inp64J*=dGCGkpPjVZln-u;X~hrmlEw_VgB48VX<y1yl_{0bfIbOhbWALxEjG zK|n*{n}&k2hJvn!g1Lr*qlSXFhC=Y8c!pQMmz-$=e+B`i@7GzWN2jCYn^P5L%Y(nH zmM1FgmRo;0TMkveJ`9w2I<1%ZU3DMwkaqF-V(#S3H1!nkAH0GtO$y9BGK>ub!B`l> z8Lt9}K~UIe;5$&A4mcea@IsAKnNM2dyIZ?ku6on&n!ldm<6E6sy&ht|VM1ZPK@kY- z2Z5ueP@vg_{VCu+e4~@r`o<MusH#*B8>~tbp-UH8US8UtoCmA@*^$1beRwT9UrMX0 zW;DGb!ZZbW5%JimzD*PFXU27_Iq1bCu|le#X#ckDeARosV}I=$_;sFf{eju-)c!u} zdfi-?Uej8-DTr-^D++NVY7%N~&Aw^5QDw_llLx`di^alaI7v+?6D>&?UgdCO!*+fX zAR$7(4b}66Mc*cSMAc=253Fj(^6Ae>tny>OABpIJD($9-IV|U*9F;LQoa?i)(Y1B` zm}SizlSg12V)gqF$hJBnnhD|vMQzSd5!`TSG58`Q#UGq<e?N+wX7pKim@!g9hH^TE zVHcVgG3n^p{<qqfUxzxKI;G766!f9O1zPl6!l&T&0@DLL5`sFHdruzAYY*$^yHk}Q zp3_TLn*C88J1nIM%CZFR_{w`G?h?+Zdqf_OPZoWMoCKXVz~}L?_)7mi@{%x{hCTUA z?(KXfG?MJRwl;D^?O$UHy@)zzL!b9{nfuTy#=WUSS>}4M8s;RYehB9b7$RFIR_o?8 z`})_$4xWHK$`a{PN~d{=>()l8W4Lg61uO>2ySi++@lZOk5B%@<eQAyn`jsyT>F(WL zM8@!;PZwAi03#{lm8L*7nZwF9yAHyvW@a?7I=TL_m3<A^Ph?(2%-{9ezgD*r8xe8f zEbz#vn>a^x)xy{%?Z!MRM&Q-n&v&Eq?O#JC<fS-f+htrHVm?`R2zldrIjY*<+i)=+ zKFwk=c%DkF8WHmQ;aWRuQ{PC7s#IVbEixs@XW~x_u&YiSHBYi{ETNo!<qp>lm8J0y zzMTF!lNRm%wdSn2$=!xMR@;;XMUW-q8@iyg@)Sq7>z~DTza6QhU4=873{@UvId}>( zyg}cA$@Irrbljvow;uY+CO<eT_az7DI%Xs48LWSYMHN5Jqhi#L?El~@?>io{r=oIU zjzcq202<YcmS31O=3whqLy(VzcEMeqJ?C8pjokS4ngjMm?7_#meoI1{*@Bh7@bMos zb-L6ze$Q1eFP=7xC=r@FrAN><xU$3Zvn(Y_6etPBu!zw*Qwyt5arFxhoYO1A`kAL; zgxX`^l7EY~4@0YWSwxhzJRMVm&(<m}{Ru9}0Fu>=8<mT*y>J!lPEtn|Mbqk=9>GD7 zSwm{P71}j%8t$LiVvgd(^MhhYf^g?*&JR{tj<B@8fzo6zJGO0`g2PRA_QQx3A8&#u znBHcu+y?&6ePF<r$MxwvReu%BnaWB1v~hg(9W%Xk7k$?>D>3VtN&bfSs>oWx&2-dT z3Fv&{G)F7f;bU_;;ckX+dRc4eR2b%L{(QrYcsJ|5qRxC(T5{{g*UGX&$o-hB$)Yl= zCRC!odSgP^uk9w0ryFU8wqixnW^Zq+I-e<pbGO`JJx?M?T!UHnb<t$}M9>w1l;W}m zwaQ&iW|k;{KvI;-ARsVRi2nLod&vs1AE5VpyKNKhrT}9o%lLoDdTmUv$-@-0JPiB; zDsKFOVlcxY!i{!en6^XB(7&2Twayo=FZmCB(f-ueXKSZ}y>n~hQauKu17*D)(evdl zV}~gNQ1oqlEfBRosc7hf&wNrJLPsB&eqpll@j2J7DV)f_<q?J1ckr*Mh(1dv0U+@* zjGWxnO77Z{TVVw0V0XksXBb6iE~C^w8pIVApSKB~M%xxsUw!+pxX~67fq@eRV1IAY zNdJh)D(*_-?WH|SxaQHY`Y?nC9g=vc*tM8qFD>!xsIO|{<MxSY^c#=>wo}{{HrS@c zw7rrK`klAa6+TZQ%Q?F9XY9VyfSoF$+&#Okv2<C^$P{)fu9Y)q8JX)Za@>w(l%pqh zVwqh%z6~=%*W2hzH4*$xDutPV(=#*5;)<pMHi9JCg(e@TtId%Si9<i?kJfa>Q0yE~ zqexx+Yb2}<-YC|=xpN6pf(=ML{~Ad(eyTSWus2B7v3YNWly>e$)V6kL0uAgz3P%-C z#zx6m=AQN5VcHzRu+ZhBxRtb_sh^qyw5VaR6No>ds(znT5R%EYOAtrmI5W|z?O1Ft ztS7VM781nF`A8Qkoq1za=}wdNtxRjdZN-Req(@vuW?xM>1T9Qk45w>50Q`hOC^#=) zwbtQ%Yq<(zfm26W?Bc7u3xq*Rt6np!R$GW1ru?{1`87`HuEVgHn-@9=GW9x^|N4eR z^bU+G062tFl_Eg5Ixt@!Sd`HXE844U@d34++5V0(ob#TvPE&gP5?tE%LF)S^KRN%F z`0yTCK+*M7HfiNFjPYf|BT0SpEg%0n<8!dx!M_G=9^VV$7rQKU;B_j6&Hd5m_U^LQ zzNm^g%eBJq)X`CGr7yWUMvI4USy_N1*qda5t9p&35hgiK%z4HWhO@XCMv~wgvwF{` z%+gBb0_Bx54auv$+1P(onoLc7_MhGEs_L|;j#|#rRFqCbFFi^cUdLaXO$UhYEy)^k zl}aSUch`#Sg4d@ifT_84?XENLwi?5-hDsoW;AhGGn%=@+tq9{jwO`U!_YTww#S(*A zOXSuLH2i|7-~6y@4$5^-4jnOC`i$JPZLNF7rx3R?p#8?;G8%^BNWayt^k<^6)JH(8 z2wemf%Tq`x^2VtbN^TGJ<$UkdDI7p`4dTh24m+!f0i`ul0D|RpI<92Piwg=C*R&4~ zH2Wc#<I`qpeW*MLPa*Co+bLDePKP&Wl7d&GihpUOaU~SQelrxDB<1PiQkxFM+k_9{ zqh3#+<~bGnJzSlnSxROIZ?^=}9zCnBM(M0>+6ukWzA!^Jt2p-uqtt80Pvl^VfL^)k zs%l_tVpb~?D03769!JuCsO;oPW4chmVH%~`K)WOje8QWLPUXjjC5KUB*^yb8R21OW zoJk`^z}^jonJL<|t1n8meX<q3*nDeCZbVH)=JV&{*B$fSwyt`eme%*%eAu4kcRjh5 z=Y8f0HNQJw^&R>*B1<^B>xA|;DhAITrY)Wxp_L8-mdPq3Fw#VxZ$^i;JDfT_Aq}n2 z%?QKxsyYZoVUf@fYXSW^qv+c1N3FWf$lF!3H<zr(Dvqb3+GYCng-!yyi^B)lE(7>^ zZ0Zdt{@Wi+?$EckYm^=g7W%$Vj|`Y@(8eT`gWIw8rT-EM&wS<_Uu4rujvtKyN8b-! z?K!f*3!~(p=tp>uoi`u)usacB55L>U`Q=`B(#_T4w~VFdA^Gzo{CUE4XZ8e!q}u0% zCJDrOzhMX#A;$d5Pg{@X!9BwYzTRm)0$C(Y_Prcb#b}72p!MCUFwAjf*LqN6icE8t zUy9{fFVB<+mjrI{7H`OFTo>0Hee;86<uM-+$wOjFiBrJ=^#fA%2IEE0ffcc3oUq53 z_~!WX@+jY~jNQ4#w?+uZ2hT7;=wl2n!);z9cCbY+t20@}FPzIrx?hqDGCsL`*;~=e zO>5urcA(<VgU>Si<4fefn1S;UoQ1uPJyV{Nv>??O?%Re}`J>q+93+v)$`LbYxf%k@ zYb&OE<CstvuQ(vk0EyjJ_hP-1sSTNy1TA4C;N=T1e2!sXHE<zI<>fCuo{*&&ijNYk zp|e60in=(KeYm?i={9cVmzRf!Kao%7ZmreO83=V&=C=Ajk<B4@z&(hIM(J)fv*fns z^SNOm^(lx~(C&vpw#j1qxr+?eYm5NIacMQ_0JZWRXOmvV9OMJ<I8`RqjV3v%kJ?&9 z1V^h2>Gy3b!-erH>y%!c|4<p|REJC?UbM#&!&#_0gO~{EQMx}+B;1y&;JITBx}(z= zwf3<v=yx7>jyA=tup}Ie$L=}hJ*@Q)6H9cewp7ubBOk~O<&HkGYtN}9GtvS{c*J^N zYTQn&bmD(S;_7}pN*?8P-;}@%WbfZt(;^u`5^3zdC&OWHMFnMweW%H9WzGyYqnnP4 zkQ1rLrXm2TTN0qKksQQs_anvN^?7D~hpA=scUPX6Mdt%}o}U4)?-Ca`$M7lgSK&!T zNA_Pm_~7ym6d@~b&(}}rpVNS5H{6F4wwR%S^WOC<366F<8JXyEgLTt&L-T3+_U=qG z+AGQsacGHfa{*HUVKw&g#%e{E9})BeTB+Z7KzafAo3I{uod~f#`v#DeXouG?|MVT@ ziw^|t0;8v*PhAUpB`)wUNZP^cft-dkIF|%dt{fpe<Nf<pcKk1vE8+k}<9ULFzxmtw zP<9PV#+Qvc{|f7;H>$8hOM6NyQx{*ho(2&a<zR7wB4pJp)2|4`W|%c-<l>)7e)U5> z7vhY>|BK=5*C0&rZ&by6Qdq{3^D3o{=KmoM8NKDlDVPqeCEl-GS^5|2b9Hkg899Wp z9*TT%zOn4UV`DC0VqXW?*Vxwzn5`Rhjgg3dEQ!j7zF6-c%4x(;5KS7^1?O(%?;q@{ ztPpW?l?jd~*;f2e9s?&_#OG4DF)diKSL8IB$Eo7Mb1BKUM`2WaLW-jj>x}(5h%FqE zA^sMe!GZGei0wS?IOtK?Md~3yUC6bBm7g?r)u`%$C<)UwZfpz4Q;`tK8Y8=oiP31- z*;B0$)NN74C$x?UA@43MP2O>vo#x$_9@|$bl6-O5@GrFr6?9iAcpcS1=63Y+PZ@C* zk<;mS#80Rd;etKEB~+i$Gk_U!DTwOW_->X})*Or^hhJn`RwEM}MXERdM@w+W0YPPA zra8{xhXaWmtamQ}#WPDGai~&?mfOpmEw4$EEty3X4Lv8hZ7~(?a-iW#+hQ1|O81d~ z9I;tJ{5!%8$F!*G)LXtihJzW)k9km~7KT$2(MU(`AV%Xf=0!V5)O=oz*yA(@!h64g z&iHz0cw6%ZQmo9|W)kDV6Z0B#RozJVW=UHLLky*e5Do!wRVbn(RBApS;8C9{IowoS z80vhfM*7KSW8qYCA6yMqEXk{a*J0rjMOAeYV-IF@yhfhwUW;?3g<cgwgc`^HLH4~v zirD3`CkFP<OV}rRWXNPiGDi-rlnN&Q;oWASN{O_H9gU>Z7ubGTqQFm<89M+pCp*I@ zc9AWxCuj`d^*;lnA3?X_Ss+iF7^6oNIOZUWIIE~m-^SI~Ku&aEf<z^>(bI_pvK{Ch z4H0j^-&Bgj_<hjkZNH;^PILNelTD2{+{`>R9B^?B3K!WT#vSr^N>G}?9Z%2@q|&&A zGx|o-vzL(}Z+ApZt2&F*$9n$s3$eO8_S6`Lkix=vK={`X`qZ$j4p~g@pcEIzAu=?l z3`TtD#LLl&$Xd>8O13jn?4j_bA^QomFXnh6ox`k>$`87qT${Sx&XtK8Q06h#6^OcD z*h`8d#I(UhW*@0>V2en5bzodt8Bui9a)bpFyFcIpqW*StSgQ!i=uScgc!E%pxNi;^ zksQ)mt|f4?MBqnzsJ?%W3fkOSnkBiMbfO5R^sZtl8<9`A$mR?Te57E5N1K~jTpaF7 zG0{{d0-QQFKB((BlAM>wZRYr{DW%+Y5vjQ9)F+2O8b2=mF%?jdT5^jO4~jn{p>L5u zA(<ipHzbtvig8eOKamF5d_#n_!SkSfdPOn?7}|}SYO)F*lB3rJTQ+l~PYER1#Vs^b z1Hus$Q?t2W>$8d>1-j^jP<>mh`JRpyRT0>^$e4?!hg$G|3`x|&(n(ce`J1{Umow@m z)NR?b#8Zc{!9s<lid;yVbnQ>kLrvwHb-0B9NqRtv(y!a|W$lz+2dg`8`F6C`2cXe) z_b<+~tCf4{>&sDoH0P9?&Xe^H=^L2aI?gqhcvZV@$)TfV^D?&v?oNjJ2eI9#h)KYR z>`hqlO1RsYQk+xaM<n-{tsv)l>kU@rY+*S?RhLhw?v^AKu$Lt#sD5M*mJb#*^7wJU zw^menIe!tyFI!qIw7sTKx-7~(#c69$s;V<2A|h5AOMI;bee<WO@i97{><Ju39PMWL z&WFVCE;D~GL38qPFw(e~I|M&<l0qwWMooG#UB0t^#6(<nn}G-!ipE8nYREGTIoNv{ zb?NskG7BvdZVu?c5KiLMrR8#Bj`r>VU&d8r8Zs>Nt=boGU~6?gg?>tKVl2$ir0~P% zv-4m%oY+FdUCS?nc>TWU+f$Wl(~)60bL`{ctF)@?)Vgaopga_ik%I1^St8z!66;My zKejX!3%@n(vy>uX&~RZpyI5*8r@G&nA=;DemUw%;Hs!CoT~yCpMGDNa{xmEC?6+(1 z%H84L>)^Wgv+k%J3zZF6^^J)XQxhaoN*P5*XBU=RUt|ask_}s3VUR<Q|JxL##C8%N z3MlpWq9UhA?e7rYR^_@Rhj<E(KN37c*uviONK~|)jImv^&|U&<3#S>JK4{l@?M6_7 z`C3fUvBka>Hwq<G?8ToA4PTT3{rb7%H##kta^16igq}>fIqc*(bbS092>7g~Q&;1n z6wifj+7&1)eO%_E7hTqOM~|cfOq;7Re=xMt?H(&0v+)H2-0LU{q+`|PXS28m_9KcS za$cuwbDYVWqFq!rc6{(}Inmj^eprpZAW~h%)RkT|gB-J+2!&!Z&1ZQ6AK|2mq<S`N zb6(9zob$RL;@y9@E-15Sz^G%%35qz+ehO3F62CT5z|;wNmW^Pf?nXPYt5v{i+(I8- z{x(Ipq!7rjm^kiRyXC^rt6@%i77`G0hNvYXgr6S3X!?gBn@Wp5TR!v7!~#BtX22au zBJy}sPCEYfE+3*fU=-gDXh7PjIhNWO&uUY6Bu=-cw<1{Bd~09Lv0|A?A<Y{4&tyI{ zn9H}D6B;MQ+lJ@hO!)(2@W~k`TQ8qQ$jVY`VHrXnK|0Iu2hTx6IL{`1(j!+zrOns$ zvN)?hOh=zFu~+09x^rJGSZs<SYf@8+^Rm^zk4U(|8zLUl=k27x4Yg{-CfjAN+*Rha zVUYV6O4@y}L`JthWw#31@RJ{2y<zFkgI%y~HPiHRda+y&c?#mi!NsaS_;x)v97T8v zt&$IAWGzSUKz|AS79B0oYda%0ET!YVEV_<y4$j#E+;)x0wo#vJgyIS_j}qRSflp`o zS;+wKHd9=Y{`VUwDy~BoN~AC$496a&#S42O=XMQWQ_8N0PYrpw&8s0Z_oRoD=SsX_ zda>1C@Hrnzyeph*_%H||-svFx8n`FS`e=V7Ve3s<Nx`f5>sgwr&5$$0=Z@Ph^lw<> z(=gIn?eM>?%O3)~bda701W_RY<hl>b`fceng{=56%Bjx4aEJ>FzTjEu<U_k)$M=4O zyX6dsY@kZhRxEAP7YeE-@lW6VW9Xp_+3~^`rv<q%&|qD=&YFA*$=Jj3vKn2uf_QLy z)2i<v$0+z6b@WO9e);<jJv?*)W>H<vy>znzf>4xIncH-gB$`ZaIxR4e*`^+A{7RBd ziH>TRtrsw`HE$7mZ4=O;hwQ>VJo<2N5&pr(Szs?!LcO1?UxtF%DS3@ERf!NYPn<&M zlI|Ka?>Ci|bi|MI_O-A--h7a%0uJbtXKYM2qz|_)U_$LS6URHz$spnyndH#+GuWu% znJJqh@UUtQ?}wlK>dG{@94J4SMBpj20$qNOl`6&nxVNe8si3&@1|)}}>`dhuEWHqE z2?$rc7ekDooOqIx<MOGyJ-;3SYx8Xr|MCwJUZbe;#Tx90weeGT`Eq@2y-MfxH=8wf zYiqZYrMF;sv{*0Su*0Q`lTDyB&l+p7&US2zvQIkYqoN{42=-&knX-EMnCrahwi@lj zi1%OM5xI3Dr$%kQ@)WbHx8cZu{3Mwm-mpK45@bz~5UV#S+h@oENkv9N(*4c;k@zI5 z@&T%5GNu;oAnsaNCjg6de%5u^RT_GikZwmK;ewZ}Om3TB$_g?0DihGnk>b8TJ=Oj^ zZzJHbkqJ(h;Nh9I$!1qUK~6L$P4~9DBX$KSNhpRYBi(oB)-UhLyS#T8OL-%cl%>?v z!I&(+BpI~{>k>=G^Ol=_E&iFo3#djY<#{#nns;uoc~O!qZB^F-B-FpI)$WG0)=UTn zG3+2Pd3k%{@+d{RkwYPq6RE*Z2_1-%(5Ls;B9p;=e7tQZlalnpkfv@(EGaF>-FXB) zKIS^VwY75Y;1yZ#DQGw9jNs99AaE{Qz&onHq<;Tbti^WH@vGL~%u}?+h^nRucKI2l zX7Z67S#9xeo6B{;%-OOspocg@@TdoWcb@^G!1&elOOJU-uLD-whX9JePYTM*&QL_P zf(EL}ux*=ur<vyS2lLf(1#KcBiFi+d?07InSZ6CMA(Tn|G&wgV7(K<wGs6IWBDj~u z;wxbUt}PtXK4s73a?hj0rG-hZU(dd_c+Ke=gPFptF_l|Y=OY<vR$G~SA4jzVf26Pq zgC%3%^qt&&5aMnbzN6C@a$Y%sazpit>cFm<-;S!*1$J=}69k!20r^_-^?Ex1&*Vzn zD8)6aoMpbwv@^QVIJ0#NixQ@F`|?%?+$_Dh9liW=4jr&d$tAilX6s{S`7eYQAqbC^ z%0R^biVTX0owaJ)d?56h_bRu*MzJDg?G&pSEgBz@KyFcXTVmmefL6+@$bhU$((C8W z!Bia9HbhT75M$#(W?Pmx!VMLOBiy%bh<yJzxz@$CIOGz@9Ide2KFwPtcK74Kt-5*E zEU_s_^s}Sv`vz#e1g1%v!J^!RBdNVj-Zn(@J^bR>PqS)oAl6!5WtZo&zm=zuGrJP+ zhn|T#I5k?g=w4l#<y5gctAp<s%g7p2tL0-a6WvI@R@}+4wAEn)F~0#)!?M4r77h64 z?Xgb{k<mt67*K2;6x6>?;~}!(>&${V^SMnR7(H<~Q<+42;LP-ZL4Sww>rAJl418yz zy|UpF22>HGmy}qN=N=Je$1#Jcb+6?m589MLR^aC8Vn?~l=j*!nJ^E5>5Q$(@CbIOS z?KqlcPf5qcUna7fu_EApT6SnK6mnw8gb&}U)*n=RxDYwSF)Pq~ob=ICT`mQ$wN)}X zP^x=+c{#5mI5E+~dN0ZI<1cI;j4tVuf}d5hlQg%zi|t`oC@ML*mlRBjxHfo%B~g=D z4i!VFA`?|NW1f*Kx0<uuiWRWUV;mbXYuY&xqM3YcWRzJpZleHYnsFUD@rcQRSaKtO zfheN|jcm!3@SNJy0Ye5+Oa88*rkL1hl47dd@41AHrEgH`(Gx;pD6WJTeQW)@BcW7G zR9?&QaBZKS7ks5k1qz7np}7uwdMtgbXPCW0HuR~yQsm_r&t?0O6Wg-ZxI9@+9v$3^ zjQPK~I62KIf6)e{Ik(h9a2F+QQ`ce+KwHeB<<l@;bw$<Krj`DdVZ=Kb*wYF{AHE)K z?>ZG8n6$FC{#l!sgksup{c=6B_7KHLna_{9IKlSgxxVPEh%opI)c(Ef6o+srFj(eP z_#JGH05h>reYCv+x7N-W!Frr`54to>H6IbofkwMlNjn85o2Qc)zq7Cyt$7q-%y#Jz zDDVc>$4%$oD2|GaL%_<kS_`5k^)u3;P4-nJHOk^I`}`0JpHoLan3!`(y_H+skBHx9 zga;{|h^5{C!X;wfigsTLB`9Tnn?cLGUknka2mAgcZiagz<Y5XPji87j-r6arE{_)x zY?a&-@el$sPKwkqHA2hj;sw7`RO7)WA6Y~$Pb+jQXu`1)SaK$G#8M3<6rV@W7Y%PZ z8vEqozc#aon8C-Nc$d^wQLPdxo0y+@W(v4N7~pJMzFap_LPOYXrCaB|vvmg=Jc?l? zn^1kUBYE~Pqd0;!-xFblm9R`MgV1s6Q3+EOV15TIgRHQkvjz*$s{BJA;>M%d1$Ns< z_S0MV=0=?wenUTi<-=))h7E}{q;-_jV3Q?4_A>n{QV%wA(ZRMUHutiZPvMgJuXfFJ zMxr<ApSmgQ=6O#e7jKys`Aa<f)-)aaudlaGI2ubDH`S&ZVmPF-bB2?H9EqGz_%v)| z4ut`UH=iC=s<4(fI0JQFdpAd*+*-AgDEh;}u$uG_cR|S1OxN${(L4j&@o?^++oq-m zXz}yy?m%iDZhv1jHC}>}t7Bt6*}_3kq9C8l0?*0RSf+R<k<0xxF<iE}1(#Im@!aj= zY4BQuV!LG%YQz2~GeOmSf(Te`uWgR6n=8N{1|(XbrAqv~((6SCcp1~Pub!;C4NOax zv~MM!!6clx6QaO~np`h4O&0xKPwc*BITTSpsEi4euh$gdDp<=xuAyRQLZ-|ow$OA2 zUvu~HyqgQj^LE2i*M;w-qP{6mvx?6d##<p~!9-gNel!!?9;J87r?Hs>$<7qXOaZRe z9sRl|=GPp#Z*_!<1AUzJe-*5e-vnLD!)~ccIva_XkCrMdxRf@Tjc1(<M{+yQeAHXX z7w51V``p+9>X6l5GL5aVCG4zRa1bN*4=41q-;8?32U*7zifSF;Cb_=v5mM{_@Vg&% zJf|d}-MZ^~GWET;RTd~nzmVKc=>oK}`gv}f2#$aFN2<LjdbHZH>lq<-BfJ8uUZ=yD z5%wNKW+>a`J}RP)_IGvTC-F-nFPe5%B{BXO?HIdC_{Jz~qNd}2r*6#)*G*nUe(&%5 zK?H&_!XA7J0dd%vf0Fw~AvrTu@~k&6MJQ4&*-myV4#$rT*5Yca5z=^fE`WQ%^74uX zg$V&d;@1PA*twk$vJuq+Ndr55fMwlV*^!Ju#%j~cUTA>eOwv-rk;X{lg4Y!PR0}0D z?UffeiI$i(zM$G~zZ;&=JSw;AJnaY!>HRs7_}IDDAHGuS<#VfMDVETZBbQYLIGvkx zO}dY5#EUYWJUt)FUr}{F01FIRHp>U~uWGpvzbfCEqn$s~qkmlJIA`uz=sFPpb%88< zB!%BMH2&KZFflLyZDqDAw0QWXSD~!@X7c}p!s$z?VtDgb^_HkXn>zDd2Mz9X95skO z02$-|GcnKl!`<CV|K5(@Ch2ie1Tk^4kwJN4a0~A}b^Us}yXg`7kug%mAd-Ro_|I>X zM2NWXm+EhCL%DBn0tjDz85w{KtGO_~utOaVzX4=cZvbpM;#S}edCnDS-B|Y(kfskk z9y0p<5}6wE8SaZR#-dJ`A4p!8g(XpjRuK~hPX{j(U-SdYhb9oz`y>o?wY14lz@pP% zW(*f|+Xn+q!Cv2Bo=ps<3z1r0>&W4Rsh(OO_Jm<A^(R4t7GGZGRymiL`m+GnM72;j z5(+y({ec6#_K8DGTXX1Bb2lZ)1{ujFOXdbm<|en^2BqF6Qq?7#{UzG@B^1Oln$V}$ z+^0v~!G|stM?Ar7#F8$ARdllrC~)|x%R863^__aog~IO68&A@M+cuv#tuarwhWMn% z;dq!CGcQj0^heZ)@~t+i2~X7^P33t-;S1vINX5RVyq0s-@6^O)C2ddb=%s%uxBS5+ z<Jcpjrm}}FNHQn_%3+kKw6!aYNo!oD3q9t%4Nh46S9<rfCjXwa05+{OEp0hq>mOu8 zc*yB<;!jQLjup2*6KP>ZN$ImHg-v5wyw6g-GYXzgkImXdm2>z)iNT|=xV1_|Eh>6e o1a6K}&Jd3^7VB2Mk93K6{Pi?(`(snN_sGI55ecBgd<LKY0q2?&j{pDw diff --git a/static/font/font/fontello.woff2 b/static/font/font/fontello.woff2 old mode 100755 new mode 100644 index 5e5a3a2c42e51bd751ebc491cbd92615a4081c2d..bf84b560808b374b95d17f03678527246b28944d GIT binary patch literal 10044 zcmV-CC&SoxPew8T0RR9104F>E4*&oF080n}04Cx90RR9100000000000000000000 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 SA<wWgkgE%HqZ0-X146Jj;C4*_ literal 9856 zcmV-`CV$y?Pew8T0RR91049I{4*&oF07=XM045~>0RR9100000000000000000000 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 From fd66afe1e5917405d3e99e558432212f06a03e71 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Mon, 29 Jul 2019 00:10:43 +0300 Subject: [PATCH 15/81] linting --- src/components/emoji-input/emoji-input.js | 2 +- src/components/emoji-input/emoji-input.vue | 16 ++--- src/components/emoji-picker/emoji-picker.vue | 71 +++++++++++++------ .../post_status_form/post_status_form.vue | 4 +- 4 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji-input/emoji-input.js index 1c49c710..f751f6a0 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji-input/emoji-input.js @@ -67,7 +67,7 @@ const EmojiInput = { caret: 0, focused: false, blurTimeout: null, - showPicker: false, + showPicker: false } }, components: { diff --git a/src/components/emoji-input/emoji-input.vue b/src/components/emoji-input/emoji-input.vue index 605882e8..05418657 100644 --- a/src/components/emoji-input/emoji-input.vue +++ b/src/components/emoji-input/emoji-input.vue @@ -1,24 +1,24 @@ <template> -<div - class="emoji-input" - v-click-outside="onClickOutside" + <div + v-click-outside="onClickOutside" + class="emoji-input" > <slot /> <template v-if="emojiPicker"> <div - @click.prevent="togglePicker" class="emoji-picker-icon" :class="pickerIconBottom ? 'picker-icon-bottom': 'picker-icon-right'" - > - <i class="icon-smile"></i> + @click.prevent="togglePicker" + > + <i class="icon-smile" /> </div> <EmojiPicker v-if="emojiPicker" - :class="{ hide: !showPicker }" ref="picker" + :class="{ hide: !showPicker }" class="emoji-picker-panel" @emoji="insert" - /> + /> </template> <div ref="panel" diff --git a/src/components/emoji-picker/emoji-picker.vue b/src/components/emoji-picker/emoji-picker.vue index ea93e6fc..ec48fc45 100644 --- a/src/components/emoji-picker/emoji-picker.vue +++ b/src/components/emoji-picker/emoji-picker.vue @@ -1,31 +1,58 @@ <template> -<div class="emoji-dropdown-menu panel panel-default"> - <div class="panel-heading emoji-tabs"> - <span class="emoji-tabs-item" :class="{'active': activeGroup === key}" v-for="(value, key) in emojis" :key="key" :title="value.text" @click.prevent="highlight(key)"> - <i :class="value.icon"></i> - </span> - </div> - <div class="panel-body emoji-dropdown-menu-content"> - <div class="emoji-search"> - <input type="text" class="form-control" v-model="keyword" /> + <div class="emoji-dropdown-menu panel panel-default"> + <div class="panel-heading emoji-tabs"> + <span + v-for="(value, key) in emojis" + :key="key" + class="emoji-tabs-item" + :class="{'active': activeGroup === key}" + :title="value.text" + @click.prevent="highlight(key)" + > + <i :class="value.icon" /> + </span> </div> - <div class="emoji-groups" ref="emoji-groups" @scroll="scrolledGroup"> - <div v-for="(value, key) in emojis" :key="key" class="emoji-group"> - <h6 class="emoji-group-title" :ref="'group-' + key">{{value.text}}</h6> - <span - v-for="emoji in value.emojis" - :key="key + emoji.displayText" - :title="emoji.displayText" - class="emoji-item" - @click="onEmoji(emoji)" + <div class="panel-body emoji-dropdown-menu-content"> + <div class="emoji-search"> + <input + v-model="keyword" + type="text" + class="form-control" + > + </div> + <div + ref="emoji-groups" + class="emoji-groups" + @scroll="scrolledGroup" + > + <div + v-for="(value, key) in emojis" + :key="key" + class="emoji-group" + > + <h6 + :ref="'group-' + key" + class="emoji-group-title" > - <span v-if="!emoji.imageUrl">{{emoji.replacement}}</span> - <img :src="emoji.imageUrl" v-else> - </span> + {{ value.text }} + </h6> + <span + v-for="emoji in value.emojis" + :key="key + emoji.displayText" + :title="emoji.displayText" + class="emoji-item" + @click="onEmoji(emoji)" + > + <span v-if="!emoji.imageUrl">{{ emoji.replacement }}</span> + <img + v-else + :src="emoji.imageUrl" + > + </span> + </div> </div> </div> </div> -</div> </template> <script src="./emoji-picker.js"></script> diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 0b3db30d..e691acad 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -61,7 +61,7 @@ <EmojiInput v-if="newStatus.spoilerText || alwaysShowSubject" v-model="newStatus.spoilerText" - emojiPicker + emoji-picker :suggest="emojiSuggestor" class="form-control" > @@ -76,7 +76,7 @@ <EmojiInput v-model="newStatus.status" :suggest="emojiUserSuggestor" - emojiPicker + emoji-picker class="form-control main-input" > <textarea From 920bd05081903c52a2521da5ea86714dfc82b452 Mon Sep 17 00:00:00 2001 From: Exilat <quentinantonin@free.fr> Date: Sat, 3 Aug 2019 13:55:05 +0000 Subject: [PATCH 16/81] Update for Interactions, new search, sticker picker, update copy. --- src/i18n/oc.json | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/i18n/oc.json b/src/i18n/oc.json index 6100a4d2..2b2bd88a 100644 --- a/src/i18n/oc.json +++ b/src/i18n/oc.json @@ -65,6 +65,7 @@ "timeline": "Flux d’actualitat", "twkn": "Lo malhum conegut", "user_search": "Cèrca d’utilizaires", + "search": "Cercar", "who_to_follow": "Qual seguir", "preferences": "Preferéncias" }, @@ -91,7 +92,15 @@ "expires_in": "Lo sondatge s’acabarà {0}", "expired": "Sondatge acabat {0}", "not_enough_options": "I a pas pro d’opcions" - }, + }, + "stickers": { + "add_sticker": "Add Sticker" + }, + "interactions": { + "favs_repeats": "Repeticions e favorits", + "follows": "Nòus seguidors", + "load_older": "Cargar d’interaccions anterioras" + }, "post_status": { "new_status": "Publicar d’estatuts novèls", "account_not_locked_warning": "Vòstre compte es pas {0}. Qual que siá pòt vos seguir per veire vòstras publicacions destinadas pas qu’a vòstres seguidors.", @@ -269,7 +278,7 @@ "streaming": "Activar lo cargament automatic dels novèls estatus en anar amont", "text": "Tèxte", "theme": "Tèma", - "theme_help_v2_1": "You can also override certain component's colors and opacity by toggling the checkbox, use \"Clear all\" button to clear all overrides.", + "theme_help_v2_1": "Podètz tanben remplaçar la color d’unes compausants en clicant la case, utilizatz lo boton \"O escafar tot\" per escafar totes las subrecargadas.", "theme_help_v2_2": "Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.", "theme_help": "Emplegatz los còdis de color hex (#rrggbb) per personalizar vòstre tèma de color.", "tooltipRadius": "Astúcias/alèrtas", @@ -280,12 +289,12 @@ "true": "òc" }, "notifications": "Notificacions", - "notification_setting": "Receber las notificacions de :", + "notification_setting": "Recebre las notificacions de :", "notification_setting_follows": "Utilizaires que seguissètz", "notification_setting_non_follows": "Utilizaires que seguissètz pas", "notification_setting_followers": "Utilizaires que vos seguisson", "notification_setting_non_followers": "Utilizaires que vos seguisson pas", - "notification_mutes": "Per receber pas mai d’un utilizaire en particular, botatz-lo en silenci.", + "notification_mutes": "Per recebre pas mai d’un utilizaire en particular, botatz-lo en silenci.", "notification_blocks": "Blocar un utilizaire arrèsta totas las notificacions tan coma quitar de los seguir.", "enable_web_push_notifications": "Activar las notificacions web push", "style": { @@ -477,6 +486,8 @@ "per_day": "per jorn", "remote_follow": "Seguir a distància", "statuses": "Estatuts", + "subscribe": "S’abonar", + "unsubscribe": "Se desabonar", "unblock": "Desblocar", "unblock_progress": "Desblocatge...", "block_progress": "Blocatge...", @@ -532,5 +543,12 @@ "GiB": "Gio", "TiB": "Tio" } + }, + "search": { + "people": "Gent", + "hashtags": "Etiquetas", + "person_talking": "{count} persona ne parla", + "people_talking": "{count} personas ne parlan", + "no_results": "Cap de resultats" } } \ No newline at end of file From 39106dc5450d4a927848477764bed2e31fe435c4 Mon Sep 17 00:00:00 2001 From: Exilat <quentinantonin@free.fr> Date: Sat, 3 Aug 2019 14:04:49 +0000 Subject: [PATCH 17/81] Update oc.json --- src/i18n/oc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/oc.json b/src/i18n/oc.json index 2b2bd88a..54f42294 100644 --- a/src/i18n/oc.json +++ b/src/i18n/oc.json @@ -94,7 +94,7 @@ "not_enough_options": "I a pas pro d’opcions" }, "stickers": { - "add_sticker": "Add Sticker" + "add_sticker": "Ajustar un pegasolet" }, "interactions": { "favs_repeats": "Repeticions e favorits", From 036882d27c22d768782c208a12625116ddc6ae7e Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Mon, 12 Aug 2019 13:18:37 +0300 Subject: [PATCH 18/81] rename for consistency --- .../emoji-input.js => emoji_input/emoji_input.js} | 2 +- .../emoji-input.vue => emoji_input/emoji_input.vue} | 2 +- src/components/{emoji-input => emoji_input}/suggestor.js | 0 .../emoji-picker.js => emoji_picker/emoji_picker.js} | 0 .../emoji-picker.vue => emoji_picker/emoji_picker.vue} | 2 +- src/components/post_status_form/post_status_form.js | 4 ++-- src/components/user_settings/user_settings.js | 4 ++-- 7 files changed, 7 insertions(+), 7 deletions(-) rename src/components/{emoji-input/emoji-input.js => emoji_input/emoji_input.js} (99%) rename src/components/{emoji-input/emoji-input.vue => emoji_input/emoji_input.vue} (98%) rename src/components/{emoji-input => emoji_input}/suggestor.js (100%) rename src/components/{emoji-picker/emoji-picker.js => emoji_picker/emoji_picker.js} (100%) rename src/components/{emoji-picker/emoji-picker.vue => emoji_picker/emoji_picker.vue} (98%) diff --git a/src/components/emoji-input/emoji-input.js b/src/components/emoji_input/emoji_input.js similarity index 99% rename from src/components/emoji-input/emoji-input.js rename to src/components/emoji_input/emoji_input.js index f751f6a0..5a9d1406 100644 --- a/src/components/emoji-input/emoji-input.js +++ b/src/components/emoji_input/emoji_input.js @@ -1,5 +1,5 @@ import Completion from '../../services/completion/completion.js' -import EmojiPicker from '../emoji-picker/emoji-picker.vue' +import EmojiPicker from '../emoji_picker/emoji_picker.vue' import { take } from 'lodash' /** diff --git a/src/components/emoji-input/emoji-input.vue b/src/components/emoji_input/emoji_input.vue similarity index 98% rename from src/components/emoji-input/emoji-input.vue rename to src/components/emoji_input/emoji_input.vue index 05418657..3ca12af1 100644 --- a/src/components/emoji-input/emoji-input.vue +++ b/src/components/emoji_input/emoji_input.vue @@ -50,7 +50,7 @@ </div> </template> -<script src="./emoji-input.js"></script> +<script src="./emoji_input.js"></script> <style lang="scss"> @import '../../_variables.scss'; diff --git a/src/components/emoji-input/suggestor.js b/src/components/emoji_input/suggestor.js similarity index 100% rename from src/components/emoji-input/suggestor.js rename to src/components/emoji_input/suggestor.js diff --git a/src/components/emoji-picker/emoji-picker.js b/src/components/emoji_picker/emoji_picker.js similarity index 100% rename from src/components/emoji-picker/emoji-picker.js rename to src/components/emoji_picker/emoji_picker.js diff --git a/src/components/emoji-picker/emoji-picker.vue b/src/components/emoji_picker/emoji_picker.vue similarity index 98% rename from src/components/emoji-picker/emoji-picker.vue rename to src/components/emoji_picker/emoji_picker.vue index ec48fc45..70d08700 100644 --- a/src/components/emoji-picker/emoji-picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -55,7 +55,7 @@ </div> </template> -<script src="./emoji-picker.js"></script> +<script src="./emoji_picker.js"></script> <style lang="scss"> @import '../../_variables.scss'; diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 40bbf6d4..f646aeb5 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -1,12 +1,12 @@ import statusPoster from '../../services/status_poster/status_poster.service.js' import MediaUpload from '../media_upload/media_upload.vue' import ScopeSelector from '../scope_selector/scope_selector.vue' -import EmojiInput from '../emoji-input/emoji-input.vue' +import EmojiInput from '../emoji_input/emoji_input.vue' import PollForm from '../poll/poll_form.vue' import StickerPicker from '../sticker_picker/sticker_picker.vue' import fileTypeService from '../../services/file_type/file_type.service.js' import { reject, map, uniqBy } from 'lodash' -import suggestor from '../emoji-input/suggestor.js' +import suggestor from '../emoji_input/suggestor.js' const buildMentionsString = ({ user, attentions }, currentUser) => { let allAttentions = [...attentions] diff --git a/src/components/user_settings/user_settings.js b/src/components/user_settings/user_settings.js index b5a7f0df..ae04ce73 100644 --- a/src/components/user_settings/user_settings.js +++ b/src/components/user_settings/user_settings.js @@ -11,8 +11,8 @@ import BlockCard from '../block_card/block_card.vue' import MuteCard from '../mute_card/mute_card.vue' import SelectableList from '../selectable_list/selectable_list.vue' import ProgressButton from '../progress_button/progress_button.vue' -import EmojiInput from '../emoji-input/emoji-input.vue' -import suggestor from '../emoji-input/suggestor.js' +import EmojiInput from '../emoji_input/emoji_input.vue' +import suggestor from '../emoji_input/suggestor.js' import Autosuggest from '../autosuggest/autosuggest.vue' import Importer from '../importer/importer.vue' import Exporter from '../exporter/exporter.vue' From 579b5c9e77154db5fe1bc712969b6fa39830442f Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Mon, 12 Aug 2019 14:20:08 +0300 Subject: [PATCH 19/81] initial attempts at making emoji-picker somewhat extensible --- src/components/emoji_picker/emoji_picker.js | 6 +- src/components/emoji_picker/emoji_picker.scss | 83 ++++++++ src/components/emoji_picker/emoji_picker.vue | 201 +++++------------- 3 files changed, 144 insertions(+), 146 deletions(-) create mode 100644 src/components/emoji_picker/emoji_picker.scss diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 92d517b7..e25f98ff 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -6,7 +6,8 @@ const EmojiPicker = { data () { return { keyword: '', - activeGroup: 'standard' + activeGroup: 'standard', + showingAdditional: false } }, methods: { @@ -28,6 +29,9 @@ const EmojiPicker = { this.activeGroup = key } }) + }, + toggleAdditional (value) { + this.showingAdditional = value } }, computed: { diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss new file mode 100644 index 00000000..72889441 --- /dev/null +++ b/src/components/emoji_picker/emoji_picker.scss @@ -0,0 +1,83 @@ +@import '../../_variables.scss'; + +.emoji-picker { + position: absolute; + z-index: 1; + right: 0; + width: 300px; + height: 300px; + display: flex; + flex-direction: column; + margin: 0 !important; + + .emoji { + &-tabs { + &-item { + padding: 0 5px; + + &.active { + border-bottom: 4px solid; + + i { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } + } + } + } + + &-content { + display: flex; + flex-direction: column; + } + + &-search { + padding: 5px; + flex: 0 0 1px; + + input { + width: 100%; + } + } + + &-groups { + flex: 1 1 1px; + position: relative; + overflow: auto; + } + + &-group { + display: flex; + align-items: center; + flex-wrap: wrap; + padding: 5px; + justify-content: space-between; + + &-title { + font-size: 12px; + width: 100%; + margin: 0; + } + } + + &-item { + width: 32px; + height: 32px; + box-sizing: border-box; + display: flex; + font-size: 32px; + align-items: center; + justify-content: center; + margin: 2px; + + cursor: pointer; + + img { + max-width: 100%; + max-height: 100%; + } + } + + } + +} diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 70d08700..ec1702f3 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -1,161 +1,72 @@ <template> - <div class="emoji-dropdown-menu panel panel-default"> - <div class="panel-heading emoji-tabs"> - <span - v-for="(value, key) in emojis" - :key="key" - class="emoji-tabs-item" - :class="{'active': activeGroup === key}" - :title="value.text" - @click.prevent="highlight(key)" - > - <i :class="value.icon" /> + <div class="emoji-picker panel panel-default"> + <div class="panel-heading"> + <span class="emoji-tabs"> + <span + v-for="(value, key) in emojis" + :key="key" + class="emoji-tabs-item" + :class="{'active': activeGroup === key}" + :title="value.text" + @click.prevent="highlight(key)" + > + <i :class="value.icon" /> + </span> + </span> + <span class="additional-tabs"> + <slot name="tabs" /> </span> </div> <div class="panel-body emoji-dropdown-menu-content"> - <div class="emoji-search"> - <input - v-model="keyword" - type="text" - class="form-control" - > - </div> <div - ref="emoji-groups" - class="emoji-groups" - @scroll="scrolledGroup" + v-if="!showingAdditional" + class="emoji-content" > + <div class="emoji-search"> + <input + v-model="keyword" + type="text" + class="form-control" + > + </div> <div - v-for="(value, key) in emojis" - :key="key" - class="emoji-group" + ref="emoji-groups" + class="emoji-groups" + @scroll="scrolledGroup" > - <h6 - :ref="'group-' + key" - class="emoji-group-title" + <div + v-for="(value, key) in emojis" + :key="key" + class="emoji-group" > - {{ value.text }} - </h6> - <span - v-for="emoji in value.emojis" - :key="key + emoji.displayText" - :title="emoji.displayText" - class="emoji-item" - @click="onEmoji(emoji)" - > - <span v-if="!emoji.imageUrl">{{ emoji.replacement }}</span> - <img - v-else - :src="emoji.imageUrl" + <h6 + :ref="'group-' + key" + class="emoji-group-title" > - </span> + {{ value.text }} + </h6> + <span + v-for="emoji in value.emojis" + :key="key + emoji.displayText" + :title="emoji.displayText" + class="emoji-item" + @click="onEmoji(emoji)" + > + <span v-if="!emoji.imageUrl">{{ emoji.replacement }}</span> + <img + v-else + :src="emoji.imageUrl" + > + </span> + </div> </div> </div> + <div v-if="showingAdditional" class="additional-tabs-content"> + <slot name="tab-content" /> + </div> </div> - </div> +</div> </template> <script src="./emoji_picker.js"></script> - -<style lang="scss"> -@import '../../_variables.scss'; - -.emoji { - &-dropdown { - position: absolute; - right: 0; - top: 28px; - z-index: 1; - - &-toggle { - cursor: pointer; - position: absolute; - top: -23px; - right: 2px; - line-height: 1; - - i { - font-size: 18px; - } - } - - &-menu { - position: absolute; - z-index: 1; - right: 0; - width: 300px; - height: 300px; - display: flex; - flex-direction: column; - margin: 0 !important; - - &-content { - flex: 1 1 1px; - display: flex; - flex-direction: column; - } - } - } - - &-tabs { - &-item { - padding: 0 5px; - - &.active { - border-bottom: 4px solid; - - i { - color: $fallback--lightText; - color: var(--lightText, $fallback--lightText); - } - } - } - } - - &-search { - padding: 5px; - - input { - width: 100%; - } - } - - &-groups { - flex: 1 1 1px; - overflow: auto; - position: relative; - } - - &-group { - display: flex; - align-items: center; - flex-wrap: wrap; - width: 100%; - - &-title { - font-size: 12px; - width: 100%; - margin: 0; - padding: 5px; - } - } - - &-item { - width: 32px; - height: 32px; - box-sizing: border-box; - display: flex; - font-size: 32px; - align-items: center; - justify-content: center; - margin: 2px; - cursor: pointer; - - img { - max-width: 100%; - max-height: 100%; - } - } - -} -</style> +<style lang="scss" src="./emoji_picker.scss"></style> From 5851f97eb058b3e2df91f9122ba899bc7e4affaf Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Mon, 12 Aug 2019 20:01:38 +0300 Subject: [PATCH 20/81] fixed a lot of bugs with emoji picker, improved relevant components --- src/components/emoji_input/emoji_input.js | 33 ++++++- src/components/emoji_input/emoji_input.vue | 16 ++-- src/components/emoji_picker/emoji_picker.js | 86 ++++++++++++++----- src/components/emoji_picker/emoji_picker.scss | 82 +++++++++++++----- src/components/emoji_picker/emoji_picker.vue | 60 ++++++++----- .../post_status_form/post_status_form.js | 25 ++---- .../post_status_form/post_status_form.vue | 26 +++--- .../sticker_picker/sticker_picker.js | 4 +- .../sticker_picker/sticker_picker.vue | 72 ++++++++-------- src/components/tab_switcher/tab_switcher.js | 26 +++++- src/components/tab_switcher/tab_switcher.scss | 11 +++ src/i18n/en.json | 9 +- 12 files changed, 300 insertions(+), 150 deletions(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 5a9d1406..5ff27b20 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -58,6 +58,16 @@ const EmojiInput = { required: false, type: Boolean, default: false + }, + emojiPickerExternalTrigger: { + required: false, + type: Boolean, + default: false + }, + stickerPicker: { + required: false, + type: Boolean, + default: false } }, data () { @@ -95,9 +105,6 @@ const EmojiInput = { textAtCaret () { return (this.wordAtCaret || {}).word || '' }, - pickerIconBottom () { - return this.input && this.input.tag === 'textarea' - }, wordAtCaret () { if (this.value && this.caret) { const word = Completion.wordAtPosition(this.value, this.caret - 1) || {} @@ -133,6 +140,9 @@ const EmojiInput = { } }, methods: { + triggerShowPicker () { + this.showPicker = true + }, togglePicker () { this.showPicker = !this.showPicker }, @@ -148,6 +158,15 @@ const EmojiInput = { this.value.substring(this.caret) ].join('') this.$emit('input', newValue) + const position = this.caret + insertion.length + + this.$nextTick(function () { + // Re-focus inputbox after clicking suggestion + this.input.elm.focus() + // Set selection right after the replacement instead of the very end + this.input.elm.setSelectionRange(position, position) + this.caret = position + }) }, replaceText (e, suggestion) { const len = this.suggestions.length || 0 @@ -264,6 +283,14 @@ const EmojiInput = { onClickOutside () { this.showPicker = false }, + onStickerUploaded (e) { + this.showPicker = false + this.$emit('sticker-uploaded', e) + }, + onStickerUploadFailed (e) { + this.showPicker = false + this.$emit('sticker-upload-Failed', e) + }, setCaret ({ target: { selectionStart } }) { this.caret = selectionStart }, diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue index 3ca12af1..b077e6e9 100644 --- a/src/components/emoji_input/emoji_input.vue +++ b/src/components/emoji_input/emoji_input.vue @@ -6,8 +6,8 @@ <slot /> <template v-if="emojiPicker"> <div + v-if="!emojiPickerExternalTrigger" class="emoji-picker-icon" - :class="pickerIconBottom ? 'picker-icon-bottom': 'picker-icon-right'" @click.prevent="togglePicker" > <i class="icon-smile" /> @@ -16,8 +16,11 @@ v-if="emojiPicker" ref="picker" :class="{ hide: !showPicker }" + :sticker-picker="stickerPicker" class="emoji-picker-panel" @emoji="insert" + @sticker-uploaded="onStickerUploaded" + @sticker-upload-failed="onStickerUploadFailed" /> </template> <div @@ -62,6 +65,8 @@ .emoji-picker-icon { position: absolute; + top: 0; + right: 0; margin: 0 .25em; font-size: 16px; cursor: pointer; @@ -70,15 +75,6 @@ color: $fallback--text; color: var(--text, $fallback--text); } - - &.picker-icon-bottom { - bottom: 0; - left: 0; - } - &.picker-icon-right { - top: 0; - right: 0; - } } .emoji-picker-panel { position: absolute; diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index e25f98ff..0a64f759 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -1,15 +1,26 @@ + const filterByKeyword = (list, keyword = '') => { return list.filter(x => x.displayText.includes(keyword)) } const EmojiPicker = { + props: { + stickerPicker: { + required: false, + type: Boolean, + default: false + } + }, data () { return { keyword: '', - activeGroup: 'standard', - showingAdditional: false + activeGroup: 'custom', + showingStickers: false } }, + components: { + StickerPicker: () => import('../sticker_picker/sticker_picker.vue') + }, methods: { onEmoji (emoji) { const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement @@ -19,37 +30,72 @@ const EmojiPicker = { highlight (key) { const ref = this.$refs['group-' + key] const top = ref[0].offsetTop - this.$refs['emoji-groups'].scrollTop = top + 1 + this.setShowStickers(false) this.activeGroup = key - }, - scrolledGroup (e) { - const top = e.target.scrollTop - Object.keys(this.emojis).forEach(key => { - if (this.$refs['group-' + key][0].offsetTop < top) { - this.activeGroup = key - } + this.$nextTick(() => { + this.$refs['emoji-groups'].scrollTop = top + 1 }) }, - toggleAdditional (value) { - this.showingAdditional = value + scrolledGroup (e) { + const target = (e && e.target) || this.$refs['emoji-groups'] + const top = target.scrollTop + 5 + this.$nextTick(() => { + this.emojisView.forEach(group => { + const ref = this.$refs['group-' + group.id] + if (ref[0].offsetTop <= top) { + this.activeGroup = group.id + } + }) + }) + }, + toggleStickers () { + this.showingStickers = !this.showingStickers + }, + setShowStickers (value) { + this.showingStickers = value + }, + onStickerUploaded (e) { + this.$emit('sticker-uploaded', e) + }, + onStickerUploadFailed (e) { + this.$emit('sticker-upload-failed', e) + } + }, + watch: { + keyword () { + this.scrolledGroup() } }, computed: { + activeGroupView () { + return this.showingStickers ? '' : this.activeGroup + }, + stickersAvailable () { + if (this.$store.state.instance.stickers) { + return this.$store.state.instance.stickers.length > 0 + } + return 0 + }, emojis () { const standardEmojis = this.$store.state.instance.emoji || [] const customEmojis = this.$store.state.instance.customEmoji || [] - return { - custom: { - text: 'Custom', - icon: 'icon-picture', + return [ + { + id: 'custom', + text: this.$t('emoji.custom'), + icon: 'icon-smile', emojis: filterByKeyword(customEmojis, this.keyword) }, - standard: { - text: 'Standard', - icon: 'icon-star', + { + id: 'standard', + text: this.$t('emoji.unicode'), + icon: 'icon-picture', emojis: filterByKeyword(standardEmojis, this.keyword) } - } + ] + }, + emojisView () { + return this.emojis.filter(value => value.emojis.length > 0) } } } diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 72889441..6c13e82b 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -1,39 +1,78 @@ @import '../../_variables.scss'; .emoji-picker { - position: absolute; - z-index: 1; - right: 0; - width: 300px; - height: 300px; display: flex; flex-direction: column; + position: absolute; + right: 0; + left: 0; + height: 300px; margin: 0 !important; + z-index: 1; - .emoji { - &-tabs { - &-item { - padding: 0 5px; + .panel-body { + display: flex; + flex-direction: column; + flex: 1 1 0; + min-height: 0px; + } - &.active { - border-bottom: 4px solid; + .additional-tabs { + border-left: 1px solid; + border-left-color: $fallback--icon; + border-left-color: var(--icon, $fallback--icon); + padding-left: 5px; + flex: 0 0 0; + } - i { - color: $fallback--lightText; - color: var(--lightText, $fallback--lightText); - } + .emoji-tabs { + flex: 1 1 0; + } + + .additional-tabs, + .emoji-tabs { + &-item { + padding: 0 5px; + cursor: pointer; + font-size: 24px; + + &.disabled { + opacity: 0.5; + pointer-events: none; + } + &.active { + border-bottom: 4px solid; + + i { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); } } } + } + .sticker-picker { + flex: 1 1 0 + } + + .stickers, + .emoji { &-content { display: flex; flex-direction: column; - } + flex: 1 1 0; + min-height: 0; + &.hidden { + display: none + } + } + } + + .emoji { &-search { padding: 5px; - flex: 0 0 1px; + flex: 0 0 0; input { width: 100%; @@ -50,13 +89,16 @@ display: flex; align-items: center; flex-wrap: wrap; - padding: 5px; - justify-content: space-between; + padding-left: 5px; + justify-content: left; &-title { font-size: 12px; width: 100%; margin: 0; + &.disabled { + display: none; + } } } @@ -68,7 +110,7 @@ font-size: 32px; align-items: center; justify-content: center; - margin: 2px; + margin: 4px; cursor: pointer; diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index ec1702f3..12b1569e 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -3,30 +3,44 @@ <div class="panel-heading"> <span class="emoji-tabs"> <span - v-for="(value, key) in emojis" - :key="key" + v-for="group in emojis" + :key="group.id" class="emoji-tabs-item" - :class="{'active': activeGroup === key}" - :title="value.text" - @click.prevent="highlight(key)" + :class="{ + active: activeGroupView === group.id, + disabled: group.emojis.length === 0 + }" + :title="group.text" + @click.prevent="highlight(group.id)" > - <i :class="value.icon" /> + <i :class="group.icon" /> </span> </span> - <span class="additional-tabs"> - <slot name="tabs" /> + <span + v-if="stickerPicker" + class="additional-tabs" + > + <span + class="stickers-tab-icon additional-tabs-item" + :class="{active: showingStickers}" + :title="$t('emoji.stickers')" + @click.prevent="toggleStickers" + > + <i class="icon-star" /> + </span> </span> </div> - <div class="panel-body emoji-dropdown-menu-content"> + <div class="panel-body"> <div - v-if="!showingAdditional" class="emoji-content" + :class="{hidden: showingStickers}" > <div class="emoji-search"> <input v-model="keyword" type="text" class="form-control" + :placeholder="$t('emoji.search_emoji')" > </div> <div @@ -35,22 +49,22 @@ @scroll="scrolledGroup" > <div - v-for="(value, key) in emojis" - :key="key" + v-for="group in emojisView" + :key="group.id" class="emoji-group" > <h6 - :ref="'group-' + key" + :ref="'group-' + group.id" class="emoji-group-title" > - {{ value.text }} + {{ group.text }} </h6> <span - v-for="emoji in value.emojis" - :key="key + emoji.displayText" + v-for="emoji in group.emojis" + :key="group.id + emoji.displayText" :title="emoji.displayText" class="emoji-item" - @click="onEmoji(emoji)" + @click.stop.prevent="onEmoji(emoji)" > <span v-if="!emoji.imageUrl">{{ emoji.replacement }}</span> <img @@ -61,11 +75,17 @@ </div> </div> </div> - <div v-if="showingAdditional" class="additional-tabs-content"> - <slot name="tab-content" /> + <div + v-if="showingStickers" + class="stickers-content" + > + <sticker-picker + @uploaded="onStickerUploaded" + @upload-failed="onStickerUploadFailed" + /> </div> </div> -</div> + </div> </template> <script src="./emoji_picker.js"></script> diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index f646aeb5..1359e75a 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -3,7 +3,6 @@ import MediaUpload from '../media_upload/media_upload.vue' import ScopeSelector from '../scope_selector/scope_selector.vue' import EmojiInput from '../emoji_input/emoji_input.vue' import PollForm from '../poll/poll_form.vue' -import StickerPicker from '../sticker_picker/sticker_picker.vue' import fileTypeService from '../../services/file_type/file_type.service.js' import { reject, map, uniqBy } from 'lodash' import suggestor from '../emoji_input/suggestor.js' @@ -35,7 +34,6 @@ const PostStatusForm = { MediaUpload, EmojiInput, PollForm, - StickerPicker, ScopeSelector }, mounted () { @@ -84,8 +82,7 @@ const PostStatusForm = { contentType }, caret: 0, - pollFormVisible: false, - stickerPickerVisible: false + pollFormVisible: false } }, computed: { @@ -161,12 +158,6 @@ const PostStatusForm = { safeDMEnabled () { return this.$store.state.instance.safeDM }, - stickersAvailable () { - if (this.$store.state.instance.stickers) { - return this.$store.state.instance.stickers.length > 0 - } - return 0 - }, pollsAvailable () { return this.$store.state.instance.pollsAvailable && this.$store.state.instance.pollLimits.max_options >= 2 @@ -222,7 +213,6 @@ const PostStatusForm = { poll: {} } this.pollFormVisible = false - this.stickerPickerVisible = false this.$refs.mediaUpload.clearFile() this.clearPollForm() this.$emit('posted') @@ -239,7 +229,6 @@ const PostStatusForm = { addMediaFile (fileInfo) { this.newStatus.files.push(fileInfo) this.enableSubmit() - this.stickerPickerVisible = false }, removeMediaFile (fileInfo) { let index = this.newStatus.files.indexOf(fileInfo) @@ -293,20 +282,16 @@ const PostStatusForm = { target.style.height = null } }, + showEmoji () { + this.$refs['textarea'].focus() + this.$refs['emoji-input'].triggerShowPicker() + }, clearError () { this.error = null }, changeVis (visibility) { this.newStatus.visibility = visibility }, - toggleStickerPicker () { - this.stickerPickerVisible = !this.stickerPickerVisible - }, - clearStickerPicker () { - if (this.$refs.stickerPicker) { - this.$refs.stickerPicker.clear() - } - }, togglePollForm () { this.pollFormVisible = !this.pollFormVisible }, diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index e691acad..ad2c2218 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -74,10 +74,15 @@ > </EmojiInput> <EmojiInput + ref="emoji-input" v-model="newStatus.status" :suggest="emojiUserSuggestor" - emoji-picker class="form-control main-input" + emoji-picker + emoji-picker-external-trigger + sticker-picker + @sticker-uploaded="addMediaFile" + @sticker-upload-failed="uploadFailed" > <textarea ref="textarea" @@ -160,14 +165,12 @@ @upload-failed="uploadFailed" /> <div - v-if="stickersAvailable" - class="sticker-icon" + class="emoji-icon" > <i - :title="$t('stickers.add_sticker')" - class="icon-picture btn btn-default" - :class="{ selected: stickerPickerVisible }" - @click="toggleStickerPicker" + :title="$t('emoji.add_emoji')" + class="icon-smile btn btn-default" + @click.stop.prevent="showEmoji" /> </div> <div @@ -260,11 +263,6 @@ <label for="filesSensitive">{{ $t('post_status.attachments_sensitive') }}</label> </div> </form> - <sticker-picker - v-if="stickerPickerVisible" - ref="stickerPicker" - @uploaded="addMediaFile" - /> </div> </template> @@ -327,7 +325,7 @@ } } - .poll-icon, .sticker-icon { + .poll-icon, .emoji-icon { font-size: 26px; flex: 1; @@ -337,7 +335,7 @@ } } - .sticker-icon { + .emoji-icon { flex: 0; min-width: 50px; } diff --git a/src/components/sticker_picker/sticker_picker.js b/src/components/sticker_picker/sticker_picker.js index a6dcded3..8daf3f07 100644 --- a/src/components/sticker_picker/sticker_picker.js +++ b/src/components/sticker_picker/sticker_picker.js @@ -3,9 +3,9 @@ import statusPosterService from '../../services/status_poster/status_poster.serv import TabSwitcher from '../tab_switcher/tab_switcher.js' const StickerPicker = { - components: [ + components: { TabSwitcher - ], + }, data () { return { meta: { diff --git a/src/components/sticker_picker/sticker_picker.vue b/src/components/sticker_picker/sticker_picker.vue index 938204c8..323855b9 100644 --- a/src/components/sticker_picker/sticker_picker.vue +++ b/src/components/sticker_picker/sticker_picker.vue @@ -2,32 +2,30 @@ <div class="sticker-picker" > - <div - class="sticker-picker-panel" + <tab-switcher + class="tab-switcher" + :render-only-focused="true" + scrollable-tabs > - <tab-switcher - :render-only-focused="true" + <div + v-for="stickerpack in pack" + :key="stickerpack.path" + :image-tooltip="stickerpack.meta.title" + :image="stickerpack.path + stickerpack.meta.tabIcon" + class="sticker-picker-content" > <div - v-for="stickerpack in pack" - :key="stickerpack.path" - :image-tooltip="stickerpack.meta.title" - :image="stickerpack.path + stickerpack.meta.tabIcon" - class="sticker-picker-content" + v-for="sticker in stickerpack.meta.stickers" + :key="sticker" + class="sticker" + @click.stop.prevent="pick(stickerpack.path + sticker, stickerpack.meta.title)" > - <div - v-for="sticker in stickerpack.meta.stickers" - :key="sticker" - class="sticker" - @click="pick(stickerpack.path + sticker, stickerpack.meta.title)" + <img + :src="stickerpack.path + sticker" > - <img - :src="stickerpack.path + sticker" - > - </div> </div> - </tab-switcher> - </div> + </div> + </tab-switcher> </div> </template> @@ -37,22 +35,24 @@ @import '../../_variables.scss'; .sticker-picker { - .sticker-picker-panel { - display: inline-block; - width: 100%; - .sticker-picker-content { - max-height: 300px; - overflow-y: scroll; - overflow-x: auto; - .sticker { - display: inline-block; - width: 20%; - height: 20%; - img { - width: 100%; - &:hover { - filter: drop-shadow(0 0 5px var(--link, $fallback--link)); - } + width: 100%; + position: relative; + .tab-switcher { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + } + .sticker-picker-content { + .sticker { + display: inline-block; + width: 20%; + height: 20%; + img { + width: 100%; + &:hover { + filter: drop-shadow(0 0 5px var(--link, $fallback--link)); } } } diff --git a/src/components/tab_switcher/tab_switcher.js b/src/components/tab_switcher/tab_switcher.js index a5fe019c..99428044 100644 --- a/src/components/tab_switcher/tab_switcher.js +++ b/src/components/tab_switcher/tab_switcher.js @@ -4,7 +4,26 @@ import './tab_switcher.scss' export default Vue.component('tab-switcher', { name: 'TabSwitcher', - props: ['renderOnlyFocused', 'onSwitch', 'customActive'], + props: { + renderOnlyFocused: { + required: false, + type: Boolean, + default: false + }, + onSwitch: { + required: false, + type: Function + }, + customActive: { + required: false, + type: String + }, + scrollableTabs: { + required: false, + type: Boolean, + default: false + } + }, data () { return { active: this.$slots.default.findIndex(_ => _.tag) @@ -18,7 +37,8 @@ export default Vue.component('tab-switcher', { }, methods: { activateTab (index, dataset) { - return () => { + return (e) => { + e.preventDefault() if (typeof this.onSwitch === 'function') { this.onSwitch.call(null, index, this.$slots.default[index].elm.dataset) } @@ -85,7 +105,7 @@ export default Vue.component('tab-switcher', { <div class="tabs"> {tabs} </div> - <div class="contents"> + <div class={'contents' + (this.scrollableTabs ? ' scrollable-tabs' : '')}> {contents} </div> </div> diff --git a/src/components/tab_switcher/tab_switcher.scss b/src/components/tab_switcher/tab_switcher.scss index 4eeb42e0..3e5eacd5 100644 --- a/src/components/tab_switcher/tab_switcher.scss +++ b/src/components/tab_switcher/tab_switcher.scss @@ -1,10 +1,21 @@ @import '../../_variables.scss'; .tab-switcher { + display: flex; + flex-direction: column; + .contents { + flex: 1 0 auto; + min-height: 0px; + .hidden { display: none; } + + &.scrollable-tabs { + flex-basis: 0; + overflow-y: auto; + } } .tabs { display: flex; diff --git a/src/i18n/en.json b/src/i18n/en.json index 60a3e284..13f7168f 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -106,8 +106,13 @@ "expired": "Poll ended {0} ago", "not_enough_options": "Too few unique options in poll" }, - "stickers": { - "add_sticker": "Add Sticker" + "emoji": { + "stickers": "Stickers", + "emoji": "Emoji", + "search_emoji": "Search for an emoji", + "add_emoji": "Insert emoji", + "custom": "Custom emoji", + "unicode": "Unicode emoji" }, "interactions": { "favs_repeats": "Repeats and Favorites", From 66a34b7ecf65ded39882b9e4e7df9bbd2067afc3 Mon Sep 17 00:00:00 2001 From: rinpatch <rinpatch@sdf.org> Date: Wed, 4 Sep 2019 12:19:39 +0300 Subject: [PATCH 21/81] Properly detect thread-muted posts and set `with_muted` when fetching notifications --- src/components/status/status.js | 2 +- .../notifications_fetcher/notifications_fetcher.service.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/status/status.js b/src/components/status/status.js index 502d9583..d037f150 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -117,7 +117,7 @@ const Status = { return hits }, - muted () { return !this.unmuted && (this.status.user.muted || this.muteWordHits.length > 0) }, + muted () { return !this.unmuted && (this.status.muted || this.muteWordHits.length > 0) }, hideFilteredStatuses () { return typeof this.$store.state.config.hideFilteredStatuses === 'undefined' ? this.$store.state.instance.hideFilteredStatuses diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js index f9ec3f6e..b6c4cf80 100644 --- a/src/services/notifications_fetcher/notifications_fetcher.service.js +++ b/src/services/notifications_fetcher/notifications_fetcher.service.js @@ -10,6 +10,11 @@ const fetchAndUpdate = ({ store, credentials, older = false }) => { const args = { credentials } const rootState = store.rootState || store.state const timelineData = rootState.statuses.notifications + const hideMutedPosts = typeof rootState.config.hideMutedPosts === 'undefined' + ? rootState.instance.hideMutedPosts + : rootState.config.hideMutedPosts + + args['withMuted'] = !hideMutedPosts args['timeline'] = 'notifications' if (older) { From 1a5a7bbebf45e93dbd47a99bb4eb05a5be5979f1 Mon Sep 17 00:00:00 2001 From: rinpatch <rinpatch@sdf.org> Date: Wed, 4 Sep 2019 21:11:13 +0300 Subject: [PATCH 22/81] Set thread_muted for all statuses with the same conversation id on status mute/unmute --- src/components/extra_buttons/extra_buttons.vue | 4 ++-- src/components/status/status.js | 2 +- src/modules/statuses.js | 10 ++++++---- .../entity_normalizer/entity_normalizer.service.js | 1 + 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/extra_buttons/extra_buttons.vue b/src/components/extra_buttons/extra_buttons.vue index ed0f3aa4..6781a4f8 100644 --- a/src/components/extra_buttons/extra_buttons.vue +++ b/src/components/extra_buttons/extra_buttons.vue @@ -10,14 +10,14 @@ <div slot="popover"> <div class="dropdown-menu"> <button - v-if="canMute && !status.muted" + v-if="canMute && !status.thread_muted" class="dropdown-item dropdown-item-icon" @click.prevent="muteConversation" > <i class="icon-eye-off" /><span>{{ $t("status.mute_conversation") }}</span> </button> <button - v-if="canMute && status.muted" + v-if="canMute && status.thread_muted" class="dropdown-item dropdown-item-icon" @click.prevent="unmuteConversation" > diff --git a/src/components/status/status.js b/src/components/status/status.js index d037f150..b72d2f58 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -117,7 +117,7 @@ const Status = { return hits }, - muted () { return !this.unmuted && (this.status.muted || this.muteWordHits.length > 0) }, + muted () { return !this.unmuted && (this.status.user.muted || this.status.thread_muted || this.muteWordHits.length > 0) }, hideFilteredStatuses () { return typeof this.$store.state.config.hideFilteredStatuses === 'undefined' ? this.$store.state.instance.hideFilteredStatuses diff --git a/src/modules/statuses.js b/src/modules/statuses.js index 4356d0a7..9ba32976 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -426,9 +426,11 @@ export const mutations = { newStatus.favoritedBy.push(user) } }, - setMuted (state, status) { + setMutedStatus (state, status) { const newStatus = state.allStatusesObject[status.id] - newStatus.muted = status.muted + newStatus.thread_muted = status.thread_muted + + state.conversationsObject[newStatus.statusnet_conversation_id].forEach(status => { status.thread_muted = newStatus.thread_muted }) }, setRetweeted (state, { status, value }) { const newStatus = state.allStatusesObject[status.id] @@ -566,11 +568,11 @@ const statuses = { }, muteConversation ({ rootState, commit }, statusId) { return rootState.api.backendInteractor.muteConversation(statusId) - .then((status) => commit('setMuted', status)) + .then((status) => commit('setMutedStatus', status)) }, unmuteConversation ({ rootState, commit }, statusId) { return rootState.api.backendInteractor.unmuteConversation(statusId) - .then((status) => commit('setMuted', status)) + .then((status) => commit('setMutedStatus', status)) }, retweet ({ rootState, commit }, status) { // Optimistic retweeting... diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index 6cc1851d..7438cd90 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -224,6 +224,7 @@ export const parseStatus = (data) => { output.statusnet_conversation_id = data.pleroma.conversation_id output.is_local = pleroma.local output.in_reply_to_screen_name = data.pleroma.in_reply_to_account_acct + output.thread_muted = pleroma.thread_muted } else { output.text = data.content output.summary = data.spoiler_text From b33667a74342a9fc91386d12763b5c2f1101868a Mon Sep 17 00:00:00 2001 From: rinpatch <rinpatch@sdf.org> Date: Wed, 4 Sep 2019 22:17:29 +0300 Subject: [PATCH 23/81] Avoid iterating over statuses to set thread_muted if the backend does not support the extension --- src/modules/statuses.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/statuses.js b/src/modules/statuses.js index 9ba32976..918065d2 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -430,7 +430,9 @@ export const mutations = { const newStatus = state.allStatusesObject[status.id] newStatus.thread_muted = status.thread_muted - state.conversationsObject[newStatus.statusnet_conversation_id].forEach(status => { status.thread_muted = newStatus.thread_muted }) + if (newStatus.thread_muted !== undefined) { + state.conversationsObject[newStatus.statusnet_conversation_id].forEach(status => { status.thread_muted = newStatus.thread_muted }) + } }, setRetweeted (state, { status, value }) { const newStatus = state.allStatusesObject[status.id] From f48d12b4bcf022d25d731d8b21bb8904cd09285e Mon Sep 17 00:00:00 2001 From: tarteka <info@tarteka.net> Date: Fri, 6 Sep 2019 14:24:37 +0200 Subject: [PATCH 24/81] update eu translate --- src/i18n/eu.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/i18n/eu.json b/src/i18n/eu.json index 1efaa310..d3925126 100644 --- a/src/i18n/eu.json +++ b/src/i18n/eu.json @@ -508,7 +508,9 @@ "pinned": "Ainguratuta", "delete_confirm": "Mezu hau benetan ezabatu nahi duzu?", "reply_to": "Erantzun", - "replies_list": "Erantzunak:" + "replies_list": "Erantzunak:", + "mute_conversation": "Elkarrizketa isilarazi", + "unmute_conversation": "Elkarrizketa aktibatu" }, "user_card": { "approve": "Onartu", @@ -606,5 +608,16 @@ "person_talking": "{count} pertsona hitzegiten", "people_talking": "{count} gende hitzegiten", "no_results": "Emaitzarik ez" + }, + "password_reset": { + "forgot_password": "Pasahitza ahaztua?", + "password_reset": "Pasahitza berrezarri", + "instruction": "Idatzi zure helbide elektronikoa edo erabiltzaile izena. Pasahitza berrezartzeko esteka bidaliko dizugu.", + "placeholder": "Zure e-posta edo erabiltzaile izena", + "check_email": "Begiratu zure posta elektronikoa pasahitza berrezarri ahal izateko.", + "return_home": "Itzuli hasierara", + "not_found": "Ezin izan dugu helbide elektroniko edo erabiltzaile hori aurkitu.", + "too_many_requests": "Saiakera gehiegi burutu ditzu, saiatu berriro geroxeago.", + "password_reset_disabled": "Pasahitza berrezartzea debekatuta dago. Mesedez, jarri harremanetan instantzia administratzailearekin." } } \ No newline at end of file From 1167bafb1977ddbd24536878d36798965f7c41a9 Mon Sep 17 00:00:00 2001 From: tarteka <info@tarteka.net> Date: Fri, 6 Sep 2019 14:58:20 +0200 Subject: [PATCH 25/81] Update es translate --- src/i18n/es.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/i18n/es.json b/src/i18n/es.json index 009599f5..91c7f383 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -508,7 +508,9 @@ "pinned": "Fijado", "delete_confirm": "¿Realmente quieres borrar la publicación?", "reply_to": "Respondiendo a", - "replies_list": "Respuestas:" + "replies_list": "Respuestas:", + "mute_conversation": "Silenciar la conversación", + "unmute_conversation": "Mostrar la conversación" }, "user_card": { "approve": "Aprobar", @@ -606,5 +608,16 @@ "person_talking": "{count} personas hablando", "people_talking": "{count} gente hablando", "no_results": "Sin resultados" + }, + "password_reset": { + "forgot_password": "¿Contraseña olvidada?", + "password_reset": "Restablecer la contraseña", + "instruction": "Ingrese su dirección de correo electrónico o nombre de usuario. Le enviaremos un enlace para restablecer su contraseña.", + "placeholder": "Su correo electrónico o nombre de usuario", + "check_email": "Revise su correo electrónico para obtener un enlace para restablecer su contraseña.", + "return_home": "Volver a la página de inicio", + "not_found": "No pudimos encontrar ese correo electrónico o nombre de usuario.", + "too_many_requests": "Has alcanzado el límite de intentos, vuelve a intentarlo más tarde.", + "password_reset_disabled": "El restablecimiento de contraseñas está deshabilitado. Póngase en contacto con el administrador de su instancia." } } \ No newline at end of file From 17a97ee6f5bc60c19be0d9d9e9e8e2f1c28be672 Mon Sep 17 00:00:00 2001 From: tarteka <info@tarteka.net> Date: Sat, 7 Sep 2019 09:00:25 +0200 Subject: [PATCH 26/81] fix some translates --- src/i18n/eu.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/i18n/eu.json b/src/i18n/eu.json index d3925126..6cbdb115 100644 --- a/src/i18n/eu.json +++ b/src/i18n/eu.json @@ -88,7 +88,7 @@ "followed_you": "Zu jarraitzen zaitu", "load_older": "Kargatu jakinarazpen zaharragoak", "notifications": "Jakinarazpenak", - "read": "Irakurri!", + "read": "Irakurrita!", "repeated_you": "zure mezua errepikatu du", "no_more_notifications": "Ez dago jakinarazpen gehiago" }, @@ -116,7 +116,7 @@ }, "post_status": { "new_status": "Mezu berri bat idatzi", - "account_not_locked_warning": "Zure kontua ez dago {0}. Edozeinek jarraitzen hastearekin, zure mezuak irakur dezake.", + "account_not_locked_warning": "Zure kontua ez dago {0}. Edozeinek jarraitzen hastearekin, zure mezuak irakur ditzake.", "account_not_locked_warning_link": "Blokeatuta", "attachments_sensitive": "Nabarmendu eranskinak hunkigarri gisa ", "content_type": { @@ -136,10 +136,10 @@ "unlisted": "Mezu hau ez da argitaratuko Denbora-lerro Publikoan ezta Ezagutzen den Sarean" }, "scope": { - "direct": "Zuzena - Bidali aipatutako erabiltzaileei besterik ez", - "private": "Jarraitzaileentzako bakarrik- Bidali jarraitzaileentzat bakarrik", - "public": "Publickoa - Bistaratu denbora-lerro publikoetan", - "unlisted": "Zerrendatu gabea - ez bidali denbora-lerro publikoetan" + "direct": "Zuzena: Bidali aipatutako erabiltzaileei besterik ez", + "private": "Jarraitzaileentzako bakarrik: Bidali jarraitzaileentzat bakarrik", + "public": "Publikoa: Bistaratu denbora-lerro publikoetan", + "unlisted": "Zerrendatu gabea: ez bidali denbora-lerro publikoetara" } }, "registration": { @@ -276,7 +276,7 @@ "no_blocks": "Ez daude erabiltzaile blokeatutak", "no_mutes": "Ez daude erabiltzaile mututuak", "hide_follows_description": "Ez erakutsi nor jarraitzen ari naizen", - "hide_followers_description": "Ez erakutsi nor ari de ni jarraitzen", + "hide_followers_description": "Ez erakutsi nor ari den ni jarraitzen", "show_admin_badge": "Erakutsi Administratzaile etiketa nire profilan", "show_moderator_badge": "Erakutsi Moderatzaile etiketa nire profilan", "nsfw_clickthrough": "Gaitu klika hunkigarri eranskinak ezkutatzeko", @@ -456,8 +456,8 @@ "time": { "day": "{0} egun", "days": "{0} egun", - "day_short": "{0}d", - "days_short": "{0}d", + "day_short": "{0}e", + "days_short": "{0}e", "hour": "{0} ordu", "hours": "{0} ordu", "hour_short": "{0}o", @@ -492,7 +492,7 @@ "conversation": "Elkarrizketa", "error_fetching": "Errorea eguneraketak eskuratzen", "load_older": "Kargatu mezu zaharragoak", - "no_retweet_hint": "Mezu hau jarraitzailentzko bakarrik markatuta dago eta ezin da errepikatu", + "no_retweet_hint": "Mezu hau jarraitzailentzako bakarrik markatuta dago eta ezin da errepikatu", "repeated": "Errepikatuta", "show_new": "Berriena erakutsi", "up_to_date": "Eguneratuta", @@ -507,7 +507,7 @@ "unpin": "Aingura ezeztatu profilatik", "pinned": "Ainguratuta", "delete_confirm": "Mezu hau benetan ezabatu nahi duzu?", - "reply_to": "Erantzun", + "reply_to": "Erantzuten", "replies_list": "Erantzunak:", "mute_conversation": "Elkarrizketa isilarazi", "unmute_conversation": "Elkarrizketa aktibatu" @@ -583,7 +583,7 @@ }, "tool_tip": { "media_upload": "Multimedia igo", - "repeat": "Erreplikatu", + "repeat": "Errepikatu", "reply": "Erantzun", "favorite": "Gogokoa", "user_settings": "Erabiltzaile ezarpenak" From 5026d3719ad4605fd24e8961be8b0fbeab5f4796 Mon Sep 17 00:00:00 2001 From: tarteka <info@tarteka.net> Date: Sat, 7 Sep 2019 09:07:34 +0200 Subject: [PATCH 27/81] fix some translates --- src/i18n/eu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/eu.json b/src/i18n/eu.json index 6cbdb115..0120acc5 100644 --- a/src/i18n/eu.json +++ b/src/i18n/eu.json @@ -228,7 +228,7 @@ "avatar_size_instruction": "Avatar irudien gomendatutako gutxieneko tamaina 150x150 pixel dira.", "export_theme": "Gorde aurre-ezarpena", "filtering": "Iragazten", - "filtering_explanation": "Hitz hauek dituzten muzu guztiak isilduak izango dira. Lerro bakoitzeko bat", + "filtering_explanation": "Hitz hauek dituzten mezu guztiak isilduak izango dira. Lerro bakoitzeko bat", "follow_export": "Jarraitzen dituzunak esportatu", "follow_export_button": "Esportatu zure jarraitzaileak csv fitxategi batean", "follow_import": "Jarraitzen dituzunak inportatu", From 14df84d89bfc58f564697b7d72d7c66134c64697 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 8 Sep 2019 15:51:17 +0300 Subject: [PATCH 28/81] fixed some bugs, added spam mode, minor collateral fixes --- src/components/emoji_input/emoji_input.js | 28 ++++++++++++---- src/components/emoji_picker/emoji_picker.js | 7 ++-- src/components/emoji_picker/emoji_picker.scss | 33 +++++++++++++++---- src/components/emoji_picker/emoji_picker.vue | 16 +++++++-- .../post_status_form/post_status_form.js | 2 +- .../post_status_form/post_status_form.vue | 2 +- src/components/status/status.vue | 2 +- src/components/user_panel/user_panel.vue | 2 +- src/i18n/en.json | 1 + 9 files changed, 69 insertions(+), 24 deletions(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 5ff27b20..b1640753 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -77,7 +77,9 @@ const EmojiInput = { caret: 0, focused: false, blurTimeout: null, - showPicker: false + showPicker: false, + spamMode: false, + disableClickOutside: false } }, components: { @@ -100,7 +102,7 @@ const EmojiInput = { })) }, showSuggestions () { - return this.focused && this.suggestions && this.suggestions.length > 0 + return this.focused && this.suggestions && this.suggestions.length > 0 && !this.showPicker }, textAtCaret () { return (this.wordAtCaret || {}).word || '' @@ -142,6 +144,13 @@ const EmojiInput = { methods: { triggerShowPicker () { this.showPicker = true + // This temporarily disables "click outside" handler + // since external trigger also means click originates + // from outside, thus preventing picker from opening + this.disableClickOutside = true + setTimeout(() => { + this.disableClickOutside = false + }, 0) }, togglePicker () { this.showPicker = !this.showPicker @@ -151,12 +160,13 @@ const EmojiInput = { this.$emit('input', newValue) this.caret = 0 }, - insert (insertion) { + insert ({ insertion, spamMode }) { const newValue = [ this.value.substring(0, this.caret), insertion, this.value.substring(this.caret) ].join('') + this.spamMode = spamMode this.$emit('input', newValue) const position = this.caret + insertion.length @@ -191,7 +201,7 @@ const EmojiInput = { }, cycleBackward (e) { const len = this.suggestions.length || 0 - if (len > 0) { + if (len > 1) { this.highlighted -= 1 if (this.highlighted < 0) { this.highlighted = this.suggestions.length - 1 @@ -203,7 +213,7 @@ const EmojiInput = { }, cycleForward (e) { const len = this.suggestions.length || 0 - if (len > 0) { + if (len > 1) { this.highlighted += 1 if (this.highlighted >= len) { this.highlighted = 0 @@ -234,7 +244,10 @@ const EmojiInput = { this.blurTimeout = null } - this.showPicker = false + console.log(this.spamMode) + if (!this.spamMode) { + this.showPicker = false + } this.focused = true this.setCaret(e) this.resize() @@ -280,7 +293,8 @@ const EmojiInput = { this.resize() this.$emit('input', e.target.value) }, - onClickOutside () { + onClickOutside (e) { + if (this.disableClickOutside) return this.showPicker = false }, onStickerUploaded (e) { diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 0a64f759..bce5026e 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -13,9 +13,11 @@ const EmojiPicker = { }, data () { return { + labelKey: String(Math.random() * 100000), keyword: '', activeGroup: 'custom', - showingStickers: false + showingStickers: false, + spamMode: false } }, components: { @@ -24,8 +26,7 @@ const EmojiPicker = { methods: { onEmoji (emoji) { const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement - this.$emit('emoji', ` ${value} `) - this.open = false + this.$emit('emoji', { insertion: ` ${value} `, spamMode: this.spamMode }) }, highlight (key) { const ref = this.$refs['group-' + key] diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 6c13e82b..079eb362 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -10,29 +10,48 @@ margin: 0 !important; z-index: 1; - .panel-body { + .spam-mode { + padding: 7px; + line-height: normal; + } + .spam-mode-label { + padding: 7px; + } + + .heading { + display: flex; + height: 32px; + padding: 10px 7px 5px; + } + + .content { display: flex; flex-direction: column; flex: 1 1 0; min-height: 0px; } + .emoji-tabs { + flex-grow: 1; + } + .additional-tabs { border-left: 1px solid; border-left-color: $fallback--icon; border-left-color: var(--icon, $fallback--icon); - padding-left: 5px; + padding-left: 7px; flex: 0 0 0; } - .emoji-tabs { - flex: 1 1 0; - } - .additional-tabs, .emoji-tabs { + display: block; + min-width: 0; + flex-basis: auto; + flex-shrink: 1; + &-item { - padding: 0 5px; + padding: 0 7px; cursor: pointer; font-size: 24px; diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 12b1569e..901520aa 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -1,6 +1,6 @@ <template> - <div class="emoji-picker panel panel-default"> - <div class="panel-heading"> + <div class="emoji-picker panel panel-default panel-body"> + <div class="heading"> <span class="emoji-tabs"> <span v-for="group in emojis" @@ -30,7 +30,7 @@ </span> </span> </div> - <div class="panel-body"> + <div class="content"> <div class="emoji-content" :class="{hidden: showingStickers}" @@ -74,6 +74,16 @@ </span> </div> </div> + <div + class="spam-mode" + > + <input + :id="labelKey + 'spam-mode'" + v-model="spamMode" + type="checkbox" + > + <label class="spam-mode-label" :for="labelKey + 'spam-mode'">{{ $t('emoji.spam') }}</label> + </div> </div> <div v-if="showingStickers" diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 1359e75a..d468be76 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -282,7 +282,7 @@ const PostStatusForm = { target.style.height = null } }, - showEmoji () { + showEmojiPicker () { this.$refs['textarea'].focus() this.$refs['emoji-input'].triggerShowPicker() }, diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index ad2c2218..026cb8fe 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -170,7 +170,7 @@ <i :title="$t('emoji.add_emoji')" class="icon-smile btn btn-default" - @click.stop.prevent="showEmoji" + @click="showEmojiPicker" /> </div> <div diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 64218f6e..771615f3 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -413,7 +413,7 @@ v-if="replying" class="container" > - <post-status-form + <PostStatusForm class="reply-body" :reply-to="status.id" :attentions="status.attentions" diff --git a/src/components/user_panel/user_panel.vue b/src/components/user_panel/user_panel.vue index c92630e3..5cdb2914 100644 --- a/src/components/user_panel/user_panel.vue +++ b/src/components/user_panel/user_panel.vue @@ -11,7 +11,7 @@ rounded="top" /> <div class="panel-footer"> - <post-status-form v-if="user" /> + <PostStatusForm v-if="user" /> </div> </div> <auth-form diff --git a/src/i18n/en.json b/src/i18n/en.json index 12920b92..e74469ed 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -109,6 +109,7 @@ "emoji": { "stickers": "Stickers", "emoji": "Emoji", + "spam": "Keep open after adding emoji", "search_emoji": "Search for an emoji", "add_emoji": "Insert emoji", "custom": "Custom emoji", From 94afc5ee1963464fb0fd7c9a31266b37c924f3a3 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 8 Sep 2019 15:57:49 +0300 Subject: [PATCH 29/81] fixed scroll when switching back to emoji --- src/components/emoji_picker/emoji_picker.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 079eb362..e3a83bdd 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -83,7 +83,9 @@ min-height: 0; &.hidden { - display: none + opacity: 0; + pointer-events: none; + position: absolute; } } } From 83f45167b61d5f10f00ea8e3e3e946c72e5fc33f Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 8 Sep 2019 16:56:54 +0300 Subject: [PATCH 30/81] added emoji zoom for picker --- src/components/emoji_picker/emoji_picker.js | 8 +++++++ src/components/emoji_picker/emoji_picker.scss | 18 +++++++++++++++ src/components/emoji_picker/emoji_picker.vue | 22 ++++++++++++++++--- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index bce5026e..03870a99 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -17,6 +17,7 @@ const EmojiPicker = { keyword: '', activeGroup: 'custom', showingStickers: false, + zoomEmoji: false, spamMode: false } }, @@ -60,6 +61,13 @@ const EmojiPicker = { }, onStickerUploadFailed (e) { this.$emit('sticker-upload-failed', e) + }, + setZoomEmoji (e, emoji) { + this.zoomEmoji = emoji + const { x, y } = e.target.getBoundingClientRect() + console.log(e.target) + this.$refs['zoom-portal'].style.left = (x - 32) + 'px' + this.$refs['zoom-portal'].style.top = (y - 32) + 'px' } }, watch: { diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index e3a83bdd..872af2de 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -10,6 +10,20 @@ margin: 0 !important; z-index: 1; + .zoom-portal { + position: fixed; + pointer-events: none; + width: 96px; + height: 96px; + font-size: 96px; + line-height: 96px; + z-index: 10; + img { + width: 100%; + height: 100%; + } + } + .spam-mode { padding: 7px; line-height: normal; @@ -135,6 +149,10 @@ cursor: pointer; + &:hover { + opacity: 0 + } + img { max-width: 100%; max-height: 100%; diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 901520aa..5a8961d2 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -65,12 +65,16 @@ :title="emoji.displayText" class="emoji-item" @click.stop.prevent="onEmoji(emoji)" - > - <span v-if="!emoji.imageUrl">{{ emoji.replacement }}</span> + @mouseenter="setZoomEmoji($event, emoji)" + @mouseleave="setZoomEmoji($event, false)" + > + <span v-if="!emoji.imageUrl"> + {{ emoji.replacement }} + </span> <img v-else :src="emoji.imageUrl" - > + > </span> </div> </div> @@ -95,6 +99,18 @@ /> </div> </div> + <div ref="zoom-portal" class="zoom-portal"> + <span v-if="zoomEmoji"> + <span v-if="!zoomEmoji.imageUrl"> + {{ zoomEmoji.replacement }} + </span> + <img + v-else + :key="zoomEmoji.imageUrl" + :src="zoomEmoji.imageUrl" + > + </span> + </div> </div> </template> From 4f88bb4ea1ed6c4b9fa0ee6a388dd9ba19ee910e Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 8 Sep 2019 17:01:28 +0300 Subject: [PATCH 31/81] scale emoji on hover --- src/components/status/status.vue | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 771615f3..5e849dd7 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -705,6 +705,14 @@ $status-margin: 0.75em; &.emoji { width: 32px; height: 32px; + transition: transform 200ms; + transform: scale(1); + z-index: 1; + + &:hover { + transform: scale(3); + z-index: 2; + } } } From 2237da01513408ae2b2b8fbf1ea519dee6f82d33 Mon Sep 17 00:00:00 2001 From: HJ <30-hj@users.noreply.git.pleroma.social> Date: Sun, 8 Sep 2019 14:08:39 +0000 Subject: [PATCH 32/81] Apply suggestion to src/components/emoji_input/emoji_input.js --- src/components/emoji_input/emoji_input.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index b1640753..c74c531b 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -244,7 +244,6 @@ const EmojiInput = { this.blurTimeout = null } - console.log(this.spamMode) if (!this.spamMode) { this.showPicker = false } From 7360a4d9efe278aef672e96320f7161ad4f0d0f2 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 8 Sep 2019 17:11:45 +0300 Subject: [PATCH 33/81] fix aspect --- src/components/emoji_picker/emoji_picker.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 872af2de..7e76aa52 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -19,6 +19,7 @@ line-height: 96px; z-index: 10; img { + object-fit: contain; width: 100%; height: 100%; } @@ -154,6 +155,7 @@ } img { + object-fit: contain; max-width: 100%; max-height: 100%; } From 9146bee7aa7229f041bcc77814d9fa40809329a6 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 8 Sep 2019 21:18:05 +0300 Subject: [PATCH 34/81] better hitbox for status emoji --- src/components/status/status.vue | 23 ++++++++++++++----- .../entity_normalizer.service.js | 2 +- .../entity_normalizer.spec.js | 4 ++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 5e849dd7..a0756ae4 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -696,6 +696,22 @@ $status-margin: 0.75em; line-height: 1.4em; white-space: pre-wrap; + .emoji-container { + display: inline-block; + width: 32px; + height: 32px; + z-index: 1; + + &:hover { + z-index: 2; + + .emoji { + transform: scale(3); + z-index: 2; + } + } + } + img, video { max-width: 100%; max-height: 400px; @@ -707,12 +723,7 @@ $status-margin: 0.75em; height: 32px; transition: transform 200ms; transform: scale(1); - z-index: 1; - - &:hover { - transform: scale(3); - z-index: 2; - } + pointer-events: none; } } diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index 6cc1851d..17b4a6e0 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -194,7 +194,7 @@ export const addEmojis = (string, emojis) => { return emojis.reduce((acc, emoji) => { return acc.replace( new RegExp(`:${emoji.shortcode}:`, 'g'), - `<img src='${emoji.url}' alt='${emoji.shortcode}' title='${emoji.shortcode}' class='emoji' />` + `<span class='emoji-container'><img src='${emoji.url}' alt='${emoji.shortcode}' title='${emoji.shortcode}' class='emoji' /></span>` ) }, string) } diff --git a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js index 20e03cb0..24aef5cd 100644 --- a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js +++ b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js @@ -323,9 +323,9 @@ describe('API Entities normalizer', () => { describe('MastoAPI emoji adder', () => { const emojis = makeMockEmojiMasto() - const imageHtml = '<img src="https://example.com/image.png" alt="image" title="image" class="emoji" />' + const imageHtml = '<span class="emoji-container"><img src="https://example.com/image.png" alt="image" title="image" class="emoji" /></span>' .replace(/"/g, '\'') - const thinkHtml = '<img src="https://example.com/think.png" alt="thinking" title="thinking" class="emoji" />' + const thinkHtml = '<span class="emoji-container"><img src="https://example.com/think.png" alt="thinking" title="thinking" class="emoji" /></span>' .replace(/"/g, '\'') it('correctly replaces shortcodes in supplied string', () => { From 96512939564aeb00660acd10a409879c1bfb33e4 Mon Sep 17 00:00:00 2001 From: HJ <30-hj@users.noreply.git.pleroma.social> Date: Mon, 9 Sep 2019 19:42:33 +0000 Subject: [PATCH 35/81] Apply suggestion to src/components/emoji_picker/emoji_picker.js --- src/components/emoji_picker/emoji_picker.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 03870a99..d9d41bf6 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -65,7 +65,6 @@ const EmojiPicker = { setZoomEmoji (e, emoji) { this.zoomEmoji = emoji const { x, y } = e.target.getBoundingClientRect() - console.log(e.target) this.$refs['zoom-portal'].style.left = (x - 32) + 'px' this.$refs['zoom-portal'].style.top = (y - 32) + 'px' } From 6217ef4718ae6241bad7be04054dc062821cba5f Mon Sep 17 00:00:00 2001 From: tarteka <info@tarteka.net> Date: Tue, 10 Sep 2019 10:09:07 +0200 Subject: [PATCH 36/81] fix some translates --- src/i18n/eu.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/eu.json b/src/i18n/eu.json index 0120acc5..ad8f4c05 100644 --- a/src/i18n/eu.json +++ b/src/i18n/eu.json @@ -603,10 +603,10 @@ } }, "search": { - "people": "Gendea", + "people": "Erabiltzaileak", "hashtags": "Traolak", "person_talking": "{count} pertsona hitzegiten", - "people_talking": "{count} gende hitzegiten", + "people_talking": "{count} jende hitzegiten", "no_results": "Emaitzarik ez" }, "password_reset": { From 4f0195b05c3124104b3e09d4b9d1f73c9d74440a Mon Sep 17 00:00:00 2001 From: HJ <30-hj@users.noreply.git.pleroma.social> Date: Tue, 10 Sep 2019 18:39:45 +0000 Subject: [PATCH 37/81] Apply suggestion to src/components/emoji_picker/emoji_picker.vue --- src/components/emoji_picker/emoji_picker.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 5a8961d2..1c91c8b7 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -67,7 +67,7 @@ @click.stop.prevent="onEmoji(emoji)" @mouseenter="setZoomEmoji($event, emoji)" @mouseleave="setZoomEmoji($event, false)" - > + > <span v-if="!emoji.imageUrl"> {{ emoji.replacement }} </span> From 0d8b68632b02565e5ba7a833e91e41daabb4a1dc Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Thu, 12 Sep 2019 19:15:22 +0300 Subject: [PATCH 38/81] Remove emoji zoom --- src/components/emoji_picker/emoji_picker.js | 7 ------- src/components/emoji_picker/emoji_picker.scss | 19 ------------------ src/components/emoji_picker/emoji_picker.vue | 20 ++----------------- src/components/status/status.vue | 19 ------------------ .../entity_normalizer.service.js | 2 +- .../entity_normalizer.spec.js | 4 ++-- 6 files changed, 5 insertions(+), 66 deletions(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index d9d41bf6..bce5026e 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -17,7 +17,6 @@ const EmojiPicker = { keyword: '', activeGroup: 'custom', showingStickers: false, - zoomEmoji: false, spamMode: false } }, @@ -61,12 +60,6 @@ const EmojiPicker = { }, onStickerUploadFailed (e) { this.$emit('sticker-upload-failed', e) - }, - setZoomEmoji (e, emoji) { - this.zoomEmoji = emoji - const { x, y } = e.target.getBoundingClientRect() - this.$refs['zoom-portal'].style.left = (x - 32) + 'px' - this.$refs['zoom-portal'].style.top = (y - 32) + 'px' } }, watch: { diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 7e76aa52..472db35b 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -10,21 +10,6 @@ margin: 0 !important; z-index: 1; - .zoom-portal { - position: fixed; - pointer-events: none; - width: 96px; - height: 96px; - font-size: 96px; - line-height: 96px; - z-index: 10; - img { - object-fit: contain; - width: 100%; - height: 100%; - } - } - .spam-mode { padding: 7px; line-height: normal; @@ -150,10 +135,6 @@ cursor: pointer; - &:hover { - opacity: 0 - } - img { object-fit: contain; max-width: 100%; diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 1c91c8b7..901520aa 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -65,16 +65,12 @@ :title="emoji.displayText" class="emoji-item" @click.stop.prevent="onEmoji(emoji)" - @mouseenter="setZoomEmoji($event, emoji)" - @mouseleave="setZoomEmoji($event, false)" > - <span v-if="!emoji.imageUrl"> - {{ emoji.replacement }} - </span> + <span v-if="!emoji.imageUrl">{{ emoji.replacement }}</span> <img v-else :src="emoji.imageUrl" - > + > </span> </div> </div> @@ -99,18 +95,6 @@ /> </div> </div> - <div ref="zoom-portal" class="zoom-portal"> - <span v-if="zoomEmoji"> - <span v-if="!zoomEmoji.imageUrl"> - {{ zoomEmoji.replacement }} - </span> - <img - v-else - :key="zoomEmoji.imageUrl" - :src="zoomEmoji.imageUrl" - > - </span> - </div> </div> </template> diff --git a/src/components/status/status.vue b/src/components/status/status.vue index a0756ae4..771615f3 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -696,22 +696,6 @@ $status-margin: 0.75em; line-height: 1.4em; white-space: pre-wrap; - .emoji-container { - display: inline-block; - width: 32px; - height: 32px; - z-index: 1; - - &:hover { - z-index: 2; - - .emoji { - transform: scale(3); - z-index: 2; - } - } - } - img, video { max-width: 100%; max-height: 400px; @@ -721,9 +705,6 @@ $status-margin: 0.75em; &.emoji { width: 32px; height: 32px; - transition: transform 200ms; - transform: scale(1); - pointer-events: none; } } diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index 17b4a6e0..6cc1851d 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -194,7 +194,7 @@ export const addEmojis = (string, emojis) => { return emojis.reduce((acc, emoji) => { return acc.replace( new RegExp(`:${emoji.shortcode}:`, 'g'), - `<span class='emoji-container'><img src='${emoji.url}' alt='${emoji.shortcode}' title='${emoji.shortcode}' class='emoji' /></span>` + `<img src='${emoji.url}' alt='${emoji.shortcode}' title='${emoji.shortcode}' class='emoji' />` ) }, string) } diff --git a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js index 24aef5cd..20e03cb0 100644 --- a/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js +++ b/test/unit/specs/services/entity_normalizer/entity_normalizer.spec.js @@ -323,9 +323,9 @@ describe('API Entities normalizer', () => { describe('MastoAPI emoji adder', () => { const emojis = makeMockEmojiMasto() - const imageHtml = '<span class="emoji-container"><img src="https://example.com/image.png" alt="image" title="image" class="emoji" /></span>' + const imageHtml = '<img src="https://example.com/image.png" alt="image" title="image" class="emoji" />' .replace(/"/g, '\'') - const thinkHtml = '<span class="emoji-container"><img src="https://example.com/think.png" alt="thinking" title="thinking" class="emoji" /></span>' + const thinkHtml = '<img src="https://example.com/think.png" alt="thinking" title="thinking" class="emoji" />' .replace(/"/g, '\'') it('correctly replaces shortcodes in supplied string', () => { From 9bd0ed7912291fb815c952180422381bea9eb3c0 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Thu, 12 Sep 2019 20:14:35 +0300 Subject: [PATCH 39/81] updated logic for hiding picker and also added ability to hide suggestions with esc key --- src/components/emoji_input/emoji_input.js | 62 +++++++++++++++++------ 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index c74c531b..6dc006f8 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -78,6 +78,7 @@ const EmojiInput = { focused: false, blurTimeout: null, showPicker: false, + temporarilyHideSuggestions: false, spamMode: false, disableClickOutside: false } @@ -102,7 +103,11 @@ const EmojiInput = { })) }, showSuggestions () { - return this.focused && this.suggestions && this.suggestions.length > 0 && !this.showPicker + return this.focused && + this.suggestions && + this.suggestions.length > 0 && + !this.showPicker && + !this.temporarilyHideSuggestions }, textAtCaret () { return (this.wordAtCaret || {}).word || '' @@ -153,6 +158,7 @@ const EmojiInput = { }, 0) }, togglePicker () { + this.input.elm.focus() this.showPicker = !this.showPicker }, replace (replacement) { @@ -250,44 +256,68 @@ const EmojiInput = { this.focused = true this.setCaret(e) this.resize() + this.temporarilyHideSuggestions = false }, onKeyUp (e) { + const { key } = e this.setCaret(e) this.resize() + + // Setting hider in keyUp to prevent suggestions from blinking + // when moving away from suggested spot + if (key === 'Escape') { + this.temporarilyHideSuggestions = true + } else { + this.temporarilyHideSuggestions = false + } }, onPaste (e) { this.setCaret(e) this.resize() }, onKeyDown (e) { - this.setCaret(e) - this.resize() - const { ctrlKey, shiftKey, key } = e - if (key === 'Tab') { - if (shiftKey) { + // Disable suggestions hotkeys if suggestions are hidden + if (!this.temporarilyHideSuggestions) { + if (key === 'Tab') { + if (shiftKey) { + this.cycleBackward(e) + } else { + this.cycleForward(e) + } + } + if (key === 'ArrowUp') { this.cycleBackward(e) - } else { + } else if (key === 'ArrowDown') { this.cycleForward(e) } - } - if (key === 'ArrowUp') { - this.cycleBackward(e) - } else if (key === 'ArrowDown') { - this.cycleForward(e) - } - if (key === 'Enter') { - if (!ctrlKey) { - this.replaceText(e) + if (key === 'Enter') { + if (!ctrlKey) { + this.replaceText(e) + } } } + // Probably add optional keyboard controls for emoji picker? + + // Escape hides suggestions, if suggestions are hidden it + // de-focuses the element (i.e. default browser behavior) + if (key === 'Escape') { + if (!this.temporarilyHideSuggestions) { + this.input.elm.focus() + } + } + + this.showPicker = false + this.resize() }, onInput (e) { this.showPicker = false this.setCaret(e) + this.resize() this.$emit('input', e.target.value) }, onCompositionUpdate (e) { + this.showPicker = false this.setCaret(e) this.resize() this.$emit('input', e.target.value) From 3505e53756562b4d7b304d0da9910c4528b25959 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Thu, 12 Sep 2019 20:36:43 +0300 Subject: [PATCH 40/81] review/naming + bugfix for stickers --- src/components/emoji_input/emoji_input.js | 17 ++++++++++++++--- src/components/emoji_input/emoji_input.vue | 8 ++++---- src/components/emoji_picker/emoji_picker.js | 5 ++++- src/components/emoji_picker/emoji_picker.vue | 2 +- .../post_status_form/post_status_form.vue | 8 ++++---- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 6dc006f8..94af6e2f 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -54,17 +54,28 @@ const EmojiInput = { required: true, type: String }, - emojiPicker: { + enableEmojiPicker: { + /** + * Enables emoji picker support, this implies that custom emoji are supported + */ required: false, type: Boolean, default: false }, - emojiPickerExternalTrigger: { + hideEmojiButton: { + /** + enableStickerPicker: { + * intended to use with external picker trigger, i.e. you have a button outside + * input that will open up the picker, see triggerShowPicker() + */ required: false, type: Boolean, default: false }, - stickerPicker: { + enableStickerPicker: { + /** + * Enables sticker picker support, only makes sense when enableEmojiPicker=true + */ required: false, type: Boolean, default: false diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue index b077e6e9..53b38573 100644 --- a/src/components/emoji_input/emoji_input.vue +++ b/src/components/emoji_input/emoji_input.vue @@ -4,19 +4,19 @@ class="emoji-input" > <slot /> - <template v-if="emojiPicker"> + <template v-if="enableEmojiPicker"> <div - v-if="!emojiPickerExternalTrigger" + v-if="!hideEmojiButton" class="emoji-picker-icon" @click.prevent="togglePicker" > <i class="icon-smile" /> </div> <EmojiPicker - v-if="emojiPicker" + v-if="enableEmojiPicker" ref="picker" :class="{ hide: !showPicker }" - :sticker-picker="stickerPicker" + :enable-sticker-picker="enableStickerPicker" class="emoji-picker-panel" @emoji="insert" @sticker-uploaded="onStickerUploaded" diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index bce5026e..570ace13 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -5,7 +5,7 @@ const filterByKeyword = (list, keyword = '') => { const EmojiPicker = { props: { - stickerPicker: { + enableStickerPicker: { required: false, type: Boolean, default: false @@ -97,6 +97,9 @@ const EmojiPicker = { }, emojisView () { return this.emojis.filter(value => value.emojis.length > 0) + }, + stickerPickerEnabled () { + return (this.$store.state.instance.stickers || []).length !== 0 } } } diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 901520aa..5c139d0e 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -17,7 +17,7 @@ </span> </span> <span - v-if="stickerPicker" + v-if="stickerPickerEnabled" class="additional-tabs" > <span diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 026cb8fe..0e0b0e60 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -61,7 +61,7 @@ <EmojiInput v-if="newStatus.spoilerText || alwaysShowSubject" v-model="newStatus.spoilerText" - emoji-picker + enable-emoji-picker :suggest="emojiSuggestor" class="form-control" > @@ -78,9 +78,9 @@ v-model="newStatus.status" :suggest="emojiUserSuggestor" class="form-control main-input" - emoji-picker - emoji-picker-external-trigger - sticker-picker + enable-emoji-picker + hide-emoji-button + enable-sticker-picker @sticker-uploaded="addMediaFile" @sticker-upload-failed="uploadFailed" > From f0cb6fe03faa1994fb667255d4051fe611b2afbc Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 15 Sep 2019 01:16:54 +0300 Subject: [PATCH 41/81] Fixed scrollability not being obvious, added fade effect --- src/components/emoji_picker/emoji_picker.js | 8 ++++++++ src/components/emoji_picker/emoji_picker.scss | 18 +++++++++++++++++- src/components/emoji_picker/emoji_picker.vue | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 570ace13..8c60916b 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -17,6 +17,7 @@ const EmojiPicker = { keyword: '', activeGroup: 'custom', showingStickers: false, + groupsScrolledClass: 'scrolled-top', spamMode: false } }, @@ -40,6 +41,13 @@ const EmojiPicker = { scrolledGroup (e) { const target = (e && e.target) || this.$refs['emoji-groups'] const top = target.scrollTop + 5 + if (target.scrollTop <= 5) { + this.groupsScrolledClass = 'scrolled-top' + } else if (target.scrollTop >= target.scrollTopMax - 5) { + this.groupsScrolledClass = 'scrolled-bottom' + } else { + this.groupsScrolledClass = 'scrolled-middle' + } this.$nextTick(() => { this.emojisView.forEach(group => { const ref = this.$refs['group-' + group.id] diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 472db35b..8c07fd27 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -6,7 +6,7 @@ position: absolute; right: 0; left: 0; - height: 300px; + height: 320px; margin: 0 !important; z-index: 1; @@ -104,6 +104,22 @@ flex: 1 1 1px; position: relative; overflow: auto; + mask: linear-gradient(to top, white 0, transparent 100%) bottom no-repeat, + linear-gradient(to bottom, white 0, transparent 100%) top no-repeat, + linear-gradient(to top, white, white); + transition: mask-size 150ms; + mask-size: 100% 20px, 100% 20px, auto; + // Autoprefixed seem to ignore this one, and also syntax is different + -webkit-mask-composite: xor; + mask-composite: exclude; + &.scrolled { + &-top { + mask-size: 100% 20px, 100% 0, auto; + } + &-bottom { + mask-size: 100% 0, 100% 20px, auto; + } + } } &-group { diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 5c139d0e..8bc7c382 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -46,6 +46,7 @@ <div ref="emoji-groups" class="emoji-groups" + :class="groupsScrolledClass" @scroll="scrolledGroup" > <div From d2fe79782119c061173c1b07753f634f0766bae9 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 15 Sep 2019 02:14:40 +0300 Subject: [PATCH 42/81] update status/user card to use same gradient mask fading effect instead of background hack --- src/components/status/status.vue | 16 ++++++++------ src/components/user_card/user_card.js | 11 +--------- src/components/user_card/user_card.vue | 30 ++++++++++++++++++++++---- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 771615f3..93f37a49 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -665,6 +665,15 @@ $status-margin: 0.75em; height: 220px; overflow-x: hidden; overflow-y: hidden; + z-index: 1; + .status-content { + height: 100%; + mask: linear-gradient(to top, white, transparent) bottom/100% 70px no-repeat, + linear-gradient(to top, white, white); + // Autoprefixed seem to ignore this one, and also syntax is different + -webkit-mask-composite: xor; + mask-composite: exclude; + } } .tall-status-hider { @@ -676,12 +685,7 @@ $status-margin: 0.75em; width: 100%; text-align: center; line-height: 110px; - background: linear-gradient(to bottom, rgba(0, 0, 0, 0), $fallback--bg 80%); - background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--bg, $fallback--bg) 80%); - &_focused { - background: linear-gradient(to bottom, rgba(0, 0, 0, 0), $fallback--lightBg 80%); - background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--lightBg, $fallback--lightBg) 80%); - } + z-index: 2; } .status-unhider, .cw-status-hider { diff --git a/src/components/user_card/user_card.js b/src/components/user_card/user_card.js index 82d3b835..e41a3180 100644 --- a/src/components/user_card/user_card.js +++ b/src/components/user_card/user_card.js @@ -38,19 +38,10 @@ export default { const rgb = (typeof color === 'string') ? hex2rgb(color) : color const tintColor = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .5)` - const gradient = [ - [tintColor, this.hideBio ? '60%' : ''], - this.hideBio ? [ - color, '100%' - ] : [ - tintColor, '' - ] - ].map(_ => _.join(' ')).join(', ') - return { backgroundColor: `rgb(${Math.floor(rgb.r * 0.53)}, ${Math.floor(rgb.g * 0.56)}, ${Math.floor(rgb.b * 0.59)})`, backgroundImage: [ - `linear-gradient(to bottom, ${gradient})`, + `linear-gradient(to bottom, ${tintColor}, ${tintColor})`, `url(${this.user.cover_photo})` ].join(', ') } diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index fc18e240..c2626260 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -2,8 +2,9 @@ <div class="user-card" :class="classes" - :style="style" > + <div :class="{ 'hide-bio': hideBio }" :style="style" class="background-image"> + </div> <div class="panel-heading"> <div class="user-info"> <div class="container"> @@ -298,7 +299,7 @@ @import '../../_variables.scss'; .user-card { - background-size: cover; + position: relative; .panel-heading { padding: .5em 0; @@ -307,14 +308,35 @@ background: transparent; flex-direction: column; align-items: stretch; + // create new stacking context + position: relative; } .panel-body { word-wrap: break-word; - background: linear-gradient(to bottom, rgba(0, 0, 0, 0), $fallback--bg 80%); - background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--bg, $fallback--bg) 80%); border-bottom-right-radius: inherit; border-bottom-left-radius: inherit; + // create new stacking context + position: relative; + } + + .background-image { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + mask: linear-gradient(to top, white, transparent) bottom no-repeat, + linear-gradient(to top, white, white); + // Autoprefixed seem to ignore this one, and also syntax is different + -webkit-mask-composite: xor; + mask-composite: exclude; + background-size: cover; + mask-size: 100% 60%; + + &.hide-bio { + mask-size: 100% 40px; + } } p { From e366adbb6ca83f526c71d26ed03e20790b21af74 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 15 Sep 2019 12:09:19 +0300 Subject: [PATCH 43/81] updated logic for padding with spaces, improved spam mode --- src/components/emoji_input/emoji_input.js | 29 +++++++++++++++++-- src/components/emoji_picker/emoji_picker.js | 2 +- src/components/emoji_picker/emoji_picker.scss | 4 ++- src/components/emoji_picker/emoji_picker.vue | 6 +++- src/i18n/en.json | 2 +- 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 94af6e2f..41ee239c 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -178,14 +178,37 @@ const EmojiInput = { this.caret = 0 }, insert ({ insertion, spamMode }) { + const before = this.value.substring(0, this.caret) || '' + const after = this.value.substring(this.caret) || '' + + /* Using a bit more smart approach to padding emojis with spaces: + * - put a space before cursor if there isn't one already, unless we + * are at the beginning of post or in spam mode + * - put a space after emoji if there isn't one already unless we are + * in spam mode + * + * The idea is that when you put a cursor somewhere in between sentence + * inserting just ' :emoji: ' will add more spaces to post which might + * break the flow/spacing, as well as the case where user ends sentence + * with a space before adding emoji. + * + * Spam mode is intended for creating multi-part emojis and overall spamming + * them, masto seem to be rendering :emoji::emoji: correctly now so why not + */ + const isSpaceRegex = /\s/ + const spaceBefore = !isSpaceRegex.exec(before.slice(-1)) && before.length && !spamMode > 0 ? ' ' : '' + const spaceAfter = !isSpaceRegex.exec(after[0]) && !spamMode ? ' ' : '' + const newValue = [ - this.value.substring(0, this.caret), + before, + spaceBefore, insertion, - this.value.substring(this.caret) + spaceAfter, + after ].join('') this.spamMode = spamMode this.$emit('input', newValue) - const position = this.caret + insertion.length + const position = this.caret + (insertion + spaceAfter + spaceBefore).length this.$nextTick(function () { // Re-focus inputbox after clicking suggestion diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 8c60916b..cb93f0c1 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -27,7 +27,7 @@ const EmojiPicker = { methods: { onEmoji (emoji) { const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement - this.$emit('emoji', { insertion: ` ${value} `, spamMode: this.spamMode }) + this.$emit('emoji', { insertion: value, spamMode: this.spamMode }) }, highlight (key) { const ref = this.$refs['group-' + key] diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 8c07fd27..09438898 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -15,7 +15,8 @@ line-height: normal; } .spam-mode-label { - padding: 7px; + padding: 0 7px; + display: flex; } .heading { @@ -104,6 +105,7 @@ flex: 1 1 1px; position: relative; overflow: auto; + user-select: none; mask: linear-gradient(to top, white 0, transparent 100%) bottom no-repeat, linear-gradient(to bottom, white 0, transparent 100%) top no-repeat, linear-gradient(to top, white, white); diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 8bc7c382..b32d0862 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -83,7 +83,11 @@ v-model="spamMode" type="checkbox" > - <label class="spam-mode-label" :for="labelKey + 'spam-mode'">{{ $t('emoji.spam') }}</label> + <label class="spam-mode-label" :for="labelKey + 'spam-mode'"> + <div class="spam-mode-label-text"> + {{ $t('emoji.spam') }} + </div> + </label> </div> </div> <div diff --git a/src/i18n/en.json b/src/i18n/en.json index e74469ed..7676e7a8 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -109,7 +109,7 @@ "emoji": { "stickers": "Stickers", "emoji": "Emoji", - "spam": "Keep open after adding emoji", + "spam": "Keep picker open, don't separate emoji with spaces", "search_emoji": "Search for an emoji", "add_emoji": "Insert emoji", "custom": "Custom emoji", From a1ed1b9b538728cc95f720b748efde111ec44a8a Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 15 Sep 2019 12:28:52 +0300 Subject: [PATCH 44/81] improved post form's icons at bottom display --- src/components/media_upload/media_upload.vue | 16 +++++---- .../post_status_form/post_status_form.vue | 36 +++++++++++++++---- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/components/media_upload/media_upload.vue b/src/components/media_upload/media_upload.vue index ac32ae83..1dda7bc1 100644 --- a/src/components/media_upload/media_upload.vue +++ b/src/components/media_upload/media_upload.vue @@ -31,12 +31,14 @@ <script src="./media_upload.js" ></script> <style> - .media-upload { - font-size: 26px; - min-width: 50px; - } +.media-upload { + .icon-upload { + cursor: pointer; + } - .icon-upload { - cursor: pointer; - } + label { + display: block; + width: 100%; + } +} </style> diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 0e0b0e60..89e51b97 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -159,6 +159,7 @@ <div class="form-bottom-left"> <media-upload ref="mediaUpload" + class="media-upload-icon" :drop-files="dropFiles" @uploading="disableSubmit" @uploaded="addMediaFile" @@ -176,11 +177,11 @@ <div v-if="pollsAvailable" class="poll-icon" + :class="{ selected: pollFormVisible }" > <i :title="$t('polls.add_poll')" class="icon-chart-bar btn btn-default" - :class="pollFormVisible && 'selected'" @click="togglePollForm" /> </div> @@ -316,6 +317,8 @@ .form-bottom-left { display: flex; flex: 1; + padding-right: 7px; + margin-right: 7px; } .text-format { @@ -325,19 +328,38 @@ } } - .poll-icon, .emoji-icon { + .media-upload-icon, .poll-icon, .emoji-icon { font-size: 26px; flex: 1; - .selected { - color: $fallback--lightText; - color: var(--lightText, $fallback--lightText); + i { + display: block; + width: 100%; + } + + &.selected, &:hover { + // needs to be specific to override icon default color + i, label { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } } } + // Order is not necessary but a good indicator + .media-upload-icon { + order: 1; + text-align: left; + } + .emoji-icon { - flex: 0; - min-width: 50px; + order: 2; + text-align: center; + } + + .poll-icon { + order: 3; + text-align: right; } .icon-chart-bar { From 312e2aa14f044920cb8baa5e9bc296b992194dbd Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 15 Sep 2019 12:51:39 +0300 Subject: [PATCH 45/81] fix bottom-left icons being too damn wide --- src/components/post_status_form/post_status_form.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 89e51b97..b50607e6 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -300,6 +300,7 @@ .post-status-form { .form-bottom { display: flex; + justify-content: space-between; padding: 0.5em; height: 32px; @@ -319,6 +320,7 @@ flex: 1; padding-right: 7px; margin-right: 7px; + max-width: 10em; } .text-format { From db961af3c8ee11823a4b33c3127635c280996183 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 15 Sep 2019 16:01:57 +0300 Subject: [PATCH 46/81] unit test for emoji input, for now covering only insertion mechanism --- .../unit/specs/components/emoji_input.spec.js | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 test/unit/specs/components/emoji_input.spec.js diff --git a/test/unit/specs/components/emoji_input.spec.js b/test/unit/specs/components/emoji_input.spec.js new file mode 100644 index 00000000..5f24331a --- /dev/null +++ b/test/unit/specs/components/emoji_input.spec.js @@ -0,0 +1,122 @@ +import { shallowMount, createLocalVue } from '@vue/test-utils' +import EmojiInput from 'src/components/emoji_input/emoji_input.vue' + +const generateInput = (value) => { + const localVue = createLocalVue() + localVue.directive('click-outside', () => {}) + const wrapper = shallowMount(EmojiInput, { + propsData: { + suggest: () => [], + enableEmojiPicker: true, + value + }, + slots: { + default: '<input />' + }, + localVue + }) + return [wrapper, localVue] +} + +describe('EmojiInput', () => { + describe('insertion mechanism', () => { + it('inserts string at the end with trailing space', () => { + const initialString = 'Testing' + const [wrapper] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: initialString.length }) + wrapper.vm.insert({ insertion: '(test)', spamMode: false }) + expect(wrapper.emitted().input[0][0]).to.eql('Testing (test) ') + }) + + it('inserts string at the end with trailing space (source has a trailing space)', () => { + const initialString = 'Testing ' + const [wrapper] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: initialString.length }) + wrapper.vm.insert({ insertion: '(test)', spamMode: false }) + expect(wrapper.emitted().input[0][0]).to.eql('Testing (test) ') + }) + + it('inserts string at the begginning without leading space', () => { + const initialString = 'Testing' + const [wrapper] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: 0 }) + wrapper.vm.insert({ insertion: '(test)', spamMode: false }) + expect(wrapper.emitted().input[0][0]).to.eql('(test) Testing') + }) + + it('inserts string between words without creating extra spaces', () => { + const initialString = 'Spurdo Sparde' + const [wrapper] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: 6 }) + wrapper.vm.insert({ insertion: ':ebin:', spamMode: false }) + expect(wrapper.emitted().input[0][0]).to.eql('Spurdo :ebin: Sparde') + }) + + it('inserts string between words without creating extra spaces (other caret)', () => { + const initialString = 'Spurdo Sparde' + const [wrapper] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: 7 }) + wrapper.vm.insert({ insertion: ':ebin:', spamMode: false }) + expect(wrapper.emitted().input[0][0]).to.eql('Spurdo :ebin: Sparde') + }) + + it('inserts string without any padding in spam mode', () => { + const initialString = 'Eat some spam!' + const [wrapper] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: initialString.length }) + wrapper.vm.insert({ insertion: ':spam:', spamMode: true }) + expect(wrapper.emitted().input[0][0]).to.eql('Eat some spam!:spam:') + }) + + it('correctly sets caret after insertion at beginning', (done) => { + const initialString = '1234' + const [wrapper, vue] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: 0 }) + wrapper.vm.insert({ insertion: '1234', spamMode: false }) + vue.nextTick(() => { + expect(wrapper.vm.caret).to.eql(5) + done() + }) + }) + + it('correctly sets caret after insertion at end', (done) => { + const initialString = '1234' + const [wrapper, vue] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: initialString.length }) + wrapper.vm.insert({ insertion: '1234', spamMode: false }) + vue.nextTick(() => { + expect(wrapper.vm.caret).to.eql(10) + done() + }) + }) + + it('correctly sets caret after insertion in spam mode', (done) => { + const initialString = '1234' + const [wrapper, vue] = generateInput(initialString) + const input = wrapper.find('input') + input.setValue(initialString) + wrapper.setData({ caret: initialString.length }) + wrapper.vm.insert({ insertion: '1234', spamMode: true }) + vue.nextTick(() => { + expect(wrapper.vm.caret).to.eql(8) + done() + }) + }) + }) +}) From f961ce0f98c655364c6b780bc4dbf8f635e32cbc Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 15 Sep 2019 16:40:31 +0300 Subject: [PATCH 47/81] docs update --- docs/USER_GUIDE.md | 7 +++++++ docs/example_emoji.png | Bin 0 -> 491 bytes 2 files changed, 7 insertions(+) create mode 100644 docs/example_emoji.png diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index cb95a244..81490f22 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -23,6 +23,13 @@ Posts will contain the text you are posting, but some content will be modified: **Depending on your instance some of the options might not be available or have different defaults** Let's clear up some basic stuff. When you post something it's called a **post** or it could be called a **status** or even a **toot** or a **prööt** depending on whom you ask. Post has body/content but it also has some other stuff in it - from attachments, visibility scope, subject line. +* **Emoji** are small images embedded in text, there are two major types of emoji: [unicode emoji](https://en.wikipedia.org/wiki/Emoji) and custom emoji. While unicode emoji are universal and standardized, they can appear differently depending on where you are using them or may not appear at all on older systems. Custom emoji are more *fun* kind - instance administrator can define many images as *custom emoji* for their users. This works very simple - custom emoji is defined by its *shortcode* and an image, so that any shortcode enclosed in colons get replaced with image if such shortcode exist. +Let's say there's `:pleroma:` emoji defined on instance. That means +> First time using :pleroma: pleroma! +will become +> First time using  pleroma! +Note that you can only use emoji defined on your instance, you cannot "copy" someone else's emoji, and will have to ask your administrator to copy emoji from other instance to yours. +Lastly, there's two convenience options for emoji: an emoji picker (smiley face to the right of "submit" button) and autocomplete suggestions - when you start typing :shortcode: it will automatically try to suggest you emoj and complete the shortcode for you if you select one. **Note** that if emoji doesn't show up in suggestions nor in emoji picker it means there's no such emoji on your instance, if shortcode doesn't match any defined emoji it will appear as text. * **Attachments** are fairly simple - you can attach any file to a post as long as the file is within maximum size limits. If you're uploading explicit material you can mark all of your attachments as sensitive (or add `#nsfw` tag) - it will hide the images and videos behind a warning so that it won't be displayed instantly. * **Subject line** also known as **CW** (Content Warning) could be used as a header to the post and/or to warn others about contents of the post having something that might upset somebody or something among those lines. Several applications allow to hide post content leaving only subject line visible. As a side-effect using subject line will also mark your images as sensitive (see above). * **Visiblity scope** controls who will be able to see your posts. There are four scopes available: diff --git a/docs/example_emoji.png b/docs/example_emoji.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22a256b00f1fbe962cd1988ec4df5cb6024bec GIT binary patch literal 491 zcmV<H0Tlj;P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800006VoOIv00000 z008+zyMF)x010qNS#tmY4c7nw4c7reD4Tcy000McNliru;|UK99uGxP0JZ=C0eDG7 zK~z}7?U%bs13?sqzu80+MKQ?+g0T?1AxgjtwpJpDR)SawzJiT{78crw=mQ9X)|MK? z)__(K@rFW7q2eX(njq$agp7?S+sGD4rZ9gu!x{c><{Zw<2*9B?w#`Yw4B)3cGKFN_ ze2T3Iy{UCUO0kRr3CX<h1=|gfI%;HS3e5rh8j9t#8#vV2z<96DO(H{~0C6Kn_&f!` zXvjm0-))IMz0VMdy%z^yEaYW#s^xp+1z`U&^#d@`r!&&+v8>sMBy0iLO2K4*>B__w z!1YU3Ex>19ss$*eDgY$|2zsj30ys5=Ct#%WEbcuNw-x`T>FwJ}5mo?7{~q{Dv%^6K zn(Hic;fo|&$FJo9=xVHCu)W@TgFa`~rodGt)B<z{YSaSkM9tzA;bH8ZT)tqLiyOIL zvlEl(T^fO)BjDoTD#h+u%HHS17i^RNx({d|Oojf2CZt?f<t|~(k^Oi(a@YH^0(yYj ha_wBgQt~mj`UUGlZ3B9NqGJF6002ovPDHLkV1gA2(P{ty literal 0 HcmV?d00001 From c78c7e7734d43d3adf1de8c2416ffc60305954b4 Mon Sep 17 00:00:00 2001 From: HJ <30-hj@users.noreply.git.pleroma.social> Date: Sun, 15 Sep 2019 13:43:42 +0000 Subject: [PATCH 48/81] Update docs/USER_GUIDE.md --- docs/USER_GUIDE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index 81490f22..18b6c560 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -26,8 +26,10 @@ Let's clear up some basic stuff. When you post something it's called a **post** * **Emoji** are small images embedded in text, there are two major types of emoji: [unicode emoji](https://en.wikipedia.org/wiki/Emoji) and custom emoji. While unicode emoji are universal and standardized, they can appear differently depending on where you are using them or may not appear at all on older systems. Custom emoji are more *fun* kind - instance administrator can define many images as *custom emoji* for their users. This works very simple - custom emoji is defined by its *shortcode* and an image, so that any shortcode enclosed in colons get replaced with image if such shortcode exist. Let's say there's `:pleroma:` emoji defined on instance. That means > First time using :pleroma: pleroma! + will become > First time using  pleroma! + Note that you can only use emoji defined on your instance, you cannot "copy" someone else's emoji, and will have to ask your administrator to copy emoji from other instance to yours. Lastly, there's two convenience options for emoji: an emoji picker (smiley face to the right of "submit" button) and autocomplete suggestions - when you start typing :shortcode: it will automatically try to suggest you emoj and complete the shortcode for you if you select one. **Note** that if emoji doesn't show up in suggestions nor in emoji picker it means there's no such emoji on your instance, if shortcode doesn't match any defined emoji it will appear as text. * **Attachments** are fairly simple - you can attach any file to a post as long as the file is within maximum size limits. If you're uploading explicit material you can mark all of your attachments as sensitive (or add `#nsfw` tag) - it will hide the images and videos behind a warning so that it won't be displayed instantly. From c933f5edfcf50b8e8ed17ae52a8fb4df04e8c7cf Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Sun, 15 Sep 2019 17:19:17 +0300 Subject: [PATCH 49/81] changelog --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..ff4c2fd1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), + +## [Unreleased] +### Added +- Emoji picker +- Started changelog anew +### Changed +- changed the way fading effects for user profile/long statuses works, now uses css-mask instead of gradient background hacks which weren't exactly compatible with semi-transparent themes +### Fixed +- improved hotkey behavior on autocomplete popup From 3cd23ae2d4d28c79890442bf343a55e44544bcdf Mon Sep 17 00:00:00 2001 From: HJ <30-hj@users.noreply.git.pleroma.social> Date: Mon, 16 Sep 2019 07:23:56 +0000 Subject: [PATCH 50/81] Apply suggestion to src/components/emoji_input/emoji_input.js --- src/components/emoji_input/emoji_input.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 41ee239c..86ff9707 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -64,7 +64,6 @@ const EmojiInput = { }, hideEmojiButton: { /** - enableStickerPicker: { * intended to use with external picker trigger, i.e. you have a button outside * input that will open up the picker, see triggerShowPicker() */ From 8618857aa36574f52a23106cd0d57fd96782435b Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Fri, 6 Sep 2019 11:15:22 -0400 Subject: [PATCH 51/81] collapse fav/repeat notifications from muted users --- src/components/notification/notification.js | 14 +- src/components/notification/notification.vue | 202 ++++++++++-------- .../notifications/notifications.scss | 5 +- 3 files changed, 128 insertions(+), 93 deletions(-) diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js index 896c6d52..181f7715 100644 --- a/src/components/notification/notification.js +++ b/src/components/notification/notification.js @@ -9,7 +9,8 @@ const Notification = { data () { return { userExpanded: false, - betterShadow: this.$store.state.interface.browserSupport.cssFilter + betterShadow: this.$store.state.interface.browserSupport.cssFilter, + unmuted: false } }, props: [ 'notification' ], @@ -23,11 +24,14 @@ const Notification = { toggleUserExpanded () { this.userExpanded = !this.userExpanded }, - userProfileLink (user) { + generateUserProfileLink (user) { return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames) }, getUser (notification) { return this.$store.state.users.usersObject[notification.from_profile.id] + }, + toggleMute () { + this.unmuted = !this.unmuted } }, computed: { @@ -47,6 +51,12 @@ const Notification = { return this.userInStore } return this.notification.from_profile + }, + userProfileLink () { + return this.generateUserProfileLink(this.notification.from_profile) + }, + needMute () { + return this.notification.from_profile.muted } } } diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue index bafcd026..1f192c77 100644 --- a/src/components/notification/notification.vue +++ b/src/components/notification/notification.vue @@ -4,104 +4,126 @@ :compact="true" :statusoid="notification.status" /> - <div - v-else - class="non-mention" - :class="[userClass, { highlighted: userStyle }]" - :style="[ userStyle ]" - > - <a - class="avatar-container" - :href="notification.from_profile.statusnet_profile_url" - @click.stop.prevent.capture="toggleUserExpanded" + <div v-else> + <div + v-if="needMute && !unmuted" + class="container muted" > - <UserAvatar - :compact="true" - :better-shadow="betterShadow" - :user="notification.from_profile" - /> - </a> - <div class="notification-right"> - <UserCard - v-if="userExpanded" - :user="getUser(notification)" - :rounded="true" - :bordered="true" - /> - <span class="notification-details"> - <div class="name-and-action"> - <!-- eslint-disable vue/no-v-html --> - <span - v-if="!!notification.from_profile.name_html" - class="username" - :title="'@'+notification.from_profile.screen_name" - v-html="notification.from_profile.name_html" - /> - <!-- eslint-enable vue/no-v-html --> - <span - v-else - class="username" - :title="'@'+notification.from_profile.screen_name" - >{{ notification.from_profile.name }}</span> - <span v-if="notification.type === 'like'"> - <i class="fa icon-star lit" /> - <small>{{ $t('notifications.favorited_you') }}</small> - </span> - <span v-if="notification.type === 'repeat'"> - <i - class="fa icon-retweet lit" - :title="$t('tool_tip.repeat')" + <small> + <router-link :to="userProfileLink"> + {{ notification.from_profile.screen_name }} + </router-link> + </small> + <a + href="#" + class="unmute" + @click.prevent="toggleMute" + ><i class="button-icon icon-eye-off" /></a> + </div> + <div + v-else + class="non-mention" + :class="[userClass, { highlighted: userStyle }]" + :style="[ userStyle ]" + > + <a + class="avatar-container" + :href="notification.from_profile.statusnet_profile_url" + @click.stop.prevent.capture="toggleUserExpanded" + > + <UserAvatar + :compact="true" + :better-shadow="betterShadow" + :user="notification.from_profile" + /> + </a> + <div class="notification-right"> + <UserCard + v-if="userExpanded" + :user="getUser(notification)" + :rounded="true" + :bordered="true" + /> + <span class="notification-details"> + <div class="name-and-action"> + <!-- eslint-disable vue/no-v-html --> + <span + v-if="!!notification.from_profile.name_html" + class="username" + :title="'@'+notification.from_profile.screen_name" + v-html="notification.from_profile.name_html" /> - <small>{{ $t('notifications.repeated_you') }}</small> - </span> - <span v-if="notification.type === 'follow'"> - <i class="fa icon-user-plus lit" /> - <small>{{ $t('notifications.followed_you') }}</small> - </span> - </div> + <!-- eslint-enable vue/no-v-html --> + <span + v-else + class="username" + :title="'@'+notification.from_profile.screen_name" + >{{ notification.from_profile.name }}</span> + <span v-if="notification.type === 'like'"> + <i class="fa icon-star lit" /> + <small>{{ $t('notifications.favorited_you') }}</small> + </span> + <span v-if="notification.type === 'repeat'"> + <i + class="fa icon-retweet lit" + :title="$t('tool_tip.repeat')" + /> + <small>{{ $t('notifications.repeated_you') }}</small> + </span> + <span v-if="notification.type === 'follow'"> + <i class="fa icon-user-plus lit" /> + <small>{{ $t('notifications.followed_you') }}</small> + </span> + </div> + <div + v-if="notification.type === 'follow'" + class="timeago" + > + <span class="faint"> + <Timeago + :time="notification.created_at" + :auto-update="240" + /> + </span> + </div> + <div + v-else + class="timeago" + > + <router-link + v-if="notification.status" + :to="{ name: 'conversation', params: { id: notification.status.id } }" + class="faint-link" + > + <Timeago + :time="notification.created_at" + :auto-update="240" + /> + </router-link> + </div> + <a + v-if="needMute" + href="#" + @click.prevent="toggleMute" + ><i class="button-icon icon-eye-off" /></a> + </span> <div v-if="notification.type === 'follow'" - class="timeago" + class="follow-text" > - <span class="faint"> - <Timeago - :time="notification.created_at" - :auto-update="240" - /> - </span> - </div> - <div - v-else - class="timeago" - > - <router-link - v-if="notification.status" - :to="{ name: 'conversation', params: { id: notification.status.id } }" - class="faint-link" - > - <Timeago - :time="notification.created_at" - :auto-update="240" - /> + <router-link :to="userProfileLink"> + @{{ notification.from_profile.screen_name }} </router-link> </div> - </span> - <div - v-if="notification.type === 'follow'" - class="follow-text" - > - <router-link :to="userProfileLink(notification.from_profile)"> - @{{ notification.from_profile.screen_name }} - </router-link> + <template v-else> + <status + class="faint" + :compact="true" + :statusoid="notification.action" + :no-heading="true" + /> + </template> </div> - <template v-else> - <status - class="faint" - :compact="true" - :statusoid="notification.action" - :no-heading="true" - /> - </template> </div> </div> </template> diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss index 622d12f4..71876b14 100644 --- a/src/components/notifications/notifications.scss +++ b/src/components/notifications/notifications.scss @@ -33,7 +33,6 @@ .notification { box-sizing: border-box; - display: flex; border-bottom: 1px solid; border-color: $fallback--border; border-color: var(--border, $fallback--border); @@ -47,6 +46,10 @@ } } + .muted { + padding: .25em .6em; + } + .non-mention { display: flex; flex: 1; From f8139e369c0ca4ae90cca78c5d1fee69b88375d6 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Tue, 10 Sep 2019 16:21:52 -0400 Subject: [PATCH 52/81] wire up user state with global store --- src/components/notification/notification.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js index 181f7715..8e817f3b 100644 --- a/src/components/notification/notification.js +++ b/src/components/notification/notification.js @@ -53,10 +53,10 @@ const Notification = { return this.notification.from_profile }, userProfileLink () { - return this.generateUserProfileLink(this.notification.from_profile) + return this.generateUserProfileLink(this.user) }, needMute () { - return this.notification.from_profile.muted + return this.user.muted } } } From 5ff899b455e07e41eb1b89985177655279f8263f Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Tue, 17 Sep 2019 15:59:17 -0400 Subject: [PATCH 53/81] add mention button --- src/components/user_card/user_card.js | 3 +++ src/components/user_card/user_card.vue | 9 +++++++++ src/i18n/en.json | 1 + 3 files changed, 13 insertions(+) diff --git a/src/components/user_card/user_card.js b/src/components/user_card/user_card.js index e3bd7697..d42be9fc 100644 --- a/src/components/user_card/user_card.js +++ b/src/components/user_card/user_card.js @@ -168,6 +168,9 @@ export default { } this.$store.dispatch('setMedia', [attachment]) this.$store.dispatch('setCurrent', attachment) + }, + mentionUser () { + } } } diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index 0b83cf16..f25d16d3 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -188,6 +188,15 @@ </ProgressButton> </div> + <div> + <button + class="btn btn-default btn-block" + @click="mentionUser" + > + {{ $t('user_card.mention') }} + </button> + </div> + <div> <button v-if="user.muted" diff --git a/src/i18n/en.json b/src/i18n/en.json index ddde471a..e4af507e 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -529,6 +529,7 @@ "follows_you": "Follows you!", "its_you": "It's you!", "media": "Media", + "mention": "Mention", "mute": "Mute", "muted": "Muted", "per_day": "per day", From 90981dcce6bbed1ba7700a7f1f4d74838e217b55 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Tue, 17 Sep 2019 22:32:17 -0400 Subject: [PATCH 54/81] remove needless condition --- src/components/user_panel/user_panel.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/user_panel/user_panel.vue b/src/components/user_panel/user_panel.vue index c92630e3..e859d612 100644 --- a/src/components/user_panel/user_panel.vue +++ b/src/components/user_panel/user_panel.vue @@ -11,7 +11,7 @@ rounded="top" /> <div class="panel-footer"> - <post-status-form v-if="user" /> + <post-status-form /> </div> </div> <auth-form From f4bbf1d4e205e3c3438226d0cf71e77d4bc0be11 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Thu, 19 Sep 2019 13:27:37 -0400 Subject: [PATCH 55/81] add new module and modal to post new status --- src/App.js | 4 +- src/App.vue | 1 + .../post_status_modal/post_status_modal.js | 25 +++++++++++ .../post_status_modal/post_status_modal.vue | 42 +++++++++++++++++++ src/components/user_card/user_card.js | 2 +- src/main.js | 4 +- src/modules/postStatus.js | 25 +++++++++++ 7 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 src/components/post_status_modal/post_status_modal.js create mode 100644 src/components/post_status_modal/post_status_modal.vue create mode 100644 src/modules/postStatus.js diff --git a/src/App.js b/src/App.js index e9cd5917..40f362d2 100644 --- a/src/App.js +++ b/src/App.js @@ -11,6 +11,7 @@ import SideDrawer from './components/side_drawer/side_drawer.vue' import MobilePostStatusModal from './components/mobile_post_status_modal/mobile_post_status_modal.vue' import MobileNav from './components/mobile_nav/mobile_nav.vue' import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue' +import PostStatusModal from './components/post_status_modal/post_status_modal.vue' import { windowWidth } from './services/window_utils/window_utils' export default { @@ -28,7 +29,8 @@ export default { SideDrawer, MobilePostStatusModal, MobileNav, - UserReportingModal + UserReportingModal, + PostStatusModal }, data: () => ({ mobileActivePanel: 'timeline', diff --git a/src/App.vue b/src/App.vue index 719e00a4..46d3ac42 100644 --- a/src/App.vue +++ b/src/App.vue @@ -109,6 +109,7 @@ /> <MobilePostStatusModal /> <UserReportingModal /> + <PostStatusModal /> <portal-target name="modal" /> </div> </template> diff --git a/src/components/post_status_modal/post_status_modal.js b/src/components/post_status_modal/post_status_modal.js new file mode 100644 index 00000000..86a4e1d8 --- /dev/null +++ b/src/components/post_status_modal/post_status_modal.js @@ -0,0 +1,25 @@ +import PostStatusForm from '../post_status_form/post_status_form.vue' + +const PostStatusModal = { + components: { + PostStatusForm + }, + computed: { + isLoggedIn () { + return !!this.$store.state.users.currentUser + }, + isOpen () { + return this.isLoggedIn && this.$store.state.postStatus.modalActivated + }, + params () { + return this.$store.state.postStatus.params + } + }, + methods: { + closeModal () { + this.$store.dispatch('closePostStatusModal') + } + } +} + +export default PostStatusModal diff --git a/src/components/post_status_modal/post_status_modal.vue b/src/components/post_status_modal/post_status_modal.vue new file mode 100644 index 00000000..85a5401c --- /dev/null +++ b/src/components/post_status_modal/post_status_modal.vue @@ -0,0 +1,42 @@ +<template> + <div + v-if="isOpen" + class="post-form-modal-view modal-view" + @click="closeModal" + > + <div + class="post-form-modal-panel panel" + @click.stop="" + > + <div class="panel-heading"> + {{ $t('post_status.new_status') }} + </div> + <PostStatusForm + class="panel-body" + @posted="closeModal" + /> + </div> + </div> +</template> + +<script src="./post_status_modal.js"></script> + +<style lang="scss"> +@import '../../_variables.scss'; + +.post-form-modal-view { + align-items: flex-start; +} + +.post-form-modal-panel { + flex-shrink: 0; + margin-top: 25%; + margin-bottom: 2em; + width: 100%; + max-width: 700px; + + @media (orientation: landscape) { + margin-top: 8%; + } +} +</style> diff --git a/src/components/user_card/user_card.js b/src/components/user_card/user_card.js index d42be9fc..0c200ad1 100644 --- a/src/components/user_card/user_card.js +++ b/src/components/user_card/user_card.js @@ -170,7 +170,7 @@ export default { this.$store.dispatch('setCurrent', attachment) }, mentionUser () { - + this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user }) } } } diff --git a/src/main.js b/src/main.js index b3256e8e..a43d31e2 100644 --- a/src/main.js +++ b/src/main.js @@ -15,6 +15,7 @@ import mediaViewerModule from './modules/media_viewer.js' import oauthTokensModule from './modules/oauth_tokens.js' import reportsModule from './modules/reports.js' import pollsModule from './modules/polls.js' +import postStatusModule from './modules/postStatus.js' import VueI18n from 'vue-i18n' @@ -76,7 +77,8 @@ const persistedStateOptions = { mediaViewer: mediaViewerModule, oauthTokens: oauthTokensModule, reports: reportsModule, - polls: pollsModule + polls: pollsModule, + postStatus: postStatusModule }, plugins: [persistedState, pushNotifications], strict: false // Socket modifies itself, let's ignore this for now. diff --git a/src/modules/postStatus.js b/src/modules/postStatus.js new file mode 100644 index 00000000..638c1fb2 --- /dev/null +++ b/src/modules/postStatus.js @@ -0,0 +1,25 @@ +const postStatus = { + state: { + params: null, + modalActivated: false + }, + mutations: { + openPostStatusModal (state, params) { + state.params = params + state.modalActivated = true + }, + closePostStatusModal (state) { + state.modalActivated = false + } + }, + actions: { + openPostStatusModal ({ commit }, params) { + commit('openPostStatusModal', params) + }, + closePostStatusModal ({ commit }) { + commit('closePostStatusModal') + } + } +} + +export default postStatus From a9f33272a860fd95def54c7dafa863056324122d Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Thu, 19 Sep 2019 13:52:20 -0400 Subject: [PATCH 56/81] refactor MobilePostStatusModal using new PostStatusModal --- .../mobile_post_status_modal.js | 21 ++--------- .../mobile_post_status_modal.vue | 36 +------------------ 2 files changed, 4 insertions(+), 53 deletions(-) diff --git a/src/components/mobile_post_status_modal/mobile_post_status_modal.js b/src/components/mobile_post_status_modal/mobile_post_status_modal.js index 3cec23c6..3be4a1d8 100644 --- a/src/components/mobile_post_status_modal/mobile_post_status_modal.js +++ b/src/components/mobile_post_status_modal/mobile_post_status_modal.js @@ -1,14 +1,9 @@ -import PostStatusForm from '../post_status_form/post_status_form.vue' import { debounce } from 'lodash' const MobilePostStatusModal = { - components: { - PostStatusForm - }, data () { return { hidden: false, - postFormOpen: false, scrollingDown: false, inputActive: false, oldScrollPos: 0, @@ -28,8 +23,8 @@ const MobilePostStatusModal = { window.removeEventListener('resize', this.handleOSK) }, computed: { - currentUser () { - return this.$store.state.users.currentUser + isLoggedIn () { + return !!this.$store.state.users.currentUser }, isHidden () { return this.autohideFloatingPostButton && (this.hidden || this.inputActive) @@ -57,17 +52,7 @@ const MobilePostStatusModal = { window.removeEventListener('scroll', this.handleScrollEnd) }, openPostForm () { - this.postFormOpen = true - this.hidden = true - - const el = this.$el.querySelector('textarea') - this.$nextTick(function () { - el.focus() - }) - }, - closePostForm () { - this.postFormOpen = false - this.hidden = false + this.$store.dispatch('openPostStatusModal') }, handleOSK () { // This is a big hack: we're guessing from changed window sizes if the diff --git a/src/components/mobile_post_status_modal/mobile_post_status_modal.vue b/src/components/mobile_post_status_modal/mobile_post_status_modal.vue index b6d7d3ba..38c5fce0 100644 --- a/src/components/mobile_post_status_modal/mobile_post_status_modal.vue +++ b/src/components/mobile_post_status_modal/mobile_post_status_modal.vue @@ -1,23 +1,5 @@ <template> - <div v-if="currentUser"> - <div - v-show="postFormOpen" - class="post-form-modal-view modal-view" - @click="closePostForm" - > - <div - class="post-form-modal-panel panel" - @click.stop="" - > - <div class="panel-heading"> - {{ $t('post_status.new_status') }} - </div> - <PostStatusForm - class="panel-body" - @posted="closePostForm" - /> - </div> - </div> + <div v-if="isLoggedIn"> <button class="new-status-button" :class="{ 'hidden': isHidden }" @@ -33,22 +15,6 @@ <style lang="scss"> @import '../../_variables.scss'; -.post-form-modal-view { - align-items: flex-start; -} - -.post-form-modal-panel { - flex-shrink: 0; - margin-top: 25%; - margin-bottom: 2em; - width: 100%; - max-width: 700px; - - @media (orientation: landscape) { - margin-top: 8%; - } -} - .new-status-button { width: 5em; height: 5em; From 0c8038d4f610bd7260b920e6fb55a8ea0341d291 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Thu, 19 Sep 2019 13:52:54 -0400 Subject: [PATCH 57/81] recover autofocusing behavior --- src/components/post_status_modal/post_status_modal.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/post_status_modal/post_status_modal.js b/src/components/post_status_modal/post_status_modal.js index 86a4e1d8..15783642 100644 --- a/src/components/post_status_modal/post_status_modal.js +++ b/src/components/post_status_modal/post_status_modal.js @@ -15,6 +15,13 @@ const PostStatusModal = { return this.$store.state.postStatus.params } }, + watch: { + isOpen (val) { + if (val) { + this.$nextTick(() => this.$el.querySelector('textarea').focus()) + } + } + }, methods: { closeModal () { this.$store.dispatch('closePostStatusModal') From d6a941a128f37a2d04f5e60ad21037c2c5efcfa3 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Thu, 19 Sep 2019 13:59:34 -0400 Subject: [PATCH 58/81] rename component --- src/App.js | 4 ++-- src/App.vue | 2 +- .../mobile_post_status_button.js} | 4 ++-- .../mobile_post_status_button.vue} | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/components/{mobile_post_status_modal/mobile_post_status_modal.js => mobile_post_status_button/mobile_post_status_button.js} (97%) rename src/components/{mobile_post_status_modal/mobile_post_status_modal.vue => mobile_post_status_button/mobile_post_status_button.vue} (95%) diff --git a/src/App.js b/src/App.js index 40f362d2..fe63b54c 100644 --- a/src/App.js +++ b/src/App.js @@ -8,7 +8,7 @@ import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_pan import ChatPanel from './components/chat_panel/chat_panel.vue' import MediaModal from './components/media_modal/media_modal.vue' import SideDrawer from './components/side_drawer/side_drawer.vue' -import MobilePostStatusModal from './components/mobile_post_status_modal/mobile_post_status_modal.vue' +import MobilePostStatusButton from './components/mobile_post_status_button/mobile_post_status_button.vue' import MobileNav from './components/mobile_nav/mobile_nav.vue' import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue' import PostStatusModal from './components/post_status_modal/post_status_modal.vue' @@ -27,7 +27,7 @@ export default { ChatPanel, MediaModal, SideDrawer, - MobilePostStatusModal, + MobilePostStatusButton, MobileNav, UserReportingModal, PostStatusModal diff --git a/src/App.vue b/src/App.vue index 46d3ac42..f1086e60 100644 --- a/src/App.vue +++ b/src/App.vue @@ -107,7 +107,7 @@ :floating="true" class="floating-chat mobile-hidden" /> - <MobilePostStatusModal /> + <MobilePostStatusButton /> <UserReportingModal /> <PostStatusModal /> <portal-target name="modal" /> diff --git a/src/components/mobile_post_status_modal/mobile_post_status_modal.js b/src/components/mobile_post_status_button/mobile_post_status_button.js similarity index 97% rename from src/components/mobile_post_status_modal/mobile_post_status_modal.js rename to src/components/mobile_post_status_button/mobile_post_status_button.js index 3be4a1d8..3e77148a 100644 --- a/src/components/mobile_post_status_modal/mobile_post_status_modal.js +++ b/src/components/mobile_post_status_button/mobile_post_status_button.js @@ -1,6 +1,6 @@ import { debounce } from 'lodash' -const MobilePostStatusModal = { +const MobilePostStatusButton = { data () { return { hidden: false, @@ -90,4 +90,4 @@ const MobilePostStatusModal = { } } -export default MobilePostStatusModal +export default MobilePostStatusButton diff --git a/src/components/mobile_post_status_modal/mobile_post_status_modal.vue b/src/components/mobile_post_status_button/mobile_post_status_button.vue similarity index 95% rename from src/components/mobile_post_status_modal/mobile_post_status_modal.vue rename to src/components/mobile_post_status_button/mobile_post_status_button.vue index 38c5fce0..9cf45de3 100644 --- a/src/components/mobile_post_status_modal/mobile_post_status_modal.vue +++ b/src/components/mobile_post_status_button/mobile_post_status_button.vue @@ -10,7 +10,7 @@ </div> </template> -<script src="./mobile_post_status_modal.js"></script> +<script src="./mobile_post_status_button.js"></script> <style lang="scss"> @import '../../_variables.scss'; From c8a18f387c28d5f895c1e727b0d040da96dcebc1 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Thu, 19 Sep 2019 14:38:55 -0400 Subject: [PATCH 59/81] wire up props with PostStatusModal --- src/components/post_status_form/post_status_form.js | 2 +- src/components/post_status_modal/post_status_modal.js | 2 +- src/components/post_status_modal/post_status_modal.vue | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 40bbf6d4..dc4b419c 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -8,7 +8,7 @@ import fileTypeService from '../../services/file_type/file_type.service.js' import { reject, map, uniqBy } from 'lodash' import suggestor from '../emoji-input/suggestor.js' -const buildMentionsString = ({ user, attentions }, currentUser) => { +const buildMentionsString = ({ user, attentions = [] }, currentUser) => { let allAttentions = [...attentions] allAttentions.unshift(user) diff --git a/src/components/post_status_modal/post_status_modal.js b/src/components/post_status_modal/post_status_modal.js index 15783642..1033ba11 100644 --- a/src/components/post_status_modal/post_status_modal.js +++ b/src/components/post_status_modal/post_status_modal.js @@ -12,7 +12,7 @@ const PostStatusModal = { return this.isLoggedIn && this.$store.state.postStatus.modalActivated }, params () { - return this.$store.state.postStatus.params + return this.$store.state.postStatus.params || {} } }, watch: { diff --git a/src/components/post_status_modal/post_status_modal.vue b/src/components/post_status_modal/post_status_modal.vue index 85a5401c..3f8eec69 100644 --- a/src/components/post_status_modal/post_status_modal.vue +++ b/src/components/post_status_modal/post_status_modal.vue @@ -13,6 +13,7 @@ </div> <PostStatusForm class="panel-body" + v-bind="params" @posted="closeModal" /> </div> From 60c3501d35817f591775a0309f3f7070a14bfd4a Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Fri, 19 Jul 2019 12:24:23 -0400 Subject: [PATCH 60/81] install body-scroll-lock --- package.json | 1 + yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/package.json b/package.json index 0f6ae9c8..f039d412 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@chenfengyuan/vue-qrcode": "^1.0.0", "babel-plugin-add-module-exports": "^0.2.1", "babel-plugin-lodash": "^3.2.11", + "body-scroll-lock": "^2.6.4", "chromatism": "^3.0.0", "cropperjs": "^1.4.3", "diff": "^3.0.1", diff --git a/yarn.lock b/yarn.lock index d6c8b4a6..4e0d9a22 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1196,6 +1196,11 @@ body-parser@1.18.3, body-parser@^1.16.1: raw-body "2.3.3" type-is "~1.6.16" +body-scroll-lock@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-2.6.4.tgz#567abc60ef4d656a79156781771398ef40462e94" + integrity sha512-NP08WsovlmxEoZP9pdlqrE+AhNaivlTrz9a0FF37BQsnOrpN48eNqivKkE7SYpM9N+YIPjsdVzfLAUQDBm6OQw== + boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" From 8b321f6f1fd8b906cd9e224bbfc2356c8e4e4235 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Fri, 19 Jul 2019 12:27:03 -0400 Subject: [PATCH 61/81] add body-scroll-lock directive --- src/directives/body_scroll_lock.js | 69 ++++++++++++++++++++++++++++++ src/main.js | 2 + 2 files changed, 71 insertions(+) create mode 100644 src/directives/body_scroll_lock.js diff --git a/src/directives/body_scroll_lock.js b/src/directives/body_scroll_lock.js new file mode 100644 index 00000000..6ab20c3f --- /dev/null +++ b/src/directives/body_scroll_lock.js @@ -0,0 +1,69 @@ +import * as bodyScrollLock from 'body-scroll-lock' + +let previousNavPaddingRight +let previousAppBgWrapperRight + +const disableBodyScroll = (el) => { + const scrollBarGap = window.innerWidth - document.documentElement.clientWidth + bodyScrollLock.disableBodyScroll(el, { + reserveScrollBarGap: true + }) + setTimeout(() => { + // If previousNavPaddingRight is already set, don't set it again. + if (previousNavPaddingRight === undefined) { + const navEl = document.getElementById('nav') + previousNavPaddingRight = window.getComputedStyle(navEl).getPropertyValue('padding-right') + navEl.style.paddingRight = previousNavPaddingRight ? `calc(${previousNavPaddingRight} + ${scrollBarGap}px)` : `${scrollBarGap}px` + } + // If previousAppBgWrapeprRight is already set, don't set it again. + if (previousAppBgWrapperRight === undefined) { + const appBgWrapperEl = document.getElementById('app_bg_wrapper') + previousAppBgWrapperRight = window.getComputedStyle(appBgWrapperEl).getPropertyValue('right') + appBgWrapperEl.style.right = previousAppBgWrapperRight ? `calc(${previousAppBgWrapperRight} + ${scrollBarGap}px)` : `${scrollBarGap}px` + } + document.body.classList.add('scroll-locked') + }) +} + +const enableBodyScroll = (el) => { + setTimeout(() => { + if (previousNavPaddingRight !== undefined) { + document.getElementById('nav').style.paddingRight = previousNavPaddingRight + // Restore previousNavPaddingRight to undefined so disableBodyScroll knows it can be set again. + previousNavPaddingRight = undefined + } + if (previousAppBgWrapperRight !== undefined) { + document.getElementById('app_bg_wrapper').style.right = previousAppBgWrapperRight + // Restore previousAppBgWrapperRight to undefined so disableBodyScroll knows it can be set again. + previousAppBgWrapperRight = undefined + } + document.body.classList.remove('scroll-locked') + }) + bodyScrollLock.enableBodyScroll(el) +} + +const directive = { + inserted: (el, binding) => { + if (binding.value) { + disableBodyScroll(el) + } + }, + componentUpdated: (el, binding) => { + if (binding.oldValue === binding.value) { + return + } + + if (binding.value) { + disableBodyScroll(el) + } else { + enableBodyScroll(el) + } + }, + unbind: (el) => { + enableBodyScroll(el) + } +} + +export default (Vue) => { + Vue.directive('body-scroll-lock', directive) +} diff --git a/src/main.js b/src/main.js index b3256e8e..ffaf0ad5 100644 --- a/src/main.js +++ b/src/main.js @@ -26,6 +26,7 @@ import messages from './i18n/messages.js' import VueChatScroll from 'vue-chat-scroll' import VueClickOutside from 'v-click-outside' import PortalVue from 'portal-vue' +import VBodyScrollLock from './directives/body_scroll_lock' import VTooltip from 'v-tooltip' import afterStoreSetup from './boot/after_store.js' @@ -38,6 +39,7 @@ Vue.use(VueI18n) Vue.use(VueChatScroll) Vue.use(VueClickOutside) Vue.use(PortalVue) +Vue.use(VBodyScrollLock) Vue.use(VTooltip) const i18n = new VueI18n({ From ad504768feacecdbd9f41f4bca470a58fdf0d059 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Fri, 19 Jul 2019 12:36:07 -0400 Subject: [PATCH 62/81] lock body scroll --- src/App.vue | 1 + src/components/media_modal/media_modal.vue | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/App.vue b/src/App.vue index 719e00a4..d7453549 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,6 +4,7 @@ :style="bgAppStyle" > <div + id="app_bg_wrapper" class="app-bg-wrapper" :style="bgStyle" /> diff --git a/src/components/media_modal/media_modal.vue b/src/components/media_modal/media_modal.vue index ab5a36a5..06ced5a1 100644 --- a/src/components/media_modal/media_modal.vue +++ b/src/components/media_modal/media_modal.vue @@ -1,6 +1,7 @@ <template> <div v-if="showing" + v-body-scroll-lock="showing" class="modal-view media-modal-view" @click.prevent="hide" > @@ -43,6 +44,10 @@ .media-modal-view { z-index: 1001; + body:not(.scroll-locked) & { + display: none; + } + &:hover { .modal-view-button-arrow { opacity: 0.75; From ae70439447d029e5f9e2fcd558dc198bff47c89b Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Fri, 19 Jul 2019 12:39:18 -0400 Subject: [PATCH 63/81] setting display: initial makes trouble, instead, toggle display: none using classname --- index.html | 2 +- src/App.scss | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index a8681c8b..fd4e795e 100644 --- a/index.html +++ b/index.html @@ -9,7 +9,7 @@ <link rel="stylesheet" href="/static/font/css/fontello.css"> <link rel="stylesheet" href="/static/font/css/animation.css"> </head> - <body> + <body class="hidden"> <noscript>To use Pleroma, please enable JavaScript.</noscript> <div id="app"></div> <!-- built files will be auto injected --> diff --git a/src/App.scss b/src/App.scss index ea7b54e8..1f0b2619 100644 --- a/src/App.scss +++ b/src/App.scss @@ -38,6 +38,10 @@ h4 { text-align: center; } +.hidden { + display: none; +} + body { font-family: sans-serif; font-family: var(--interfaceFont, sans-serif); From 92be5a68776633b166323108dd34216eaae20753 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Fri, 19 Jul 2019 12:50:21 -0400 Subject: [PATCH 64/81] Reserve scrollbar gap when body scroll is locked --- src/App.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/App.scss b/src/App.scss index 1f0b2619..3914cec2 100644 --- a/src/App.scss +++ b/src/App.scss @@ -10,7 +10,8 @@ position: fixed; z-index: -1; height: 100%; - width: 100%; + left: 0; + right: -20px; background-size: cover; background-repeat: no-repeat; background-position: 0 50%; @@ -351,6 +352,7 @@ i[class*=icon-] { align-items: center; position: fixed; height: 50px; + box-sizing: border-box; .logo { display: flex; From 37ae0fd92c2d392cda56912707e6c52faec54334 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Thu, 5 Sep 2019 12:22:56 -0400 Subject: [PATCH 65/81] fix logo moving bug when lightbox is open --- src/App.scss | 1 + src/App.vue | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/App.scss b/src/App.scss index 3914cec2..a8850961 100644 --- a/src/App.scss +++ b/src/App.scss @@ -392,6 +392,7 @@ i[class*=icon-] { } .inner-nav { + position: relative; margin: auto; box-sizing: border-box; padding-left: 10px; diff --git a/src/App.vue b/src/App.vue index d7453549..eb571a17 100644 --- a/src/App.vue +++ b/src/App.vue @@ -15,20 +15,20 @@ class="nav-bar container" @click="scrollToTop()" > - <div - class="logo" - :style="logoBgStyle" - > - <div - class="mask" - :style="logoMaskStyle" - /> - <img - :src="logo" - :style="logoStyle" - > - </div> <div class="inner-nav"> + <div + class="logo" + :style="logoBgStyle" + > + <div + class="mask" + :style="logoMaskStyle" + /> + <img + :src="logo" + :style="logoStyle" + > + </div> <div class="item"> <router-link class="site-name" From 7fe6ba2401745ce61e3fb2f438948693df322ba1 Mon Sep 17 00:00:00 2001 From: taehoon <th.dev91@gmail.com> Date: Thu, 5 Sep 2019 12:28:47 -0400 Subject: [PATCH 66/81] avoid using global class --- src/App.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/App.scss b/src/App.scss index a8850961..2190f91a 100644 --- a/src/App.scss +++ b/src/App.scss @@ -39,10 +39,6 @@ h4 { text-align: center; } -.hidden { - display: none; -} - body { font-family: sans-serif; font-family: var(--interfaceFont, sans-serif); From 7b4cb387345c0e278a6cfe5bbff5265c09281567 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Mon, 23 Sep 2019 20:29:01 +0300 Subject: [PATCH 67/81] split spam mode into two separate options (one in settings page) --- src/components/emoji_input/emoji_input.js | 15 +++++++++------ src/components/emoji_picker/emoji_picker.js | 4 ++-- src/components/emoji_picker/emoji_picker.scss | 4 ++-- src/components/emoji_picker/emoji_picker.vue | 12 ++++++------ src/components/settings/settings.js | 4 ++++ src/components/settings/settings.vue | 8 ++++++++ src/i18n/en.json | 3 ++- src/modules/config.js | 1 + test/unit/specs/components/emoji_input.spec.js | 18 +++++++++--------- 9 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 86ff9707..5f90d7f4 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -89,7 +89,7 @@ const EmojiInput = { blurTimeout: null, showPicker: false, temporarilyHideSuggestions: false, - spamMode: false, + keepOpen: false, disableClickOutside: false } }, @@ -97,6 +97,9 @@ const EmojiInput = { EmojiPicker }, computed: { + padEmoji () { + return this.$store.state.config.padEmoji + }, suggestions () { const firstchar = this.textAtCaret.charAt(0) if (this.textAtCaret === firstchar) { return [] } @@ -176,7 +179,7 @@ const EmojiInput = { this.$emit('input', newValue) this.caret = 0 }, - insert ({ insertion, spamMode }) { + insert ({ insertion, keepOpen }) { const before = this.value.substring(0, this.caret) || '' const after = this.value.substring(this.caret) || '' @@ -195,8 +198,8 @@ const EmojiInput = { * them, masto seem to be rendering :emoji::emoji: correctly now so why not */ const isSpaceRegex = /\s/ - const spaceBefore = !isSpaceRegex.exec(before.slice(-1)) && before.length && !spamMode > 0 ? ' ' : '' - const spaceAfter = !isSpaceRegex.exec(after[0]) && !spamMode ? ' ' : '' + const spaceBefore = !isSpaceRegex.exec(before.slice(-1)) && before.length && this.padEmoji > 0 ? ' ' : '' + const spaceAfter = !isSpaceRegex.exec(after[0]) && this.padEmoji ? ' ' : '' const newValue = [ before, @@ -205,7 +208,7 @@ const EmojiInput = { spaceAfter, after ].join('') - this.spamMode = spamMode + this.keepOpen = keepOpen this.$emit('input', newValue) const position = this.caret + (insertion + spaceAfter + spaceBefore).length @@ -283,7 +286,7 @@ const EmojiInput = { this.blurTimeout = null } - if (!this.spamMode) { + if (!this.keepOpen) { this.showPicker = false } this.focused = true diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index cb93f0c1..824412dd 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -18,7 +18,7 @@ const EmojiPicker = { activeGroup: 'custom', showingStickers: false, groupsScrolledClass: 'scrolled-top', - spamMode: false + keepOpen: false } }, components: { @@ -27,7 +27,7 @@ const EmojiPicker = { methods: { onEmoji (emoji) { const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement - this.$emit('emoji', { insertion: value, spamMode: this.spamMode }) + this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen }) }, highlight (key) { const ref = this.$refs['group-' + key] diff --git a/src/components/emoji_picker/emoji_picker.scss b/src/components/emoji_picker/emoji_picker.scss index 09438898..b0ed00e9 100644 --- a/src/components/emoji_picker/emoji_picker.scss +++ b/src/components/emoji_picker/emoji_picker.scss @@ -10,11 +10,11 @@ margin: 0 !important; z-index: 1; - .spam-mode { + .keep-open { padding: 7px; line-height: normal; } - .spam-mode-label { + .keep-open-label { padding: 0 7px; display: flex; } diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index b32d0862..6c43dd97 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -76,16 +76,16 @@ </div> </div> <div - class="spam-mode" + class="keep-open" > <input - :id="labelKey + 'spam-mode'" - v-model="spamMode" + :id="labelKey + 'keep-open'" + v-model="keepOpen" type="checkbox" > - <label class="spam-mode-label" :for="labelKey + 'spam-mode'"> - <div class="spam-mode-label-text"> - {{ $t('emoji.spam') }} + <label class="keep-open-label" :for="labelKey + 'keep-open'"> + <div class="keep-open-label-text"> + {{ $t('emoji.keep_open') }} </div> </label> </div> diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js index c4aa45b2..b6540d7e 100644 --- a/src/components/settings/settings.js +++ b/src/components/settings/settings.js @@ -16,6 +16,7 @@ const settings = { return { hideAttachmentsLocal: user.hideAttachments, + padEmojiLocal: user.padEmoji, hideAttachmentsInConvLocal: user.hideAttachmentsInConv, maxThumbnails: user.maxThumbnails, hideNsfwLocal: user.hideNsfw, @@ -127,6 +128,9 @@ const settings = { hideAttachmentsLocal (value) { this.$store.dispatch('setOption', { name: 'hideAttachments', value }) }, + padEmojiLocal (value) { + this.$store.dispatch('setOption', { name: 'padEmoji', value }) + }, hideAttachmentsInConvLocal (value) { this.$store.dispatch('setOption', { name: 'hideAttachmentsInConv', value }) }, diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue index 744ec566..6d87a060 100644 --- a/src/components/settings/settings.vue +++ b/src/components/settings/settings.vue @@ -198,6 +198,14 @@ > <label for="autohideFloatingPostButton">{{ $t('settings.autohide_floating_post_button') }}</label> </li> + <li> + <input + id="padEmoji" + v-model="padEmojiLocal" + type="checkbox" + > + <label for="padEmoji">{{ $t('settings.pad_emoji') }}</label> + </li> </ul> </div> diff --git a/src/i18n/en.json b/src/i18n/en.json index 7676e7a8..20d4ed22 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -109,7 +109,7 @@ "emoji": { "stickers": "Stickers", "emoji": "Emoji", - "spam": "Keep picker open, don't separate emoji with spaces", + "keep_open": "Keep picker open", "search_emoji": "Search for an emoji", "add_emoji": "Insert emoji", "custom": "Custom emoji", @@ -232,6 +232,7 @@ "delete_account_error": "There was an issue deleting your account. If this persists please contact your instance administrator.", "delete_account_instructions": "Type your password in the input below to confirm account deletion.", "avatar_size_instruction": "The recommended minimum size for avatar images is 150x150 pixels.", + "pad_emoji": "Pad emoji with spaces when adding from picker", "export_theme": "Save preset", "filtering": "Filtering", "filtering_explanation": "All statuses containing these words will be muted, one per line", diff --git a/src/modules/config.js b/src/modules/config.js index 2bfad8f6..cf04d14f 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -7,6 +7,7 @@ const defaultState = { colors: {}, hideMutedPosts: undefined, // instance default collapseMessageWithSubject: undefined, // instance default + padEmoji: true, hideAttachments: false, hideAttachmentsInConv: false, maxThumbnails: 16, diff --git a/test/unit/specs/components/emoji_input.spec.js b/test/unit/specs/components/emoji_input.spec.js index 5f24331a..13a59961 100644 --- a/test/unit/specs/components/emoji_input.spec.js +++ b/test/unit/specs/components/emoji_input.spec.js @@ -26,7 +26,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: initialString.length }) - wrapper.vm.insert({ insertion: '(test)', spamMode: false }) + wrapper.vm.insert({ insertion: '(test)', keepOpen: false }) expect(wrapper.emitted().input[0][0]).to.eql('Testing (test) ') }) @@ -36,7 +36,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: initialString.length }) - wrapper.vm.insert({ insertion: '(test)', spamMode: false }) + wrapper.vm.insert({ insertion: '(test)', keepOpen: false }) expect(wrapper.emitted().input[0][0]).to.eql('Testing (test) ') }) @@ -46,7 +46,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: 0 }) - wrapper.vm.insert({ insertion: '(test)', spamMode: false }) + wrapper.vm.insert({ insertion: '(test)', keepOpen: false }) expect(wrapper.emitted().input[0][0]).to.eql('(test) Testing') }) @@ -56,7 +56,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: 6 }) - wrapper.vm.insert({ insertion: ':ebin:', spamMode: false }) + wrapper.vm.insert({ insertion: ':ebin:', keepOpen: false }) expect(wrapper.emitted().input[0][0]).to.eql('Spurdo :ebin: Sparde') }) @@ -66,7 +66,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: 7 }) - wrapper.vm.insert({ insertion: ':ebin:', spamMode: false }) + wrapper.vm.insert({ insertion: ':ebin:', keepOpen: false }) expect(wrapper.emitted().input[0][0]).to.eql('Spurdo :ebin: Sparde') }) @@ -76,7 +76,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: initialString.length }) - wrapper.vm.insert({ insertion: ':spam:', spamMode: true }) + wrapper.vm.insert({ insertion: ':spam:', keepOpen: true }) expect(wrapper.emitted().input[0][0]).to.eql('Eat some spam!:spam:') }) @@ -86,7 +86,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: 0 }) - wrapper.vm.insert({ insertion: '1234', spamMode: false }) + wrapper.vm.insert({ insertion: '1234', keepOpen: false }) vue.nextTick(() => { expect(wrapper.vm.caret).to.eql(5) done() @@ -99,7 +99,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: initialString.length }) - wrapper.vm.insert({ insertion: '1234', spamMode: false }) + wrapper.vm.insert({ insertion: '1234', keepOpen: false }) vue.nextTick(() => { expect(wrapper.vm.caret).to.eql(10) done() @@ -112,7 +112,7 @@ describe('EmojiInput', () => { const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: initialString.length }) - wrapper.vm.insert({ insertion: '1234', spamMode: true }) + wrapper.vm.insert({ insertion: '1234', keepOpen: true }) vue.nextTick(() => { expect(wrapper.vm.caret).to.eql(8) done() From 6f0257cd7df8eca257774a0c456af7218896946f Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Mon, 23 Sep 2019 22:12:25 +0300 Subject: [PATCH 68/81] autoscroll post form on typing + some minor improvements --- src/components/emoji_input/emoji_input.js | 4 +++- .../post_status_form/post_status_form.js | 21 ++++++++++++++++++- .../post_status_form/post_status_form.vue | 8 +++---- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 5f90d7f4..25c21403 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -211,10 +211,12 @@ const EmojiInput = { this.keepOpen = keepOpen this.$emit('input', newValue) const position = this.caret + (insertion + spaceAfter + spaceBefore).length + if (!keepOpen) { + this.input.elm.focus() + } this.$nextTick(function () { // Re-focus inputbox after clicking suggestion - this.input.elm.focus() // Set selection right after the replacement instead of the very end this.input.elm.setSelectionRange(position, position) this.caret = position diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index d468be76..60cb5a9a 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -249,6 +249,7 @@ const PostStatusForm = { return fileTypeService.fileType(fileInfo.mimetype) }, paste (e) { + this.resize() if (e.clipboardData.files.length > 0) { // prevent pasting of file as text e.preventDefault() @@ -267,6 +268,11 @@ const PostStatusForm = { fileDrag (e) { e.dataTransfer.dropEffect = 'copy' }, + onEmojiInputInput (e) { + this.$nextTick(() => { + this.resize(this.$refs['textarea']) + }) + }, resize (e) { const target = e.target || e if (!(target instanceof window.Element)) { return } @@ -275,12 +281,25 @@ const PostStatusForm = { // Remove "px" at the end of the values const vertPadding = Number(topPaddingStr.substr(0, topPaddingStr.length - 2)) + Number(bottomPaddingStr.substr(0, bottomPaddingStr.length - 2)) + const oldValue = Number((/([0-9.]+)px/.exec(target.style.height || '') || [])[1]) // Auto is needed to make textbox shrink when removing lines target.style.height = 'auto' - target.style.height = `${target.scrollHeight - vertPadding}px` + const newValue = target.scrollHeight - vertPadding + target.style.height = `${newValue}px` + const scroller = this.$el.closest('.sidebar-scroller') || + this.$el.closest('.post-form-modal-view') || + window + const delta = newValue - oldValue || 0 if (target.value === '') { target.style.height = null + } else { + /* For some reason this doens't _exactly_ work on mobile post form when typing + * but it works when adding emojis. Supposedly, removing the "height = auto" + * line helps with that but it obviously breaks the autoheight. + */ + scroller.scrollBy(0, delta) } + this.$refs['emoji-input'].resize() }, showEmojiPicker () { this.$refs['textarea'].focus() diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index b50607e6..99ffeef8 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -81,6 +81,7 @@ enable-emoji-picker hide-emoji-button enable-sticker-picker + @input="onEmojiInputInput" @sticker-uploaded="addMediaFile" @sticker-upload-failed="uploadFailed" > @@ -95,7 +96,8 @@ @keyup.ctrl.enter="postStatus(newStatus)" @drop="fileDrop" @dragover.prevent="fileDrag" - @input="resize" + @keydown.exact="resize" + @compositionupdate="resize" @paste="paste" /> <p @@ -475,10 +477,6 @@ box-sizing: content-box; } - .form-post-body:focus { - min-height: 48px; - } - .main-input { position: relative; } From 2154152d0846877d63877dce96170da1e7d68fdd Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Tue, 24 Sep 2019 00:06:53 +0300 Subject: [PATCH 69/81] fix some bugs --- src/components/post_status_form/post_status_form.js | 2 +- src/components/post_status_form/post_status_form.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 60cb5a9a..10e75144 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -249,7 +249,7 @@ const PostStatusForm = { return fileTypeService.fileType(fileInfo.mimetype) }, paste (e) { - this.resize() + this.resize(e) if (e.clipboardData.files.length > 0) { // prevent pasting of file as text e.preventDefault() diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 99ffeef8..d24f1981 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -96,7 +96,7 @@ @keyup.ctrl.enter="postStatus(newStatus)" @drop="fileDrop" @dragover.prevent="fileDrag" - @keydown.exact="resize" + @input="resize" @compositionupdate="resize" @paste="paste" /> From ca92e294013e0773460516e5831c28e2ccf3d760 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 00:17:04 +0300 Subject: [PATCH 70/81] WIP: fixed autoscroll, restructured Post Status Form's resize method "a bit" --- .../post_status_form/post_status_form.js | 76 ++++++++++++++----- .../post_status_form/post_status_form.vue | 5 +- 2 files changed, 62 insertions(+), 19 deletions(-) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 10e75144..aaecf088 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -4,6 +4,7 @@ import ScopeSelector from '../scope_selector/scope_selector.vue' import EmojiInput from '../emoji_input/emoji_input.vue' import PollForm from '../poll/poll_form.vue' import fileTypeService from '../../services/file_type/file_type.service.js' +import { findOffset } from '../../services/offset_finder/offset_finder.service.js' import { reject, map, uniqBy } from 'lodash' import suggestor from '../emoji_input/suggestor.js' @@ -276,29 +277,68 @@ const PostStatusForm = { resize (e) { const target = e.target || e if (!(target instanceof window.Element)) { return } - const topPaddingStr = window.getComputedStyle(target)['padding-top'] - const bottomPaddingStr = window.getComputedStyle(target)['padding-bottom'] - // Remove "px" at the end of the values - const vertPadding = Number(topPaddingStr.substr(0, topPaddingStr.length - 2)) + - Number(bottomPaddingStr.substr(0, bottomPaddingStr.length - 2)) - const oldValue = Number((/([0-9.]+)px/.exec(target.style.height || '') || [])[1]) - // Auto is needed to make textbox shrink when removing lines - target.style.height = 'auto' - const newValue = target.scrollHeight - vertPadding - target.style.height = `${newValue}px` + if (target.value === '') { + target.style.height = null + this.$refs['emoji-input'].resize() + return + } + + const rootRef = this.$refs['root'] const scroller = this.$el.closest('.sidebar-scroller') || this.$el.closest('.post-form-modal-view') || window - const delta = newValue - oldValue || 0 - if (target.value === '') { - target.style.height = null + + const topPaddingStr = window.getComputedStyle(target)['padding-top'] + const bottomPaddingStr = window.getComputedStyle(target)['padding-bottom'] + // Remove "px" at the end of the values + const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2)) + const bottomPadding = Number(bottomPaddingStr.substring(0, bottomPaddingStr.length - 2)) + const vertPadding = topPadding + bottomPadding + const oldHeightStr = target.style.height || '' + const oldHeight = Number(oldHeightStr.substring(0, oldHeightStr.length - 2)) + + const tempScroll = scroller === window ? scroller.scrollY : scroller.scrollTop + + // Auto is needed to make textbox shrink when removing lines + target.style.height = 'auto' + const newHeight = target.scrollHeight - vertPadding + target.style.height = `${oldHeight}px` + + if (scroller === window) { + scroller.scroll(0, tempScroll) } else { - /* For some reason this doens't _exactly_ work on mobile post form when typing - * but it works when adding emojis. Supposedly, removing the "height = auto" - * line helps with that but it obviously breaks the autoheight. - */ - scroller.scrollBy(0, delta) + scroller.scrollTop = tempScroll } + + const currentScroll = scroller === window ? scroller.scrollY : scroller.scrollTop + const scrollerHeight = scroller === window ? scroller.innerHeight : scroller.offsetHeight + const scrollerBottomBorder = currentScroll + scrollerHeight + + const rootBottomBorder = rootRef.offsetHeight + + findOffset(rootRef, scroller).top + + const textareaSizeChangeDelta = newHeight - oldHeight || 0 + const rootChangeDelta = rootBottomBorder - scrollerBottomBorder + textareaSizeChangeDelta + + // console.log('CURRENT SCROLL', currentScroll) + console.log('BOTTOM BORDERS', rootBottomBorder, scrollerBottomBorder) + console.log('BOTTOM DELTA', rootBottomBorder - scrollerBottomBorder) + const targetScroll = scrollerBottomBorder < rootBottomBorder + ? currentScroll + rootChangeDelta + : currentScroll + textareaSizeChangeDelta + if (scroller === window) { + scroller.scroll(0, targetScroll) + } else { + scroller.scrollTop = targetScroll + } + target.style.height = `${newHeight}px` + + console.log(scroller, rootRef) + // console.log('SCROLL TO BUTTON', scrollerBottomBorder < rootBottomBorder) + // console.log('DELTA B', rootChangeDelta) + // console.log('DELTA D', textareaSizeChangeDelta) + // console.log('TARGET', targetScroll) + // console.log('ACTUAL', scroller.scrollTop || scroller.scrollY || 0) this.$refs['emoji-input'].resize() }, showEmojiPicker () { diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index d24f1981..5f9e21ae 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -1,5 +1,8 @@ <template> - <div class="post-status-form"> +<div + class="post-status-form" + ref="root" + > <form autocomplete="off" @submit.prevent="postStatus(newStatus)" From daa0e284c32cc8c97006e3a1701ab96ddfabfd30 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 00:21:55 +0300 Subject: [PATCH 71/81] forgotten file --- .../offset_finder/offset_finder.service.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/services/offset_finder/offset_finder.service.js diff --git a/src/services/offset_finder/offset_finder.service.js b/src/services/offset_finder/offset_finder.service.js new file mode 100644 index 00000000..edee6412 --- /dev/null +++ b/src/services/offset_finder/offset_finder.service.js @@ -0,0 +1,20 @@ +export const findOffset = (child, parent, { top = 0, left = 0 } = {}, ignorePadding = true) => { + const result = { + top: top + child.offsetTop, + left: left + child.offsetLeft + } + if (!ignorePadding && child !== window) { + const topPaddingStr = window.getComputedStyle(child)['padding-top'] + const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2)) + const leftPaddingStr = window.getComputedStyle(child)['padding-left'] + const leftPadding = Number(leftPaddingStr.substring(0, leftPaddingStr.length - 2)) + result.top += ignorePadding ? 0 : topPadding + result.left += ignorePadding ? 0 : leftPadding + } + + if (child.offsetParent && (parent === window || parent.contains(child.offsetParent))) { + return findOffset(child.offsetParent, parent, result, false) + } else { + return result + } +} From 4f563e6efb135e74454cf744eb9ce170ae7a4024 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 08:36:30 +0300 Subject: [PATCH 72/81] account for parent padding, too --- .../offset_finder/offset_finder.service.js | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/services/offset_finder/offset_finder.service.js b/src/services/offset_finder/offset_finder.service.js index edee6412..1c45bb1a 100644 --- a/src/services/offset_finder/offset_finder.service.js +++ b/src/services/offset_finder/offset_finder.service.js @@ -4,17 +4,27 @@ export const findOffset = (child, parent, { top = 0, left = 0 } = {}, ignorePadd left: left + child.offsetLeft } if (!ignorePadding && child !== window) { - const topPaddingStr = window.getComputedStyle(child)['padding-top'] - const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2)) - const leftPaddingStr = window.getComputedStyle(child)['padding-left'] - const leftPadding = Number(leftPaddingStr.substring(0, leftPaddingStr.length - 2)) + const { topPadding, leftPadding } = findPadding(child) result.top += ignorePadding ? 0 : topPadding result.left += ignorePadding ? 0 : leftPadding } - if (child.offsetParent && (parent === window || parent.contains(child.offsetParent))) { + console.log('eee', parent, child.offsetParent) + if (child.offsetParent && (parent === window || parent.contains(child.offsetParent) || parent === child.offsetParent)) { return findOffset(child.offsetParent, parent, result, false) } else { + const { topPadding, leftPadding } = findPadding(parent) + result.top += topPadding + result.left += leftPadding return result } } + +const findPadding = (el) => { + const topPaddingStr = window.getComputedStyle(el)['padding-top'] + const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2)) + const leftPaddingStr = window.getComputedStyle(el)['padding-left'] + const leftPadding = Number(leftPaddingStr.substring(0, leftPaddingStr.length - 2)) + + return { topPadding, leftPadding } +} From 0f55359b49b0abc157957d42f98e3f7b4d25ca18 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 08:43:02 +0300 Subject: [PATCH 73/81] fix --- src/services/offset_finder/offset_finder.service.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/services/offset_finder/offset_finder.service.js b/src/services/offset_finder/offset_finder.service.js index 1c45bb1a..a8e438b5 100644 --- a/src/services/offset_finder/offset_finder.service.js +++ b/src/services/offset_finder/offset_finder.service.js @@ -13,9 +13,11 @@ export const findOffset = (child, parent, { top = 0, left = 0 } = {}, ignorePadd if (child.offsetParent && (parent === window || parent.contains(child.offsetParent) || parent === child.offsetParent)) { return findOffset(child.offsetParent, parent, result, false) } else { - const { topPadding, leftPadding } = findPadding(parent) - result.top += topPadding - result.left += leftPadding + if (parent !== window) { + const { topPadding, leftPadding } = findPadding(parent) + result.top += topPadding + result.left += leftPadding + } return result } } From e55645aec16f083e4eedf6b01954b79689c244f1 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson <shpuld@shpposter.club> Date: Wed, 25 Sep 2019 10:25:44 +0300 Subject: [PATCH 74/81] Fix formatting in oc.json --- src/i18n/oc.json | 69 ++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/src/i18n/oc.json b/src/i18n/oc.json index 54f42294..680ad6dd 100644 --- a/src/i18n/oc.json +++ b/src/i18n/oc.json @@ -5,7 +5,7 @@ "exporter": { "export": "Exportar", "processing": "Tractament, vos demandarem lèu de telecargar lo fichièr" - }, + }, "features_panel": { "chat": "Chat", "gopher": "Gopher", @@ -30,12 +30,12 @@ "cancel": "Anullar" }, "image_cropper": { - "crop_picture": "Talhar l’imatge", - "save": "Salvar", - "save_without_cropping": "Salvar sens talhada", - "cancel": "Anullar" + "crop_picture": "Talhar l’imatge", + "save": "Salvar", + "save_without_cropping": "Salvar sens talhada", + "cancel": "Anullar" }, - "importer": { + "importer": { "submit": "Mandar", "success": "Corrèctament importat.", "error": "Una error s’es producha pendent l’importacion d’aqueste fichièr." @@ -80,27 +80,27 @@ "no_more_notifications": "Pas mai de notificacions" }, "polls": { -"add_poll": "Ajustar un sondatge", + "add_poll": "Ajustar un sondatge", "add_option": "Ajustar d’opcions", - "option": "Opcion", - "votes": "vòtes", - "vote": "Votar", - "type": "Tipe de sondatge", - "single_choice": "Causida unica", - "multiple_choices": "Causida multipla", - "expiry": "Durada del sondatge", - "expires_in": "Lo sondatge s’acabarà {0}", - "expired": "Sondatge acabat {0}", - "not_enough_options": "I a pas pro d’opcions" - }, - "stickers": { - "add_sticker": "Ajustar un pegasolet" - }, + "option": "Opcion", + "votes": "vòtes", + "vote": "Votar", + "type": "Tipe de sondatge", + "single_choice": "Causida unica", + "multiple_choices": "Causida multipla", + "expiry": "Durada del sondatge", + "expires_in": "Lo sondatge s’acabarà {0}", + "expired": "Sondatge acabat {0}", + "not_enough_options": "I a pas pro d’opcions" + }, + "stickers": { + "add_sticker": "Ajustar un pegasolet" + }, "interactions": { "favs_repeats": "Repeticions e favorits", "follows": "Nòus seguidors", "load_older": "Cargar d’interaccions anterioras" - }, + }, "post_status": { "new_status": "Publicar d’estatuts novèls", "account_not_locked_warning": "Vòstre compte es pas {0}. Qual que siá pòt vos seguir per veire vòstras publicacions destinadas pas qu’a vòstres seguidors.", @@ -146,8 +146,8 @@ } }, "selectable_list": { - "select_all": "O seleccionar tot" - }, + "select_all": "O seleccionar tot" + }, "settings": { "app_name": "Nom de l’aplicacion", "attachmentRadius": "Pèças juntas", @@ -225,7 +225,6 @@ "use_contain_fit": "Talhar pas las pèças juntas per las vinhetas", "name": "Nom", "name_bio": "Nom & Bio", - "new_password": "Nòu senhal", "notification_visibility_follows": "Abonaments", "notification_visibility_likes": "Aimar", @@ -273,7 +272,7 @@ "subject_line_email": "Coma los corrièls : \"re: subjècte\"", "subject_line_mastodon": "Coma mastodon : copiar tal coma es", "subject_line_noop": "Copiar pas", -"post_status_content_type": "Publicar lo tipe de contengut dels estatuts", + "post_status_content_type": "Publicar lo tipe de contengut dels estatuts", "stop_gifs": "Lançar los GIFs al subrevòl", "streaming": "Activar lo cargament automatic dels novèls estatus en anar amont", "text": "Tèxte", @@ -296,7 +295,7 @@ "notification_setting_non_followers": "Utilizaires que vos seguisson pas", "notification_mutes": "Per recebre pas mai d’un utilizaire en particular, botatz-lo en silenci.", "notification_blocks": "Blocar un utilizaire arrèsta totas las notificacions tan coma quitar de los seguir.", - "enable_web_push_notifications": "Activar las notificacions web push", + "enable_web_push_notifications": "Activar las notificacions web push", "style": { "switcher": { "keep_color": "Gardar las colors", @@ -451,7 +450,7 @@ "conversation": "Conversacion", "error_fetching": "Error en cercant de mesas a jorn", "load_older": "Ne veire mai", - "no_retweet_hint": "Las publicacions marcadas pels seguidors solament o dirèctas se pòdon pas repetir", + "no_retweet_hint": "Las publicacions marcadas pels seguidors solament o dirèctas se pòdon pas repetir", "repeated": "repetit", "show_new": "Ne veire mai", "up_to_date": "A jorn", @@ -512,7 +511,7 @@ "quarantine": "Defendre la federacion de las publicacions de l’utilizaire", "delete_user": "Suprimir l’utilizaire", "delete_user_confirmation": "Volètz vertadièrament far aquò ? Aquesta accion se pòt pas anullar." - } + } }, "user_profile": { "timeline_title": "Flux utilizaire", @@ -544,11 +543,11 @@ "TiB": "Tio" } }, - "search": { - "people": "Gent", - "hashtags": "Etiquetas", - "person_talking": "{count} persona ne parla", - "people_talking": "{count} personas ne parlan", - "no_results": "Cap de resultats" + "search": { + "people": "Gent", + "hashtags": "Etiquetas", + "person_talking": "{count} persona ne parla", + "people_talking": "{count} personas ne parlan", + "no_results": "Cap de resultats" } } \ No newline at end of file From 0d6a9f5a629c8a181e4dbd3e2060236773c2337a Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 19:30:55 +0300 Subject: [PATCH 75/81] comment, cleanup and improve autoresize/autoscroll --- .../post_status_form/post_status_form.js | 85 +++++++++++-------- .../offset_finder/offset_finder.service.js | 1 - 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index aaecf088..6ba7e7e1 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -277,6 +277,8 @@ const PostStatusForm = { resize (e) { const target = e.target || e if (!(target instanceof window.Element)) { return } + + // Reset to default height for empty form, nothing else to do here. if (target.value === '') { target.style.height = null this.$refs['emoji-input'].resize() @@ -284,61 +286,74 @@ const PostStatusForm = { } const rootRef = this.$refs['root'] - const scroller = this.$el.closest('.sidebar-scroller') || + /* Scroller is either `window` (replies in TL), sidebar (main post form, + * replies in notifs) or mobile post form. Note that getting and setting + * scroll is different for `Window` and `Element`s + */ + const scrollerRef = this.$el.closest('.sidebar-scroller') || this.$el.closest('.post-form-modal-view') || window + // Getting info about padding we have to account for, removing 'px' part const topPaddingStr = window.getComputedStyle(target)['padding-top'] const bottomPaddingStr = window.getComputedStyle(target)['padding-bottom'] - // Remove "px" at the end of the values const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2)) const bottomPadding = Number(bottomPaddingStr.substring(0, bottomPaddingStr.length - 2)) const vertPadding = topPadding + bottomPadding + const oldHeightStr = target.style.height || '' const oldHeight = Number(oldHeightStr.substring(0, oldHeightStr.length - 2)) - const tempScroll = scroller === window ? scroller.scrollY : scroller.scrollTop + /* Explanation: + * + * https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight + * scrollHeight returns element's scrollable content height, i.e. visible + * element + overscrolled parts of it. We use it to determine when text + * inside the textarea exceeded its height, so we can set height to prevent + * overscroll, i.e. make textarea grow with the text. HOWEVER, since we + * explicitly set new height, scrollHeight won't go below that, so we can't + * SHRINK the textarea when there's extra space. To workaround that we set + * height to 'auto' which makes textarea tiny again, so that scrollHeight + * will match text height again. HOWEVER, shrinking textarea can screw with + * the scroll since there might be not enough padding around root to even + * varrant a scroll, so it will jump to 0 and refuse to move anywhere, + * so we check current scroll position before shrinking and then restore it + * with needed delta. + */ - // Auto is needed to make textbox shrink when removing lines - target.style.height = 'auto' - const newHeight = target.scrollHeight - vertPadding - target.style.height = `${oldHeight}px` - - if (scroller === window) { - scroller.scroll(0, tempScroll) - } else { - scroller.scrollTop = tempScroll - } - - const currentScroll = scroller === window ? scroller.scrollY : scroller.scrollTop - const scrollerHeight = scroller === window ? scroller.innerHeight : scroller.offsetHeight + // this part has to be BEFORE the content size update + const currentScroll = scrollerRef === window + ? scrollerRef.scrollY + : scrollerRef.scrollTop + const scrollerHeight = scrollerRef === window + ? scrollerRef.innerHeight + : scrollerRef.offsetHeight const scrollerBottomBorder = currentScroll + scrollerHeight - const rootBottomBorder = rootRef.offsetHeight + - findOffset(rootRef, scroller).top + // BEGIN content size update + target.style.height = 'auto' + const newHeight = target.scrollHeight - vertPadding + target.style.height = `${newHeight}px` + // END content size update + + // We check where the bottom border of root element is, this uses findOffset + // to find offset relative to scrollable container (scroller) + const rootBottomBorder = rootRef.offsetHeight + findOffset(rootRef, scrollerRef).top const textareaSizeChangeDelta = newHeight - oldHeight || 0 - const rootChangeDelta = rootBottomBorder - scrollerBottomBorder + textareaSizeChangeDelta + const isBottomObstructed = scrollerBottomBorder < rootBottomBorder + const rootChangeDelta = rootBottomBorder - scrollerBottomBorder + const totalDelta = textareaSizeChangeDelta + + (isBottomObstructed ? rootChangeDelta : 0) - // console.log('CURRENT SCROLL', currentScroll) - console.log('BOTTOM BORDERS', rootBottomBorder, scrollerBottomBorder) - console.log('BOTTOM DELTA', rootBottomBorder - scrollerBottomBorder) - const targetScroll = scrollerBottomBorder < rootBottomBorder - ? currentScroll + rootChangeDelta - : currentScroll + textareaSizeChangeDelta - if (scroller === window) { - scroller.scroll(0, targetScroll) + const targetScroll = currentScroll + totalDelta + + if (scrollerRef === window) { + scrollerRef.scroll(0, targetScroll) } else { - scroller.scrollTop = targetScroll + scrollerRef.scrollTop = targetScroll } - target.style.height = `${newHeight}px` - console.log(scroller, rootRef) - // console.log('SCROLL TO BUTTON', scrollerBottomBorder < rootBottomBorder) - // console.log('DELTA B', rootChangeDelta) - // console.log('DELTA D', textareaSizeChangeDelta) - // console.log('TARGET', targetScroll) - // console.log('ACTUAL', scroller.scrollTop || scroller.scrollY || 0) this.$refs['emoji-input'].resize() }, showEmojiPicker () { diff --git a/src/services/offset_finder/offset_finder.service.js b/src/services/offset_finder/offset_finder.service.js index a8e438b5..9034f8c8 100644 --- a/src/services/offset_finder/offset_finder.service.js +++ b/src/services/offset_finder/offset_finder.service.js @@ -9,7 +9,6 @@ export const findOffset = (child, parent, { top = 0, left = 0 } = {}, ignorePadd result.left += ignorePadding ? 0 : leftPadding } - console.log('eee', parent, child.offsetParent) if (child.offsetParent && (parent === window || parent.contains(child.offsetParent) || parent === child.offsetParent)) { return findOffset(child.offsetParent, parent, result, false) } else { From e3ceae0989ef3c5569c0d4a7eaf7f6ea5f7e6ccc Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 19:32:30 +0300 Subject: [PATCH 76/81] very important fix --- src/components/post_status_form/post_status_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 6ba7e7e1..76bcfa71 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -316,7 +316,7 @@ const PostStatusForm = { * height to 'auto' which makes textarea tiny again, so that scrollHeight * will match text height again. HOWEVER, shrinking textarea can screw with * the scroll since there might be not enough padding around root to even - * varrant a scroll, so it will jump to 0 and refuse to move anywhere, + * warrant a scroll, so it will jump to 0 and refuse to move anywhere, * so we check current scroll position before shrinking and then restore it * with needed delta. */ From e805303d3a792045c8822e4300e4742fee9723c8 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 19:58:15 +0300 Subject: [PATCH 77/81] Scroll emoji picker into view if it's obstructed --- src/components/emoji_input/emoji_input.js | 43 +++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 25c21403..f30cd1e4 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -1,6 +1,7 @@ import Completion from '../../services/completion/completion.js' import EmojiPicker from '../emoji_picker/emoji_picker.vue' import { take } from 'lodash' +import { findOffset } from '../../services/offset_finder/offset_finder.service.js' /** * EmojiInput - augmented inputs for emoji and autocomplete support in inputs @@ -144,6 +145,7 @@ const EmojiInput = { input.elm.addEventListener('paste', this.onPaste) input.elm.addEventListener('keyup', this.onKeyUp) input.elm.addEventListener('keydown', this.onKeyDown) + input.elm.addEventListener('click', this.onClickInput) input.elm.addEventListener('transitionend', this.onTransition) input.elm.addEventListener('compositionupdate', this.onCompositionUpdate) }, @@ -155,6 +157,7 @@ const EmojiInput = { input.elm.removeEventListener('paste', this.onPaste) input.elm.removeEventListener('keyup', this.onKeyUp) input.elm.removeEventListener('keydown', this.onKeyDown) + input.elm.removeEventListener('click', this.onClickInput) input.elm.removeEventListener('transitionend', this.onTransition) input.elm.removeEventListener('compositionupdate', this.onCompositionUpdate) } @@ -162,6 +165,9 @@ const EmojiInput = { methods: { triggerShowPicker () { this.showPicker = true + this.$nextTick(() => { + this.scrollIntoView() + }) // This temporarily disables "click outside" handler // since external trigger also means click originates // from outside, thus preventing picker from opening @@ -173,6 +179,9 @@ const EmojiInput = { togglePicker () { this.input.elm.focus() this.showPicker = !this.showPicker + if (this.showPicker) { + this.scrollIntoView() + } }, replace (replacement) { const newValue = Completion.replaceWord(this.value, this.wordAtCaret, replacement) @@ -267,6 +276,37 @@ const EmojiInput = { this.highlighted = 0 } }, + scrollIntoView () { + const rootRef = this.$refs['picker'].$el + /* Scroller is either `window` (replies in TL), sidebar (main post form, + * replies in notifs) or mobile post form. Note that getting and setting + * scroll is different for `Window` and `Element`s + */ + const scrollerRef = this.$el.closest('.sidebar-scroller') || + this.$el.closest('.post-form-modal-view') || + window + const currentScroll = scrollerRef === window + ? scrollerRef.scrollY + : scrollerRef.scrollTop + const scrollerHeight = scrollerRef === window + ? scrollerRef.innerHeight + : scrollerRef.offsetHeight + + const scrollerBottomBorder = currentScroll + scrollerHeight + // We check where the bottom border of root element is, this uses findOffset + // to find offset relative to scrollable container (scroller) + const rootBottomBorder = rootRef.offsetHeight + findOffset(rootRef, scrollerRef).top + + const bottomDelta = Math.max(0, rootBottomBorder - scrollerBottomBorder) + // could also check top delta but there's no case for it + const targetScroll = currentScroll + bottomDelta + + if (scrollerRef === window) { + scrollerRef.scroll(0, targetScroll) + } else { + scrollerRef.scrollTop = targetScroll + } + }, onTransition (e) { this.resize() }, @@ -360,6 +400,9 @@ const EmojiInput = { this.resize() this.$emit('input', e.target.value) }, + onClickInput (e) { + this.showPicker = false; + }, onClickOutside (e) { if (this.disableClickOutside) return this.showPicker = false From 0b300e170805f45bd8cc854cbfa48b4df020b909 Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 20:01:06 +0300 Subject: [PATCH 78/81] bump z-index so that picker/suggest doesn't get overlapped by mobile button --- src/components/emoji_input/emoji_input.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue index 53b38573..05fb931b 100644 --- a/src/components/emoji_input/emoji_input.vue +++ b/src/components/emoji_input/emoji_input.vue @@ -78,7 +78,7 @@ } .emoji-picker-panel { position: absolute; - z-index: 9; + z-index: 20; margin-top: 2px; &.hide { @@ -89,7 +89,7 @@ .autocomplete { &-panel { position: absolute; - z-index: 9; + z-index: 20; margin-top: 2px; &.hide { From e6d2cf77af9ac2119c23e8c748368f0fdceae0ae Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 20:11:06 +0300 Subject: [PATCH 79/81] fix emoji inputs in user-settings, styles update --- src/components/emoji_input/emoji_input.vue | 3 ++- src/components/user_settings/user_settings.vue | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/emoji_input/emoji_input.vue b/src/components/emoji_input/emoji_input.vue index 05fb931b..13530e8b 100644 --- a/src/components/emoji_input/emoji_input.vue +++ b/src/components/emoji_input/emoji_input.vue @@ -67,9 +67,10 @@ position: absolute; top: 0; right: 0; - margin: 0 .25em; + margin: .2em .25em; font-size: 16px; cursor: pointer; + line-height: 24px; &:hover i { color: $fallback--text; diff --git a/src/components/user_settings/user_settings.vue b/src/components/user_settings/user_settings.vue index 34ea8569..97833acb 100644 --- a/src/components/user_settings/user_settings.vue +++ b/src/components/user_settings/user_settings.vue @@ -32,6 +32,7 @@ <p>{{ $t('settings.name') }}</p> <EmojiInput v-model="newName" + enable-emoji-picker :suggest="emojiSuggestor" > <input @@ -43,6 +44,7 @@ <p>{{ $t('settings.bio') }}</p> <EmojiInput v-model="newBio" + enable-emoji-picker :suggest="emojiUserSuggestor" > <textarea From 2f26e8acc5395753f4d649d9a1bfbe356717e9ac Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 20:23:55 +0300 Subject: [PATCH 80/81] eslint --- src/components/emoji_input/emoji_input.js | 2 +- src/components/emoji_picker/emoji_picker.vue | 9 ++++++--- src/components/post_status_form/post_status_form.vue | 6 +++--- src/components/user_card/user_card.vue | 7 +++++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index f30cd1e4..a586b819 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -401,7 +401,7 @@ const EmojiInput = { this.$emit('input', e.target.value) }, onClickInput (e) { - this.showPicker = false; + this.showPicker = false }, onClickOutside (e) { if (this.disableClickOutside) return diff --git a/src/components/emoji_picker/emoji_picker.vue b/src/components/emoji_picker/emoji_picker.vue index 6c43dd97..42f20130 100644 --- a/src/components/emoji_picker/emoji_picker.vue +++ b/src/components/emoji_picker/emoji_picker.vue @@ -77,13 +77,16 @@ </div> <div class="keep-open" - > + > <input :id="labelKey + 'keep-open'" v-model="keepOpen" type="checkbox" - > - <label class="keep-open-label" :for="labelKey + 'keep-open'"> + > + <label + class="keep-open-label" + :for="labelKey + 'keep-open'" + > <div class="keep-open-label-text"> {{ $t('emoji.keep_open') }} </div> diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 5f9e21ae..4916d988 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -1,7 +1,7 @@ <template> -<div - class="post-status-form" - ref="root" + <div + ref="root" + class="post-status-form" > <form autocomplete="off" diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index c2626260..629d1fd0 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -3,8 +3,11 @@ class="user-card" :class="classes" > - <div :class="{ 'hide-bio': hideBio }" :style="style" class="background-image"> - </div> + <div + :class="{ 'hide-bio': hideBio }" + :style="style" + class="background-image" + /> <div class="panel-heading"> <div class="user-info"> <div class="container"> From 836cb817d18f5e3ee6dab446633b8e05733c2a3a Mon Sep 17 00:00:00 2001 From: Henry Jameson <me@hjkos.com> Date: Wed, 25 Sep 2019 20:54:07 +0300 Subject: [PATCH 81/81] fix tests --- .../unit/specs/components/emoji_input.spec.js | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/test/unit/specs/components/emoji_input.spec.js b/test/unit/specs/components/emoji_input.spec.js index 13a59961..368d623d 100644 --- a/test/unit/specs/components/emoji_input.spec.js +++ b/test/unit/specs/components/emoji_input.spec.js @@ -1,7 +1,7 @@ import { shallowMount, createLocalVue } from '@vue/test-utils' import EmojiInput from 'src/components/emoji_input/emoji_input.vue' -const generateInput = (value) => { +const generateInput = (value, padEmoji = true) => { const localVue = createLocalVue() localVue.directive('click-outside', () => {}) const wrapper = shallowMount(EmojiInput, { @@ -10,6 +10,15 @@ const generateInput = (value) => { enableEmojiPicker: true, value }, + mocks: { + $store: { + state: { + config: { + padEmoji + } + } + } + }, slots: { default: '<input />' }, @@ -70,13 +79,13 @@ describe('EmojiInput', () => { expect(wrapper.emitted().input[0][0]).to.eql('Spurdo :ebin: Sparde') }) - it('inserts string without any padding in spam mode', () => { + it('inserts string without any padding if padEmoji setting is set to false', () => { const initialString = 'Eat some spam!' - const [wrapper] = generateInput(initialString) + const [wrapper] = generateInput(initialString, false) const input = wrapper.find('input') input.setValue(initialString) - wrapper.setData({ caret: initialString.length }) - wrapper.vm.insert({ insertion: ':spam:', keepOpen: true }) + wrapper.setData({ caret: initialString.length, keepOpen: false }) + wrapper.vm.insert({ insertion: ':spam:' }) expect(wrapper.emitted().input[0][0]).to.eql('Eat some spam!:spam:') }) @@ -106,13 +115,13 @@ describe('EmojiInput', () => { }) }) - it('correctly sets caret after insertion in spam mode', (done) => { + it('correctly sets caret after insertion if padEmoji setting is set to false', (done) => { const initialString = '1234' - const [wrapper, vue] = generateInput(initialString) + const [wrapper, vue] = generateInput(initialString, false) const input = wrapper.find('input') input.setValue(initialString) wrapper.setData({ caret: initialString.length }) - wrapper.vm.insert({ insertion: '1234', keepOpen: true }) + wrapper.vm.insert({ insertion: '1234', keepOpen: false }) vue.nextTick(() => { expect(wrapper.vm.caret).to.eql(8) done()