diff options
-rw-r--r-- | ext/fg/float.html | 17 | ||||
-rw-r--r-- | ext/fg/js/float.js | 6 | ||||
-rw-r--r-- | ext/mixed/css/display.css | 165 | ||||
-rw-r--r-- | ext/mixed/js/display.js | 43 |
4 files changed, 189 insertions, 42 deletions
diff --git a/ext/fg/float.html b/ext/fg/float.html index dc3e159a..818bee32 100644 --- a/ext/fg/float.html +++ b/ext/fg/float.html @@ -15,17 +15,13 @@ </head> <body> +<div class="content-outer"> <div class="content" id="content"><div class="content-body" id="content-body"> <span tabindex="-1" id="content-scroll-focus"></span> <div id="spinner" hidden><img src="/mixed/img/spinner.gif"></div> - <div id="navigation-header" class="navigation-header" hidden><div class="navigation-header-actions"> - <button class="action-button action-previous" data-icon="source-term" title="Source term (Alt + B)"></button> - <button class="action-button action-next" data-icon="source-term" title="Next term (Alt + F)"></button> - </div></div><div class="navigation-header-spacer"></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> @@ -52,6 +48,17 @@ </div> </div></div> +<div class="content-sidebar" id="content-sidebar" hidden><div class="content-sidebar-inner"> + <div class="content-sidebar-top"> + <button class="sidebar-button danger" id="close-button" title="Close popup"><span class="sidebar-button-icon" data-icon="cross"></span></button> + <button class="sidebar-button" disabled id="navigate-previous-button" title="Previous definition (Alt + B)"><span class="sidebar-button-icon" data-icon="left-chevron"></span></button> + <button class="sidebar-button" disabled id="navigate-next-button" title="Next definition (Alt + F)"><span class="sidebar-button-icon" data-icon="right-chevron"></span></button> + </div> + <div class="content-sidebar-bottom"> + <!--<button class="sidebar-button" id="profile-button"><span class="sidebar-button-icon" data-icon="profile"></span></button>--> + </div> +</div></div> +</div> <!-- Scripts --> <script src="/mixed/js/core.js"></script> diff --git a/ext/fg/js/float.js b/ext/fg/js/float.js index 9f58439f..bc555ffd 100644 --- a/ext/fg/js/float.js +++ b/ext/fg/js/float.js @@ -63,7 +63,7 @@ class DisplayFloat extends Display { } onEscape() { - this._invokeOwner('closePopup'); + this.close(); } async getDocumentTitle() { @@ -83,6 +83,10 @@ class DisplayFloat extends Display { return data.data; } + close() { + this._invokeOwner('closePopup'); + } + // Message handling _onWindowMessage(e) { diff --git a/ext/mixed/css/display.css b/ext/mixed/css/display.css index f6317d54..5a8c0212 100644 --- a/ext/mixed/css/display.css +++ b/ext/mixed/css/display.css @@ -38,6 +38,13 @@ --entry-padding: 0.72em; + --sidebar-width-no-units: 40; + --sidebar-width: calc(1em * (var(--sidebar-width-no-units) / var(--font-size-no-units))); + --sidebar-button-height-no-units: 30; + --sidebar-button-height: calc(1em * (var(--sidebar-button-height-no-units) / var(--font-size-no-units))); + --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))); + /* Colors */ --background-color: #ffffff; --glossary-image-background-color: #eeeeee; @@ -66,6 +73,18 @@ --tag-part-of-speech-background-color: #565656; --tag-search-background-color: #8a8a91; --tag-pitch-accent-dictionary-background-color: #6640be; + + --sidebar-background-color: #f8f9fa; + + --sidebar-button-background-color: transparent; + --sidebar-button-background-color-hover: #cccccc; + --sidebar-button-background-color-active: #aaaaaa; + --sidebar-button-danger-background-color: transparent; + --sidebar-button-danger-background-color-hover: #dd2222; + --sidebar-button-danger-background-color-active: #bb2222; + --sidebar-button-icon-color: #333333; + --sidebar-button-disabled-icon-color: #888888; + --sidebar-button-danger-icon-color: #ffffff; } :root[data-yomichan-theme=dark] { /* Colors */ @@ -96,6 +115,18 @@ --tag-part-of-speech-background-color: #565656; --tag-search-background-color: #69696e; --tag-pitch-accent-dictionary-background-color: #6640be; + + --sidebar-background-color: #282828; + + --sidebar-button-background-color: transparent; + --sidebar-button-background-color-hover: #3a3a3a; + --sidebar-button-background-color-active: #5a5a5a; + --sidebar-button-danger-background-color: transparent; + --sidebar-button-danger-background-color-hover: #dd2222; + --sidebar-button-danger-background-color-active: #bb2222; + --sidebar-button-icon-color: #cccccc; + --sidebar-button-disabled-icon-color: #777777; + --sidebar-button-danger-icon-color: #ffffff; } @@ -172,39 +203,125 @@ a { } -/* Navigation */ -.navigation-header { - top: 0; - left: 0; +/* Sidebar layout */ +.content-outer { width: 100%; - height: 2.1em; - box-sizing: border-box; - padding: 0.25em 0.5em; - border-bottom: var(--thin-border-size) solid var(--light-border-color); - background-color: var(--background-color); - z-index: 10; + height: 100%; + display: flex; + flex-flow: row nowrap; + overflow: hidden; + align-items: stretch; + justify-content: center; +} +.content-sidebar { + flex: 0 0 auto; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + background-color: var(--sidebar-background-color); + z-index: 1; + position: relative; + display: block; } -.navigation-header-actions { +.content-sidebar[hidden] { + display: none; +} +.content-sidebar[hidden][data-has-navigation-previous=true], +.content-sidebar[hidden][data-has-navigation-next=true] { + display: block; +} +.content-sidebar-inner { display: flex; + flex-flow: column nowrap; + width: var(--sidebar-width); + height: 100%; } -.navigation-header:not([data-has-previous=true]) .navigation-header-actions .action-button.action-previous::before, -.navigation-header:not([data-has-next=true]) .navigation-header-actions .action-button.action-next::before { - opacity: 0.25; - -webkit-filter: grayscale(100%); - filter: grayscale(100%); +.content-sidebar-top { + flex: 1 1 auto; + display: flex; + flex-flow: column nowrap; } -.action-button.action-next::before { - transform: scaleX(-1); +.content-sidebar-bottom { + position: sticky; + bottom: 0; + background-color: var(--sidebar-background-color); + display: flex; + flex-flow: column nowrap; } -:root[data-yomichan-page=search] .navigation-header { - position: sticky; + +/* Sidebar buttons */ +button.sidebar-button { + width: 100%; + height: var(--sidebar-button-height); + background-color: var(--sidebar-button-background-color); + margin: 0; + padding: 0; + border: 0; + cursor: pointer; + display: block; + transition: background-color 0.125s ease-in-out; + outline: none; + font-size: inherit; } -:root[data-yomichan-page=float] .navigation-header { - position: fixed; +button.sidebar-button:disabled { + cursor: default; +} +button.sidebar-button:hover:not(:disabled) { + background-color: var(--sidebar-button-background-color-hover); +} +button.sidebar-button:active:not(:disabled) { + background-color: var(--sidebar-button-background-color-active); } -:root[data-yomichan-page=float] .navigation-header:not([hidden])~.navigation-header-spacer { - height: 2.1em; +button.sidebar-button.danger { + background-color: var(--sidebar-button-danger-background-color); +} +button.sidebar-button.danger:hover:not(:disabled) { + background-color: var(--sidebar-button-danger-background-color-hover); +} +button.sidebar-button.danger:active:not(:disabled) { + background-color: var(--sidebar-button-danger-background-color-active); +} +.sidebar-button-icon { + display: block; + width: 100%; + height: 100%; + mask-repeat: no-repeat; + mask-position: center center; + mask-mode: alpha; + mask-size: var(--sidebar-button-icon-size) var(--sidebar-button-icon-size); + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center center; + -webkit-mask-mode: alpha; + -webkit-mask-size: var(--sidebar-button-icon-size) var(--sidebar-button-icon-size); + background-color: var(--sidebar-button-icon-color); + transition: background-color 0.125s ease-in-out; +} +button.sidebar-button:disabled .sidebar-button-icon { + background-color: var(--sidebar-button-disabled-icon-color); +} +button.sidebar-button.danger:hover .sidebar-button-icon { + background-color: var(--sidebar-button-danger-icon-color); +} +.sidebar-button-icon[data-icon=cross] { + mask-image: url(/mixed/img/cross.svg); + -webkit-mask-image: url(/mixed/img/cross.svg); +} +.sidebar-button-icon[data-icon=left-chevron] { + mask-image: url(/mixed/img/left-chevron.svg); + -webkit-mask-image: url(/mixed/img/left-chevron.svg); +} +.sidebar-button-icon[data-icon=right-chevron] { + mask-image: url(/mixed/img/right-chevron.svg); + -webkit-mask-image: url(/mixed/img/right-chevron.svg); +} +.sidebar-button-icon[data-icon=kebab-menu] { + mask-image: url(/mixed/img/kebab-menu.svg); + -webkit-mask-image: url(/mixed/img/kebab-menu.svg); +} +.sidebar-button-icon[data-icon=profile] { + mask-image: url(/mixed/img/profile.svg); + -webkit-mask-image: url(/mixed/img/profile.svg); } diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index f79ba303..2ee5b608 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -90,6 +90,10 @@ class Display extends EventDispatcher { this._contentScrollBodyElement = document.querySelector('#content-body'); this._contentScrollFocusElement = document.querySelector('#content-scroll-focus'); this._windowScroll = new WindowScroll(this._contentScrollElement); + this._contentSidebar = document.querySelector('#content-sidebar'); + this._closeButton = document.querySelector('#close-button'); + this._navigationPreviousButton = document.querySelector('#navigate-previous-button'); + this._navigationNextButton = document.querySelector('#navigate-next-button'); this.registerActions([ ['close', () => { this.onEscape(); }], @@ -406,6 +410,10 @@ class Display extends EventDispatcher { return query; } + close() { + // NOP + } + // Message handlers _onMessage({action, params}, sender, callback) { @@ -543,6 +551,11 @@ class Display extends EventDispatcher { this.setContent(details); } + _onCloseButtonClick(e) { + e.preventDefault(); + this.close(); + } + _onSourceTermView(e) { e.preventDefault(); this._sourceTermView(); @@ -769,16 +782,16 @@ class Display extends EventDispatcher { this._interactive = interactive; if (interactive) { - const actionPrevious = document.querySelector('.action-previous'); - const actionNext = document.querySelector('.action-next'); - this._persistentEventListeners.addEventListener(document, 'keydown', this.onKeyDown.bind(this), false); this._persistentEventListeners.addEventListener(document, 'wheel', this._onWheel.bind(this), {passive: false}); - if (actionPrevious !== null) { - this._persistentEventListeners.addEventListener(actionPrevious, 'click', this._onSourceTermView.bind(this)); + if (this._closeButton !== null) { + this._persistentEventListeners.addEventListener(this._closeButton, 'click', this._onCloseButtonClick.bind(this)); + } + if (this._navigationPreviousButton !== null) { + this._persistentEventListeners.addEventListener(this._navigationPreviousButton, 'click', this._onSourceTermView.bind(this)); } - if (actionNext !== null) { - this._persistentEventListeners.addEventListener(actionNext, 'click', this._onNextTermView.bind(this)); + if (this._navigationNextButton !== null) { + this._persistentEventListeners.addEventListener(this._navigationNextButton, 'click', this._onNextTermView.bind(this)); } } else { this._persistentEventListeners.removeAllEventListeners(); @@ -943,7 +956,7 @@ class Display extends EventDispatcher { errorExtensionUnloaded.hidden = false; } - this._updateNavigation(null, null); + this._updateNavigation(false, false); this._setNoContentVisible(false); this._setTitleText(''); } @@ -984,10 +997,16 @@ class Display extends EventDispatcher { } _updateNavigation(previous, next) { - if (this._navigationHeader === null) { return; } - this._navigationHeader.hidden = !(previous || next); - this._navigationHeader.dataset.hasPrevious = `${!!previous}`; - this._navigationHeader.dataset.hasNext = `${!!next}`; + if (this._contentSidebar !== null) { + this._contentSidebar.dataset.hasNavigationPrevious = `${previous}`; + this._contentSidebar.dataset.hasNavigationNext = `${next}`; + } + if (this._navigationPreviousButton !== null) { + this._navigationPreviousButton.disabled = !previous; + } + if (this._navigationNextButton !== null) { + this._navigationNextButton.disabled = !next; + } } async _updateAdderButtons(token, isTerms, definitions) { |