Tighten chat panel UI bridge placement

This commit is contained in:
murashit 2026-06-30 12:47:06 +09:00
parent a7406997e5
commit 783b375617
17 changed files with 27 additions and 24 deletions

View file

@ -5,8 +5,8 @@ import { runtimeSnapshotForChatState } from "../../application/runtime/snapshot"
import type { ChatStateStore } from "../../application/state/store";
import { resolveRuntimeControls } from "../../domain/runtime/resolution";
import { ChatComposerController } from "../../panel/composer-controller";
import type { ChatMessageScrollController } from "../../panel/message-stream-scroll-controller";
import { type ChatPanelComposerSurface, chatPanelComposerProjection } from "../../panel/surface/composer-projection";
import type { ChatMessageScrollController } from "../../panel/surface/message-stream-scroll";
import type { ChatPanelEnvironment } from "../contracts";
import { createVaultComposerAttachmentHandler } from "../obsidian/composer-attachments.obsidian";
import { VaultComposerContextReferenceProvider } from "../obsidian/vault-composer-context-reference-provider.obsidian";

View file

@ -3,10 +3,10 @@ import type { PendingRequestActions } from "../../application/pending-requests/p
import type { ChatStateStore } from "../../application/state/store";
import type { HistoryController } from "../../application/threads/history-controller";
import type { ThreadRenameEditorActions } from "../../application/threads/rename-editor-actions";
import type { ChatMessageScrollController } from "../../panel/message-stream-scroll-controller";
import type { ChatPanelShellParts } from "../../panel/shell.dom";
import type { ChatPanelGoalSurface } from "../../panel/surface/goal-projection";
import { MessageStreamPresenter } from "../../panel/surface/message-stream-presenter";
import type { ChatMessageScrollController } from "../../panel/surface/message-stream-scroll";
import type { ChatPanelToolbarSurface } from "../../panel/surface/toolbar-projection";
import { createToolbarUiActions, type ToolbarPanelActions } from "../../panel/toolbar-actions";
import { toolbarOutsidePointerHit } from "../../panel/toolbar-hit-test.dom";

View file

@ -12,7 +12,7 @@ import type { ChatResumeWorkTracker } from "../application/threads/resume-work";
import { createStructuredSystemItem, createSystemItem } from "../domain/message-stream/factories/system-items";
import type { MessageStreamNoticeSection } from "../domain/message-stream/items";
import type { ChatComposerController } from "../panel/composer-controller";
import type { ChatMessageScrollController } from "../panel/surface/message-stream-scroll";
import type { ChatMessageScrollController } from "../panel/message-stream-scroll-controller";
import { createComposerBundle } from "./bundles/composer-bundle";
import { type ChatPanelConnectionBundle, createConnectionBundle } from "./bundles/connection-bundle";
import { createReconnectAction } from "./bundles/reconnect-bundle";

View file

@ -7,8 +7,8 @@ import type { ChatState } from "../application/state/root-reducer";
import { type ChatStateStore, createChatStateStore } from "../application/state/store";
import { parseRestoredThreadState, type RestoredThreadPlaceholderState } from "../application/threads/restored-thread-lifecycle";
import { ChatResumeWorkTracker } from "../application/threads/resume-work";
import { type ChatMessageScrollController, createChatMessageScrollController } from "../panel/message-stream-scroll-controller";
import { renderChatPanelShell, unmountChatPanelShell } from "../panel/shell.dom";
import { type ChatMessageScrollController, createChatMessageScrollController } from "../panel/surface/message-stream-scroll";
import type { ChatPanelEnvironment, ChatPanelHandle, ChatWorkspacePanelSnapshot, ChatWorkspacePanelTurnLifecycle } from "./contracts";
import { type ChatViewDeferredTasks, createChatViewDeferredTasks } from "./session/deferred-work";
import { type ChatPanelSessionGraph, createChatPanelSessionGraph } from "./session-graph";

View file

