From 668aaec2127c360c96edf1b4d3107ed36c671432 Mon Sep 17 00:00:00 2001 From: hangerye Date: Thu, 18 Dec 2025 20:23:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20[WIP]=E4=BC=98=E5=8C=96web-builder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/web-editor-types.ts | 262 +++ .../background/web-editor/index.ts | 70 +- .../entrypoints/web-editor-v2.ts | 47 + .../entrypoints/web-editor-v2/constants.ts | 52 + .../entrypoints/web-editor-v2/core/editor.ts | 376 ++++ .../web-editor-v2/core/event-controller.ts | 428 +++++ .../entrypoints/web-editor-v2/core/locator.ts | 544 ++++++ .../web-editor-v2/core/message-listener.ts | 117 ++ .../web-editor-v2/core/payload-builder.ts | 533 ++++++ .../web-editor-v2/core/position-tracker.ts | 288 +++ .../web-editor-v2/core/transaction-manager.ts | 592 ++++++ .../web-editor-v2/overlay/canvas-overlay.ts | 346 ++++ .../selection/selection-engine.ts | 672 +++++++ .../web-editor-v2/ui/shadow-host.ts | 486 +++++ .../entrypoints/web-editor-v2/ui/toolbar.ts | 317 +++ .../web-editor-v2/utils/disposables.ts | 142 ++ app/chrome-extension/wxt.config.ts | 24 +- builder-plan.md | 1203 ++++++++++++ editor-plan.md | 179 -- editor.md | 1215 ++++++++++-- editor.png | Bin 0 -> 487839 bytes quick-panel-ui.html | 1694 +++++++++++++++++ 22 files changed, 9204 insertions(+), 383 deletions(-) create mode 100644 app/chrome-extension/common/web-editor-types.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/constants.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/core/editor.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/core/event-controller.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/core/locator.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/core/message-listener.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/core/payload-builder.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/core/position-tracker.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/core/transaction-manager.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/overlay/canvas-overlay.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/selection/selection-engine.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/ui/shadow-host.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/ui/toolbar.ts create mode 100644 app/chrome-extension/entrypoints/web-editor-v2/utils/disposables.ts create mode 100644 builder-plan.md create mode 100644 editor.png create mode 100644 quick-panel-ui.html diff --git a/app/chrome-extension/common/web-editor-types.ts b/app/chrome-extension/common/web-editor-types.ts new file mode 100644 index 0000000..bb81b60 --- /dev/null +++ b/app/chrome-extension/common/web-editor-types.ts @@ -0,0 +1,262 @@ +/** + * Web Editor V2 - Shared Type Definitions + * + * This module defines types shared between: + * - Background script (injection control) + * - Inject script (web-editor-v2.ts) + * - Future: UI panels + */ + +// ============================================================================= +// Editor State +// ============================================================================= + +/** Current state of the web editor */ +export interface WebEditorState { + /** Whether the editor is currently active */ + active: boolean; + /** Editor version for compatibility checks */ + version: 2; +} + +// ============================================================================= +// Message Protocol (Background <-> Inject Script) +// ============================================================================= + +/** + * Action types for web editor V2 messages + * + * IMPORTANT: V2 uses versioned action names (suffix _v2) to avoid + * conflicts with V1 when both scripts might be injected in the same tab. + * This prevents double-response race conditions. + * + * V1 uses: web_editor_ping, web_editor_toggle, etc. + * V2 uses: web_editor_ping_v2, web_editor_toggle_v2, etc. + */ +export const WEB_EDITOR_V2_ACTIONS = { + /** Check if V2 editor is injected and get status */ + PING: 'web_editor_ping_v2', + /** Toggle V2 editor on/off */ + TOGGLE: 'web_editor_toggle_v2', + /** Start V2 editor */ + START: 'web_editor_start_v2', + /** Stop V2 editor */ + STOP: 'web_editor_stop_v2', +} as const; + +/** + * Legacy V1 action types (for reference and background compatibility) + * These are used when USE_WEB_EDITOR_V2 is false + */ +export const WEB_EDITOR_V1_ACTIONS = { + PING: 'web_editor_ping', + TOGGLE: 'web_editor_toggle', + START: 'web_editor_start', + STOP: 'web_editor_stop', + APPLY: 'web_editor_apply', +} as const; + +export type WebEditorV2Action = (typeof WEB_EDITOR_V2_ACTIONS)[keyof typeof WEB_EDITOR_V2_ACTIONS]; +export type WebEditorV1Action = (typeof WEB_EDITOR_V1_ACTIONS)[keyof typeof WEB_EDITOR_V1_ACTIONS]; + +/** Editor version literal type */ +export type WebEditorVersion = 1 | 2; + +/** Ping request (V2) */ +export interface WebEditorV2PingRequest { + action: typeof WEB_EDITOR_V2_ACTIONS.PING; +} + +/** Ping response (V2) */ +export interface WebEditorV2PingResponse { + status: 'pong'; + active: boolean; + version: 2; +} + +/** Toggle request (V2) */ +export interface WebEditorV2ToggleRequest { + action: typeof WEB_EDITOR_V2_ACTIONS.TOGGLE; +} + +/** Toggle response (V2) */ +export interface WebEditorV2ToggleResponse { + active: boolean; +} + +/** Start request (V2) */ +export interface WebEditorV2StartRequest { + action: typeof WEB_EDITOR_V2_ACTIONS.START; +} + +/** Start response (V2) */ +export interface WebEditorV2StartResponse { + active: boolean; +} + +/** Stop request (V2) */ +export interface WebEditorV2StopRequest { + action: typeof WEB_EDITOR_V2_ACTIONS.STOP; +} + +/** Stop response (V2) */ +export interface WebEditorV2StopResponse { + active: boolean; +} + +/** Union types for V2 type-safe message handling */ +export type WebEditorV2Request = + | WebEditorV2PingRequest + | WebEditorV2ToggleRequest + | WebEditorV2StartRequest + | WebEditorV2StopRequest; + +export type WebEditorV2Response = + | WebEditorV2PingResponse + | WebEditorV2ToggleResponse + | WebEditorV2StartResponse + | WebEditorV2StopResponse; + +// ============================================================================= +// Element Locator (Phase 1 - Basic Structure) +// ============================================================================= + +/** + * Framework debug source information + * Extracted from React Fiber or Vue component instance + */ +export interface DebugSource { + /** Source file path */ + file: string; + /** Line number (1-based) */ + line?: number; + /** Column number (1-based) */ + column?: number; + /** Component name (if available) */ + componentName?: string; +} + +/** + * Element Locator - Primary key for element identification + * + * Uses multiple strategies to locate elements, supporting: + * - HMR/DOM changes recovery + * - Cross-session persistence + * - Framework-agnostic identification + */ +export interface ElementLocator { + /** CSS selector candidates (ordered by specificity) */ + selectors: string[]; + /** Structural fingerprint for similarity matching */ + fingerprint: string; + /** Framework debug information (React/Vue) */ + debugSource?: DebugSource; + /** DOM tree path (child indices from root) */ + path: number[]; + /** iframe selector chain (from top to target frame) - Phase 4 */ + frameChain?: string[]; + /** Shadow DOM host selector chain - Phase 2 */ + shadowHostChain?: string[]; +} + +// ============================================================================= +// Transaction System (Phase 1 - Basic Structure, Low Priority) +// ============================================================================= + +/** Transaction operation types */ +export type TransactionType = 'style' | 'text' | 'move' | 'structure'; + +/** + * Transaction snapshot for undo/redo + * Captures element state before/after changes + */ +export interface TransactionSnapshot { + /** Element locator for re-identification */ + locator: ElementLocator; + /** innerHTML snapshot (for structure changes) */ + html?: string; + /** Changed style properties */ + styles?: Record; + /** Text content */ + text?: string; +} + +/** + * Move operation data + * Captures parent/position for element moves + */ +export interface MoveOperationData { + /** Target parent element locator */ + parentLocator: ElementLocator; + /** Insert position index */ + insertIndex: number; + /** Anchor sibling element locator */ + anchorLocator?: ElementLocator; + /** Position relative to anchor */ + anchorPosition: 'before' | 'after'; +} + +/** + * Structure operation data + * For wrap/unwrap/delete/duplicate operations + */ +export interface StructureOperationData { + action: 'wrap' | 'unwrap' | 'delete' | 'duplicate'; + /** Wrapper tag for wrap action */ + wrapperTag?: string; + /** Wrapper styles for wrap action */ + wrapperStyles?: Record; +} + +/** + * Transaction record for undo/redo system + */ +export interface Transaction { + /** Unique transaction ID */ + id: string; + /** Operation type */ + type: TransactionType; + /** Target element locator */ + targetLocator: ElementLocator; + /** State before change */ + before: TransactionSnapshot; + /** State after change */ + after: TransactionSnapshot; + /** Move-specific data */ + moveData?: MoveOperationData; + /** Structure-specific data */ + structureData?: StructureOperationData; + /** Timestamp */ + timestamp: number; + /** Whether merged with previous transaction */ + merged: boolean; +} + +// ============================================================================= +// Public API Interface +// ============================================================================= + +/** + * Web Editor V2 Public API + * Exposed on window.__MCP_WEB_EDITOR_V2__ + */ +export interface WebEditorV2Api { + /** Start the editor */ + start: () => void; + /** Stop the editor */ + stop: () => void; + /** Toggle editor on/off, returns new state */ + toggle: () => boolean; + /** Get current state */ + getState: () => WebEditorState; +} + +// ============================================================================= +// Global Declaration +// ============================================================================= + +declare global { + interface Window { + __MCP_WEB_EDITOR_V2__?: WebEditorV2Api; + } +} diff --git a/app/chrome-extension/entrypoints/background/web-editor/index.ts b/app/chrome-extension/entrypoints/background/web-editor/index.ts index 105d8e9..62c5028 100644 --- a/app/chrome-extension/entrypoints/background/web-editor/index.ts +++ b/app/chrome-extension/entrypoints/background/web-editor/index.ts @@ -1,9 +1,26 @@ import { BACKGROUND_MESSAGE_TYPES } from '@/common/message-types'; +import { WEB_EDITOR_V2_ACTIONS, WEB_EDITOR_V1_ACTIONS } from '@/common/web-editor-types'; const CONTEXT_MENU_ID = 'web_editor_toggle'; const COMMAND_KEY = 'toggle_web_editor'; const DEFAULT_NATIVE_SERVER_PORT = 12306; +/** + * Web Editor version configuration + * - v1: Legacy inject-scripts/web-editor.js (IIFE, ~850 lines) + * - v2: New TypeScript-based web-editor-v2.js (WXT unlisted script) + * + * Set USE_WEB_EDITOR_V2 to true to enable v2. + * This flag allows gradual rollout and easy rollback. + */ +const USE_WEB_EDITOR_V2 = true; + +/** Script path for v1 (legacy) */ +const V1_SCRIPT_PATH = 'inject-scripts/web-editor.js'; + +/** Script path for v2 (WXT unlisted script output) */ +const V2_SCRIPT_PATH = 'web-editor-v2.js'; + type WebEditorInstructionType = 'update_text' | 'update_style'; interface WebEditorFingerprint { @@ -179,40 +196,69 @@ async function ensureContextMenu(): Promise { } } +/** + * Get the appropriate action constants based on version + */ +function getActions() { + return USE_WEB_EDITOR_V2 ? WEB_EDITOR_V2_ACTIONS : WEB_EDITOR_V1_ACTIONS; +} + +/** + * Ensure the web editor script is injected into the tab + * Supports both v1 (legacy) and v2 (new) versions + * + * V1 and V2 use different action names to avoid conflicts: + * - V1: web_editor_ping, web_editor_toggle, etc. + * - V2: web_editor_ping_v2, web_editor_toggle_v2, etc. + */ async function ensureEditorInjected(tabId: number): Promise { + const scriptPath = USE_WEB_EDITOR_V2 ? V2_SCRIPT_PATH : V1_SCRIPT_PATH; + const logPrefix = USE_WEB_EDITOR_V2 ? '[WebEditorV2]' : '[WebEditor]'; + const actions = getActions(); + + // Try to ping existing instance using version-specific action try { - const pong: any = await chrome.tabs.sendMessage( + const pong: { status?: string; version?: number } = await chrome.tabs.sendMessage( tabId, - { action: 'web_editor_ping' } as any, - { frameId: 0 } as any, + { action: actions.PING }, + { frameId: 0 }, ); - if (pong?.status === 'pong') return; + + if (pong?.status === 'pong') { + // Already injected with correct version + return; + } } catch { - // Fallthrough to executeScript + // No existing instance, fallthrough to inject } + // Inject the script try { await chrome.scripting.executeScript({ target: { tabId }, - files: ['inject-scripts/web-editor.js'], + files: [scriptPath], world: 'ISOLATED', - } as any); + }); + console.log(`${logPrefix} Script injected successfully`); } catch (error) { - console.warn('[WebEditor] Failed to inject editor script:', error); + console.warn(`${logPrefix} Failed to inject editor script:`, error); } } async function toggleEditorInTab(tabId: number): Promise<{ active?: boolean }> { await ensureEditorInjected(tabId); + const logPrefix = USE_WEB_EDITOR_V2 ? '[WebEditorV2]' : '[WebEditor]'; + const actions = getActions(); + try { - const resp: any = await chrome.tabs.sendMessage( + const resp: { active?: boolean } = await chrome.tabs.sendMessage( tabId, - { action: 'web_editor_toggle' } as any, - { frameId: 0 } as any, + { action: actions.TOGGLE }, + { frameId: 0 }, ); return { active: typeof resp?.active === 'boolean' ? resp.active : undefined }; } catch (error) { - console.warn('[WebEditor] Failed to toggle editor in tab:', error); + console.warn(`${logPrefix} Failed to toggle editor in tab:`, error); return {}; } } diff --git a/app/chrome-extension/entrypoints/web-editor-v2.ts b/app/chrome-extension/entrypoints/web-editor-v2.ts new file mode 100644 index 0000000..4d1757d --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2.ts @@ -0,0 +1,47 @@ +/** + * Web Editor V2 - Inject Script Entry Point + * + * This is the main entry point for the visual editor, injected into web pages + * via chrome.scripting.executeScript from the background script. + * + * Architecture: + * - Uses WXT's defineUnlistedScript for TypeScript compilation + * - Exposes API on window.__MCP_WEB_EDITOR_V2__ + * - Communicates with background via chrome.runtime.onMessage + * + * Module structure: + * - web-editor-v2/constants.ts - Configuration values + * - web-editor-v2/utils/disposables.ts - Resource cleanup + * - web-editor-v2/ui/shadow-host.ts - Shadow DOM isolation + * - web-editor-v2/core/editor.ts - Main orchestrator + * - web-editor-v2/core/message-listener.ts - Background communication + * + * Build output: .output/chrome-mv3/web-editor-v2.js + */ + +import { WEB_EDITOR_V2_LOG_PREFIX } from './web-editor-v2/constants'; +import { createWebEditorV2 } from './web-editor-v2/core/editor'; +import { installMessageListener } from './web-editor-v2/core/message-listener'; + +export default defineUnlistedScript(() => { + // Phase 1: Only support top frame + // Phase 4 will add iframe support via content injection + if (window !== window.top) { + return; + } + + // Singleton guard: prevent multiple instances + if (window.__MCP_WEB_EDITOR_V2__) { + console.log(`${WEB_EDITOR_V2_LOG_PREFIX} Already installed, skipping initialization`); + return; + } + + // Create and expose the API + const api = createWebEditorV2(); + window.__MCP_WEB_EDITOR_V2__ = api; + + // Install message listener for background communication + installMessageListener(api); + + console.log(`${WEB_EDITOR_V2_LOG_PREFIX} Installed successfully`); +}); diff --git a/app/chrome-extension/entrypoints/web-editor-v2/constants.ts b/app/chrome-extension/entrypoints/web-editor-v2/constants.ts new file mode 100644 index 0000000..cccc9b2 --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/constants.ts @@ -0,0 +1,52 @@ +/** + * Web Editor V2 Constants + * + * Centralized configuration values for the visual editor. + * All magic strings/numbers should be defined here. + */ + +/** Editor version number */ +export const WEB_EDITOR_V2_VERSION = 2 as const; + +/** Log prefix for console messages */ +export const WEB_EDITOR_V2_LOG_PREFIX = '[WebEditorV2]' as const; + +// ============================================================================= +// DOM Element IDs +// ============================================================================= + +/** Shadow host element ID */ +export const WEB_EDITOR_V2_HOST_ID = '__mcp_web_editor_v2_host__'; + +/** Overlay container ID (for Canvas and visual feedback) */ +export const WEB_EDITOR_V2_OVERLAY_ID = '__mcp_web_editor_v2_overlay__'; + +/** UI container ID (for panels and controls) */ +export const WEB_EDITOR_V2_UI_ID = '__mcp_web_editor_v2_ui__'; + +// ============================================================================= +// Styling +// ============================================================================= + +/** Maximum z-index to ensure editor is always on top */ +export const WEB_EDITOR_V2_Z_INDEX = 2147483647; + +/** Default panel width */ +export const WEB_EDITOR_V2_PANEL_WIDTH = 320; + +// ============================================================================= +// Colors (Design System) +// ============================================================================= + +export const WEB_EDITOR_V2_COLORS = { + /** Hover highlight color */ + hover: '#3b82f6', // blue-500 + /** Selected element color */ + selected: '#22c55e', // green-500 + /** Selection box border */ + selectionBorder: '#6366f1', // indigo-500 + /** Drag ghost color */ + dragGhost: 'rgba(99, 102, 241, 0.3)', + /** Insertion line color */ + insertionLine: '#f59e0b', // amber-500 +} as const; diff --git a/app/chrome-extension/entrypoints/web-editor-v2/core/editor.ts b/app/chrome-extension/entrypoints/web-editor-v2/core/editor.ts new file mode 100644 index 0000000..8a58c77 --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/core/editor.ts @@ -0,0 +1,376 @@ +/** + * Web Editor V2 Core + * + * Main orchestrator for the visual editor. + * Manages lifecycle of all subsystems (Shadow Host, Canvas, Interaction Engine, etc.) + */ + +import type { WebEditorState, WebEditorV2Api } from '@/common/web-editor-types'; +import { WEB_EDITOR_V2_VERSION, WEB_EDITOR_V2_LOG_PREFIX } from '../constants'; +import { mountShadowHost, type ShadowHostManager } from '../ui/shadow-host'; +import { createToolbar, type Toolbar } from '../ui/toolbar'; +import { createCanvasOverlay, type CanvasOverlay } from '../overlay/canvas-overlay'; +import { + createEventController, + type EventController, + type EventModifiers, +} from './event-controller'; +import { createPositionTracker, type PositionTracker, type TrackedRects } from './position-tracker'; +import { createSelectionEngine, type SelectionEngine } from '../selection/selection-engine'; +import { + createTransactionManager, + type TransactionManager, + type TransactionChangeEvent, +} from './transaction-manager'; +import { sendTransactionToAgent } from './payload-builder'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Internal editor state */ +interface EditorInternalState { + active: boolean; + shadowHost: ShadowHostManager | null; + canvasOverlay: CanvasOverlay | null; + eventController: EventController | null; + positionTracker: PositionTracker | null; + selectionEngine: SelectionEngine | null; + transactionManager: TransactionManager | null; + toolbar: Toolbar | null; + /** Currently hovered element (for hover highlight) */ + hoveredElement: Element | null; + /** Currently selected element (for selection highlight) */ + selectedElement: Element | null; +} + +// ============================================================================= +// Implementation +// ============================================================================= + +/** + * Create the Web Editor V2 instance. + * + * This is the main factory function that creates the editor API. + * The returned object implements WebEditorV2Api and is exposed on window.__MCP_WEB_EDITOR_V2__ + */ +export function createWebEditorV2(): WebEditorV2Api { + const state: EditorInternalState = { + active: false, + shadowHost: null, + canvasOverlay: null, + eventController: null, + positionTracker: null, + selectionEngine: null, + transactionManager: null, + toolbar: null, + hoveredElement: null, + selectedElement: null, + }; + + // =========================================================================== + // Event Handlers (wired to EventController callbacks) + // =========================================================================== + + /** + * Handle hover state changes from EventController + */ + function handleHover(element: Element | null): void { + state.hoveredElement = element; + + // Delegate position tracking to PositionTracker + // Use forceUpdate to avoid extra rAF frame delay + if (state.positionTracker) { + state.positionTracker.setHoverElement(element); + state.positionTracker.forceUpdate(); + } + } + + /** + * Handle element selection from EventController + */ + function handleSelect(element: Element, modifiers: EventModifiers): void { + state.selectedElement = element; + state.hoveredElement = null; + + // Delegate position tracking to PositionTracker + // Clear hover, set selection, then force immediate update + if (state.positionTracker) { + state.positionTracker.setHoverElement(null); + state.positionTracker.setSelectionElement(element); + state.positionTracker.forceUpdate(); + } + + // Log selection with modifier info for debugging + const modInfo = modifiers.alt ? ' (Alt: drill-up)' : ''; + console.log(`${WEB_EDITOR_V2_LOG_PREFIX} Selected${modInfo}:`, element.tagName, element); + } + + /** + * Handle deselection (ESC key) from EventController + */ + function handleDeselect(): void { + state.selectedElement = null; + + // Clear selection tracking and force immediate update + if (state.positionTracker) { + state.positionTracker.setSelectionElement(null); + state.positionTracker.forceUpdate(); + } + + console.log(`${WEB_EDITOR_V2_LOG_PREFIX} Deselected`); + } + + /** + * Handle position updates from PositionTracker (scroll/resize sync) + */ + function handlePositionUpdate(rects: TrackedRects): void { + if (!state.canvasOverlay) return; + + // Update canvas overlay with new positions + state.canvasOverlay.setHoverRect(rects.hover); + state.canvasOverlay.setSelectionRect(rects.selection); + + // Force immediate render to avoid extra rAF delay + // This collapses the render to the same frame as position calculation + state.canvasOverlay.render(); + } + + /** + * Handle transaction changes from TransactionManager + */ + function handleTransactionChange(event: TransactionChangeEvent): void { + // Log transaction events for debugging + const { action, undoCount, redoCount } = event; + console.log( + `${WEB_EDITOR_V2_LOG_PREFIX} Transaction: ${action} (undo: ${undoCount}, redo: ${redoCount})`, + ); + + // Update toolbar UI with undo/redo counts + state.toolbar?.setHistory(undoCount, redoCount); + } + + /** + * Apply the latest transaction to Agent (Apply to Code) + */ + async function applyLatestTransaction(): Promise<{ requestId?: string }> { + const tm = state.transactionManager; + if (!tm) { + throw new Error('Transaction manager not ready'); + } + + const undoStack = tm.getUndoStack(); + const tx = undoStack.length > 0 ? undoStack[undoStack.length - 1] : null; + if (!tx) { + throw new Error('No changes to apply'); + } + + const resp = await sendTransactionToAgent(tx); + const r = resp as { success?: unknown; requestId?: unknown; error?: unknown } | null; + + if (r && r.success === true) { + return { requestId: typeof r.requestId === 'string' ? r.requestId : undefined }; + } + + const err = typeof r?.error === 'string' ? r.error : 'Agent request failed'; + throw new Error(err); + } + + /** + * Handle transaction apply errors + */ + function handleTransactionError(error: unknown): void { + console.error(`${WEB_EDITOR_V2_LOG_PREFIX} Transaction apply error:`, error); + } + + /** + * Start the editor + */ + function start(): void { + if (state.active) { + console.log(`${WEB_EDITOR_V2_LOG_PREFIX} Already active`); + return; + } + + try { + // Mount Shadow DOM host + state.shadowHost = mountShadowHost({ + onRequestClose: () => stop(), + }); + + // Initialize Canvas Overlay + const elements = state.shadowHost.getElements(); + if (!elements?.overlayRoot) { + throw new Error('Shadow host overlayRoot not available'); + } + state.canvasOverlay = createCanvasOverlay({ + container: elements.overlayRoot, + }); + + // Initialize Selection Engine for intelligent element picking + state.selectionEngine = createSelectionEngine({ + isOverlayElement: state.shadowHost.isOverlayElement, + }); + + // Initialize Event Controller for interaction handling + // Wire up SelectionEngine's findBestTarget for intelligent selection (click only) + // Hover uses fast elementFromPoint for 60FPS performance + state.eventController = createEventController({ + isOverlayElement: state.shadowHost.isOverlayElement, + onHover: handleHover, + onSelect: handleSelect, + onDeselect: handleDeselect, + findTargetForSelect: (x, y, modifiers) => + state.selectionEngine?.findBestTarget(x, y, modifiers) ?? null, + }); + + // Initialize Position Tracker for scroll/resize synchronization + state.positionTracker = createPositionTracker({ + onPositionUpdate: handlePositionUpdate, + }); + + // Initialize Transaction Manager for undo/redo support + // Use isEventFromUi (not isOverlayElement) to properly check event source + state.transactionManager = createTransactionManager({ + enableKeyBindings: true, + isEventFromEditorUi: state.shadowHost.isEventFromUi, + onChange: handleTransactionChange, + onApplyError: handleTransactionError, + }); + + // Initialize Toolbar UI (must have uiRoot from shadow host) + if (!elements.uiRoot) { + throw new Error('Shadow host uiRoot not available'); + } + state.toolbar = createToolbar({ + container: elements.uiRoot, + dock: 'top', + onApply: applyLatestTransaction, + onUndo: () => state.transactionManager?.undo(), + onRedo: () => state.transactionManager?.redo(), + onRequestClose: () => stop(), + }); + + // Initialize toolbar history display + state.toolbar.setHistory( + state.transactionManager.getUndoStack().length, + state.transactionManager.getRedoStack().length, + ); + + state.active = true; + console.log(`${WEB_EDITOR_V2_LOG_PREFIX} Started`); + } catch (error) { + // Cleanup on failure (reverse order) + state.toolbar?.dispose(); + state.toolbar = null; + state.transactionManager?.dispose(); + state.transactionManager = null; + state.positionTracker?.dispose(); + state.positionTracker = null; + state.eventController?.dispose(); + state.eventController = null; + state.selectionEngine?.dispose(); + state.selectionEngine = null; + state.canvasOverlay?.dispose(); + state.canvasOverlay = null; + state.shadowHost?.dispose(); + state.shadowHost = null; + state.hoveredElement = null; + state.selectedElement = null; + state.active = false; + + console.error(`${WEB_EDITOR_V2_LOG_PREFIX} Failed to start:`, error); + } + } + + /** + * Stop the editor + */ + function stop(): void { + if (!state.active) { + return; + } + + state.active = false; + + try { + // Cleanup in reverse order of initialization + + // Cleanup Toolbar UI + state.toolbar?.dispose(); + state.toolbar = null; + + // Cleanup Transaction Manager (clears history) + state.transactionManager?.dispose(); + state.transactionManager = null; + + // Cleanup Position Tracker (stops scroll/resize monitoring) + state.positionTracker?.dispose(); + state.positionTracker = null; + + // Cleanup Event Controller (stops event interception) + state.eventController?.dispose(); + state.eventController = null; + + // Cleanup Selection Engine + state.selectionEngine?.dispose(); + state.selectionEngine = null; + + // Cleanup Canvas Overlay + state.canvasOverlay?.dispose(); + state.canvasOverlay = null; + + // Cleanup Shadow DOM host + state.shadowHost?.dispose(); + state.shadowHost = null; + + // Clear element references + state.hoveredElement = null; + state.selectedElement = null; + + console.log(`${WEB_EDITOR_V2_LOG_PREFIX} Stopped`); + } catch (error) { + console.error(`${WEB_EDITOR_V2_LOG_PREFIX} Error during cleanup:`, error); + + // Force cleanup + state.toolbar = null; + state.transactionManager = null; + state.positionTracker = null; + state.eventController = null; + state.selectionEngine = null; + state.canvasOverlay = null; + state.shadowHost = null; + state.hoveredElement = null; + state.selectedElement = null; + } + } + + /** + * Toggle the editor on/off + */ + function toggle(): boolean { + if (state.active) { + stop(); + } else { + start(); + } + return state.active; + } + + /** + * Get current editor state + */ + function getState(): WebEditorState { + return { + active: state.active, + version: WEB_EDITOR_V2_VERSION, + }; + } + + return { + start, + stop, + toggle, + getState, + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/core/event-controller.ts b/app/chrome-extension/entrypoints/web-editor-v2/core/event-controller.ts new file mode 100644 index 0000000..8d3f07b --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/core/event-controller.ts @@ -0,0 +1,428 @@ +/** + * Event Controller + * + * Capture-phase event interceptor for Web Editor V2. + * + * Responsibilities: + * - Intercept document-level pointer/mouse/keyboard events in capture phase + * - Allow editor UI events (Shadow DOM) to pass through unmodified + * - Block page interactions while editor is active + * - Provide hover/selecting mode state machine + * - Trigger callbacks for element hover, selection, and deselection + * + * Performance considerations: + * - Uses rAF throttling for hover updates (elementFromPoint is expensive) + * - Supports both PointerEvents (modern) and MouseEvents (fallback) + * - Events are blocked via stopImmediatePropagation for complete isolation + */ + +import { Disposer } from '../utils/disposables'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Mode of the event controller state machine */ +export type EventControllerMode = 'hover' | 'selecting'; + +/** Keyboard modifiers state */ +export interface EventModifiers { + alt: boolean; + shift: boolean; + ctrl: boolean; + meta: boolean; +} + +/** Options for creating the event controller */ +export interface EventControllerOptions { + /** Check if a DOM node belongs to the editor overlay */ + isOverlayElement: (node: unknown) => boolean; + /** Called when hovering over an element (null when hovering over nothing) */ + onHover: (element: Element | null) => void; + /** Called when an element is selected via click */ + onSelect: (element: Element, modifiers: EventModifiers) => void; + /** Called when selection is cancelled (ESC key or mode change) */ + onDeselect: () => void; + /** + * Optional custom target finder for selection (click). + * If not provided, uses simple elementFromPoint. + * Only used for selection, not hover (for performance). + */ + findTargetForSelect?: (x: number, y: number, modifiers: EventModifiers) => Element | null; +} + +/** Event controller public interface */ +export interface EventController { + /** Get current interaction mode */ + getMode(): EventControllerMode; + /** Set interaction mode programmatically */ + setMode(mode: EventControllerMode): void; + /** Cleanup all event listeners */ + dispose(): void; +} + +// ============================================================================= +// Constants +// ============================================================================= + +/** Common capture-phase listener options */ +const CAPTURE_OPTIONS: AddEventListenerOptions = { + capture: true, + passive: false, +}; + +/** Events to completely block on document (page interaction prevention) */ +const BLOCKED_POINTER_EVENTS = [ + 'pointerup', + 'pointercancel', + 'pointerover', + 'pointerout', + 'pointerenter', + 'pointerleave', +] as const; + +const BLOCKED_MOUSE_EVENTS = [ + 'mouseup', + 'click', + 'dblclick', + 'contextmenu', + 'auxclick', + 'mouseover', + 'mouseout', + 'mouseenter', + 'mouseleave', +] as const; + +const BLOCKED_KEYBOARD_EVENTS = ['keyup', 'keypress'] as const; + +const BLOCKED_TOUCH_EVENTS = ['touchstart', 'touchmove', 'touchend', 'touchcancel'] as const; + +// ============================================================================= +// Implementation +// ============================================================================= + +/** + * Create an event controller for managing editor interactions. + * + * The controller operates in two modes: + * - `hover`: Mouse movement triggers onHover callbacks, click transitions to selecting + * - `selecting`: An element is selected, ESC key returns to hover mode + */ +export function createEventController(options: EventControllerOptions): EventController { + const { isOverlayElement, onHover, onSelect, onDeselect, findTargetForSelect } = options; + const disposer = new Disposer(); + + // Feature detection for PointerEvents + const hasPointerEvents = typeof PointerEvent !== 'undefined'; + + // ========================================================================== + // State + // ========================================================================== + + let mode: EventControllerMode = 'hover'; + let lastHoveredElement: Element | null = null; + + // Pointer position tracking for rAF-throttled hover updates + let hasPointerPosition = false; + let lastClientX = 0; + let lastClientY = 0; + + // Single rAF management (avoids Disposer array growth) + let hoverRafId: number | null = null; + + // ========================================================================== + // Helpers + // ========================================================================== + + /** + * Check if an event originated from the editor UI (Shadow DOM safe) + */ + function isEventFromEditorUi(event: Event): boolean { + try { + if (typeof event.composedPath === 'function') { + return event.composedPath().some((node) => isOverlayElement(node)); + } + } catch { + // Fallback to target check + } + return isOverlayElement(event.target); + } + + /** + * Block an event from reaching the page + */ + function blockPageEvent(event: Event): void { + if (event.cancelable) { + event.preventDefault(); + } + event.stopImmediatePropagation(); + event.stopPropagation(); + } + + /** Default modifiers (all false) */ + const defaultModifiers: EventModifiers = { + alt: false, + shift: false, + ctrl: false, + meta: false, + }; + + /** + * Extract modifiers from an event + */ + function extractModifiers(event: MouseEvent | KeyboardEvent): EventModifiers { + return { + alt: event.altKey, + shift: event.shiftKey, + ctrl: event.ctrlKey, + meta: event.metaKey, + }; + } + + /** + * Get the topmost element at a viewport coordinate (fast, for hover). + * Uses simple elementFromPoint to maintain 60FPS hover performance. + */ + function getTargetElementAtFast(clientX: number, clientY: number): Element | null { + if (!Number.isFinite(clientX) || !Number.isFinite(clientY)) { + return null; + } + + const element = document.elementFromPoint(clientX, clientY); + if (!element) return null; + + // Skip if element is part of the editor overlay + if (isOverlayElement(element)) return null; + + return element; + } + + /** + * Get the best target element for selection (can be slower, uses intelligent picking). + * Uses custom findTargetForSelect if provided, otherwise falls back to fast method. + */ + function getTargetElementForSelection( + clientX: number, + clientY: number, + modifiers: EventModifiers, + ): Element | null { + if (!Number.isFinite(clientX) || !Number.isFinite(clientY)) { + return null; + } + + // Use intelligent target finder if provided (e.g., SelectionEngine) + if (findTargetForSelect) { + const target = findTargetForSelect(clientX, clientY, modifiers); + // Defensive check: ensure result is not an overlay element + if (target && isOverlayElement(target)) return null; + return target; + } + + // Fallback: simple elementFromPoint + return getTargetElementAtFast(clientX, clientY); + } + + // ========================================================================== + // Hover Logic (rAF throttled) + // ========================================================================== + + /** + * Cancel any pending hover rAF + */ + function cancelHoverRaf(): void { + if (hoverRafId !== null) { + cancelAnimationFrame(hoverRafId); + hoverRafId = null; + } + } + // Register cleanup for disposal + disposer.add(cancelHoverRaf); + + /** + * Commit the hover update by finding element at current pointer position + */ + function commitHoverUpdate(forceUpdate = false): void { + hoverRafId = null; + + if (disposer.isDisposed) return; + if (mode !== 'hover') return; + if (!hasPointerPosition) return; + + // Use fast method for hover (60FPS performance) + const nextElement = getTargetElementAtFast(lastClientX, lastClientY); + + // Skip if same element (pointer identity check), unless forced + if (!forceUpdate && nextElement === lastHoveredElement) return; + + lastHoveredElement = nextElement; + onHover(nextElement); + } + + /** + * Schedule a hover update on the next animation frame + */ + function scheduleHoverUpdate(forceUpdate = false): void { + // If already pending, don't schedule another + if (hoverRafId !== null) return; + if (disposer.isDisposed) return; + + // Use rAF to throttle elementFromPoint calls to once per frame + // This prevents performance degradation from high-frequency pointer events + hoverRafId = requestAnimationFrame(() => { + commitHoverUpdate(forceUpdate); + }); + } + + // ========================================================================== + // Mode Management + // ========================================================================== + + /** + * Set the interaction mode + */ + function setMode(nextMode: EventControllerMode): void { + if (disposer.isDisposed) return; + if (mode === nextMode) return; + + const prevMode = mode; + mode = nextMode; + + // Handle transitions + if (prevMode === 'hover' && nextMode === 'selecting') { + // Entering selection mode - cancel pending hover, reset tracked element + cancelHoverRaf(); + lastHoveredElement = null; + } else if (prevMode === 'selecting' && nextMode === 'hover') { + // Exiting selection - notify and force resume hover tracking + // Reset lastHoveredElement to force onHover callback even if pointer is on same element + lastHoveredElement = null; + onDeselect(); + if (hasPointerPosition) { + // Force update to re-highlight element under pointer + scheduleHoverUpdate(true); + } + } + } + + // ========================================================================== + // Event Handlers + // ========================================================================== + + /** + * Handle pointer/mouse move for hover tracking + */ + function handlePointerMove(event: PointerEvent | MouseEvent): void { + // If event is from editor UI, clear hover highlight and return + if (isEventFromEditorUi(event)) { + if (mode === 'hover' && lastHoveredElement !== null) { + lastHoveredElement = null; + onHover(null); + } + return; + } + blockPageEvent(event); + + // Update tracked position + lastClientX = event.clientX; + lastClientY = event.clientY; + hasPointerPosition = true; + + // Only process hover in hover mode + if (mode !== 'hover') return; + scheduleHoverUpdate(); + } + + /** + * Handle pointer/mouse down for element selection + */ + function handlePointerDown(event: PointerEvent | MouseEvent): void { + if (isEventFromEditorUi(event)) return; + blockPageEvent(event); + + // Update tracked position + lastClientX = event.clientX; + lastClientY = event.clientY; + hasPointerPosition = true; + + // Only process in hover mode, left-click only + if (mode !== 'hover') return; + if (event.button !== 0) return; + + // Extract modifiers for intelligent selection (e.g., Alt for drill-up) + const modifiers = extractModifiers(event); + // Use intelligent selection for click (can afford more computation) + const target = getTargetElementForSelection(event.clientX, event.clientY, modifiers); + if (!target) return; + + // Transition to selecting mode + setMode('selecting'); + onSelect(target, modifiers); + } + + /** + * Handle keydown for ESC cancellation + */ + function handleKeyDown(event: KeyboardEvent): void { + if (isEventFromEditorUi(event)) return; + blockPageEvent(event); + + // ESC key cancels selection + if (event.key === 'Escape' && mode === 'selecting') { + setMode('hover'); + } + } + + /** + * Generic blocker for events that should never reach the page + */ + function handleBlockedEvent(event: Event): void { + if (isEventFromEditorUi(event)) return; + blockPageEvent(event); + } + + // ========================================================================== + // Event Registration + // ========================================================================== + + // Register pointer events (modern browsers) + if (hasPointerEvents) { + disposer.listen(document, 'pointermove', handlePointerMove, CAPTURE_OPTIONS); + disposer.listen(document, 'pointerdown', handlePointerDown, CAPTURE_OPTIONS); + + for (const eventType of BLOCKED_POINTER_EVENTS) { + disposer.listen(document, eventType, handleBlockedEvent, CAPTURE_OPTIONS); + } + } + + // Register mouse events (fallback for older browsers, or when pointer events are unavailable) + // Note: On modern browsers with PointerEvents, mouse events still fire after pointer events, + // so we always register them to ensure complete blocking + disposer.listen(document, 'mousemove', handlePointerMove, CAPTURE_OPTIONS); + disposer.listen(document, 'mousedown', handlePointerDown, CAPTURE_OPTIONS); + + for (const eventType of BLOCKED_MOUSE_EVENTS) { + disposer.listen(document, eventType, handleBlockedEvent, CAPTURE_OPTIONS); + } + + // Register keyboard events + disposer.listen(document, 'keydown', handleKeyDown, CAPTURE_OPTIONS); + + for (const eventType of BLOCKED_KEYBOARD_EVENTS) { + disposer.listen(document, eventType, handleBlockedEvent, CAPTURE_OPTIONS); + } + + // Register touch events (prevent touch interactions on mobile) + for (const eventType of BLOCKED_TOUCH_EVENTS) { + disposer.listen(document, eventType, handleBlockedEvent, CAPTURE_OPTIONS); + } + + // ========================================================================== + // Public API + // ========================================================================== + + return { + getMode: () => mode, + setMode, + dispose: () => disposer.dispose(), + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/core/locator.ts b/app/chrome-extension/entrypoints/web-editor-v2/core/locator.ts new file mode 100644 index 0000000..f0f6673 --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/core/locator.ts @@ -0,0 +1,544 @@ +/** + * Element Locator Utilities + * + * Generates and resolves CSS-based element locators for the Transaction System. + * + * Design goals: + * - Generate stable, unique CSS selectors for DOM elements + * - Support Shadow DOM boundaries with host chain traversal + * - Provide fallback strategies when primary selector fails + * - Compute structural fingerprints for fuzzy matching + */ + +import type { ElementLocator } from '@/common/web-editor-types'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Options for CSS selector generation */ +export interface SelectorGenerationOptions { + /** Root node for uniqueness checking (defaults to element's root) */ + root?: Document | ShadowRoot; + /** Maximum number of selector candidates to generate */ + maxCandidates?: number; +} + +// ============================================================================= +// Constants +// ============================================================================= + +/** Maximum candidate selectors to generate */ +const DEFAULT_MAX_CANDIDATES = 5; + +/** Maximum text length for fingerprint */ +const FINGERPRINT_TEXT_MAX_LENGTH = 32; + +/** Maximum classes to include in fingerprint */ +const FINGERPRINT_MAX_CLASSES = 8; + +/** Priority ordered data attributes for unique identification */ +const UNIQUE_DATA_ATTRS = [ + 'data-testid', + 'data-test-id', + 'data-test', + 'data-qa', + 'data-cy', + 'name', + 'title', + 'alt', +] as const; + +/** Maximum class combinations to try for uniqueness */ +const MAX_CLASS_COMBO_DEPTH = 3; + +// ============================================================================= +// CSS Escape Utility +// ============================================================================= + +/** + * Escape a string for use in CSS selector. + * Uses native CSS.escape if available, otherwise a spec-compliant polyfill. + */ +function cssEscape(value: string): string { + // Try native CSS.escape + if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') { + return CSS.escape(value); + } + + // Polyfill based on CSSOM spec + const str = String(value); + const len = str.length; + if (len === 0) return ''; + + let result = ''; + const firstCodeUnit = str.charCodeAt(0); + + for (let i = 0; i < len; i++) { + const codeUnit = str.charCodeAt(i); + + // Null character -> replacement character + if (codeUnit === 0x0000) { + result += '\uFFFD'; + continue; + } + + // Control characters and special numeric positions + if ( + (codeUnit >= 0x0001 && codeUnit <= 0x001f) || + codeUnit === 0x007f || + (i === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || + (i === 1 && codeUnit >= 0x0030 && codeUnit <= 0x0039 && firstCodeUnit === 0x002d) + ) { + result += `\\${codeUnit.toString(16)} `; + continue; + } + + // Single hyphen at start + if (i === 0 && len === 1 && codeUnit === 0x002d) { + result += `\\${str.charAt(i)}`; + continue; + } + + // Safe ASCII characters (alphanumeric, hyphen, underscore) + const isAsciiAlnum = + (codeUnit >= 0x0030 && codeUnit <= 0x0039) || // 0-9 + (codeUnit >= 0x0041 && codeUnit <= 0x005a) || // A-Z + (codeUnit >= 0x0061 && codeUnit <= 0x007a); // a-z + const isSafe = isAsciiAlnum || codeUnit === 0x002d || codeUnit === 0x005f; + + if (isSafe) { + result += str.charAt(i); + } else { + result += `\\${str.charAt(i)}`; + } + } + + return result; +} + +// ============================================================================= +// Query Helpers +// ============================================================================= + +/** + * Get the query root for an element (Document or ShadowRoot) + */ +function getQueryRoot(element: Element): Document | ShadowRoot { + const root = element.getRootNode?.(); + return root instanceof ShadowRoot ? root : document; +} + +/** + * Safely execute querySelector, returning null on invalid selectors + */ +function safeQuerySelector(root: ParentNode, selector: string): Element | null { + try { + return root.querySelector(selector); + } catch { + return null; + } +} + +/** + * Check if a selector matches exactly one element in the root + */ +function isUnique(root: ParentNode, selector: string): boolean { + try { + return root.querySelectorAll(selector).length === 1; + } catch { + return false; + } +} + +// ============================================================================= +// Selector Generation Strategies +// ============================================================================= + +/** + * Try to build a unique ID-based selector + */ +function tryIdSelector(element: Element, root: ParentNode): string | null { + const id = element.id?.trim(); + if (!id) return null; + + const selector = `#${cssEscape(id)}`; + return isUnique(root, selector) ? selector : null; +} + +/** + * Try to build a unique data-attribute selector + */ +function tryDataAttrSelector(element: Element, root: ParentNode): string | null { + const tag = element.tagName.toLowerCase(); + + for (const attr of UNIQUE_DATA_ATTRS) { + const value = element.getAttribute(attr)?.trim(); + if (!value) continue; + + // Try attribute alone + const attrOnly = `[${attr}="${cssEscape(value)}"]`; + if (isUnique(root, attrOnly)) return attrOnly; + + // Try with tag prefix + const withTag = `${tag}${attrOnly}`; + if (isUnique(root, withTag)) return withTag; + } + + return null; +} + +/** + * Try to build a unique class-based selector + */ +function tryClassSelector(element: Element, root: ParentNode): string | null { + const tag = element.tagName.toLowerCase(); + const classes = Array.from(element.classList).filter( + (c) => c && /^[a-zA-Z_][a-zA-Z0-9_-]*$/.test(c), + ); + + if (classes.length === 0) return null; + + // Try single class + for (const cls of classes) { + const sel = `.${cssEscape(cls)}`; + if (isUnique(root, sel)) return sel; + } + + // Try tag + single class + for (const cls of classes) { + const sel = `${tag}.${cssEscape(cls)}`; + if (isUnique(root, sel)) return sel; + } + + // Try class combinations (up to 3) + const limit = Math.min(classes.length, MAX_CLASS_COMBO_DEPTH); + for (let i = 0; i < limit; i++) { + for (let j = i + 1; j < limit; j++) { + const sel = `.${cssEscape(classes[i])}.${cssEscape(classes[j])}`; + if (isUnique(root, sel)) return sel; + } + } + + return null; +} + +/** + * Build a structural path selector using nth-of-type + */ +function buildPathSelector(element: Element, root: Document | ShadowRoot): string { + const segments: string[] = []; + let current: Element | null = element; + + // Determine stop condition based on root type + const isDocument = root instanceof Document; + + while (current && current.nodeType === Node.ELEMENT_NODE) { + const tag = current.tagName.toLowerCase(); + + // Stop at body for document, or at shadow root boundary + if (isDocument && tag === 'body') break; + + let selector = tag; + + // Find parent context + const parent = current.parentElement; + const parentNode = current.parentNode; + + // Get siblings from appropriate parent + let siblings: Element[]; + if (parent) { + siblings = Array.from(parent.children); + } else if (parentNode instanceof ShadowRoot || parentNode instanceof Document) { + siblings = Array.from(parentNode.children); + } else { + siblings = []; + } + + // Add nth-of-type if there are siblings with same tag + const sameTagSiblings = siblings.filter((s) => s.tagName === current!.tagName); + if (sameTagSiblings.length > 1) { + const index = sameTagSiblings.indexOf(current) + 1; + selector += `:nth-of-type(${index})`; + } + + segments.unshift(selector); + current = parent; + + // Stop if we've reached the root's direct children + if (!parent && parentNode === root) break; + } + + const path = segments.join(' > '); + return isDocument ? `body > ${path}` : path || '*'; +} + +// ============================================================================= +// Shadow DOM Utilities +// ============================================================================= + +/** + * Get selector chain for shadow host ancestors (from outer to inner) + */ +export function getShadowHostChain(element: Element): string[] | undefined { + const chain: string[] = []; + let current: Element = element; + + while (true) { + const root = current.getRootNode?.(); + if (!(root instanceof ShadowRoot)) break; + + const host = root.host; + if (!(host instanceof Element)) break; + + const hostRoot = getQueryRoot(host); + const hostSelector = generateCssSelector(host, { root: hostRoot }); + if (!hostSelector) break; + + chain.unshift(hostSelector); + current = host; + } + + return chain.length > 0 ? chain : undefined; +} + +// ============================================================================= +// Fingerprint Generation +// ============================================================================= + +/** + * Normalize text content for fingerprinting + */ +function normalizeText(text: string, maxLength: number): string { + return text.replace(/\s+/g, ' ').trim().slice(0, maxLength); +} + +/** + * Compute a structural fingerprint for fuzzy element matching + */ +export function computeFingerprint(element: Element): string { + const parts: string[] = []; + + // Tag name + const tag = element.tagName?.toLowerCase() ?? 'unknown'; + parts.push(tag); + + // ID if present + const id = element.id?.trim(); + if (id) { + parts.push(`id=${id}`); + } + + // Class names (limited) + const classes = Array.from(element.classList).slice(0, FINGERPRINT_MAX_CLASSES); + if (classes.length > 0) { + parts.push(`class=${classes.join('.')}`); + } + + // Text content hint + const text = normalizeText(element.textContent ?? '', FINGERPRINT_TEXT_MAX_LENGTH); + if (text) { + parts.push(`text=${text}`); + } + + return parts.join('|'); +} + +// ============================================================================= +// DOM Path Computation +// ============================================================================= + +/** + * Compute the DOM tree path as child indices from root + */ +export function computeDomPath(element: Element): number[] { + const path: number[] = []; + let current: Element | null = element; + + while (current) { + const parent = current.parentElement; + + if (parent) { + const siblings = Array.from(parent.children); + const index = siblings.indexOf(current); + if (index >= 0) path.unshift(index); + current = parent; + continue; + } + + // Check for shadow root or document as parent + const parentNode = current.parentNode; + if (parentNode instanceof ShadowRoot || parentNode instanceof Document) { + const children = Array.from(parentNode.children); + const index = children.indexOf(current); + if (index >= 0) path.unshift(index); + } + + break; + } + + return path; +} + +// ============================================================================= +// Public API - Selector Generation +// ============================================================================= + +/** + * Generate multiple CSS selector candidates for an element. + * Candidates are ordered by preference: ID > data-attr > class > path + */ +export function generateSelectorCandidates( + element: Element, + options: SelectorGenerationOptions = {}, +): string[] { + const root = options.root ?? getQueryRoot(element); + const maxCandidates = Math.max(1, options.maxCandidates ?? DEFAULT_MAX_CANDIDATES); + + const candidates: string[] = []; + + const push = (selector: string | null): void => { + if (!selector) return; + const s = selector.trim(); + if (!s || candidates.includes(s)) return; + candidates.push(s); + }; + + // Try strategies in order of preference + push(tryIdSelector(element, root)); + push(tryDataAttrSelector(element, root)); + push(tryClassSelector(element, root)); + push(buildPathSelector(element, root)); + + return candidates.slice(0, maxCandidates); +} + +/** + * Generate a single best CSS selector for an element + */ +export function generateCssSelector( + element: Element, + options: SelectorGenerationOptions = {}, +): string { + return generateSelectorCandidates(element, options)[0] ?? ''; +} + +// ============================================================================= +// Public API - Locator Creation & Resolution +// ============================================================================= + +/** + * Create a complete ElementLocator for an element. + * The locator contains multiple strategies for re-identification. + */ +export function createElementLocator(element: Element): ElementLocator { + const root = getQueryRoot(element); + + return { + selectors: generateSelectorCandidates(element, { root, maxCandidates: DEFAULT_MAX_CANDIDATES }), + fingerprint: computeFingerprint(element), + path: computeDomPath(element), + shadowHostChain: getShadowHostChain(element), + }; +} + +/** + * Safely check if a selector matches exactly one element + */ +function isSelectorUnique(root: ParentNode, selector: string): boolean { + try { + return root.querySelectorAll(selector).length === 1; + } catch { + return false; + } +} + +/** + * Verify element matches the stored fingerprint + */ +function verifyFingerprint(element: Element, fingerprint: string): boolean { + const currentFingerprint = computeFingerprint(element); + // Simple check: verify tag and id match at minimum + const storedParts = fingerprint.split('|'); + const currentParts = currentFingerprint.split('|'); + + // At minimum, tag should match + if (storedParts[0] !== currentParts[0]) return false; + + // If stored has id, current should have same id + const storedId = storedParts.find((p) => p.startsWith('id=')); + const currentId = currentParts.find((p) => p.startsWith('id=')); + if (storedId && storedId !== currentId) return false; + + return true; +} + +/** + * Resolve an ElementLocator to a DOM element. + * Traverses Shadow DOM boundaries and tries multiple selector candidates. + * Includes uniqueness verification to avoid misidentification. + */ +export function locateElement( + locator: ElementLocator, + rootDocument: Document = document, +): Element | null { + let doc: Document = rootDocument; + + // Traverse iframe chain (Phase 4 - not implemented yet) + if (locator.frameChain?.length) { + for (const frameSelector of locator.frameChain) { + const frame = safeQuerySelector(doc, frameSelector); + if (!(frame instanceof HTMLIFrameElement)) return null; + const contentDoc = frame.contentDocument; + if (!contentDoc) return null; + doc = contentDoc; + } + } + + // Start with document as query root + let queryRoot: Document | ShadowRoot = doc; + + // Traverse Shadow DOM host chain + if (locator.shadowHostChain?.length) { + for (const hostSelector of locator.shadowHostChain) { + // Verify host selector is unique + if (!isSelectorUnique(queryRoot, hostSelector)) return null; + + const host = safeQuerySelector(queryRoot, hostSelector); + if (!host) return null; + + const shadowRoot = (host as HTMLElement).shadowRoot; + if (!shadowRoot) return null; + + queryRoot = shadowRoot; + } + } + + // Try each selector candidate with uniqueness and fingerprint verification + for (const selector of locator.selectors) { + // Check if selector still matches exactly one element + if (!isSelectorUnique(queryRoot, selector)) continue; + + const element = safeQuerySelector(queryRoot, selector); + if (!element) continue; + + // Verify fingerprint matches to catch "same selector, different element" cases + if (locator.fingerprint && !verifyFingerprint(element, locator.fingerprint)) { + continue; + } + + return element; + } + + return null; +} + +/** + * Generate a unique key for an ElementLocator (for comparison/caching) + */ +export function locatorKey(locator: ElementLocator): string { + const selectors = locator.selectors.join('|'); + const shadow = locator.shadowHostChain?.join('>') ?? ''; + const frame = locator.frameChain?.join('>') ?? ''; + return `frame:${frame}|shadow:${shadow}|sel:${selectors}`; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/core/message-listener.ts b/app/chrome-extension/entrypoints/web-editor-v2/core/message-listener.ts new file mode 100644 index 0000000..a37e55b --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/core/message-listener.ts @@ -0,0 +1,117 @@ +/** + * Web Editor V2 Message Listener + * + * Handles chrome.runtime.onMessage communication with the background script. + * Uses versioned action names (suffix _v2) to avoid conflicts with V1. + */ + +import type { + WebEditorV2Api, + WebEditorV2Request, + WebEditorV2PingResponse, + WebEditorV2ToggleResponse, + WebEditorV2StartResponse, + WebEditorV2StopResponse, +} from '@/common/web-editor-types'; +import { WEB_EDITOR_V2_ACTIONS } from '@/common/web-editor-types'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Function to remove the message listener */ +export type RemoveMessageListener = () => void; + +/** All possible V2 response types */ +type WebEditorV2Response = + | WebEditorV2PingResponse + | WebEditorV2ToggleResponse + | WebEditorV2StartResponse + | WebEditorV2StopResponse; + +// ============================================================================= +// Implementation +// ============================================================================= + +/** + * Type guard to check if a request is a V2 editor request + */ +function isV2Request(request: unknown): request is WebEditorV2Request { + if (!request || typeof request !== 'object') return false; + + const action = (request as { action?: unknown }).action; + return ( + action === WEB_EDITOR_V2_ACTIONS.PING || + action === WEB_EDITOR_V2_ACTIONS.TOGGLE || + action === WEB_EDITOR_V2_ACTIONS.START || + action === WEB_EDITOR_V2_ACTIONS.STOP + ); +} + +/** + * Install the message listener for background communication. + * Returns a function to remove the listener. + * + * @param api The WebEditorV2Api instance to delegate commands to + * @returns Function to remove the listener + */ +export function installMessageListener(api: WebEditorV2Api): RemoveMessageListener { + const listener = ( + request: unknown, + _sender: chrome.runtime.MessageSender, + sendResponse: (response: WebEditorV2Response) => void, + ): boolean => { + // Only handle V2 requests + if (!isV2Request(request)) { + return false; + } + + switch (request.action) { + case WEB_EDITOR_V2_ACTIONS.PING: { + const response: WebEditorV2PingResponse = { + status: 'pong', + active: api.getState().active, + version: 2, + }; + sendResponse(response); + return false; // Synchronous response + } + + case WEB_EDITOR_V2_ACTIONS.TOGGLE: { + const response: WebEditorV2ToggleResponse = { + active: api.toggle(), + }; + sendResponse(response); + return false; + } + + case WEB_EDITOR_V2_ACTIONS.START: { + api.start(); + const response: WebEditorV2StartResponse = { + active: true, + }; + sendResponse(response); + return false; + } + + case WEB_EDITOR_V2_ACTIONS.STOP: { + api.stop(); + const response: WebEditorV2StopResponse = { + active: false, + }; + sendResponse(response); + return false; + } + + default: + // Should never reach here due to type guard + return false; + } + }; + + chrome.runtime.onMessage.addListener(listener); + + return () => { + chrome.runtime.onMessage.removeListener(listener); + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/core/payload-builder.ts b/app/chrome-extension/entrypoints/web-editor-v2/core/payload-builder.ts new file mode 100644 index 0000000..5fcc30b --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/core/payload-builder.ts @@ -0,0 +1,533 @@ +/** + * Payload Builder (Phase 1.8) + * + * Builds "Apply to Code" payload from Transactions for sending to the Agent. + * + * Design goals: + * - Reuse existing BACKGROUND_MESSAGE_TYPES.WEB_EDITOR_APPLY pipeline + * - Extract React/Vue component debug info when available + * - Build comprehensive style diff descriptions + * - Detect tech stack (Tailwind, React, Vue) from DOM hints + */ + +import type { DebugSource, ElementLocator, Transaction } from '@/common/web-editor-types'; +import { BACKGROUND_MESSAGE_TYPES } from '@/common/message-types'; +import { locateElement } from './locator'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Instruction type for Apply payload */ +export type ApplyInstructionType = 'update_text' | 'update_style'; + +/** Element fingerprint for identification */ +export interface ElementFingerprint { + tag: string; + id?: string; + classes: string[]; + text?: string; +} + +/** Style change instruction */ +export interface ApplyInstruction { + type: ApplyInstructionType; + description: string; + text?: string; + style?: Record; +} + +/** Complete payload sent to background/Agent */ +export interface ApplyPayload { + pageUrl: string; + targetFile?: string; + fingerprint: ElementFingerprint; + techStackHint?: string[]; + instruction: ApplyInstruction; + + // V2 extended fields (best-effort, optional) + locator?: ElementLocator; + selectorCandidates?: string[]; + debugSource?: DebugSource; + operation?: { + type: 'update_style'; + before: Record; + after: Record; + removed: string[]; + }; +} + +/** Options for building payload */ +export interface BuildPayloadOptions { + pageUrl?: string; + /** Pre-resolved element to avoid re-locating */ + element?: Element | null; + /** Max selectors to include in description */ + maxSelectorsInDescription?: number; +} + +// ============================================================================= +// Helper Functions +// ============================================================================= + +/** + * Safely access object as record + */ +function asRecord(value: unknown): Record | null { + if (value && typeof value === 'object') { + return value as Record; + } + return null; +} + +/** + * Read optional string value + */ +function readString(value: unknown): string | undefined { + if (typeof value === 'string') { + const trimmed = value.trim(); + return trimmed || undefined; + } + return undefined; +} + +/** + * Read optional number value + */ +function readNumber(value: unknown): number | undefined { + if (typeof value === 'number' && Number.isFinite(value)) { + return value; + } + const parsed = Number.parseInt(String(value), 10); + return Number.isFinite(parsed) ? parsed : undefined; +} + +/** + * Normalize text snippet for display + */ +function normalizeText(text: string, maxLength: number): string { + return String(text ?? '') + .replace(/\s+/g, ' ') + .trim() + .slice(0, maxLength); +} + +// ============================================================================= +// Fingerprint Generation +// ============================================================================= + +/** + * Build fingerprint from DOM element + */ +function buildFingerprintFromElement(element: Element): ElementFingerprint { + const tag = element.tagName?.toLowerCase() ?? 'unknown'; + const id = readString((element as HTMLElement).id); + const classes = Array.from(element.classList ?? []).slice(0, 24); + const text = readString(normalizeText(element.textContent ?? '', 96)); + + return { tag, id, classes, text }; +} + +/** + * Build fingerprint from locator (fallback when element not available) + */ +function buildFingerprintFromLocator(locator: ElementLocator): ElementFingerprint { + const raw = readString(locator.fingerprint) ?? ''; + const parts = raw.split('|').filter(Boolean); + + const tag = parts[0] || 'unknown'; + let id: string | undefined; + let classes: string[] = []; + let text: string | undefined; + + for (const part of parts.slice(1)) { + if (part.startsWith('id=')) { + id = readString(part.slice(3)); + } else if (part.startsWith('class=')) { + classes = part.slice(6).split('.').filter(Boolean); + } else if (part.startsWith('text=')) { + text = readString(part.slice(5)); + } + } + + return { tag, id, classes, text }; +} + +// ============================================================================= +// Tech Stack Detection +// ============================================================================= + +/** Tailwind class patterns */ +const TAILWIND_PATTERNS = [ + /^bg-/, + /^text-/, + /^p[trblxy]?-/, + /^m[trblxy]?-/, + /^flex$/, + /^grid$/, + /^items-/, + /^justify-/, + /^gap-/, + /^rounded/, + /^shadow/, + /^border/, + /^w-/, + /^h-/, +]; + +/** + * Detect if element uses Tailwind CSS + */ +function detectTailwind(classes: string[]): boolean { + return classes.some((cls) => TAILWIND_PATTERNS.some((p) => p.test(cls))); +} + +/** + * Read component name from function/object + */ +function readComponentName(value: unknown): string | undefined { + if (!value) return undefined; + + if (typeof value === 'function') { + const fn = value as { displayName?: unknown; name?: unknown }; + return readString(fn.displayName) ?? readString(fn.name); + } + + const rec = asRecord(value); + if (rec) { + return readString(rec.displayName) ?? readString(rec.name); + } + + return undefined; +} + +// ============================================================================= +// React Debug Source Extraction +// ============================================================================= + +/** + * Extract debug source from React Fiber + */ +function extractReactDebugSource(fiber: unknown): DebugSource | null { + let current = fiber; + + for (let i = 0; i < 40 && current; i++) { + const rec = asRecord(current); + if (!rec) break; + + // Check _debugSource + const src = asRecord(rec._debugSource); + const file = readString(src?.fileName); + if (file) { + const componentName = readComponentName(rec.elementType) ?? readComponentName(rec.type); + return { + file, + line: readNumber(src?.lineNumber), + column: readNumber(src?.columnNumber), + componentName, + }; + } + + // Check owner's debug source + const owner = asRecord(rec._debugOwner); + const ownerSrc = asRecord(owner?._debugSource); + const ownerFile = readString(ownerSrc?.fileName); + if (ownerFile) { + const componentName = readComponentName(owner?.elementType) ?? readComponentName(owner?.type); + return { + file: ownerFile, + line: readNumber(ownerSrc?.lineNumber), + column: readNumber(ownerSrc?.columnNumber), + componentName, + }; + } + + current = rec.return; + } + + return null; +} + +/** + * Find React debug source from element + */ +function findReactDebugSource(element: Element): DebugSource | null { + try { + let node: Element | null = element; + + for (let depth = 0; depth < 15 && node; depth++) { + const rec = node as unknown as Record; + + for (const key of Object.keys(rec)) { + if (key.startsWith('__reactFiber$') || key.startsWith('__reactInternalInstance$')) { + const source = extractReactDebugSource(rec[key]); + if (source) return source; + } + } + + node = node.parentElement; + } + } catch { + // Best-effort only + } + + return null; +} + +// ============================================================================= +// Vue Debug Source Extraction +// ============================================================================= + +/** + * Find Vue debug source from element + */ +function findVueDebugSource(element: Element): DebugSource | null { + try { + let node: Element | null = element; + + for (let depth = 0; depth < 15 && node; depth++) { + const rec = node as unknown as Record; + const inst = asRecord(rec.__vueParentComponent); + const typeRec = asRecord(inst?.type); + const file = readString(typeRec?.__file); + + if (file) { + return { + file, + componentName: readString(typeRec?.name), + }; + } + + node = node.parentElement; + } + } catch { + // Best-effort only + } + + return null; +} + +// ============================================================================= +// Component Hints Resolution +// ============================================================================= + +interface ComponentHints { + targetFile?: string; + debugSource?: DebugSource; + techStackHint?: string[]; +} + +/** + * Resolve component hints from element + */ +function resolveComponentHints(element: Element): ComponentHints { + let targetFile: string | undefined; + let debugSource: DebugSource | undefined; + const hints = new Set(); + + let node: Element | null = element; + + for (let depth = 0; depth < 20 && node; depth++) { + // Try React + const react = findReactDebugSource(node); + if (react?.file) { + hints.add('React'); + if (!targetFile && !react.file.includes('node_modules')) { + targetFile = react.file; + debugSource = react; + break; + } + } + + // Try Vue + const vue = findVueDebugSource(node); + if (vue?.file) { + hints.add('Vue'); + if (!targetFile && !vue.file.includes('node_modules')) { + targetFile = vue.file; + debugSource = vue; + break; + } + } + + node = node.parentElement; + } + + // Check for Tailwind + const classes = Array.from(element.classList ?? []).slice(0, 128); + if (detectTailwind(classes)) { + hints.add('Tailwind'); + } + + return { + targetFile, + debugSource, + techStackHint: hints.size > 0 ? Array.from(hints) : undefined, + }; +} + +// ============================================================================= +// Style Diff Computation +// ============================================================================= + +interface StyleDiff { + before: Record; + after: Record; + set: Record; + removed: string[]; +} + +/** + * Compute style diff from transaction + */ +function computeStyleDiff(tx: Transaction): StyleDiff | null { + const beforeRaw = tx.before.styles ?? {}; + const afterRaw = tx.after.styles ?? {}; + + const keys = new Set([...Object.keys(beforeRaw), ...Object.keys(afterRaw)]); + if (keys.size === 0) return null; + + const before: Record = {}; + const after: Record = {}; + const set: Record = {}; + const removed: string[] = []; + + for (const key of keys) { + const b = String(beforeRaw[key] ?? '').trim(); + const a = String(afterRaw[key] ?? '').trim(); + + if (b === a) continue; + + before[key] = b; + after[key] = a; + + if (a) { + set[key] = a; + } else { + removed.push(key); + } + } + + if (Object.keys(before).length === 0 && Object.keys(after).length === 0) { + return null; + } + + return { before, after, set, removed }; +} + +/** + * Build human-readable style description + */ +function buildStyleDescription( + locator: ElementLocator, + diff: StyleDiff, + maxSelectors: number, +): string { + const selectors = (locator.selectors ?? []).filter(Boolean); + const selectorPreview = selectors.slice(0, maxSelectors).join(' | '); + + const changes: string[] = []; + for (const [prop, nextVal] of Object.entries(diff.after)) { + const prevVal = diff.before[prop] ?? ''; + if (nextVal) { + changes.push(`${prop}: "${prevVal}" -> "${nextVal}"`); + } else { + changes.push(`${prop}: remove (was "${prevVal}")`); + } + } + + const selPart = selectorPreview ? `selectors: ${selectorPreview}` : 'selectors: (unavailable)'; + return `Update element styles (${selPart}). ${changes.join('; ')}`; +} + +// ============================================================================= +// Public API +// ============================================================================= + +/** + * Build Apply payload from a Transaction + */ +export function buildApplyPayload( + tx: Transaction, + options: BuildPayloadOptions = {}, +): ApplyPayload | null { + // Only support style transactions for now + if (tx.type !== 'style') return null; + + const pageUrl = readString(options.pageUrl ?? globalThis.location?.href) ?? ''; + if (!pageUrl) return null; + + const locator = tx.targetLocator; + const diff = computeStyleDiff(tx); + if (!diff) return null; + + // Resolve element + const element = + options.element !== undefined ? options.element : locateElement(locator, document); + + // Build fingerprint + const fingerprint = element + ? buildFingerprintFromElement(element) + : buildFingerprintFromLocator(locator); + + // Resolve component hints + const hints = element ? resolveComponentHints(element) : {}; + + // Build description + const maxSelectors = Math.max(0, options.maxSelectorsInDescription ?? 3); + const description = buildStyleDescription(locator, diff, maxSelectors); + + // Build payload + const payload: ApplyPayload = { + pageUrl, + targetFile: hints.targetFile, + fingerprint, + techStackHint: hints.techStackHint, + instruction: { + type: 'update_style', + description, + style: Object.keys(diff.set).length > 0 ? diff.set : undefined, + }, + + // V2 extended fields + locator: hints.debugSource ? { ...locator, debugSource: hints.debugSource } : locator, + selectorCandidates: locator.selectors?.slice(0, 8), + debugSource: hints.debugSource, + operation: { + type: 'update_style', + before: diff.before, + after: diff.after, + removed: diff.removed, + }, + }; + + return payload; +} + +/** + * Send Apply payload to background script + */ +export async function sendApplyPayload(payload: ApplyPayload): Promise { + if (typeof chrome === 'undefined' || !chrome.runtime?.sendMessage) { + throw new Error('Chrome runtime API not available'); + } + + return chrome.runtime.sendMessage({ + type: BACKGROUND_MESSAGE_TYPES.WEB_EDITOR_APPLY, + payload, + }); +} + +/** + * Build and send Transaction to Agent in one call + */ +export async function sendTransactionToAgent( + tx: Transaction, + options: BuildPayloadOptions = {}, +): Promise { + const payload = buildApplyPayload(tx, options); + if (!payload) { + throw new Error('Unable to build payload from transaction'); + } + return sendApplyPayload(payload); +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/core/position-tracker.ts b/app/chrome-extension/entrypoints/web-editor-v2/core/position-tracker.ts new file mode 100644 index 0000000..55398fa --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/core/position-tracker.ts @@ -0,0 +1,288 @@ +/** + * Position Tracker + * + * Keeps hover/selection rectangles in sync with viewport changes (scroll/resize). + * + * Design: + * - Uses passive scroll/resize listeners to avoid blocking scrolling + * - Coalesces updates with requestAnimationFrame so layout is read at most once per frame + * - Drops references to elements that are no longer connected to the DOM + * - Only emits updates when rect values actually change (with epsilon tolerance) + * + * Performance considerations: + * - getBoundingClientRect() calls are batched to single rAF + * - Sub-pixel jitter is filtered to reduce unnecessary redraws + * - Passive listeners don't block smooth scrolling + */ + +import type { ViewportRect } from '../overlay/canvas-overlay'; +import { Disposer } from '../utils/disposables'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Options for creating the position tracker */ +export interface PositionTrackerOptions { + /** Callback when tracked positions change */ + onPositionUpdate: (rects: TrackedRects) => void; +} + +/** Container for tracked element rectangles */ +export interface TrackedRects { + /** Hover element rectangle (null if no hover) */ + hover: ViewportRect | null; + /** Selection element rectangle (null if no selection) */ + selection: ViewportRect | null; +} + +/** Position tracker public interface */ +export interface PositionTracker { + /** Set the element to track for hover */ + setHoverElement(element: Element | null): void; + /** Set the element to track for selection */ + setSelectionElement(element: Element | null): void; + /** Force a synchronous position update (useful for initialization) */ + forceUpdate(): void; + /** Cleanup listeners and pending rAF */ + dispose(): void; +} + +// ============================================================================= +// Constants +// ============================================================================= + +/** Passive listener options for scroll/resize */ +const PASSIVE_LISTENER: AddEventListenerOptions = { passive: true }; + +/** Sub-pixel threshold for rect comparison (avoids jitter-induced redraws) */ +const RECT_EPSILON = 0.5; + +// ============================================================================= +// Helpers +// ============================================================================= + +/** + * Convert DOMRect to ViewportRect, returning null for invalid values + */ +function toViewportRect(domRect: DOMRectReadOnly): ViewportRect | null { + const { left, top, width, height } = domRect; + + if ( + !Number.isFinite(left) || + !Number.isFinite(top) || + !Number.isFinite(width) || + !Number.isFinite(height) + ) { + return null; + } + + // Ensure non-negative dimensions + return { + left, + top, + width: Math.max(0, width), + height: Math.max(0, height), + }; +} + +/** + * Check if two numbers are approximately equal + */ +function approximatelyEqual(a: number, b: number): boolean { + return Math.abs(a - b) < RECT_EPSILON; +} + +/** + * Check if two ViewportRects are approximately equal + */ +function rectApproximatelyEqual(a: ViewportRect | null, b: ViewportRect | null): boolean { + if (a === b) return true; + if (!a || !b) return false; + + return ( + approximatelyEqual(a.left, b.left) && + approximatelyEqual(a.top, b.top) && + approximatelyEqual(a.width, b.width) && + approximatelyEqual(a.height, b.height) + ); +} + +/** + * Check if two TrackedRects are approximately equal + */ +function trackedRectsEqual(a: TrackedRects, b: TrackedRects): boolean { + return ( + rectApproximatelyEqual(a.hover, b.hover) && rectApproximatelyEqual(a.selection, b.selection) + ); +} + +// ============================================================================= +// Implementation +// ============================================================================= + +/** + * Create a position tracker for monitoring element positions. + * + * The tracker automatically updates when the viewport scrolls or resizes, + * and notifies via callback when tracked element positions change. + */ +export function createPositionTracker(options: PositionTrackerOptions): PositionTracker { + const { onPositionUpdate } = options; + const disposer = new Disposer(); + + // ========================================================================== + // State + // ========================================================================== + + let hoverElement: Element | null = null; + let selectionElement: Element | null = null; + let lastRects: TrackedRects = { hover: null, selection: null }; + + // Single rAF slot for coalescing updates + let rafId: number | null = null; + + // ========================================================================== + // RAF Management + // ========================================================================== + + function cancelRaf(): void { + if (rafId !== null) { + cancelAnimationFrame(rafId); + rafId = null; + } + } + disposer.add(cancelRaf); + + function scheduleUpdate(): void { + if (disposer.isDisposed) return; + if (rafId !== null) return; + + rafId = requestAnimationFrame(() => { + rafId = null; + updateIfChanged(); + }); + } + + // ========================================================================== + // Position Computation + // ========================================================================== + + /** + * Get element if still connected to DOM, null otherwise + */ + function resolveConnected(element: Element | null): Element | null { + if (!element) return null; + return element.isConnected ? element : null; + } + + /** + * Safely read element's viewport rect + */ + function readElementRect(element: Element | null): ViewportRect | null { + if (!element) return null; + try { + return toViewportRect(element.getBoundingClientRect()); + } catch { + return null; + } + } + + /** + * Compute current rects for all tracked elements + */ + function computeRects(): TrackedRects { + // Resolve elements, dropping stale references + const resolvedHover = resolveConnected(hoverElement); + const resolvedSelection = resolveConnected(selectionElement); + + // Clear stale element references + if (hoverElement && !resolvedHover) { + hoverElement = null; + } + if (selectionElement && !resolvedSelection) { + selectionElement = null; + } + + // Optimization: if both point to same element, read rect once + if (resolvedHover && resolvedSelection && resolvedHover === resolvedSelection) { + const rect = readElementRect(resolvedHover); + return { hover: rect, selection: rect }; + } + + return { + hover: readElementRect(resolvedHover), + selection: readElementRect(resolvedSelection), + }; + } + + /** + * Update rects and notify if changed + */ + function updateIfChanged(): void { + if (disposer.isDisposed) return; + + const nextRects = computeRects(); + if (trackedRectsEqual(nextRects, lastRects)) return; + + lastRects = nextRects; + onPositionUpdate(nextRects); + } + + // ========================================================================== + // Event Handlers + // ========================================================================== + + function handleViewportChange(): void { + // Fast-path: nothing to track and nothing rendered + if (!hoverElement && !selectionElement && !lastRects.hover && !lastRects.selection) { + return; + } + scheduleUpdate(); + } + + // ========================================================================== + // Event Registration + // ========================================================================== + + // Listen for scroll on window (captures most scrolling scenarios) + disposer.listen(window, 'scroll', handleViewportChange, PASSIVE_LISTENER); + + // Capture scroll events from scrollable containers (scroll doesn't bubble, + // so we use capture phase to intercept scroll events from nested containers) + disposer.listen(document, 'scroll', handleViewportChange, { ...PASSIVE_LISTENER, capture: true }); + + // Listen for resize + disposer.listen(window, 'resize', handleViewportChange, PASSIVE_LISTENER); + + // ========================================================================== + // Public API + // ========================================================================== + + function setHoverElement(element: Element | null): void { + if (disposer.isDisposed) return; + if (hoverElement === element) return; + hoverElement = element; + scheduleUpdate(); + } + + function setSelectionElement(element: Element | null): void { + if (disposer.isDisposed) return; + if (selectionElement === element) return; + selectionElement = element; + scheduleUpdate(); + } + + function forceUpdate(): void { + if (disposer.isDisposed) return; + cancelRaf(); + updateIfChanged(); + } + + return { + setHoverElement, + setSelectionElement, + forceUpdate, + dispose: () => disposer.dispose(), + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/core/transaction-manager.ts b/app/chrome-extension/entrypoints/web-editor-v2/core/transaction-manager.ts new file mode 100644 index 0000000..118c24d --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/core/transaction-manager.ts @@ -0,0 +1,592 @@ +/** + * Transaction Manager + * + * Locator-based undo/redo system for inline style edits. + * + * Design principles: + * - Uses CSS selectors (not DOM references) for element identification + * - Supports transaction merging for continuous edits (e.g., slider drag) + * - Provides handle-based API for batched operations + * - Emits change events for UI synchronization + */ + +import type { ElementLocator, Transaction, TransactionSnapshot } from '@/common/web-editor-types'; +import { Disposer } from '../utils/disposables'; +import { createElementLocator, locateElement, locatorKey } from './locator'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Change event action types */ +export type TransactionChangeAction = 'push' | 'merge' | 'undo' | 'redo' | 'clear' | 'rollback'; + +/** Change event emitted when transaction state changes */ +export interface TransactionChangeEvent { + action: TransactionChangeAction; + transaction: Transaction | null; + undoCount: number; + redoCount: number; +} + +/** Options for creating the Transaction Manager */ +export interface TransactionManagerOptions { + /** Maximum transactions to keep in history (oldest dropped) */ + maxHistory?: number; + /** Time window (ms) for merging consecutive edits to same property */ + mergeWindowMs?: number; + /** Enable Ctrl/Cmd+Z and Ctrl/Cmd+Shift+Z keyboard shortcuts */ + enableKeyBindings?: boolean; + /** Check if event is from editor UI (to ignore keybindings) */ + isEventFromEditorUi?: (event: Event) => boolean; + /** Custom time source (for testing) */ + now?: () => number; + /** Called when transaction state changes */ + onChange?: (event: TransactionChangeEvent) => void; + /** Called when applying a transaction fails */ + onApplyError?: (error: unknown) => void; +} + +/** Handle for an in-progress style transaction (for batching) */ +export interface StyleTransactionHandle { + /** Unique handle ID */ + readonly id: string; + /** CSS property being edited */ + readonly property: string; + /** Target element locator */ + readonly targetLocator: ElementLocator; + /** Update the style value (live preview) */ + set(value: string): void; + /** Commit the transaction and record to history */ + commit(options?: { merge?: boolean }): Transaction | null; + /** Rollback to original value without recording */ + rollback(): void; +} + +/** Transaction Manager public interface */ +export interface TransactionManager { + /** Begin an interactive style edit (returns handle for batching) */ + beginStyle(target: Element, property: string): StyleTransactionHandle | null; + /** Apply a style change immediately and record transaction */ + applyStyle( + target: Element, + property: string, + value: string, + options?: { merge?: boolean }, + ): Transaction | null; + /** Record a style transaction without applying (for external changes) */ + recordStyle( + locator: ElementLocator, + property: string, + beforeValue: string, + afterValue: string, + options?: { merge?: boolean }, + ): Transaction | null; + /** Undo the last transaction */ + undo(): Transaction | null; + /** Redo the last undone transaction */ + redo(): Transaction | null; + /** Check if undo is available */ + canUndo(): boolean; + /** Check if redo is available */ + canRedo(): boolean; + /** Get current undo stack (readonly) */ + getUndoStack(): readonly Transaction[]; + /** Get current redo stack (readonly) */ + getRedoStack(): readonly Transaction[]; + /** Clear all transaction history */ + clear(): void; + /** Cleanup resources */ + dispose(): void; +} + +// ============================================================================= +// Constants +// ============================================================================= + +const DEFAULT_MAX_HISTORY = 100; +const DEFAULT_MERGE_WINDOW_MS = 800; + +const KEYBIND_OPTIONS: AddEventListenerOptions = { + capture: true, + passive: false, +}; + +// ============================================================================= +// Style Helpers +// ============================================================================= + +/** + * Normalize CSS property name to kebab-case. + * Preserves custom properties (--var-name). + */ +function normalizePropertyName(property: string): string { + const p = property.trim(); + if (!p) return ''; + + // Preserve custom properties + if (p.startsWith('--')) return p; + + // Already kebab-case + if (p.includes('-')) return p.toLowerCase(); + + // Convert camelCase to kebab-case + return p.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`).toLowerCase(); +} + +/** + * Safely get CSSStyleDeclaration from element + */ +function getInlineStyle(element: Element): CSSStyleDeclaration | null { + const htmlElement = element as HTMLElement; + const style = htmlElement.style; + + if (!style) return null; + if (typeof style.getPropertyValue !== 'function') return null; + if (typeof style.setProperty !== 'function') return null; + if (typeof style.removeProperty !== 'function') return null; + + return style; +} + +/** + * Read inline style property value + */ +function readStyleValue(style: CSSStyleDeclaration, property: string): string { + const prop = normalizePropertyName(property); + if (!prop) return ''; + return style.getPropertyValue(prop).trim(); +} + +/** + * Write inline style property value + */ +function writeStyleValue(style: CSSStyleDeclaration, property: string, value: string): void { + const prop = normalizePropertyName(property); + if (!prop) return; + + const v = value.trim(); + if (!v) { + style.removeProperty(prop); + } else { + style.setProperty(prop, v); + } +} + +/** + * Apply a styles snapshot to an element + */ +function applyStylesSnapshot(element: Element, styles: Record | undefined): void { + if (!styles) return; + + const inlineStyle = getInlineStyle(element); + if (!inlineStyle) return; + + for (const [property, value] of Object.entries(styles)) { + writeStyleValue(inlineStyle, property, value); + } +} + +// ============================================================================= +// Transaction Helpers +// ============================================================================= + +let transactionSeq = 0; + +/** + * Generate unique transaction ID + */ +function generateTransactionId(timestamp: number): string { + transactionSeq += 1; + return `tx_${timestamp.toString(36)}_${transactionSeq.toString(36)}`; +} + +/** + * Create a style transaction record + */ +function createStyleTransaction( + id: string, + locator: ElementLocator, + property: string, + beforeValue: string, + afterValue: string, + timestamp: number, +): Transaction { + const prop = normalizePropertyName(property); + + const beforeSnapshot: TransactionSnapshot = { + locator, + styles: { [prop]: beforeValue }, + }; + + const afterSnapshot: TransactionSnapshot = { + locator, + styles: { [prop]: afterValue }, + }; + + return { + id, + type: 'style', + targetLocator: locator, + before: beforeSnapshot, + after: afterSnapshot, + timestamp, + merged: false, + }; +} + +/** + * Get the single style property from a transaction (if applicable) + */ +function getSingleStyleProperty(tx: Transaction): string | null { + const keys = new Set(); + + if (tx.before.styles) { + for (const k of Object.keys(tx.before.styles)) keys.add(k); + } + if (tx.after.styles) { + for (const k of Object.keys(tx.after.styles)) keys.add(k); + } + + return keys.size === 1 ? Array.from(keys)[0]! : null; +} + +/** + * Check if two transactions can be merged + */ +function canMerge(prev: Transaction, next: Transaction, mergeWindowMs: number): boolean { + // Only merge style transactions + if (prev.type !== 'style' || next.type !== 'style') return false; + + // Check time window + if (Math.abs(next.timestamp - prev.timestamp) > mergeWindowMs) return false; + + // Check same target element + if (locatorKey(prev.targetLocator) !== locatorKey(next.targetLocator)) return false; + + // Check same property + const prevProp = getSingleStyleProperty(prev); + const nextProp = getSingleStyleProperty(next); + if (!prevProp || !nextProp || prevProp !== nextProp) return false; + + return true; +} + +/** + * Merge next transaction into prev (mutates prev) + */ +function mergeInto(prev: Transaction, next: Transaction): boolean { + const prop = getSingleStyleProperty(prev); + if (!prop) return false; + + const nextValue = next.after.styles?.[prop]; + if (nextValue === undefined) return false; + + // Update prev's after state + if (!prev.after.styles) prev.after.styles = {}; + prev.after.styles[prop] = nextValue; + prev.timestamp = next.timestamp; + prev.merged = true; + + return true; +} + +/** + * Apply a transaction (undo or redo) + * Returns true on success, false on failure + */ +function applyTransaction(tx: Transaction, direction: 'undo' | 'redo'): boolean { + if (tx.type !== 'style') return true; + + const target = locateElement(tx.targetLocator); + if (!target) { + return false; + } + + const snapshot = direction === 'undo' ? tx.before : tx.after; + applyStylesSnapshot(target, snapshot.styles); + return true; +} + +// ============================================================================= +// Transaction Manager Implementation +// ============================================================================= + +/** + * Create a Transaction Manager instance + */ +export function createTransactionManager( + options: TransactionManagerOptions = {}, +): TransactionManager { + const disposer = new Disposer(); + + // Configuration + const maxHistory = Math.max(1, options.maxHistory ?? DEFAULT_MAX_HISTORY); + const mergeWindowMs = Math.max(0, options.mergeWindowMs ?? DEFAULT_MERGE_WINDOW_MS); + const now = options.now ?? (() => Date.now()); + + // State + const undoStack: Transaction[] = []; + const redoStack: Transaction[] = []; + + // ========================================================================== + // Event Emission + // ========================================================================== + + function emit(action: TransactionChangeAction, transaction: Transaction | null): void { + options.onChange?.({ + action, + transaction, + undoCount: undoStack.length, + redoCount: redoStack.length, + }); + } + + // ========================================================================== + // Stack Management + // ========================================================================== + + function enforceMaxHistory(): void { + if (undoStack.length > maxHistory) { + undoStack.splice(0, undoStack.length - maxHistory); + } + } + + function pushTransaction(tx: Transaction, allowMerge: boolean): void { + const hadRedo = redoStack.length > 0; + + // Clear redo stack on new action + if (hadRedo) { + redoStack.length = 0; + } + + // Try to merge with previous transaction + if (!hadRedo && allowMerge && undoStack.length > 0) { + const last = undoStack[undoStack.length - 1]!; + if (canMerge(last, tx, mergeWindowMs) && mergeInto(last, tx)) { + emit('merge', last); + return; + } + } + + undoStack.push(tx); + enforceMaxHistory(); + emit('push', tx); + } + + // ========================================================================== + // Public API + // ========================================================================== + + function recordStyle( + locator: ElementLocator, + property: string, + beforeValue: string, + afterValue: string, + recordOptions?: { merge?: boolean }, + ): Transaction | null { + if (disposer.isDisposed) return null; + + const prop = normalizePropertyName(property); + if (!prop) return null; + + const before = beforeValue.trim(); + const after = afterValue.trim(); + if (before === after) return null; + + const id = generateTransactionId(now()); + const tx = createStyleTransaction(id, locator, prop, before, after, now()); + pushTransaction(tx, recordOptions?.merge !== false); + + return tx; + } + + function beginStyle(target: Element, property: string): StyleTransactionHandle | null { + if (disposer.isDisposed) return null; + + const inlineStyle = getInlineStyle(target); + if (!inlineStyle) return null; + + const prop = normalizePropertyName(property); + if (!prop) return null; + + const locator = createElementLocator(target); + const beforeValue = readStyleValue(inlineStyle, prop); + const id = generateTransactionId(now()); + + let completed = false; + + function set(value: string): void { + if (completed || disposer.isDisposed) return; + writeStyleValue(inlineStyle, prop, value); + } + + function commit(commitOptions?: { merge?: boolean }): Transaction | null { + if (completed || disposer.isDisposed) return null; + completed = true; + + const afterValue = readStyleValue(inlineStyle, prop); + if (afterValue === beforeValue) return null; + + const tx = createStyleTransaction(id, locator, prop, beforeValue, afterValue, now()); + pushTransaction(tx, commitOptions?.merge !== false); + return tx; + } + + function rollback(): void { + if (completed || disposer.isDisposed) return; + completed = true; + + writeStyleValue(inlineStyle, prop, beforeValue); + emit('rollback', null); + } + + return { + id, + property: prop, + targetLocator: locator, + set, + commit, + rollback, + }; + } + + function applyStyle( + target: Element, + property: string, + value: string, + applyOptions?: { merge?: boolean }, + ): Transaction | null { + const handle = beginStyle(target, property); + if (!handle) return null; + + handle.set(value); + return handle.commit(applyOptions); + } + + function undo(): Transaction | null { + if (disposer.isDisposed) return null; + + const tx = undoStack.pop(); + if (!tx) return null; + + // Try to apply the undo + const success = applyTransaction(tx, 'undo'); + if (!success) { + // Restore stack state on failure + undoStack.push(tx); + options.onApplyError?.(new Error(`Failed to locate element for undo: ${tx.id}`)); + return null; + } + + redoStack.push(tx); + emit('undo', tx); + return tx; + } + + function redo(): Transaction | null { + if (disposer.isDisposed) return null; + + const tx = redoStack.pop(); + if (!tx) return null; + + // Try to apply the redo + const success = applyTransaction(tx, 'redo'); + if (!success) { + // Restore stack state on failure + redoStack.push(tx); + options.onApplyError?.(new Error(`Failed to locate element for redo: ${tx.id}`)); + return null; + } + + undoStack.push(tx); + enforceMaxHistory(); + emit('redo', tx); + return tx; + } + + function canUndo(): boolean { + return undoStack.length > 0; + } + + function canRedo(): boolean { + return redoStack.length > 0; + } + + function getUndoStack(): readonly Transaction[] { + return undoStack.slice(); + } + + function getRedoStack(): readonly Transaction[] { + return redoStack.slice(); + } + + function clear(): void { + undoStack.length = 0; + redoStack.length = 0; + emit('clear', null); + } + + // ========================================================================== + // Keyboard Bindings + // ========================================================================== + + if (options.enableKeyBindings) { + disposer.listen( + window, + 'keydown', + (event: KeyboardEvent) => { + // Skip if event is from editor UI + if (options.isEventFromEditorUi?.(event)) return; + + // Check for Ctrl/Cmd modifier + const isMod = event.metaKey || event.ctrlKey; + if (!isMod || event.altKey) return; + + const key = event.key.toLowerCase(); + + // Ctrl/Cmd+Z: Undo, Ctrl/Cmd+Shift+Z: Redo, Ctrl/Cmd+Y: Redo + if (key === 'z') { + if (event.shiftKey) { + redo(); + } else { + undo(); + } + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + } else if (key === 'y') { + redo(); + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + } + }, + KEYBIND_OPTIONS, + ); + } + + // ========================================================================== + // Cleanup + // ========================================================================== + + function dispose(): void { + undoStack.length = 0; + redoStack.length = 0; + disposer.dispose(); + } + + return { + beginStyle, + applyStyle, + recordStyle, + undo, + redo, + canUndo, + canRedo, + getUndoStack, + getRedoStack, + clear, + dispose, + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/overlay/canvas-overlay.ts b/app/chrome-extension/entrypoints/web-editor-v2/overlay/canvas-overlay.ts new file mode 100644 index 0000000..5044475 --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/overlay/canvas-overlay.ts @@ -0,0 +1,346 @@ +/** + * Canvas Overlay + * + * High-performance overlay renderer for visual feedback (hover, selection, guides). + * + * Features: + * - DPR-aware rendering for crisp visuals on HiDPI displays + * - rAF-coalesced rendering via markDirty() pattern + * - ResizeObserver-backed automatic sizing + * - Separate layers for hover, selection, and future guides + * + * Performance considerations: + * - Uses `desynchronized: true` for lower latency + * - Batches all drawing to single rAF + * - Only redraws when dirty flag is set + * - Pixel-aligned strokes for crisp lines + */ + +import { WEB_EDITOR_V2_COLORS, WEB_EDITOR_V2_LOG_PREFIX } from '../constants'; +import { Disposer } from '../utils/disposables'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Rectangle in viewport coordinates */ +export type ViewportRect = Pick; + +/** Box style configuration */ +export interface BoxStyle { + /** Stroke color */ + strokeColor: string; + /** Fill color (with alpha for transparency) */ + fillColor: string; + /** Line width in CSS pixels */ + lineWidth: number; + /** Dash pattern (empty array for solid line) */ + dashPattern: number[]; +} + +/** Canvas overlay interface */ +export interface CanvasOverlay { + /** The underlying canvas element */ + canvas: HTMLCanvasElement; + /** Mark state as dirty and schedule a render on next animation frame */ + markDirty(): void; + /** Render immediately if dirty (called by RAF engine) */ + render(): void; + /** Clear all visual elements */ + clear(): void; + /** Update hover highlight */ + setHoverRect(rect: ViewportRect | null): void; + /** Update selection highlight */ + setSelectionRect(rect: ViewportRect | null): void; + /** Dispose and cleanup */ + dispose(): void; +} + +/** Options for creating canvas overlay */ +export interface CanvasOverlayOptions { + /** Container element (should be overlayRoot from ShadowHost) */ + container: HTMLElement; +} + +// ============================================================================= +// Constants +// ============================================================================= + +const CANVAS_ATTR = 'data-mcp-canvas'; +const CANVAS_ATTR_VALUE = 'overlay'; + +/** Default styles for different box types */ +const BOX_STYLES = { + hover: { + strokeColor: WEB_EDITOR_V2_COLORS.hover, + fillColor: `${WEB_EDITOR_V2_COLORS.hover}15`, // 15 = ~8% opacity + lineWidth: 2, + dashPattern: [6, 4], + }, + selection: { + strokeColor: WEB_EDITOR_V2_COLORS.selected, + fillColor: `${WEB_EDITOR_V2_COLORS.selected}20`, // 20 = ~12% opacity + lineWidth: 2, + dashPattern: [], + }, +} satisfies Record; + +// ============================================================================= +// Helpers +// ============================================================================= + +function isFinitePositive(value: number): boolean { + return Number.isFinite(value) && value > 0; +} + +function isValidRect(rect: ViewportRect | null): rect is ViewportRect { + if (!rect) return false; + return ( + Number.isFinite(rect.left) && + Number.isFinite(rect.top) && + isFinitePositive(rect.width) && + isFinitePositive(rect.height) + ); +} + +// ============================================================================= +// Implementation +// ============================================================================= + +/** + * Create a canvas overlay for rendering visual feedback. + */ +export function createCanvasOverlay(options: CanvasOverlayOptions): CanvasOverlay { + const { container } = options; + const disposer = new Disposer(); + + // Cleanup any existing canvas from previous instance + const existing = container.querySelector( + `canvas[${CANVAS_ATTR}="${CANVAS_ATTR_VALUE}"]`, + ); + if (existing) { + existing.remove(); + } + + // Create canvas element + const canvas = document.createElement('canvas'); + canvas.setAttribute(CANVAS_ATTR, CANVAS_ATTR_VALUE); + canvas.setAttribute('aria-hidden', 'true'); + + // Style for fullscreen coverage + Object.assign(canvas.style, { + position: 'absolute', + inset: '0', + width: '100%', + height: '100%', + pointerEvents: 'none', + display: 'block', + }); + + container.append(canvas); + disposer.add(() => canvas.remove()); + + // Get 2D context with performance options + const ctx = canvas.getContext('2d', { + alpha: true, + desynchronized: true, // Lower latency on supported browsers + }); + + if (!ctx) { + disposer.dispose(); + throw new Error(`${WEB_EDITOR_V2_LOG_PREFIX} Failed to get canvas 2D context`); + } + + // ========================================================================== + // State + // ========================================================================== + + let hoverRect: ViewportRect | null = null; + let selectionRect: ViewportRect | null = null; + + let viewportWidth = 1; + let viewportHeight = 1; + let devicePixelRatio = 1; + + let dirty = true; + let rafId: number | null = null; + + // ========================================================================== + // RAF Management + // ========================================================================== + + function cancelRaf(): void { + if (rafId !== null) { + cancelAnimationFrame(rafId); + rafId = null; + } + } + disposer.add(cancelRaf); + + function scheduleRaf(): void { + if (rafId !== null || disposer.isDisposed) return; + rafId = requestAnimationFrame(() => { + rafId = null; + render(); + }); + } + + // ========================================================================== + // Canvas Sizing (DPR-aware) + // ========================================================================== + + function updateCanvasSize(): boolean { + const nextDpr = Math.max(1, window.devicePixelRatio || 1); + const cssWidth = Math.max(1, viewportWidth); + const cssHeight = Math.max(1, viewportHeight); + + const pixelWidth = Math.round(cssWidth * nextDpr); + const pixelHeight = Math.round(cssHeight * nextDpr); + + const needsResize = + canvas.width !== pixelWidth || + canvas.height !== pixelHeight || + Math.abs(devicePixelRatio - nextDpr) > 0.001; + + if (!needsResize) return false; + + devicePixelRatio = nextDpr; + canvas.width = pixelWidth; + canvas.height = pixelHeight; + + // Reset transform after resize (canvas state is cleared) + ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0); + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + return true; + } + + // ========================================================================== + // Drawing Functions + // ========================================================================== + + function clearCanvas(): void { + updateCanvasSize(); + ctx.clearRect(0, 0, viewportWidth, viewportHeight); + } + + function drawBox(rect: ViewportRect | null, style: BoxStyle): void { + if (!isValidRect(rect)) return; + + const w = Math.round(rect.width); + const h = Math.round(rect.height); + if (w <= 0 || h <= 0) return; + + // Pixel-align for crisp strokes (add 0.5 for even line widths) + const x = Math.round(rect.left) + 0.5; + const y = Math.round(rect.top) + 0.5; + + ctx.save(); + + // Configure stroke + ctx.lineWidth = style.lineWidth; + ctx.strokeStyle = style.strokeColor; + ctx.fillStyle = style.fillColor; + ctx.setLineDash(style.dashPattern); + + // Draw rectangle + ctx.beginPath(); + ctx.rect(x, y, w, h); + ctx.fill(); + ctx.stroke(); + + ctx.restore(); + } + + // ========================================================================== + // Public API + // ========================================================================== + + function markDirty(): void { + if (disposer.isDisposed) return; + dirty = true; + scheduleRaf(); + } + + function render(): void { + if (disposer.isDisposed || !dirty) return; + + // Cancel any pending RAF (in case render() is called manually) + cancelRaf(); + + // Reset dirty flag before drawing + dirty = false; + + // Clear and redraw + clearCanvas(); + drawBox(hoverRect, BOX_STYLES.hover); + drawBox(selectionRect, BOX_STYLES.selection); + + // If something marked dirty during render, schedule another frame + if (dirty) { + scheduleRaf(); + } + } + + function setHoverRect(rect: ViewportRect | null): void { + hoverRect = rect; + markDirty(); + } + + function setSelectionRect(rect: ViewportRect | null): void { + selectionRect = rect; + markDirty(); + } + + function clear(): void { + hoverRect = null; + selectionRect = null; + markDirty(); + } + + // ========================================================================== + // Initialization + // ========================================================================== + + // Initial size measurement + try { + const rect = container.getBoundingClientRect(); + viewportWidth = Math.max(1, rect.width); + viewportHeight = Math.max(1, rect.height); + } catch (error) { + console.warn(`${WEB_EDITOR_V2_LOG_PREFIX} Initial size measurement failed:`, error); + } + + // Setup ResizeObserver for automatic sizing + disposer.observeResize(container, (entries) => { + const entry = entries[0]; + const rect = entry?.contentRect; + if (!rect) return; + + const nextWidth = Math.max(1, rect.width); + const nextHeight = Math.max(1, rect.height); + + // Skip if size hasn't changed significantly + if (Math.abs(nextWidth - viewportWidth) < 0.5 && Math.abs(nextHeight - viewportHeight) < 0.5) { + return; + } + + viewportWidth = nextWidth; + viewportHeight = nextHeight; + markDirty(); + }); + + // Initial render + markDirty(); + + return { + canvas, + markDirty, + render, + clear, + setHoverRect, + setSelectionRect, + dispose: () => disposer.dispose(), + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/selection/selection-engine.ts b/app/chrome-extension/entrypoints/web-editor-v2/selection/selection-engine.ts new file mode 100644 index 0000000..69b594e --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/selection/selection-engine.ts @@ -0,0 +1,672 @@ +/** + * Selection Engine (Phase 1.6 - Basic) + * + * Heuristic-based target picking to reduce noisy selections. + * + * Goals: + * - Skip invisible/transparent elements + * - De-prioritize "wrapper-only" elements (single-child, no visual boundary) + * - Prefer interactive elements (button/link/input/etc.) + * - Prefer elements with visual boundaries (border/background/shadow) + * - Support basic parent drilling via Alt modifier + * + * Scoring system: + * - Positive scores: interactive elements, visual boundaries, appropriate size + * - Negative scores: wrapper-only, too small/large, SVG internals + * - Candidates sorted by score descending, then by DOM order + */ + +import { Disposer } from '../utils/disposables'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Options for creating the selection engine */ +export interface SelectionEngineOptions { + /** Check if a DOM node belongs to the editor overlay */ + isOverlayElement: (node: unknown) => boolean; +} + +/** A scored selection candidate */ +export interface SelectionCandidate { + /** The candidate element */ + element: Element; + /** Heuristic score (higher = better target) */ + score: number; + /** Debug reasons explaining the score */ + reasons: string[]; +} + +/** Keyboard modifiers for selection behavior */ +export interface Modifiers { + alt: boolean; + shift: boolean; + ctrl: boolean; + meta: boolean; +} + +/** Selection engine public interface */ +export interface SelectionEngine { + /** Find the best target at a viewport point with modifier support */ + findBestTarget(x: number, y: number, modifiers: Modifiers): Element | null; + /** Get scored candidates at a point (for debugging or drill-up UI) */ + getCandidatesAtPoint(x: number, y: number): SelectionCandidate[]; + /** Get a meaningful parent candidate (for Alt drill-up) */ + getParentCandidate(current: Element): Element | null; + /** Cleanup */ + dispose(): void; +} + +// ============================================================================= +// Constants +// ============================================================================= + +/** Max elements from elementsFromPoint to process */ +const MAX_HIT_ELEMENTS = 8; + +/** Max ancestor depth to traverse */ +const MAX_ANCESTOR_DEPTH = 6; + +/** Max total candidates to consider */ +const MAX_CANDIDATES = 60; + +/** Epsilon for rect comparisons */ +const RECT_EPSILON = 0.5; + +/** Tags that are inherently interactive */ +const INTERACTIVE_TAGS = new Set([ + 'A', + 'BUTTON', + 'INPUT', + 'SELECT', + 'TEXTAREA', + 'LABEL', + 'SUMMARY', + 'DETAILS', +]); + +/** ARIA roles that indicate interactivity */ +const INTERACTIVE_ROLES = new Set([ + 'button', + 'link', + 'checkbox', + 'radio', + 'switch', + 'tab', + 'menuitem', + 'option', + 'combobox', + 'textbox', +]); + +/** Tags commonly used as layout wrappers */ +const WRAPPER_TAGS = new Set([ + 'DIV', + 'SPAN', + 'SECTION', + 'ARTICLE', + 'MAIN', + 'HEADER', + 'FOOTER', + 'NAV', + 'ASIDE', +]); + +// ============================================================================= +// Helpers +// ============================================================================= + +/** + * Parse a CSS numeric value + */ +function parseNumber(value: string): number { + const n = Number.parseFloat(value); + return Number.isFinite(n) ? n : 0; +} + +/** + * Check if a color is effectively transparent + */ +function isTransparentColor(value: string): boolean { + const v = value.trim().toLowerCase(); + if (v === 'transparent') return true; + + // Check rgba() with alpha <= 0.01 + const rgba = v.match(/^rgba?\((.+)\)$/); + if (rgba) { + const parts = rgba[1].split(',').map((p) => p.trim()); + if (parts.length >= 4) { + const alpha = Number.parseFloat(parts[3]); + return Number.isFinite(alpha) && alpha <= 0.01; + } + // rgb() without alpha is opaque + return false; + } + + // Check hsla() with alpha <= 0.01 + const hsla = v.match(/^hsla?\((.+)\)$/); + if (hsla) { + const parts = hsla[1].split(',').map((p) => p.trim()); + if (parts.length >= 4) { + const alpha = Number.parseFloat(parts[3]); + return Number.isFinite(alpha) && alpha <= 0.01; + } + return false; + } + + // hex and other formats are opaque + return false; +} + +/** + * Check if element has direct text content (not just whitespace) + */ +function hasDirectNonWhitespaceText(element: Element): boolean { + for (const node of Array.from(element.childNodes)) { + if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) { + return true; + } + } + return false; +} + +/** + * Get parent element, crossing Shadow DOM boundaries + */ +function getParentElementOrHost(element: Element): Element | null { + if (element.parentElement) return element.parentElement; + + try { + const root = element.getRootNode?.(); + if (root instanceof ShadowRoot) { + return root.host; + } + } catch { + // Ignore and fall back to null + } + + return null; +} + +/** + * Get elements at a viewport point + */ +function getHitElementsAtPoint(x: number, y: number): Element[] { + if (!Number.isFinite(x) || !Number.isFinite(y)) return []; + + try { + if (typeof document.elementsFromPoint === 'function') { + return document.elementsFromPoint(x, y); + } + } catch { + // Fall back to elementFromPoint + } + + const el = document.elementFromPoint(x, y); + return el ? [el] : []; +} + +/** + * Get viewport area for size ratio calculations + */ +function getViewportArea(): number { + const w = Math.max(1, window.innerWidth || 1); + const h = Math.max(1, window.innerHeight || 1); + return w * h; +} + +/** + * Safely read element rect + */ +function readRect(element: Element): DOMRectReadOnly | null { + try { + const rect = element.getBoundingClientRect(); + if (!Number.isFinite(rect.left) || !Number.isFinite(rect.top)) return null; + if (!Number.isFinite(rect.width) || !Number.isFinite(rect.height)) return null; + return rect; + } catch { + return null; + } +} + +/** + * Check if element is effectively invisible + */ +function isEffectivelyInvisible(style: CSSStyleDeclaration, rect: DOMRectReadOnly): boolean { + if (style.display === 'none') return true; + if (style.visibility === 'hidden' || style.visibility === 'collapse') return true; + if (parseNumber(style.opacity) <= 0.01) return true; + + // Check contentVisibility + const contentVisibility = (style as Record).contentVisibility; + if (contentVisibility === 'hidden') return true; + + // Zero-dimension elements + if (rect.width <= RECT_EPSILON || rect.height <= RECT_EPSILON) return true; + + return false; +} + +/** + * Score element based on visual boundary presence + */ +function getVisualBoundaryScore( + element: Element, + style: CSSStyleDeclaration, +): { points: number; reasons: string[] } { + let points = 0; + const reasons: string[] = []; + + // Background color or image + if (!isTransparentColor(style.backgroundColor) || style.backgroundImage !== 'none') { + points += 2; + reasons.push('visual:background:+2'); + } + + // Border + const borderWidths = [ + parseNumber(style.borderTopWidth), + parseNumber(style.borderRightWidth), + parseNumber(style.borderBottomWidth), + parseNumber(style.borderLeftWidth), + ]; + const hasBorder = + borderWidths.some((w) => w > RECT_EPSILON) && + (style.borderTopStyle !== 'none' || + style.borderRightStyle !== 'none' || + style.borderBottomStyle !== 'none' || + style.borderLeftStyle !== 'none'); + if (hasBorder) { + points += 3; + reasons.push('visual:border:+3'); + } + + // Box shadow + if (style.boxShadow && style.boxShadow !== 'none') { + points += 2; + reasons.push('visual:shadow:+2'); + } + + // Outline + if (style.outlineStyle !== 'none' && parseNumber(style.outlineWidth) > RECT_EPSILON) { + points += 1; + reasons.push('visual:outline:+1'); + } + + // Media elements are visually meaningful + const tag = element.tagName.toUpperCase(); + if (tag === 'IMG' || tag === 'VIDEO' || tag === 'CANVAS' || tag === 'SVG') { + points += 2; + reasons.push('visual:media:+2'); + } + + // SVG sub-elements usually aren't meaningful targets + if (element instanceof SVGElement && tag !== 'SVG') { + points -= 1; + reasons.push('visual:svg-sub:-1'); + } + + return { points, reasons }; +} + +/** + * Score element based on interactivity + */ +function getInteractivityScore( + element: Element, + style: CSSStyleDeclaration, +): { points: number; reasons: string[] } { + let points = 0; + const reasons: string[] = []; + + const tag = element.tagName.toUpperCase(); + + // Interactive tags + if (INTERACTIVE_TAGS.has(tag)) { + points += 6; + reasons.push(`type:${tag.toLowerCase()}:+6`); + } + + // Interactive roles + const role = element.getAttribute('role')?.toLowerCase() ?? ''; + if (role && INTERACTIVE_ROLES.has(role)) { + points += 4; + reasons.push(`role:${role}:+4`); + } + + // Anchor with href + if (element instanceof HTMLAnchorElement && element.href) { + points += 2; + reasons.push('attr:href:+2'); + } + + // Content editable + if (element instanceof HTMLElement) { + if (element.isContentEditable) { + points += 5; + reasons.push('attr:contenteditable:+5'); + } + + // Focusable + if (element.tabIndex >= 0) { + points += 2; + reasons.push('focusable:+2'); + } + } + + // Pointer cursor often indicates clickability + if (style.cursor === 'pointer') { + points += 2; + reasons.push('cursor:pointer:+2'); + } + + return { points, reasons }; +} + +/** + * Score element based on size + */ +function getSizeScore( + rect: DOMRectReadOnly, + viewportArea: number, +): { points: number; reasons: string[] } { + let points = 0; + const reasons: string[] = []; + + const area = rect.width * rect.height; + if (!Number.isFinite(area) || area <= 0) { + points -= 6; + reasons.push('size:invalid:-6'); + return { points, reasons }; + } + + // Too small: hard to interact with + if (rect.width < 4 || rect.height < 4) { + points -= 6; + reasons.push('size:tiny:-6'); + } else if (area < 16 * 16) { + points -= 4; + reasons.push('size:small:-4'); + } else if (area < 44 * 44) { + // Below recommended tap target size + points -= 1; + reasons.push('size:below-tap-target:-1'); + } + + // Too large: likely a layout container + const ratio = viewportArea > 0 ? area / viewportArea : 0; + if (ratio > 0.85) { + points -= 8; + reasons.push('size:huge:-8'); + } else if (ratio > 0.6) { + points -= 4; + reasons.push('size:very-large:-4'); + } + + return { points, reasons }; +} + +/** + * Check if element has meaningful padding + */ +function hasMeaningfulPadding(style: CSSStyleDeclaration): boolean { + return ( + parseNumber(style.paddingTop) > RECT_EPSILON || + parseNumber(style.paddingRight) > RECT_EPSILON || + parseNumber(style.paddingBottom) > RECT_EPSILON || + parseNumber(style.paddingLeft) > RECT_EPSILON + ); +} + +/** + * Check if element is a wrapper-only container + */ +function isWrapperOnly( + element: Element, + style: CSSStyleDeclaration, + visualScore: number, + interactivityScore: number, +): boolean { + // display: contents has no box + if (style.display === 'contents') return true; + + // Interactive elements are never pure wrappers + if (interactivityScore > 0) return false; + + // Only check common wrapper tags + const tag = element.tagName.toUpperCase(); + if (!WRAPPER_TAGS.has(tag)) return false; + + // Must have exactly one child element + if (element.children.length !== 1) return false; + + // Has direct text content = meaningful + if (hasDirectNonWhitespaceText(element)) return false; + + // Has visual boundary = meaningful + if (visualScore > 0) return false; + + // Has padding = meaningful + if (hasMeaningfulPadding(style)) return false; + + return true; +} + +/** Metadata for candidate ordering */ +interface CandidateMeta { + hitOrder: number; + depthFromHit: number; +} + +/** + * Compare candidate metadata for ordering + */ +function compareMeta(a: CandidateMeta, b: CandidateMeta): number { + if (a.hitOrder !== b.hitOrder) return a.hitOrder - b.hitOrder; + return a.depthFromHit - b.depthFromHit; +} + +// ============================================================================= +// Implementation +// ============================================================================= + +/** + * Create a selection engine for intelligent element picking. + */ +export function createSelectionEngine(options: SelectionEngineOptions): SelectionEngine { + const disposer = new Disposer(); + const { isOverlayElement } = options; + + /** + * Score a single element + */ + function scoreElement( + element: Element, + styleCache: Map, + viewportArea: number, + ): SelectionCandidate | null { + // Basic filters + if (!element.isConnected) return null; + if (isOverlayElement(element)) return null; + + const tag = element.tagName.toUpperCase(); + if (tag === 'HTML' || tag === 'BODY') return null; + + const rect = readRect(element); + if (!rect) return null; + + // Get or cache computed style + let style = styleCache.get(element); + if (!style) { + style = window.getComputedStyle(element); + styleCache.set(element, style); + } + + if (isEffectivelyInvisible(style, rect)) return null; + + // Calculate scores + const reasons: string[] = []; + let score = 0; + + const interactivity = getInteractivityScore(element, style); + score += interactivity.points; + reasons.push(...interactivity.reasons); + + const visual = getVisualBoundaryScore(element, style); + score += visual.points; + reasons.push(...visual.reasons); + + const size = getSizeScore(rect, viewportArea); + score += size.points; + reasons.push(...size.reasons); + + // Penalize wrapper-only containers + if (isWrapperOnly(element, style, visual.points, interactivity.points)) { + score -= 8; + reasons.push('wrapperOnly:-8'); + } + + // De-prioritize generic inline spans + if (tag === 'SPAN' && interactivity.points === 0 && visual.points === 0) { + score -= 2; + reasons.push('inline:span:-2'); + } + + // Large fixed elements are often overlays/headers + const area = rect.width * rect.height; + const ratio = viewportArea > 0 ? area / viewportArea : 0; + if (style.position === 'fixed' && ratio > 0.3) { + score -= 2; + reasons.push('position:fixed-large:-2'); + } + + return { element, score, reasons }; + } + + /** + * Get all scored candidates at a point + */ + function getCandidatesAtPoint(x: number, y: number): SelectionCandidate[] { + const hit = getHitElementsAtPoint(x, y); + if (hit.length === 0) return []; + + // Collect candidates with metadata + const map = new Map(); + + function addCandidate(element: Element, meta: CandidateMeta): void { + if (isOverlayElement(element)) return; + if (map.size >= MAX_CANDIDATES && !map.has(element)) return; + + const prev = map.get(element); + if (!prev || compareMeta(meta, prev) < 0) { + map.set(element, meta); + } + } + + // Process hit elements and their ancestors + const limit = Math.min(hit.length, MAX_HIT_ELEMENTS); + for (let i = 0; i < limit; i++) { + const el = hit[i]; + addCandidate(el, { hitOrder: i, depthFromHit: 0 }); + + // Traverse ancestors + let current: Element | null = el; + for (let depth = 1; depth <= MAX_ANCESTOR_DEPTH; depth++) { + current = current ? getParentElementOrHost(current) : null; + if (!current) break; + addCandidate(current, { hitOrder: i, depthFromHit: depth }); + } + } + + // Score all candidates + const viewportArea = getViewportArea(); + const styleCache = new Map(); + + const scored: Array = []; + for (const [element, meta] of map) { + const candidate = scoreElement(element, styleCache, viewportArea); + if (!candidate) continue; + scored.push({ ...candidate, ...meta }); + } + + // Sort by score (descending), then by DOM order + scored.sort((a, b) => { + if (b.score !== a.score) return b.score - a.score; + return compareMeta(a, b); + }); + + // Strip metadata from result + return scored.map(({ hitOrder: _, depthFromHit: __, ...c }) => c); + } + + /** + * Get a meaningful parent candidate for drill-up + */ + function getParentCandidate(current: Element): Element | null { + let parent = getParentElementOrHost(current); + if (!parent) return null; + + const viewportArea = getViewportArea(); + const styleCache = new Map(); + + while (parent) { + if (isOverlayElement(parent)) return null; + + const tag = parent.tagName.toUpperCase(); + if (tag === 'HTML' || tag === 'BODY') return null; + + const rect = readRect(parent); + if (!rect) { + parent = getParentElementOrHost(parent); + continue; + } + + let style = styleCache.get(parent); + if (!style) { + style = window.getComputedStyle(parent); + styleCache.set(parent, style); + } + + if (isEffectivelyInvisible(style, rect)) { + parent = getParentElementOrHost(parent); + continue; + } + + const interactivity = getInteractivityScore(parent, style); + const visual = getVisualBoundaryScore(parent, style); + + // Return first non-wrapper parent + if (!isWrapperOnly(parent, style, visual.points, interactivity.points)) { + return parent; + } + + parent = getParentElementOrHost(parent); + } + + return null; + } + + /** + * Find the best target at a point with modifier support + */ + function findBestTarget(x: number, y: number, modifiers: Modifiers): Element | null { + const candidates = getCandidatesAtPoint(x, y); + const best = candidates[0]?.element ?? null; + if (!best) return null; + + // Alt modifier: drill up to parent + if (modifiers.alt) { + return getParentCandidate(best) ?? best; + } + + return best; + } + + return { + findBestTarget, + getCandidatesAtPoint, + getParentCandidate, + dispose: () => disposer.dispose(), + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/ui/shadow-host.ts b/app/chrome-extension/entrypoints/web-editor-v2/ui/shadow-host.ts new file mode 100644 index 0000000..6a51ae5 --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/ui/shadow-host.ts @@ -0,0 +1,486 @@ +/** + * Shadow DOM Host + * + * Creates an isolated container for the Web Editor UI using Shadow DOM. + * Provides: + * - Style isolation (no CSS bleed in/out) + * - Event isolation (UI events don't bubble to page) + * - Overlay container for Canvas/visual feedback + * - UI container for panels/controls + */ + +import { + WEB_EDITOR_V2_HOST_ID, + WEB_EDITOR_V2_OVERLAY_ID, + WEB_EDITOR_V2_UI_ID, + WEB_EDITOR_V2_Z_INDEX, +} from '../constants'; +import { Disposer } from '../utils/disposables'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Elements exposed by the shadow host */ +export interface ShadowHostElements { + /** The host element attached to the document */ + host: HTMLDivElement; + /** The shadow root */ + shadowRoot: ShadowRoot; + /** Container for overlay elements (Canvas, guides, etc.) */ + overlayRoot: HTMLDivElement; + /** Container for UI elements (panels, toolbar, etc.) */ + uiRoot: HTMLDivElement; +} + +/** Options for mounting the shadow host */ +export interface ShadowHostOptions { + /** Callback when user requests to close the editor */ + onRequestClose?: () => void; +} + +/** Interface for the shadow host manager */ +export interface ShadowHostManager { + /** Get the shadow host elements (null if not mounted) */ + getElements(): ShadowHostElements | null; + /** Check if a node is part of the editor overlay */ + isOverlayElement(node: unknown): boolean; + /** Check if an event originated from the editor UI */ + isEventFromUi(event: Event): boolean; + /** Dispose and unmount the shadow host */ + dispose(): void; +} + +// ============================================================================= +// Styles +// ============================================================================= + +const SHADOW_HOST_STYLES = /* css */ ` + :host { + all: initial; + } + + *, + *::before, + *::after { + box-sizing: border-box; + } + + /* Overlay container - for Canvas and visual feedback */ + #${WEB_EDITOR_V2_OVERLAY_ID} { + position: fixed; + inset: 0; + pointer-events: none; + contain: layout style; + } + + /* UI container - for panels and controls */ + #${WEB_EDITOR_V2_UI_ID} { + position: fixed; + top: 16px; + right: 16px; + pointer-events: auto; + font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 13px; + line-height: 1.4; + color: #0f172a; + -webkit-font-smoothing: antialiased; + } + + /* Panel styles */ + .we-panel { + width: 320px; + max-width: calc(100vw - 32px); + max-height: calc(100vh - 32px); + background: rgba(255, 255, 255, 0.98); + border: 1px solid rgba(148, 163, 184, 0.5); + border-radius: 12px; + box-shadow: + 0 4px 6px -1px rgba(0, 0, 0, 0.1), + 0 10px 20px -5px rgba(0, 0, 0, 0.15); + overflow: hidden; + contain: layout style paint; + } + + .we-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 10px 14px; + background: rgba(248, 250, 252, 0.95); + border-bottom: 1px solid rgba(226, 232, 240, 0.8); + user-select: none; + } + + .we-title { + display: flex; + align-items: center; + gap: 8px; + font-size: 13px; + font-weight: 600; + color: #1e293b; + } + + .we-badge { + font-size: 10px; + font-weight: 500; + padding: 2px 6px; + background: linear-gradient(135deg, #6366f1, #8b5cf6); + color: white; + border-radius: 4px; + } + + .we-btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + padding: 6px 12px; + font-size: 12px; + font-weight: 500; + color: #475569; + background: white; + border: 1px solid rgba(148, 163, 184, 0.5); + border-radius: 6px; + cursor: pointer; + transition: all 0.15s ease; + } + + .we-btn:hover { + background: #f8fafc; + border-color: rgba(148, 163, 184, 0.7); + } + + .we-btn:active { + background: #f1f5f9; + } + + .we-btn:focus-visible { + outline: 2px solid #6366f1; + outline-offset: 2px; + } + + .we-btn:disabled { + opacity: 0.55; + cursor: not-allowed; + } + + .we-btn--primary { + background: linear-gradient(135deg, #0f172a, #1e293b); + color: #ffffff; + border-color: rgba(15, 23, 42, 0.5); + } + + .we-btn--primary:hover:not(:disabled) { + background: linear-gradient(135deg, #1e293b, #334155); + border-color: rgba(15, 23, 42, 0.65); + } + + .we-btn--danger { + color: #b91c1c; + border-color: rgba(248, 113, 113, 0.45); + } + + .we-btn--danger:hover:not(:disabled) { + background: rgba(248, 113, 113, 0.08); + border-color: rgba(248, 113, 113, 0.6); + } + + /* Toolbar */ + .we-toolbar { + position: fixed; + left: 50%; + top: 16px; + transform: translateX(-50%); + width: min(720px, calc(100vw - 32px)); + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 10px 14px; + background: rgba(255, 255, 255, 0.98); + border: 1px solid rgba(148, 163, 184, 0.5); + border-radius: 12px; + box-shadow: + 0 4px 6px -1px rgba(0, 0, 0, 0.1), + 0 10px 20px -5px rgba(0, 0, 0, 0.15); + pointer-events: auto; + user-select: none; + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 13px; + color: #0f172a; + } + + .we-toolbar[data-position="bottom"] { + top: auto; + bottom: 16px; + } + + .we-toolbar-left, + .we-toolbar-right { + display: flex; + align-items: center; + gap: 8px; + } + + .we-toolbar-center { + flex: 1; + display: flex; + justify-content: center; + min-width: 0; + } + + .we-toolbar-meta { + display: inline-flex; + align-items: center; + gap: 10px; + padding: 4px 12px; + background: rgba(248, 250, 252, 0.9); + border: 1px solid rgba(226, 232, 240, 0.9); + border-radius: 999px; + color: #475569; + font-size: 12px; + white-space: nowrap; + } + + .we-toolbar-status { + font-size: 11px; + padding: 2px 8px; + border-radius: 999px; + background: rgba(100, 116, 139, 0.12); + color: #334155; + } + + .we-toolbar[data-status="idle"] .we-toolbar-status { + display: none; + } + + .we-toolbar[data-status="applying"] .we-toolbar-status { + background: rgba(59, 130, 246, 0.12); + color: #1d4ed8; + } + + .we-toolbar[data-status="success"] .we-toolbar-status { + background: rgba(34, 197, 94, 0.12); + color: #15803d; + } + + .we-toolbar[data-status="error"] .we-toolbar-status { + background: rgba(248, 113, 113, 0.14); + color: #b91c1c; + } + + .we-body { + padding: 14px; + color: #475569; + font-size: 12px; + } + + .we-status { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: rgba(34, 197, 94, 0.1); + border-radius: 6px; + color: #15803d; + font-size: 12px; + } + + .we-status-dot { + width: 8px; + height: 8px; + background: #22c55e; + border-radius: 50%; + animation: pulse 2s ease-in-out infinite; + } + + @keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } + } +`; + +// ============================================================================= +// Implementation +// ============================================================================= + +/** + * Set a CSS property with !important flag + */ +function setImportantStyle(element: HTMLElement, property: string, value: string): void { + element.style.setProperty(property, value, 'important'); +} + +/** + * Create the initial panel UI + */ +function createPanelContent(onRequestClose?: () => void): HTMLElement { + const panel = document.createElement('div'); + panel.className = 'we-panel'; + panel.setAttribute('role', 'dialog'); + panel.setAttribute('aria-label', 'Web Editor'); + + // Header + const header = document.createElement('div'); + header.className = 'we-header'; + + const title = document.createElement('div'); + title.className = 'we-title'; + title.innerHTML = ` + Web Editor + V2 + `; + + const closeBtn = document.createElement('button'); + closeBtn.type = 'button'; + closeBtn.className = 'we-btn'; + closeBtn.textContent = 'Exit'; + closeBtn.setAttribute('aria-label', 'Exit Web Editor'); + closeBtn.addEventListener('click', () => onRequestClose?.()); + + header.append(title, closeBtn); + + // Body + const body = document.createElement('div'); + body.className = 'we-body'; + + const status = document.createElement('div'); + status.className = 'we-status'; + status.innerHTML = ` + + Editor active - Hover to select elements + `; + body.append(status); + + panel.append(header, body); + return panel; +} + +/** + * Mount the Shadow DOM host and return a manager interface + */ +export function mountShadowHost(options: ShadowHostOptions = {}): ShadowHostManager { + const disposer = new Disposer(); + let elements: ShadowHostElements | null = null; + + // Clean up any existing host (from crash/reload) + const existing = document.getElementById(WEB_EDITOR_V2_HOST_ID); + if (existing) { + try { + existing.remove(); + } catch { + // Best-effort cleanup + } + } + + // Create host element + const host = document.createElement('div'); + host.id = WEB_EDITOR_V2_HOST_ID; + host.setAttribute('data-mcp-web-editor', 'v2'); + + // Apply host styles with !important to resist page CSS + setImportantStyle(host, 'position', 'fixed'); + setImportantStyle(host, 'inset', '0'); + setImportantStyle(host, 'z-index', String(WEB_EDITOR_V2_Z_INDEX)); + setImportantStyle(host, 'pointer-events', 'none'); + setImportantStyle(host, 'contain', 'layout style paint'); + setImportantStyle(host, 'isolation', 'isolate'); + + // Create shadow root + const shadowRoot = host.attachShadow({ mode: 'open' }); + + // Add styles + const styleEl = document.createElement('style'); + styleEl.textContent = SHADOW_HOST_STYLES; + shadowRoot.append(styleEl); + + // Create overlay container (for Canvas) + const overlayRoot = document.createElement('div'); + overlayRoot.id = WEB_EDITOR_V2_OVERLAY_ID; + + // Create UI container (for panels) + const uiRoot = document.createElement('div'); + uiRoot.id = WEB_EDITOR_V2_UI_ID; + uiRoot.append(createPanelContent(options.onRequestClose)); + + shadowRoot.append(overlayRoot, uiRoot); + + // Mount to document + const mountPoint = document.documentElement ?? document.body; + mountPoint.append(host); + disposer.add(() => host.remove()); + + elements = { host, shadowRoot, overlayRoot, uiRoot }; + + // Event isolation: prevent UI events from bubbling to page + const blockedEvents = [ + 'pointerdown', + 'pointerup', + 'pointermove', + 'pointerenter', + 'pointerleave', + 'mousedown', + 'mouseup', + 'mousemove', + 'mouseenter', + 'mouseleave', + 'click', + 'dblclick', + 'contextmenu', + 'keydown', + 'keyup', + 'keypress', + 'wheel', + 'touchstart', + 'touchmove', + 'touchend', + 'touchcancel', + 'focus', + 'blur', + 'input', + 'change', + ]; + + const stopPropagation = (event: Event) => { + event.stopPropagation(); + }; + + for (const eventType of blockedEvents) { + disposer.listen(uiRoot, eventType, stopPropagation); + } + + // Helper: check if a node is part of the editor + const isOverlayElement = (node: unknown): boolean => { + if (!(node instanceof Node)) return false; + if (node === host) return true; + + const root = typeof node.getRootNode === 'function' ? node.getRootNode() : null; + return root instanceof ShadowRoot && root.host === host; + }; + + // Helper: check if an event came from the editor UI + const isEventFromUi = (event: Event): boolean => { + try { + if (typeof event.composedPath === 'function') { + return event.composedPath().some((el) => isOverlayElement(el)); + } + } catch { + // Fallback to target + } + return isOverlayElement(event.target); + }; + + return { + getElements: () => elements, + isOverlayElement, + isEventFromUi, + dispose: () => { + elements = null; + disposer.dispose(); + }, + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/ui/toolbar.ts b/app/chrome-extension/entrypoints/web-editor-v2/ui/toolbar.ts new file mode 100644 index 0000000..03a9873 --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/ui/toolbar.ts @@ -0,0 +1,317 @@ +/** + * Toolbar UI (Phase 1.10) + * + * Shadow DOM toolbar with Apply / Undo / Redo / Close buttons. + * Displays transaction counts and operation status. + * + * Design: + * - Fixed position at top of viewport + * - Uses CSS classes defined in shadow-host.ts + * - Disposer pattern for cleanup + */ + +import { Disposer } from '../utils/disposables'; + +// ============================================================================= +// Types +// ============================================================================= + +/** Toolbar position */ +export type ToolbarDock = 'top' | 'bottom'; + +/** Operation status */ +export type ToolbarStatus = 'idle' | 'applying' | 'success' | 'error'; + +/** Result from apply operation */ +export interface ApplyResult { + requestId?: string; +} + +/** Toolbar creation options */ +export interface ToolbarOptions { + /** Container element in Shadow DOM */ + container: HTMLElement; + /** Position (default: top) */ + dock?: ToolbarDock; + /** Called when Apply button is clicked */ + onApply?: () => void | ApplyResult | Promise; + /** Called when Undo button is clicked */ + onUndo?: () => void; + /** Called when Redo button is clicked */ + onRedo?: () => void; + /** Called when Close button is clicked */ + onRequestClose?: () => void; +} + +/** Toolbar public interface */ +export interface Toolbar { + /** Update undo/redo counts */ + setHistory(undoCount: number, redoCount: number): void; + /** Update status display */ + setStatus(status: ToolbarStatus, message?: string): void; + /** Cleanup */ + dispose(): void; +} + +// ============================================================================= +// Helpers +// ============================================================================= + +/** + * Check if value is Promise-like + */ +function isPromiseLike(value: unknown): value is PromiseLike { + return ( + !!value && + (typeof value === 'object' || typeof value === 'function') && + typeof (value as { then?: unknown }).then === 'function' + ); +} + +/** + * Check if value is ApplyResult + */ +function isApplyResult(value: unknown): value is ApplyResult { + if (!value || typeof value !== 'object') return false; + const req = (value as { requestId?: unknown }).requestId; + return req === undefined || typeof req === 'string'; +} + +/** + * Format status message with optional request ID + */ +function formatStatusMessage(base: string, result?: ApplyResult): string { + const req = result?.requestId ? `requestId=${result.requestId}` : ''; + return req ? `${base} (${req})` : base; +} + +// ============================================================================= +// Status Reset Timer +// ============================================================================= + +const STATUS_RESET_DELAY_MS = 2400; + +// ============================================================================= +// Implementation +// ============================================================================= + +/** + * Create a Toolbar UI component + */ +export function createToolbar(options: ToolbarOptions): Toolbar { + const disposer = new Disposer(); + const dock = options.dock ?? 'top'; + + // State + let undoCount = 0; + let redoCount = 0; + let status: ToolbarStatus = 'idle'; + let statusMessage = ''; + let applying = false; + let resetTimer: number | null = null; + + // ========================================================================== + // DOM Structure + // ========================================================================== + + // Root container + const root = document.createElement('div'); + root.className = 'we-toolbar'; + root.dataset.position = dock; + root.dataset.status = status; + root.setAttribute('role', 'toolbar'); + root.setAttribute('aria-label', 'Web Editor Toolbar'); + + // Left section: title + const left = document.createElement('div'); + left.className = 'we-toolbar-left'; + + const title = document.createElement('div'); + title.className = 'we-title'; + const titleText = document.createElement('span'); + titleText.textContent = 'Web Editor'; + const badge = document.createElement('span'); + badge.className = 'we-badge'; + badge.textContent = 'V2'; + title.append(titleText, badge); + left.append(title); + + // Center section: counts and status + const center = document.createElement('div'); + center.className = 'we-toolbar-center'; + + const meta = document.createElement('div'); + meta.className = 'we-toolbar-meta'; + + const countsEl = document.createElement('span'); + countsEl.className = 'we-toolbar-counts'; + + const statusEl = document.createElement('span'); + statusEl.className = 'we-toolbar-status'; + statusEl.setAttribute('aria-live', 'polite'); + + meta.append(countsEl, statusEl); + center.append(meta); + + // Right section: buttons + const right = document.createElement('div'); + right.className = 'we-toolbar-right'; + + const applyBtn = document.createElement('button'); + applyBtn.type = 'button'; + applyBtn.className = 'we-btn we-btn--primary'; + applyBtn.textContent = 'Apply'; + applyBtn.setAttribute('aria-label', 'Apply changes to code'); + + const undoBtn = document.createElement('button'); + undoBtn.type = 'button'; + undoBtn.className = 'we-btn'; + undoBtn.textContent = 'Undo'; + undoBtn.setAttribute('aria-label', 'Undo last change'); + + const redoBtn = document.createElement('button'); + redoBtn.type = 'button'; + redoBtn.className = 'we-btn'; + redoBtn.textContent = 'Redo'; + redoBtn.setAttribute('aria-label', 'Redo last undone change'); + + const closeBtn = document.createElement('button'); + closeBtn.type = 'button'; + closeBtn.className = 'we-btn we-btn--danger'; + closeBtn.textContent = 'Close'; + closeBtn.setAttribute('aria-label', 'Close Web Editor'); + + right.append(applyBtn, undoBtn, redoBtn, closeBtn); + + // Assemble + root.append(left, center, right); + options.container.append(root); + disposer.add(() => root.remove()); + + // ========================================================================== + // Timer Management + // ========================================================================== + + function clearResetTimer(): void { + if (resetTimer !== null) { + window.clearTimeout(resetTimer); + resetTimer = null; + } + } + disposer.add(clearResetTimer); + + // ========================================================================== + // Render Functions + // ========================================================================== + + function renderCounts(): void { + countsEl.textContent = `Undo: ${undoCount} · Redo: ${redoCount}`; + } + + function renderButtons(): void { + undoBtn.disabled = applying || undoCount <= 0; + redoBtn.disabled = applying || redoCount <= 0; + applyBtn.disabled = applying || undoCount <= 0 || !options.onApply; + applyBtn.textContent = applying ? 'Applying…' : 'Apply'; + } + + function renderStatus(): void { + root.dataset.status = status; + statusEl.textContent = status === 'idle' ? '' : statusMessage; + } + + function scheduleStatusReset(): void { + clearResetTimer(); + resetTimer = window.setTimeout(() => setStatus('idle'), STATUS_RESET_DELAY_MS); + } + + // ========================================================================== + // Public Methods + // ========================================================================== + + function setHistory(nextUndo: number, nextRedo: number): void { + undoCount = Math.max(0, Math.floor(nextUndo)); + redoCount = Math.max(0, Math.floor(nextRedo)); + renderCounts(); + renderButtons(); + } + + function setStatus(nextStatus: ToolbarStatus, message?: string): void { + status = nextStatus; + statusMessage = (message ?? '').trim(); + renderStatus(); + + if (status === 'success' || status === 'error') { + scheduleStatusReset(); + } else { + clearResetTimer(); + } + } + + // ========================================================================== + // Event Handlers + // ========================================================================== + + async function handleApply(): Promise { + if (applyBtn.disabled) return; + if (!options.onApply) return; + + applying = true; + renderButtons(); + setStatus('applying', 'Sending…'); + + try { + const resultOrPromise = options.onApply(); + const result = isPromiseLike(resultOrPromise) ? await resultOrPromise : resultOrPromise; + const applyResult = isApplyResult(result) ? result : undefined; + setStatus('success', formatStatusMessage('Sent', applyResult)); + } catch (error) { + const msg = error instanceof Error ? error.message : String(error); + setStatus('error', msg || 'Failed'); + } finally { + applying = false; + renderButtons(); + } + } + + // Apply button + disposer.listen(applyBtn, 'click', (event) => { + event.preventDefault(); + void handleApply(); + }); + + // Undo button + disposer.listen(undoBtn, 'click', (event) => { + event.preventDefault(); + if (undoBtn.disabled) return; + options.onUndo?.(); + }); + + // Redo button + disposer.listen(redoBtn, 'click', (event) => { + event.preventDefault(); + if (redoBtn.disabled) return; + options.onRedo?.(); + }); + + // Close button + disposer.listen(closeBtn, 'click', (event) => { + event.preventDefault(); + options.onRequestClose?.(); + }); + + // Initial render + renderCounts(); + renderButtons(); + renderStatus(); + + // ========================================================================== + // Return API + // ========================================================================== + + return { + setHistory, + setStatus, + dispose: () => disposer.dispose(), + }; +} diff --git a/app/chrome-extension/entrypoints/web-editor-v2/utils/disposables.ts b/app/chrome-extension/entrypoints/web-editor-v2/utils/disposables.ts new file mode 100644 index 0000000..a78c1ae --- /dev/null +++ b/app/chrome-extension/entrypoints/web-editor-v2/utils/disposables.ts @@ -0,0 +1,142 @@ +/** + * Disposables Utility + * + * Provides deterministic cleanup for event listeners, observers, and other resources. + * Ensures proper cleanup order (LIFO) and prevents memory leaks. + */ + +/** Function that performs cleanup */ +export type DisposeFn = () => void; + +/** + * Manages a collection of disposable resources. + * Resources are disposed in reverse order (LIFO). + */ +export class Disposer { + private disposed = false; + private readonly disposers: DisposeFn[] = []; + + /** Whether this disposer has already been disposed */ + get isDisposed(): boolean { + return this.disposed; + } + + /** + * Add a dispose function to be called during cleanup. + * If already disposed, the function is called immediately. + */ + add(dispose: DisposeFn): void { + if (this.disposed) { + try { + dispose(); + } catch { + // Best-effort cleanup for late additions + } + return; + } + this.disposers.push(dispose); + } + + /** + * Add an event listener and automatically remove it on dispose. + */ + listen( + target: Window, + type: K, + listener: (ev: WindowEventMap[K]) => void, + options?: boolean | AddEventListenerOptions, + ): void; + listen( + target: Document, + type: K, + listener: (ev: DocumentEventMap[K]) => void, + options?: boolean | AddEventListenerOptions, + ): void; + listen( + target: HTMLElement, + type: K, + listener: (ev: HTMLElementEventMap[K]) => void, + options?: boolean | AddEventListenerOptions, + ): void; + listen( + target: EventTarget, + type: string, + listener: EventListenerOrEventListenerObject, + options?: boolean | AddEventListenerOptions, + ): void; + listen( + target: EventTarget, + type: string, + listener: EventListenerOrEventListenerObject, + options?: boolean | AddEventListenerOptions, + ): void { + target.addEventListener(type, listener, options); + this.add(() => target.removeEventListener(type, listener, options)); + } + + /** + * Add a ResizeObserver and automatically disconnect it on dispose. + */ + observeResize( + target: Element, + callback: ResizeObserverCallback, + options?: ResizeObserverOptions, + ): ResizeObserver { + const observer = new ResizeObserver(callback); + observer.observe(target, options); + this.add(() => observer.disconnect()); + return observer; + } + + /** + * Add a MutationObserver and automatically disconnect it on dispose. + */ + observeMutation( + target: Node, + callback: MutationCallback, + options?: MutationObserverInit, + ): MutationObserver { + const observer = new MutationObserver(callback); + observer.observe(target, options); + this.add(() => observer.disconnect()); + return observer; + } + + /** + * Add a requestAnimationFrame and automatically cancel it on dispose. + * Returns a function to manually cancel the frame. + */ + requestAnimationFrame(callback: FrameRequestCallback): () => void { + const id = requestAnimationFrame(callback); + let cancelled = false; + + const cancel = () => { + if (cancelled) return; + cancelled = true; + cancelAnimationFrame(id); + }; + + this.add(cancel); + return cancel; + } + + /** + * Dispose all registered resources in reverse order. + * Safe to call multiple times. + */ + dispose(): void { + if (this.disposed) return; + this.disposed = true; + + // Dispose in reverse order (LIFO) + for (let i = this.disposers.length - 1; i >= 0; i--) { + try { + this.disposers[i](); + } catch { + // Best-effort cleanup, continue with remaining disposers + } + } + + this.disposers.length = 0; + } +} diff --git a/app/chrome-extension/wxt.config.ts b/app/chrome-extension/wxt.config.ts index a3d171b..b86694c 100644 --- a/app/chrome-extension/wxt.config.ts +++ b/app/chrome-extension/wxt.config.ts @@ -72,18 +72,18 @@ export default defineConfig({ }, // Keyboard shortcuts for quick triggers commands: { - run_quick_trigger_1: { - suggested_key: { default: 'Ctrl+Shift+1' }, - description: 'Run quick trigger 1', - }, - run_quick_trigger_2: { - suggested_key: { default: 'Ctrl+Shift+2' }, - description: 'Run quick trigger 2', - }, - run_quick_trigger_3: { - suggested_key: { default: 'Ctrl+Shift+3' }, - description: 'Run quick trigger 3', - }, + // run_quick_trigger_1: { + // suggested_key: { default: 'Ctrl+Shift+1' }, + // description: 'Run quick trigger 1', + // }, + // run_quick_trigger_2: { + // suggested_key: { default: 'Ctrl+Shift+2' }, + // description: 'Run quick trigger 2', + // }, + // run_quick_trigger_3: { + // suggested_key: { default: 'Ctrl+Shift+3' }, + // description: 'Run quick trigger 3', + // }, open_workflow_sidepanel: { suggested_key: { default: 'Ctrl+Shift+O' }, description: 'Open workflow sidepanel', diff --git a/builder-plan.md b/builder-plan.md new file mode 100644 index 0000000..a5575ab --- /dev/null +++ b/builder-plan.md @@ -0,0 +1,1203 @@ +# 可视化编辑器 (Visual Editor) 重构计划 + +## 一、项目概述 + +### 1.1 目标 + +基于 editor.md 中的需求讨论,将现有玩具级的可视化编辑器重写为企业级、Webflow/Figma 级丝滑体验的前端可视化工作台。 + +### 1.2 现状分析 + +- **入口**: `toggleEditorInTab` in `app/chrome-extension/entrypoints/background/web-editor/index.ts:205` +- **注入脚本**: `app/chrome-extension/inject-scripts/web-editor.js` (约 850 行单体 JS) +- **当前能力**: + - 基础的 hover 高亮和 click 选中 + - Canvas 绘制选中框 (但性能有问题) + - 简单的 Text/Style 编辑浮层 + - Sync to Code 发送给 Agent +- **主要问题**: + - 无 Shadow DOM 隔离,样式易污染 + - mousemove 未节流,直接触发 layout + - 不支持 Shadow DOM 内部元素选择 + - 不支持 iframe + - payload fingerprint 过弱 + - 无拖拽重排能力 + - 无属性面板 (Design/CSS) + - 无事务系统 (Undo/Redo) + +### 1.3 技术决策 + +基于 codex 分析和 editor.md 方案,采用以下架构: + +- **AR 架构**: Canvas 负责视觉反馈,DOM API 负责实际操作 +- **Shadow DOM 隔离**: 所有编辑器 UI 在 ShadowRoot 内渲染 +- **性能优先**: rAF 驱动、读写分离、按需渲染 +- **渐进增强**: 基础模式 + 精准模式 (Vite 插件) +- **UI 技术栈**: Vue 3 (与项目保持一致,复用现有组件和构建链路) +- **事务系统**: 基于 Locator 而非 Element 引用 (支持 HMR/DOM 变更后恢复)(低优先级,先不考虑实现) + +--- + +## 二、功能点清单 + +### A. 画布交互与选中系统 + +| ID | 功能点 | 优先级 | 复杂度 | +| --- | ------------------------------------------------------- | ------ | ------ | +| A0 | 事件拦截与编辑模式控制 (stopPropagation/preventDefault) | P0 | 低 | +| A1 | Hover 高亮 (60FPS) | P0 | 中 | +| A2 | 智能去噪选中 (透明容器透传、视觉权重) | P0 | 高 | +| A3 | 单击选中 + 修饰键穿透/上钻 | P0 | 中 | +| A4 | 面包屑导航 (composedPath) | P1 | 中 | +| A5 | Shadow DOM 内部元素支持 | P1 | 高 | +| A6 | iframe 内部元素支持 | P2 | 高 | +| A7 | 多选与框选 | P2 | 高 | +| A8 | 组件实例识别 (结构指纹聚类) | P2 | 高 | +| A9 | 编辑器自身元素过滤 (避免选中 overlay/toolbar) | P0 | 低 | + +### B. 视觉渲染引擎 + +| ID | 功能点 | 优先级 | 复杂度 | +| --- | ------------------------------------ | ------ | ------ | +| B1 | Shadow DOM 宿主隔离 | P0 | 中 | +| B2 | Canvas Overlay 层 (选框/参考线) | P0 | 高 | +| B3 | rAF 驱动渲染循环 | P0 | 中 | +| B4 | 读写分离 (避免 layout thrash) | P0 | 中 | +| B5 | ResizeObserver/MutationObserver 同步 | P1 | 中 | +| B6 | 按需渲染 (非常驻 tick) | P1 | 低 | +| B7 | 智能对齐线与测距标注 | P2 | 高 | +| B8 | 拖拽残影动画 | P2 | 中 | +| B9 | Canvas DPR 适配 (高清屏支持) | P0 | 低 | + +### C. 属性面板 (Design/CSS) + +| ID | 功能点 | 优先级 | 复杂度 | +| --- | ------------------------------------------------ | ------ | ------ | +| C1 | Components 树 (DOM/组件层级) | P1 | 高 | +| C2 | Design 面板 - Position | P1 | 中 | +| C3 | Design 面板 - Layout (flex/grid) | P1 | 高 | +| C4 | Design 面板 - Size (W/H) | P1 | 中 | +| C5 | Design 面板 - Spacing (padding/margin) | P1 | 中 | +| C6 | Design 面板 - Typography | P1 | 中 | +| C7 | Design 面板 - Appearance (opacity/radius/border) | P1 | 中 | +| C8 | CSS 面板 - 样式来源追踪 | P2 | 高 | +| C9 | CSS 面板 - class 编辑 | P2 | 中 | +| C10 | Design System Tokens 集成 | P3 | 高 | + +### D. 直接操控 + +| ID | 功能点 | 优先级 | 复杂度 | +| --- | -------------------------------- | ------ | ------ | +| D1 | 拖拽重排 (move node) | P1 | 高 | +| D2 | 位置/尺寸手柄拖拽 | P2 | 高 | +| D3 | 智能吸附 (snap to edges/centers) | P2 | 高 | +| D4 | 文本直接编辑 (contentEditable) | P1 | 中 | +| D5 | Group/Stack 结构化操作 | P3 | 高 | + +### E. 变更事务系统(低优先级,先不考虑实现) + +| ID | 功能点 | 优先级 | 复杂度 | +| --- | ------------------------------- | ------ | ------ | +| E1 | Transaction 记录 (before/after) | P0 | 高 | +| E2 | Undo/Redo 栈 | P0 | 中 | +| E3 | 变更计数 UI (1 Edit) | P1 | 低 | +| E4 | Apply 失败自动回滚 | P1 | 中 | +| E5 | 拖拽过程合并为单事务 | P1 | 中 | + +### F. Apply 到代码同步链路 + +| ID | 功能点 | 优先级 | 复杂度 | +| --- | ------------------------------------------ | ------ | ------ | +| F1 | Payload 规范化 (locator/operation/context) | P0 | 高 | +| F2 | 框架调试信息定位 (React/Vue) | P0 | 中 | +| F3 | Selector 候选生成 | P1 | 高 | +| F4 | Agent Prompt 优化 | P1 | 中 | +| F5 | 执行结果反馈 UI | P1 | 中 | +| F6 | HMR 一致性校验 | P2 | 高 | + +### G. 工程化与兼容性 + +| ID | 功能点 | 优先级 | 复杂度 | +| --- | ---------------------- | ------ | ------ | +| G1 | 注入脚本 TypeScript 化 | P1 | 高 | +| G2 | 模块化架构 (分层清晰) | P0 | 高 | +| G3 | 核心逻辑单元测试 | P2 | 中 | +| G4 | 性能监控 (FPS/内存) | P2 | 中 | + +--- + +## 三、技术架构设计 + +### 3.1 整体分层架构 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Chrome Extension │ +│ ┌──────────────────────────────────────────────────────┐ │ +│ │ Background │ │ +│ │ - 注入控制 (toggleEditorInTab) │ │ +│ │ - Agent Prompt 构建 │ │ +│ │ - Native Server 通信 │ │ +│ └──────────────────────────────────────────────────────┘ │ +│ ↕ Message │ +│ ┌──────────────────────────────────────────────────────┐ │ +│ │ Inject Script (web-editor) │ │ +│ │ ┌────────────────────────────────────────────────┐ │ │ +│ │ │ Shadow DOM Host │ │ │ +│ │ │ ┌─────────────┐ ┌─────────────────────────┐ │ │ │ +│ │ │ │ Canvas │ │ UI Panel │ │ │ +│ │ │ │ Overlay │ │ (Toolbar/Sidebar/Tree) │ │ │ │ +│ │ │ │ (Renderer) │ │ (Vue 3) │ │ │ │ +│ │ │ └─────────────┘ └─────────────────────────┘ │ │ │ +│ │ └────────────────────────────────────────────────┘ │ │ +│ │ ┌────────────────────────────────────────────────┐ │ │ +│ │ │ Core Logic Layer │ │ │ +│ │ │ - InteractionEngine (事件/状态机) │ │ │ +│ │ │ - SelectionEngine (智能选中/指纹) │ │ │ +│ │ │ - TransactionManager (Undo/Redo) │ │ │ +│ │ │ - PayloadBuilder (上下文构建) │ │ │ +│ │ └────────────────────────────────────────────────┘ │ │ +│ └──────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────┘ + ↕ HTTP/SSE +┌─────────────────────────────────────────────────────────────┐ +│ Native Server │ +│ - Agent 执行引擎 (Codex/Claude) │ +│ - 代码定位与修改 │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 3.2 核心模块划分 + +#### 3.2.1 渲染层 (Renderer) + +```typescript +// renderer/CanvasOverlay.ts +class CanvasOverlay { + private canvas: HTMLCanvasElement; + private ctx: CanvasRenderingContext2D; + private dirty: boolean = false; + + // 绘制元素 + drawSelectionBox(rect: DOMRect, style: BoxStyle): void; + drawHoverBox(rect: DOMRect): void; + drawAlignmentGuides(guides: Guide[]): void; + drawDistanceLabels(labels: DistanceLabel[]): void; + drawDragGhost(rect: DOMRect, opacity: number): void; + drawInsertionLine(position: InsertPosition): void; + + // 渲染控制 + markDirty(): void; + render(): void; // 由 rAF 调用 + startRenderLoop(): void; + stopRenderLoop(): void; +} +``` + +#### 3.2.2 交互层 (Interaction) + +```typescript +// interaction/InteractionEngine.ts +type EditorState = 'idle' | 'hovering' | 'selected' | 'dragging' | 'editing'; + +class InteractionEngine { + private state: EditorState = 'idle'; + private lastPointer: Point | null = null; + + // 事件处理 (只记录,不直接处理) + handlePointerMove(e: PointerEvent): void; + handlePointerDown(e: PointerEvent): void; + handlePointerUp(e: PointerEvent): void; + handleKeyDown(e: KeyboardEvent): void; + + // rAF 中调用的处理逻辑 + processFrame(): void { + // 1. 读取阶段: elementFromPoint, getBoundingClientRect + // 2. 计算阶段: 智能选中、拖拽位置 + // 3. 写入阶段: 更新 Canvas, 必要时更新 DOM + } +} +``` + +#### 3.2.3 选中层 (Selection) + +```typescript +// selection/SelectionEngine.ts +interface SelectionCandidate { + element: Element; + score: number; + reasons: string[]; +} + +class SelectionEngine { + // 智能选中 + findBestTarget(point: Point, modifiers: Modifiers): Element | null; + + // 候选评分 + private scoreCandidates(candidates: Element[]): SelectionCandidate[]; + + // 启发式规则 + private hasVisualBoundary(el: Element): boolean; + private isWrapperOnly(el: Element): boolean; + private getInteractivityScore(el: Element): number; + + // 结构指纹 + computeFingerprint(el: Element): string; + findSimilarElements(fingerprint: string): Element[]; + + // Shadow DOM 支持 + getDeepElementFromPoint(x: number, y: number): Element | null; +} +``` + +#### 3.2.4 事务层 (Transaction) + +```typescript +// transaction/TransactionManager.ts + +// 使用 Locator 而非 Element 引用,支持 HMR/DOM 变更后恢复 +interface ElementLocator { + selectors: string[]; // CSS selector 候选列表 + fingerprint: string; // 结构指纹 + debugSource?: DebugSource; // React/Vue 调试信息 + path: number[]; // DOM 树路径 (childIndex 序列) + // iframe/Shadow DOM 上下文 (Phase 2/4 需要) + frameChain?: string[]; // iframe selector 链 (从 top 到目标 frame) + shadowHostChain?: string[]; // Shadow DOM host selector 链 +} + +interface TransactionSnapshot { + locator: ElementLocator; + html?: string; // innerHTML 快照 (仅结构变更) + styles?: Record; // 变更的样式 + text?: string; // 文本内容 +} + +// move/structure 操作的详细数据结构 +interface MoveOperationData { + parentLocator: ElementLocator; // 目标父元素 + insertIndex: number; // 插入位置索引 + anchorLocator?: ElementLocator; // 锚点兄弟元素 (insertBefore 的参考) + anchorPosition: 'before' | 'after'; +} + +interface StructureOperationData { + action: 'wrap' | 'unwrap' | 'delete' | 'duplicate'; + wrapperTag?: string; // wrap 时的包装标签 + wrapperStyles?: Record; +} + +interface Transaction { + id: string; + type: 'style' | 'text' | 'move' | 'structure'; + targetLocator: ElementLocator; // 使用 Locator 而非 Element + before: TransactionSnapshot; + after: TransactionSnapshot; + // move/structure 操作的额外数据 + moveData?: MoveOperationData; + structureData?: StructureOperationData; + timestamp: number; + merged: boolean; // 是否已合并到上一个事务 +} + +class TransactionManager { + private undoStack: Transaction[] = []; + private redoStack: Transaction[] = []; + + // 事务操作 + begin(type: Transaction['type'], target: Element): TransactionHandle; + commit(handle: TransactionHandle): void; + rollback(handle: TransactionHandle): void; + + // Undo/Redo (通过 Locator 重新定位元素) + undo(): Transaction | null; + redo(): Transaction | null; + + // 元素定位 + private locateElement(locator: ElementLocator): Element | null; + + // 合并策略 (连续的同类型操作合并) + mergeIfContinuous(tx: Transaction): boolean; + + // 状态查询 + getPendingCount(): number; + getHistory(): Transaction[]; +} +``` + +#### 3.2.5 Payload 构建层 + +```typescript +// payload/PayloadBuilder.ts + +// Payload 字段限制 (避免消息过大) +const PAYLOAD_LIMITS = { + MAX_SELECTOR_COUNT: 5, + MAX_SKELETON_DEPTH: 3, + MAX_SKELETON_CHILDREN: 10, + MAX_SIBLING_ANCHORS: 3, + MAX_STYLE_PROPERTIES: 20, + MAX_TEXT_LENGTH: 500, + STYLE_WHITELIST: [ + 'display', + 'position', + 'width', + 'height', + 'margin', + 'padding', + 'color', + 'background', + 'font-size', + 'font-weight', + 'flex', + 'grid', + 'gap', + ], +}; + +interface EditorPayload { + version: '1.0'; // Schema 版本,便于后续升级 + locator: { + selectors: SelectorCandidate[]; + debugSource?: { file: string; line: number; column: number }; + fingerprint: ElementFingerprint; + }; + operation: { + type: 'update_text' | 'update_style' | 'move_node'; + before: any; + after: any; + }; + context: { + parentSkeleton: string; // 精简版 HTML 骨架 + siblingAnchors: string[]; // 兄弟节点锚点 + computedStyles: Record; // 白名单样式 + techStack: TechStackHint; + }; +} + +class PayloadBuilder { + build(transaction: Transaction): EditorPayload; + + // 定位信息 + private generateSelectors(el: Element): SelectorCandidate[]; + private extractDebugSource(el: Element): DebugSource | null; + private buildFingerprint(el: Element): ElementFingerprint; + + // 上下文 (带限制) + private extractParentSkeleton(el: Element, depth: number): string; + private extractSiblingAnchors(el: Element): string[]; + private getRelevantStyles(el: Element): Record; + + // 校验 + private validatePayload(payload: EditorPayload): boolean; +} +``` + +### 3.3 状态机设计 + +``` + ┌──────────────┐ + │ IDLE │ + └──────┬───────┘ + │ pointermove (enter element) + ▼ + ┌──────────────┐ + ┌─────│ HOVERING │─────┐ + │ └──────┬───────┘ │ + │ │ click │ pointermove (leave) + │ ▼ │ + │ ┌──────────────┐ │ + │ │ SELECTED │◄────┘ + │ └──────┬───────┘ + │ │ + ┌─────┼────────────┼────────────┐ + │ │ │ │ + │ pointerdown dblclick Escape/click outside + │ + drag │ │ + ▼ ▼ ▼ +┌──────────────┐ ┌──────────────┐ ┌──────────────┐ +│ DRAGGING │ │ EDITING │ │ IDLE │ +└──────┬───────┘ └──────┬───────┘ └──────────────┘ + │ │ + │ pointerup │ blur/Enter/Escape + ▼ ▼ +┌──────────────┐ ┌──────────────┐ +│ SELECTED │ │ SELECTED │ +│ (commit tx) │ │ (commit tx) │ +└──────────────┘ └──────────────┘ +``` + +### 3.4 消息协议设计 + +#### 3.4.1 注入脚本 ↔ Background + +```typescript +// 控制消息 +type ControlMessage = + | { action: 'web_editor_ping' } + | { action: 'web_editor_toggle' } + | { action: 'web_editor_start' } + | { action: 'web_editor_stop' }; + +// Apply 消息 +interface ApplyMessage { + type: 'web_editor_apply'; + payload: EditorPayload; + sessionId: string; +} + +// 结果回调 (F5 执行结果反馈链路) +interface ApplyResult { + success: boolean; + diff?: string; + error?: string; + suggestions?: string[]; +} + +// F5 执行结果订阅协议 +interface ApplyStatusUpdate { + type: 'web_editor_status'; + requestId: string; + status: 'pending' | 'locating' | 'applying' | 'completed' | 'failed' | 'timeout'; + progress?: number; // 0-100 + message?: string; // 状态描述 + result?: ApplyResult; // 完成时的结果 + timestamp: number; +} + +// Background 订阅 Agent SSE 事件后转发给 inject +// inject 通过 chrome.runtime.onMessage 接收状态更新 +``` + +#### 3.4.2 iframe 跨帧通信 + +```typescript +// Top → Child +interface FrameHitTestRequest { + type: 'web_editor_hit_test'; + x: number; // 相对于 iframe viewport + y: number; + requestId: string; +} + +// Child → Top +interface FrameHitTestResponse { + type: 'web_editor_hit_test_result'; + requestId: string; + element: SerializedElement | null; + rect: DOMRect | null; +} +``` + +--- + +## 四、任务拆分与执行计划 + +### Phase 0: 工程准备 (前置) + +**目标**: 确定构建方式,准备开发环境 + +| 序号 | 任务 | 预估工作量 | 依赖 | 功能点 | +| ---- | --------------------------------------------------- | ---------- | ---- | ------ | +| 0.1 | 确定注入脚本构建方式 (IIFE vs TS 构建) | 1h | - | G1 | +| 0.2 | 如选 TS 构建: 修改 WXT 配置支持 inject-scripts 编译 | 3h | 0.1 | G1 | +| 0.3 | 创建 web-editor-v2 目录结构和模块骨架 | 1h | 0.1 | G2 | + +### Phase 1: 基础架构 (P0) + +**目标**: 建立可工作的分层架构,替换现有实现 + +| 序号 | 任务 | 预估工作量 | 依赖 | 功能点 | +| ---- | ------------------------------------------ | ---------- | -------- | ---------------- | +| 1.1 | 创建新的模块化注入脚本结构 | 2h | Phase 0 | G2 | +| 1.2 | 实现 Shadow DOM 隔离宿主 | 2h | 1.1 | B1 | +| 1.3 | 实现 Canvas Overlay 基础渲染 (含 DPR 适配) | 4h | 1.2 | B2, B9 | +| 1.4 | 实现事件拦截与模式控制 | 2h | 1.2 | A0, A9 | +| 1.5 | 实现 rAF 驱动的交互引擎 | 4h | 1.3, 1.4 | B3, B4 | +| 1.6 | 实现智能选中引擎 (基础版含单击选中) | 4h | 1.5 | A1, A2, A3(基础) | +| 1.7 | 实现 Transaction Manager (基于 Locator) | 3h | 1.5 | E1, E2 | +| 1.8 | 实现 Payload Builder (带限制) | 3h | 1.7 | F1, F2 | +| 1.9 | 对接现有 Background 通信 | 2h | 1.8 | - | +| 1.10 | 基础 Toolbar UI (Apply/Undo/变更计数) | 3h | 1.9 | E3 | + +### Phase 2: 核心交互 (P1) + +**目标**: 实现 Figma 级的选中和编辑体验 + +| 序号 | 任务 | 预估工作量 | 依赖 | 功能点 | +| ---- | -------------------------------------- | ---------- | ------- | -------- | +| 2.1 | Shadow DOM 元素深度选择 (composedPath) | 3h | Phase 1 | A5 | +| 2.2 | 面包屑导航 UI | 2h | 2.1 | A4 | +| 2.3 | 修饰键交互 (Ctrl穿透/Shift上钻) | 2h | 2.1 | A3(高级) | +| 2.4 | 拖拽重排 - Canvas 部分 (ghost/插入线) | 4h | Phase 1 | B8 | +| 2.5 | 拖拽重排 - DOM 操作部分 | 3h | 2.4 | D1 | +| 2.6 | 拖拽重排 - 事务集成 (合并连续操作) | 2h | 2.5 | E5 | +| 2.7 | 文本直接编辑 (contentEditable) | 3h | Phase 1 | D4 | +| 2.8 | Observer 同步 (Resize/Mutation) | 2h | Phase 1 | B5 | +| 2.9 | Selector 候选生成器 | 3h | Phase 1 | F3 | +| 2.10 | Apply 失败自动回滚 | 2h | 1.7 | E4 | + +### Phase 3: 属性面板 (P1) + +**目标**: 实现右侧 Design/CSS 面板 + +| 序号 | 任务 | 预估工作量 | 依赖 | 功能点 | +| ---- | --------------------------------------------- | ---------- | ------- | ------ | +| 3.1 | 面板容器与 Tab 切换 (Vue) | 2h | Phase 1 | - | +| 3.2 | Components 树 (DOM 层级) | 4h | 3.1 | C1 | +| 3.3 | Position 控件 | 2h | 3.1 | C2 | +| 3.4 | Layout 控件 (display/flex/grid) | 4h | 3.1 | C3 | +| 3.5 | Size 控件 (W/H) | 2h | 3.1 | C4 | +| 3.6 | Spacing 控件 (padding/margin,支持拖拽 scrub) | 3h | 3.1 | C5 | +| 3.7 | Typography 控件 | 3h | 3.1 | C6 | +| 3.8 | Appearance 控件 (opacity/radius/border) | 3h | 3.1 | C7 | +| 3.9 | 即时 DOM 应用 + 事务集成 | 3h | 3.2-3.8 | - | +| 3.10 | 执行结果反馈 UI (requestId → 状态订阅) | 3h | 1.9 | F5 | +| 3.11 | Agent Prompt 优化 (利用新 payload) | 2h | 1.8 | F4 | + +### Phase 4: 高级功能 (P2) + +**目标**: 完善体验,增加高级能力 + +| 序号 | 任务 | 预估工作量 | 依赖 | 功能点 | +| ---- | ----------------------------------------------- | ---------- | ------- | ------ | +| 4.1 | iframe 支持 (allFrames 注入 + postMessage 桥接) | 6h | Phase 2 | A6 | +| 4.2 | 智能对齐线与吸附 | 4h | Phase 2 | D3 | +| 4.3 | 测距标注 | 3h | 4.2 | B7 | +| 4.4 | 组件实例识别 (结构指纹 + Worker 计算) | 4h | Phase 2 | A8 | +| 4.5 | 多选与框选 | 4h | Phase 2 | A7 | +| 4.6 | CSS 面板 - 样式来源追踪 | 4h | Phase 3 | C8 | +| 4.7 | CSS 面板 - class 编辑 | 3h | 4.6 | C9 | +| 4.8 | HMR 一致性校验 (依赖结果反馈) | 3h | 3.10 | F6 | +| 4.9 | 位置/尺寸手柄 | 4h | Phase 2 | D2 | +| 4.10 | 按需渲染优化 (静止时停止 tick) | 2h | Phase 1 | B6 | + +### Phase 5: 工程化与增强 (P2-P3) + +**目标**: 提升代码质量和可维护性,支持精准模式 + +| 序号 | 任务 | 预估工作量 | 依赖 | 功能点 | +| ---- | ----------------------------------------------- | ---------- | ------- | ------ | +| 5.1 | 注入脚本完全 TypeScript 化 (如 Phase 0 未完成) | 6h | Phase 3 | G1 | +| 5.2 | 核心逻辑单元测试 (scoring/fingerprint/geometry) | 4h | 5.1 | G3 | +| 5.3 | 性能监控集成 (FPS/内存) | 3h | Phase 4 | G4 | +| 5.4 | Design System Tokens 集成 | 4h | Phase 3 | C10 | +| 5.5 | Group/Stack 结构化操作 | 4h | Phase 2 | D5 | +| 5.6 | 文档与示例 | 3h | Phase 4 | - | + +### Phase 6: 精准模式 (P3,可选) + +**目标**: 支持 Vite 插件实现精准定位 + +| 序号 | 任务 | 预估工作量 | 依赖 | 功能点 | +| ---- | ------------------------------------------ | ---------- | ------- | ------ | +| 6.1 | Payload schema 增加 debugSource 版本化字段 | 2h | Phase 1 | - | +| 6.2 | Vite 插件开发 (注入 data-source-\*) | 6h | 6.1 | - | +| 6.3 | 插件安装文档与 npm 发布 | 2h | 6.2 | - | +| 6.4 | UI 检测 Vite 插件并提示安装 | 2h | 6.2 | - | + +--- + +## 4.1 功能点 → 任务追踪表 + +| 功能点 ID | 功能点描述 | 任务编号 | +| --------- | ------------------------------- | -------------------- | +| A0 | 事件拦截与编辑模式控制 | 1.4 | +| A1 | Hover 高亮 (60FPS) | 1.6 | +| A2 | 智能去噪选中 | 1.6 | +| A3 | 单击选中 + 修饰键 | 1.6(基础), 2.3(高级) | +| A4 | 面包屑导航 | 2.2 | +| A5 | Shadow DOM 内部元素支持 | 2.1 | +| A6 | iframe 内部元素支持 | 4.1 | +| A7 | 多选与框选 | 4.5 | +| A8 | 组件实例识别 | 4.4 | +| A9 | 编辑器自身元素过滤 | 1.4 | +| B1 | Shadow DOM 宿主隔离 | 1.2 | +| B2 | Canvas Overlay 层 | 1.3 | +| B3 | rAF 驱动渲染循环 | 1.5 | +| B4 | 读写分离 | 1.5 | +| B5 | ResizeObserver/MutationObserver | 2.8 | +| B6 | 按需渲染 | 4.10 | +| B7 | 智能对齐线与测距标注 | 4.3 | +| B8 | 拖拽残影动画 | 2.4 | +| B9 | Canvas DPR 适配 | 1.3 | +| C1 | Components 树 | 3.2 | +| C2 | Design 面板 - Position | 3.3 | +| C3 | Design 面板 - Layout | 3.4 | +| C4 | Design 面板 - Size | 3.5 | +| C5 | Design 面板 - Spacing | 3.6 | +| C6 | Design 面板 - Typography | 3.7 | +| C7 | Design 面板 - Appearance | 3.8 | +| C8 | CSS 面板 - 样式来源追踪 | 4.6 | +| C9 | CSS 面板 - class 编辑 | 4.7 | +| C10 | Design System Tokens 集成 | 5.4 | +| D1 | 拖拽重排 | 2.5 | +| D2 | 位置/尺寸手柄拖拽 | 4.9 | +| D3 | 智能吸附 | 4.2 | +| D4 | 文本直接编辑 | 2.7 | +| D5 | Group/Stack 结构化操作 | 5.5 | +| E1 | Transaction 记录 | 1.7 | +| E2 | Undo/Redo 栈 | 1.7 | +| E3 | 变更计数 UI | 1.10 | +| E4 | Apply 失败自动回滚 | 2.10 | +| E5 | 拖拽过程合并为单事务 | 2.6 | +| F1 | Payload 规范化 | 1.8 | +| F2 | 框架调试信息定位 | 1.8 | +| F3 | Selector 候选生成 | 2.9 | +| F4 | Agent Prompt 优化 | 3.11 | +| F5 | 执行结果反馈 UI | 3.10 | +| F6 | HMR 一致性校验 | 4.8 | +| G1 | 注入脚本 TypeScript 化 | 0.2, 5.1 | +| G2 | 模块化架构 | 0.3, 1.1 | +| G3 | 核心逻辑单元测试 | 5.2 | +| G4 | 性能监控 | 5.3 | + +--- + +## 五、可复用资源 + +### 5.1 来自 element-marker + +- Shadow DOM 隔离模式: `element-marker.js:833` +- 深度元素选择 (composedPath): `element-marker.js:1714` +- Selector 唯一性校验: `element-marker.js:1479` +- 高亮器移动逻辑: `element-marker.js:1585` + +### 5.2 来自 accessibility-tree-helper + +- 跨 frame 桥接模式: `accessibility-tree-helper.js:1013` +- DOM 遍历上限控制: `accessibility-tree-helper.js:10` + +### 5.3 来自现有 web-editor + +- 视觉启发式选中 (部分): `web-editor.js:122` +- React/Vue 调试信息提取: `web-editor.js:62`, `web-editor.js:96` +- 技术栈检测: `web-editor.js:39` +- Background 通信协议: `background/web-editor/index.ts` + +--- + +## 六、风险与缓解 + +| 风险 | 影响 | 缓解措施 | +| ---------------------- | ---- | ------------------------------------- | +| 复杂页面性能问题 | 高 | rAF 节流、按需渲染、Web Worker 计算 | +| Shadow DOM closed mode | 中 | 降级到 host 级别选中,给出提示 | +| 跨域 iframe | 高 | 检测并提示"无法编辑跨域内容" | +| Agent 定位失败 | 中 | 多候选 selector、LLM rerank、手动确认 | +| 注入脚本包体积 | 中 | 按需加载、代码分割 | + +--- + +## 七、验收标准 + +### Phase 1 验收 + +- [ ] 新架构可正常注入和卸载 +- [ ] Hover 高亮流畅 (60FPS) +- [ ] 点击选中功能正常 +- [ ] Undo/Redo 可用 +- [ ] Apply to Code 可触发 Agent + +### Phase 2 验收 + +- [ ] Shadow DOM 内元素可选中 +- [ ] 拖拽重排功能完整 +- [ ] 文本可直接编辑 +- [ ] 交互响应 < 16ms + +### Phase 3 验收 + +- [ ] 属性面板全部控件可用 +- [ ] 样式修改即时生效 +- [ ] Components 树与选中联动 + +### 最终验收 + +- [ ] 对标 Cursor Visual Editor 截图功能 +- [ ] 复杂页面 (10000+ 节点) 可用 +- [ ] 主流框架 (React/Vue/Next/Nuxt) 兼容 +- [ ] 无明显样式污染 + +--- + +## 八、实现进度记录 + +### Phase 0: 工程准备 ✅ 完成 + +**完成时间**: 2024-12 + +**决策记录**: + +- 采用 WXT 的 `defineUnlistedScript` 进行 TypeScript 构建 +- 输出为独立的 `web-editor-v2.js` 文件(当前 47.75KB) +- 使用 V2 版本化 action 名称(后缀 `_v2`)实现 V1/V2 共存 + +**创建的文件**: + +- `common/web-editor-types.ts` - 共享类型定义,包含 `WEB_EDITOR_V2_ACTIONS`、`WebEditorV2Api` 等 + +--- + +### Phase 1.1-1.2: 模块化结构与 Shadow DOM 隔离 ✅ 完成 + +**目录结构**: + +``` +entrypoints/ +├── web-editor-v2.ts # 入口点 (defineUnlistedScript) +└── web-editor-v2/ + ├── constants.ts # 常量配置 + ├── utils/ + │ └── disposables.ts # 资源清理工具 (Disposer 类) + ├── ui/ + │ └── shadow-host.ts # Shadow DOM 隔离宿主 + ├── core/ + │ ├── editor.ts # 主协调器 (生命周期管理) + │ ├── message-listener.ts # Background 通信 + │ ├── event-controller.ts # 事件拦截与模式控制 + │ └── position-tracker.ts # 滚动/resize 位置同步 + ├── overlay/ + │ └── canvas-overlay.ts # Canvas 渲染层 + └── selection/ + └── selection-engine.ts # 智能选中引擎 +``` + +**关键实现**: + +#### `constants.ts` + +- `WEB_EDITOR_V2_VERSION = 2` +- `WEB_EDITOR_V2_HOST_ID = '__mcp_web_editor_v2_host__'` +- `WEB_EDITOR_V2_Z_INDEX = 2147483647` (最大 z-index) +- 颜色定义: hover (#3b82f6), selected (#8b5cf6) + +#### `utils/disposables.ts` - Disposer 类 + +```typescript +class Disposer { + add(dispose: DisposeFn): void; // 注册清理函数 + listen(target, type, listener, options); // 自动移除的事件监听 + observeResize(target, callback); // 自动断开的 ResizeObserver + observeMutation(target, callback); // 自动断开的 MutationObserver + requestAnimationFrame(callback); // 自动取消的 rAF + dispose(): void; // LIFO 顺序清理 + get isDisposed(): boolean; +} +``` + +#### `ui/shadow-host.ts` - Shadow DOM 宿主 + +- 创建固定定位的 host 元素,挂载到 `document.documentElement` +- 使用 `attachShadow({ mode: 'open' })` 创建 Shadow Root +- 提供 `overlayRoot`(用于 Canvas)和 `uiRoot`(用于 UI 面板) +- 事件隔离:阻止 UI 事件冒泡到页面(pointer/mouse/keyboard/touch/focus 等) +- 提供 `isOverlayElement(node)` 判断节点是否属于编辑器 +- 内置简单的状态面板 UI(标题 + Exit 按钮 + 状态指示) + +--- + +### Phase 1.3: Canvas Overlay 基础渲染 ✅ 完成 + +**文件**: `overlay/canvas-overlay.ts` + +**功能**: + +- DPR 感知渲染(`devicePixelRatio` 适配高清屏) +- markDirty/render 模式实现 rAF 合并渲染 +- ResizeObserver 自动调整画布尺寸 +- 绘制 hover 矩形(蓝色虚线 + 8% 填充) +- 绘制 selection 矩形(紫色实线 + 12% 填充) +- 像素对齐实现清晰线条 + +**接口**: + +```typescript +interface CanvasOverlay { + canvas: HTMLCanvasElement; + markDirty(): void; // 标记需要重绘 + render(): void; // 立即渲染 + clear(): void; // 清除所有 + setHoverRect(rect: ViewportRect | null); // 设置 hover 框 + setSelectionRect(rect: ViewportRect | null); // 设置选中框 + dispose(): void; +} +``` + +--- + +### Phase 1.4: 事件拦截与模式控制 ✅ 完成 + +**文件**: `core/event-controller.ts` + +**功能**: + +- Capture 阶段拦截 document 级事件 +- 两种模式状态机: `hover` ↔ `selecting` +- 支持 PointerEvents(现代浏览器)和 MouseEvents(兼容) +- Touch 事件拦截(移动端) +- ESC 键取消选中 +- rAF 节流 hover 更新(避免高频 `elementFromPoint` 导致性能问题) +- 事件回调: `onHover(element)`, `onSelect(element, modifiers)`, `onDeselect()` +- 可插拔的智能选中: `findTargetForSelect` 选项 + +**事件拦截列表**: + +- pointer: move, down, up, cancel, over, out, enter, leave +- mouse: move, down, up, click, dblclick, contextmenu, auxclick, over, out, enter, leave +- keyboard: down, up, press +- touch: start, move, end, cancel + +**修饰键支持**: + +```typescript +interface EventModifiers { + alt: boolean; // Alt + Click 触发上钻 + shift: boolean; // 预留多选 + ctrl: boolean; + meta: boolean; +} +``` + +--- + +### Phase 1.5: rAF 驱动的交互引擎 ✅ 完成 + +**文件**: `core/position-tracker.ts` + +**功能**: + +- 监听 `window.scroll`、`window.resize` 和 `document.scroll`(capture) +- rAF 合并位置更新请求 +- 检测元素是否仍在 DOM 中(`isConnected`) +- 子像素容差过滤(`RECT_EPSILON = 0.5`)避免抖动 +- 只在位置实际变化时触发回调 + +**接口**: + +```typescript +interface PositionTracker { + setHoverElement(element: Element | null): void; + setSelectionElement(element: Element | null): void; + forceUpdate(): void; // 立即同步更新 + dispose(): void; +} +``` + +**性能优化**: + +- 在 `editor.ts` 中设置元素后调用 `forceUpdate()` 避免额外 rAF 延迟 +- 在位置更新回调中调用 `canvasOverlay.render()` 合并到同一帧 + +--- + +### Phase 1.6: 智能选中引擎 ✅ 完成 + +**文件**: `selection/selection-engine.ts` + +**评分系统** (正分优先,负分降级): + +| 类别 | 规则 | 分数 | +| ------------ | --------------------------------------- | ---- | +| **交互性** | `) -> 进入第 2 步。 + +如果没有匹配(例如文本是变量 {t('submit_order')}) -> 进入第 3 步。 + +2. 结构化模糊匹配 (LLM Rerank) + +当 Grep 找到多个候选文件时,让 LLM 来判断。 + +Prompt: + +"我正在寻找生成这段 DOM 的 React/Vue 组件。 +DOM 结构是:。 +我通过关键词搜索找到了以下 3 个候选文件:[FileA, FileB, FileC]。 +请分析这 3 个文件的源码,判断哪一个最符合上述 DOM 结构。" + +LLM 擅长理解代码逻辑,能识别出条件渲染、循环等结构,从而过滤出正确文件。 + +3. 纯语义搜索 (Vector Search / Embedding) - 兜底方案 + +如果文本是动态的(API返回的数据),Grep 搜不到。 + +策略:在 Server 启动时,或者按需对代码库建立简单的向量索引(可以用 OpenAI Embeddings 或本地模型)。 + +执行:将 DOM 结构描述转化为向量,在代码库中搜索相似度最高的代码块。 + +代价:这比较重,建议作为最后的兜底手段。 + +第三步:AI 修改与回写 (The Agent) + +一旦定位到文件(比如 src/components/LoginForm.tsx),流程就回到了具体的修改上。 + +在“通用模式”下,你不能完全依赖写死的 AST 逻辑(因为你不知道用户是用 CSS Modules, Tailwind, 还是 Styled Components)。这里必须重度依赖 AI。 + +Prompt 设计思路: + +Role: Senior Frontend Engineer +Task: User wants to change the visual style of a specific element. +Context: + +Target File: src/components/LoginForm.tsx (File Content Included) + +Target Element Fingerprint: inside a
. + +User Instruction: "Change background color to blue." + +Requirements: + +Analyze the code to find the exact JSX/Template element. + +Determine the styling strategy used in this file (Tailwind? Inline styles? CSS file import?). + +If Tailwind: Add bg-blue-500. + +If Inline: Add style={{ backgroundColor: 'blue' }}. + +If CSS Modules: You might need to edit the corresponding .module.css file (Advanced). + +Output: Return the full modified code (or a diff patch). + +体验超越 Cursor 的关键点 + +Cursor 目前在网页端的直接编辑功能其实并不完美(它主要还是在 IDE 里强),你可以通过以下两点在体验上超越它: + +1. “渐进式增强”架构 (Progressive Enhancement) + +这正是你提到的思路。 + +Level 1 (纯通用):用户只装浏览器插件 + 启动本地 Server。依靠 AI 搜索定位。优点:即插即用。缺点:对于完全动态的列表可能定位稍慢,偶尔会有 5% 的幻觉。 + +Level 2 (精准模式):提示用户“检测到您使用的是 Vite,是否安装我们的开发插件以获得 100% 精准度和毫秒级响应?” + +一旦安装 Vite 插件,自动降级为读取 data-source 属性,直接跳过复杂的 AI 搜索步骤,体验瞬间起飞。 + +这种“无缝升级”的体验会非常棒。 + +2. 交互反馈的即时性 (Optimistic UI) + +因为通用模式下 AI 搜索+修改需要几秒钟,用户等待会焦虑。 + +Visual Editor:在用户拖拽/改色时,直接在浏览器 DOM 上应用 CSS 变更,让用户立刻看到效果(就像 Chrome DevTools)。 + +后台处理:同时后台 Agent 默默地去改代码。 + +状态同步:当 Agent 改完代码,HMR 触发页面刷新,如果新页面和刚才用户改的一样,用户是无感知的;如果不一样,给予提示。 + +总结方案的可行性 +步骤 任务 纯通用模式 (AI Search) 增强模式 (Build Injector) +定位 找到源码位置 难点:靠 Grep + LLM 分析上下文。耗时 1-3s。 秒杀:直接读属性。耗时 0s。 +修改 生成新代码 依赖 LLM 识别代码风格并重写。 结合 AST + LLM,更精准。 +可靠性 准确率 80%-90% (动态内容容易丢) 99.9% + +结论: +完全可行。Perplexity 风格的搜索 + Copilot 风格的修改 = 你的通用模式。 +先做通用模式能让你覆盖所有 Web 项目(Next.js, Vue, Svelte, 甚至原生 HTML),这对于获取早期用户至关重要。等用户觉得好用但偶尔有点慢时,推给他们 Vite 插件,他们会欣然接受。 + +q: 这个可视化编辑器的本质就是给ai组装好它修改所需要的上下文,至于后续它怎么修改你不用考虑,现在就只关注这个可视化编辑器怎么做,比如我看它还能拖拽改变布局等,这个应该怎么做呢,浏览器插件能做到吗 +a: 这完全可以实现,而且这就是浏览器插件(Chrome Extension Content Script)最擅长的领域。 + +在这个场景下,你的浏览器插件其实就是一个寄生在当前网页上的“Webflow”。 + +不考虑后端的 AI 如何修改代码,单就前端可视化交互(选择、拖拽、即时反馈)而言,核心技术实现可以拆解为以下几个模块。这套方案在业界被称为 "Overlay Editor"(覆盖式编辑器) 模式。 + +1. 基础架构:Shadow DOM 隔离 (The Stage) + +浏览器插件最大的坑是样式污染(你的按钮样式影响了宿主网站,或者宿主网站的全局 CSS 搞乱了你的编辑器 UI)。 + +解决方案: +在页面 的最后插入一个宿主节点,并开启 Shadow DOM。你的所有 UI(高亮框、侧边栏、工具条)都渲染在这个 Shadow Root 里。 + +code +JavaScript +download +content_copy +expand_less +// content-script.js +const host = document.createElement('div'); +host.id = 'cursor-clone-root'; +document.body.appendChild(host); + +const shadow = host.attachShadow({ mode: 'open' }); +// 在这里注入你的 React/Vue 应用 +ReactDOM.createRoot(shadow).render(); 2. 核心交互:高亮与选中 (The Inspector) + +这部分负责让用户知道自己选中了哪个 DOM 元素。 + +技术实现: + +事件拦截:在 document 上监听 mouseover 和 click。开启一个“审查模式”,通过 e.stopPropagation() 和 e.preventDefault() 阻止网页原本的交互(比如点击链接跳转)。 + +坐标映射: + +当鼠标划过 targetDOM 时,调用 targetDOM.getBoundingClientRect() 获取它的位置(top, left, width, height)。 + +在你的 Shadow DOM 里,绘制一个透明背景、蓝色边框的 div,通过 position: fixed 覆盖在那个坐标上。 + +滚动同步: + +网页滚动时,坐标会变。你需要监听 scroll 事件或使用 requestAnimationFrame 持续更新高亮框的位置,保证它像吸铁石一样吸附在元素上。 + +3. 难点攻克:拖拽改变布局 (Drag & Drop Reordering) + +这是你提到的最酷的功能(把一个 Header 拖到 Div 下面)。因为你操作的是原生 DOM,而不是你自己的 React 组件,所以不能直接用 react-dnd 这种库,得手动实现。 + +实现逻辑: + +抓取 (Drag Start): + +用户按住高亮框。 + +前端设置目标 DOM 样式 opacity: 0.5(视觉反馈)。 + +关键点:在鼠标位置生成一个该元素的“截图”或“克隆体”(Ghost Element),跟随鼠标移动。 + +探测投放区 (Hit Testing): + +当鼠标移动时,隐藏“克隆体”(pointer-events: none),利用 document.elementFromPoint(x, y) 实时获取鼠标底下的元素(即:潜在的父容器或兄弟节点)。 + +计算插入点 (Insertion Logic): + +这是最复杂的算法部分。 + +假设鼠标在元素 B 上。 + +计算鼠标在 B 的上半部分还是下半部分(如果是垂直布局)。 + +视觉反馈:在 Shadow DOM 里画一条蓝色的横线(Indicator),提示用户“松手后会插在这里”。 + +即时预览 (Optimistic UI): + +为了体验像 Cursor 视频里那样丝滑,不要等 AI。 + +直接调用原生 DOM API:parentNode.insertBefore(draggingNode, referenceNode)。 + +用户会看到元素真的被挪动了。这时候 DOM 结构已经变了。 + +生成上下文给 AI: + +记录动作:{ action: "move", targetId: "...", newParentId: "...", prevSiblingId: "..." }。 + +把这个“意图包”发给 Agent。 + +4. 样式编辑与即时反馈 (Style Editor) + +右边栏的样式修改(改颜色、改字体、Flex 布局)实现相对简单。 + +流程: + +读取:选中元素时,使用 window.getComputedStyle(el) 读取当前生效的所有样式,回填到右侧面板的表单里。 + +写入: + +当用户拖拽颜色滑块时。 + +直接操作 DOM:element.style.backgroundColor = newValue。 + +这就是为什么视频里能实时预览。你只是在改内联样式(Inline Style)。 + +发送: + +用户松手后,打包数据:{ originalColor: "red", newColor: "blue", computedStyle: "..." } 发给 AI。 + +5. 文本编辑 (Text Editing) + +视频里应该也有直接改文字的功能。 + +实现: + +双击高亮框 -> 给目标 DOM 元素设置 contentEditable="true"。 + +用户像在 Word 里一样打字。 + +blur 事件触发时 -> 取消 contentEditable -> 提取 innerText -> 告诉 AI 文案变了。 + +总结:数据结构设计 (The Context Payload) + +既然你的核心是“给 AI 组装上下文”,那么你的插件最终产出的产品就是一个 JSON 包。 + +当用户完成一次拖拽操作后,你的插件应该生成这样的数据发给后端: + +code +JSON +download +content_copy +expand_less +{ +"task": "layout_modification", +"target_element": { +"tag": "div", +"classes": ["card", "p-4"], +"inner_text": "Feature Title", +"context_html": "
...
" // 拖拽前的快照 +}, +"operation": { +"type": "move_node", +"destination": { +"parent_fingerprint": { "tag": "section", "id": "features-grid" }, +"previous_sibling_fingerprint": { "tag": "div", "classes": ["card", "first"] }, +"position": "after" +} +}, +"visual_preview_result": { +// 告诉AI,现在的DOM变成了什么样,辅助它理解 +"new_parent_html": "
...
" +} +} +推荐使用的 Web API + +要实现这个编辑器,你需要熟练掌握以下原生 API: + +element.getBoundingClientRect():获取位置,绘制高亮框的核心。 + +window.getComputedStyle(element):获取真实的样式值(即便是通过 class 设置的)。 + +MutationObserver:监听 DOM 变化。如果网页里有动画导致元素位置变了,你的高亮框得跟着变,否则会错位。 + +element.contains(otherElement):判断拖拽时是否把父元素拖到了子元素里(非法操作)。 + +结论 + +浏览器插件完全能做到。 +这就是一个运行在 Content Script 里的 React 应用,通过 Shadow DOM 隔离样式,通过 DOM API 操作宿主页面的节点,并最终输出一份“操作日志”给 AI。体验流畅度的关键在于在发给 AI 之前,先在浏览器里用 JS 把效果模拟出来(Optimistic UI)。 + +q: 其实这里我觉还可以深挖一下,做这么一个可视化编辑器,一个是怎么精准识别出各个区块和元素,一个是对于复杂的元素很多的网页,性能要过得去,还有一个是对于一些像web component、shadowdom之类的网页是否能支持 + +还有,业界有成熟的方案吗 +a: 这是一个非常专业且切中痛点的问题。做 demo 容易,但要在一个像淘宝、Youtube 或企业级 SaaS 这种 DOM 节点数以万计、且技术栈复杂的页面上跑得丝滑,确实需要深挖。 + +以下是针对精准识别、性能优化、现代 Web 特性支持的深度技术方案,以及业界成熟方案的调研。 + +一、 难点深挖 1:如何“精准”识别区块(智能选择算法) + +痛点:网页里充斥着大量的“包装容器”(Wrapper Divs)。用户想改一个卡片,鼠标放上去往往选中了卡片外面那个用来做 Padding 的 div,或者是里面那个用来做 Flex 布局的 div,而不是用户认知中的“卡片”。 + +解决方案:启发式去噪与智能层级穿越 + +尺寸去噪 (Size Heuristics): + +忽略透明且全尺寸的容器:如果父元素和子元素的大小完全一致(rect 相同),且父元素没有背景色、边框、阴影,那么在默认 Hover 时,直接透传选中子元素。 + +忽略布局空壳:忽略 display: contents 或长宽为 0 的元素。 + +交互式层级穿越 (Interactive Drilling): + +模仿 Figma/Sketch 的逻辑: + +默认 (Hover):选中最深层的“叶子节点”或者有视觉特征的容器(有背景、边框)。 + +按住 Cmd/Ctrl:强制穿透,选中鼠标下绝对最深层的节点(哪怕它是透明的)。 + +按住 Shift + Click:选中当前元素的父级。 + +双击:进入组件内部(如果识别为组件)。 + +视觉特征加权 (Visual Weighting): + +在计算“应该高亮谁”时,读取 getComputedStyle。 + +如果一个元素有 backgroundColor !== 'rgba(0,0,0,0)' 或 borderWidth > 0 或 boxShadow,它的选中权重增加。优先高亮这些“肉眼可见”的元素,而不是看不见的布局框。 + +二、 难点深挖 2:复杂页面的性能优化(FPS 维持在 60) + +痛点:在有 10,000+ 节点的页面上,监听 mousemove 并实时计算 getBoundingClientRect (重排重绘开销大) 会导致鼠标移动卡顿,高亮框跟不上。 + +解决方案:层级分离与计算节流 + +事件委托与节流 (Event Delegation & Throttling): + +不要给每个 DOM 绑事件。只在 document 上绑一个 mousemove。 + +使用 requestAnimationFrame (rAF) 而不是 throttle。在每一帧的开始计算一次高亮位置。如果鼠标移动非常快,中间过程的计算直接丢弃,只渲染每一帧最后的位置。 + +避免 React 重绘 (Bypass React Reconciliation): + +高亮框(Overlay)的位置更新极其频繁。 + +不要用 React State (setState({ x, y })) 来更新高亮框位置,这会触发 React 的 Diff 算法,太慢。 + +直接操作 DOM:使用 useRef 获取 Overlay 的 DOM 节点,在 mousemove 回调里直接设置 overlayRef.current.style.transform = translate(${x}px, ${y}px)。这种“脏操作”在高性能交互场景是必须的。 + +合成层提升 (Layer Promotion): + +给你的高亮框 Overlay 加上 will-change: transform, width, height。 + +这会让浏览器把这个高亮框放在一个独立的 GPU 图层上。当它移动大小时,不会触发宿主页面的重绘(Repaint),只会触发合成(Composite),性能提升巨大。 + +指针事件穿透 (Pointer Events): + +你的 Overlay 必须设置 pointer-events: none;。 + +否则,当高亮框盖住元素后,你的鼠标就变成悬停在高亮框上了,底下的 elementFromPoint 就失效了,导致高亮框闪烁(Z-fighting)。 + +三、 难点深挖 3:Shadow DOM 与 Web Components 支持 + +痛点:document.querySelector 和常规的 elementFromPoint 具有“封装边界”,它们看不见 Shadow Root 内部的元素。如果宿主页面用了 Web Components(比如 Lit, Shoelace 库),你的编辑器会“瞎”掉,只能选中最外层的壳。 + +解决方案:递归穿透与 Composed Path + +递归版 elementFromPoint: +标准 API 遇到 Shadow DOM 会停在 Host 节点。你需要自己写一个递归查找函数: + +code +JavaScript +download +content_copy +expand_less +function getDeepElementFromPoint(x, y) { +let el = document.elementFromPoint(x, y); + +// 循环递归:如果当前命中的元素有 shadowRoot,就钻进去找 +while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) { +const shadowEl = el.shadowRoot.elementFromPoint(x, y); +if (!shadowEl || shadowEl === el) break; +el = shadowEl; +} +return el; +} + +这个算法是支持所有现代 Shadow DOM 页面的核心。 + +事件冒泡的 composedPath: +在点击事件中,使用 event.composedPath() 获取完整的冒泡路径。这个数组包含了从 Shadow DOM 内部一直到 Document 的所有节点。利用这个路径,你可以正确地构建“面包屑导航”,让用户知道自己是在 my-card (Shadow) > div.header > span 里面。 + +样式注入难题: + +如果你要在 Shadow DOM 内部显示高亮框,通常很难(因为你不能把你的 DOM 插到别人的 Shadow Root 里)。 + +策略:依然把高亮框放在最外层(你的编辑器层)。使用 getBoundingClientRect 计算 Shadow DOM 内部元素的全局坐标。这通常能工作,因为坐标系是全局的。 + +四、 业界成熟方案调研 + +既然要做“通用可视化编辑器”,不需要闭门造车,可以参考以下成熟的开源项目或商业产品: + +1. 开源框架 (可以直接参考代码) + +GrapesJS (最强参考): + +地位:Web 领域最成熟的开源可视化构建框架。 + +参考点:它的 Select, Drag, Drop, Style Manager 实现非常完整。它是基于 Canvas(iframe)隔离的,但逻辑和 Overlay Editor 是一样的。 + +技术栈:Backbone (老),但架构设计(Component Model, CSS Composer)非常值得学习。 + +Builder.io / Mitosis: + +地位:目前 AI + Visual Coding 的领头羊。 + +Visual Copilot:他们实现了将 Figma 直接转代码,且支持反向编辑。 + +开源部分:Qwik 框架和 Partytown 也是他们出的,他们在 DOM 序列化和性能优化上有极深的研究。 + +Puck (Puck Editor): + +地位:一个基于 React 的现代可视化编辑器组件。 + +特点:非常轻量,专门用于 React 组件的拖拽和配置。它的 DropZone 实现逻辑非常有参考价值。 + +2. 商业标杆 (体验对标) + +Webflow: + +可视化的天花板。它的“DOM 树导航”、“Style 面板”的交互细节(如拖拽调整 Margin 数值)是教科书级别的。 + +Framer: + +React 友好,体验极佳。可以参考它的“智能布局”推断(从 Absolute 推断为 Stack/Flex)。 + +VisBug (Chrome Extension): + +必看! Google Chrome 团队推出的开源插件。 + +功能:它就是一个纯前端的可视化编辑器插件,可以 hover, measure, move, edit text。 + +价值:完全开源。它的代码直接解决了你问的所有问题(如何高亮、如何拖拽、如何处理文字编辑)。这是你最直接的技术起步模板。 + +五、 总结建议 + +如果你现在要落地,我建议的技术路线图: + +第一周:克隆 VisBug 的核心逻辑。 + +去 GitHub 搜 VisBug,看它怎么用 document.elementFromPoint 和 getBoundingClientRect 做的高亮和选中。 + +这解决了 80% 的前端交互问题。 + +第二周:加入 Shadow DOM 递归查找。 + +把上面的递归函数加上,解决兼容性问题。 + +第三周:性能调优。 + +上 requestAnimationFrame 和 will-change,确保在复杂页面不卡。 + +第四周:对接你的 AI 逻辑。 + +把你第一周做出的 payload 喂给后端。 + +VisBug 是最接近你“可视化编辑器”形态的现成参考,强烈建议先去体验并阅读它的源码。 + +q: 结合VisBug有办法做到比这些商业标杆和我发给你的视频里的体验更好吗,我想做到跟商业级的应用对标的体验,把这个可视化编辑器结合我本身提供的ai能力,就相当于做了一个浏览器端的前端工作台了 +a: 这绝对可以实现。VisBug 只是一个“基础原型”,它证明了技术可行性,但在交互细节、视觉美感和智能化程度上,距离 Webflow、Framer 或 Cursor 还有很大差距。 + +要想把浏览器插件做成**“商业级前端工作台”,并超越现有方案,你需要从单纯的“DOM 修改器”进化为“逆向设计系统引擎”**。 + +以下是具体的差异化打法和技术升级方案,旨在打造超越 Cursor 视频体验的下一代产品: + +一、 体验升级:从“操作 DOM”到“操作组件” + +痛点:VisBug 或 Chrome DevTools 是“只有上帝视角的”,它们看到的是冰冷的
。用户想要的是“选中这个商品卡片”,结果只选中了卡片里的文字或外面的容器,体验很碎。 + +超越方案:智能语义选择 (Semantic Selection) + +“磁吸”层级算法 (Magnetic Selection): + +原理:不要只是 elementFromPoint。当鼠标划过元素时,计算它的“视觉权重”和“逻辑完整性”。 + +实现: + +如果一个 div 只是用来做 padding 的(没有背景、边框、文字),高亮框自动吸附到它内部有内容的子元素上。 + +如果鼠标放在一个 img 上,但这个 img 是 Card 的一部分,高亮框应提供一个明显的“父级胶囊”(类似 Figma 点击后显示父级名称),允许一键升级选中父级。 + +体验:用户会感觉你在猜他的心思,而不是笨拙地选 DOM。 + +组件边界识别 (Component Bounds): + +技术:利用 AI 或启发式算法识别重复结构。 + +场景:当鼠标放在一个列表项上时,自动识别出这是一个 List,并高亮所有兄弟节点(Sibling Instances)。 + +超越点:用户修改其中一个的样式,插件询问:“应用到所有类似组件?”(Apply to all instances)。这是 Cursor 视频里没有展示的高级功能。 + +二、 交互升级:Figma 级的视觉反馈 + +痛点:普通网页拖拽时,元素乱跳,甚至会破坏布局。VisBug 的拖拽非常原始。 + +超越方案:设计工具级的平滑交互 + +智能对齐线 (Smart Guides): + +实现:参考 Figma/Sketch。当你拖动元素或调整 Margin 时,实时计算并显示到周围元素的距离(像素值)。 + +技术:在 Shadow DOM 的 Canvas 层(或 SVG 层)绘制。不要用 DOM 元素画线,性能太差。用 Canvas 覆盖在最上层绘制红线和数字,性能极佳。 + +平滑过渡动画 (Motion Layout): + +实现:引入 framer-motion 或 FLIP (First, Last, Invert, Play) 动画技术。 + +场景:当你把一个元素从左拖到右,其他受影响的兄弟元素不应该“瞬间跳变”,而应该平滑滑动到新位置。 + +体验:这种丝滑感是区分“工具”和“产品”的关键。 + +自动布局推断 (Auto-Layout Inference): + +场景:用户想把两个分散的按钮变成一组。 + +操作:用户多选这两个按钮 -> 右键 -> “Group / Stack”。 + +逻辑:编辑器自动插入一个 div,设置为 display: flex; gap: 10px,把两个按钮包进去。 + +超越点:你不仅仅是改属性,你是在重构 DOM 结构。 + +三、 性能升级:60FPS 的极致流畅 + +痛点:在淘宝、小红书这种复杂页面,DOM 树极其庞大,常规插件会卡顿。 + +超越方案:GPU 渲染与虚拟化 + +Canvas 覆盖层 (The Canvas Overlay): + +彻底抛弃 DOM 高亮框。 + +VisBug 还是在用 DOM 做高亮。你应该在 Shadow DOM 里放一个全屏的 。 + +所有的选中框、对齐线、距离标注、拖拽残影,全部用 WebGL 或 2D Canvas 绘制。 + +优势:Canvas 绘制 1000 个矩形也就是一瞬间的事,完全不触发布局重排(Reflow),性能是 DOM 的几十倍。 + +非阻塞计算 (Web Worker): + +对于“组件识别”、“相似元素查找”这种耗时逻辑,放到 Web Worker 里跑,不要阻塞主线程的 UI 渲染。 + +四、 AI 能力融合:意图优先 (Intent-First) + +痛点:Cursor 还要用户去打字说“居中”。 + +超越方案:上下文预判 (Contextual Actions) + +视觉重构 (Visual Refactoring): + +功能:选中一个丑陋的表格。 + +Magic Button:点击“AI 美化”。 + +流程:插件截取该区域的 HTML + 截图 -> 发给多模态 AI -> AI 返回新的 Tailwind 类名组合 -> 实时应用。 + +体验:用户不需要懂 CSS,甚至不需要说话。 + +从图片生成代码 (Image to Code): + +功能:用户觉得现在的 Header 不好看,从 Dribbble 截图了一个好看的 Header。 + +操作:直接把截图粘贴到浏览器页面上。 + +逻辑:你的编辑器捕获粘贴事件 -> AI 解析截图 -> 生成对应的 HTML/CSS -> 插入到当前页面。 + +超越点:直接把别人的设计“贴”进自己的代码库。 + +智能文案替换: + +选中一段 Lorem Ipsum 占位符 -> 点击“Fill Content” -> AI 根据页面上下文(比如是旅游网站)自动填入真实的旅游文案。 + +五、 技术落地:构建“前端工作台”的核心模块 + +要实现上述超越级体验,你的技术架构需要包含以下三个高级模块: + +1. The Rendering Engine (渲染引擎) + +技术栈:Pixi.js 或 Konva.js (用于 Canvas 绘制 UI)。 + +职责:负责绘制所有的高亮、标尺、对齐线。不操作 DOM,只“画”在上面。 + +2. The Semantic Engine (语义引擎) + +职责:理解 DOM。 + +算法: + +计算元素的“容器率”(Container Ratio):如果一个元素包含了 90% 面积的子元素,它大概率只是个 Wrapper。 + +计算“结构指纹”:
,全页面搜索类似指纹。 + +3. The Mutation Transaction System (变更事务系统) + +职责:确保你的修改是可逆的、原子性的。 + +逻辑: + +用户拖拽 -> 生成 Transaction A (包含 Undo/Redo 数据)。 + +应用到 DOM (Optimistic)。 + +发送给 Server。 + +如果 Server 报错 -> 自动回滚 Transaction A。 + +这能保证无论怎么改,页面不会“挂”掉。 + +总结:你的“护城河”在哪里? + +VisBug 是工具箱,你需要做的是 Figma for Live Code。 + +Cursor 是代码编辑器,你需要做的是 No-Code Interface for Low-Code Output。 + +核心差异化体验公式: + +Canvas 渲染的极致流畅 UI + Figma 级的智能对齐/吸附 + 多模态 AI 的一键重构 + 无缝的本地代码同步 + +如果你能把 "Shadow DOM + Canvas Overlay" 这套架构跑通,你的体验绝对能秒杀目前市面上 99% 的浏览器插件,甚至给用户一种“我在用原生 App”的错觉。这完全是可行的。 + +q: 按照你的说法,使用The Rendering Engine (渲染引擎)的话,那还能实现视频里的拖拽改变布局吗,或者在左边栏能实时修改网页的样式吗 +a: 这是一个非常好的直觉问题。答案是:绝对可以,而且体验会比直接操作 DOM 更好、更丝滑。 + +你可能会担心:如果用 Canvas 画 UI,是不是意味着我跟底下的网页断开连接了? +其实不是。这里采用的是一种**“AR(增强现实)架构”**。 + +简单来说:Canvas 只是你的“眼镜”(负责显示高亮、辅助线、拖拽残影),而你的“手”依然伸到了屏幕里去操作真实的 DOM。 + +我们来看看具体怎么实现这两种场景: + +场景一:拖拽改变布局 (Drag & Drop) + +在“商业级”方案中,拖拽的流程是 Canvas (视觉) 与 DOM (逻辑) 的完美配合: + +鼠标按下 (MouseDown): + +用户在 Canvas 层点击了某个位置。 + +逻辑层:程序通过 document.elementFromPoint(x,y) 瞬间知道用户点到了底下的哪个真实的 DOM 元素(比如一个 div)。 + +视觉层:Canvas 立即在鼠标位置画一个该元素的“截图”(Texture)或者半透明矩形,开始跟随鼠标移动。 + +鼠标拖动 (Dragging) - 性能的关键点: + +视觉层(Canvas):在这一步,完全不操作真实的 DOM。计算插入点、绘制那条“蓝色的插入线”、移动“幽灵元素”,全部在 Canvas 上以 60FPS 绘制。因为不动 DOM,所以绝对不卡,哪怕页面有 1万个节点。 + +逻辑层:后台静默计算:“如果现在松手,它应该插在哪个 DOM 节点的前面”。 + +鼠标松手 (Drop) - 同步时刻: + +逻辑层:JS 执行 parentNode.insertBefore(draggingNode, refNode)。这时候,真实的 DOM 才真正发生移动。 + +视觉层:Canvas 监听到 DOM 变了,瞬间重绘高亮框到新的位置。 + +结论:用户感觉自己在拖拽网页元素,其实他在拖拽 Canvas 上的像素,直到最后一刻才同步给网页。这就是 Figma web 版流畅的秘密。 + +场景二:左边栏实时修改样式 (Style Editing) + +这部分更加简单直接,不需要 Canvas 介入,而是 React 面板与 DOM 的直接通信。 + +左边栏 (React UI): + +你的属性面板(颜色选择器、滑块)是标准的 HTML/React 组件,渲染在 Shadow DOM 里(不在 Canvas 里,方便交互)。 + +修改过程: + +用户拖动 React 面板里的“字号滑块”。 + +逻辑层:JS 监听到变化,直接执行: + +code +JavaScript +download +content_copy +expand_less +targetElement.style.fontSize = newValue + 'px'; + +浏览器行为:浏览器渲染引擎立即重绘该 DOM 节点。用户看到字变大了。 + +Canvas 的响应 (The Sync): + +问题:字变大了,那个 div 的尺寸也撑大了,Canvas 上的高亮蓝框岂不是对不齐了? + +解决:使用 ResizeObserver 监听目标 DOM。一旦 DOM 尺寸变了,通知 Canvas:“喂,那个元素变大了,重画一下蓝框”。 + +结果:高亮框像是有弹性一样,平滑地跟随 DOM 变大。 + +为什么说这比纯 DOM 方案更强? + +如果你不用 Canvas,而是用 div 做高亮框(像 VisBug 那样): + +拖拽时:你需要不断更新那个 div 的 top/left。这会触发浏览器的 Layout Thrashing (布局抖动),在复杂页面上鼠标会跟不上手,感觉“飘”或“卡”。 + +辅助线:如果你想在拖拽时显示“对齐线”或“距离数值”,你需要插入几十个临时的 DOM 节点。这会把页面搞得很脏,甚至破坏原有的 CSS 选择器(比如 :nth-child)。 + +使用 Canvas 引擎方案: + +你可以画任何东西:可以在不触碰 DOM 的情况下,画出 Figma 那样的红色距离标注、智能吸附线、拖拽时的半透明残影。 + +性能隔离:你的 UI 渲染开销完全在 Canvas 层,不影响宿主页面的渲染性能。 + +技术架构总结 +组件 技术选型 职责 +底层 (The Host) 原生 DOM 用户的真实网页,被操作的对象。 +中间层 (Logic) JavaScript 负责事件计算、DOM API 调用、数据打包。 +顶层 (Visual) Canvas (Pixi/Konva) 只负责画框! 画选中框、画标尺、画拖拽残影。它不负责输入框或按钮。 +UI 面板 (Sidebar) React/Vue 侧边栏、工具条。这是标准的 HTML,方便用户输入。 + +所以,你的担心是不存在的。这种架构反而是把“视觉流畅度”和“数据真实性”解耦,是目前前端工程化中最顶级的实现方案。 + +q: 还有个问题,智能语义选择那里,组件边界识别那里,假设我直接先把整个dom发送给大模型,成本会不会有点高,假设是用户选中了才发,感觉有可能会很频繁,实时性可能也不太好,成本其实也高,如果是用一些本地的小模型之类的,那实现成本就变高了,这里有好的方案吗 +a: 你说得非常对。用 LLM 实时分析 DOM 来做“选中”是完全不可行的。 + +原因很简单: + +成本爆炸:DOM 树随便一个页面就是几千个 token,鼠标划过一下算一次请求,钱包扛不住。 + +延迟不可接受:LLM 哪怕再快也要几百毫秒,而“高亮选中”必须是 16ms(1帧)以内的响应,否则手感会极差。 + +杀鸡焉用牛刀:识别“这是一个组件”通常不需要理解语义(比如“这是商品卡片”),只需要识别结构模式(比如“这堆 DOM 结构重复出现了 10 次”)。 + +要在浏览器端实现零成本、实时、精准的组件识别,业界的标准做法是使用**“结构指纹算法” + “启发式规则”**。这是一套纯算法方案,运行在本地 JS 中,耗时在毫秒级。 + +以下是具体的低成本、高性能技术方案: + +方案一:基于“结构指纹”的重复检测 (Structural Fingerprinting) + +原理:组件的核心特征是**“重复”**。一个商品列表里有 20 个卡片,它们的 HTML 结构(标签嵌套顺序、类名)往往是高度相似甚至完全一致的。 + +实现逻辑: + +生成指纹: +当页面加载完,你的插件在后台(Web Worker)遍历一次 DOM 树,给每个节点生成一个简单的 Hash 字符串(指纹)。 + +指纹公式:TagName + DirectChildTags + ClassNameHash + +例如一个卡片的指纹可能是:DIV|IMG,DIV,BUTTON|card-container + +聚类分析: +把所有指纹放到一个 Map 里计数。 + +如果发现指纹 Hash_A 出现了 10 次。 + +推论:这 10 个元素肯定是同一个组件的实例(Instance)。 + +交互应用: + +当用户鼠标划过其中一个卡片时。 + +你的编辑器不仅高亮当前这一个,还可以(用虚线)同时框出其他 9 个。 + +UI 提示:显示“检测到 10 个类似组件”。 + +成本:纯数学计算,0 API 调用,0 延迟。 + +方案二:基于“视觉启发式”的去噪算法 (Visual Heuristics) + +原理:用户眼里的“组件”,通常是一个**“有视觉边界的容器”**。我们可以写一套规则(Heuristics)来模拟人的判断,过滤掉无用的 div。 + +实现逻辑(在 mousemove 时实时计算,开销极低): + +忽略“空气容器”: +获取 ComputedStyle。如果一个元素满足以下所有条件,它大概率只是个布局壳子,应该透传(即不选中它,直接选中它的子元素): + +没有背景色 (backgroundColor 是透明)。 + +没有边框 (borderWidth 为 0)。 + +没有阴影 (boxShadow none)。 + +关键点:它的尺寸(Rect)和它唯一的子元素尺寸几乎一样。 + +捕捉“实体容器”: +反之,如果一个元素满足以下任一条件,它的选中权重大幅增加(鼠标放上去优先吸附它): + +有明显的 border 或 boxShadow。 + +有与父级不同的 backgroundColor。 + +它是 grid 或 flex 的直接子项(Grid Item / Flex Item 通常是组件本体)。 + +它有 cursor: pointer(说明是可交互的)。 + +方案三:基于类名/属性的“正则嗅探” (Naming Sniffing) + +原理:现代前端开发通常有命名规范(BEM, Tailwind, CSS Modules)。 + +实现逻辑: + +关键词加权: +检查 className 或 id 或 data-testid。 +如果包含 card, item, container, wrapper, btn, nav, header 等关键词,选中优先级 +10。 + +框架特征识别: + +React:有时 React DevTools 会留下 \_\_reactFiber... 属性,虽然是内部的,但插件可以读取它来判断组件边界。 + +Vue:寻找 **vue** 属性。 + +Web Components:只要标签名里带横杠(如 ),那 100% 是个组件,直接锁死选中。 + +方案四:按需调用 AI (Lazy AI) + +策略:把 AI 当作**“最后手段”**,而不是“常规手段”。 + +只有在以下情况才发送 DOM 给小模型或大模型: + +用户主动求助:用户选中了一堆乱七八糟的 DOM,点击了“智能分析”按钮。 + +代码生成阶段:用户已经决定要改这个元素了,点击“Apply”时。 + +优化成本的小技巧: + +发送“缩略版” DOM:不要发 innerHTML。只发“骨架”: + +code +Html +download +content_copy +expand_less + + +
+ +
+

