- Improved/Fixed 3rd party system Links (dotlan, eveeye, anoik), closed #859

- Improved UI on `/setup` page. Info panels are collapsible now
This commit is contained in:
Mark Friedrich
2019-11-09 11:19:19 +01:00
parent 2b835716b6
commit ad0c592a3f
14 changed files with 290 additions and 134 deletions

View File

@@ -18,6 +18,9 @@ define([
// navigation
navigationElementId: 'pf-navbar', // id for navbar element
// sticky panel
stickyPanelClass: 'pf-landing-sticky-panel', // class for sticky panels
hiddenByAttributeClass: 'pf-hidden-by-attr', // class for elements that are hidden/shown by [data-attr] value
shownByAttributeClass: 'pf-shown-by-attr', // class for elements that are hidden/shown by [data-attr] value
@@ -85,10 +88,17 @@ define([
// collapse ---------------------------------------------------------------------------------------------------
setCollapseObserver(body, '[data-toggle="collapse"]');
// panel actions ----------------------------------------------------------------------------------------------
let collapsedState = false;
$('.' + config.stickyPanelClass + ' a[data-panel-action="collapse-all"]').on('click', function(e){
e.preventDefault();
$('.row.collapse').collapse(collapsedState ? 'show' : 'hide');
collapsedState = !collapsedState;
});
// buttons ----------------------------------------------------------------------------------------------------
// exclude "download" && "navigation" buttons
body.find('.btn')
.not('.navbar-fixed-bottom .btn')
.not('[data-action]')
.not('[href^="?export"]')
.on('click', function(){

View File

@@ -20,12 +20,12 @@ define([
// headline toolbar
moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head
textActionIconCopyClass: 'pf-module-icon-button-copy', // class for text action "copy"
// breadcrumb
constellationLinkClass: 'pf-system-info-constellation', // class for "constellation" name
regionLinkClass: 'pf-system-info-region', // class for "region" name
typeLinkClass: 'pf-system-info-type', // class for "type" name
urlLinkClass: 'pf-system-info-url', // class for "url" copy link
// info col/table
systemInfoSectionClass: 'pf-system-info-section', // class for system info section
@@ -193,20 +193,25 @@ define([
* @param systemData
*/
let getThirdPartySystemLinks = (pages, systemData) => {
let urls = {};
let links = [];
let isWormhole = MapUtil.getSystemTypeInfo(Util.getObjVal(systemData, 'type.id'), 'name') === 'w-space';
let systemName = Util.getObjVal(systemData, 'name') || '';
let regionName = Util.getObjVal(systemData, 'region.name') || '';
let validUrls = 0;
let setDestination = e => {
e.preventDefault();
e.stopPropagation();
Util.setDestination('set_destination', 'system', {id: systemData.systemId, name: systemData.name});
};
for(let i = 0; i < pages.length; i++){
let url = false;
let link = null;
let showInModuleHead = true;
let domain = Util.getObjVal(Init, 'url.' + pages[i]);
if(domain || pages[i] === 'eve'){
if(domain){
// linkOut url
let url = false;
switch(pages[i]){
case 'eve':
url = 'https://client'; // fake url
break;
case 'dotlan':
let systemNameTemp = systemName.replace(/ /g, '_');
let regionNameTemp = regionName.replace(/ /g, '_');
@@ -231,16 +236,41 @@ define([
if(url){
let urlObj = new URL(url);
urls[++validUrls + '_url'] = {
page: pages[i],
domain: urlObj.hostname,
link = {
title: urlObj.hostname,
url: url
};
}
}else{
// custom callback
let action = false;
let title = false;
switch(pages[i]){
case 'eve':
action = setDestination;
title = 'set destination';
showInModuleHead = false;
break;
}
if(action){
link = {
title: title|| pages[i],
action: action
};
}
}
if(link){
links.push(Object.assign({}, link, {
page: pages[i],
showInModuleHead: showInModuleHead
}));
}
}
return urls;
return links;
};
/**
@@ -326,6 +356,7 @@ define([
sovereigntySecondary: sovereigntySecondary ? Object.assign({}, sovereigntyDefault, sovereigntySecondary) : undefined,
static: staticsData,
moduleHeadlineIconClass: config.moduleHeadlineIconClass,
textActionIconCopyClass: config.textActionIconCopyClass,
infoSectionClass: config.systemInfoSectionClass,
descriptionSectionClass: config.descriptionSectionClass,
sovSectionClass: config.systemSovSectionClass,
@@ -378,9 +409,9 @@ define([
systemConstellationLinkClass: config.constellationLinkClass,
systemRegionLinkClass: config.regionLinkClass,
systemTypeLinkClass: config.typeLinkClass,
systemUrlLinkClass: config.urlLinkClass,
systemUrlLinkClass: config.textActionIconCopyClass,
ccpImageServerUrl: Init.url.ccpImageServer,
thirdPartyLinks: getThirdPartySystemLinks(['eve', 'dotlan', 'eveeye', 'anoik'], systemData)
thirdPartyLinks: getThirdPartySystemLinks(['dotlan', 'eveeye', 'anoik', 'eve'], systemData)
};
requirejs(['text!templates/modules/system_info.html', 'mustache', 'summernote.loader'], (template, Mustache, Summernote) => {
@@ -526,7 +557,7 @@ define([
}
// copy system deeplink URL -------------------------------------------------------------------------------
moduleElement.find('.' + config.urlLinkClass).on('click', function(){
moduleElement.find('.' + config.textActionIconCopyClass).on('click', function(){
let mapUrl = $(this).attr('data-url');
Util.copyToClipboard(mapUrl).then(payload => {
if(payload.data){
@@ -562,6 +593,19 @@ define([
return 'Loading...';
};
// 3rd party click callbacks ------------------------------------------------------------------------------
moduleElement.on('click', '[data-link]', e => {
for(let link of data.thirdPartyLinks){
if(
e.target.dataset.link === link.page &&
typeof link.action === 'function'
){
link.action(e);
break;
}
}
})
// init tooltips ------------------------------------------------------------------------------------------
let tooltipElements = moduleElement.find('[data-toggle="tooltip"]');
tooltipElements.tooltip({

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -18,6 +18,9 @@ define([
// navigation
navigationElementId: 'pf-navbar', // id for navbar element
// sticky panel
stickyPanelClass: 'pf-landing-sticky-panel', // class for sticky panels
hiddenByAttributeClass: 'pf-hidden-by-attr', // class for elements that are hidden/shown by [data-attr] value
shownByAttributeClass: 'pf-shown-by-attr', // class for elements that are hidden/shown by [data-attr] value
@@ -85,10 +88,17 @@ define([
// collapse ---------------------------------------------------------------------------------------------------
setCollapseObserver(body, '[data-toggle="collapse"]');
// panel actions ----------------------------------------------------------------------------------------------
let collapsedState = false;
$('.' + config.stickyPanelClass + ' a[data-panel-action="collapse-all"]').on('click', function(e){
e.preventDefault();
$('.row.collapse').collapse(collapsedState ? 'show' : 'hide');
collapsedState = !collapsedState;
});
// buttons ----------------------------------------------------------------------------------------------------
// exclude "download" && "navigation" buttons
body.find('.btn')
.not('.navbar-fixed-bottom .btn')
.not('[data-action]')
.not('[href^="?export"]')
.on('click', function(){

View File

@@ -20,12 +20,12 @@ define([
// headline toolbar
moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head
textActionIconCopyClass: 'pf-module-icon-button-copy', // class for text action "copy"
// breadcrumb
constellationLinkClass: 'pf-system-info-constellation', // class for "constellation" name
regionLinkClass: 'pf-system-info-region', // class for "region" name
typeLinkClass: 'pf-system-info-type', // class for "type" name
urlLinkClass: 'pf-system-info-url', // class for "url" copy link
// info col/table
systemInfoSectionClass: 'pf-system-info-section', // class for system info section
@@ -193,20 +193,25 @@ define([
* @param systemData
*/
let getThirdPartySystemLinks = (pages, systemData) => {
let urls = {};
let links = [];
let isWormhole = MapUtil.getSystemTypeInfo(Util.getObjVal(systemData, 'type.id'), 'name') === 'w-space';
let systemName = Util.getObjVal(systemData, 'name') || '';
let regionName = Util.getObjVal(systemData, 'region.name') || '';
let validUrls = 0;
let setDestination = e => {
e.preventDefault();
e.stopPropagation();
Util.setDestination('set_destination', 'system', {id: systemData.systemId, name: systemData.name});
};
for(let i = 0; i < pages.length; i++){
let url = false;
let link = null;
let showInModuleHead = true;
let domain = Util.getObjVal(Init, 'url.' + pages[i]);
if(domain || pages[i] === 'eve'){
if(domain){
// linkOut url
let url = false;
switch(pages[i]){
case 'eve':
url = 'https://client'; // fake url
break;
case 'dotlan':
let systemNameTemp = systemName.replace(/ /g, '_');
let regionNameTemp = regionName.replace(/ /g, '_');
@@ -231,16 +236,41 @@ define([
if(url){
let urlObj = new URL(url);
urls[++validUrls + '_url'] = {
page: pages[i],
domain: urlObj.hostname,
link = {
title: urlObj.hostname,
url: url
};
}
}else{
// custom callback
let action = false;
let title = false;
switch(pages[i]){
case 'eve':
action = setDestination;
title = 'set destination';
showInModuleHead = false;
break;
}
if(action){
link = {
title: title|| pages[i],
action: action
};
}
}
if(link){
links.push(Object.assign({}, link, {
page: pages[i],
showInModuleHead: showInModuleHead
}));
}
}
return urls;
return links;
};
/**
@@ -326,6 +356,7 @@ define([
sovereigntySecondary: sovereigntySecondary ? Object.assign({}, sovereigntyDefault, sovereigntySecondary) : undefined,
static: staticsData,
moduleHeadlineIconClass: config.moduleHeadlineIconClass,
textActionIconCopyClass: config.textActionIconCopyClass,
infoSectionClass: config.systemInfoSectionClass,
descriptionSectionClass: config.descriptionSectionClass,
sovSectionClass: config.systemSovSectionClass,
@@ -378,9 +409,9 @@ define([
systemConstellationLinkClass: config.constellationLinkClass,
systemRegionLinkClass: config.regionLinkClass,
systemTypeLinkClass: config.typeLinkClass,
systemUrlLinkClass: config.urlLinkClass,
systemUrlLinkClass: config.textActionIconCopyClass,
ccpImageServerUrl: Init.url.ccpImageServer,
thirdPartyLinks: getThirdPartySystemLinks(['eve', 'dotlan', 'eveeye', 'anoik'], systemData)
thirdPartyLinks: getThirdPartySystemLinks(['dotlan', 'eveeye', 'anoik', 'eve'], systemData)
};
requirejs(['text!templates/modules/system_info.html', 'mustache', 'summernote.loader'], (template, Mustache, Summernote) => {
@@ -526,7 +557,7 @@ define([
}
// copy system deeplink URL -------------------------------------------------------------------------------
moduleElement.find('.' + config.urlLinkClass).on('click', function(){
moduleElement.find('.' + config.textActionIconCopyClass).on('click', function(){
let mapUrl = $(this).attr('data-url');
Util.copyToClipboard(mapUrl).then(payload => {
if(payload.data){
@@ -562,6 +593,19 @@ define([
return 'Loading...';
};
// 3rd party click callbacks ------------------------------------------------------------------------------
moduleElement.on('click', '[data-link]', e => {
for(let link of data.thirdPartyLinks){
if(
e.target.dataset.link === link.page &&
typeof link.action === 'function'
){
link.action(e);
break;
}
}
})
// init tooltips ------------------------------------------------------------------------------------------
let tooltipElements = moduleElement.find('[data-toggle="tooltip"]');
tooltipElements.tooltip({

View File

@@ -1,10 +1,18 @@
<footer class="navbar-default navbar-fixed-bottom">
<div class="container-fluid">
<a href="{{ 'login' | alias }}" class="btn btn-fake navbar-btn">
<i class="fas fa-arrow-left"></i>&nbsp;back
</a>
<a href="#pf-setup-server" class="btn btn-fake navbar-btn pull-right">
<i class="fas fa-arrow-up"></i>&nbsp;top
</a>
</div>
</footer>
<set linkLogin="{{ 'login' | alias }}"/>
<set p1="{{ array_merge([['icon' => 'fas fa-arrow-left', 'label' => 'back', 'href' => @linkLogin]], (array) @p1) }}" />
<set p2="{{ array_merge([['icon' => 'fas fa-arrow-up', 'label' => 'top', 'href' => '#pf-setup-server']], (array) @p2) }}" />
<div class="hidden-xs pf-landing-sticky-panel pf-landing-sticky-panel--bottom pf-landing-sticky-panel--left">
<ul class="fa-ul">
<repeat group="{{ @p1 }}" value="{{ @link }}">
<li><i class="fa-li {{ @link.icon }}"></i><a href="{{ @link.href }}" data-panel-action="{{ @link.action }}">{{ @link.label }}</a></li>
</repeat>
</ul>
</div>
<div class="hidden-xs pf-landing-sticky-panel pf-landing-sticky-panel--bottom pf-landing-sticky-panel--right">
<ul class="fa-ul">
<repeat group="{{ @p2 }}" value="{{ @link }}">
<li><i class="fa-li {{ @link.icon }}"></i><a href="{{ @link.href }}" data-panel-action="{{ @link.action }}">{{ @link.label }}</a></li>
</repeat>
</ul>
</div>

View File

@@ -15,10 +15,16 @@
<h5><a href="javascript:void(0);" data-url="{{ajaxConstellationInfoUrl}}/{{system.constellation.id}}" class="{{systemConstellationLinkClass}} popup-ajax {{popoverTriggerClass}} {{#systemNameClass}}{{system.security}}{{/systemNameClass}}" title="constellation">{{system.constellation.name}}</a>&nbsp;<i class="fas fa-fw fa-angle-double-right"></i></h5>
<h5>
<span data-toggle="tooltip" title="system" class="{{#systemNameClass}}{{system.security}}{{/systemNameClass}}">{{system.name}}</span>
<i class="fas fa-fw fa-copy {{moduleHeadlineIconClass}} {{systemUrlLinkClass}}" data-toggle="tooltip" title="copy link" data-url="{{systemUrl}}"></i>
<i class="fas fa-fw fa-copy {{moduleHeadlineIconClass}} {{systemUrlLinkClass}}" data-toggle="tooltip" title="copy url" data-url="{{systemUrl}}"></i>
{{#system.locked}}
<i class="fas fa-fw fa-lock" data-toggle="tooltip" title="locked"></i>
{{/system.locked}}
{{#thirdPartyLinks}}
{{#showInModuleHead}}
<a class="pf-bg-icon-inline" style="--bg-image: url('/public/img/icons/logo_{{page}}.png');" data-toggle="tooltip" title="{{ title }}" href="{{ url }}" target="_blank" rel="noopener"></a>
{{/showInModuleHead}}
{{/thirdPartyLinks}}
</h5>
</div>
@@ -82,7 +88,7 @@
{{/static}}
</tbody>
</table>
<!--
<div class="pf-resizearea">
<table class="table table-condensed pf-table-fixed {{infoTableClass}}">
<colgroup>
@@ -94,21 +100,21 @@
<thead>
<tr>
<th>Links</th>
<th class="pf-table-cell-bg-image" rowspan="2">
{{#thirdPartyLinks.1_url}}
<a class="pf-table-cell-bg-image-wrapper smaller" style="--bg-image: url('/public/img/icons/logo_{{page}}.png');" data-toggle="tooltip" title="{{ domain }}" href="{{ url }}" target="_blank" rel="noopener"></a>
{{/thirdPartyLinks.1_url}}
</th>
<th class="pf-table-cell-bg-image" rowspan="2">
{{#thirdPartyLinks.2_url}}
<a class="pf-table-cell-bg-image-wrapper smaller" style="--bg-image: url('/public/img/icons/logo_{{page}}.png');" data-toggle="tooltip" title="{{ domain }}" href="{{ url }}" target="_blank" rel="noopener"></a>
{{/thirdPartyLinks.2_url}}
</th>
<th class="pf-table-cell-bg-image" rowspan="2">
{{#thirdPartyLinks.3_url}}
<a class="pf-table-cell-bg-image-wrapper smaller" style="--bg-image: url('/public/img/icons/logo_{{page}}.png');" data-toggle="tooltip" title="{{ domain }}" href="{{ url }}" target="_blank" rel="noopener"></a>
{{/thirdPartyLinks.3_url}}
</th>
{{#thirdPartyLinks}}
{{#showInModuleHead}}
<th class="pf-table-cell-bg-image" rowspan="2"></th>
{{/showInModuleHead}}
{{^showInModuleHead}}
<th class="pf-table-cell-bg-image" rowspan="2">
{{#url}}
<a class="pf-table-cell-bg-image-wrapper smaller" style="--bg-image: url('/public/img/icons/logo_{{page}}.png');" data-toggle="tooltip" title="{{ title }}" href="{{ url }}" target="_blank" rel="noopener"></a>
{{/url}}
{{^url}}
<span class="pf-table-cell-bg-image-wrapper smaller pf-link" style="--bg-image: url('/public/img/icons/logo_{{page}}.png');" data-toggle="tooltip" title="{{ title }}" data-link="{{page}}"></span>
{{/url}}
</th>
{{/showInModuleHead}}
{{/thirdPartyLinks}}
</tr>
<tr>
<th>&nbsp;</th>
@@ -125,6 +131,7 @@
<div class="pf-resizebar-bar"></div>
</div>
</div>
-->
</div>
</div>

View File

@@ -1,4 +1,4 @@
<div id="pf-landing-admin-panel" class="hidden-xs pf-landing-sticky-panel">
<div id="pf-landing-admin-panel" class="hidden-xs pf-landing-sticky-panel pf-landing-sticky-panel--right pf-landing-sticky-panel--bottom">
<h4 class="text-center">Admin</h4>
<ul class="fa-ul">
<li><i class="fas fa-li fa-sign-in-alt"></i><a href="{{ @BASE }}{{ 'admin', ['*' => ''] | alias }}">SSO&nbsp;login</a></li>

View File

@@ -1,4 +1,4 @@
<div id="{{ stickyPanelServerId }}" class="hidden-xs {{ stickyPanelClass }}">
<div id="{{ stickyPanelServerId }}" class="hidden-xs {{ stickyPanelClass }} {{ stickyPanelClass }}--left {{ stickyPanelClass }}--top">
{{#server}}
<h4>{{ name }}</h4>
<ul class="fa-ul">

View File

@@ -31,7 +31,7 @@
</section>
<section id="pf-setup-server">
<div class="container row-reverse">
<div class="container row--reverse">
<div class="row text-center pf-setup-body-server collapse in">
<div class="col-xs-12 col-md-6 pf-landing-pricing-panel">
@@ -184,7 +184,7 @@
</section>
<section id="pf-setup-environment">
<div class="container row-reverse">
<div class="container row--reverse">
<div class="row text-center pf-setup-body-environment collapse in">
<div class="col-xs-12 col-md-6 pf-landing-pricing-panel">
{* Framework requirements (PHP) *}
@@ -249,7 +249,7 @@
</section>
<section id="pf-setup-settings">
<div class="container row-reverse">
<div class="container row--reverse">
<div class="row text-center pf-setup-body-settings collapse in">
<div class="col-xs-12 col-md-6 pf-landing-pricing-panel">
<div class="panel panel-default pricing-big">
@@ -404,7 +404,7 @@
</section>
<section id="pf-setup-database">
<div class="container row-reverse">
<div class="container row--reverse">
<div class="row text-center pf-setup-body-database collapse in">
<repeat group="{{ @checkDatabase }}" key="{{ @dbKey }}" value="{{ @dbInformation }}">
@@ -916,7 +916,7 @@
</section>
<section id="pf-setup-cache">
<div class="container row-reverse">
<div class="container row--reverse">
<div class="row text-center pf-setup-body-cache collapse in">
<check if="{{ @checkRedisInformation }}">
<true>
@@ -1045,7 +1045,7 @@
</section>
<section id="pf-setup-socket">
<div class="container row-reverse">
<div class="container row--reverse">
<div class="row text-center pf-setup-body-socket collapse in">
<repeat group="{{ @socketInformation }}" key="{{ @socketType }}" value="{{ @socketData }}">
@@ -1185,7 +1185,7 @@
</section>
<section id="pf-setup-cronjob">
<div class="container row-reverse">
<div class="container row--reverse">
<div class="row text-center pf-setup-body-cronjob collapse in">
<div class="col-xs-12 col-md-6 pf-landing-pricing-panel">
@@ -1285,7 +1285,7 @@
</section>
<section id="pf-setup-administration">
<div class="container row-reverse">
<div class="container row--reverse">
<div class="row text-center pf-setup-body-administration collapse in">
<div class="col-xs-12 col-md-6 pf-landing-pricing-panel">
@@ -1407,28 +1407,36 @@
</div>
<div class="panel-body no-padding">
<repeat group="{{ @checkDirSize.dirAll }}" key="{{ @key }}" value="{{ @dirData }}">
<div class="btn-group btn-group-justified">
<span class="btn btn-default disabled btn-fake">
{{ @dirData.label }}
<kbd class="pull-right">{{ @dirData.path }}&nbsp;
<check if="{{ @dirData.size }}">
<true>
{{ @dirData.size }}
</true>
<false>
0KB
</false>
</check>
</kbd>
</span>
<repeat group="{{ @dirData.task }}" value="{{ @taskData }}">
<a href="?{{ @taskData.action }}#pf-setup-administration" class="btn {{ @taskData.btn }}" role="button">
<i class="fas fa-fw {{ @taskData.icon }}"></i> {{ @taskData.label }}
</a>
</repeat>
</div>
</repeat>
<table class="table">
<thead>
<repeat group="{{ @checkDirSize.dirAll }}" key="{{ @key }}" value="{{ @dirData }}">
<tr>
<td>{{ @dirData.label }}</td>
<td class="col-xs-3 text-right">
<kbd>{{ @dirData.path }}&nbsp;
<check if="{{ @dirData.size }}">
<true>
{{ @dirData.size }}
</true>
<false>
0KB
</false>
</check>
</kbd>
</td>
<td class="col-xs-6 no-padding">
<div class="btn-group btn-group-justified">
<repeat group="{{ @dirData.task }}" value="{{ @taskData }}">
<a href="?{{ @taskData.action }}#pf-setup-administration" class="btn {{ @taskData.btn }}" role="button">
<i class="fas fa-fw {{ @taskData.icon }}"></i>&nbsp;{{ @taskData.label }}
</a>
</repeat>
</div>
</td>
</tr>
</repeat>
</thead>
</table>
</div>
</div>
</div>
@@ -1443,12 +1451,23 @@
</div>
<div class="panel-body no-padding">
<div class="btn-group btn-group-justified">
<span class="btn btn-default disabled btn-fake">Invalidate all Cookie data</span>
<a href="?action=invalidateCookies#pf-setup-administration" class="btn btn-danger" role="button">
<i class="fas fa-fw fa-trash"></i> Clear authentication data
</a>
</div>
<table class="table">
<thead>
<tr>
<td>Invalidate all Cookie data</td>
<td class="col-xs-6 no-padding">
<div class="btn-group btn-group-justified">
<a class="btn btn-danger" href="?action=invalidateCookies#pf-setup-administration" role="button" >
<i class="fas fa-fw fa-trash"></i>&nbsp;Clear authentication data
</a>
</div>
</td>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
@@ -1491,4 +1510,5 @@
</nav>
{* footer *}
<include href="templates/layout/footer_simple.html"/>
<set panel2="{{ [['icon' => 'far fa-window-maximize', 'label' => 'toggle', 'action' => 'collapse-all']] }}" />
<include href="templates/layout/footer_simple.html" with="p2={{ @panel2 }}"/>

View File

@@ -124,16 +124,6 @@ fieldset[disabled]{
// buttons ============================================================================================================
.btn{
// "fake" button (no user interaction)
&.btn-fake{
border: none;
text-align: left;
cursor: default;
opacity: 1 !important;
color: $gray-light !important;
background-color: transparent !important;
}
// progress bar inside button
.btn-progress{
position: absolute;

View File

@@ -15,6 +15,7 @@ body{
cursor: default;
}
// links ==========================================================================================
a, .pf-link{
color: $teal;
will-change: color;
@@ -30,6 +31,12 @@ a, .pf-link{
&:focus{
color: $teal;
}
&.disabled{
color: $navbar-default-link-color;
pointer-events: none;
cursor: default;
}
}
em,
@@ -159,7 +166,7 @@ em,
.row{
// swap render order
&-reverse{
&--reverse{
display: flex;
flex-direction: column-reverse;
}
@@ -242,15 +249,30 @@ em,
user-select: text;
}
// links ==========================================================================================
a{
&.disabled{
color: $navbar-default-link-color;
pointer-events: none;
cursor: default;
}
%pf-bg-image-wrapper{
background-size: contain;
background-origin: content-box;
background-repeat: no-repeat;
background-image: var(--bg-image);
background-position: bottom 0 right 0;
image-rendering: -webkit-optimize-contrast;
}
.pf-bg-icon-inline{
@extend %pf-bg-image-wrapper;
display: inline-block;
width: 20px;
height: 20px;
margin: -5px 5px;
outline: 1px solid;
outline-color: transparent;
outline-offset: 2px;
@include transition(outline-color 0.15s ease-out);
&:hover{
outline-color: $teal;
}
}
// alert messages =================================================================================
.alert{
will-change: opacity, transform;
@@ -703,13 +725,8 @@ table{
border-top-color: transparent !important;
.pf-table-cell-bg-image-wrapper{
@extend %pf-bg-image-wrapper;
display: block;
background-size: contain;
background-origin: content-box;
background-repeat: no-repeat;
background-image: var(--bg-image);
background-position: bottom 0 right 0;
image-rendering: -webkit-optimize-contrast;
width: auto;
height: 40px;
padding: 2px 0;

View File

@@ -1,8 +1,8 @@
.pf-landing-sticky-panel{
position: fixed;
min-width: 100px;
min-width: 65px;
border-radius: 5px;
padding: 7px;
padding: 8px 10px;
box-shadow: 0 4px 10px rgba(0,0,0,0.4);
text-shadow: #000000b8 0 1px 1px; // improve text readability
z-index: 100; // over "gallery slider"
@@ -22,14 +22,20 @@
ul + h4{
margin-top: 10px;
}
}
#pf-landing-server-panel{
top: 50px;
left: 10px;
}
&--top{
top: 50px;
}
#pf-landing-admin-panel{
bottom: 10px;
right: 10px;
&--bottom{
bottom: 10px;
}
&--left{
left: 10px;
}
&--right{
right: 10px;
}
}