Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85628721
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
8 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/App.js b/src/App.js
index 3823bd039a..1da3ff7cb0 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,60 +1,37 @@
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'
export default {
name: 'app',
components: {
UserPanel,
NavPanel,
Notifications,
UserFinder
},
data: () => ({
mobileActivePanel: 'timeline'
}),
computed: {
currentUser () { return this.$store.state.users.currentUser },
background () {
return this.currentUser.background_image || this.$store.state.config.background
},
logoStyle () { return { 'background-image': `url(${this.$store.state.config.logo})` } },
style () { return { 'background-image': `url(${this.background})` } },
sitename () { return this.$store.state.config.name }
},
- created () {
- // this is to detect user zooming mostly
- window.addEventListener('resize', this.fixSidebarWidth)
- },
- mounted () {
- // for some reason, at least in dev mode, dom is not ready enough at this point
- // in theory calling the function directly here should be enough, but it's not
- setTimeout(() => { this.fixSidebarWidth() }, 500)
- },
- destroyed () {
- window.removeEventListener('resize', this.fixSidebarWidth)
- },
methods: {
activatePanel (panelName) {
this.mobileActivePanel = panelName
},
scrollToTop () {
window.scrollTo(0, 0)
},
logout () {
this.$store.dispatch('logout')
- },
- fixSidebarWidth () {
- // firefox
- let barwidth = window.innerWidth - document.body.offsetWidth
- if (document.body.offsetWidth <= 0) {
- // chromium
- barwidth = window.innerWidth - document.body.scrollWidth
- }
- // adjust the sidebar size to fit the scrollbar width to keep the gap consistently sized
- document.getElementById('sidebar-container').style.width = `${345 + barwidth}px`
- document.getElementById('sidebar-container').style.paddingRight = `${barwidth}px`
}
}
}
diff --git a/src/App.scss b/src/App.scss
index c3c9013ec9..5a117f04f9 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -1,269 +1,273 @@
@import './_variables.scss';
#app {
background-size: cover;
background-attachment: fixed;
background-repeat: no-repeat;
background-position: 0 50px;
min-height: 100vh;
}
i {
user-select: none;
}
h4 {
margin: 0;
}
#content {
padding-top: 60px;
}
.text-center {
text-align: center;
}
body {
font-family: sans-serif;
font-size: 14px;
margin: 0;
}
a {
text-decoration: none;
}
button{
user-select: none;
border: none;
border-radius: 5px;
cursor: pointer;
border-top: 1px solid rgba(255, 255, 255, 0.2);
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
box-shadow: 0px 0px 2px black;
font-size: 14px;
font-family: sans-serif;
&:hover {
box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
}
&:disabled {
cursor: not-allowed;
opacity: 0.5;
}
}
.container {
display: flex;
flex-wrap: wrap;
margin: 0;
padding: 0 10px 0 10px;
}
.gaps {
margin: -1em 0 0 -1em;
}
.item {
flex: 1;
line-height: 21px;
height: 21px;
overflow: hidden;
.nav-icon {
font-size: 1.1em;
margin-left: 0.4em;
}
}
.gaps > .item {
padding: 1em 0 0 1em;
}
.auto-size {
flex: 1
}
nav {
width: 100%;
align-items: center;
position: fixed;
height: 50px;
.inner-nav {
padding-left: 20px;
padding-right: 20px;
display: flex;
align-items: center;
flex-basis: 970px;
margin: auto;
height: 50px;
background-repeat: no-repeat;
background-position: center;
background-size: contain;
}
}
main-router {
flex: 1;
}
.status.compact {
color: rgba(0, 0, 0, 0.42);
font-weight: 300;
p {
margin: 0;
font-size: 0.8em
}
}
/* Panel */
.panel {
display: flex;
flex-direction: column;
margin: 0.5em;
border-radius: 10px;
box-shadow: 1px 1px 3px rgba(0,0,0,.5);
overflow: hidden;
}
.panel-body:empty::before {
content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
display: block;
margin: 1em;
text-align: center;
}
.panel-heading {
border-radius: 10px 10px 0 0;
background-size: cover;
padding: 0.6em 1.0em;
text-align: left;
font-size: 1.3em;
line-height: 24px;
}
.panel-footer {
border-radius: 0 0 10px 10px;
}
.panel-body > p {
line-height: 18px;
padding: 1em;
margin: 0;
}
#content {
margin: auto;
max-width: 980px;
border-radius: 10px;
padding-bottom: 1em;
background-color: rgba(0,0,0,0.1);
}
.container > * {
min-width: 0px;
}
.fa {
color: grey;
}
nav {
z-index: 1000;
}
.fade-enter-active, .fade-leave-active {
transition: opacity .2s
}
.fade-enter, .fade-leave-active {
opacity: 0
}
.main {
flex-basis: 60%;
flex-grow: 1;
flex-shrink: 1;
}
-.sidebar {
+.sidebar-bounds {
flex: 0;
flex-basis: 35%;
}
.sidebar-flexer {
flex: 1;
flex-basis: 345px;
width: 365px;
}
.mobile-shown {
display: none;
}
.panel-switcher {
display: none;
width: 100%;
button {
display: block;
flex: 1;
margin: 0.5em;
padding: 0.5em;
}
}
@media all and (min-width: 960px) {
body {
overflow-y: scroll;
}
- .sidebar {
+ .sidebar-bounds {
overflow: hidden;
max-height: 100vh;
width: 345px;
position: fixed;
margin-top: -10px;
- .sidebar-container {
+ .sidebar-scroller {
height: 96vh;
width: 365px;
padding-top: 10px;
- padding-right: 20px;
+ padding-right: 50px;
overflow-x: hidden;
overflow-y: scroll;
}
+
+ .sidebar {
+ width: 345px;
+ }
}
.sidebar-flexer {
max-height: 96vh;
flex-shrink: 0;
flex-grow: 0;
}
}
@media all and (max-width: 959px) {
.mobile-hidden {
display: none;
}
.panel-switcher {
display: flex;
}
.container {
padding: 0 0 0 0;
}
.panel {
margin: 0.5em 0 0.5em 0;
}
}
.item.right {
text-align: right;
padding-right: 20px;
}
diff --git a/src/App.vue b/src/App.vue
index 59cfcaa69f..0d00466591 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,39 +1,41 @@
<template>
<div id="app" v-bind:style="style" class="base02-background">
- <nav class='container base01-background base04' @click="scrollToTop()">
+ <nav class='container base01-background base04' @click="scrollToTop()" id="nav">
<div class='inner-nav' :style="logoStyle">
<div class='item'>
<router-link :to="{ name: 'root'}">{{sitename}}</router-link>
</div>
<div class='item right'>
<user-finder class="nav-icon"></user-finder>
<router-link :to="{ name: 'settings'}"><i class="icon-cog nav-icon"></i></router-link>
<a href="#" v-if="currentUser" @click.prevent="logout"><i class="icon-logout nav-icon" :title="$t('login.logout')"></i></a>
</div>
</div>
</nav>
<div class="container" id="content">
<div class="panel-switcher">
<button @click="activatePanel('sidebar')" class="base01-background base04">Sidebar</button>
<button @click="activatePanel('timeline')" class="base01-background base04">Timeline</button>
</div>
<div class="sidebar-flexer" :class="{ 'mobile-hidden': mobileActivePanel != 'sidebar'}">
- <div class="sidebar" :class="{ 'mobile-hidden': mobileActivePanel != 'sidebar' }">
- <div class="sidebar-container" id="sidebar-container">
- <user-panel></user-panel>
- <nav-panel></nav-panel>
- <notifications v-if="currentUser"></notifications>
+ <div class="sidebar-bounds">
+ <div class="sidebar-scroller">
+ <div class="sidebar">
+ <user-panel></user-panel>
+ <nav-panel></nav-panel>
+ <notifications v-if="currentUser"></notifications>
+ </div>
</div>
</div>
</div>
<div class="main" :class="{ 'mobile-hidden': mobileActivePanel != 'timeline' }">
<transition name="fade">
<router-view></router-view>
</transition>
</div>
</div>
</div>
</template>
<script src="./App.js"></script>
<style lang="scss" src="./App.scss"></style>
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Aug 8, 1:45 PM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1723532
Default Alt Text
(8 KB)
Attached To
Mode
rPUFE pleroma-fe-upstream
Attached
Detach File
Event Timeline
Log In to Comment