{Text}

+

{Text}

+
+
+ +这样 Token 消耗能降低 90%。 + +总结:高性价比技术栈 + +你需要的是 "规则引擎 (Rule Engine)" 而不是 "AI 模型"。 + +模块 技术实现 成本 实时性 +基础选中 elementFromPoint + 视觉去噪规则 (JS) 0 极致 (60fps) +组件识别 DOM 树遍历 + 指纹哈希聚类 (JS) 0 高 (页面加载时算一次) +语义推断 检查类名/属性关键词 (Regex) 0 极致 +复杂重构 发送精简版 DOM 给 LLM (API) 低 中 (需等待) + +结论: +你可以完全通过本地算法实现视频里那种“智能选中”的效果。 +比如,当鼠标悬停在一个 div 上时,算法判断它没有背景且只有 1 个子元素,自动帮你选中那个子元素;或者算法发现这个 div 的结构在页面上出现了 20 次,自动标注它为“List Item”。 + +这不仅省钱,体验也比等待 AI 响应要好得多。商业级工具(如 Builder.io, Webflow)都是这么做的。 diff --git a/editor.png b/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..919615c32b121b50b7d33abab9f8c1e2d1395769 GIT binary patch literal 487839 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 z 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 + + + + + Chrome Quick Launcher - UI Design + + + + + +

