@pancake-apps/web 0.0.0-snapshot-20260125200133

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/unified/view.ts","../src/unified/react/use-view.ts","../src/unified/style-utils.ts","../src/unified/react/use-host-styles.ts","../src/unified/react/use-document-theme.ts"],"names":["error","useRef","useEffect","useState"],"mappings":"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","file":"chunk-TLBYYZHP.js","sourcesContent":["/**\n * View Class\n *\n * A unified, platform-agnostic API for building Pancake apps.\n * Works seamlessly with both MCP Apps and ChatGPT Apps.\n *\n * @example\n * ```typescript\n * import { View } from '@pancake-apps/web';\n *\n * const view = new View({\n * appInfo: { name: \"MyApp\", version: \"1.0.0\" },\n * });\n *\n * view.ontoolinput = (params) => {\n * console.log(\"Tool input:\", params.arguments);\n * };\n *\n * await view.connect();\n *\n * // Actions\n * await view.callTool(\"my-tool\", { arg: \"value\" });\n * view.sendMessage(\"Hello!\");\n * ```\n */\n\nimport { getAdaptor, resetAdaptor } from './adaptor';\nimport { getPlatform, type HostPlatform } from './detection';\nimport type { UnifiedAdaptor } from './adaptor-interface';\nimport type {\n Theme,\n DisplayMode,\n Platform,\n DeviceType,\n SafeAreaInsets,\n ContainerSize,\n InputCapabilities,\n ContentBlock,\n CallToolResult,\n LogLevel,\n ResourceReadResult,\n UpdateModelContextParams,\n TeardownHandler,\n} from './types';\n\n// Import MCP-specific types for event handlers\nimport type {\n HostContext,\n HostCapabilities,\n HostInfo,\n ToolInputParams,\n ToolInputPartialParams,\n ToolCancelledParams,\n} from '../mcp-apps/types';\n\n// Import MCP store and bridge for event subscriptions\nimport { getStore as getMcpStore } from '../mcp-apps/store';\nimport { getBridge as getMcpBridge } from '../mcp-apps/bridge';\nimport { MCP_METHODS } from '../mcp-apps/types';\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * App information for initialization\n */\nexport interface ViewAppInfo {\n name: string;\n version: string;\n}\n\n/**\n * Options for creating a View\n */\nexport interface ViewOptions {\n /**\n * Application information (used for MCP initialization)\n */\n appInfo?: ViewAppInfo;\n\n /**\n * Force a specific platform instead of auto-detecting\n */\n platform?: HostPlatform;\n\n /**\n * Custom capabilities to send during MCP initialization\n */\n capabilities?: Record<string, unknown>;\n}\n\n/**\n * Tool result notification params\n */\nexport interface ToolResultParams {\n content: ContentBlock[];\n structuredContent?: unknown;\n isError?: boolean;\n _meta?: Record<string, unknown>;\n}\n\n// ============================================\n// View Class\n// ============================================\n\nexport class View {\n private adaptor: UnifiedAdaptor;\n private options: ViewOptions;\n private _isConnected = false;\n private cleanupFns: (() => void)[] = [];\n private _hostContext: HostContext | undefined;\n private _hostCapabilities: HostCapabilities | undefined;\n private _hostInfo: HostInfo | undefined;\n\n // ============================================\n // Event Handlers\n // ============================================\n\n /**\n * Called when tool input is received (complete input)\n */\n ontoolinput?: (params: ToolInputParams) => void;\n\n /**\n * Called during streaming when partial tool input is received (MCP only)\n */\n ontoolinputpartial?: (params: ToolInputPartialParams) => void;\n\n /**\n * Called when tool result is received\n */\n ontoolresult?: (params: ToolResultParams) => void;\n\n /**\n * Called when tool execution is cancelled\n */\n ontoolcancelled?: (params: ToolCancelledParams) => void;\n\n /**\n * Called when host context changes (theme, display mode, etc.)\n */\n onhostcontextchanged?: (context: HostContext) => void;\n\n /**\n * Called when the host requests teardown\n */\n onteardown?: TeardownHandler;\n\n /**\n * Called when an error occurs\n */\n onerror?: (error: Error) => void;\n\n /**\n * Called when the connection is closed\n */\n onclose?: () => void;\n\n // ============================================\n // Constructor\n // ============================================\n\n constructor(options: ViewOptions = {}) {\n this.options = options;\n\n // Force platform if specified, otherwise auto-detect\n if (options.platform) {\n // Reset and force the platform\n resetAdaptor();\n }\n\n this.adaptor = getAdaptor();\n }\n\n // ============================================\n // Getters\n // ============================================\n\n /**\n * Get the current host context (MCP-specific)\n */\n getHostContext(): HostContext | undefined {\n return this._hostContext;\n }\n\n /**\n * Get host capabilities (MCP-specific)\n */\n getHostCapabilities(): HostCapabilities | undefined {\n return this._hostCapabilities;\n }\n\n /**\n * Get host info (MCP-specific)\n */\n getHostInfo(): HostInfo | undefined {\n return this._hostInfo;\n }\n\n /**\n * Check if the view is connected\n */\n isConnected(): boolean {\n return this._isConnected;\n }\n\n /**\n * Get the current platform\n */\n getPlatform(): HostPlatform {\n return getPlatform();\n }\n\n /**\n * Get the underlying adaptor for advanced use cases\n */\n getAdaptor(): UnifiedAdaptor {\n return this.adaptor;\n }\n\n // ============================================\n // Context Getters\n // ============================================\n\n /**\n * Get the current theme\n */\n getTheme(): Theme {\n return this.adaptor.getTheme();\n }\n\n /**\n * Get the current locale\n */\n getLocale(): string {\n return this.adaptor.getLocale();\n }\n\n /**\n * Get the current display mode\n */\n getDisplayMode(): DisplayMode {\n return this.adaptor.getDisplayMode();\n }\n\n /**\n * Get the max height constraint\n */\n getMaxHeight(): number {\n return this.adaptor.getMaxHeight();\n }\n\n /**\n * Get safe area insets\n */\n getSafeArea(): SafeAreaInsets {\n return this.adaptor.getSafeArea();\n }\n\n /**\n * Get the normalized platform\n */\n getNormalizedPlatform(): Platform {\n return this.adaptor.getPlatform();\n }\n\n /**\n * Get the device type\n */\n getDeviceType(): DeviceType {\n return this.adaptor.getDeviceType();\n }\n\n /**\n * Get container size\n */\n getContainerSize(): ContainerSize {\n return this.adaptor.getContainerSize();\n }\n\n /**\n * Get input capabilities\n */\n getInputCapabilities(): InputCapabilities {\n return this.adaptor.getInputCapabilities();\n }\n\n /**\n * Get the current tool input\n */\n getToolInput<T>(): T | undefined {\n return this.adaptor.getToolInput<T>();\n }\n\n /**\n * Get partial tool input during streaming (MCP only)\n */\n getToolInputPartial<T>(): Partial<T> | undefined {\n return this.adaptor.getToolInputPartial<T>();\n }\n\n /**\n * Get the current tool output\n */\n getToolOutput<T>(): T | undefined {\n return this.adaptor.getToolOutput<T>();\n }\n\n // ============================================\n // Connection\n // ============================================\n\n /**\n * Connect to the host platform.\n * For MCP, this performs the initialization handshake.\n * For Apps SDK, this is a no-op (already connected).\n */\n async connect(): Promise<void> {\n if (this._isConnected) {\n return;\n }\n\n try {\n // Platform-specific initialization\n if (this.adaptor.platform === 'mcp-apps') {\n await this.connectMcp();\n } else {\n await this.connectAppsSdk();\n }\n\n this._isConnected = true;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.onerror?.(err);\n throw err;\n }\n }\n\n private async connectMcp(): Promise<void> {\n const bridge = getMcpBridge();\n const store = getMcpStore();\n\n // Initialize with app info\n const initResult = await bridge.initialize({\n clientInfo: this.options.appInfo ?? { name: 'pancake-app', version: '1.0.0' },\n capabilities: this.options.capabilities ?? {},\n });\n\n // Store initial context\n this._hostContext = initResult.hostContext;\n this._hostCapabilities = initResult.hostCapabilities;\n this._hostInfo = initResult.hostInfo;\n\n // Update store with initial state\n store.setInitialized(initResult.hostContext, initResult.hostCapabilities, initResult.hostInfo);\n\n // Subscribe to tool input notifications\n this.cleanupFns.push(\n bridge.onNotification(MCP_METHODS.TOOL_INPUT, (params) => {\n this.ontoolinput?.(params as ToolInputParams);\n })\n );\n\n // Subscribe to partial tool input notifications\n this.cleanupFns.push(\n bridge.onNotification(MCP_METHODS.TOOL_INPUT_PARTIAL, (params) => {\n this.ontoolinputpartial?.(params as ToolInputPartialParams);\n })\n );\n\n // Subscribe to tool result notifications\n this.cleanupFns.push(\n bridge.onNotification(MCP_METHODS.TOOL_RESULT, (params) => {\n this.ontoolresult?.(params as ToolResultParams);\n })\n );\n\n // Subscribe to tool cancelled notifications\n this.cleanupFns.push(\n bridge.onNotification(MCP_METHODS.TOOL_CANCELLED, (params) => {\n this.ontoolcancelled?.(params as ToolCancelledParams);\n })\n );\n\n // Subscribe to host context changes\n this.cleanupFns.push(\n bridge.onNotification(MCP_METHODS.HOST_CONTEXT_CHANGED, (params) => {\n const changes = params as Partial<HostContext>;\n this._hostContext = { ...this._hostContext, ...changes };\n this.onhostcontextchanged?.(this._hostContext);\n })\n );\n\n // Register teardown handler\n if (this.onteardown) {\n this.cleanupFns.push(bridge.onTeardown(this.onteardown));\n }\n }\n\n private async connectAppsSdk(): Promise<void> {\n // Apps SDK is already connected via window.openai\n await this.adaptor.ensureReady();\n\n // For Apps SDK, we can still set up some context\n this._hostContext = {\n theme: this.adaptor.getTheme(),\n displayMode: this.adaptor.getDisplayMode(),\n locale: this.adaptor.getLocale(),\n };\n }\n\n /**\n * Close the view and cleanup resources\n */\n close(): void {\n // Run all cleanup functions\n this.cleanupFns.forEach((fn) => fn());\n this.cleanupFns = [];\n\n this._isConnected = false;\n this.onclose?.();\n }\n\n // ============================================\n // Actions\n // ============================================\n\n /**\n * Call a server tool\n */\n async callTool<TInput = Record<string, unknown>, TOutput = unknown>(\n name: string,\n args?: TInput\n ): Promise<CallToolResult<TOutput>> {\n this.ensureConnected();\n return this.adaptor.callTool<TInput, TOutput>(name, args);\n }\n\n /**\n * Send a message to the chat\n */\n async sendMessage(content: string | ContentBlock[]): Promise<void> {\n this.ensureConnected();\n\n if (typeof content === 'string') {\n this.adaptor.sendFollowUpMessage(content);\n } else {\n // For content blocks, join text content\n const text = content\n .filter((block): block is ContentBlock & { text: string } => block.type === 'text' && !!block.text)\n .map((block) => block.text)\n .join('\\n');\n this.adaptor.sendFollowUpMessage(text);\n }\n }\n\n /**\n * Open a link in the browser\n */\n async openLink(url: string): Promise<void> {\n this.ensureConnected();\n this.adaptor.openExternal(url);\n }\n\n /**\n * Request a display mode change\n */\n async requestDisplayMode(mode: DisplayMode): Promise<DisplayMode> {\n this.ensureConnected();\n\n if (this.adaptor.platform === 'mcp-apps') {\n const bridge = getMcpBridge();\n return bridge.requestDisplayMode(mode);\n } else {\n this.adaptor.requestDisplayMode(mode);\n return mode;\n }\n }\n\n /**\n * Update the model context (MCP only)\n */\n async updateModelContext(\n content?: ContentBlock[],\n structured?: Record<string, unknown>\n ): Promise<void> {\n this.ensureConnected();\n\n const params: UpdateModelContextParams = {};\n if (content) params.content = content;\n if (structured) params.structuredContent = structured;\n\n await this.adaptor.updateModelContext(params);\n }\n\n /**\n * Read a resource (MCP only)\n */\n async readResource(uri: string): Promise<ResourceReadResult> {\n this.ensureConnected();\n return this.adaptor.readResource(uri);\n }\n\n /**\n * Notify the host of size changes\n */\n notifySizeChanged(width: number, height: number): void {\n this.adaptor.notifySizeChanged(width, height);\n }\n\n /**\n * Setup automatic size reporting\n */\n setupAutoSizeReporting(element?: HTMLElement): () => void {\n const el = element ?? (typeof document !== 'undefined' ? document.documentElement : undefined);\n if (!el) return () => {};\n\n return this.adaptor.setupAutoSizeReporting(el);\n }\n\n /**\n * Log a message to the host\n */\n log(level: LogLevel, data: unknown, logger?: string): void {\n this.adaptor.log(level, data, logger);\n }\n\n /**\n * Ping the host (MCP only)\n */\n async ping(): Promise<void> {\n await this.adaptor.ping();\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private ensureConnected(): void {\n if (!this._isConnected) {\n throw new Error('View is not connected. Call connect() first.');\n }\n }\n}\n\n// ============================================\n// Factory Function\n// ============================================\n\n/**\n * Create and optionally connect a View\n *\n * @example\n * ```typescript\n * const view = await createView({\n * appInfo: { name: \"MyApp\", version: \"1.0.0\" },\n * autoConnect: true,\n * });\n * ```\n */\nexport async function createView(\n options: ViewOptions & { autoConnect?: boolean } = {}\n): Promise<View> {\n const { autoConnect = false, ...viewOptions } = options;\n const view = new View(viewOptions);\n\n if (autoConnect) {\n await view.connect();\n }\n\n return view;\n}\n","/**\n * useView Hook\n *\n * React hook for creating and managing a View instance.\n *\n * @example\n * ```tsx\n * const { view, isConnected, error } = useView({\n * appInfo: { name: \"MyApp\", version: \"1.0.0\" },\n * onViewCreated: (view) => {\n * view.ontoolinput = handleToolInput;\n * },\n * });\n * ```\n */\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport { View, type ViewOptions } from '../view';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface UseViewOptions extends ViewOptions {\n /**\n * Whether to auto-connect on mount (default: true)\n */\n autoConnect?: boolean;\n\n /**\n * Callback when the view is created (before connecting)\n * Use this to set up event handlers\n */\n onViewCreated?: (view: View) => void;\n\n /**\n * Callback when successfully connected\n */\n onConnected?: (view: View) => void;\n\n /**\n * Callback when connection fails\n */\n onError?: (error: Error) => void;\n\n /**\n * Callback when the view is closed\n */\n onClose?: () => void;\n}\n\nexport interface UseViewResult {\n /**\n * The View instance\n */\n view: View | null;\n\n /**\n * Whether the view is connected\n */\n isConnected: boolean;\n\n /**\n * Whether the view is currently connecting\n */\n isConnecting: boolean;\n\n /**\n * Any error that occurred during connection\n */\n error: Error | null;\n\n /**\n * Manually connect the view\n */\n connect: () => Promise<void>;\n\n /**\n * Manually disconnect/close the view\n */\n disconnect: () => void;\n}\n\n// ============================================\n// Hook\n// ============================================\n\n/**\n * Create and manage a View instance\n */\nexport function useView(options: UseViewOptions = {}): UseViewResult {\n const {\n autoConnect = true,\n onViewCreated,\n onConnected,\n onError,\n onClose,\n ...viewOptions\n } = options;\n\n const [view, setView] = useState<View | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Store callbacks in refs to avoid reconnecting on callback changes\n const onViewCreatedRef = useRef(onViewCreated);\n const onConnectedRef = useRef(onConnected);\n const onErrorRef = useRef(onError);\n const onCloseRef = useRef(onClose);\n\n // Update refs on each render\n onViewCreatedRef.current = onViewCreated;\n onConnectedRef.current = onConnected;\n onErrorRef.current = onError;\n onCloseRef.current = onClose;\n\n // Create view on mount\n useEffect(() => {\n const newView = new View(viewOptions);\n\n // Set up close handler\n newView.onclose = () => {\n setIsConnected(false);\n onCloseRef.current?.();\n };\n\n // Set up error handler\n newView.onerror = (err) => {\n setError(err);\n onErrorRef.current?.(err);\n };\n\n // Call user's onViewCreated callback\n onViewCreatedRef.current?.(newView);\n\n setView(newView);\n\n // Cleanup on unmount\n return () => {\n newView.close();\n };\n // Only create view once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Connect function\n const connect = useCallback(async () => {\n if (!view || isConnecting || isConnected) return;\n\n setIsConnecting(true);\n setError(null);\n\n try {\n await view.connect();\n setIsConnected(true);\n onConnectedRef.current?.(view);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onErrorRef.current?.(error);\n } finally {\n setIsConnecting(false);\n }\n }, [view, isConnecting, isConnected]);\n\n // Disconnect function\n const disconnect = useCallback(() => {\n if (view && isConnected) {\n view.close();\n setIsConnected(false);\n }\n }, [view, isConnected]);\n\n // Auto-connect if enabled\n useEffect(() => {\n if (view && autoConnect && !isConnected && !isConnecting) {\n connect();\n }\n }, [view, autoConnect, isConnected, isConnecting, connect]);\n\n return {\n view,\n isConnected,\n isConnecting,\n error,\n connect,\n disconnect,\n };\n}\n","/**\n * Style Utilities\n *\n * Standalone utility functions for theming and styling.\n * These work anywhere without requiring React or adaptors.\n *\n * @example\n * ```typescript\n * import { getDocumentTheme, applyDocumentTheme, applyHostStyleVariables } from '@pancake-apps/web';\n *\n * // Detect current theme\n * const theme = getDocumentTheme();\n *\n * // Apply theme to document\n * applyDocumentTheme('dark');\n *\n * // Apply host-provided CSS variables\n * applyHostStyleVariables({\n * '--color-background-primary': '#ffffff',\n * '--color-text-primary': '#000000',\n * });\n * ```\n */\n\nimport type { Theme } from './types';\nimport type { StyleVariables, HostContext } from '../mcp-apps/types';\n\n// ============================================\n// Theme Detection\n// ============================================\n\n/**\n * Detect the current document theme based on:\n * 1. Document color scheme meta tag\n * 2. Media query preference\n * 3. Document class (dark/light)\n */\nexport function getDocumentTheme(): Theme {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return 'light';\n }\n\n // Check color-scheme meta tag\n const colorSchemeMeta = document.querySelector('meta[name=\"color-scheme\"]');\n if (colorSchemeMeta) {\n const content = colorSchemeMeta.getAttribute('content');\n if (content?.includes('dark')) return 'dark';\n if (content?.includes('light')) return 'light';\n }\n\n // Check document element classes\n const docElement = document.documentElement;\n if (docElement.classList.contains('dark')) return 'dark';\n if (docElement.classList.contains('light')) return 'light';\n\n // Check data-theme attribute\n const dataTheme = docElement.getAttribute('data-theme');\n if (dataTheme === 'dark') return 'dark';\n if (dataTheme === 'light') return 'light';\n\n // Check media query preference\n if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n}\n\n/**\n * Create a reactive theme detection observer\n * Returns current theme and calls callback on changes\n */\nexport function observeDocumentTheme(\n callback: (theme: Theme) => void\n): { getTheme: () => Theme; disconnect: () => void } {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return {\n getTheme: () => 'light',\n disconnect: () => {},\n };\n }\n\n let currentTheme = getDocumentTheme();\n\n // Watch for media query changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleMediaChange = () => {\n const newTheme = getDocumentTheme();\n if (newTheme !== currentTheme) {\n currentTheme = newTheme;\n callback(newTheme);\n }\n };\n\n // Watch for class changes on document element\n const observer = new MutationObserver(() => {\n const newTheme = getDocumentTheme();\n if (newTheme !== currentTheme) {\n currentTheme = newTheme;\n callback(newTheme);\n }\n });\n\n mediaQuery.addEventListener('change', handleMediaChange);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n\n return {\n getTheme: () => currentTheme,\n disconnect: () => {\n mediaQuery.removeEventListener('change', handleMediaChange);\n observer.disconnect();\n },\n };\n}\n\n// ============================================\n// Theme Application\n// ============================================\n\n/**\n * Apply a theme to the document\n * Sets both the class and data-theme attribute\n */\nexport function applyDocumentTheme(theme: Theme): void {\n if (typeof document === 'undefined') return;\n\n const docElement = document.documentElement;\n\n // Update class\n docElement.classList.remove('light', 'dark');\n docElement.classList.add(theme);\n\n // Update data-theme attribute\n docElement.setAttribute('data-theme', theme);\n\n // Update color-scheme for native UI elements\n docElement.style.colorScheme = theme;\n}\n\n// ============================================\n// CSS Variable Application\n// ============================================\n\nconst STYLE_ELEMENT_ID = 'pancake-host-styles';\nconst FONTS_STYLE_ELEMENT_ID = 'pancake-host-fonts';\n\n/**\n * Apply host-provided CSS variables to the document\n */\nexport function applyHostStyleVariables(variables: StyleVariables | Record<string, string>): void {\n if (typeof document === 'undefined') return;\n\n // Get or create style element\n let styleElement = document.getElementById(STYLE_ELEMENT_ID) as HTMLStyleElement | null;\n if (!styleElement) {\n styleElement = document.createElement('style');\n styleElement.id = STYLE_ELEMENT_ID;\n document.head.appendChild(styleElement);\n }\n\n // Build CSS from variables\n const cssVars = Object.entries(variables)\n .map(([key, value]) => ` ${key}: ${value};`)\n .join('\\n');\n\n styleElement.textContent = `:root {\\n${cssVars}\\n}`;\n}\n\n/**\n * Apply host-provided font CSS\n */\nexport function applyHostFonts(css: string): void {\n if (typeof document === 'undefined') return;\n\n // Get or create style element\n let styleElement = document.getElementById(FONTS_STYLE_ELEMENT_ID) as HTMLStyleElement | null;\n if (!styleElement) {\n styleElement = document.createElement('style');\n styleElement.id = FONTS_STYLE_ELEMENT_ID;\n document.head.appendChild(styleElement);\n }\n\n styleElement.textContent = css;\n}\n\n/**\n * Remove all host-applied styles\n */\nexport function clearHostStyles(): void {\n if (typeof document === 'undefined') return;\n\n document.getElementById(STYLE_ELEMENT_ID)?.remove();\n document.getElementById(FONTS_STYLE_ELEMENT_ID)?.remove();\n}\n\n// ============================================\n// Combined Host Style Application\n// ============================================\n\n/**\n * Apply all styles from a HostContext\n * Includes theme, CSS variables, and fonts\n */\nexport function applyHostContext(context: HostContext): void {\n if (!context) return;\n\n // Apply theme\n if (context.theme) {\n applyDocumentTheme(context.theme);\n }\n\n // Apply CSS variables\n if (context.styles?.variables) {\n applyHostStyleVariables(context.styles.variables);\n }\n\n // Apply fonts\n if (context.styles?.css?.fonts) {\n applyHostFonts(context.styles.css.fonts);\n }\n}\n\n// ============================================\n// Style Extraction\n// ============================================\n\n/**\n * Extract CSS variables currently applied to an element\n */\nexport function getComputedStyleVariables(\n element?: HTMLElement,\n variableNames?: string[]\n): Record<string, string> {\n if (typeof window === 'undefined') return {};\n\n const el = element ?? document.documentElement;\n const computedStyle = window.getComputedStyle(el);\n const result: Record<string, string> = {};\n\n if (variableNames) {\n // Get specific variables\n for (const name of variableNames) {\n const value = computedStyle.getPropertyValue(name).trim();\n if (value) {\n result[name] = value;\n }\n }\n } else {\n // Get all custom properties (expensive operation)\n const cssText = el.style.cssText;\n const matches = cssText.matchAll(/(--[\\w-]+):\\s*([^;]+)/g);\n for (const match of matches) {\n const key = match[1];\n const value = match[2];\n if (key && value) {\n result[key] = value.trim();\n }\n }\n }\n\n return result;\n}\n\n// ============================================\n// Safe Area Utilities\n// ============================================\n\n/**\n * Apply safe area insets as CSS variables\n */\nexport function applySafeAreaInsets(insets: { top: number; right: number; bottom: number; left: number }): void {\n if (typeof document === 'undefined') return;\n\n const docElement = document.documentElement;\n docElement.style.setProperty('--safe-area-inset-top', `${insets.top}px`);\n docElement.style.setProperty('--safe-area-inset-right', `${insets.right}px`);\n docElement.style.setProperty('--safe-area-inset-bottom', `${insets.bottom}px`);\n docElement.style.setProperty('--safe-area-inset-left', `${insets.left}px`);\n}\n\n/**\n * Get the current safe area insets from CSS environment variables\n */\nexport function getSafeAreaInsets(): { top: number; right: number; bottom: number; left: number } {\n if (typeof window === 'undefined') {\n return { top: 0, right: 0, bottom: 0, left: 0 };\n }\n\n const computedStyle = window.getComputedStyle(document.documentElement);\n\n const parseValue = (value: string): number => {\n const num = parseFloat(value);\n return isNaN(num) ? 0 : num;\n };\n\n return {\n top: parseValue(computedStyle.getPropertyValue('--safe-area-inset-top')),\n right: parseValue(computedStyle.getPropertyValue('--safe-area-inset-right')),\n bottom: parseValue(computedStyle.getPropertyValue('--safe-area-inset-bottom')),\n left: parseValue(computedStyle.getPropertyValue('--safe-area-inset-left')),\n };\n}\n","/**\n * useHostStyles Hook\n *\n * React hook for applying host-provided styles to the document.\n *\n * @example\n * ```tsx\n * const { view, isConnected } = useView({ ... });\n *\n * // Apply host styles when connected\n * useHostStyles(view?.getHostContext());\n * ```\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { HostContext } from '../../mcp-apps/types';\nimport {\n applyDocumentTheme,\n applyHostStyleVariables,\n applyHostFonts,\n clearHostStyles,\n applySafeAreaInsets,\n} from '../style-utils';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface UseHostStylesOptions {\n /**\n * Whether to apply theme (default: true)\n */\n applyTheme?: boolean;\n\n /**\n * Whether to apply CSS variables (default: true)\n */\n applyVariables?: boolean;\n\n /**\n * Whether to apply fonts (default: true)\n */\n applyFonts?: boolean;\n\n /**\n * Whether to apply safe area insets (default: true)\n */\n applySafeArea?: boolean;\n\n /**\n * Whether to clear styles on unmount (default: true)\n */\n clearOnUnmount?: boolean;\n}\n\n// ============================================\n// Hook\n// ============================================\n\n/**\n * Apply host-provided styles to the document\n */\nexport function useHostStyles(\n context: HostContext | undefined,\n options: UseHostStylesOptions = {}\n): void {\n const {\n applyTheme = true,\n applyVariables = true,\n applyFonts = true,\n applySafeArea = true,\n clearOnUnmount = true,\n } = options;\n\n // Track if styles were applied\n const appliedRef = useRef(false);\n\n useEffect(() => {\n if (!context) return;\n\n // Apply theme\n if (applyTheme && context.theme) {\n applyDocumentTheme(context.theme);\n }\n\n // Apply CSS variables\n if (applyVariables && context.styles?.variables) {\n applyHostStyleVariables(context.styles.variables);\n }\n\n // Apply fonts\n if (applyFonts && context.styles?.css?.fonts) {\n applyHostFonts(context.styles.css.fonts);\n }\n\n // Apply safe area insets\n if (applySafeArea && context.safeAreaInsets) {\n applySafeAreaInsets(context.safeAreaInsets);\n }\n\n appliedRef.current = true;\n }, [context, applyTheme, applyVariables, applyFonts, applySafeArea]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (clearOnUnmount && appliedRef.current) {\n clearHostStyles();\n }\n };\n }, [clearOnUnmount]);\n}\n\n/**\n * Apply only the theme from host context\n */\nexport function useHostTheme(context: HostContext | undefined): void {\n useEffect(() => {\n if (context?.theme) {\n applyDocumentTheme(context.theme);\n }\n }, [context?.theme]);\n}\n\n/**\n * Apply only CSS variables from host context\n */\nexport function useHostVariables(context: HostContext | undefined): void {\n useEffect(() => {\n if (context?.styles?.variables) {\n applyHostStyleVariables(context.styles.variables);\n }\n }, [context?.styles?.variables]);\n}\n\n/**\n * Apply only fonts from host context\n */\nexport function useHostFontsHook(context: HostContext | undefined): void {\n useEffect(() => {\n if (context?.styles?.css?.fonts) {\n applyHostFonts(context.styles.css.fonts);\n }\n }, [context?.styles?.css?.fonts]);\n}\n","/**\n * useDocumentTheme Hook\n *\n * React hook for reactive document theme detection.\n *\n * @example\n * ```tsx\n * const theme = useDocumentTheme();\n * console.log(theme); // 'light' or 'dark'\n * ```\n */\n\nimport { useState, useEffect, useSyncExternalStore } from 'react';\nimport type { Theme } from '../types';\nimport { getDocumentTheme, observeDocumentTheme } from '../style-utils';\n\n// ============================================\n// Hook Implementation\n// ============================================\n\n/**\n * Get the current document theme reactively\n * Updates when the theme changes (via class, data-theme, or system preference)\n */\nexport function useDocumentTheme(): Theme {\n // Use useSyncExternalStore for React 18+ concurrent mode support\n return useSyncExternalStore(\n subscribeToTheme,\n getDocumentTheme,\n getServerTheme\n );\n}\n\n// Subscribe function for useSyncExternalStore\nfunction subscribeToTheme(callback: () => void): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n // Watch for media query changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', callback);\n\n // Watch for class changes on document element\n const observer = new MutationObserver(callback);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n\n return () => {\n mediaQuery.removeEventListener('change', callback);\n observer.disconnect();\n };\n}\n\n// Server snapshot - return light theme by default\nfunction getServerTheme(): Theme {\n return 'light';\n}\n\n// ============================================\n// Alternative Implementation with State\n// ============================================\n\n/**\n * Alternative hook using useState/useEffect pattern\n * @deprecated Use useDocumentTheme() instead\n */\nexport function useDocumentThemeState(): Theme {\n const [theme, setTheme] = useState<Theme>(() => {\n if (typeof window === 'undefined') return 'light';\n return getDocumentTheme();\n });\n\n useEffect(() => {\n const { disconnect } = observeDocumentTheme((newTheme) => {\n setTheme(newTheme);\n });\n\n return disconnect;\n }, []);\n\n return theme;\n}\n\n// ============================================\n// Preference-only Hook\n// ============================================\n\n/**\n * Get the system color scheme preference (ignores document classes)\n */\nexport function useSystemColorScheme(): Theme {\n return useSyncExternalStore(\n subscribeToSystemColorScheme,\n getSystemColorScheme,\n getServerTheme\n );\n}\n\nfunction subscribeToSystemColorScheme(callback: () => void): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', callback);\n\n return () => {\n mediaQuery.removeEventListener('change', callback);\n };\n}\n\nfunction getSystemColorScheme(): Theme {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n}\n"]}