fix/deduplicate/simplify installer html/css/js (#1383)
This commit is contained in:
parent
936f5b40d2
commit
0705392fb2
38
edit.html
38
edit.html
|
@ -230,44 +230,6 @@
|
|||
</table>
|
||||
</template>
|
||||
|
||||
<template data-id="styleSettings">
|
||||
<div>
|
||||
<fieldset class="style-settings can-close-on-esc">
|
||||
<label i18n-text="styleUpdateUrlLabel">
|
||||
<input id="ss-update-url" type="text">
|
||||
</label>
|
||||
<div>
|
||||
<div i18n-text="installPreferSchemeLabel"></div>
|
||||
<label i18n-text-append="installPreferSchemeNone">
|
||||
<input name="ss-scheme" type="radio" value="none">
|
||||
</label>
|
||||
<label i18n-text-append="installPreferSchemeDark">
|
||||
<input name="ss-scheme" type="radio" value="dark">
|
||||
</label>
|
||||
<label i18n-text-append="installPreferSchemeLight">
|
||||
<input name="ss-scheme" type="radio" value="light">
|
||||
</label>
|
||||
</div>
|
||||
<label i18n-text="styleIncludeLabel">
|
||||
<textarea id="ss-inclusions" spellcheck="false"
|
||||
placeholder="*://site1.com/* *://site2.com/*"></textarea>
|
||||
</label>
|
||||
<label i18n-text="styleExcludeLabel">
|
||||
<textarea id="ss-exclusions" spellcheck="false"
|
||||
placeholder="*://site1.com/* *://site2.com/*"></textarea>
|
||||
</label>
|
||||
</fieldset>
|
||||
<div class="buttons">
|
||||
<button id="ss-save" i18n-text="confirmSave" disabled></button>
|
||||
<label i18n-title="configOnChangeTooltip" i18n-text-append="configOnChange">
|
||||
<input id="config.autosave" type="checkbox">
|
||||
<svg class="svg-icon checked"><use xlink:href="#svg-icon-checked"/></svg>
|
||||
</label>
|
||||
<button id="ss-close" i18n-text="confirmClose"></button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<link href="vendor/codemirror/lib/codemirror.css" rel="stylesheet">
|
||||
<link href="vendor/codemirror/addon/dialog/dialog.css" rel="stylesheet">
|
||||
<link href="vendor/codemirror/addon/fold/foldgutter.css" rel="stylesheet">
|
||||
|
|
35
edit/settings.html
Normal file
35
edit/settings.html
Normal file
|
@ -0,0 +1,35 @@
|
|||
<div>
|
||||
<fieldset class="style-settings can-close-on-esc">
|
||||
<label i18n-text="styleUpdateUrlLabel">
|
||||
<input id="ss-update-url" type="text">
|
||||
</label>
|
||||
<div id="ss-scheme">
|
||||
<div i18n-text="installPreferSchemeLabel"></div>
|
||||
<label i18n-text-append="installPreferSchemeNone">
|
||||
<input name="ss-scheme" type="radio" value="none">
|
||||
</label>
|
||||
<label i18n-text-append="installPreferSchemeDark">
|
||||
<input name="ss-scheme" type="radio" value="dark">
|
||||
</label>
|
||||
<label i18n-text-append="installPreferSchemeLight">
|
||||
<input name="ss-scheme" type="radio" value="light">
|
||||
</label>
|
||||
</div>
|
||||
<label i18n-text="styleIncludeLabel">
|
||||
<textarea id="ss-inclusions" spellcheck="false"
|
||||
placeholder="*://site1.com/* *://site2.com/*"></textarea>
|
||||
</label>
|
||||
<label i18n-text="styleExcludeLabel">
|
||||
<textarea id="ss-exclusions" spellcheck="false"
|
||||
placeholder="*://site1.com/* *://site2.com/*"></textarea>
|
||||
</label>
|
||||
</fieldset>
|
||||
<div class="buttons">
|
||||
<button id="ss-save" i18n-text="confirmSave" disabled></button>
|
||||
<label i18n-title="configOnChangeTooltip" i18n-text-append="configOnChange">
|
||||
<input id="config.autosave" type="checkbox">
|
||||
<svg class="svg-icon checked"><use xlink:href="#svg-icon-checked"/></svg>
|
||||
</label>
|
||||
<button id="ss-close" i18n-text="confirmClose"></button>
|
||||
</div>
|
||||
</div>
|
|
@ -7,9 +7,10 @@
|
|||
/* exported StyleSettings */
|
||||
'use strict';
|
||||
|
||||
function StyleSettings() {
|
||||
async function StyleSettings() {
|
||||
const AUTOSAVE_DELAY = 500; // same as config-dialog.js
|
||||
const SS_ID = 'styleSettings';
|
||||
await t.fetchTemplate('/edit/settings.html', SS_ID);
|
||||
const {style} = editor;
|
||||
const ui = t.template[SS_ID].cloneNode(true);
|
||||
const elAuto = $('[id="config.autosave"]', ui);
|
||||
|
|
|
@ -11,13 +11,12 @@
|
|||
<script src="js/polyfill.js"></script>
|
||||
<script src="js/msg.js"></script>
|
||||
<script src="js/toolbox.js"></script>
|
||||
|
||||
<script src="install-usercss/preinit.js"></script>
|
||||
|
||||
<script src="js/prefs.js"></script>
|
||||
<script src="js/dom.js"></script>
|
||||
<script src="js/localization.js"></script>
|
||||
|
||||
<script src="install-usercss/preinit.js"></script>
|
||||
|
||||
<script src="content/style-injector.js"></script>
|
||||
<script src="content/apply.js"></script>
|
||||
|
||||
|
@ -25,66 +24,59 @@
|
|||
<link href="install-usercss/install-usercss.css" rel="stylesheet">
|
||||
</head>
|
||||
<body id="stylus-install-usercss">
|
||||
<div class="container">
|
||||
<div id="header">
|
||||
<div id="header-content-wrapper">
|
||||
<h1>
|
||||
<span class="meta-name"></span>
|
||||
<small class="meta-version"></small>
|
||||
</h1>
|
||||
<div class="actions">
|
||||
<h2 hidden class="installed" i18n-text="installButtonInstalled"></h2>
|
||||
<button class="install" i18n-text="installButton"></button>
|
||||
<a class="configure-usercss" i18n-title="configureStyle" tabindex="0">
|
||||
<svg class="svg-icon config"><use xlink:href="#svg-icon-config"></use></svg>
|
||||
</a>
|
||||
<p id="live-reload-install-hint" hidden></p>
|
||||
<label class="set-update-url">
|
||||
<input type="checkbox">
|
||||
<svg class="svg-icon checked"><use xlink:href="#svg-icon-checked"/></svg>
|
||||
<span i18n-text="installUpdateFromLabel"></span>
|
||||
<p></p>
|
||||
</label>
|
||||
<label class="live-reload">
|
||||
<input type="checkbox">
|
||||
<svg class="svg-icon checked"><use xlink:href="#svg-icon-checked"/></svg>
|
||||
<span i18n-text="liveReloadLabel"></span>
|
||||
</label>
|
||||
<label class="set-prefer-scheme">
|
||||
<span i18n-text="installPreferSchemeLabel"></span>
|
||||
<select>
|
||||
<option value="none" i18n-text="installPreferSchemeNone"></option>
|
||||
<option value="dark" i18n-text="installPreferSchemeDark"></option>
|
||||
<option value="light" i18n-text="installPreferSchemeLight"></option>
|
||||
</select>
|
||||
</label>
|
||||
<p hidden class="installed-actions">
|
||||
<a href="manage.html" tabindex="0"><button i18n-text="openManage"></button></a>
|
||||
<a href="edit.html?id=" tabindex="0"><button i18n-text="editStyleLabel"></button></a>
|
||||
<a id="delete" tabindex="0"><button i18n-text="deleteStyleLabel"></button></a>
|
||||
</p>
|
||||
</div>
|
||||
<p class="meta-description"></p>
|
||||
<div>
|
||||
<h3 i18n-text="author"></h3>
|
||||
<span class="meta-author"></span>
|
||||
</div>
|
||||
<div>
|
||||
<h3 i18n-text="license"></h3>
|
||||
<span class="meta-license"></span>
|
||||
</div>
|
||||
<div class="external-link"></div>
|
||||
<div id="applies-to-wrapper">
|
||||
<h3 i18n-text="appliesLabel"></h3>
|
||||
<ul class="applies-to">
|
||||
</ul>
|
||||
<div id="header">
|
||||
<div id="header-contents">
|
||||
<h1 class="w100">
|
||||
<span class="meta-name"></span>
|
||||
<small class="meta-version"></small>
|
||||
</h1>
|
||||
<div id="install-wrapper">
|
||||
<h2 class="install-show" i18n-text="installButtonInstalled"></h2>
|
||||
<button class="install install-hide" i18n-text="installButton"></button>
|
||||
<a class="configure-usercss" i18n-title="configureStyle" tabindex="0">
|
||||
<svg class="svg-icon config"><use xlink:href="#svg-icon-config"></use></svg>
|
||||
</a>
|
||||
<div class="install-show w100-full">
|
||||
<a href="manage.html"><button i18n-text="openManage"></button></a>
|
||||
<a id="edit" href="edit.html?id="><button i18n-text="editStyleLabel"></button></a>
|
||||
<a id="delete" tabindex="0"><button i18n-text="deleteStyleLabel"></button></a>
|
||||
</div>
|
||||
</div>
|
||||
<div id="header-resizer" i18n-title="headerResizerHint"></div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="warnings"></div>
|
||||
<div id="ss-scheme" class="install-dim"></div>
|
||||
<div class="set-update-url w100 checkbox-wrapper install-disable">
|
||||
<label>
|
||||
<input type="checkbox">
|
||||
<svg class="svg-icon checked"><use xlink:href="#svg-icon-checked"/></svg>
|
||||
<span i18n-text="installUpdateFromLabel"></span>
|
||||
</label>
|
||||
<p></p>
|
||||
</div>
|
||||
<label class="live-reload checkbox-wrapper">
|
||||
<input type="checkbox">
|
||||
<svg class="svg-icon checked"><use xlink:href="#svg-icon-checked"/></svg>
|
||||
<span i18n-text="liveReloadLabel"></span>
|
||||
</label>
|
||||
<div id="live-reload-install-hint" class="w100" hidden></div>
|
||||
<div class="meta-description w100 hide-empty"></div>
|
||||
<div>
|
||||
<h3 i18n-text="author"></h3>
|
||||
<span class="meta-author"></span>
|
||||
</div>
|
||||
<div>
|
||||
<h3 i18n-text="license"></h3>
|
||||
<span class="meta-license"></span>
|
||||
</div>
|
||||
<div class="external-link hide-empty"></div>
|
||||
<div class="w100">
|
||||
<h3 i18n-text="appliesLabel"></h3>
|
||||
<ul class="applies-to">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="header-resizer" i18n-title="headerResizerHint"></div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="warnings"></div>
|
||||
</div>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" style="display: none !important;">
|
||||
|
|
|
@ -2,6 +2,8 @@ body {
|
|||
overflow: hidden;
|
||||
margin: 0;
|
||||
background: white;
|
||||
display: flex;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
a {
|
||||
|
@ -22,25 +24,29 @@ input:disabled + span {
|
|||
color: rgb(128, 128, 128);
|
||||
}
|
||||
|
||||
.container {
|
||||
display: flex;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
#header,
|
||||
.warnings {
|
||||
flex: 0 0 var(--header-width);
|
||||
box-sizing: border-box;
|
||||
padding: 1rem;
|
||||
box-shadow: 0 0 50px -18px black;
|
||||
word-break: break-all;
|
||||
overflow-wrap: break-word;
|
||||
overflow-y: auto;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
#header {
|
||||
--child-gap: 1rem;
|
||||
}
|
||||
#header-contents > :nth-last-child(n + 2) {
|
||||
margin-bottom: var(--child-gap);
|
||||
}
|
||||
#header.meta-init-error {
|
||||
display: none;
|
||||
}
|
||||
#header-contents ul {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.warnings {
|
||||
display: none;
|
||||
|
@ -72,26 +78,44 @@ input:disabled + span {
|
|||
|
||||
h1 {
|
||||
margin-top: 0;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
h1 small {
|
||||
.meta-name {
|
||||
margin-right: .5em;
|
||||
}
|
||||
.meta-version {
|
||||
font-size: 0.6em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.meta-version::before {
|
||||
content: " v";
|
||||
content: "v";
|
||||
}
|
||||
|
||||
.actions {
|
||||
margin-bottom: 1em;
|
||||
.checkbox-wrapper {
|
||||
padding-left: 16px;
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.actions label {
|
||||
max-width: -moz-fit-content;
|
||||
max-width: fit-content;
|
||||
.set-update-url p {
|
||||
word-break: break-all;
|
||||
opacity: .5;
|
||||
margin: .25em 0 0;
|
||||
}
|
||||
#install-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 0.5em 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
#install-wrapper > :nth-last-child(n + 2) {
|
||||
margin-right: .5rem;
|
||||
}
|
||||
#live-reload-install-hint {
|
||||
color: darkcyan;
|
||||
}
|
||||
.w100 {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.install {
|
||||
|
@ -107,7 +131,6 @@ h1 small {
|
|||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
border-style: none;
|
||||
margin-bottom: 1ex;
|
||||
cursor: pointer;
|
||||
box-shadow: inset 0 -1px 0 0 hsl(0, 0%, 24%), inset 0 1px 0 0 hsl(0, 0%, 30%), inset 1px 0 0 0 hsl(0, 0%, 24%);
|
||||
transition: color .25s, background-color .25s;
|
||||
|
@ -212,44 +235,25 @@ h1 small {
|
|||
filter: hue-rotate(-18deg) brightness(.7) contrast(2);
|
||||
}
|
||||
|
||||
.install.installed {
|
||||
display: none;
|
||||
}
|
||||
|
||||
h2.installed.active {
|
||||
display: inline-block;
|
||||
h2 {
|
||||
font-weight: bold;
|
||||
margin-top: 0;
|
||||
margin: 0;
|
||||
color: darkcyan;
|
||||
}
|
||||
h2.installed.active ~ .configure-usercss svg {
|
||||
.installed .configure-usercss svg {
|
||||
fill: hsl(180, 100%, 20%);
|
||||
}
|
||||
h2.installed.active ~ .configure-usercss:hover svg {
|
||||
.installed .configure-usercss:hover svg {
|
||||
fill: hsl(180, 100%, 30%);
|
||||
}
|
||||
|
||||
.actions label input {
|
||||
margin: 0 0.5em 0 0;
|
||||
flex: 0 0 auto;
|
||||
#header-contents > .hide-empty:empty,
|
||||
body:not(.installed) .install-show,
|
||||
.installed .install-hide {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.actions label span {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.set-update-url {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.set-update-url p {
|
||||
word-break: break-all;
|
||||
.installed .install-dim {
|
||||
opacity: .5;
|
||||
width: 100%;
|
||||
margin: .25em 0 .25em;
|
||||
}
|
||||
|
||||
label.set-prefer-scheme:not(.unavailable) {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.external {
|
||||
|
@ -270,8 +274,8 @@ li {
|
|||
|
||||
.main,
|
||||
.main .CodeMirror {
|
||||
height: 100% !important;
|
||||
width: 100% !important;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
border: none;
|
||||
}
|
||||
|
||||
|
@ -290,22 +294,13 @@ li {
|
|||
}
|
||||
|
||||
#header.meta-init > * {
|
||||
opacity: 1;
|
||||
transition: opacity .5s;
|
||||
-moz-user-select: auto;
|
||||
user-select: auto;
|
||||
}
|
||||
|
||||
#header.meta-init[data-arrived-fast="true"] > * {
|
||||
.meta-init[data-arrived-fast="true"] > * {
|
||||
transition-duration: .1s;
|
||||
}
|
||||
|
||||
label {
|
||||
/* FIXME: why do we want to give all labels a padding? */
|
||||
padding-left: 16px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.lds-spinner {
|
||||
top: 50px;
|
||||
opacity: .2;
|
||||
|
@ -316,7 +311,6 @@ label {
|
|||
.configure-usercss .svg-icon.config {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin-top: -3px;
|
||||
}
|
||||
#message-box.config-dialog {
|
||||
width: 0;
|
||||
|
@ -331,118 +325,74 @@ label {
|
|||
|
||||
@media (max-width: 850px) {
|
||||
body {
|
||||
overflow: hidden;
|
||||
}
|
||||
.container {
|
||||
flex-direction: column;
|
||||
}
|
||||
#header {
|
||||
flex: 0 1 auto;
|
||||
border-right: none;
|
||||
border-bottom: 1px dashed #AAA;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
padding: 0;
|
||||
min-height: 6rem;
|
||||
max-height: 40vh;
|
||||
resize: vertical;
|
||||
flex: 0 1 auto;
|
||||
--child-gap: .75rem;
|
||||
}
|
||||
#header:not(.meta-init) {
|
||||
min-height: 300px;
|
||||
}
|
||||
.main {
|
||||
flex: 1;
|
||||
}
|
||||
#header-content-wrapper {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
padding: .5rem 0 0 1rem;
|
||||
box-sizing: border-box;
|
||||
height: min-content;
|
||||
}
|
||||
#header-content-wrapper > * {
|
||||
flex-grow: 1;
|
||||
margin: 0;
|
||||
padding: 0 1rem .5rem 0;
|
||||
min-width: 0;
|
||||
}
|
||||
#header-content-wrapper > .meta-description + .flex-wrapper {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
padding: 0;
|
||||
}
|
||||
#header-content-wrapper > .meta-description + .flex-wrapper > * {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1;
|
||||
flex-wrap: wrap;
|
||||
white-space: nowrap;
|
||||
padding: 0 1rem .5rem 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.flex-wrapper ul {
|
||||
margin: 0;
|
||||
}
|
||||
#header-content-wrapper > .meta-description {
|
||||
flex-basis: 100%;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.actions {
|
||||
#header-contents {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
align-items: flex-start;
|
||||
}
|
||||
.set-update-url p {
|
||||
#header-contents > :not(.w100) {
|
||||
margin-right: 1rem;
|
||||
}
|
||||
.set-update-url {
|
||||
display: flex;
|
||||
white-space: nowrap;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.set-update-url p {
|
||||
margin: 0 0 0 1rem;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.actions label {
|
||||
min-width: 100px;
|
||||
flex: 1;
|
||||
}
|
||||
.actions label span {
|
||||
white-space: nowrap;
|
||||
}
|
||||
.has-warnings #header {
|
||||
min-height: 4em;
|
||||
max-height: 20%;
|
||||
}
|
||||
.warnings {
|
||||
max-height: 20%;
|
||||
}
|
||||
.warning:not(:last-child) {
|
||||
border-bottom: 1px dashed #b57c7c;
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
ul.applies-to,
|
||||
.actions label {
|
||||
margin: 0;
|
||||
}
|
||||
#header-content-wrapper > h1 {
|
||||
font-size: 1.75em;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
}
|
||||
#header-content-wrapper > h1 > .meta-version {
|
||||
padding-left: 3px;
|
||||
}
|
||||
#header-content-wrapper > h1 > .meta-name {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
#header-content-wrapper > * h3 {
|
||||
#header-contents h3 {
|
||||
margin: 0 0 .5rem;
|
||||
}
|
||||
.install {
|
||||
flex-shrink: 0;
|
||||
margin-right: 1em;
|
||||
}
|
||||
#message-box.config-dialog > div {
|
||||
top: auto;
|
||||
bottom: 3rem;
|
||||
}
|
||||
h1 {
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
.meta-name {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.main {
|
||||
height: auto;
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 850px) {
|
||||
#header {
|
||||
height: 100% !important; /* overrides user resize */
|
||||
}
|
||||
#ss-scheme > label {
|
||||
display: block;
|
||||
}
|
||||
.w100-full {
|
||||
width: 100%;
|
||||
margin-top: var(--child-gap);
|
||||
}
|
||||
}
|
||||
|
||||
/* Retina-specific stuff here */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global $ $create $createLink $$remove showSpinner */// dom.js
|
||||
/* global $$ $ $create $createLink $$remove showSpinner */// dom.js
|
||||
/* global API */// msg.js
|
||||
/* global URLS closeCurrentTab deepEqual */// toolbox.js
|
||||
/* global messageBox */
|
||||
|
@ -7,6 +7,9 @@
|
|||
/* global t */// localization.js
|
||||
'use strict';
|
||||
|
||||
const CFG_SEL = '#message-box.config-dialog';
|
||||
let cfgShown = true;
|
||||
|
||||
let cm;
|
||||
let initialUrl;
|
||||
let installed;
|
||||
|
@ -44,6 +47,7 @@ setTimeout(() => !cm && showSpinner($('#header')), 200);
|
|||
'/vendor/codemirror/keymap/emacs',
|
||||
'/vendor/codemirror/keymap/vim', // TODO: load conditionally
|
||||
'/vendor/codemirror/mode/css/css',
|
||||
'/vendor/codemirror/mode/stylus/stylus',
|
||||
'/vendor/codemirror/addon/search/searchcursor',
|
||||
'/vendor/codemirror/addon/fold/foldcode',
|
||||
'/vendor/codemirror/addon/fold/foldgutter',
|
||||
|
@ -63,6 +67,7 @@ setTimeout(() => !cm && showSpinner($('#header')), 200);
|
|||
|
||||
({tabId, initialUrl} = preinit);
|
||||
liveReload = initLiveReload();
|
||||
preinit.tpl.then(el => $('#ss-scheme').append(...$('[id=ss-scheme]', el).children));
|
||||
|
||||
const [
|
||||
{dup, style, error, sourceCode},
|
||||
|
@ -97,12 +102,10 @@ setTimeout(() => !cm && showSpinner($('#header')), 200);
|
|||
|
||||
// update UI
|
||||
if (versionTest < 0) {
|
||||
$('.actions').parentNode.insertBefore(
|
||||
$create('.warning', t('versionInvalidOlder')),
|
||||
$('.actions')
|
||||
);
|
||||
$('h1').after($create('.warning', t('versionInvalidOlder')));
|
||||
}
|
||||
$('button.install').onclick = () => {
|
||||
shouldShowConfig();
|
||||
(!dup ?
|
||||
Promise.resolve(true) :
|
||||
messageBox.confirm($create('span', t('styleInstallOverwrite', [
|
||||
|
@ -136,11 +139,9 @@ setTimeout(() => !cm && showSpinner($('#header')), 200);
|
|||
updateUrl.href.slice(0, 300) + '...';
|
||||
|
||||
// set prefer scheme
|
||||
const preferScheme = $('.set-prefer-scheme select');
|
||||
preferScheme.onchange = () => {
|
||||
style.preferScheme = preferScheme.value;
|
||||
$('#ss-scheme').onchange = e => {
|
||||
style.preferScheme = e.target.value;
|
||||
};
|
||||
preferScheme.onchange();
|
||||
|
||||
if (URLS.isLocalhost(initialUrl)) {
|
||||
$('.live-reload input').onchange = liveReload.onToggled;
|
||||
|
@ -170,41 +171,28 @@ function updateMeta(style, dup = installedDup) {
|
|||
!dup ? 'install' :
|
||||
versionTest > 0 ? 'update' :
|
||||
'reinstall');
|
||||
$('.set-update-url').title = dup && dup.updateUrl && t('installUpdateFrom', dup.updateUrl) || '';
|
||||
$('.set-update-url').title = dup && dup.updateUrl &&
|
||||
(t('installUpdateFrom', dup.updateUrl) || '').replace(/\S+$/, '\n$&');
|
||||
$('.meta-name').textContent = data.name;
|
||||
$('.meta-version').textContent = data.version;
|
||||
$('.meta-description').textContent = data.description;
|
||||
$('.set-prefer-scheme select').value =
|
||||
style.preferScheme === 'dark' ? 'dark' :
|
||||
style.preferScheme === 'light' ? 'light' : 'none';
|
||||
$$('#ss-scheme input').forEach(el => {
|
||||
el.checked = el.value === (style.preferScheme || 'none');
|
||||
});
|
||||
|
||||
if (data.author) {
|
||||
$('.meta-author').parentNode.style.display = '';
|
||||
$('.meta-author').textContent = '';
|
||||
$('.meta-author').appendChild(makeAuthor(data.author));
|
||||
} else {
|
||||
$('.meta-author').parentNode.style.display = 'none';
|
||||
}
|
||||
|
||||
$('.meta-license').parentNode.style.display = data.license ? '' : 'none';
|
||||
$('.meta-license').textContent = data.license;
|
||||
|
||||
$('.applies-to').textContent = '';
|
||||
replaceChildren($('.meta-author'), makeAuthor(data.author), true);
|
||||
replaceChildren($('.meta-license'), data.license, true);
|
||||
replaceChildren($('.external-link'), makeExternalLink());
|
||||
getAppliesTo(style).then(list =>
|
||||
$('.applies-to').append(...list.map(s => $create('li', s))));
|
||||
|
||||
$('.external-link').textContent = '';
|
||||
const externalLink = makeExternalLink();
|
||||
if (externalLink) {
|
||||
$('.external-link').appendChild(externalLink);
|
||||
}
|
||||
replaceChildren($('.applies-to'), list.map(s => $create('li', s))));
|
||||
|
||||
Object.assign($('.configure-usercss'), {
|
||||
hidden: !data.vars,
|
||||
onclick: openConfigDialog,
|
||||
});
|
||||
if (!data.vars) {
|
||||
$$remove('#message-box.config-dialog');
|
||||
cfgShown = false;
|
||||
$$remove(CFG_SEL);
|
||||
} else if (!deepEqual(data.vars, vars)) {
|
||||
vars = data.vars;
|
||||
// Use the user-customized vars from the installed style
|
||||
|
@ -214,6 +202,8 @@ function updateMeta(style, dup = installedDup) {
|
|||
v.value = dv.value;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (shouldShowConfig()) {
|
||||
openConfigDialog();
|
||||
}
|
||||
|
||||
|
@ -227,26 +217,26 @@ function updateMeta(style, dup = installedDup) {
|
|||
if (dup) enablePostActions();
|
||||
|
||||
function makeAuthor(text) {
|
||||
const match = text.match(/^(.+?)(?:\s+<(.+?)>)?(?:\s+\((.+?)\))?$/);
|
||||
const match = text && text.match(/^(.+?)(?:\s+<(.+?)>)?(?:\s+\((.+?)\))?$/);
|
||||
if (!match) {
|
||||
return document.createTextNode(text);
|
||||
return text;
|
||||
}
|
||||
const [, name, email, url] = match;
|
||||
const frag = document.createDocumentFragment();
|
||||
const elems = [];
|
||||
if (email) {
|
||||
frag.appendChild($createLink(`mailto:${email}`, name));
|
||||
elems.push($createLink(`mailto:${email}`, name));
|
||||
} else {
|
||||
frag.appendChild($create('span', name));
|
||||
elems.push($create('span', name));
|
||||
}
|
||||
if (url) {
|
||||
frag.appendChild($createLink(url,
|
||||
elems.push($createLink(url,
|
||||
$create('SVG:svg.svg-icon', {viewBox: '0 0 20 20'},
|
||||
$create('SVG:path', {
|
||||
d: 'M4,4h5v2H6v8h8v-3h2v5H4V4z M11,3h6v6l-2-2l-4,4L9,9l4-4L11,3z',
|
||||
}))
|
||||
));
|
||||
}
|
||||
return frag;
|
||||
return elems;
|
||||
}
|
||||
|
||||
function makeExternalLink() {
|
||||
|
@ -274,7 +264,7 @@ function updateMeta(style, dup = installedDup) {
|
|||
function showError(err) {
|
||||
$('.warnings').textContent = '';
|
||||
$('.warnings').classList.toggle('visible', Boolean(err));
|
||||
$('.container').classList.toggle('has-warnings', Boolean(err));
|
||||
document.body.classList.toggle('has-warnings', Boolean(err));
|
||||
err = Array.isArray(err) ? err : [err];
|
||||
if (err[0]) {
|
||||
let i;
|
||||
|
@ -310,12 +300,11 @@ function install(style) {
|
|||
$$remove('.warning');
|
||||
$('button.install').disabled = true;
|
||||
$('button.install').classList.add('installed');
|
||||
$('#live-reload-install-hint').classList.toggle('hidden', !liveReload.enabled);
|
||||
$('h2.installed').classList.add('active');
|
||||
$('.set-update-url input[type=checkbox]').disabled = true;
|
||||
$('#live-reload-install-hint').hidden = !liveReload.enabled;
|
||||
$('.set-update-url').title = style.updateUrl ?
|
||||
t('installUpdateFrom', style.updateUrl) : '';
|
||||
$('.set-prefer-scheme select').disabled = true;
|
||||
$$('.install-disable input').forEach(el => (el.disabled = true));
|
||||
document.body.classList.add('installed');
|
||||
enablePostActions();
|
||||
updateMeta(style);
|
||||
}
|
||||
|
@ -323,9 +312,7 @@ function install(style) {
|
|||
function enablePostActions() {
|
||||
const {id} = installed || installedDup;
|
||||
sessionStorage.justEditedStyleId = id;
|
||||
$('h2.installed').hidden = !installed;
|
||||
$('.installed-actions').hidden = false;
|
||||
$('.installed-actions a[href*="edit.html"]').search = `?id=${id}`;
|
||||
$('#edit').search = `?id=${id}`;
|
||||
$('#delete').onclick = async () => {
|
||||
if (await messageBox.confirm(t('deleteStyleConfirm'), 'danger center', t('confirmDelete'))) {
|
||||
await API.styles.delete(id);
|
||||
|
@ -434,3 +421,16 @@ function initLiveReload() {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
function shouldShowConfig() {
|
||||
// TODO: rewrite message-box to support multiple instances or find an existing tiny library
|
||||
const prev = cfgShown;
|
||||
cfgShown = $(CFG_SEL) != null;
|
||||
return prev && !cfgShown;
|
||||
}
|
||||
|
||||
function replaceChildren(el, children, toggleParent) {
|
||||
if (el.firstChild) el.textContent = '';
|
||||
if (children) el.append(...Array.isArray(children) ? children : [children]);
|
||||
if (toggleParent) el.parentNode.hidden = !el.firstChild;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* global API */// msg.js
|
||||
/* global closeCurrentTab download */// toolbox.js
|
||||
/* global t */// localization.js
|
||||
'use strict';
|
||||
|
||||
/* exported preinit */
|
||||
|
@ -89,5 +90,7 @@ const preinit = (() => {
|
|||
return {error, sourceCode};
|
||||
}
|
||||
})(),
|
||||
|
||||
tpl: t.fetchTemplate('/edit/settings.html', 'styleSettings'),
|
||||
};
|
||||
})();
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* global download */// toolbox.js
|
||||
'use strict';
|
||||
|
||||
//#region Exports
|
||||
|
@ -118,6 +119,16 @@ Object.assign(t, {
|
|||
return bin;
|
||||
},
|
||||
|
||||
async fetchTemplate(url, name) {
|
||||
let el = t.template[name];
|
||||
if (!el) {
|
||||
el = (await download(url, {responseType: 'document'})).body.firstElementChild;
|
||||
t.NodeList(el.getElementsByTagName('*'));
|
||||
t.template[name] = el;
|
||||
}
|
||||
return el;
|
||||
},
|
||||
|
||||
sanitizeHtml(root) {
|
||||
const toRemove = [];
|
||||
const walker = document.createTreeWalker(root);
|
||||
|
|
|
@ -438,7 +438,7 @@ function download(url, {
|
|||
const usoVars = [];
|
||||
return new Promise((resolve, reject) => {
|
||||
const xhr = new XMLHttpRequest();
|
||||
const u = new URL(collapseUsoVars(url));
|
||||
const u = new URL(collapseUsoVars(url), location);
|
||||
const onTimeout = () => {
|
||||
xhr.abort();
|
||||
reject(new Error('Timeout fetching ' + u.href));
|
||||
|
|
Loading…
Reference in New Issue
Block a user