+

Chrome Quick Launcher - UI 设计稿

+

6个设计版本 · 横向滚动查看 · 每版本含多种状态

+
+ +
+ +
+
+ Version 1 +

极简白色版

+

Clean & Minimal

+
+ + +
+ 默认状态 +
+
+
+ + + ESC +
+
+
+
快捷操作
+
+
+
+ +
+
+
搜索标签页
+
在已打开的标签页中搜索
+
+ ⌘T +
+
+
+ +
+
+
搜索书签
+
快速查找书签
+
+ ⌘B +
+
+
+ +
+
+
浏览历史
+
搜索历史记录
+
+ ⌘H +
+
+
+ +
+
+
运行命令
+
执行快捷命令
+
+ ⌘K +
+
+
+
+
+ ↑↓ 导航 + ↵ 选择 +
+
+
+ 就绪 +
+
+
+
+ + +
+ 搜索结果 +
+
+
+ + + 8 结果 +
+
+
+
标签页
+
+
+ +
+
GitHub - Where the world builds software
+
github.com
+
+ 切换 +
+
+ +
+
vuejs/vue: A progressive framework
+
github.com/vuejs/vue
+
+
+
+
书签
+
+
+
+ +
+
+
GitHub Awesome Lists
+
+
+
+
搜索引擎
+
+
+
+ +
+
+
在 Google 搜索 "github"
+
+ +
+
+
+
+
+ ↵ 打开 + ⌘↵ 新标签页 +
+
+
+
+ + +
+ 命令面板 +
+
+
+ 命令 + + +
+
+
+
页面操作
+
+
+
+ +
+ 截取屏幕 + +
+
+
+ +
+ 复制页面链接 + +
+
+
+ +
+ 生成二维码 +
+
+
+ +
+ 翻译页面 +
+
+
+
+
⌫ 返回
+
+
+
+
+ + +
+
+ Version 2 +

