From 851ab47f8adb2d04555c28fceae371e038d90a40 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 20 Nov 2022 21:50:59 +0000 Subject: [PATCH] Fixed input styles in search preview mode, added animation Also added JS handlers for hiding the suggestions --- resources/js/components/global-search.js | 27 ++++++++++++++-- resources/sass/_animations.scss | 16 ++++----- resources/sass/_components.scss | 27 ---------------- resources/sass/_header.scss | 41 ++++++++++++++++++++++++ resources/views/common/header.blade.php | 1 + 5 files changed, 74 insertions(+), 38 deletions(-) diff --git a/resources/js/components/global-search.js b/resources/js/components/global-search.js index b351278d6..0af3ed375 100644 --- a/resources/js/components/global-search.js +++ b/resources/js/components/global-search.js @@ -6,6 +6,7 @@ import {htmlToDom} from "../services/dom"; class GlobalSearch { setup() { + this.container = this.$el; this.input = this.$refs.input; this.suggestions = this.$refs.suggestions; this.suggestionResultsWrap = this.$refs.suggestionResults; @@ -14,6 +15,8 @@ class GlobalSearch { } setupListeners() { + this.hideOnOuterEventListener = this.hideOnOuterEventListener.bind(this); + this.input.addEventListener('input', () => { const value = this.input.value; if (value.length > 0) { @@ -33,15 +36,35 @@ class GlobalSearch { child.remove(); } - this.suggestions.style.display = 'block'; this.suggestionResultsWrap.innerHTML = ''; this.suggestionResultsWrap.append(resultDom); + if (!this.container.classList.contains('search-active')) { + this.showSuggestions(); + } + } + + showSuggestions() { + this.container.classList.add('search-active'); + document.addEventListener('click', this.hideOnOuterEventListener); + document.addEventListener('focusin', this.hideOnOuterEventListener); + window.requestAnimationFrame(() => { + this.suggestions.classList.add('search-suggestions-animation'); + }) } hideSuggestions() { - this.suggestions.style.display = null; + this.container.classList.remove('search-active'); + this.suggestions.classList.remove('search-suggestions-animation'); this.suggestionResultsWrap.innerHTML = ''; + document.removeEventListener('click', this.hideOnOuterEventListener); + document.removeEventListener('focusin', this.hideOnOuterEventListener); } + + hideOnOuterEventListener(event) { + if (!this.container.contains(event.target)) { + this.hideSuggestions(); + } + }; } export default GlobalSearch; \ No newline at end of file diff --git a/resources/sass/_animations.scss b/resources/sass/_animations.scss index 85fd96206..ca4977a89 100644 --- a/resources/sass/_animations.scss +++ b/resources/sass/_animations.scss @@ -16,23 +16,21 @@ } } -.anim.searchResult { - opacity: 0; - transform: translate3d(580px, 0, 0); - animation-name: searchResult; - animation-duration: 220ms; +.search-suggestions-animation{ + animation-name: searchSuggestions; + animation-duration: 180ms; animation-fill-mode: forwards; animation-timing-function: cubic-bezier(.62, .28, .23, .99); } -@keyframes searchResult { +@keyframes searchSuggestions { 0% { - opacity: 0; - transform: translate3d(400px, 0, 0); + opacity: .5; + transform: scale(0.9); } 100% { opacity: 1; - transform: translate3d(0, 0, 0); + transform: scale(1); } } diff --git a/resources/sass/_components.scss b/resources/sass/_components.scss index 31ec6a2c0..66d76aaa2 100644 --- a/resources/sass/_components.scss +++ b/resources/sass/_components.scss @@ -1010,31 +1010,4 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group { border: 1px solid #b4b4b4; box-shadow: 0 1px 1px rgba(0, 0, 0, .2), 0 2px 0 0 rgba(255, 255, 255, .7) inset; color: #333; -} - -.global-search-suggestions { - display: none; - position: absolute; - top: -$-s; - left: 0; - right: 0; - z-index: -1; - margin-left: -$-xxl; - margin-right: -$-xxl; - padding-top: 56px; - border-radius: 3px; - box-shadow: $bs-hover; - .entity-item-snippet p { - display: none; - } - .entity-item-snippet { - font-size: .8rem; - } - .entity-list-item-name { - font-size: .9rem; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - overflow: hidden; - } } \ No newline at end of file diff --git a/resources/sass/_header.scss b/resources/sass/_header.scss index e0b494e77..5e57047df 100644 --- a/resources/sass/_header.scss +++ b/resources/sass/_header.scss @@ -135,6 +135,47 @@ header .search-box { } } +.global-search-suggestions { + display: none; + position: absolute; + top: -$-s; + left: 0; + right: 0; + z-index: -1; + margin-left: -$-xxl; + margin-right: -$-xxl; + padding-top: 56px; + border-radius: 3px; + box-shadow: $bs-hover; + transform-origin: top center; + opacity: .5; + transform: scale(0.9); + .entity-item-snippet p { + display: none; + } + .entity-item-snippet { + font-size: .8rem; + } + .entity-list-item-name { + font-size: .9rem; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + } +} +.search-active .global-search-suggestions { + display: block; +} +header .search-box.search-active input { + background-color: #EEE; + color: #444; + border-color: #DDD; +} +header .search-box.search-active #header-search-box-button { + color: #444; +} + .logo { display: inline-flex; padding: ($-s - 6px) $-s; diff --git a/resources/views/common/header.blade.php b/resources/views/common/header.blade.php index 1340be26d..5d94deee7 100644 --- a/resources/views/common/header.blade.php +++ b/resources/views/common/header.blade.php @@ -26,6 +26,7 @@ type="text" name="term" data-shortcut="global_search" + autocomplete="off" aria-label="{{ trans('common.search') }}" placeholder="{{ trans('common.search') }}" value="{{ $searchTerm ?? '' }}">