diff --git a/app/assets/javascripts/discourse/app/components/header.gjs b/app/assets/javascripts/discourse/app/components/header.gjs
index 524bcc0604b..439a4c901e2 100644
--- a/app/assets/javascripts/discourse/app/components/header.gjs
+++ b/app/assets/javascripts/discourse/app/components/header.gjs
@@ -116,6 +116,7 @@ export default class GlimmerHeader extends Component {
handleAnimationComplete() {
this.hasClosingAnimation = false;
this.search.visible = false;
+ this.toggleBodyScrolling(false);
}
@action
@@ -169,9 +170,11 @@ export default class GlimmerHeader extends Component {
}
if (this.site.mobileView && this.search.visible) {
+ // hide is delayed for the duration of `search-slide-out` animation
this.hasClosingAnimation = true;
} else {
this.search.visible = !this.search.visible;
+ this.toggleBodyScrolling(true);
}
if (!this.search.visible) {
diff --git a/app/assets/javascripts/discourse/app/components/search-menu.gjs b/app/assets/javascripts/discourse/app/components/search-menu.gjs
index 4d16d984d83..5932d0c8806 100644
--- a/app/assets/javascripts/discourse/app/components/search-menu.gjs
+++ b/app/assets/javascripts/discourse/app/components/search-menu.gjs
@@ -188,9 +188,7 @@ export default class SearchMenu extends Component {
}
@bind
- clearSearch(e) {
- e.stopPropagation();
- e.preventDefault();
+ clearSearch() {
this.search.activeGlobalSearchTerm = "";
this.search.focusSearchInput();
this.triggerSearch();
@@ -471,8 +469,8 @@ export default class SearchMenu extends Component {
{{/if}}
diff --git a/app/assets/javascripts/discourse/app/components/search-menu/advanced-button.gjs b/app/assets/javascripts/discourse/app/components/search-menu/advanced-button.gjs
index e9db1ad774d..092dbe68e97 100644
--- a/app/assets/javascripts/discourse/app/components/search-menu/advanced-button.gjs
+++ b/app/assets/javascripts/discourse/app/components/search-menu/advanced-button.gjs
@@ -3,7 +3,7 @@ import { i18n } from "discourse-i18n";
-
- {{icon "xmark"}}
-
+ @action={{@clearSearch}}
+ @icon="xmark"
+ />
diff --git a/app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js b/app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js
index 5fb7fa67b83..b9235ad4a61 100644
--- a/app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js
+++ b/app/assets/javascripts/discourse/app/modifiers/delayed-destroy.js
@@ -15,7 +15,7 @@ export default modifier(
(
element,
posArgs,
- { animate = false, onComplete = () => {}, elementSelector, delay = 300 }
+ { animate = false, onComplete = () => {}, elementSelector, delay = 200 }
) => {
if (animate) {
const targetEl = elementSelector
diff --git a/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js b/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js
index d394623fc93..bd914b8f5b7 100644
--- a/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js
+++ b/app/assets/javascripts/discourse/tests/acceptance/search-mobile-test.js
@@ -52,7 +52,7 @@ acceptance("Search - Mobile", function (needs) {
"search results are listed on search value present"
);
- await click('[data-test-anchor="clear-search-input"]');
+ await click('[data-test-button="clear-search-input"]');
assert
.dom('[data-test-selector="search-menu-results"]')
@@ -64,7 +64,7 @@ acceptance("Search - Mobile", function (needs) {
test("with empty input search", async function (assert) {
await visit("/");
await click("#search-button");
- await click('[data-test-button="cancel-search-mobile"]');
+ await click('[data-test-button="cancel-mobile-search"]');
assert
.dom('[data-test-selector="menu-panel"]')
@@ -82,7 +82,7 @@ acceptance("Search - Mobile", function (needs) {
"search results are listed on search value present"
);
- await click('[data-test-button="cancel-search-mobile"]');
+ await click('[data-test-button="cancel-mobile-search"]');
await click("#search-button");
assert.dom('[data-test-input="search-term"]').hasNoValue();
diff --git a/app/assets/stylesheets/common/base/menu-panel.scss b/app/assets/stylesheets/common/base/menu-panel.scss
index 0301f6b0851..af1cf81fdbf 100644
--- a/app/assets/stylesheets/common/base/menu-panel.scss
+++ b/app/assets/stylesheets/common/base/menu-panel.scss
@@ -242,36 +242,44 @@
&.search-menu-panel {
width: 100vw;
max-width: 100vw;
+ padding: 0.5rem 0.5rem 0;
+ transform-origin: 66%;
+ transition: height 0.2s ease-in;
&.empty-panel {
- height: auto;
+ height: 4rem;
}
&.slide-in {
- animation: search-slidein 0.3s ease-out forwards;
+ animation: search-slide-in 0.2s ease-out forwards;
}
&.is-destroying {
- animation: search-slideout 0.3s ease-in forwards;
+ animation: search-slide-out 0.2s ease-in forwards;
}
- @keyframes search-slidein {
+ @keyframes search-slide-in {
from {
opacity: 0;
- transform: translateY(-100%);
+ transform: scaleX(0);
}
}
- @keyframes search-slideout {
- 80% {
+ @keyframes search-slide-out {
+ from {
+ transform: scaleX(1);
opacity: 1;
}
- 100% {
+ to {
opacity: 0;
- transform: translateY(-100%);
+ transform: scaleX(0);
}
}
+
+ .btn-cancel-mobile-search {
+ padding: 1rem 0.625rem;
+ }
}
}
}
diff --git a/app/assets/stylesheets/common/base/search-menu.scss b/app/assets/stylesheets/common/base/search-menu.scss
index fe6f5840e29..c86592037e8 100644
--- a/app/assets/stylesheets/common/base/search-menu.scss
+++ b/app/assets/stylesheets/common/base/search-menu.scss
@@ -24,6 +24,19 @@ $search-pad-horizontal: 0.5em;
display: flex;
align-items: center;
justify-content: space-between;
+ gap: 0.25rem;
+
+ @include breakpoint("mobile-extra-large") {
+ --search-input-wrapper-padding: 0.5rem;
+ position: fixed;
+ left: var(--search-input-wrapper-padding);
+ right: var(--search-input-wrapper-padding);
+ top: var(--search-input-wrapper-padding);
+ width: calc(100dvw - calc(var(--search-input-wrapper-padding) * 2));
+ padding-bottom: var(--search-input-wrapper-padding);
+ background-color: var(--secondary);
+ z-index: z("base");
+ }
}
.search-input {
@@ -113,6 +126,13 @@ $search-pad-horizontal: 0.5em;
padding-top: $search-pad-vertical;
}
+ @include breakpoint("mobile-extra-large") {
+ &,
+ &.with-search-term {
+ padding-top: 3rem;
+ }
+ }
+
.list {
min-width: 100px;
@@ -403,18 +423,14 @@ $search-pad-horizontal: 0.5em;
align-items: center;
.spinner {
- width: 12px;
- height: 12px;
- border-width: 2px;
- margin: 0 0.5em 0.25em 0;
- margin-top: 2px;
+ width: 0.75rem; // 12px
+ height: 0.75rem; // 12px
+ border-width: 0.125rem; // 2px
+ margin: 0 $hpad 0 0;
}
.show-advanced-search,
- a.clear-search {
- display: inline-block;
- background-color: transparent;
-
+ .clear-search {
.d-icon {
color: var(--primary-medium);
}
@@ -427,8 +443,12 @@ $search-pad-horizontal: 0.5em;
}
}
- a.clear-search {
- margin-right: 3px;
+ .clear-search {
+ padding-right: 0.25rem; // 4px
+ }
+
+ .show-advanced-search {
+ padding-left: 0.375rem; // 6px
}
}
diff --git a/app/assets/stylesheets/desktop/components/header-search.scss b/app/assets/stylesheets/desktop/components/header-search.scss
index 1d5a5fe8d0c..df048e2b093 100644
--- a/app/assets/stylesheets/desktop/components/header-search.scss
+++ b/app/assets/stylesheets/desktop/components/header-search.scss
@@ -72,7 +72,7 @@
justify-content: flex-end;
.show-advanced-search,
- a.clear-search {
+ .clear-search {
display: inline-flex;
align-items: center;
}