深色版

+

Dark Theme

+
+ + +
+ 默认状态 +
+
+
+ + + ESC +
+
+
+
快捷操作
+
+
+
+ +
+
+
搜索标签页
+
在已打开的标签页中搜索
+
+ ⌘T +
+
+
+ +
+
+
搜索书签
+
快速查找书签
+
+ ⌘B +
+
+
+ +
+
+
浏览历史
+
搜索历史记录
+
+ ⌘H +
+
+
+ +
+
+
运行命令
+
执行快捷命令
+
+ ⌘K +
+
+
+
+
+ ↑↓ 导航 + ↵ 选择 +
+
+
+ 就绪 +
+
+
+
+ + +
+ 标签页搜索 +
+
+
+ + + 5 个标签页 +
+
+
+
+
+ +
+
React – A JavaScript library
+
reactjs.org
+
+
+ 切换 + +
+
+
+ +
+
facebook/react: A declarative UI library
+
github.com/facebook/react
+
+ +
+
+
R
+
+
React Documentation
+
react.dev
+
+ +
+
+
+
+
+ ↵ 切换 · ⌘X 关闭 +
+
+
+
+ + +
+ 计算器 +
+
+
+ + +
+
+
+
+
计算结果
+
2.0736
+
≈ 2.07 百万像素
+
+
+ + +
+
+
+
支持 +、-、*、/、()、^、sqrt()、sin()、cos()
+
+
+
+
+ + +
+
+ Version 3 +

