mirror of
https://github.com/quorafind/Obsidian-Float-Search.git
synced 2026-07-22 07:30:25 +00:00
Compare commits
20 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16fcf917a6 | ||
|
|
fd4bf87a1f | ||
|
|
1e1ee35f9d | ||
|
|
e3201d9ed6 | ||
|
|
8cb09f6345 | ||
|
|
e1b2a6e2db | ||
|
|
3896bcfc34 | ||
|
|
8953f2175d | ||
|
|
c3d9e96b19 | ||
|
|
e56db18fae | ||
|
|
aa638ee588 | ||
|
|
4bb81fa23e | ||
|
|
81fb30c532 | ||
|
|
9875f56314 | ||
|
|
ab7c600b3c | ||
|
|
9b7a38f0f2 | ||
|
|
97ff7789b7 | ||
|
|
5832628666 | ||
|
|
f44be02007 | ||
|
|
912d213100 |
8 changed files with 3070 additions and 1368 deletions
|
|
@ -1,15 +1,10 @@
|
|||
{
|
||||
"id": "float-search",
|
||||
"name": "Floating Search",
|
||||
"version": "3.5.1",
|
||||
"minAppVersion": "0.15.0",
|
||||
"version": "4.3.0",
|
||||
"minAppVersion": "1.2.0",
|
||||
"description": "You can use search view in modal/leaf/popout window now.",
|
||||
"author": "Boninall",
|
||||
"authorUrl": "https://github.com/Quorafind",
|
||||
"fundingUrl": {
|
||||
"Buy Me a Coffee": "https://www.buymeacoffee.com/boninall",
|
||||
"爱发电": "https://afdian.net/a/boninall",
|
||||
"支付宝": "https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E6%94%AF%E4%BB%98%E5%AE%9D%E4%BB%98%E6%AC%BE%E7%A0%81.jpg"
|
||||
},
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "float-search",
|
||||
"version": "3.5.1",
|
||||
"version": "4.3.0",
|
||||
"description": "You can use search view in modal/leaf/popout window now.",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
"@typescript-eslint/parser": "5.29.0",
|
||||
"builtin-modules": "3.3.0",
|
||||
"esbuild": "0.14.47",
|
||||
"obsidian": "latest",
|
||||
"obsidian": "^1.12.3",
|
||||
"tslib": "2.4.0",
|
||||
"typescript": "4.7.4"
|
||||
},
|
||||
|
|
|
|||
1690
pnpm-lock.yaml
1690
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -53,7 +53,7 @@ function nosuper<T>(base: new (...args: unknown[]) => T): new () => T {
|
|||
|
||||
export const spawnLeafView = (plugin: FloatSearchPlugin, initiatingEl?: HTMLElement, leaf?: WorkspaceLeaf, onShowCallback?: () => unknown): [WorkspaceLeaf, EmbeddedView] => {
|
||||
// When Obsidian doesn't set any leaf active, use leaf instead.
|
||||
let parent = app.workspace.activeLeaf as unknown as EmbeddedViewParent;
|
||||
let parent = plugin.app.workspace.activeLeaf as unknown as EmbeddedViewParent;
|
||||
if (!parent) parent = leaf as unknown as EmbeddedViewParent;
|
||||
|
||||
if (!initiatingEl) initiatingEl = parent?.containerEl;
|
||||
|
|
@ -72,7 +72,7 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
detaching = false;
|
||||
opening = false;
|
||||
|
||||
rootSplit: WorkspaceSplit = new (WorkspaceSplit as ConstructableWorkspaceSplit)(window.app.workspace, "vertical");
|
||||
rootSplit: WorkspaceSplit = new (WorkspaceSplit as ConstructableWorkspaceSplit)(this.plugin.app.workspace, "vertical");
|
||||
|
||||
isPinned = true;
|
||||
|
||||
|
|
@ -86,16 +86,16 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
document: Document = this.targetEl?.ownerDocument ?? window.activeDocument ?? window.document;
|
||||
|
||||
id = genId(8);
|
||||
bounce?: NodeJS.Timeout;
|
||||
bounce?: number;
|
||||
boundOnZoomOut: () => void;
|
||||
|
||||
originalPath: string; // these are kept to avoid adopting targets w/a different link
|
||||
originalLinkText: string;
|
||||
static activePopover?: EmbeddedView;
|
||||
|
||||
static activeWindows() {
|
||||
static activeWindows(plugin: FloatSearchPlugin) {
|
||||
const windows: Window[] = [window];
|
||||
const {floatingSplit} = app.workspace;
|
||||
const {floatingSplit} = plugin.app.workspace;
|
||||
if (floatingSplit) {
|
||||
for (const split of floatingSplit.children) {
|
||||
if (split.win) windows.push(split.win);
|
||||
|
|
@ -104,16 +104,16 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
return windows;
|
||||
}
|
||||
|
||||
static containerForDocument(doc: Document) {
|
||||
if (doc !== document && app.workspace.floatingSplit)
|
||||
for (const container of app.workspace.floatingSplit.children) {
|
||||
static containerForDocument(doc: Document, plugin: FloatSearchPlugin) {
|
||||
if (doc !== document && plugin.app.workspace.floatingSplit)
|
||||
for (const container of plugin.app.workspace.floatingSplit.children) {
|
||||
if (container.doc === doc) return container;
|
||||
}
|
||||
return app.workspace.rootSplit;
|
||||
return plugin.app.workspace.rootSplit;
|
||||
}
|
||||
|
||||
static activePopovers() {
|
||||
return this.activeWindows().flatMap(this.popoversForWindow);
|
||||
static activePopovers(plugin: FloatSearchPlugin) {
|
||||
return this.activeWindows(plugin).flatMap(this.popoversForWindow);
|
||||
}
|
||||
|
||||
static popoversForWindow(win?: Window) {
|
||||
|
|
@ -128,8 +128,8 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
return el ? popovers.get(el) : undefined;
|
||||
}
|
||||
|
||||
static iteratePopoverLeaves(ws: Workspace, cb: (leaf: WorkspaceLeaf) => boolean | void) {
|
||||
for (const popover of this.activePopovers()) {
|
||||
static iteratePopoverLeaves(ws: Workspace, cb: (leaf: WorkspaceLeaf) => boolean | void, plugin: FloatSearchPlugin) {
|
||||
for (const popover of this.activePopovers(plugin)) {
|
||||
if (popover.rootSplit && ws.iterateLeaves(cb, popover.rootSplit)) return true;
|
||||
}
|
||||
return false;
|
||||
|
|
@ -221,7 +221,7 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
if (this.shouldShow()) {
|
||||
if (this.state === PopoverState.Hiding) {
|
||||
this.state = PopoverState.Shown;
|
||||
clearTimeout(this.timer);
|
||||
window.clearTimeout(this.timer);
|
||||
}
|
||||
} else {
|
||||
if (this.state === PopoverState.Showing) {
|
||||
|
|
@ -252,7 +252,7 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
|
||||
attachLeaf(): WorkspaceLeaf {
|
||||
this.rootSplit.getRoot = () => this.plugin.app.workspace[this.document === document ? "rootSplit" : "floatingSplit"]!;
|
||||
this.rootSplit.getContainer = () => EmbeddedView.containerForDocument(this.document);
|
||||
this.rootSplit.getContainer = () => EmbeddedView.containerForDocument(this.document, this.plugin);
|
||||
|
||||
this.titleEl.insertAdjacentElement("afterend", this.rootSplit.containerEl);
|
||||
const leaf = this.plugin.app.workspace.createLeafInParent(this.rootSplit, 0);
|
||||
|
|
@ -264,7 +264,7 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
onload(): void {
|
||||
super.onload();
|
||||
this.registerEvent(this.plugin.app.workspace.on("layout-change", this.updateLeaves, this));
|
||||
this.registerEvent(app.workspace.on("layout-change", () => {
|
||||
this.registerEvent(this.plugin.app.workspace.on("layout-change", () => {
|
||||
// Ensure that top-level items in a popover are not tabbed
|
||||
// @ts-ignore
|
||||
this.rootSplit.children.forEach((item: any, index: any) => {
|
||||
|
|
@ -326,7 +326,7 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
}
|
||||
|
||||
shouldShowChild(): boolean {
|
||||
return EmbeddedView.activePopovers().some(popover => {
|
||||
return EmbeddedView.activePopovers(this.plugin).some(popover => {
|
||||
if (popover !== this && popover.targetEl && this.hoverEl.contains(popover.targetEl)) {
|
||||
return popover.shouldShow();
|
||||
}
|
||||
|
|
@ -355,7 +355,7 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
|
||||
this.targetEl.appendChild(this.hoverEl);
|
||||
this.onShow();
|
||||
app.workspace.onLayoutChange();
|
||||
this.plugin.app.workspace.onLayoutChange();
|
||||
|
||||
// initializingHoverPopovers.remove(this);
|
||||
// activeHoverPopovers.push(this);
|
||||
|
|
@ -391,7 +391,7 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
// A timer might be pending to call show() for the first time, make sure
|
||||
// it doesn't bring us back up after we close
|
||||
if (this.timer) {
|
||||
clearTimeout(this.timer);
|
||||
window.clearTimeout(this.timer);
|
||||
this.timer = 0;
|
||||
}
|
||||
|
||||
|
|
@ -465,7 +465,7 @@ export class EmbeddedView extends nosuper(HoverPopover) {
|
|||
eState = Object.assign(this.buildEphemeralState(file, link), eState);
|
||||
const parentMode = this.getDefaultMode();
|
||||
const state = this.buildState(parentMode, eState);
|
||||
const leaf = await this.openFile(file, state, createInLeaf);
|
||||
const leaf = await this.openFile(file, state as OpenViewState, createInLeaf);
|
||||
const leafViewType = leaf?.view?.getViewType();
|
||||
// console.log(leaf);
|
||||
if (leafViewType === "image") {
|
||||
|
|
|
|||
64
src/types/types-obsidian.d.ts
vendored
64
src/types/types-obsidian.d.ts
vendored
|
|
@ -3,13 +3,16 @@ import {
|
|||
EditorPosition,
|
||||
EphemeralState,
|
||||
Loc,
|
||||
MarkdownPreviewRenderer, MarkdownSubView,
|
||||
MarkdownPreviewRenderer,
|
||||
MarkdownSubView,
|
||||
Plugin,
|
||||
PluginManifest,
|
||||
SuggestModal,
|
||||
TFile, TFolder,
|
||||
View, WorkspaceItem,
|
||||
WorkspaceLeaf
|
||||
TFile,
|
||||
TFolder,
|
||||
View,
|
||||
WorkspaceItem,
|
||||
WorkspaceLeaf,
|
||||
} from "obsidian";
|
||||
import { EmbeddedViewParent } from "../leafView";
|
||||
|
||||
|
|
@ -20,7 +23,7 @@ interface InternalPlugins {
|
|||
}
|
||||
|
||||
interface OpenViewState {
|
||||
eState?: EphemeralState;
|
||||
eState?: Record<string, unknown>;
|
||||
state?: { mode: string };
|
||||
active?: boolean;
|
||||
}
|
||||
|
|
@ -82,7 +85,9 @@ declare module "obsidian" {
|
|||
};
|
||||
internalPlugins: {
|
||||
plugins: InternalPlugins;
|
||||
getPluginById<T extends keyof InternalPlugins>(id: T): InternalPlugins[T];
|
||||
getPluginById<T extends keyof InternalPlugins>(
|
||||
id: T
|
||||
): InternalPlugins[T];
|
||||
};
|
||||
plugins: {
|
||||
manifests: Record<string, PluginManifest>;
|
||||
|
|
@ -98,6 +103,8 @@ declare module "obsidian" {
|
|||
viewRegistry: ViewRegistry;
|
||||
|
||||
openWithDefaultApp(path: string): void;
|
||||
|
||||
dragManager: any;
|
||||
}
|
||||
|
||||
interface ViewRegistry {
|
||||
|
|
@ -110,14 +117,23 @@ declare module "obsidian" {
|
|||
}
|
||||
|
||||
interface WorkspaceParent {
|
||||
insertChild(index: number, child: WorkspaceItem, resize?: boolean): void;
|
||||
insertChild(
|
||||
index: number,
|
||||
child: WorkspaceItem,
|
||||
resize?: boolean
|
||||
): void;
|
||||
|
||||
replaceChild(index: number, child: WorkspaceItem, resize?: boolean): void;
|
||||
replaceChild(
|
||||
index: number,
|
||||
child: WorkspaceItem,
|
||||
resize?: boolean
|
||||
): void;
|
||||
|
||||
removeChild(leaf: WorkspaceLeaf, resize?: boolean): void;
|
||||
|
||||
containerEl: HTMLElement;
|
||||
children: any;
|
||||
parent: any;
|
||||
}
|
||||
|
||||
interface MarkdownEditView {
|
||||
|
|
@ -125,11 +141,19 @@ declare module "obsidian" {
|
|||
}
|
||||
|
||||
class MarkdownPreviewRendererStatic extends MarkdownPreviewRenderer {
|
||||
static registerDomEvents(el: HTMLElement, handlerInstance: unknown, cb: (el: HTMLElement) => unknown): void;
|
||||
static registerDomEvents(
|
||||
el: HTMLElement,
|
||||
handlerInstance: unknown,
|
||||
cb: (el: HTMLElement) => unknown
|
||||
): void;
|
||||
}
|
||||
|
||||
interface WorkspaceLeaf {
|
||||
openLinkText(linkText: string, path: string, state?: unknown): Promise<void>;
|
||||
openLinkText(
|
||||
linkText: string,
|
||||
path: string,
|
||||
state?: unknown
|
||||
): Promise<void>;
|
||||
|
||||
updateHeader(): void;
|
||||
|
||||
|
|
@ -142,16 +166,25 @@ declare module "obsidian" {
|
|||
interface Workspace {
|
||||
recordHistory(leaf: WorkspaceLeaf, pushHistory: boolean): void;
|
||||
|
||||
iterateLeaves(callback: (item: WorkspaceLeaf) => boolean | void, item: WorkspaceItem | WorkspaceItem[]): boolean;
|
||||
iterateLeaves(
|
||||
callback: (item: WorkspaceLeaf) => boolean | void,
|
||||
item: WorkspaceItem | WorkspaceItem[]
|
||||
): boolean;
|
||||
|
||||
iterateLeaves(item: WorkspaceItem | WorkspaceItem[], callback: (item: WorkspaceLeaf) => boolean | void): boolean;
|
||||
iterateLeaves(
|
||||
item: WorkspaceItem | WorkspaceItem[],
|
||||
callback: (item: WorkspaceLeaf) => boolean | void
|
||||
): boolean;
|
||||
|
||||
getDropLocation(event: MouseEvent): {
|
||||
target: WorkspaceItem;
|
||||
sidedock: boolean;
|
||||
};
|
||||
|
||||
recursiveGetTarget(event: MouseEvent, parent: WorkspaceParent): WorkspaceItem;
|
||||
recursiveGetTarget(
|
||||
event: MouseEvent,
|
||||
parent: WorkspaceParent
|
||||
): WorkspaceItem;
|
||||
|
||||
recordMostRecentOpenedFile(file: TFile): void;
|
||||
|
||||
|
|
@ -220,7 +253,10 @@ declare module "obsidian" {
|
|||
}
|
||||
|
||||
interface FileManager {
|
||||
createNewMarkdownFile(folder: TFolder, fileName: string): Promise<TFile>;
|
||||
createNewMarkdownFile(
|
||||
folder: TFolder,
|
||||
fileName: string
|
||||
): Promise<TFile>;
|
||||
}
|
||||
|
||||
enum PopoverState {
|
||||
|
|
|
|||
93
styles.css
93
styles.css
|
|
@ -9,13 +9,15 @@ If your plugin does not need CSS, delete this file.
|
|||
.float-search-modal {
|
||||
width: 700px;
|
||||
padding-bottom: 0;
|
||||
transition: width 0.15s ease;
|
||||
}
|
||||
|
||||
.float-search-modal.float-search-width {
|
||||
width: 1200px;
|
||||
}
|
||||
|
||||
.float-search-modal-search-ctn, .float-search-modal-file-ctn {
|
||||
.float-search-modal-search-ctn,
|
||||
.float-search-modal-file-ctn {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
|
@ -63,7 +65,6 @@ If your plugin does not need CSS, delete this file.
|
|||
z-index: 30;
|
||||
}
|
||||
|
||||
|
||||
.float-search-modal-instructions {
|
||||
border-top: 1px solid var(--background-secondary);
|
||||
user-select: none;
|
||||
|
|
@ -82,7 +83,8 @@ If your plugin does not need CSS, delete this file.
|
|||
margin-right: var(--size-2-2);
|
||||
}
|
||||
|
||||
.float-search-modal-content:has(.float-search-modal-file-ctn) .float-search-modal-search-ctn {
|
||||
.float-search-modal-content:has(.float-search-modal-file-ctn)
|
||||
.float-search-modal-search-ctn {
|
||||
border-right: 1px solid var(--background-secondary);
|
||||
}
|
||||
|
||||
|
|
@ -142,3 +144,88 @@ body:not(.show-file-path) .search-result-file-title .search-result-file-path {
|
|||
.show-file-path .search-result-file-title .search-result-file-path:hover {
|
||||
background-color: var(--background-secondary);
|
||||
}
|
||||
|
||||
.fs-leaf-view .workspace-split {
|
||||
background-color: var(--background-primary);
|
||||
}
|
||||
|
||||
/* ── CMDK Modal ── */
|
||||
.prompt.float-search-cmdk {
|
||||
width: 700px;
|
||||
max-width: 90vw;
|
||||
transition: width 0.15s ease;
|
||||
}
|
||||
|
||||
.prompt.float-search-cmdk.float-search-cmdk-expanded {
|
||||
width: 1100px;
|
||||
}
|
||||
|
||||
.float-search-cmdk-body {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
height: 50vh;
|
||||
max-height: 600px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.float-search-cmdk-body .prompt-results {
|
||||
max-height: none;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
.float-search-cmdk-expanded .float-search-cmdk-body .prompt-results {
|
||||
flex: 0 0 40%;
|
||||
border-right: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.float-search-cmdk-preview {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.float-search-cmdk-preview .view-header {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.float-search-cmdk-preview .view-content {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.float-search-cmdk-preview .fs-block {
|
||||
height: 100% !important;
|
||||
}
|
||||
|
||||
.float-search-cmdk-preview .fs-content {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.float-search-cmdk-preview .fs-content .workspace-split.mod-vertical {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.float-search-cmdk-preview .workspace-leaf-resize-handle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.modal-container.float-search-cmdk-container.mod-dim {
|
||||
z-index: 30;
|
||||
}
|
||||
|
||||
/* ── Quick Create item ── */
|
||||
.float-search-cmdk-create-item {
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.float-search-cmdk-create-item .suggestion-title {
|
||||
color: var(--text-accent);
|
||||
font-weight: var(--font-semibold);
|
||||
}
|
||||
|
||||
.float-search-cmdk-create-item .suggestion-flair {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: var(--text-accent);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,5 +29,10 @@
|
|||
"3.4.9": "0.15.0",
|
||||
"3.4.10": "0.15.0",
|
||||
"3.5.0": "0.15.0",
|
||||
"3.5.1": "0.15.0"
|
||||
"3.5.1": "0.15.0",
|
||||
"4.0.0": "0.15.0",
|
||||
"4.1.0": "0.15.0",
|
||||
"4.1.1": "0.15.0",
|
||||
"4.2.0": "1.2.0",
|
||||
"4.3.0": "1.2.0"
|
||||
}
|
||||
Loading…
Reference in a new issue