Get rid of ugly accordion in UI

This commit is contained in:
Ilya Ig. Petrov 2017-01-26 18:30:47 +00:00
parent 2dacd14f57
commit b0cc0e1f2c
2 changed files with 234 additions and 213 deletions

View File

@ -4,37 +4,19 @@
<title>Выбор провайдера PAC</title> <title>Выбор провайдера PAC</title>
<style> <style>
:root { :root {
--ribbon-color: #4169e1; /* #1a6cc8 */ --ribbon-color: #4169e1;
--default-grey: #bfbfbf;
} }
body { body {
margin-left: 0;
margin-right: 0;
}
.main-padded {
margin: 0 17px;
}
div, section, header {
margin: 0; margin: 0;
padding: 0;
} }
.valign-parent {
display: flex;
align-items: center;
}
section header h4 {
margin: 0 0 0 0.7em;
}
label { label {
user-select: none; user-select: none;
} }
ul, ol { div, section, header, ul, ol {
list-style-type: none;
padding: 0;
margin: 0; margin: 0;
margin-bottom: 1em; padding: 0;
list-style-type: none;
} }
li, footer { li, footer {
display: block; display: block;
@ -47,15 +29,125 @@
input[type="radio"], label { input[type="radio"], label {
cursor: pointer; cursor: pointer;
} }
hr { hr {
border-width: 1px 0 0 0; border-width: 1px 0 0 0;
margin: 0 0 0.6em 0; margin: 0 0 0.6em 0;
padding: 0; padding: 0;
} }
/* COMMON */ /* COMMON 1 */
.hor-padded {
padding-left: 1.4em;
padding-right: 1.4em;
}
/* NOT CONTROLLED */
.if-not-controlled {
display: none;
background-color: red;
color: white;
font-weight: bold;
text-align: center;
padding-top: 1em;
padding-bottom: 1em;
border-bottom: 1px solid var(--default-grey);
}
.if-not-controlled a {
color: white;
}
/* ACCORDION (OR TABBED STATEFUL UI) */
.off {
display: none;
}
.acc-padded {
padding: 0.6em 0 1em 0.5em;
}
/* HIDE */
#acc-pac:not(:checked) ~ .main-nav section[data-for="acc-pac"].hideable,
#acc-exc:not(:checked) ~ .main-nav section[data-for="acc-exc"].hideable,
#acc-mods:not(:checked) ~ .main-nav section[data-for="acc-mods"].hideable,
#acc-ntf:not(:checked) ~ .main-nav section[data-for="acc-ntf"].hideable
{
/* Hide, but preclude width resizes. */
height: 0px !important;
line-height: 0px !important;
padding: 0;
margin: 0;
display: block;
visibility: hidden;
transform: scaleY(0);
}
#acc-pac:not(:checked) ~ .main-nav section[data-for="acc-pac"].hideable *,
#acc-exc:not(:checked) ~ .main-nav section[data-for="acc-exc"].hideable *,
#acc-mods:not(:checked) ~ .main-nav section[data-for="acc-mods"].hideable *,
#acc-ntf:not(:checked) ~ .main-nav section[data-for="acc-ntf"].hideable *
{
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.nav-labels {
text-align: center;
--blue-bg: DodgerBlue;
}
.nav-labels li {
display: inline-block;
}
.nav-labels li label {
display: inline-block;
border: 2px solid var(--blue-bg);
border-radius: 0.7em;
background-color: white;
color: var(--ribbon-color);
padding: 0.2em 0.65em 0.3em 0.4em;
line-height: 0.9em;
margin: 0.1em 0;
}
.nav-labels li label:hover {
background-color: var(--blue-bg);
color: white;
border-color: white;
border-style: dotted;
}
/* CHECKED LABELS */
#acc-pac:checked ~ .nav-labels label[for="acc-pac"]:not(:hover),
#acc-exc:checked ~ .nav-labels label[for="acc-exc"]:not(:hover),
#acc-mods:checked ~ .nav-labels label[for="acc-mods"]:not(:hover),
#acc-ntf:checked ~ .nav-labels label[for="acc-ntf"]:not(:hover)
{
background-color: var(--blue-bg);
color: white;
line-height: 0.8em;
}
/* ★★★★★ */
.nav-labels label:before {
content: '★ ';
visibility: hidden;
}
.nav-labels li label:hover:before,
#acc-pac:checked ~ .nav-labels label[for="acc-pac"]:before,
#acc-exc:checked ~ .nav-labels label[for="acc-exc"]:before,
#acc-mods:checked ~ .nav-labels label[for="acc-mods"]:before,
#acc-ntf:checked ~ .nav-labels label[for="acc-ntf"]:before
{
visibility: initial;
}
/* COMMON 2 */
.link-button, .link-button:visited { .link-button, .link-button:visited {
color: #0000EE; color: #0000EE;
text-decoration: none; text-decoration: none;
@ -64,24 +156,6 @@
text-decoration: underline; text-decoration: underline;
} }
.if-not-controlled {
display: none;
color: red;
}
/* PAC PROVIDER */
.update-button {
visibility: hidden;
}
input:checked ~ .update-button {
visibility: inherit;
}
#none:checked + label {
color: red;
}
/* INFO SIGNS */ /* INFO SIGNS */
.info-row { .info-row {
@ -155,7 +229,23 @@
width: calc(25% + 0.6em); width: calc(25% + 0.6em);
} }
/* PAC MODS & EXCEPTIONS */ /* TAB_1 PAC PROVIDER */
.update-button {
visibility: hidden;
}
input:checked ~ .update-button {
visibility: inherit;
}
#none:checked + label {
color: red;
}
#update-message {
white-space: nowrap;
margin-top: 0.5em;
}
/* TAB_2 PAC MODS */
#mods-custom-proxy-string-raw ~ textarea { #mods-custom-proxy-string-raw ~ textarea {
width: 100%; width: 100%;
@ -167,17 +257,15 @@
display: none; display: none;
} }
#this-yes:disabled + label { /* TAB_3 EXCEPTIONS */
color: grey;
text-decoration: line-through;
}
/* EXCEPTIONS */
#right-flexed-editor { #right-flexed-editor {
flex-grow: 99; flex-grow: 99;
max-height: 100%; max-height: 100%;
border: 1px solid var(--border-color);
width: 100%;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
@ -186,11 +274,13 @@
} }
#except-editor { #except-editor {
border-radius: 0 !important; border-radius: 0 !important;
border-bottom: 0; border: none;
border-bottom: 1px solid var(--border-color);
max-height: 1.6em !important; max-height: 1.6em !important;
min-height: 1.6em !important; min-height: 1.6em !important;
flex-grow: 99; flex-grow: 99;
width: 100% !important;
} }
#bottom-flexed-editor { #bottom-flexed-editor {
flex-grow: 99; flex-grow: 99;
@ -210,17 +300,24 @@
bottom: 0; bottom: 0;
left: 0; left: 0;
width: 100%; width: 100%;
border: none !important;
} }
#exc-flex-container { #exc-flex-container {
position: relative; position: relative;
display: flex; display: flex;
/* Fixes multi-select bug
when its border is rendered below
its scrollbar. */
--border-color: var(--default-grey);
} }
#exc-flex-container > * { #exc-flex-container > * {
flex-grow: 1; flex-grow: 1;
padding: 0; padding: 0;
margin: 0; margin: 0;
} }
/* CONTROL RAW = BUTTON + LINK */ /* CONTROL RAW = BUTTON + LINK */
@ -237,174 +334,84 @@
text-align: right; text-align: right;
} }
.main-nav { /* STATUS */
display: flex;
flex-direction: column;
counter-reset: line;
}
/* ACCORDION */
.accordion-radio {
display: none;
}
.accordion-title {
position: relative;
height: 1.8em;
border-bottom: 1px solid #558abb;
}
.accordion-title label:before {
content: counter(line) '.';
counter-increment: line;
padding-left: 0.2em;
}
.accordion-title label {
background-color: transparent;
color: black;
padding-left: 5px;
}
.accordion-radio:checked + section {
order: 0;
}
#status { #status {
padding: 0 0.3em 1em; padding: 0 0.3em 1em;
} }
.status {
order: 2;
/*border-left: 5px solid DodgerBlue;*/
margin-bottom: 0.5em;
}
.accordion-radio:checked + section .accordion-title {
margin-top: 0.3em; /* Short gap. */
}
.accordion-radio:checked + section .accordion-title label,
.accordion-title:hover label
{
background-color: DodgerBlue;
color: white;
padding-left: 0;
border-left: 5px solid #1048ac;
}
.accordion-title label {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
.accordion-radio:not(:checked) + section .accordion-content {
/* Hide, but preclude width resizes. */
height: 0px !important;
line-height: 0px !important;
padding: 0;
margin: 0;
display: block;
visibility: hidden;
transform:scaleY(0.5);
}
.accordion-radio:not(:checked) + section .accordion-content * {
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.accordion-radio + section .accordion-content .acc-padded {
margin: 0.6em 0 1em 0.5em;
}
</style> </style>
</head> </head>
<body> <body>
<section class="if-not-controlled"> <section class="if-not-controlled hor-padded" id="which-extension"></section>
<div id="which-extension" class="main-padded" style="margin-bottom: 1em"></div>
<hr style="border-color: red; border-style: solid;"/> <input type="radio" name="accordion" class="off" id="acc-pac" checked/>
<input type="radio" name="accordion" class="off" id="acc-exc"/>
<input type="radio" name="accordion" class="off" id="acc-mods"/>
<input type="radio" name="accordion" class="off" id="acc-ntf"/>
<section class="nav-labels hidden-for-options-page">
<ul>
<li><label for="acc-pac" class="nav-label">PAC-скрипт</label></li>
<li><label for="acc-mods" class="nav-label">Модификаторы</label></li>
<li><label for="acc-exc" class="nav-label">Исключения</label></li>
<li><label for="acc-ntf" class="nav-label">Уведомления</label></li>
</ul>
<hr/>
</section> </section>
<nav class="main-padded main-nav"> <nav class="hor-padded main-nav">
<input type="radio" name="accordion" id="acc-pac-provider" class="accordion-radio" checked/> <section data-for="acc-pac" class="hideable">
<section> <div class="acc-padded">
<ul id="list-of-providers">
<li><input type="radio" name="pacProvider" id="none" checked> <label for="none">Отключить</label></li>
</ul>
<div id="update-message">
Обновлялись: <span class="update-date">...</span>
</div>
</div>
<header class='accordion-title'> </section>
<label for="acc-pac-provider" class="valign-parent"><h4>PAC-скрипт</h4></label>
</header>
<div class="accordion-content"> <section data-for="acc-exc" class="hideable">
<div class="acc-padded">
<ul id="list-of-providers"> <header>Проксировать этот сайт?</header>
<li><input type="radio" name="pacProvider" id="none" checked> <label for="none">Отключить</label></li> <div class="acc-padded" id="exc-flex-container">
</ul> <ul style="padding-right: 1em">
<div style="white-space: nowrap"> <li><input id="this-auto" type="radio" checked name="if-proxy-this-site"/> <label for="this-auto">🔄&#xFE0E; авто</label></li>
Обновлялись: <span class="update-date">...</span> <li><input id="this-yes" type="radio" name="if-proxy-this-site"/> <label for="this-yes">&nbsp;да</label></li>
<li><input id="this-no" type="radio" name="if-proxy-this-site"/> <label for="this-no">&nbsp;нет</label></li>
<li><a href>Весь список</a></li>
</ul>
<div id="right-flexed-editor">
<input type="text" placeholder="example.com" id="except-editor"/>
<div id="bottom-flexed-editor">
<select multiple id="exceptions-select"></select>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
<input type="radio" name="accordion" id="acc-exceptions" class="accordion-radio"/> <section data-for="acc-mods" class="hideable">
<section id="exceptions"> <div class="acc-padded">
<ul id="pac-mods">
<header class='accordion-title'> <li class="control-row">
<label for="acc-exceptions" class="valign-parent"><h4>Проксировать этот сайт?</h4></label> <input type="button" value="Применить" id="apply-mods" disabled/>
</header> <a href id="reset-mods" class="link-button">К изначальным!</a>
</li>
<div class="accordion-content"> </ul>
<div class="acc-padded" id="exc-flex-container">
<ul style="padding-right: 1em">
<li><input id="this-auto" type="radio" checked name="if-proxy-this-site"/> <label for="this-auto">🔄&#xFE0E; авто</label></li>
<li><input id="this-yes" type="radio" name="if-proxy-this-site"/> <label for="this-yes">&nbsp;да</label></li>
<li><input id="this-no" type="radio" name="if-proxy-this-site"/> <label for="this-no">&nbsp;нет</label></li>
<li><a href>Весь список</a></li>
</ul>
<div id="right-flexed-editor">
<input type="text" value="google.com" id="except-editor"/>
<div id="bottom-flexed-editor">
&nbsp;
<select multiple id="exceptions-select"></select>
</div>
</div>
</div>
</div>
</section>
<input type="radio" name="accordion" id="acc-pac-mods" class="accordion-radio"/>
<section>
<header class='accordion-title'>
<label for="acc-pac-mods" class="valign-parent"><h4>Модификаторы PAC-скрипта</h4></label>
</header>
<div class="accordion-content">
<div class="acc-padded">
<ul id="pac-mods">
<li class="control-row">
<input type="button" value="Применить" id="apply-mods" disabled/>
<a href id="reset-mods" class="link-button">К изначальным!</a>
</li>
</ul>
</div>
</div> </div>
</section> </section>
<input type="radio" name="accordion" id="acc-notifications" class="accordion-radio"/> <section data-for="acc-ntf" class="hideable">
<header>Я ❤️ yведомления:</header>
<section id="configs-panel"> <div class="acc-padded">
<ul id="list-of-handlers"></ul>
<header class='accordion-title'>
<label for="acc-notifications" class="valign-parent"><h4>Уведомления</h4></label>
</header>
<div class="accordion-content">
<div class="acc-padded">
<ul id="list-of-handlers"></ul>
</div>
</div> </div>
</section> </section>
@ -413,16 +420,15 @@
<hr/> <hr/>
<div class="main-padded"> <div class="hor-padded">
<div id="status" style="will-change: contents">Загрузка...</div>
<div id="status" style="will-change: contents">Загрузка...</div> <footer class="control-row">
<input type="button" value="Готово" class="close-button">
<footer class="control-row"> <a href="../troubleshoot/index.html" class="link-button">
<input type="button" value="Готово" class="close-button"> Проблемы?
<a href="../troubleshoot/index.html" class="link-button"> </a>
Проблемы? </footer>
</a>
</footer>
</div> </div>
<script src="./index.js"></script> <script src="./index.js"></script>

View File

@ -10,7 +10,24 @@ document.getElementById('pac-mods').onchange = function() {
chrome.runtime.getBackgroundPage( (backgroundPage) => chrome.runtime.getBackgroundPage( (backgroundPage) =>
backgroundPage.apis.errorHandlers.installListenersOnAsync( backgroundPage.apis.errorHandlers.installListenersOnAsync(
window, 'PUP', () => { window, 'PUP', async() => {
const currentTab = await new Promise(
(resolve) => chrome.tabs.query(
{ active: true, currentWindow: true },
([tab]) => resolve(tab)
)
);
if ( !currentTab || currentTab.url.startsWith('chrome://extensions/?options=') ) {
const hidClass = 'hideable';
for(const el of document.querySelectorAll('.' + hidClass)) {
el.classList.remove(hidClass);
}
for(const el of document.querySelectorAll('.hidden-for-options-page')) {
el.style.display = 'none';
}
}
const getStatus = () => document.querySelector('#status'); const getStatus = () => document.querySelector('#status');
@ -226,14 +243,12 @@ chrome.runtime.getBackgroundPage( (backgroundPage) =>
{ {
if (currentTab && !currentTab.url.startsWith('chrome')) {
document.getElementById('except-editor').value = new URL(currentTab.url).hostname;
}
const pacKitchen = backgroundPage.apis.pacKitchen; const pacKitchen = backgroundPage.apis.pacKitchen;
chrome.tabs.query({ active: true, currentWindow: true }, ([tab]) => {
document.getElementById('except-editor').value = new URL(tab.url).hostname;
});
{ {
const pacMods = pacKitchen.getPacMods(); const pacMods = pacKitchen.getPacMods();