f9db43a2e9
* Add key * Add: a second index uuid, push changes to sync controller * Add: sync.js * Add: tokenManager * Change: log entire body for http error * Add: token flow * Fix: minor * Fix: move cleanup to stop function * Add: syncNow * Update dependencies * Fix: handle 401 error * Add: handle 401 error * Fix: then -> catch * Add: sync options to options page * Update db-to-cloud * Change: make prefs.set return a promise * Add: disble selector if connected * Add: update selector state * Fix: return promise in prefs.set * Fix: manage complex state * Fix: handle prefs change * Change: manage sync status in background * Add: show current status in the UI * Add: schedule a faster sync when db changed * Update dependencies * Add: include progress in sync status * Add: more detail status * Show status text only * Bump dependencies * Change: show loaded and total * Fix: syncTarget is undefined * Add: google and onedrive * Fix: token is not reused * Bump dependencies * Don't use minified version since it is hard to debug * Fix: expire time is incorrect * Change: switch google to code flow * Bump dependencies * Change: only modify pref if the initialization success? * Don't stop the sync if the first sync is not triggered by the user * Add: implement refresh token * Change: switch microsoft to code flow * Add: subtract expire with a latency * Add: microsoft client secret * Add: display error message * Fix: fromPref is not used * Change: try to revoke the token when log out * Add: revoke dropbox token * Fix: Google only generates one refresh token for one user by default * Bump dependencies, fix onedrive list issue * Fix: arguments sent to sync.put is wrong * Fix: don't schedule a sync on db changed if not connected * Bump dependencies. Fix issue of switching drives * Bump db-to-cloud, fix switching drive issue * Fix: only auth user on 401 error, don't display login window without user interaction * Fix: don't call revoke() if token is undefined * Add: login button to generate the access token interactively * Fix: make addMissingProperties a local * Fix: store missing props in an object * Fix: sync.getStatus should be sync * LATENCY -> NETWORK_LATENCY * Fix: cache the token forever if there is no expire time e.g. dropbox * Add some comments * Fix: i18n * Fix: i18n sync status * fixup! Fix: i18n sync status * Fix: 'sync to cloud' is displayed twice
325 lines
5.2 KiB
CSS
325 lines
5.2 KiB
CSS
html.opera {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 100%;
|
|
}
|
|
|
|
html.opera body {
|
|
width: auto;
|
|
}
|
|
|
|
body {
|
|
background: #fff;
|
|
margin: 0;
|
|
font-family: "Helvetica Neue", Helvetica, sans-serif;
|
|
font-size: 12px;
|
|
min-width: 480px;
|
|
max-width: 800px;
|
|
width: max-content;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
@supports (-moz-appearance:none) {
|
|
body {
|
|
--addons-page-left-padding: 6px;
|
|
/* compensate 'html.firefox .block' padding-left */
|
|
width: calc(100% - var(--addons-page-left-padding));
|
|
/* match the default FF theme */
|
|
background-color: #f9f9fa;
|
|
}
|
|
html.firefox .block {
|
|
padding-left: var(--addons-page-left-padding);
|
|
}
|
|
}
|
|
|
|
.firefox .chromium-only,
|
|
.chromium-only.chrome-no-popup-border {
|
|
display: none;
|
|
}
|
|
|
|
.block {
|
|
display: flex;
|
|
align-items: center;
|
|
margin: 1em 0;
|
|
border-bottom: 1px dotted #ccc;
|
|
padding: 0 16px .75em;
|
|
position: relative;
|
|
}
|
|
|
|
.block:nth-last-child(2) {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.block:last-child {
|
|
border-bottom: none;
|
|
padding-bottom: 0;
|
|
}
|
|
|
|
.collapsed, .collapsible h1 {
|
|
cursor: pointer;
|
|
}
|
|
|
|
.collapsed .items {
|
|
display: none;
|
|
}
|
|
|
|
h1 {
|
|
min-width: 30%;
|
|
width: 30%;
|
|
margin: 0;
|
|
font-size: 120%;
|
|
font-weight: bold;
|
|
padding-right: 8px;
|
|
box-sizing: border-box;
|
|
overflow-wrap: break-word;
|
|
}
|
|
|
|
.items {
|
|
min-width: 70%;
|
|
width: 70%;
|
|
}
|
|
|
|
label {
|
|
display: flex;
|
|
margin: .25ex 0;
|
|
align-items: center;
|
|
}
|
|
|
|
label > :first-child {
|
|
margin-right: 8px;
|
|
flex-grow: 1;
|
|
}
|
|
|
|
label:not([disabled]) > :first-child {
|
|
cursor: default;
|
|
}
|
|
|
|
label:not([disabled]):hover > :first-child {
|
|
text-shadow: 0 0 0.01px rgba(0, 0, 0, .25);
|
|
cursor: pointer;
|
|
}
|
|
|
|
input[type=number],
|
|
input[type="color"],
|
|
select,
|
|
.onoffswitch {
|
|
width: 60px;
|
|
box-sizing: border-box;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
button {
|
|
text-align: center;
|
|
}
|
|
|
|
input[type=number] {
|
|
text-align: right;
|
|
}
|
|
|
|
input[type=number]:invalid {
|
|
background-color: rgba(255, 0, 0, 0.1);
|
|
color: darkred;
|
|
}
|
|
|
|
input[type="color"] {
|
|
box-sizing: border-box;
|
|
height: 2em;
|
|
}
|
|
|
|
.iconset {
|
|
display: flex;
|
|
}
|
|
|
|
.iconset input {
|
|
display: block;
|
|
}
|
|
|
|
.iconset input[type="radio"] {
|
|
margin: 2px 4px 0 0;
|
|
}
|
|
|
|
#actions {
|
|
justify-content: space-around;
|
|
align-items: stretch;
|
|
padding: 1em;
|
|
white-space: nowrap;
|
|
background-color: rgba(0, 0, 0, .05);
|
|
margin: 0;
|
|
}
|
|
|
|
.firefox #actions,
|
|
.opera #actions {
|
|
background-color: transparent;
|
|
}
|
|
|
|
#actions button {
|
|
width: auto;
|
|
}
|
|
|
|
#actions button:not(:last-child) {
|
|
margin-right: 8px;
|
|
}
|
|
|
|
[data-cmd="check-updates"] button {
|
|
position: relative;
|
|
}
|
|
|
|
.update-in-progress [data-cmd="check-updates"] {
|
|
opacity: .5;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.update-in-progress #update-progress {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
bottom: 0;
|
|
background-color: currentColor;
|
|
content: "";
|
|
opacity: .35;
|
|
}
|
|
|
|
#updates-installed {
|
|
position: absolute;
|
|
font-size: 85%;
|
|
margin-top: 1px;
|
|
}
|
|
|
|
#updates-installed::after {
|
|
content: attr(data-value);
|
|
margin-left: .5ex;
|
|
font-weight: bold;
|
|
}
|
|
|
|
#updates-installed:not([data-value]),
|
|
#updates-installed[data-value=""] {
|
|
display: none;
|
|
}
|
|
|
|
#advanced.collapsible.collapsed {
|
|
height: 30px;
|
|
padding: 0;
|
|
margin: 0;
|
|
justify-content: center;
|
|
}
|
|
|
|
html:not(.firefox):not(.opera) #updates {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
#advanced.collapsible:not(.collapsed) {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
#advanced.collapsible:not(.collapsed) .collapsible-resizer,
|
|
#advanced:not(.collapsible) .collapsible-resizer {
|
|
padding-right: 8px;
|
|
box-sizing: border-box;
|
|
min-width: 30%;
|
|
width: 30%;
|
|
}
|
|
|
|
#advanced.collapsible h1 {
|
|
width: unset;
|
|
padding: 0;
|
|
color: #333;
|
|
transition: color .5s;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
}
|
|
|
|
#advanced:not(.collapsible) .collapsible-resizer h1 {
|
|
width: unset;
|
|
padding: 0;
|
|
display: inline-flex;
|
|
}
|
|
|
|
#advanced.collapsible:not(.collapsed) h1:hover {
|
|
color: #666;
|
|
}
|
|
|
|
#advanced.collapsible.collapsed h1 {
|
|
padding: 0;
|
|
color: #666;
|
|
}
|
|
|
|
#advanced.collapsible.collapsed:hover h1 {
|
|
color: #333;
|
|
}
|
|
|
|
.collapsible-resizer .svg-icon {
|
|
fill: #333;
|
|
transition: fill .5s;
|
|
height: 16px;
|
|
width: 16px;
|
|
}
|
|
|
|
#advanced.collapsible.collapsed .collapsible-resizer .svg-icon,
|
|
#advanced.collapsible:not(.collapsed) .collapsible-resizer h1:hover .svg-icon {
|
|
fill: #666;
|
|
}
|
|
|
|
#advanced.collapsible.collapsed:hover .collapsible-resizer .svg-icon {
|
|
fill: #333;
|
|
}
|
|
|
|
#advanced.collapsible h1 .svg-icon {
|
|
margin-left: 2px;
|
|
}
|
|
|
|
#advanced.collapsible.collapsed .is-expanded,
|
|
#advanced:not(.collapsible) .collapsible-resizer .svg-icon {
|
|
display: none;
|
|
}
|
|
|
|
#advanced.collapsible:not(.collapsed) .is-collapsed {
|
|
display: none;
|
|
}
|
|
|
|
.svg-inline-wrapper .svg-icon {
|
|
width: 16px;
|
|
height: 16px;
|
|
fill: #666;
|
|
vertical-align: sub;
|
|
}
|
|
|
|
.svg-inline-wrapper:hover .svg-icon {
|
|
fill: #000;
|
|
}
|
|
|
|
#message-box.note > div {
|
|
max-width: calc(100vw - 6rem);
|
|
}
|
|
|
|
.opera #message-box.note,
|
|
.firefox #message-box.note {
|
|
background-color: transparent;
|
|
}
|
|
|
|
@keyframes fadeinout {
|
|
0% { opacity: 0 }
|
|
10% { opacity: 1 }
|
|
25% { opacity: 1 }
|
|
100% { opacity: 0 }
|
|
}
|
|
|
|
@media (hover: none) {
|
|
.expanded-note {
|
|
font-size: 90%;
|
|
white-space: normal;
|
|
color: #666;
|
|
margin-top: .5em;
|
|
hyphens: auto;
|
|
}
|
|
}
|
|
|
|
.sync-status {
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
.sync-status::first-letter {
|
|
text-transform: uppercase;
|
|
}
|