diff options
| -rw-r--r-- | ext/bg/search.html | 3 | ||||
| -rw-r--r-- | ext/fg/float.html | 3 | ||||
| -rw-r--r-- | ext/mixed/css/display.css | 85 | ||||
| -rw-r--r-- | ext/mixed/js/display.js | 21 | 
4 files changed, 105 insertions, 7 deletions
| diff --git a/ext/bg/search.html b/ext/bg/search.html index 959979d9..7ba479ba 100644 --- a/ext/bg/search.html +++ b/ext/bg/search.html @@ -17,6 +17,7 @@  <body>  <div class="content scrollbar" id="content"><div class="content-body" id="content-body"> +    <div class="top-progress-bar-container"><div class="progress-bar-indeterminant" id="progress-indicator" hidden></div></div>      <div class="content-body-inner">          <span tabindex="-1" id="content-scroll-focus"></span> @@ -46,8 +47,6 @@              </div>          </div> -        <div id="spinner" hidden><img src="/mixed/img/spinner.gif"></div> -          <div class="scan-disable" id="query-parser-container">              <div id="query-parser-content"></div>          </div> diff --git a/ext/fg/float.html b/ext/fg/float.html index 174cfe42..0ee8fd7d 100644 --- a/ext/fg/float.html +++ b/ext/fg/float.html @@ -17,12 +17,11 @@  <div class="content-outer">  <div class="content scrollbar" id="content"><div class="content-body" id="content-body"> +    <div class="top-progress-bar-container"><div class="progress-bar-indeterminant" id="progress-indicator" hidden></div></div>      <div class="content-body-inner">          <span tabindex="-1" id="content-scroll-focus"></span> -        <div id="spinner" hidden><img src="/mixed/img/spinner.gif"></div> -          <div class="scan-disable" id="query-parser-container" hidden>              <div class="search-option" id="query-parser-mode-container" hidden>                  <select id="query-parser-mode-select"></select> diff --git a/ext/mixed/css/display.css b/ext/mixed/css/display.css index 09fc5703..24d143fc 100644 --- a/ext/mixed/css/display.css +++ b/ext/mixed/css/display.css @@ -45,6 +45,12 @@      --sidebar-button-icon-size-no-units: 16;      --sidebar-button-icon-size: calc(1em * (var(--sidebar-button-icon-size-no-units) / var(--font-size-no-units))); +    --progress-bar-height-no-units: 4; +    --progress-bar-height: calc(1em * (var(--progress-bar-height-no-units) / var(--font-size-no-units))); +    --progress-bar-active-transition-duration: 0.125s; +    --progress-bar-active-transition-start-delay: 0.0625s; +    --progress-bar-animation-duration: 2s; +      /* Colors */      --background-color: #ffffff;      --glossary-image-background-color: #eeeeee; @@ -88,6 +94,9 @@      --scrollbar-thumb-color: #c1c1c1;      --scrollbar-track-color: #f1f1f1; + +    --progress-bar-track-color: #cccccc; +    --progress-bar-indicator-color: #0275d8;  }  :root[data-yomichan-theme=dark] {      /* Colors */ @@ -133,6 +142,9 @@      --scrollbar-thumb-color: #444444;      --scrollbar-track-color: #2f2f2f; + +    --progress-bar-track-color: #3a3a3a; +    --progress-bar-indicator-color: #0275d8;  } @@ -1004,3 +1016,76 @@ button.action-button {  .kanji-glossary {      color: var(--dark-text-color);  } + + +/* Progress bar */ +@keyframes progress-bar-indeterminant1a { +    0% { left: 0; } +    25% { left: 0; } +    75% { left: 100%; } +    100% { left: 100%; } +} +@keyframes progress-bar-indeterminant1b { +    0% { right: 100%; } +    50% { right: 0; } +    100% { right: 0; } +} +@keyframes progress-bar-indeterminant2a { +    0% { left: 0; } +    25% { left: 0; } +    100% { left: 100%; } +} +@keyframes progress-bar-indeterminant2b { +    0% { right: 100%; } +    75% { right: 0; } +    100% { right: 0; } +} +.progress-bar-indeterminant { +    display: block; +    width: 100%; +    height: 0; +    background-color: var(--progress-bar-indicator-color); +    position: relative; +    transition: +        height var(--progress-bar-active-transition-duration) linear var(--progress-bar-active-transition-duration), +        background-color var(--progress-bar-active-transition-duration) linear; +} +.progress-bar-indeterminant[data-active=true] { +    height: var(--progress-bar-height); +    background-color: var(--progress-bar-track-color); +    transition: +        height var(--progress-bar-active-transition-duration) linear var(--progress-bar-active-transition-start-delay), +        background-color 0s linear; +} +.progress-bar-indeterminant[hidden]:not([data-active=true]) { +    display: none; +} +.progress-bar-indeterminant::before, +.progress-bar-indeterminant::after { +    content: ""; +    display: block; +    position: absolute; +    left: 0; +    top: 0; +    bottom: 0; +    right: 100%; +    background-color: var(--progress-bar-indicator-color); +    animation: none; +} +.progress-bar-indeterminant:not([hidden])::before { +    animation: +        progress-bar-indeterminant1a var(--progress-bar-animation-duration) infinite ease-in-out var(--progress-bar-active-transition-start-delay), +        progress-bar-indeterminant1b var(--progress-bar-animation-duration) infinite ease-in-out var(--progress-bar-active-transition-start-delay); +} +.progress-bar-indeterminant:not([hidden])::after { +    animation: +        progress-bar-indeterminant2a var(--progress-bar-animation-duration) infinite ease-in-out calc(var(--progress-bar-active-transition-start-delay) + 0.375 * var(--progress-bar-animation-duration)), +        progress-bar-indeterminant2b var(--progress-bar-animation-duration) infinite ease-in-out calc(var(--progress-bar-active-transition-start-delay) + 0.375 * var(--progress-bar-animation-duration)); +} +.top-progress-bar-container { +    position: sticky; +    top: 0; +    height: 0; +    pointer-events: none; +    z-index: 10; +} diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index cdff9389..7068d424 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -34,7 +34,6 @@  class Display extends EventDispatcher {      constructor() {          super(); -        this._spinner = document.querySelector('#spinner');          this._container = document.querySelector('#definitions');          this._definitions = [];          this._optionsContext = {depth: 0, url: window.location.href}; @@ -69,6 +68,8 @@ class Display extends EventDispatcher {          this._defaultTitleMaxLength = 1000;          this._fullQuery = '';          this._documentUtil = new DocumentUtil(); +        this._progressIndicator = document.querySelector('#progress-indicator'); +        this._progressIndicatorTimer = null;          this._progressIndicatorVisible = new DynamicProperty(false);          this._queryParserVisible = false;          this._queryParserVisibleOverride = null; @@ -563,8 +564,22 @@ class Display extends EventDispatcher {      }      _onProgressIndicatorVisibleChanged({value}) { -        if (this._spinner === null) { return; } -        this._spinner.hidden = !value; +        if (this._progressIndicatorTimer !== null) { +            clearTimeout(this._progressIndicatorTimer); +            this._progressIndicatorTimer = null; +        } + +        if (value) { +            this._progressIndicator.hidden = false; +            getComputedStyle(this._progressIndicator).getPropertyValue('display'); // Force update of CSS display property, allowing animation +            this._progressIndicator.dataset.active = 'true'; +        } else { +            this._progressIndicator.dataset.active = 'false'; +            this._progressIndicatorTimer = setTimeout(() => { +                this._progressIndicator.hidden = true; +                this._progressIndicatorTimer = null; +            }, 250); +        }      }      _onWindowFocus() { |