Merge branch 'develop' into 'patch-1'
# Conflicts: # src/i18n/messages.js
This commit is contained in:
commit
af47d51cd1
@ -29,4 +29,6 @@ npm run build
|
||||
npm run unit
|
||||
```
|
||||
|
||||
For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
|
||||
# Configuration
|
||||
|
||||
Edit config.json for configuration. scopeOptionsEnabled gives you input fields for CWs and the scope settings.
|
||||
|
@ -2,6 +2,7 @@ import UserPanel from './components/user_panel/user_panel.vue'
|
||||
import NavPanel from './components/nav_panel/nav_panel.vue'
|
||||
import Notifications from './components/notifications/notifications.vue'
|
||||
import UserFinder from './components/user_finder/user_finder.vue'
|
||||
import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_panel.vue'
|
||||
import InstanceSpecificPanel from './components/instance_specific_panel/instance_specific_panel.vue'
|
||||
import ChatPanel from './components/chat_panel/chat_panel.vue'
|
||||
|
||||
@ -12,8 +13,9 @@ export default {
|
||||
NavPanel,
|
||||
Notifications,
|
||||
UserFinder,
|
||||
ChatPanel,
|
||||
InstanceSpecificPanel
|
||||
WhoToFollowPanel,
|
||||
InstanceSpecificPanel,
|
||||
ChatPanel
|
||||
},
|
||||
data: () => ({
|
||||
mobileActivePanel: 'timeline'
|
||||
@ -27,6 +29,7 @@ export default {
|
||||
style () { return { 'background-image': `url(${this.background})` } },
|
||||
sitename () { return this.$store.state.config.name },
|
||||
chat () { return this.$store.state.chat.channel.state === 'joined' },
|
||||
showWhoToFollowPanel () { return this.$store.state.config.showWhoToFollowPanel },
|
||||
showInstanceSpecificPanel () { return this.$store.state.config.showInstanceSpecificPanel }
|
||||
},
|
||||
methods: {
|
||||
|
12
src/App.scss
12
src/App.scss
@ -88,13 +88,13 @@ label.select {
|
||||
|
||||
input, textarea, .select {
|
||||
border: none;
|
||||
border-radius: $fallback--btnRadius;
|
||||
border-radius: var(--btnRadius, $fallback--btnRadius);
|
||||
border-radius: $fallback--inputRadius;
|
||||
border-radius: var(--inputRadius, $fallback--inputRadius);
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 0px 0px 2px black inset;
|
||||
background-color: $fallback--lightBg;
|
||||
background-color: var(--lightBg, $fallback--lightBg);
|
||||
background-color: $fallback--input;
|
||||
background-color: var(--input, $fallback--input);
|
||||
color: $fallback--lightFg;
|
||||
color: var(--lightFg, $fallback--lightFg);
|
||||
font-family: sans-serif;
|
||||
@ -154,8 +154,8 @@ input, textarea, .select {
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 0px 0px 2px black inset;
|
||||
margin-right: .5em;
|
||||
background-color: $fallback--btn;
|
||||
background-color: var(--btn, $fallback--btn);
|
||||
background-color: $fallback--input;
|
||||
background-color: var(--input, $fallback--input);
|
||||
vertical-align: top;
|
||||
text-align: center;
|
||||
line-height: 1.1em;
|
||||
|
@ -24,6 +24,7 @@
|
||||
<user-panel></user-panel>
|
||||
<nav-panel></nav-panel>
|
||||
<instance-specific-panel v-if="showInstanceSpecificPanel"></instance-specific-panel>
|
||||
<who-to-follow-panel v-if="currentUser && showWhoToFollowPanel"></who-to-follow-panel>
|
||||
<notifications v-if="currentUser"></notifications>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -4,7 +4,8 @@ $darkened-background: whitesmoke;
|
||||
|
||||
$fallback--bg: #121a24;
|
||||
$fallback--btn: #182230;
|
||||
$fallback--faint: #999;
|
||||
$fallback--input: #182230;
|
||||
$fallback--faint: rgba(185, 185, 186, .5);
|
||||
$fallback--fg: #b9b9ba;
|
||||
$fallback--link: #d8a070;
|
||||
$fallback--icon: #666;
|
||||
@ -21,6 +22,7 @@ $fallback--cAlertRed: rgba(211,16,20,.5);
|
||||
$fallback--panelRadius: 10px;
|
||||
$fallback--checkBoxRadius: 2px;
|
||||
$fallback--btnRadius: 4px;
|
||||
$fallback--inputRadius: 4px;
|
||||
$fallback--tooltipRadius: 5px;
|
||||
$fallback--avatarRadius: 4px;
|
||||
$fallback--avatarAltRadius: 10px;
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 17 KiB |
@ -96,6 +96,9 @@
|
||||
background: rgba(230,230,230,0.6);
|
||||
font-weight: bold;
|
||||
z-index: 4;
|
||||
line-height: 1;
|
||||
border-radius: $fallback--tooltipRadius;
|
||||
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
|
||||
}
|
||||
|
||||
.small {
|
||||
|
@ -3,7 +3,7 @@
|
||||
<div class="panel-heading conversation-heading">
|
||||
{{ $t('timeline.conversation') }}
|
||||
<span v-if="collapsable" style="float:right;">
|
||||
<small><a href="#" @click.prevent="$emit('toggleExpanded')">Collapse</a></small>
|
||||
<small><a href="#" @click.prevent="$emit('toggleExpanded')">{{ $t('timeline.collapse') }}</a></small>
|
||||
</span>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
|
@ -45,8 +45,6 @@
|
||||
border-bottom: 1px solid;
|
||||
border-color: $fallback--border;
|
||||
border-color: var(--border, $fallback--border);
|
||||
background-color: $fallback--bg;
|
||||
background-color: var(--bg, $fallback--bg);
|
||||
padding: 0;
|
||||
|
||||
&:first-child a {
|
||||
|
@ -98,7 +98,7 @@
|
||||
.status {
|
||||
padding: 0.25em 0;
|
||||
color: $fallback--faint;
|
||||
color: var($fallback--faint, --faint);
|
||||
color: var(--faint, $fallback--faint);
|
||||
}
|
||||
padding: 0;
|
||||
.media-body {
|
||||
|
@ -48,12 +48,21 @@ const PostStatusForm = {
|
||||
highlighted: 0,
|
||||
newStatus: {
|
||||
status: statusText,
|
||||
files: []
|
||||
files: [],
|
||||
visibility: 'public'
|
||||
},
|
||||
caret: 0
|
||||
}
|
||||
},
|
||||
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 === '@') {
|
||||
@ -118,6 +127,9 @@ const PostStatusForm = {
|
||||
},
|
||||
isOverLengthLimit () {
|
||||
return this.hasStatusLengthLimit && (this.statusLength > this.statusLengthLimit)
|
||||
},
|
||||
scopeOptionsEnabled () {
|
||||
return this.$store.state.config.scopeOptionsEnabled
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
@ -185,6 +197,8 @@ const PostStatusForm = {
|
||||
this.posting = true
|
||||
statusPoster.postStatus({
|
||||
status: newStatus.status,
|
||||
spoilerText: newStatus.spoilerText || null,
|
||||
visibility: newStatus.visibility,
|
||||
media: newStatus.files,
|
||||
store: this.$store,
|
||||
inReplyToStatusId: this.replyTo
|
||||
@ -192,7 +206,8 @@ const PostStatusForm = {
|
||||
if (!data.error) {
|
||||
this.newStatus = {
|
||||
status: '',
|
||||
files: []
|
||||
files: [],
|
||||
visibility: newStatus.visibility
|
||||
}
|
||||
this.$emit('posted')
|
||||
let el = this.$el.querySelector('textarea')
|
||||
@ -239,18 +254,20 @@ const PostStatusForm = {
|
||||
e.dataTransfer.dropEffect = 'copy'
|
||||
},
|
||||
resize (e) {
|
||||
const target = e.target || e
|
||||
target.style.height = 'auto'
|
||||
const heightPx = target.scrollHeight - 10
|
||||
if (heightPx > 54) {
|
||||
target.style.height = `${target.scrollHeight - 10}px`
|
||||
}
|
||||
if (target.value === '') {
|
||||
target.style.height = '16px'
|
||||
if (!e.target) { return }
|
||||
const vertPadding = Number(window.getComputedStyle(e.target)['padding-top'].substr(0, 1)) +
|
||||
Number(window.getComputedStyle(e.target)['padding-bottom'].substr(0, 1))
|
||||
e.target.style.height = 'auto'
|
||||
e.target.style.height = `${e.target.scrollHeight - vertPadding}px`
|
||||
if (e.target.value === '') {
|
||||
e.target.style.height = '16px'
|
||||
}
|
||||
},
|
||||
clearError () {
|
||||
this.error = null
|
||||
},
|
||||
changeVis (visibility) {
|
||||
this.newStatus.visibility = visibility
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,12 @@
|
||||
<div class="post-status-form">
|
||||
<form @submit.prevent="postStatus(newStatus)">
|
||||
<div class="form-group" >
|
||||
<input
|
||||
v-if="scopeOptionsEnabled"
|
||||
type="text"
|
||||
:placeholder="$t('post_status.content_warning')"
|
||||
v-model="newStatus.spoilerText"
|
||||
class="form-cw">
|
||||
<textarea
|
||||
ref="textarea"
|
||||
@click="setCaret"
|
||||
@ -18,16 +24,17 @@
|
||||
@input="resize"
|
||||
@paste="paste">
|
||||
</textarea>
|
||||
<div v-if="scopeOptionsEnabled" class="visibility-tray">
|
||||
<i v-on:click="changeVis('direct')" class="icon-mail-alt" :class="vis.direct"></i>
|
||||
<i v-on:click="changeVis('private')" class="icon-lock" :class="vis.private"></i>
|
||||
<i v-on:click="changeVis('unlisted')" class="icon-lock-open-alt" :class="vis.unlisted"></i>
|
||||
<i v-on:click="changeVis('public')" class="icon-globe" :class="vis.public"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div style="position:relative;" v-if="candidates">
|
||||
<div class="autocomplete-panel">
|
||||
<div v-for="candidate in candidates" @click="replace(candidate.utf || (candidate.screen_name + ' '))">
|
||||
<div v-if="candidate.highlighted" class="autocomplete">
|
||||
<span v-if="candidate.img"><img :src="candidate.img"></span>
|
||||
<span v-else>{{candidate.utf}}</span>
|
||||
<span>{{candidate.screen_name}}<small>{{candidate.name}}</small></span>
|
||||
</div>
|
||||
<div v-else class="autocomplete">
|
||||
<div class="autocomplete" :class="{ highlighted: candidate.highlighted }">
|
||||
<span v-if="candidate.img"><img :src="candidate.img"></img></span>
|
||||
<span v-else>{{candidate.utf}}</span>
|
||||
<span>{{candidate.screen_name}}<small>{{candidate.name}}</small></span>
|
||||
@ -84,6 +91,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
.post-status-form .visibility-tray {
|
||||
font-size: 1.2em;
|
||||
padding: 3px;
|
||||
cursor: pointer;
|
||||
|
||||
.selected {
|
||||
color: $fallback--lightFg;
|
||||
color: var(--lightFg, $fallback--lightFg);
|
||||
}
|
||||
}
|
||||
|
||||
.post-status-form, .login {
|
||||
.form-bottom {
|
||||
display: flex;
|
||||
@ -135,10 +153,6 @@
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.icon-cancel {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@ -152,7 +166,15 @@
|
||||
line-height:24px;
|
||||
}
|
||||
|
||||
form textarea {
|
||||
form textarea.form-cw {
|
||||
line-height:16px;
|
||||
resize: none;
|
||||
overflow: hidden;
|
||||
transition: min-height 200ms 100ms;
|
||||
min-height: 1px;
|
||||
}
|
||||
|
||||
form textarea.form-control {
|
||||
line-height:16px;
|
||||
resize: none;
|
||||
overflow: hidden;
|
||||
@ -161,7 +183,7 @@
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
form textarea:focus {
|
||||
form textarea.form-control:focus {
|
||||
min-height: 48px;
|
||||
}
|
||||
|
||||
@ -186,8 +208,8 @@
|
||||
z-index: 1;
|
||||
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
|
||||
min-width: 75%;
|
||||
background: $fallback--btn;
|
||||
background: var(--btn, $fallback--btn);
|
||||
background: $fallback--bg;
|
||||
background: var(--bg, $fallback--bg);
|
||||
color: $fallback--lightFg;
|
||||
color: var(--lightFg, $fallback--lightFg);
|
||||
}
|
||||
@ -216,6 +238,11 @@
|
||||
color: $fallback--faint;
|
||||
color: var(--faint, $fallback--faint);
|
||||
}
|
||||
|
||||
&.highlighted {
|
||||
background-color: $fallback--btn;
|
||||
background-color: var(--btn, $fallback--btn);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
@ -104,6 +104,18 @@ const Status = {
|
||||
StillImage
|
||||
},
|
||||
methods: {
|
||||
visibilityIcon (visibility) {
|
||||
switch (visibility) {
|
||||
case 'private':
|
||||
return 'icon-lock'
|
||||
case 'unlisted':
|
||||
return 'icon-lock-open-alt'
|
||||
case 'direct':
|
||||
return 'icon-mail-alt'
|
||||
default:
|
||||
return 'icon-globe'
|
||||
}
|
||||
},
|
||||
linkClicked ({target}) {
|
||||
if (target.tagName === 'SPAN') {
|
||||
target = target.parentNode
|
||||
|
@ -55,6 +55,7 @@
|
||||
<router-link class="timeago" :to="{ name: 'conversation', params: { id: status.id } }">
|
||||
<timeago :since="status.created_at" :auto-update="60"></timeago>
|
||||
</router-link>
|
||||
<span v-if="status.visibility"><i :class="visibilityIcon(status.visibility)"></i> </span>
|
||||
<a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="icon-link-ext"></i></a>
|
||||
<template v-if="expandable">
|
||||
<a href="#" @click.prevent="toggleExpanded"><i class="icon-plus-squared"></i></a>
|
||||
@ -165,8 +166,6 @@
|
||||
border-left-width: 0px;
|
||||
line-height: 18px;
|
||||
min-width: 0;
|
||||
background-color: $fallback--bg;
|
||||
background-color: var(--bg, $fallback--bg);
|
||||
border-color: $fallback--border;
|
||||
border-color: var(--border, $fallback--border);
|
||||
|
||||
@ -189,6 +188,10 @@
|
||||
margin: 0 0 0.25em 0.8em;
|
||||
}
|
||||
|
||||
.usercard {
|
||||
margin-bottom: .7em
|
||||
}
|
||||
|
||||
.media-heading {
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ export default {
|
||||
greenColorLocal: '',
|
||||
orangeColorLocal: '',
|
||||
btnRadiusLocal: '',
|
||||
inputRadiusLocal: '',
|
||||
panelRadiusLocal: '',
|
||||
avatarRadiusLocal: '',
|
||||
avatarAltRadiusLocal: '',
|
||||
@ -42,6 +43,7 @@ export default {
|
||||
this.orangeColorLocal = rgbstr2hex(this.$store.state.config.colors.cOrange)
|
||||
|
||||
this.btnRadiusLocal = this.$store.state.config.radii.btnRadius || 4
|
||||
this.inputRadiusLocal = this.$store.state.config.radii.inputRadius || 4
|
||||
this.panelRadiusLocal = this.$store.state.config.radii.panelRadius || 10
|
||||
this.avatarRadiusLocal = this.$store.state.config.radii.avatarRadius || 5
|
||||
this.avatarAltRadiusLocal = this.$store.state.config.radii.avatarAltRadius || 50
|
||||
@ -85,6 +87,7 @@ export default {
|
||||
cGreen: greenRgb,
|
||||
cOrange: orangeRgb,
|
||||
btnRadius: this.btnRadiusLocal,
|
||||
inputRadius: this.inputRadiusLocal,
|
||||
panelRadius: this.panelRadiusLocal,
|
||||
avatarRadius: this.avatarRadiusLocal,
|
||||
avatarAltRadius: this.avatarAltRadiusLocal,
|
||||
|
@ -58,6 +58,11 @@
|
||||
<input id="btnradius" class="theme-radius-rn" type="range" v-model="btnRadiusLocal" max="16">
|
||||
<input id="btnradius-t" class="theme-radius-in" type="text" v-model="btnRadiusLocal">
|
||||
</div>
|
||||
<div class="radius-item">
|
||||
<label for="inputradius" class="theme-radius-lb">{{$t('settings.inputRadius')}}</label>
|
||||
<input id="inputradius" class="theme-radius-rn" type="range" v-model="inputRadiusLocal" max="16">
|
||||
<input id="inputradius-t" class="theme-radius-in" type="text" v-model="inputRadiusLocal">
|
||||
</div>
|
||||
<div class="radius-item">
|
||||
<label for="panelradius" class="theme-radius-lb">{{$t('settings.panelRadius')}}</label>
|
||||
<input id="panelradius" class="theme-radius-rn" type="range" v-model="panelRadiusLocal" max="50">
|
||||
@ -86,6 +91,7 @@
|
||||
</div>
|
||||
<div :style="{
|
||||
'--btnRadius': btnRadiusLocal + 'px',
|
||||
'--inputRadius': inputRadiusLocal + 'px',
|
||||
'--panelRadius': panelRadiusLocal + 'px',
|
||||
'--avatarRadius': avatarRadiusLocal + 'px',
|
||||
'--avatarAltRadius': avatarAltRadiusLocal + 'px',
|
||||
|
@ -2,16 +2,24 @@ import StillImage from '../still-image/still-image.vue'
|
||||
import { hex2rgb } from '../../services/color_convert/color_convert.js'
|
||||
|
||||
export default {
|
||||
props: [ 'user', 'switcher', 'hideBio' ],
|
||||
props: [ 'user', 'switcher', 'selected', 'hideBio' ],
|
||||
computed: {
|
||||
headingStyle () {
|
||||
const color = this.$store.state.config.colors.bg
|
||||
if (color) {
|
||||
const rgb = hex2rgb(color)
|
||||
const tintColor = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .5)`
|
||||
console.log(rgb)
|
||||
console.log([
|
||||
`url(${this.user.cover_photo})`,
|
||||
`linear-gradient(to bottom, ${tintColor}, ${tintColor})`
|
||||
].join(', '))
|
||||
return {
|
||||
backgroundColor: `rgb(${Math.floor(rgb[0] * 0.53)}, ${Math.floor(rgb[1] * 0.56)}, ${Math.floor(rgb[2] * 0.59)})`,
|
||||
backgroundImage: `url(${this.user.cover_photo})`
|
||||
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, ${tintColor}, ${tintColor})`,
|
||||
`url(${this.user.cover_photo})`
|
||||
].join(', ')
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -61,8 +69,10 @@ export default {
|
||||
store.state.api.backendInteractor.setUserMute(this.user)
|
||||
},
|
||||
setProfileView (v) {
|
||||
const store = this.$store
|
||||
store.commit('setProfileView', { v })
|
||||
if (this.switcher) {
|
||||
const store = this.$store
|
||||
store.commit('setProfileView', { v })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,8 +14,9 @@
|
||||
</router-link>
|
||||
<div class="name-and-screen-name">
|
||||
<div :title="user.name" class='user-name'>{{user.name}}</div>
|
||||
<router-link :to="{ name: 'user-profile', params: { id: user.id } }">
|
||||
<div class='user-screen-name'>@{{user.screen_name}}</div>
|
||||
<router-link class='user-screen-name':to="{ name: 'user-profile', params: { id: user.id } }">
|
||||
<span>@{{user.screen_name}}</span>
|
||||
<span class="dailyAvg">{{dailyAvg}} {{ $t('user_card.per_day') }}</span>
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
@ -73,20 +74,17 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body profile-panel-body">
|
||||
<div class="user-counts">
|
||||
<div class="user-count">
|
||||
<a href="#" v-on:click.prevent="setProfileView('statuses')" v-if="switcher"><h5>{{ $t('user_card.statuses') }}</h5></a>
|
||||
<h5 v-else>{{ $t('user_card.statuses') }}</h5>
|
||||
<span>{{user.statuses_count}} <br><span class="dailyAvg">{{dailyAvg}} {{ $t('user_card.per_day') }}</span></span>
|
||||
<div class="user-counts" :class="{clickable: switcher}">
|
||||
<div class="user-count" v-on:click.prevent="setProfileView('statuses')" :class="{selected: selected === 'statuses'}">
|
||||
<h5>{{ $t('user_card.statuses') }}</h5>
|
||||
<span>{{user.statuses_count}} <br></span>
|
||||
</div>
|
||||
<div class="user-count">
|
||||
<a href="#" v-on:click.prevent="setProfileView('friends')" v-if="switcher"><h5>{{ $t('user_card.followees') }}</h5></a>
|
||||
<h5 v-else>{{ $t('user_card.followees') }}</h5>
|
||||
<div class="user-count" v-on:click.prevent="setProfileView('friends')" :class="{selected: selected === 'friends'}">
|
||||
<h5>{{ $t('user_card.followees') }}</h5>
|
||||
<span>{{user.friends_count}}</span>
|
||||
</div>
|
||||
<div class="user-count">
|
||||
<a href="#" v-on:click.prevent="setProfileView('followers')" v-if="switcher"><h5>{{ $t('user_card.followers') }}</h5></a>
|
||||
<h5 v-else>{{ $t('user_card.followers') }}</h5>
|
||||
<div class="user-count" v-on:click.prevent="setProfileView('followers')" :class="{selected: selected === 'followers'}">
|
||||
<h5>{{ $t('user_card.followers') }}</h5>
|
||||
<span>{{user.followers_count}}</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -112,20 +110,18 @@
|
||||
}
|
||||
|
||||
.profile-panel-body {
|
||||
top: -0em;
|
||||
padding-top: 4em;
|
||||
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%)
|
||||
}
|
||||
|
||||
.user-info {
|
||||
color: white;
|
||||
padding: 0 16px 16px 16px;
|
||||
margin-bottom: -4em;
|
||||
color: $fallback--lightFg;
|
||||
color: var(--lightFg, $fallback--lightFg);
|
||||
padding: 0 16px;
|
||||
|
||||
.container {
|
||||
padding: 16px 10px 4px 10px;
|
||||
padding: 16px 10px 6px 10px;
|
||||
display: flex;
|
||||
max-height: 56px;
|
||||
overflow: hidden;
|
||||
@ -154,10 +150,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
text-shadow: 0px 1px 1.5px rgba(0, 0, 0, 1.0);
|
||||
|
||||
.usersettings {
|
||||
color: #fff;
|
||||
color: $fallback--lightFg;
|
||||
color: var(--lightFg, $fallback--lightFg);
|
||||
opacity: .8;
|
||||
}
|
||||
|
||||
@ -171,14 +166,15 @@
|
||||
}
|
||||
|
||||
.user-name{
|
||||
color: white;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.user-screen-name {
|
||||
color: white;
|
||||
font-weight: lighter;
|
||||
color: $fallback--lightFg;
|
||||
color: var(--lightFg, $fallback--lightFg);
|
||||
display: inline-block;
|
||||
font-weight: light;
|
||||
font-size: 15px;
|
||||
padding-right: 0.1em;
|
||||
}
|
||||
@ -191,14 +187,11 @@
|
||||
div {
|
||||
flex: 1;
|
||||
}
|
||||
margin-top: 0.7em;
|
||||
margin-bottom: -1.0em;
|
||||
|
||||
.following {
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
flex: 0 0 100%;
|
||||
margin: -0.7em 0.0em 0.3em 0.0em;
|
||||
margin: 0 0 .4em 0;
|
||||
padding-left: 16px;
|
||||
text-align: left;
|
||||
}
|
||||
@ -238,12 +231,37 @@
|
||||
.user-counts {
|
||||
display: flex;
|
||||
line-height:16px;
|
||||
padding: 1em 1.5em 0em 1em;
|
||||
padding: .5em 1.5em 0em 1.5em;
|
||||
text-align: center;
|
||||
justify-content: space-between;
|
||||
color: $fallback--lightFg;
|
||||
color: var(--lightFg, $fallback--lightFg);
|
||||
|
||||
&.clickable {
|
||||
.user-count {
|
||||
cursor: pointer;
|
||||
|
||||
&:hover:not(.selected) {
|
||||
transition: border-bottom 100ms;
|
||||
border-bottom: 3px solid $fallback--link;
|
||||
border-bottom: 3px solid var(--link, $fallback--link);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.user-count {
|
||||
flex: 1;
|
||||
padding: .5em 0 .5em 0;
|
||||
margin: 0 .5em;
|
||||
|
||||
&.selected {
|
||||
transition: none;
|
||||
border-bottom: 5px solid $fallback--link;
|
||||
border-bottom: 5px solid var(--link, $fallback--link);
|
||||
border-radius: $fallback--btnRadius;
|
||||
border-radius: var(--btnRadius, $fallback--btnRadius);
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size:1em;
|
||||
@ -256,7 +274,8 @@
|
||||
}
|
||||
|
||||
.dailyAvg {
|
||||
font-size: 0.8em;
|
||||
opacity: 0.5;
|
||||
margin-left: 1em;
|
||||
font-size: 0.7em;
|
||||
color: #CCC;
|
||||
}
|
||||
</style>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="user" class="user-profile panel panel-default">
|
||||
<user-card-content :user="user" :switcher="true"></user-card-content>
|
||||
<user-card-content :user="user" :switcher="true" :selected="timeline.viewing"></user-card-content>
|
||||
</div>
|
||||
<Timeline :title="$t('user_profile.timeline_title')" :timeline="timeline" :timeline-name="'user'" :user-id="userId"/>
|
||||
</div>
|
||||
|
@ -8,8 +8,15 @@ const UserSettings = {
|
||||
followList: null,
|
||||
followImportError: false,
|
||||
followsImported: false,
|
||||
enableFollowsExport: true,
|
||||
uploading: [ false, false, false, false ],
|
||||
previews: [ null, null, null ]
|
||||
previews: [ null, null, null ],
|
||||
deletingAccount: false,
|
||||
deleteAccountConfirmPasswordInput: '',
|
||||
deleteAccountError: false,
|
||||
changePasswordInputs: [ '', '', '' ],
|
||||
changedPassword: false,
|
||||
changePasswordError: false
|
||||
}
|
||||
},
|
||||
components: {
|
||||
@ -137,6 +144,37 @@ const UserSettings = {
|
||||
this.uploading[3] = false
|
||||
})
|
||||
},
|
||||
/* This function takes an Array of Users
|
||||
* and outputs a file with all the addresses for the user to download
|
||||
*/
|
||||
exportPeople (users, filename) {
|
||||
// Get all the friends addresses
|
||||
var UserAddresses = users.map(function (user) {
|
||||
// check is it's a local user
|
||||
if (user && user.is_local) {
|
||||
// append the instance address
|
||||
// eslint-disable-next-line no-undef
|
||||
user.screen_name += '@' + location.hostname
|
||||
}
|
||||
return user.screen_name
|
||||
}).join('\n')
|
||||
// Make the user download the file
|
||||
var fileToDownload = document.createElement('a')
|
||||
fileToDownload.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(UserAddresses))
|
||||
fileToDownload.setAttribute('download', filename)
|
||||
fileToDownload.style.display = 'none'
|
||||
document.body.appendChild(fileToDownload)
|
||||
fileToDownload.click()
|
||||
document.body.removeChild(fileToDownload)
|
||||
},
|
||||
exportFollows () {
|
||||
this.enableFollowsExport = false
|
||||
this.$store.state.api.backendInteractor
|
||||
.fetchFriends({id: this.$store.state.users.currentUser.id})
|
||||
.then((friendList) => {
|
||||
this.exportPeople(friendList, 'friends.csv')
|
||||
})
|
||||
},
|
||||
followListChange () {
|
||||
// eslint-disable-next-line no-undef
|
||||
let formData = new FormData()
|
||||
@ -146,6 +184,37 @@ const UserSettings = {
|
||||
dismissImported () {
|
||||
this.followsImported = false
|
||||
this.followImportError = false
|
||||
},
|
||||
confirmDelete () {
|
||||
this.deletingAccount = true
|
||||
},
|
||||
deleteAccount () {
|
||||
this.$store.state.api.backendInteractor.deleteAccount({password: this.deleteAccountConfirmPasswordInput})
|
||||
.then((res) => {
|
||||
if (res.status === 'success') {
|
||||
this.$store.dispatch('logout')
|
||||
this.$router.push('/main/all')
|
||||
} else {
|
||||
this.deleteAccountError = res.error
|
||||
}
|
||||
})
|
||||
},
|
||||
changePassword () {
|
||||
const params = {
|
||||
password: this.changePasswordInputs[0],
|
||||
newPassword: this.changePasswordInputs[1],
|
||||
newPasswordConfirmation: this.changePasswordInputs[2]
|
||||
}
|
||||
this.$store.state.api.backendInteractor.changePassword(params)
|
||||
.then((res) => {
|
||||
if (res.status === 'success') {
|
||||
this.changedPassword = true
|
||||
this.changePasswordError = false
|
||||
} else {
|
||||
this.changedPassword = false
|
||||
this.changePasswordError = res.error
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -49,6 +49,25 @@
|
||||
<i class=" icon-spin4 animate-spin uploading" v-if="uploading[2]"></i>
|
||||
<button class="btn btn-default" v-else-if="previews[2]" @click="submitBg">{{$t('general.submit')}}</button>
|
||||
</div>
|
||||
<div class="setting-item">
|
||||
<h3>{{$t('settings.change_password')}}</h3>
|
||||
<div>
|
||||
<p>{{$t('settings.current_password')}}</p>
|
||||
<input type="password" v-model="changePasswordInputs[0]">
|
||||
</div>
|
||||
<div>
|
||||
<p>{{$t('settings.new_password')}}</p>
|
||||
<input type="password" v-model="changePasswordInputs[1]">
|
||||
</div>
|
||||
<div>
|
||||
<p>{{$t('settings.confirm_new_password')}}</p>
|
||||
<input type="password" v-model="changePasswordInputs[2]">
|
||||
</div>
|
||||
<button class="btn btn-default" @click="changePassword">{{$t('general.submit')}}</button>
|
||||
<p v-if="changedPassword">{{$t('settings.changed_password')}}</p>
|
||||
<p v-else-if="changePasswordError !== false">{{$t('settings.change_password_error')}}</p>
|
||||
<p v-if="changePasswordError">{{changePasswordError}}</p>
|
||||
</div>
|
||||
<div class="setting-item" v-if="pleromaBackend">
|
||||
<h3>{{$t('settings.follow_import')}}</h3>
|
||||
<p>{{$t('settings.import_followers_from_a_csv_file')}}</p>
|
||||
@ -62,10 +81,31 @@
|
||||
<p>{{$t('settings.follows_imported')}}</p>
|
||||
</div>
|
||||
<div v-else-if="followImportError">
|
||||
<i class="icon-cross" @click="dismissImported"</i>
|
||||
<i class="icon-cross" @click="dismissImported"></i>
|
||||
<p>{{$t('settings.follow_import_error')}}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="setting-item" v-if="enableFollowsExport">
|
||||
<h3>{{$t('settings.follow_export')}}</h3>
|
||||
<button class="btn btn-default" @click="exportFollows">{{$t('settings.follow_export_button')}}</button>
|
||||
</div>
|
||||
<div class="setting-item" v-else>
|
||||
<h3>{{$t('settings.follow_export_processing')}}</h3>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="setting-item">
|
||||
<h3>{{$t('settings.delete_account')}}</h3>
|
||||
<p v-if="!deletingAccount">{{$t('settings.delete_account_description')}}</p>
|
||||
<div v-if="deletingAccount">
|
||||
<p>{{$t('settings.delete_account_instructions')}}</p>
|
||||
<p>{{$t('login.password')}}</p>
|
||||
<input type="password" v-model="deleteAccountConfirmPasswordInput">
|
||||
<button class="btn btn-default" @click="deleteAccount">{{$t('settings.delete_account')}}</button>
|
||||
</div>
|
||||
<p v-if="deleteAccountError !== false">{{$t('settings.delete_account_error')}}</p>
|
||||
<p v-if="deleteAccountError">{{deleteAccountError}}</p>
|
||||
<button class="btn btn-default" v-if="!deletingAccount" @click="confirmDelete">{{$t('general.submit')}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
123
src/components/who_to_follow_panel/who_to_follow_panel.js
Normal file
123
src/components/who_to_follow_panel/who_to_follow_panel.js
Normal file
@ -0,0 +1,123 @@
|
||||
function showWhoToFollow (panel, reply, aHost, aUser) {
|
||||
var users = reply.ids
|
||||
var cn
|
||||
var index = 0
|
||||
var random = Math.floor(Math.random() * 10)
|
||||
for (cn = random; cn < users.length; cn = cn + 10) {
|
||||
var user
|
||||
user = users[cn]
|
||||
var img
|
||||
if (user.icon) {
|
||||
img = user.icon
|
||||
} else {
|
||||
img = '/images/avi.png'
|
||||
}
|
||||
var name = user.to_id
|
||||
if (index === 0) {
|
||||
panel.img1 = img
|
||||
panel.name1 = name
|
||||
panel.$store.state.api.backendInteractor.externalProfile(name)
|
||||
.then((externalUser) => {
|
||||
if (!externalUser.error) {
|
||||
panel.$store.commit('addNewUsers', [externalUser])
|
||||
panel.id1 = externalUser.id
|
||||
}
|
||||
})
|
||||
} else if (index === 1) {
|
||||
panel.img2 = img
|
||||
panel.name2 = name
|
||||
panel.$store.state.api.backendInteractor.externalProfile(name)
|
||||
.then((externalUser) => {
|
||||
if (!externalUser.error) {
|
||||
panel.$store.commit('addNewUsers', [externalUser])
|
||||
panel.id2 = externalUser.id
|
||||
}
|
||||
})
|
||||
} else if (index === 2) {
|
||||
panel.img3 = img
|
||||
panel.name3 = name
|
||||
panel.$store.state.api.backendInteractor.externalProfile(name)
|
||||
.then((externalUser) => {
|
||||
if (!externalUser.error) {
|
||||
panel.$store.commit('addNewUsers', [externalUser])
|
||||
panel.id3 = externalUser.id
|
||||
}
|
||||
})
|
||||
}
|
||||
index = index + 1
|
||||
if (index > 2) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getWhoToFollow (panel) {
|
||||
var user = panel.$store.state.users.currentUser.screen_name
|
||||
if (user) {
|
||||
panel.name1 = 'Loading...'
|
||||
panel.name2 = 'Loading...'
|
||||
panel.name3 = 'Loading...'
|
||||
var host = window.location.hostname
|
||||
var whoToFollowProvider = panel.$store.state.config.whoToFollowProvider
|
||||
var url
|
||||
url = whoToFollowProvider.replace(/{{host}}/g, encodeURIComponent(host))
|
||||
url = url.replace(/{{user}}/g, encodeURIComponent(user))
|
||||
window.fetch(url, {mode: 'cors'}).then(function (response) {
|
||||
if (response.ok) {
|
||||
return response.json()
|
||||
} else {
|
||||
panel.name1 = ''
|
||||
panel.name2 = ''
|
||||
panel.name3 = ''
|
||||
}
|
||||
}).then(function (reply) {
|
||||
showWhoToFollow(panel, reply, host, user)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const WhoToFollowPanel = {
|
||||
data: () => ({
|
||||
img1: '/images/avi.png',
|
||||
name1: '',
|
||||
id1: 0,
|
||||
img2: '/images/avi.png',
|
||||
name2: '',
|
||||
id2: 0,
|
||||
img3: '/images/avi.png',
|
||||
name3: '',
|
||||
id3: 0
|
||||
}),
|
||||
computed: {
|
||||
user: function () {
|
||||
return this.$store.state.users.currentUser.screen_name
|
||||
},
|
||||
moreUrl: function () {
|
||||
var host = window.location.hostname
|
||||
var user = this.user
|
||||
var whoToFollowLink = this.$store.state.config.whoToFollowLink
|
||||
var url
|
||||
url = whoToFollowLink.replace(/{{host}}/g, encodeURIComponent(host))
|
||||
url = url.replace(/{{user}}/g, encodeURIComponent(user))
|
||||
return url
|
||||
},
|
||||
showWhoToFollowPanel () {
|
||||
return this.$store.state.config.showWhoToFollowPanel
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
user: function (user, oldUser) {
|
||||
if (this.showWhoToFollowPanel) {
|
||||
getWhoToFollow(this)
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted:
|
||||
function () {
|
||||
if (this.showWhoToFollowPanel) {
|
||||
getWhoToFollow(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default WhoToFollowPanel
|
37
src/components/who_to_follow_panel/who_to_follow_panel.vue
Normal file
37
src/components/who_to_follow_panel/who_to_follow_panel.vue
Normal file
@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<div class="who-to-follow-panel">
|
||||
<div class="panel panel-default base01-background">
|
||||
<div class="panel-heading timeline-heading base02-background base04">
|
||||
<div class="title">
|
||||
Who to follow
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-body who-to-follow">
|
||||
<p>
|
||||
<img v-bind:src="img1"/> <router-link :to="{ name: 'user-profile', params: { id: id1 } }">{{ name1 }}</router-link><br>
|
||||
<img v-bind:src="img2"/> <router-link :to="{ name: 'user-profile', params: { id: id2 } }">{{ name2 }}</router-link><br>
|
||||
<img v-bind:src="img3"/> <router-link :to="{ name: 'user-profile', params: { id: id3 } }">{{ name3 }}</router-link><br>
|
||||
<img v-bind:src="$store.state.config.logo"> <a v-bind:href="moreUrl" target="_blank">More</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script src="./who_to_follow_panel.js" ></script>
|
||||
|
||||
<style lang="scss">
|
||||
.who-to-follow * {
|
||||
vertical-align: middle;
|
||||
}
|
||||
.who-to-follow img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
.who-to-follow p {
|
||||
line-height: 40px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
</style>
|
@ -270,6 +270,7 @@ const en = {
|
||||
cOrange: 'Orange (Favorite)',
|
||||
cGreen: 'Green (Retweet)',
|
||||
btnRadius: 'Buttons',
|
||||
inputRadius: 'Input fields',
|
||||
panelRadius: 'Panels',
|
||||
avatarRadius: 'Avatars',
|
||||
avatarAltRadius: 'Avatars (Notifications)',
|
||||
@ -288,7 +289,20 @@ const en = {
|
||||
follow_import: 'Follow import',
|
||||
import_followers_from_a_csv_file: 'Import follows from a csv file',
|
||||
follows_imported: 'Follows imported! Processing them will take a while.',
|
||||
follow_import_error: 'Error importing followers'
|
||||
follow_import_error: 'Error importing followers',
|
||||
delete_account: 'Delete Account',
|
||||
delete_account_description: 'Permanently delete your account and all your messages.',
|
||||
delete_account_instructions: 'Type your password in the input below to confirm account deletion.',
|
||||
delete_account_error: 'There was an issue deleting your account. If this persists please contact your instance administrator.',
|
||||
follow_export: 'Follow export',
|
||||
follow_export_processing: 'Processing, you\'ll soon be asked to download your file',
|
||||
follow_export_button: 'Export your follows to a csv file',
|
||||
change_password: 'Change Password',
|
||||
current_password: 'Current password',
|
||||
new_password: 'New password',
|
||||
confirm_new_password: 'Confirm new password',
|
||||
changed_password: 'Password changed successfully!',
|
||||
change_password_error: 'There was an issue changing your password.'
|
||||
},
|
||||
notifications: {
|
||||
notifications: 'Notifications',
|
||||
@ -313,6 +327,7 @@ const en = {
|
||||
},
|
||||
post_status: {
|
||||
posting: 'Posting',
|
||||
content_warning: 'Content warning (optional)',
|
||||
default: 'Just landed in L.A.'
|
||||
},
|
||||
finder: {
|
||||
@ -830,8 +845,8 @@ const fr = {
|
||||
blocked: 'Bloqué',
|
||||
block: 'Bloquer',
|
||||
statuses: 'Statuts',
|
||||
mute: 'Mettre en muet',
|
||||
muted: 'Mis en muet',
|
||||
mute: 'Masquer',
|
||||
muted: 'Masqué',
|
||||
followers: 'Vous suivent',
|
||||
followees: 'Suivis',
|
||||
per_day: 'par jour',
|
||||
@ -839,7 +854,7 @@ const fr = {
|
||||
},
|
||||
timeline: {
|
||||
show_new: 'Afficher plus',
|
||||
error_fetching: 'Erreur en cherchant des mises à jours',
|
||||
error_fetching: 'Erreur en cherchant les mises à jour',
|
||||
up_to_date: 'À jour',
|
||||
load_older: 'Afficher plus',
|
||||
conversation: 'Conversation',
|
||||
@ -850,32 +865,32 @@ const fr = {
|
||||
user_settings: 'Paramètres utilisateur',
|
||||
name_bio: 'Nom & Bio',
|
||||
name: 'Nom',
|
||||
bio: 'Bioraphie',
|
||||
bio: 'Biographie',
|
||||
avatar: 'Avatar',
|
||||
current_avatar: 'Votre avatar',
|
||||
current_avatar: 'Avatar actuel',
|
||||
set_new_avatar: 'Changer d\'avatar',
|
||||
profile_banner: 'Bannière du profil',
|
||||
current_profile_banner: 'Bannière du profil',
|
||||
profile_banner: 'Bannière de profil',
|
||||
current_profile_banner: 'Bannière de profil actuelle',
|
||||
set_new_profile_banner: 'Changer de bannière',
|
||||
profile_background: 'Image de fond',
|
||||
set_new_profile_background: 'Changer d\'image de fond',
|
||||
settings: 'Paramètres',
|
||||
theme: 'Thème',
|
||||
filtering: 'Filtre',
|
||||
filtering_explanation: 'Tout les statuts contenant ces mots vont être cachés, un mot par ligne.',
|
||||
filtering_explanation: 'Tout les statuts contenant ces mots seront masqués. Un mot par ligne.',
|
||||
attachments: 'Pièces jointes',
|
||||
hide_attachments_in_tl: 'Cacher les pièces jointes dans le journal',
|
||||
hide_attachments_in_convo: 'Cacher les pièces jointes dans les conversations',
|
||||
nsfw_clickthrough: 'Activer le clic pour afficher les images marquées comme contenu adulte ou sensible',
|
||||
autoload: 'Activer le chargement automatique une fois le bas de la page atteint',
|
||||
reply_link_preview: 'Activer un aperçu d\'une réponse sur passage de la souris',
|
||||
hide_attachments_in_tl: 'Masquer les pièces jointes dans le journal',
|
||||
hide_attachments_in_convo: 'Masquer les pièces jointes dans les conversations',
|
||||
nsfw_clickthrough: 'Masquer les images marquées comme contenu adulte ou sensible',
|
||||
autoload: 'Charger la suite automatiquement une fois le bas de la page atteint',
|
||||
reply_link_preview: 'Afficher un aperçu lors du survol de liens vers une réponse',
|
||||
presets: 'Thèmes prédéfinis',
|
||||
theme_help: 'Utilisez les codes de couleur hexadécimaux (#aabbcc) pour customiser les couleurs de votre thème.',
|
||||
theme_help: 'Spécifiez des codes couleur hexadécimaux (#aabbcc) pour personnaliser les couleurs du thème',
|
||||
background: 'Arrière plan',
|
||||
foreground: 'Premier plan',
|
||||
text: 'Texte',
|
||||
links: 'Liens',
|
||||
streaming: 'Active le défilement automatique de nouveaux statuts lorsqu\'on est au haut de la page',
|
||||
streaming: 'Charger automatiquement les nouveaux statuts lorsque vous êtes au haut de la page',
|
||||
follow_import: 'Importer ses abonnements',
|
||||
import_followers_from_a_csv_file: 'Importer ses abonnements depuis un fichier csv',
|
||||
follows_imported: 'Abonnements importés ! Le traitement peut prendre un moment.',
|
||||
@ -886,33 +901,34 @@ const fr = {
|
||||
cGreen: 'Vert (Partager)',
|
||||
btnRadius: 'Boutons',
|
||||
panelRadius: 'Fenêtres',
|
||||
inputRadius: 'Champs de texte',
|
||||
avatarRadius: 'Avatars',
|
||||
avatarAltRadius: 'Avatars (Notifications)',
|
||||
tooltipRadius: 'Info-bulles/alertes ',
|
||||
attachmentRadius: 'Pièces jointes',
|
||||
radii_help: 'Mettre en place l\'arondissement des coins de l\'interface (en pixels)',
|
||||
stop_gifs: 'Passer la souris sur un GIF pour l\'animer'
|
||||
radii_help: 'Vous pouvez ici choisir le niveau d\'arrondi des angles de l\'interface (en pixels)',
|
||||
stop_gifs: 'N\'animer les GIFS que lors du survol du curseur de la souris'
|
||||
},
|
||||
notifications: {
|
||||
notifications: 'Notifications',
|
||||
read: 'Lu !',
|
||||
followed_you: 'vous a suivi',
|
||||
followed_you: 'a commencé à vous suivre',
|
||||
favorited_you: 'a aimé votre statut',
|
||||
repeated_you: 'a partagé votre statut'
|
||||
},
|
||||
login: {
|
||||
login: 'Connexion',
|
||||
username: 'Nom d\'utilisateur',
|
||||
username: 'Identifiant',
|
||||
password: 'Mot de passe',
|
||||
register: 'S\'inscrire',
|
||||
logout: 'Déconnexion'
|
||||
},
|
||||
registration: {
|
||||
registration: 'Inscription',
|
||||
fullname: 'Nom affiché',
|
||||
fullname: 'Pseudonyme',
|
||||
email: 'Adresse email',
|
||||
bio: 'Biographie',
|
||||
password_confirm: 'Confirmez le mot de passe'
|
||||
password_confirm: 'Confirmation du mot de passe'
|
||||
},
|
||||
post_status: {
|
||||
posting: 'Envoi en cours',
|
||||
@ -920,7 +936,7 @@ const fr = {
|
||||
},
|
||||
finder: {
|
||||
find_user: 'Chercher un utilisateur',
|
||||
error_fetching_user: 'Une erreur est survenue lors de la recherche de l\'utilisateur'
|
||||
error_fetching_user: 'Erreur lors de la recherche de l\'utilisateur'
|
||||
},
|
||||
general: {
|
||||
submit: 'Envoyer',
|
||||
@ -1017,7 +1033,7 @@ const oc = {
|
||||
timeline: {
|
||||
show_new: 'Ne veire mai',
|
||||
error_fetching: 'Error en cercant de mesas a jorn',
|
||||
up_to_date: 'Actualizat',
|
||||
up_to_date: 'A jorn',
|
||||
load_older: 'Ne veire mai',
|
||||
conversation: 'Conversacion',
|
||||
collapse: 'Tampar',
|
||||
@ -1049,6 +1065,7 @@ const oc = {
|
||||
cRed: 'Roge (Anullar)',
|
||||
cOrange: 'Irange (Metre en favorit)',
|
||||
cGreen: 'Verd (Repartajar)',
|
||||
inputRadius: 'Camps tèxte',
|
||||
btnRadius: 'Botons',
|
||||
panelRadius: 'Panèls',
|
||||
avatarRadius: 'Avatars',
|
||||
@ -1104,7 +1121,7 @@ const oc = {
|
||||
apply: 'Aplicar'
|
||||
},
|
||||
user_profile: {
|
||||
timeline_title: 'Flux a l’utilizaire'
|
||||
timeline_title: 'Flux utilizaire'
|
||||
}
|
||||
}
|
||||
|
||||
@ -1169,13 +1186,14 @@ const pl = {
|
||||
cOrange: 'Pomarańczowy (ulubione)',
|
||||
cGreen: 'Zielony (powtórzenia)',
|
||||
btnRadius: 'Przyciski',
|
||||
inputRadius: 'Pola tekstowe',
|
||||
panelRadius: 'Panele',
|
||||
avatarRadius: 'Awatary',
|
||||
avatarAltRadius: 'Awatary (powiadomienia)',
|
||||
tooltipRadius: 'Etykiety/alerty',
|
||||
attachmentRadius: 'Załączniki',
|
||||
filtering: 'Filtrowanie',
|
||||
filtering_explanation: 'Wszystkie statusy zawierające te słowa będą wyciszone. Jedno słowo na linijkę',
|
||||
filtering_explanation: 'Wszystkie statusy zawierające te słowa będą wyciszone. Jedno słowo na linijkę.',
|
||||
attachments: 'Załączniki',
|
||||
hide_attachments_in_tl: 'Ukryj załączniki w osi czasu',
|
||||
hide_attachments_in_convo: 'Ukryj załączniki w rozmowach',
|
||||
@ -1187,7 +1205,20 @@ const pl = {
|
||||
follow_import: 'Import obserwowanych',
|
||||
import_followers_from_a_csv_file: 'Importuj obserwowanych z pliku CSV',
|
||||
follows_imported: 'Obserwowani zaimportowani! Przetwarzanie może trochę potrwać.',
|
||||
follow_import_error: 'Błąd przy importowaniu obserwowanych'
|
||||
follow_import_error: 'Błąd przy importowaniu obserwowanych',
|
||||
delete_account: 'Usuń konto',
|
||||
delete_account_description: 'Trwale usuń konto i wszystkie posty.',
|
||||
delete_account_instructions: 'Wprowadź swoje hasło w poniższe pole aby potwierdzić usunięcie konta.',
|
||||
delete_account_error: 'Wystąpił problem z usuwaniem twojego konta. Jeżeli problem powtarza się, poinformuj administratora swojej instancji.',
|
||||
follow_export: 'Eksport obserwowanych',
|
||||
follow_export_processing: 'Przetwarzanie, wkrótce twój plik zacznie się ściągać.',
|
||||
follow_export_button: 'Eksportuj swoją listę obserwowanych do pliku CSV',
|
||||
change_password: 'Zmień hasło',
|
||||
current_password: 'Obecne hasło',
|
||||
new_password: 'Nowe hasło',
|
||||
confirm_new_password: 'Potwierdź nowe hasło',
|
||||
changed_password: 'Hasło zmienione poprawnie!',
|
||||
change_password_error: 'Podczas zmiany hasła wystąpił problem.'
|
||||
},
|
||||
notifications: {
|
||||
notifications: 'Powiadomienia',
|
||||
@ -1505,6 +1536,7 @@ const ru = {
|
||||
cOrange: 'Нравится',
|
||||
cGreen: 'Повторить',
|
||||
btnRadius: 'Кнопки',
|
||||
inputRadius: 'Поля ввода',
|
||||
panelRadius: 'Панели',
|
||||
avatarRadius: 'Аватары',
|
||||
avatarAltRadius: 'Аватары в уведомлениях',
|
||||
@ -1681,6 +1713,139 @@ const nb = {
|
||||
}
|
||||
}
|
||||
|
||||
const he = {
|
||||
chat: {
|
||||
title: 'צ\'אט'
|
||||
},
|
||||
nav: {
|
||||
chat: 'צ\'אט מקומי',
|
||||
timeline: 'ציר הזמן',
|
||||
mentions: 'אזכורים',
|
||||
public_tl: 'ציר הזמן הציבורי',
|
||||
twkn: 'כל הרשת הידועה'
|
||||
},
|
||||
user_card: {
|
||||
follows_you: 'עוקב אחריך!',
|
||||
following: 'עוקב!',
|
||||
follow: 'עקוב',
|
||||
blocked: 'חסום!',
|
||||
block: 'חסימה',
|
||||
statuses: 'סטטוסים',
|
||||
mute: 'השתק',
|
||||
muted: 'מושתק',
|
||||
followers: 'עוקבים',
|
||||
followees: 'נעקבים',
|
||||
per_day: 'ליום',
|
||||
remote_follow: 'עקיבה מרחוק'
|
||||
},
|
||||
timeline: {
|
||||
show_new: 'הראה חדש',
|
||||
error_fetching: 'שגיאה בהבאת הודעות',
|
||||
up_to_date: 'עדכני',
|
||||
load_older: 'טען סטטוסים חדשים',
|
||||
conversation: 'שיחה',
|
||||
collapse: 'מוטט',
|
||||
repeated: 'חזר'
|
||||
},
|
||||
settings: {
|
||||
user_settings: 'הגדרות משתמש',
|
||||
name_bio: 'שם ואודות',
|
||||
name: 'שם',
|
||||
bio: 'אודות',
|
||||
avatar: 'תמונת פרופיל',
|
||||
current_avatar: 'תמונת הפרופיל הנוכחית שלך',
|
||||
set_new_avatar: 'קבע תמונת פרופיל חדשה',
|
||||
profile_banner: 'כרזת הפרופיל',
|
||||
current_profile_banner: 'כרזת הפרופיל הנוכחית שלך',
|
||||
set_new_profile_banner: 'קבע כרזת פרופיל חדשה',
|
||||
profile_background: 'רקע הפרופיל',
|
||||
set_new_profile_background: 'קבע רקע פרופיל חדש',
|
||||
settings: 'הגדרות',
|
||||
theme: 'תמה',
|
||||
presets: 'ערכים קבועים מראש',
|
||||
theme_help: 'השתמש בקודי צבע הקס (#אדום-אדום-ירוק-ירוק-כחול-כחול) על מנת להתאים אישית את תמת הצבע שלך.',
|
||||
radii_help: 'קבע מראש עיגול פינות לממשק (בפיקסלים)',
|
||||
background: 'רקע',
|
||||
foreground: 'חזית',
|
||||
text: 'טקסט',
|
||||
links: 'לינקים',
|
||||
cBlue: 'כחול (תגובה, עקיבה)',
|
||||
cRed: 'אדום (ביטול)',
|
||||
cOrange: 'כתום (לייק)',
|
||||
cGreen: 'ירוק (חזרה)',
|
||||
btnRadius: 'כפתורים',
|
||||
inputRadius: 'שדות קלט',
|
||||
panelRadius: 'פאנלים',
|
||||
avatarRadius: 'תמונות פרופיל',
|
||||
avatarAltRadius: 'תמונות פרופיל (התראות)',
|
||||
tooltipRadius: 'טולטיפ \\ התראות',
|
||||
attachmentRadius: 'צירופים',
|
||||
filtering: 'סינון',
|
||||
filtering_explanation: 'כל הסטטוסים הכוללים את המילים הללו יושתקו, אחד לשורה',
|
||||
attachments: 'צירופים',
|
||||
hide_attachments_in_tl: 'החבא צירופים בציר הזמן',
|
||||
hide_attachments_in_convo: 'החבא צירופים בשיחות',
|
||||
nsfw_clickthrough: 'החל החבאת צירופים לא בטוחים לצפיה בעת עבודה בעזרת לחיצת עכבר',
|
||||
stop_gifs: 'נגן-בעת-ריחוף GIFs',
|
||||
autoload: 'החל טעינה אוטומטית בגלילה לתחתית הדף',
|
||||
streaming: 'החל זרימת הודעות אוטומטית בעת גלילה למעלה הדף',
|
||||
reply_link_preview: 'החל תצוגה מקדימה של לינק-תגובה בעת ריחוף עם העכבר',
|
||||
follow_import: 'יבוא עקיבות',
|
||||
import_followers_from_a_csv_file: 'ייבא את הנעקבים שלך מקובץ csv',
|
||||
follows_imported: 'נעקבים יובאו! ייקח זמן מה לעבד אותם.',
|
||||
follow_import_error: 'שגיאה בייבוא נעקבים.',
|
||||
delete_account: 'מחק משתמש',
|
||||
delete_account_description: 'מחק לצמיתות את המשתמש שלך ואת כל הודעותיך.',
|
||||
delete_account_instructions: 'הכנס את סיסמתך בקלט למטה על מנת לאשר מחיקת משתמש.',
|
||||
delete_account_error: 'הייתה בעיה במחיקת המשתמש. אם זה ממשיך, אנא עדכן את מנהל השרת שלך.',
|
||||
follow_export: 'יצוא עקיבות',
|
||||
follow_export_processing: 'טוען. בקרוב תתבקש להוריד את הקובץ את הקובץ שלך',
|
||||
follow_export_button: 'ייצא את הנעקבים שלך לקובץ csv',
|
||||
change_password: 'שנה סיסמה',
|
||||
current_password: 'סיסמה נוכחית',
|
||||
new_password: 'סיסמה חדשה',
|
||||
confirm_new_password: 'אשר סיסמה',
|
||||
changed_password: 'סיסמה שונתה בהצלחה!',
|
||||
change_password_error: 'הייתה בעיה בשינוי סיסמתך.'
|
||||
},
|
||||
notifications: {
|
||||
notifications: 'התראות',
|
||||
read: 'קרא!',
|
||||
followed_you: 'עקב אחריך!',
|
||||
favorited_you: 'אהב את הסטטוס שלך',
|
||||
repeated_you: 'חזר על הסטטוס שלך'
|
||||
},
|
||||
login: {
|
||||
login: 'התחבר',
|
||||
username: 'שם המשתמש',
|
||||
password: 'סיסמה',
|
||||
register: 'הירשם',
|
||||
logout: 'התנתק'
|
||||
},
|
||||
registration: {
|
||||
registration: 'הרשמה',
|
||||
fullname: 'שם תצוגה',
|
||||
email: 'אימייל',
|
||||
bio: 'אודות',
|
||||
password_confirm: 'אישור סיסמה'
|
||||
},
|
||||
post_status: {
|
||||
posting: 'מפרסם',
|
||||
default: 'הרגע נחת ב-ל.א.'
|
||||
},
|
||||
finder: {
|
||||
find_user: 'מציאת משתמש',
|
||||
error_fetching_user: 'שגיאה במציאת משתמש'
|
||||
},
|
||||
general: {
|
||||
submit: 'שלח',
|
||||
apply: 'החל'
|
||||
},
|
||||
user_profile: {
|
||||
timeline_title: 'ציר זמן המשתמש'
|
||||
}
|
||||
}
|
||||
|
||||
const messages = {
|
||||
de,
|
||||
fi,
|
||||
@ -1697,7 +1862,8 @@ const messages = {
|
||||
es,
|
||||
pt,
|
||||
ru,
|
||||
nb
|
||||
nb,
|
||||
he
|
||||
}
|
||||
|
||||
export default messages
|
||||
|
@ -88,11 +88,15 @@ window.fetch('/api/statusnet/config.json')
|
||||
window.fetch('/static/config.json')
|
||||
.then((res) => res.json())
|
||||
.then((data) => {
|
||||
const {theme, background, logo, showInstanceSpecificPanel} = data
|
||||
const {theme, background, logo, showWhoToFollowPanel, whoToFollowProvider, whoToFollowLink, showInstanceSpecificPanel, scopeOptionsEnabled} = data
|
||||
store.dispatch('setOption', { name: 'theme', value: theme })
|
||||
store.dispatch('setOption', { name: 'background', value: background })
|
||||
store.dispatch('setOption', { name: 'logo', value: logo })
|
||||
store.dispatch('setOption', { name: 'showWhoToFollowPanel', value: showWhoToFollowPanel })
|
||||
store.dispatch('setOption', { name: 'whoToFollowProvider', value: whoToFollowProvider })
|
||||
store.dispatch('setOption', { name: 'whoToFollowLink', value: whoToFollowLink })
|
||||
store.dispatch('setOption', { name: 'showInstanceSpecificPanel', value: showInstanceSpecificPanel })
|
||||
store.dispatch('setOption', { name: 'scopeOptionsEnabled', value: scopeOptionsEnabled })
|
||||
if (data['chatDisabled']) {
|
||||
store.dispatch('disableChat')
|
||||
}
|
||||
|
@ -30,6 +30,8 @@ const BLOCKING_URL = '/api/blocks/create.json'
|
||||
const UNBLOCKING_URL = '/api/blocks/destroy.json'
|
||||
const USER_URL = '/api/users/show.json'
|
||||
const FOLLOW_IMPORT_URL = '/api/pleroma/follow_import'
|
||||
const DELETE_ACCOUNT_URL = '/api/pleroma/delete_account'
|
||||
const CHANGE_PASSWORD_URL = '/api/pleroma/change_password'
|
||||
|
||||
import { each, map } from 'lodash'
|
||||
import 'whatwg-fetch'
|
||||
@ -329,12 +331,14 @@ const retweet = ({ id, credentials }) => {
|
||||
})
|
||||
}
|
||||
|
||||
const postStatus = ({credentials, status, mediaIds, inReplyToStatusId}) => {
|
||||
const postStatus = ({credentials, status, spoilerText, visibility, mediaIds, inReplyToStatusId}) => {
|
||||
const idsText = mediaIds.join(',')
|
||||
const form = new FormData()
|
||||
|
||||
form.append('status', status)
|
||||
form.append('source', 'Pleroma FE')
|
||||
if (spoilerText) form.append('spoiler_text', spoilerText)
|
||||
if (visibility) form.append('visibility', visibility)
|
||||
form.append('media_ids', idsText)
|
||||
if (inReplyToStatusId) {
|
||||
form.append('in_reply_to_status_id', inReplyToStatusId)
|
||||
@ -373,6 +377,34 @@ const followImport = ({params, credentials}) => {
|
||||
.then((response) => response.ok)
|
||||
}
|
||||
|
||||
const deleteAccount = ({credentials, password}) => {
|
||||
const form = new FormData()
|
||||
|
||||
form.append('password', password)
|
||||
|
||||
return fetch(DELETE_ACCOUNT_URL, {
|
||||
body: form,
|
||||
method: 'POST',
|
||||
headers: authHeaders(credentials)
|
||||
})
|
||||
.then((response) => response.json())
|
||||
}
|
||||
|
||||
const changePassword = ({credentials, password, newPassword, newPasswordConfirmation}) => {
|
||||
const form = new FormData()
|
||||
|
||||
form.append('password', password)
|
||||
form.append('new_password', newPassword)
|
||||
form.append('new_password_confirmation', newPasswordConfirmation)
|
||||
|
||||
return fetch(CHANGE_PASSWORD_URL, {
|
||||
body: form,
|
||||
method: 'POST',
|
||||
headers: authHeaders(credentials)
|
||||
})
|
||||
.then((response) => response.json())
|
||||
}
|
||||
|
||||
const fetchMutes = ({credentials}) => {
|
||||
const url = '/api/qvitter/mutes.json'
|
||||
|
||||
@ -408,7 +440,9 @@ const apiService = {
|
||||
updateProfile,
|
||||
updateBanner,
|
||||
externalProfile,
|
||||
followImport
|
||||
followImport,
|
||||
deleteAccount,
|
||||
changePassword
|
||||
}
|
||||
|
||||
export default apiService
|
||||
|
@ -61,6 +61,9 @@ const backendInteractorService = (credentials) => {
|
||||
const externalProfile = (profileUrl) => apiService.externalProfile({profileUrl, credentials})
|
||||
const followImport = ({params}) => apiService.followImport({params, credentials})
|
||||
|
||||
const deleteAccount = ({password}) => apiService.deleteAccount({credentials, password})
|
||||
const changePassword = ({password, newPassword, newPasswordConfirmation}) => apiService.changePassword({credentials, password, newPassword, newPasswordConfirmation})
|
||||
|
||||
const backendInteractorServiceInstance = {
|
||||
fetchStatus,
|
||||
fetchConversation,
|
||||
@ -82,7 +85,9 @@ const backendInteractorService = (credentials) => {
|
||||
updateBanner,
|
||||
updateProfile,
|
||||
externalProfile,
|
||||
followImport
|
||||
followImport,
|
||||
deleteAccount,
|
||||
changePassword
|
||||
}
|
||||
|
||||
return backendInteractorServiceInstance
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { map } from 'lodash'
|
||||
import apiService from '../api/api.service.js'
|
||||
|
||||
const postStatus = ({ store, status, media = [], inReplyToStatusId = undefined }) => {
|
||||
const postStatus = ({ store, status, spoilerText, visibility, media = [], inReplyToStatusId = undefined }) => {
|
||||
const mediaIds = map(media, 'id')
|
||||
|
||||
return apiService.postStatus({credentials: store.state.users.currentUser.credentials, status, mediaIds, inReplyToStatusId})
|
||||
return apiService.postStatus({credentials: store.state.users.currentUser.credentials, status, spoilerText, visibility, mediaIds, inReplyToStatusId})
|
||||
.then((data) => data.json())
|
||||
.then((data) => {
|
||||
if (!data.error) {
|
||||
|
@ -71,13 +71,11 @@ const setColors = (col, commit) => {
|
||||
colors.bg = rgb2hex(col.bg.r, col.bg.g, col.bg.b) // background
|
||||
colors.lightBg = rgb2hex((col.bg.r + col.fg.r) / 2, (col.bg.g + col.fg.g) / 2, (col.bg.b + col.fg.b) / 2) // hilighted bg
|
||||
colors.btn = rgb2hex(col.fg.r, col.fg.g, col.fg.b) // panels & buttons
|
||||
colors.input = `rgba(${col.fg.r}, ${col.fg.g}, ${col.fg.b}, .5)`
|
||||
colors.border = rgb2hex(col.fg.r - mod, col.fg.g - mod, col.fg.b - mod) // borders
|
||||
colors.faint = rgb2hex(
|
||||
col.text.r * 0.45 + col.fg.r * 0.55,
|
||||
col.text.g * 0.45 + col.fg.g * 0.55,
|
||||
col.text.b * 0.45 + col.fg.b * 0.55) // faint text
|
||||
colors.faint = `rgba(${col.text.r}, ${col.text.g}, ${col.text.b}, .5)`
|
||||
colors.fg = rgb2hex(col.text.r, col.text.g, col.text.b) // text
|
||||
colors.lightFg = rgb2hex(col.text.r - mod, col.text.g - mod, col.text.b - mod) // strong text
|
||||
colors.lightFg = rgb2hex(col.text.r - mod * 5, col.text.g - mod * 5, col.text.b - mod * 5) // strong text
|
||||
|
||||
colors['base07'] = rgb2hex(col.text.r - mod * 2, col.text.g - mod * 2, col.text.b - mod * 2)
|
||||
|
||||
@ -92,6 +90,7 @@ const setColors = (col, commit) => {
|
||||
colors.cAlertRed = col.cRed && `rgba(${col.cRed.r}, ${col.cRed.g}, ${col.cRed.b}, .5)`
|
||||
|
||||
radii.btnRadius = col.btnRadius
|
||||
radii.inputRadius = col.inputRadius
|
||||
radii.panelRadius = col.panelRadius
|
||||
radii.avatarRadius = col.avatarRadius
|
||||
radii.avatarAltRadius = col.avatarAltRadius
|
||||
|
@ -5,5 +5,11 @@
|
||||
"redirectRootNoLogin": "/main/all",
|
||||
"redirectRootLogin": "/main/friends",
|
||||
"chatDisabled": false,
|
||||
"showInstanceSpecificPanel": false
|
||||
"showWhoToFollowPanel": false,
|
||||
"whoToFollowProvider": "https://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-osa-api.cgi?{{host}}+{{user}}",
|
||||
"whoToFollowProviderDummy2": "https://followlink.osa-p.net/api/get_recommend.json?acct=@{{user}}@{{host}}",
|
||||
"whoToFollowLink": "https://vinayaka.distsn.org/?{{host}}+{{user}}",
|
||||
"whoToFollowLinkDummy2": "https://followlink.osa-p.net/recommend.html",
|
||||
"showInstanceSpecificPanel": false,
|
||||
"scopeOptionsEnabled": false
|
||||
}
|
||||
|
@ -155,6 +155,30 @@
|
||||
"css": "bell",
|
||||
"code": 59408,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "ccc2329632396dc096bb638d4b46fb98",
|
||||
"css": "mail-alt",
|
||||
"code": 61664,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "c1f1975c885aa9f3dad7810c53b82074",
|
||||
"css": "lock",
|
||||
"code": 59409,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "05376be04a27d5a46e855a233d6e8508",
|
||||
"css": "lock-open-alt",
|
||||
"code": 61758,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "197375a3cea8cb90b02d06e4ddf1433d",
|
||||
"css": "globe",
|
||||
"code": 59410,
|
||||
"src": "fontawesome"
|
||||
}
|
||||
]
|
||||
}
|
4
static/font/css/fontello-codes.css
vendored
4
static/font/css/fontello-codes.css
vendored
@ -16,11 +16,15 @@
|
||||
.icon-left-open:before { content: '\e80e'; } /* '' */
|
||||
.icon-up-open:before { content: '\e80f'; } /* '' */
|
||||
.icon-bell:before { content: '\e810'; } /* '' */
|
||||
.icon-lock:before { content: '\e811'; } /* '' */
|
||||
.icon-globe:before { content: '\e812'; } /* '' */
|
||||
.icon-spin3:before { content: '\e832'; } /* '' */
|
||||
.icon-spin4:before { content: '\e834'; } /* '' */
|
||||
.icon-link-ext:before { content: '\f08e'; } /* '' */
|
||||
.icon-menu:before { content: '\f0c9'; } /* '' */
|
||||
.icon-mail-alt:before { content: '\f0e0'; } /* '' */
|
||||
.icon-comment-empty:before { content: '\f0e5'; } /* '' */
|
||||
.icon-reply:before { content: '\f112'; } /* '' */
|
||||
.icon-lock-open-alt:before { content: '\f13e'; } /* '' */
|
||||
.icon-binoculars:before { content: '\f1e5'; } /* '' */
|
||||
.icon-user-plus:before { content: '\f234'; } /* '' */
|
16
static/font/css/fontello-embedded.css
vendored
16
static/font/css/fontello-embedded.css
vendored
File diff suppressed because one or more lines are too long
4
static/font/css/fontello-ie7-codes.css
vendored
4
static/font/css/fontello-ie7-codes.css
vendored
@ -16,11 +16,15 @@
|
||||
.icon-left-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-up-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-bell { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-globe { *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 = ' '); }
|
||||
.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-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-lock-open-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-binoculars { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-user-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
4
static/font/css/fontello-ie7.css
vendored
4
static/font/css/fontello-ie7.css
vendored
@ -27,11 +27,15 @@
|
||||
.icon-left-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-up-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-bell { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-globe { *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 = ' '); }
|
||||
.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-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-lock-open-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-binoculars { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
||||
.icon-user-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
|
18
static/font/css/fontello.css
vendored
18
static/font/css/fontello.css
vendored
@ -1,11 +1,11 @@
|
||||
@font-face {
|
||||
font-family: 'fontello';
|
||||
src: url('../font/fontello.eot?47566415');
|
||||
src: url('../font/fontello.eot?47566415#iefix') format('embedded-opentype'),
|
||||
url('../font/fontello.woff2?47566415') format('woff2'),
|
||||
url('../font/fontello.woff?47566415') format('woff'),
|
||||
url('../font/fontello.ttf?47566415') format('truetype'),
|
||||
url('../font/fontello.svg?47566415#fontello') format('svg');
|
||||
src: url('../font/fontello.eot?92801760');
|
||||
src: url('../font/fontello.eot?92801760#iefix') format('embedded-opentype'),
|
||||
url('../font/fontello.woff2?92801760') format('woff2'),
|
||||
url('../font/fontello.woff?92801760') format('woff'),
|
||||
url('../font/fontello.ttf?92801760') format('truetype'),
|
||||
url('../font/fontello.svg?92801760#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?47566415#fontello') format('svg');
|
||||
src: url('../font/fontello.svg?92801760#fontello') format('svg');
|
||||
}
|
||||
}
|
||||
*/
|
||||
@ -72,11 +72,15 @@
|
||||
.icon-left-open:before { content: '\e80e'; } /* '' */
|
||||
.icon-up-open:before { content: '\e80f'; } /* '' */
|
||||
.icon-bell:before { content: '\e810'; } /* '' */
|
||||
.icon-lock:before { content: '\e811'; } /* '' */
|
||||
.icon-globe:before { content: '\e812'; } /* '' */
|
||||
.icon-spin3:before { content: '\e832'; } /* '' */
|
||||
.icon-spin4:before { content: '\e834'; } /* '' */
|
||||
.icon-link-ext:before { content: '\f08e'; } /* '' */
|
||||
.icon-menu:before { content: '\f0c9'; } /* '' */
|
||||
.icon-mail-alt:before { content: '\f0e0'; } /* '' */
|
||||
.icon-comment-empty:before { content: '\f0e5'; } /* '' */
|
||||
.icon-reply:before { content: '\f112'; } /* '' */
|
||||
.icon-lock-open-alt:before { content: '\f13e'; } /* '' */
|
||||
.icon-binoculars:before { content: '\f1e5'; } /* '' */
|
||||
.icon-user-plus:before { content: '\f234'; } /* '' */
|
@ -229,11 +229,11 @@ body {
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'fontello';
|
||||
src: url('./font/fontello.eot?34497073');
|
||||
src: url('./font/fontello.eot?34497073#iefix') format('embedded-opentype'),
|
||||
url('./font/fontello.woff?34497073') format('woff'),
|
||||
url('./font/fontello.ttf?34497073') format('truetype'),
|
||||
url('./font/fontello.svg?34497073#fontello') format('svg');
|
||||
src: url('./font/fontello.eot?48963108');
|
||||
src: url('./font/fontello.eot?48963108#iefix') format('embedded-opentype'),
|
||||
url('./font/fontello.woff?48963108') format('woff'),
|
||||
url('./font/fontello.ttf?48963108') format('truetype'),
|
||||
url('./font/fontello.svg?48963108#fontello') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
@ -323,14 +323,20 @@ body {
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="the-icons span3" title="Code: 0xe810"><i class="demo-icon icon-bell"></i> <span class="i-name">icon-bell</span><span class="i-code">0xe810</span></div>
|
||||
<div class="the-icons span3" title="Code: 0xe811"><i class="demo-icon icon-lock"></i> <span class="i-name">icon-lock</span><span class="i-code">0xe811</span></div>
|
||||
<div class="the-icons span3" title="Code: 0xe812"><i class="demo-icon icon-globe"></i> <span class="i-name">icon-globe</span><span class="i-code">0xe812</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: 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 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>
|
||||
<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: 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: 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">
|
||||
|
Binary file not shown.
@ -40,6 +40,10 @@
|
||||
|
||||
<glyph glyph-name="bell" unicode="" d="M509-96q0 8-9 8-33 0-57 24t-23 57q0 9-9 9t-9-9q0-41 29-70t69-28q9 0 9 9z m-372 160h726q-149 168-149 465 0 28-13 58t-39 58-67 45-95 17-95-17-67-45-39-58-13-58q0-297-149-465z m827 0q0-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="lock" unicode="" d="M179 421h285v108q0 59-42 101t-101 41-101-41-41-101v-108z m464-53v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v108q0 102 74 176t176 74 177-74 73-176v-108h18q23 0 38-15t16-38z" horiz-adv-x="642.9" />
|
||||
|
||||
<glyph glyph-name="globe" unicode="" d="M429 779q116 0 215-58t156-156 57-215-57-215-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58z m153-291q-2-1-6-5t-7-6q1 0 2 3t3 6 2 4q3 4 12 8 8 4 29 7 19 5 29-6-1 1 5 7t8 7q2 1 8 3t9 4l1 12q-7-1-10 4t-3 12q0-2-4-5 0 4-2 5t-7-1-5-1q-5 2-8 5t-5 9-2 8q-1 3-5 6t-5 6q-1 1-2 3t-1 4-3 3-3 1-4-3-4-5-2-3q-2 1-4 1t-2-1-3-1-3-2q-1-2-4-2t-5-1q8 3-1 6-5 2-9 2 6 2 5 6t-5 8h3q-1 2-5 5t-10 5-7 3q-5 3-19 5t-18 1q-3-4-3-6t2-8 2-7q1-3-3-7t-3-7q0-4 7-9t6-12q-2-4-9-9t-9-6q-3-5-1-11t6-9q1-1 1-2t-2-3-3-2-4-2l-1-1q-7-3-12 3t-7 15q-4 14-9 17-13 4-16-1-3 7-23 15-14 5-33 2 4 0 0 8-4 9-10 7 1 3 2 10t0 7q2 8 7 13 1 1 4 5t5 7 1 4q19-3 28 6 2 3 6 9t6 10q5 3 8 3t8-3 8-3q8-1 8 6t-4 11q7 0 2 10-2 4-5 5-6 2-15-3-4-2 2-4-1 0-6-6t-9-10-9 3q0 0-3 7t-5 8q-5 0-9-9 1 5-6 9t-14 4q11 7-4 15-4 3-12 3t-11-2q-2-4-3-7t3-4 6-3 6-2 5-2q8-6 5-8-1 0-5-2t-6-2-4-2q-1-3 0-8t-1-8q-3 3-5 10t-4 9q4-5-14-3l-5 0q-3 0-9-1t-12-1-7 5q-3 4 0 11 0 2 2 1-2 2-6 5t-6 5q-25-8-52-23 3 0 6 1 3 1 8 4t5 3q19 7 24 4l3 2q7-9 11-14-4 3-17 1-11-3-12-7 4-6 2-10-2 2-6 6t-8 6-8 3q-9 0-13-1-81-45-131-124 4-4 7-4 2-1 3-5t1-6 6 1q5-4 2-10 1 0 25-15 10-10 11-12 2-6-5-10-1 1-5 5t-5 2q-2-3 0-10t6-7q-4 0-5-9t-2-20 0-13l1-1q-2-6 3-19t12-11q-7-1 11-24 3-4 4-5 2-1 7-4t9-6 5-5q2-3 6-13t8-13q-2-3 5-11t6-13q-1 0-2-1t-1 0q2-4 9-8t8-7q1-2 1-6t2-6 4-1q2 11-13 35-8 13-9 16-2 2-4 8t-2 8q1 0 3 0t5-2 4-3 1-1q-1-4 1-10t7-10 10-11 6-7q4-4 8-11t0-8q5 0 11-5t10-11q3-5 4-15t3-13q1-4 5-8t7-5l9-5t7-3q3-2 10-6t12-7q6-2 9-2t8 1 8 2q8 1 16-8t12-12q20-10 30-6-1 0 1-4t4-9 5-8 3-5q3-3 10-8t10-8q4 2 4 5-1-5 4-11t10-6q8 2 8 18-17-8-27 10 0 0-2 3t-2 5-1 4 0 5 2 1q5 0 6 2t-1 7-2 8q-1 4-6 11t-7 8q-3-5-9-4t-9 5q0-1-1-3t-1-4q-7 0-8 0 1 2 1 10t2 13q1 2 3 6t5 9 2 7-3 5-9 1q-11 0-15-11-1-2-2-6t-2-6-5-4q-4-2-14-1t-13 3q-8 4-13 16t-5 20q0 6 1 15t2 14-3 14q2 1 5 5t5 6q2 1 3 1t3 0 2 1 1 3q0 1-2 2-1 1-2 1 4-1 16 1t15-1q9-6 12 1 0 1-1 6t0 7q3-15 16-5 2-1 9-3t9-2q2-1 4-3t3-3 3 0 5 4q5-8 7-13 6-23 10-25 4-2 6-1t3 5 0 8-1 7l-1 5v10l0 4q-8 2-10 7t0 10 9 10q0 1 4 2t9 4 7 4q12 11 8 20 4 0 6 5 0 0-2 2t-5 2-2 2q5 2 1 8 3 2 4 7t4 5q5-6 12-1 5 5 1 9 2 4 11 6t10 5q4-1 5 1t0 7 2 7q2 2 9 5t7 2l9 7q2 2 0 2 10-1 18 6 5 6-4 11 2 4-1 5t-9 4q2 0 7 0t5 1q9 5-3 9-10 2-24-7z m-91-490q115 21 195 106-1 2-7 2t-7 2q-10 4-13 5 1 4-1 7t-5 5-7 5-6 4q-1 1-4 3t-4 3-4 2-5 2-5-1l-2-1q-2 0-3-1t-3-2-2-1 0-2q-12 10-20 13-3 0-6 3t-6 4-6 0-6-3q-3-3-4-9t-1-7q-4 3 0 10t1 10q-1 3-6 2t-6-2-7-5-5-3-4-3-5-5q-2-2-4-6t-2-6q-1 2-7 3t-5 3q1-5 2-19t3-22q4-17-7-26-15-14-16-23-2-12 7-14 0-4-5-12t-4-12q0-3 2-9z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="spin3" unicode="" d="M494 850c-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 850c-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" />
|
||||
@ -48,10 +52,14 @@
|
||||
|
||||
<glyph glyph-name="menu" unicode="" d="M857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-14-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="mail-alt" unicode="" d="M1000 454v-443q0-37-26-63t-63-27h-822q-36 0-63 27t-26 63v443q25-27 56-49 202-137 278-192 32-24 51-37t53-27 61-13h2q28 0 61 13t53 27 51 37q95 68 278 192 32 22 56 49z m0 164q0-44-27-84t-68-69q-210-146-262-181-5-4-23-17t-30-22-29-18-32-15-28-5h-2q-12 0-27 5t-32 15-30 18-30 22-23 17q-51 35-147 101t-114 80q-35 23-65 64t-31 77q0 43 23 72t66 29h822q36 0 63-26t26-63z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="comment-empty" unicode="" d="M500 636q-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="reply" unicode="" d="M1000 225q0-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="lock-open-alt" unicode="" d="M589 421q23 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="binoculars" unicode="" d="M393 671v-428q0-15-11-25t-25-11v-321q0-15-10-25t-26-11h-285q-15 0-25 11t-11 25v285l139 488q4 12 17 12h237z m178 0v-392h-142v392h142z m429-500v-285q0-15-11-25t-25-11h-285q-15 0-25 11t-11 25v321q-15 0-25 11t-11 25v428h237q13 0 17-12z m-589 661v-125h-197v125q0 8 5 13t13 5h161q8 0 13-5t5-13z m375 0v-125h-197v125q0 8 5 13t13 5h161q8 0 13-5t5-13z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="user-plus" unicode="" d="M393 350q-89 0-152 63t-62 151 62 152 152 63 151-63 63-152-63-151-151-63z m536-71h196q7 0 13-6t5-12v-107q0-8-5-13t-13-5h-196v-197q0-7-6-12t-12-6h-107q-8 0-13 6t-5 12v197h-197q-7 0-12 5t-6 13v107q0 7 6 12t12 6h197v196q0 7 5 13t13 5h107q7 0 12-5t6-13v-196z m-411-125q0-29 21-51t50-21h143v-133q-38-28-95-28h-488q-67 0-108 39t-41 106q0 30 2 58t8 61 15 60 24 55 34 45 48 30 62 11q11 0 22-10 44-34 86-51t92-17 92 17 86 51q11 10 22 10 73 0 121-54h-125q-29 0-50-21t-21-50v-107z" horiz-adv-x="1142.9" />
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 15 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user