diff --git a/pkg/display/events.go b/pkg/display/events.go index 5eba607..bc5ba8e 100644 --- a/pkg/display/events.go +++ b/pkg/display/events.go @@ -13,6 +13,7 @@ import ( ) // EventType represents the type of event. +// Use: eventType := display.EventWindowFocus type EventType string const ( @@ -44,6 +45,7 @@ const ( ) // Event represents a display event sent to subscribers. +// Use: evt := display.Event{Type: display.EventWindowFocus, Window: "editor"} type Event struct { Type EventType `json:"type"` Timestamp int64 `json:"timestamp"` @@ -52,12 +54,14 @@ type Event struct { } // Subscription represents a client subscription to events. +// Use: sub := display.Subscription{ID: "sub-1", EventTypes: []display.EventType{display.EventWindowFocus}} type Subscription struct { ID string `json:"id"` EventTypes []EventType `json:"eventTypes"` } // EventServerInfo summarises the live WebSocket event server state. +// Use: info := display.EventServerInfo{ConnectedClients: 1, Subscriptions: 3} type EventServerInfo struct { ConnectedClients int `json:"connectedClients"` Subscriptions int `json:"subscriptions"` @@ -65,6 +69,7 @@ type EventServerInfo struct { } // WSEventManager manages WebSocket connections and event subscriptions. +// Use: events := display.NewWSEventManager() type WSEventManager struct { upgrader websocket.Upgrader clients map[*websocket.Conn]*clientState @@ -74,6 +79,7 @@ type WSEventManager struct { } // clientState tracks a client's subscriptions. +// Use: state := &clientState{subscriptions: map[string]*Subscription{}} type clientState struct { subscriptions map[string]*Subscription mu sync.RWMutex diff --git a/pkg/menu/menu.go b/pkg/menu/menu.go index 26c552e..e429fe1 100644 --- a/pkg/menu/menu.go +++ b/pkg/menu/menu.go @@ -2,6 +2,7 @@ package menu // MenuItem describes a menu item for construction (structure only — no handlers). +// Use: item := menu.MenuItem{Label: "Quit", OnClick: func() {}} type MenuItem struct { Label string Accelerator string @@ -15,16 +16,19 @@ type MenuItem struct { } // Manager builds application menus via a Platform backend. +// Use: mgr := menu.NewManager(platform) type Manager struct { platform Platform } // NewManager creates a menu Manager. +// Use: mgr := menu.NewManager(platform) func NewManager(platform Platform) *Manager { return &Manager{platform: platform} } // Build constructs a PlatformMenu from a tree of MenuItems. +// Use: built := mgr.Build([]menu.MenuItem{{Label: "File"}}) func (m *Manager) Build(items []MenuItem) PlatformMenu { menu := m.platform.NewMenu() m.buildItems(menu, items) @@ -60,12 +64,14 @@ func (m *Manager) buildItems(menu PlatformMenu, items []MenuItem) { } // SetApplicationMenu builds and sets the application menu. +// Use: mgr.SetApplicationMenu([]menu.MenuItem{{Label: "Quit"}}) func (m *Manager) SetApplicationMenu(items []MenuItem) { menu := m.Build(items) m.platform.SetApplicationMenu(menu) } // Platform returns the underlying platform. +// Use: backend := mgr.Platform() func (m *Manager) Platform() Platform { return m.platform } diff --git a/pkg/menu/platform.go b/pkg/menu/platform.go index 01d219b..1877c74 100644 --- a/pkg/menu/platform.go +++ b/pkg/menu/platform.go @@ -2,12 +2,14 @@ package menu // Platform abstracts the menu backend. +// Use: var platform menu.Platform = backend type Platform interface { NewMenu() PlatformMenu SetApplicationMenu(menu PlatformMenu) } // PlatformMenu is a live menu handle. +// Use: var root menu.PlatformMenu = platform.NewMenu() type PlatformMenu interface { Add(label string) PlatformMenuItem AddSeparator() @@ -17,6 +19,7 @@ type PlatformMenu interface { } // PlatformMenuItem is a single menu item. +// Use: var item menu.PlatformMenuItem = root.Add("Quit") type PlatformMenuItem interface { SetAccelerator(accel string) PlatformMenuItem SetTooltip(text string) PlatformMenuItem @@ -26,6 +29,7 @@ type PlatformMenuItem interface { } // MenuRole is a predefined platform menu role. +// Use: role := menu.RoleFileMenu type MenuRole int const ( diff --git a/pkg/webview/messages.go b/pkg/webview/messages.go index 55950bc..41dade6 100644 --- a/pkg/webview/messages.go +++ b/pkg/webview/messages.go @@ -6,16 +6,19 @@ import "time" // --- Queries (read-only) --- // QueryURL gets the current page URL. Result: string +// Use: result, _, err := c.QUERY(webview.QueryURL{Window: "editor"}) type QueryURL struct { Window string `json:"window"` } // QueryTitle gets the current page title. Result: string +// Use: result, _, err := c.QUERY(webview.QueryTitle{Window: "editor"}) type QueryTitle struct { Window string `json:"window"` } // QueryConsole gets captured console messages. Result: []ConsoleMessage +// Use: result, _, err := c.QUERY(webview.QueryConsole{Window: "editor", Level: "error", Limit: 20}) type QueryConsole struct { Window string `json:"window"` Level string `json:"level,omitempty"` // filter by type: "log", "warn", "error", "info", "debug" @@ -23,46 +26,54 @@ type QueryConsole struct { } // QuerySelector finds a single element. Result: *ElementInfo (nil if not found) +// Use: result, _, err := c.QUERY(webview.QuerySelector{Window: "editor", Selector: "#submit"}) type QuerySelector struct { Window string `json:"window"` Selector string `json:"selector"` } // QuerySelectorAll finds all matching elements. Result: []*ElementInfo +// Use: result, _, err := c.QUERY(webview.QuerySelectorAll{Window: "editor", Selector: "button"}) type QuerySelectorAll struct { Window string `json:"window"` Selector string `json:"selector"` } // QueryDOMTree gets HTML content. Result: string (outerHTML) +// Use: result, _, err := c.QUERY(webview.QueryDOMTree{Window: "editor", Selector: "main"}) type QueryDOMTree struct { Window string `json:"window"` Selector string `json:"selector,omitempty"` // empty = full document } // QueryComputedStyle returns the computed CSS properties for an element. +// Use: result, _, err := c.QUERY(webview.QueryComputedStyle{Window: "editor", Selector: "#panel"}) type QueryComputedStyle struct { Window string `json:"window"` Selector string `json:"selector"` } // QueryPerformance returns page performance metrics. +// Use: result, _, err := c.QUERY(webview.QueryPerformance{Window: "editor"}) type QueryPerformance struct { Window string `json:"window"` } // QueryResources returns the page's loaded resource entries. +// Use: result, _, err := c.QUERY(webview.QueryResources{Window: "editor"}) type QueryResources struct { Window string `json:"window"` } // QueryNetwork returns the captured network log. +// Use: result, _, err := c.QUERY(webview.QueryNetwork{Window: "editor", Limit: 50}) type QueryNetwork struct { Window string `json:"window"` Limit int `json:"limit,omitempty"` } // QueryExceptions returns captured JavaScript exceptions. +// Use: result, _, err := c.QUERY(webview.QueryExceptions{Window: "editor", Limit: 10}) type QueryExceptions struct { Window string `json:"window"` Limit int `json:"limit,omitempty"` @@ -71,18 +82,21 @@ type QueryExceptions struct { // --- Tasks (side-effects) --- // TaskEvaluate executes JavaScript. Result: any (JS return value) +// Use: _, _, err := c.PERFORM(webview.TaskEvaluate{Window: "editor", Script: "document.title"}) type TaskEvaluate struct { Window string `json:"window"` Script string `json:"script"` } // TaskClick clicks an element. Result: nil +// Use: _, _, err := c.PERFORM(webview.TaskClick{Window: "editor", Selector: "#submit"}) type TaskClick struct { Window string `json:"window"` Selector string `json:"selector"` } // TaskType types text into an element. Result: nil +// Use: _, _, err := c.PERFORM(webview.TaskType{Window: "editor", Selector: "#search", Text: "core"}) type TaskType struct { Window string `json:"window"` Selector string `json:"selector"` @@ -90,23 +104,27 @@ type TaskType struct { } // TaskNavigate navigates to a URL. Result: nil +// Use: _, _, err := c.PERFORM(webview.TaskNavigate{Window: "editor", URL: "https://example.com"}) type TaskNavigate struct { Window string `json:"window"` URL string `json:"url"` } // TaskScreenshot captures the page as PNG. Result: ScreenshotResult +// Use: result, _, err := c.PERFORM(webview.TaskScreenshot{Window: "editor"}) type TaskScreenshot struct { Window string `json:"window"` } // TaskScreenshotElement captures a specific element as PNG. Result: ScreenshotResult +// Use: result, _, err := c.PERFORM(webview.TaskScreenshotElement{Window: "editor", Selector: "#panel"}) type TaskScreenshotElement struct { Window string `json:"window"` Selector string `json:"selector"` } // TaskScroll scrolls to an absolute position (window.scrollTo). Result: nil +// Use: _, _, err := c.PERFORM(webview.TaskScroll{Window: "editor", X: 0, Y: 600}) type TaskScroll struct { Window string `json:"window"` X int `json:"x"` @@ -114,12 +132,14 @@ type TaskScroll struct { } // TaskHover hovers over an element. Result: nil +// Use: _, _, err := c.PERFORM(webview.TaskHover{Window: "editor", Selector: "#help"}) type TaskHover struct { Window string `json:"window"` Selector string `json:"selector"` } // TaskSelect selects an option in a