毛玻璃版

+

Glassmorphism

+
+ + +
+ 默认状态 +
+
+
+
+
+
+ +
+ + ⌘K +
+
+
+
+
+
+ +
+ 标签页 +
+
+
+ +
+ 书签 +
+
+
+ +
+ 历史 +
+
+
+ +
+ 命令 +
+
+
+
最近使用
+
+
+
+ +
+ 截取屏幕 +
+
+
+ +
+ 复制页面链接 +
+
+
+
+
+ 输入关键词开始搜索 + +
+
+
+
+ + +
+ 搜索建议 +
+
+
+
+
+
+ +
+ + 6 个结果 +
+
+
+
+ 标签页 +
+
+
+ +
+
Vue.js - Progressive Framework
+
vuejs.org
+
+ 切换 +
+
+ +
+
vuejs/vue - GitHub
+
github.com
+
+
+
+
+ 搜索引擎 +
+
+
+
+ +
+ 在 Google 搜索 "vue" + +
+
+
+
+
+ ↑↓ 导航 · + ↵ 打开 +
+
+
+
+
+ + +
+ 扩展管理 +
+
+
+
+
+
+ +
+ + 6 个扩展 +
+
+
+
已启用
+
+
+
+ +
+
+
uBlock Origin
+
广告拦截器
+
+
+
+
+
+
+
+ +
+
+
React Developer Tools
+
React 调试工具
+
+
+
+
+
+
+
已禁用
+
+
+
+ +
+
+
Google 翻译
+
网页翻译
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+ Version 4 +