@ -1,9 +1,9 @@
import type { ComposerBoundaryScrollAction } from "../../application/composer/boundary-scroll";
import type { ComposerBoundaryScrollAction } from "../application/composer/boundary-scroll";
import type {
MessageStreamScrollCommand,
MessageStreamScrollControllerBinding,
MessageStreamScrollPort,
} from "../../ui/message-stream/flow-scroll.measure";
} from "../ui/message-stream/flow-scroll.measure";
export interface ChatMessageScrollController extends MessageStreamScrollControllerBinding {
showLatest(): void;

View file

@ -1,7 +1,7 @@
import { Component, h, type ComponentChild as UiNode } from "preact";
import { disposeDomListeners, listenDomEvent } from "../../../../shared/ui/dom-events.dom";
import { MESSAGE_CONTENT_RENDERED_EVENT } from "./content-events";
import { MESSAGE_CONTENT_RENDERED_EVENT } from "./content-rendered-event.dom";
type MessageScrollDirection = -1 | 1;

View file

@ -2,7 +2,7 @@ import { micromark } from "micromark";
import { type App, type Component, MarkdownRenderer, Notice } from "obsidian";
import { isAbsoluteFileHref, vaultFileLinkTarget, vaultRelativeFileLinkTarget } from "../../../../shared/obsidian/file-links";
import { notifyMessageContentRendered } from "./content-events";
import { notifyMessageContentRendered } from "./content-rendered-event.dom";
interface MarkdownMessageRendererOptions {
app: App;

View file

@ -1,14 +1,8 @@
import { listenOutsideDomEvent } from "../../../../shared/ui/dom-events.dom";
export interface McpElicitationValidityMessage {
fieldId: string;
message: string;
}
export function closeMessageRoleMenuOnOutsidePointer(root: HTMLElement, onClose: () => void): () => void {
return listenOutsideDomEvent(root, "pointerdown", onClose, true);
}
export function focusPendingRequestControl(container: HTMLElement | null): void {
if (!container) return;
for (const selector of [

View file

@ -11,7 +11,11 @@ import type {
PendingUserInputViewModel,
} from "../../presentation/pending-requests/view-model";
import type { PendingRequestBlockActions } from "./context";
import { applyMcpElicitationFormValidity, focusPendingRequestControl, type McpElicitationValidityMessage } from "./message-stream.dom";
import {
applyMcpElicitationFormValidity,
focusPendingRequestControl,
type McpElicitationValidityMessage,
} from "./pending-request-block.dom";
import { createStatusMessageClassName } from "./status";
export function pendingRequestBlockNode(

View file

@ -3,7 +3,7 @@ import { useEffect, useLayoutEffect, useRef, useState } from "preact/hooks";
import { listenDomEvent, listenOutsideDomEvent } from "../../../../shared/ui/dom-events.dom";
import type { MessageStreamTextView } from "../../presentation/message-stream/text-view";
import { MESSAGE_CONTENT_RENDERED_EVENT } from "./content-events";
import { MESSAGE_CONTENT_RENDERED_EVENT } from "./content-rendered-event.dom";
import type { TextItemContentContext } from "./context";
const USER_MESSAGE_COLLAPSE_HEIGHT_PX = 360;

View file

@ -0,0 +1,5 @@
import { listenOutsideDomEvent } from "../../../../shared/ui/dom-events.dom";
export function closeMessageRoleMenuOnOutsidePointer(root: HTMLElement, onClose: () => void): () => void {
return listenOutsideDomEvent(root, "pointerdown", onClose, true);
}

View file

@ -9,7 +9,7 @@ import type {
TextItemDetailSectionView,
} from "../../presentation/message-stream/text-view";
import type { TextItemActionContext, TextItemContext, TextItemDetailStateContext, TextItemMetadataContext } from "./context";
import { closeMessageRoleMenuOnOutsidePointer } from "./message-stream.dom";
import { closeMessageRoleMenuOnOutsidePointer } from "./text.dom";
import { CollapsibleTextContent, TextContent } from "./text-content.dom";
export function textNode(view: MessageStreamTextView, context: TextItemContext): UiNode {

View file

@ -12,8 +12,8 @@ import type { ChatPanelEnvironment } from "../../../../src/features/chat/host/co
import { createChatViewDeferredTasks } from "../../../../src/features/chat/host/session/deferred-work";
import { createChatPanelSessionGraph } from "../../../../src/features/chat/host/session-graph";
import { ChatComposerController } from "../../../../src/features/chat/panel/composer-controller";
import { createChatMessageScrollController } from "../../../../src/features/chat/panel/message-stream-scroll-controller";
import { MessageStreamPresenter } from "../../../../src/features/chat/panel/surface/message-stream-presenter";
import { createChatMessageScrollController } from "../../../../src/features/chat/panel/surface/message-stream-scroll";
import { type CodexPanelSettings, DEFAULT_SETTINGS } from "../../../../src/settings/model";
import { ConnectionWorkTracker } from "../../../../src/shared/lifecycle/connection-work";
import { installObsidianDomShims } from "../../../support/dom";

View file

@ -6,15 +6,15 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
import { type ChatAction, type ChatState, chatReducer } from "../../../../../src/features/chat/application/state/root-reducer";
import { type ChatStateStore, createChatStateStore } from "../../../../../src/features/chat/application/state/store";
import {
type ChatMessageScrollController,
createChatMessageScrollController,
} from "../../../../../src/features/chat/panel/message-stream-scroll-controller";
import { MessageStreamPresenter } from "../../../../../src/features/chat/panel/surface/message-stream-presenter";
import {
type ChatMessageStreamSurfaceContext,
messageStreamSurfaceProjectionFromModel,
} from "../../../../../src/features/chat/panel/surface/message-stream-projection";
import {
type ChatMessageScrollController,
createChatMessageScrollController,
} from "../../../../../src/features/chat/panel/surface/message-stream-scroll";
import { MarkdownMessageRenderer } from "../../../../../src/features/chat/ui/message-stream/markdown-renderer.obsidian";
import { MessageStreamViewport } from "../../../../../src/features/chat/ui/message-stream/stream-blocks";
import { renderUiRoot, unmountUiRoot } from "../../../../../src/shared/ui/ui-root.dom";

View file

@ -5,7 +5,7 @@ import { act } from "preact/test-utils";
import { describe, expect, it, vi } from "vitest";
import { implementPlanTargetFromState } from "../../../../../src/features/chat/application/conversation/plan-implementation";
import type { MessageStreamItem } from "../../../../../src/features/chat/domain/message-stream/items";
import { MESSAGE_CONTENT_RENDERED_EVENT } from "../../../../../src/features/chat/ui/message-stream/content-events";
import { MESSAGE_CONTENT_RENDERED_EVENT } from "../../../../../src/features/chat/ui/message-stream/content-rendered-event.dom";
import { MarkdownMessageRenderer } from "../../../../../src/features/chat/ui/message-stream/markdown-renderer.obsidian";
import { deferred } from "../../../../support/async";
import { attributeValues, textContents, topLevelDetailsSummaries } from "../../../../support/dom";

View file

@ -3,7 +3,7 @@
import { h, type ComponentChild as UiNode } from "preact";
import { act } from "preact/test-utils";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { MESSAGE_CONTENT_RENDERED_EVENT } from "../../../../../src/features/chat/ui/message-stream/content-events";
import { MESSAGE_CONTENT_RENDERED_EVENT } from "../../../../../src/features/chat/ui/message-stream/content-rendered-event.dom";
import {
MessageStreamFlowFrame,
type MessageStreamScrollCommand,