diff --git a/app/src/assets/scss/component/_typography.scss b/app/src/assets/scss/component/_typography.scss index 16fe4693a..5d2274df2 100644 --- a/app/src/assets/scss/component/_typography.scss +++ b/app/src/assets/scss/component/_typography.scss @@ -88,9 +88,9 @@ background-color: var(--b3-protyle-inline-mark-background); color: var(--b3-protyle-inline-mark-color); - &.mark__current { - background-color: var(--b3-protyle-search-current-background); - box-shadow: 0 0 1px var(--b3-theme-on-background); + &.mark--hl { + background-color: var(--b3-theme-primary-lighter); + box-shadow: 0 0 0 .5px var(--b3-theme-on-background); } } diff --git a/app/src/search/assets.ts b/app/src/search/assets.ts index c4be087f6..95d699f57 100644 --- a/app/src/search/assets.ts +++ b/app/src/search/assets.ts @@ -67,11 +67,12 @@ export const openSearchAsset = (element: Element, isStick: boolean) => {
-
+
↑/↓ ${window.siyuan.languages.searchTip1} ${enterTip} + Click ${window.siyuan.languages.searchTip3} Esc ${window.siyuan.languages.searchTip5}
`; const searchPanelElement = element.querySelector("#searchAssetList"); @@ -313,10 +314,36 @@ export const toggleAssetHistory = (historyElement: Element, searchInputElement: export const renderPreview = (element: Element, id: string, query: string, queryMethod: number) => { fetchPost("/api/search/getAssetContent", {id, query, queryMethod}, (response) => { - element.innerHTML = response.data.assetContent.content; + element.innerHTML = `

${response.data.assetContent.content}

`; + const matchElement = element.querySelector("mark"); + if (matchElement) { + matchElement.classList.add("mark--hl"); + const contentRect = element.getBoundingClientRect(); + element.scrollTop = element.scrollTop + matchElement.getBoundingClientRect().top - contentRect.top - contentRect.height / 2; + } }); }; +export const renderNextAssetMark = (element: Element) => { + let matchElement; + const allMatchElements = Array.from(element.querySelectorAll("mark")); + allMatchElements.find((item, itemIndex) => { + if (item.classList.contains("mark--hl")) { + item.classList.remove("mark--hl"); + matchElement = allMatchElements[itemIndex + 1]; + return; + } + }); + if (!matchElement) { + matchElement = allMatchElements[0]; + } + if (matchElement) { + matchElement.classList.add("mark--hl"); + const contentRect = element.getBoundingClientRect(); + element.scrollTop = element.scrollTop + matchElement.getBoundingClientRect().top - contentRect.top - contentRect.height / 2; + } +}; + export const assetMethodMenu = (target: HTMLElement, cb: () => void) => { const method = window.siyuan.storage[Constants.LOCAL_SEARCHASSET].method; if (!window.siyuan.menus.menu.element.classList.contains("fn__none") && @@ -357,7 +384,7 @@ export const assetMethodMenu = (target: HTMLElement, cb: () => void) => { window.siyuan.menus.menu.popup({x: rect.right, y: rect.bottom}, true); }; -const filterTypesHTML = (types:IObject) => { +const filterTypesHTML = (types: IObject) => { let html = ""; Constants.SIYUAN_ASSETS_SEARCH.sort((a: string, b: string) => { return a.localeCompare(b); diff --git a/app/src/search/util.ts b/app/src/search/util.ts index 011bec46b..e1f83ef3f 100644 --- a/app/src/search/util.ts +++ b/app/src/search/util.ts @@ -27,7 +27,7 @@ import { assetFilterMenu, assetInputEvent, assetMethodMenu, assetMoreMenu, - openSearchAsset, + openSearchAsset, renderNextAssetMark, renderPreview, toggleAssetHistory } from "./assets"; @@ -729,6 +729,9 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo target.classList.add("b3-list-item--focus"); renderPreview(element.querySelector("#searchAssetPreview"), target.dataset.id, searchAssetInputElement.value, window.siyuan.storage[Constants.LOCAL_SEARCHASSET].method); searchAssetInputElement.focus(); + } else if (target.classList.contains("b3-list-item--focus")) { + renderNextAssetMark(element.querySelector("#searchAssetPreview")); + searchAssetInputElement.focus(); } } else { if (event.altKey) {