卡片式版

+

Card Based

+
+ + +
+ 默认状态 +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+ 快捷入口 + 今日 12 次 +
+
+
+
+ +
+
+
标签页
+
12 个
+
+
+
+
+ +
+
+
书签
+
156 个
+
+
+
+
+ +
+
+
历史
+
最近 7 天
+
+
+
+
+ +
+
+
下载
+
3 进行中
+
+
+
+
+
+
+ 常用命令 + +
+
+ + 截图 + + + 复制链接 + + + 二维码 + + + 翻译 + +
+
+
+
+ ⌘K 打开 + +
+
+
+ + +
+ 标签页管理 +
+
+
+ +
+ + + 3 匹配 +
+
+
+
+
+
+
+
+ 设计资源 +
+ 3 个标签 +
+
+
+ + Figma – 设计文件 + 活跃 +
+
+
D
+ Dribbble - 灵感 +
+
+
+
+
+
U
+
+
UI 设计趋势 2024
+
medium.com
+
+
+
+
+
+
+ + +
+ 已选 0 个 +
+
+
+ + +
+ 番茄钟 +
+
+
+
+ +
+
+
番茄钟
+
专注工作,提高效率
+
+
+
+
+
+
23:45
+
专注时间剩余
+
+
+ + + +
+
+
+
+ 今日记录 + 共 4 个番茄 +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ Version 5 +

