From ea1ec7363378aefaaed73c66e8ff2ab4f85fa154 Mon Sep 17 00:00:00 2001 From: razonyang Date: Fri, 5 May 2023 04:51:50 +0800 Subject: [PATCH] fix: remove multiple active results and keep only one --- assets/search/js/navigator.ts | 12 ++++++------ assets/search/js/renderer.ts | 17 ++++++++++++++++- assets/search/scss/_result.scss | 3 +-- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/assets/search/js/navigator.ts b/assets/search/js/navigator.ts index 01740e414f2..f561aad6d65 100644 --- a/assets/search/js/navigator.ts +++ b/assets/search/js/navigator.ts @@ -7,22 +7,22 @@ class Navigator { private current(): null | HTMLElement { const modal = this.modal() - return modal ? modal.querySelector('.search-result.active') : document.querySelector('.search-container .search-result.active') + return modal ? + modal.querySelector('.search-result[aria-selected="true"]') : + document.querySelector('.search-container .search-result[aria-selected="true"]') } private go(dir) { const current = this.current() let target - if (!current) { - target = current - } else { + if (current) { + current.ariaSelected = 'false' target = dir === 'prev' ? current.previousElementSibling : current.nextElementSibling } target = target ?? this.first() - current?.classList.remove('active') target.focus() - target.classList.add('active') + target.ariaSelected = 'true' } private first() { diff --git a/assets/search/js/renderer.ts b/assets/search/js/renderer.ts index 0ea89467312..1a8bcfb31a4 100644 --- a/assets/search/js/renderer.ts +++ b/assets/search/js/renderer.ts @@ -186,6 +186,10 @@ export default class Renderer { this.toggleMeta(node.querySelector('.search-result-meta')) e.preventDefault() }) + + node.addEventListener('mousemove', () => { + this.activeResult(node) + }) } } } @@ -195,6 +199,17 @@ export default class Renderer { observer.observe(container, { childList: true }); } + activeResult(target) { + if (target.ariaSelected === 'true') { + return + } + + this.getContainer().querySelectorAll('.search-result').forEach((result) => { + result.ariaSelected = 'false' + }); + target.ariaSelected = 'true' + } + private toggleMeta(meta: HTMLElement) { if (meta.classList.contains('show')) { meta.classList.remove('show') @@ -251,7 +266,7 @@ export default class Renderer { let results = '' for (let i = min; i < this.results.length && i < max; i++) { const result = this.results[i] - results += ` + results += `
${this.icon(result.item)}
${this.title(result)}
diff --git a/assets/search/scss/_result.scss b/assets/search/scss/_result.scss index 70dc55f817e..9b649cfecdc 100644 --- a/assets/search/scss/_result.scss +++ b/assets/search/scss/_result.scss @@ -143,8 +143,7 @@ margin-top: 0; } - &:hover, - &.active { + &[aria-selected="true"] { background: var(--search-result-bg-active); color: var(--search-result-color-active);