紧凑版

+

Compact Mode

+
+ + +
+ 默认状态 +
+
+ + + 全部 +
+
+
快捷操作
+
+ + 搜索标签页 + ⌘T +
+
+ + 搜索书签 + ⌘B +
+
+ + 浏览历史 + ⌘H +
+
+ + 运行命令 + ⌘K +
+
+ + 截取屏幕 + ⌘S +
+
+ + 复制链接 + ⌘L +
+
+
+ ↑↓ 导航 · ↵ 选择 · esc 关闭 +
+
+
+ + +
+ 搜索结果 +
+
+ + + 5 结果 +
+
+
+ 标签页 +
+
+ + Tailwind CSS - Modern websites + 切换 +
+
+ + tailwindlabs/tailwindcss - GitHub +
+
+ 书签 +
+
+ + Tailwind UI - Components +
+
+ 搜索引擎 +
+
+ + 在 Google 搜索 + +
+
+
+ ↵ 打开 · ⌘↵ 新标签页 +
+
+
+ + +
+ 快速复制 +
+
+ > + 复制链接 + 选择格式 +
+
+
+ +
+ 纯 URL +
https://github.com/microsoft/vscode
+
+ ↵ +
+
+ +
+ Markdown +
[VS Code](https://github.com/...)
+
+
+
+ +
+ HTML +
<a href="...">VS Code</a>
+
+
+
+ +
+ 标题 + URL +
VS Code - https://github.com/...
+
+
+
+
+ ⌫ 返回 + 复制后自动关闭 +
+
+
+
+ + +
+
+ Version 6 +

液态玻璃版

+

Liquid Glass (iOS 26 Style)

+
+ + +
+ 默认状态 +
+
+
+
+
+
+ +
+ +
⌘K
+
+
+
+
+
+
+ +
+ 标签页 +
+
+
+ +
+ 书签 +
+
+
+ +
+ 历史 +
+
+
+ +
+ 命令 +
+
+
+
最近使用
+
+
+
+ +
+ 截取屏幕 + +
+
+
+ +
+ 复制链接 + +
+
+
+
+
+
+ ↑↓ 导航 + ↵ 选择 + esc 关闭 +
+
+
+
+
+ + +
+ 搜索模式 +
+
+
+
+
+
+ +
+ + 4 结果 +
+
+
+
+
+ 标签页 +
+
+
+ +
+
Notion – Your workspace
+
notion.so
+
+
切换
+
+
+ +
+
notion-enhancer - GitHub
+
github.com
+
+
+
+
+
+ 网页搜索 +
+
+
+
+ +
+ 在 Google 搜索 "notion" + +
+
+
+
+
+ ↵ 打开 + ⌘↵ 新标签 +
+
+
+
+
+ + +
+ 深色模式 +
+
+
+
+
+
+ +
+ +
⌘K
+
+
+
+
+
+
+ +
+ 标签页 +
+
+
+ +
+ 书签 +
+
+
+ +
+ 历史 +
+
+
+ +
+ 命令 +
+
+
+
最近使用
+
+
+
+ +
+ 截取屏幕 + +
+
+
+ +
+ 复制链接 + +
+
+
+
+
+
+ ↑↓ 导航 + ↵ 选择 + esc 关闭 +
+
+
+
+
+
+
+ +