sunpeak 0.1.4 → 0.1.16

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Button/Button.tsx","../src/types/chatgpt.ts","../src/platforms/chatgpt.ts","../src/platforms/registry.ts","../src/context/PlatformContext.tsx","../src/hooks/usePlatformGlobal.ts","../src/hooks/useDisplayMode.ts","../src/hooks/useMaxHeight.ts","../src/hooks/useRequestDisplayMode.ts","../src/hooks/useColorScheme.ts","../src/hooks/useWidgetProps.ts","../src/hooks/useWidgetState.ts","../src/components/Card/Card.tsx","../src/components/Carousel/Carousel.tsx","../src/components/GenAI/GenAI.tsx","../src/components/ChatGPTSimulator/ChatGPTSimulator.tsx"],"names":["jsx","clsx","useState","useEffect","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import { type ButtonHTMLAttributes } from 'react';\nimport { clsx } from 'clsx';\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /**\n * Whether to use primary styling (accent color) or secondary (outlined)\n * @default false\n */\n isPrimary?: boolean;\n /**\n * Click handler (required)\n */\n onClick: () => void;\n /**\n * Button label\n */\n children: React.ReactNode;\n}\n\n/**\n * Button - A button component that follows platform design guidelines.\n * Requires an action handler. Use isPrimary to toggle between primary and secondary styles.\n *\n * Design specs:\n * - Primary (isPrimary=true): Accent color background, white text\n * - Secondary (isPrimary=false): Transparent background with border\n * - Both: 14px medium font, rounded corners, hover/active states\n */\nexport const Button = ({\n isPrimary = false,\n onClick,\n children,\n className,\n type = 'button',\n ...props\n}: ButtonProps) => {\n const buttonClasses = clsx(\n 'sp-button',\n {\n 'sp-button-primary': isPrimary,\n 'sp-button-secondary': !isPrimary,\n },\n className\n );\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onClick();\n };\n\n return (\n <button className={buttonClasses} onClick={handleClick} type={type} {...props}>\n {children}\n </button>\n );\n};\n","export type UnknownObject = Record<string, unknown>;\n\nexport type Theme = 'light' | 'dark';\n\nexport type SafeAreaInsets = {\n top: number;\n bottom: number;\n left: number;\n right: number;\n};\n\nexport type SafeArea = {\n insets: SafeAreaInsets;\n};\n\nexport type DeviceType = 'mobile' | 'tablet' | 'desktop' | 'unknown';\n\nexport type UserAgent = {\n device: { type: DeviceType };\n capabilities: {\n hover: boolean;\n touch: boolean;\n };\n};\n\n/** Display mode */\nexport type DisplayMode = 'pip' | 'inline' | 'fullscreen';\n\nexport type RequestDisplayMode = (args: { mode: DisplayMode }) => Promise<{\n /**\n * The granted display mode. The host may reject the request.\n * For mobile, PiP is always coerced to fullscreen.\n */\n mode: DisplayMode;\n}>;\n\nexport type CallToolResponse = {\n result: string;\n};\n\n/** Calling APIs */\nexport type CallTool = (\n name: string,\n args: Record<string, unknown>\n) => Promise<CallToolResponse>;\n\nexport type ChatGPTGlobals<\n ToolInput = UnknownObject,\n ToolOutput = UnknownObject,\n ToolResponseMetadata = UnknownObject,\n WidgetState = UnknownObject\n> = {\n // visuals\n colorScheme: Theme;\n userAgent: UserAgent;\n locale: string;\n\n // layout\n maxHeight: number;\n displayMode: DisplayMode;\n safeArea: SafeArea;\n\n // state\n toolInput: ToolInput;\n toolOutput: ToolOutput | null;\n toolResponseMetadata: ToolResponseMetadata | null;\n widgetState: WidgetState | null;\n setWidgetState: (state: WidgetState) => Promise<void>;\n};\n\ntype API = {\n callTool: CallTool;\n sendFollowUpMessage: (args: { prompt: string }) => Promise<void>;\n openExternal(payload: { href: string }): void;\n\n // Layout controls\n requestDisplayMode: RequestDisplayMode;\n};\n\n/** Extra events */\nexport const SET_GLOBALS_EVENT_TYPE = 'chatgpt:set_globals';\n\nexport class SetGlobalsEvent extends CustomEvent<{\n globals: Partial<ChatGPTGlobals>;\n}> {\n readonly type = SET_GLOBALS_EVENT_TYPE;\n}\n\n/**\n * Global openai object injected by the web sandbox for communicating with ChatGPT host page.\n */\ndeclare global {\n interface Window {\n openai?: API & ChatGPTGlobals;\n }\n\n interface WindowEventMap {\n [SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;\n }\n}\n","/**\n * OpenAI ChatGPT Apps SDK Platform Adapter\n *\n * Implements the PlatformAdapter interface for OpenAI's ChatGPT Apps SDK.\n * https://developers.openai.com/apps-sdk\n */\n\nimport type { PlatformAdapter, PlatformGlobals } from '../types/platform';\nimport { SET_GLOBALS_EVENT_TYPE, type SetGlobalsEvent } from '../types/chatgpt';\n\nexport class ChatGPTPlatformAdapter implements PlatformAdapter {\n readonly name = 'chatgpt';\n\n isAvailable(): boolean {\n return typeof window !== 'undefined' && 'openai' in window;\n }\n\n getGlobal<K extends keyof PlatformGlobals>(key: K): PlatformGlobals[K] | null {\n if (!this.isAvailable()) {\n return null;\n }\n return (window.openai?.[key] as PlatformGlobals[K]) ?? null;\n }\n\n getGlobals() {\n if (!this.isAvailable()) {\n return null;\n }\n return window.openai ?? null;\n }\n\n subscribe(callback: () => void): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const handleSetGlobal = (_event: SetGlobalsEvent) => {\n callback();\n };\n\n window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);\n };\n }\n}\n\n/**\n * Singleton instance of the ChatGPT platform adapter\n */\nexport const chatgptPlatform = new ChatGPTPlatformAdapter();\n","/**\n * Platform Registry\n *\n * Manages multiple platform adapters and auto-detects the active platform.\n */\n\nimport type { PlatformAdapter } from '../types/platform';\nimport { chatgptPlatform } from './chatgpt';\n\nexport interface PlatformRegistry {\n /**\n * Register a platform adapter\n */\n register(adapter: PlatformAdapter): void;\n\n /**\n * Get a specific platform adapter by name\n */\n get(name: string): PlatformAdapter | null;\n\n /**\n * Auto-detect and return the active platform\n * Returns the first available platform in the registry\n */\n detect(): PlatformAdapter | null;\n\n /**\n * Get all registered platforms\n */\n getAll(): PlatformAdapter[];\n}\n\nclass DefaultPlatformRegistry implements PlatformRegistry {\n private adapters = new Map<string, PlatformAdapter>();\n\n constructor() {\n // Register default platforms\n this.register(chatgptPlatform);\n }\n\n register(adapter: PlatformAdapter): void {\n this.adapters.set(adapter.name, adapter);\n }\n\n get(name: string): PlatformAdapter | null {\n return this.adapters.get(name) ?? null;\n }\n\n detect(): PlatformAdapter | null {\n // Return the first available platform\n for (const adapter of this.adapters.values()) {\n if (adapter.isAvailable()) {\n return adapter;\n }\n }\n return null;\n }\n\n getAll(): PlatformAdapter[] {\n return Array.from(this.adapters.values());\n }\n}\n\n/**\n * Create a new platform registry\n */\nexport function createPlatformRegistry(): PlatformRegistry {\n return new DefaultPlatformRegistry();\n}\n\n/**\n * Default platform registry instance\n */\nexport const defaultPlatformRegistry = createPlatformRegistry();\n","/**\n * Platform Context\n *\n * Provides the active platform adapter to all Sunpeak components and hooks.\n */\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport type { PlatformAdapter } from '../types/platform';\nimport { defaultPlatformRegistry } from '../platforms/registry';\n\nexport interface PlatformContextValue {\n adapter: PlatformAdapter | null;\n}\n\nconst PlatformContext = createContext<PlatformContextValue | null>(null);\n\nexport interface PlatformProviderProps {\n /**\n * The platform adapter to use. If not provided, will auto-detect.\n */\n adapter?: PlatformAdapter;\n\n /**\n * Platform name to use (e.g., 'chatgpt', 'gemini'). If not provided, will auto-detect.\n */\n platform?: string;\n\n children: ReactNode;\n}\n\n/**\n * Platform Provider\n *\n * Wrap your app with this provider to specify which genAI platform to use.\n * If no platform is specified, it will auto-detect the available platform.\n *\n * @example\n * ```tsx\n * import { PlatformProvider } from 'sunpeak';\n *\n * // Auto-detect platform\n * <PlatformProvider>\n * <App />\n * </PlatformProvider>\n *\n * // Explicitly use ChatGPT\n * <PlatformProvider platform=\"chatgpt\">\n * <App />\n * </PlatformProvider>\n * ```\n */\nexport function PlatformProvider({ adapter, platform, children }: PlatformProviderProps) {\n const resolvedAdapter =\n adapter ?? (platform ? defaultPlatformRegistry.get(platform) : null) ?? defaultPlatformRegistry.detect();\n\n return <PlatformContext.Provider value={{ adapter: resolvedAdapter }}>{children}</PlatformContext.Provider>;\n}\n\n/**\n * Hook to access the current platform adapter\n *\n * @internal\n */\nexport function usePlatformContext(): PlatformContextValue {\n const context = useContext(PlatformContext);\n\n // If no provider is found, auto-detect the platform\n if (!context) {\n return {\n adapter: defaultPlatformRegistry.detect(),\n };\n }\n\n return context;\n}\n\n/**\n * Hook to access the current platform adapter\n *\n * Returns null if no platform is available or detected.\n */\nexport function usePlatform(): PlatformAdapter | null {\n const { adapter } = usePlatformContext();\n return adapter;\n}\n","import { useSyncExternalStore } from 'react';\nimport type { PlatformGlobals } from '../types/platform';\nimport { usePlatform } from '../context/PlatformContext';\n\n/**\n * Hook to access platform global state in a platform-agnostic way.\n * Works with any genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * Uses React's useSyncExternalStore to efficiently subscribe to changes.\n *\n * @param key - The key of the global state to access\n * @returns The value of the global state, or null if not available\n *\n * @example\n * ```tsx\n * function MyWidget() {\n * const colorScheme = usePlatformGlobal('colorScheme');\n * const displayMode = usePlatformGlobal('displayMode');\n *\n * return <div className={colorScheme === 'dark' ? 'dark' : 'light'}>...</div>;\n * }\n * ```\n */\nexport function usePlatformGlobal<K extends keyof PlatformGlobals>(\n key: K\n): PlatformGlobals[K] | null {\n const platform = usePlatform();\n\n return useSyncExternalStore(\n (onChange) => {\n if (!platform) {\n return () => {};\n }\n\n return platform.subscribe(onChange);\n },\n () => platform?.getGlobal(key) ?? null,\n () => platform?.getGlobal(key) ?? null\n );\n}\n","import { usePlatformGlobal } from './usePlatformGlobal';\nimport { type DisplayMode } from '../types';\n\n/**\n * Hook to get the current display mode from the active genAI platform.\n * Display modes include: 'inline', 'fullscreen', and 'pip' (picture-in-picture).\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @returns The current display mode, or null if not in a supported environment\n */\nexport const useDisplayMode = (): DisplayMode | null => {\n return usePlatformGlobal('displayMode');\n};\n","import { usePlatformGlobal } from './usePlatformGlobal';\n\n/**\n * Hook to get the maximum height constraint from the active genAI platform.\n * Useful for ensuring your widget doesn't exceed the available space.\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @returns The maximum height in pixels, or null if not available\n */\nexport const useMaxHeight = (): number | null => {\n return usePlatformGlobal('maxHeight');\n};\n","import { usePlatform } from '../context/PlatformContext';\nimport type { DisplayMode, RequestDisplayMode } from '../types';\n\n/**\n * Hook to request a specific display mode from the platform\n *\n * @example\n * ```tsx\n * const requestDisplayMode = useRequestDisplayMode();\n *\n * const handleClick = async () => {\n * await requestDisplayMode({ mode: 'fullscreen' });\n * };\n * ```\n */\nexport function useRequestDisplayMode(): RequestDisplayMode {\n const platform = usePlatform();\n\n return async (args: { mode: DisplayMode }) => {\n const globals = platform?.getGlobals();\n\n if (globals?.requestDisplayMode) {\n return await globals.requestDisplayMode(args);\n }\n\n // Fallback if platform doesn't support requestDisplayMode\n console.warn('requestDisplayMode is not available on this platform');\n return { mode: args.mode };\n };\n}\n","import { usePlatformGlobal } from './usePlatformGlobal';\nimport { type Theme } from '../types';\n\n/**\n * Hook to get the current color scheme from the active genAI platform.\n * Color scheme can be 'light' or 'dark'.\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @returns The current color scheme, or null if not in a supported environment\n */\nexport const useColorScheme = (): Theme | null => {\n return usePlatformGlobal('colorScheme');\n};\n","import { usePlatformGlobal } from './usePlatformGlobal';\n\n/**\n * Hook to get widget props (tool output) from the active genAI platform.\n * This contains the data returned by your server's tool.\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @param defaultState - Default state to use if no props are available\n * @returns The widget props from the tool output\n */\nexport function useWidgetProps<T extends Record<string, unknown>>(\n defaultState?: T | (() => T)\n): T {\n const props = usePlatformGlobal('toolOutput') as T;\n\n const fallback =\n typeof defaultState === 'function'\n ? (defaultState as () => T | null)()\n : defaultState ?? null;\n\n return props ?? fallback;\n}\n","import { useCallback, useEffect, useState, type SetStateAction } from 'react';\nimport { usePlatformGlobal } from './usePlatformGlobal';\nimport { usePlatform } from '../context/PlatformContext';\nimport type { UnknownObject } from '../types';\n\n/**\n * Hook to manage widget state that persists in the active genAI platform.\n * Similar to useState, but syncs with the platform host page.\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @param defaultState - Default state value or function to generate it\n * @returns A tuple of [state, setState] similar to useState\n */\nexport function useWidgetState<T extends UnknownObject>(\n defaultState: T | (() => T)\n): readonly [T, (state: SetStateAction<T>) => void];\nexport function useWidgetState<T extends UnknownObject>(\n defaultState?: T | (() => T | null) | null\n): readonly [T | null, (state: SetStateAction<T | null>) => void];\nexport function useWidgetState<T extends UnknownObject>(\n defaultState?: T | (() => T | null) | null\n): readonly [T | null, (state: SetStateAction<T | null>) => void] {\n const widgetStateFromWindow = usePlatformGlobal('widgetState') as T;\n const platform = usePlatform();\n\n const [widgetState, _setWidgetState] = useState<T | null>(() => {\n if (widgetStateFromWindow != null) {\n return widgetStateFromWindow;\n }\n\n return typeof defaultState === 'function' ? defaultState() : defaultState ?? null;\n });\n\n useEffect(() => {\n _setWidgetState(widgetStateFromWindow);\n }, [widgetStateFromWindow]);\n\n const setWidgetState = useCallback(\n (state: SetStateAction<T | null>) => {\n _setWidgetState((prevState) => {\n const newState = typeof state === 'function' ? state(prevState) : state;\n\n if (newState != null && platform) {\n const globals = platform.getGlobals();\n if (globals?.setWidgetState) {\n globals.setWidgetState(newState);\n }\n }\n\n return newState;\n });\n },\n [platform]\n );\n\n return [widgetState, setWidgetState] as const;\n}\n","import { type ReactNode, type HTMLAttributes } from 'react';\nimport { clsx } from 'clsx';\nimport { Button, type ButtonProps } from '../Button';\nimport { useRequestDisplayMode, useDisplayMode, useMaxHeight, useColorScheme, useWidgetState } from '../../hooks';\nimport type { GenAIProps } from '../GenAI';\n\nexport interface CardProps extends Omit<GenAIProps, 'children'>, HTMLAttributes<HTMLDivElement> {\n /**\n * Card content\n */\n children?: ReactNode;\n /**\n * Image to display at the top of the card\n */\n image: string;\n /**\n * Alt text for the image\n */\n imageAlt: string;\n /**\n * Maximum width for the image in pixels\n */\n imageMaxWidth: number;\n /**\n * Maximum height for the image in pixels\n */\n imageMaxHeight: number;\n /**\n * Optional header text (title)\n */\n header?: ReactNode;\n /**\n * Optional metadata text (e.g., rating, category)\n */\n metadata?: ReactNode;\n /**\n * First action button (0-1)\n */\n button1?: ButtonProps;\n /**\n * Second action button (0-1)\n */\n button2?: ButtonProps;\n /**\n * Card variant\n */\n variant?: 'default' | 'bordered' | 'elevated';\n}\n\n/**\n * Card - A responsive card component that adapts to display mode.\n *\n * In inline mode:\n * - Width: 220px (fixed for carousel consistency)\n * - Compact layout optimized for horizontal scrolling\n * - Clickable to request fullscreen mode\n *\n * In fullscreen mode:\n * - Full width layout\n * - Expanded content display\n * - More breathing room for content\n *\n * Design specs:\n * - Image: aspect-square with 24px border radius\n * - Typography: 16px medium for header, 12px for metadata, 14px for description\n * - Spacing: 12px between sections\n * - Max 2 actions in footer (design guideline)\n */\nexport const Card = ({\n children,\n image,\n imageAlt,\n imageMaxWidth,\n imageMaxHeight,\n header,\n metadata,\n button1,\n button2,\n variant = 'default',\n maxWidth = 800,\n className,\n onClick,\n id,\n ...props\n}: CardProps) => {\n const requestDisplayMode = useRequestDisplayMode();\n const displayMode = useDisplayMode();\n const maxHeight = useMaxHeight();\n const colorScheme = useColorScheme();\n const [widgetState, setWidgetState] = useWidgetState<{ selectedCardId?: string }>({});\n\n // Default to inline mode if display mode is not detected\n const isInline = displayMode !== 'fullscreen' && displayMode !== 'pip';\n\n const cardClasses = clsx(\n 'sp-genai-app',\n 'sp-card',\n 'sp-select-none',\n 'sp-antialiased',\n {\n 'sp-card-elevated': variant === 'elevated',\n 'sp-card-bordered': variant === 'bordered',\n },\n colorScheme && `sp-theme-${colorScheme}`,\n className\n );\n\n const hasButtons = button1 || button2;\n\n const handleCardClick = async (e: React.MouseEvent<HTMLDivElement>) => {\n // Call custom onClick if provided\n onClick?.(e);\n\n // Only request fullscreen if we're in inline mode\n if (isInline && !e.defaultPrevented) {\n try {\n // Store the selected card ID in widget state\n if (id) {\n setWidgetState({ ...widgetState, selectedCardId: id });\n }\n await requestDisplayMode({ mode: 'fullscreen' });\n } catch (error) {\n console.error('Failed to request fullscreen mode:', error);\n }\n }\n };\n\n return (\n <div\n id={id}\n className={cardClasses}\n style={{\n width: isInline ? '220px' : '100%',\n maxWidth: isInline ? '220px' : `${maxWidth}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n cursor: isInline ? 'pointer' : 'default',\n overflow: 'auto',\n }}\n onClick={handleCardClick}\n {...props}\n >\n {image && (\n <div>\n <img\n src={image}\n alt={imageAlt}\n className=\"sp-card-image\"\n loading=\"lazy\"\n style={{\n maxWidth: `${imageMaxWidth}px`,\n maxHeight: `${imageMaxHeight}px`,\n }}\n />\n </div>\n )}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: isInline ? '12px' : '16px',\n padding: isInline ? '16px' : '24px',\n paddingTop: image ? (isInline ? '12px' : '16px') : isInline ? '16px' : '24px',\n flex: 1,\n }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: isInline ? '4px' : '8px', flex: 1 }}>\n {header && <div className=\"sp-card-header sp-truncate\">{header}</div>}\n {metadata && <div className=\"sp-card-metadata\">{metadata}</div>}\n {children && (\n <div\n className=\"sp-card-description\"\n style={{\n marginTop: metadata || header ? (isInline ? '4px' : '8px') : '0',\n WebkitLineClamp: isInline ? 2 : 'unset',\n }}\n >\n {children}\n </div>\n )}\n </div>\n {hasButtons && (\n <div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>\n {button1 && <Button {...button1} />}\n {button2 && <Button {...button2} />}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { type ReactNode, type HTMLAttributes, useRef, useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\nimport { useMaxHeight, useColorScheme } from '../../hooks';\nimport type { GenAIProps } from '../GenAI';\n\nexport interface CarouselProps extends Omit<GenAIProps, 'children'>, HTMLAttributes<HTMLDivElement> {\n /**\n * Carousel items (typically Card components)\n */\n children: ReactNode;\n /**\n * Gap between items in pixels\n * @default 16\n */\n gap?: number;\n /**\n * Show navigation arrows\n * @default true\n */\n showArrows?: boolean;\n /**\n * Show edge gradients to indicate more content\n * @default true\n */\n showEdgeGradients?: boolean;\n}\n\n/**\n * Carousel - A carousel component for displaying multiple cards side-by-side.\n * Follows OpenAI ChatGPT Apps SDK design guidelines.\n *\n * Design specs:\n * - 3-8 items recommended (design guideline)\n * - 16px gap between items\n * - 32px circular navigation buttons with shadow\n * - Edge gradients with fade effect\n * - Padding: 20px vertical\n * - Draggable with mouse for smooth scrolling\n */\nexport const Carousel = ({\n children,\n gap = 16,\n maxWidth = 800,\n showArrows = true,\n showEdgeGradients = true,\n className,\n ...props\n}: CarouselProps) => {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [startX, setStartX] = useState(0);\n const [scrollLeft, setScrollLeft] = useState(0);\n const maxHeight = useMaxHeight();\n const colorScheme = useColorScheme();\n\n const checkScroll = () => {\n const el = scrollRef.current;\n if (!el) return;\n\n setCanScrollLeft(el.scrollLeft > 0);\n setCanScrollRight(el.scrollLeft < el.scrollWidth - el.clientWidth - 1);\n };\n\n useEffect(() => {\n checkScroll();\n const el = scrollRef.current;\n if (!el) return;\n\n el.addEventListener('scroll', checkScroll);\n window.addEventListener('resize', checkScroll);\n\n return () => {\n el.removeEventListener('scroll', checkScroll);\n window.removeEventListener('resize', checkScroll);\n };\n }, []);\n\n const scroll = (direction: 'left' | 'right') => {\n const el = scrollRef.current;\n if (!el) return;\n\n // Get the first card element to calculate card width\n const firstCard = el.children[0] as HTMLElement;\n if (!firstCard) return;\n\n // Card width + gap = scroll amount for one complete card\n const cardWidth = firstCard.offsetWidth;\n const scrollAmount = cardWidth + gap;\n\n const targetScroll =\n direction === 'left' ? el.scrollLeft - scrollAmount : el.scrollLeft + scrollAmount;\n\n el.scrollTo({\n left: targetScroll,\n behavior: 'smooth',\n });\n };\n\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n const el = scrollRef.current;\n if (!el) return;\n\n setIsDragging(true);\n setStartX(e.pageX - el.offsetLeft);\n setScrollLeft(el.scrollLeft);\n };\n\n const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!isDragging) return;\n\n e.preventDefault();\n const el = scrollRef.current;\n if (!el) return;\n\n const x = e.pageX - el.offsetLeft;\n const walk = (x - startX) * 2; // Multiply for faster scrolling\n el.scrollLeft = scrollLeft - walk;\n };\n\n const handleMouseUpOrLeave = () => {\n setIsDragging(false);\n };\n\n const containerClasses = clsx(\n 'sp-genai-app',\n 'sp-carousel',\n 'sp-antialiased',\n colorScheme && `sp-theme-${colorScheme}`,\n className\n );\n\n return (\n <div\n className={containerClasses}\n style={{\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n maxWidth: `${maxWidth}px`\n }}\n {...props}\n >\n <div className=\"overflow-hidden\">\n <div\n ref={scrollRef}\n className=\"sp-carousel-scroll\"\n style={{ gap: `${gap}px`, cursor: isDragging ? 'grabbing' : 'grab' }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUpOrLeave}\n onMouseLeave={handleMouseUpOrLeave}\n >\n {children}\n </div>\n </div>\n\n {/* Edge gradients */}\n {showEdgeGradients && canScrollLeft && (\n <div\n className=\"sp-carousel-edge sp-carousel-edge-left\"\n aria-hidden=\"true\"\n style={{ opacity: canScrollLeft ? 1 : 0 }}\n />\n )}\n\n {showEdgeGradients && canScrollRight && (\n <div\n className=\"sp-carousel-edge sp-carousel-edge-right\"\n aria-hidden=\"true\"\n style={{ opacity: canScrollRight ? 1 : 0 }}\n />\n )}\n\n {/* Navigation buttons */}\n {showArrows && canScrollLeft && (\n <button\n aria-label=\"Previous\"\n className=\"sp-carousel-nav-button sp-carousel-nav-button-prev\"\n onClick={() => scroll('left')}\n type=\"button\"\n >\n <svg\n className=\"sp-carousel-nav-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {showArrows && canScrollRight && (\n <button\n aria-label=\"Next\"\n className=\"sp-carousel-nav-button sp-carousel-nav-button-next\"\n onClick={() => scroll('right')}\n type=\"button\"\n >\n <svg\n className=\"sp-carousel-nav-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n};\n","import { type ReactNode, type HTMLAttributes } from 'react';\nimport { clsx } from 'clsx';\nimport { useMaxHeight, useColorScheme } from '../../hooks';\n\nexport interface GenAIProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Maximum width in pixels\n * @default 800\n */\n maxWidth?: number;\n}\n\nexport interface GenAIRenderProps {\n /**\n * Maximum height from platform (in pixels)\n */\n maxHeight: number | null;\n /**\n * Color scheme from platform\n */\n colorScheme: 'light' | 'dark' | null;\n}\n\n/**\n * GenAI - Create platform-aware genAI Apps with automatic theming and constraints.\n *\n * @example\n * ```tsx\n * export const MyApp = GenAI(() => (\n * <div>My content</div>\n * ));\n * ```\n */\nexport function GenAI(\n renderFn: (props: GenAIRenderProps) => ReactNode\n) {\n const GenAIComponent = (props: GenAIProps = {}) => {\n const maxHeight = useMaxHeight();\n const colorScheme = useColorScheme();\n const { className, maxWidth = 800, ...rest } = props;\n\n const containerClasses = clsx(\n 'sp-genai-app',\n 'sp-antialiased',\n colorScheme && `sp-theme-${colorScheme}`,\n className\n );\n\n return (\n <div\n className={containerClasses}\n style={{\n maxWidth: `${maxWidth}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n }}\n {...rest}\n >\n {renderFn({ maxHeight, colorScheme })}\n </div>\n );\n };\n\n GenAIComponent.displayName = 'GenAI';\n return GenAIComponent;\n}\n","import { useEffect, useState, type ReactNode } from 'react';\nimport type { DisplayMode, Theme, ChatGPTGlobals } from '../../types';\nimport { SET_GLOBALS_EVENT_TYPE, SetGlobalsEvent } from '../../types/chatgpt';\nimport './ChatGPTSimulator.css';\n\nexport interface ChatGPTSimulatorProps {\n /**\n * The component to render in the ChatGPT message\n * Can be a function that receives the selected App UI\n */\n children: ReactNode | ((uiSimulation: string) => ReactNode);\n\n /**\n * Initial display mode\n */\n displayMode?: DisplayMode;\n\n /**\n * Initial color scheme\n */\n colorScheme?: Theme;\n\n /**\n * Initial tool input\n */\n toolInput?: Record<string, unknown>;\n\n /**\n * Initial tool output\n */\n toolOutput?: Record<string, unknown> | null;\n\n /**\n * Initial widget state\n */\n widgetState?: Record<string, unknown> | null;\n\n /**\n * User message to display above the component\n */\n userMessage?: string;\n\n /**\n * Show simulator controls\n */\n showControls?: boolean;\n\n /**\n * App UIs for the App UI selector\n */\n uiSimulations?: string[];\n\n /**\n * Initial App UI\n */\n initialUISimulation?: string;\n}\n\n/**\n * ChatGPT Simulator Component\n *\n * Emulates the ChatGPT environment for testing components locally.\n * Provides window.openai API and renders components in a ChatGPT-like UI.\n */\nexport function ChatGPTSimulator({\n children,\n displayMode: initialDisplayMode = 'inline',\n colorScheme: initialColorScheme = 'dark',\n toolInput = {},\n toolOutput = null,\n widgetState: initialWidgetState = null,\n userMessage = 'Show me some recommendations',\n showControls = true,\n uiSimulations,\n initialUISimulation,\n}: ChatGPTSimulatorProps) {\n const [displayMode, setDisplayMode] = useState<DisplayMode>(initialDisplayMode);\n const [widgetState, setWidgetStateInternal] = useState<Record<string, unknown> | null>(\n initialWidgetState\n );\n const [bodyWidth, setBodyWidth] = useState<string>('100%');\n const [selectedUISimulation, setSelectedUISimulation] = useState<string>(\n initialUISimulation || uiSimulations?.[0] || ''\n );\n const [viewportHeight, setViewportHeight] = useState<number>(window.innerHeight);\n\n // Sync colorScheme with window.openai.colorScheme as source of truth\n const [colorScheme, setColorScheme] = useState<Theme>(initialColorScheme);\n\n // Listen to changes in window.openai.colorScheme\n useEffect(() => {\n const handleSetGlobals = (event: Event) => {\n const customEvent = event as SetGlobalsEvent;\n if (customEvent.detail?.globals?.colorScheme) {\n setColorScheme(customEvent.detail.globals.colorScheme);\n }\n };\n\n window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobals);\n return () => window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobals);\n }, []);\n\n // Track viewport height for fullscreen mode\n useEffect(() => {\n const handleResize = () => {\n setViewportHeight(window.innerHeight);\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Initialize window.openai\n useEffect(() => {\n // In fullscreen, subtract input bar height (~80px) from viewport\n const inputBarHeight = 80;\n const openaiGlobals: ChatGPTGlobals = {\n colorScheme,\n displayMode,\n locale: 'en-US',\n maxHeight: displayMode === 'fullscreen' ? viewportHeight - inputBarHeight : 600,\n userAgent: {\n device: { type: 'desktop' },\n capabilities: { hover: true, touch: false },\n },\n safeArea: {\n insets: { top: 0, bottom: 0, left: 0, right: 0 },\n },\n toolInput,\n toolOutput,\n toolResponseMetadata: null,\n widgetState,\n setWidgetState: async (state: Record<string, unknown>) => {\n console.log('[ChatGPT Simulator] setWidgetState called:', state);\n setWidgetStateInternal(state);\n },\n };\n\n const openaiAPI = {\n callTool: async (name: string, args: Record<string, unknown>) => {\n console.log('[ChatGPT Simulator] callTool called:', name, args);\n return { result: 'Mock tool result' };\n },\n sendFollowUpMessage: async (args: { prompt: string }) => {\n console.log('[ChatGPT Simulator] sendFollowUpMessage called:', args);\n },\n openExternal: (payload: { href: string }) => {\n console.log('[ChatGPT Simulator] openExternal called:', payload);\n window.open(payload.href, '_blank');\n },\n requestDisplayMode: async (args: { mode: DisplayMode }) => {\n console.log('[ChatGPT Simulator] requestDisplayMode called:', args);\n setDisplayMode(args.mode);\n return { mode: args.mode };\n },\n };\n\n window.openai = { ...openaiGlobals, ...openaiAPI };\n\n // Dispatch initial event\n window.dispatchEvent(\n new CustomEvent(SET_GLOBALS_EVENT_TYPE, {\n detail: { globals: openaiGlobals },\n }) as SetGlobalsEvent\n );\n\n return () => {\n delete window.openai;\n };\n }, [colorScheme, displayMode, toolInput, toolOutput, widgetState, viewportHeight]);\n\n // Update window.openai when state changes\n useEffect(() => {\n if (window.openai) {\n const inputBarHeight = 80;\n const calculatedMaxHeight = displayMode === 'fullscreen' ? viewportHeight - inputBarHeight : 600;\n\n window.openai.colorScheme = colorScheme;\n window.openai.displayMode = displayMode;\n window.openai.widgetState = widgetState;\n window.openai.maxHeight = calculatedMaxHeight;\n\n window.dispatchEvent(\n new CustomEvent(SET_GLOBALS_EVENT_TYPE, {\n detail: {\n globals: { colorScheme, displayMode, widgetState, maxHeight: calculatedMaxHeight },\n },\n }) as SetGlobalsEvent\n );\n }\n }, [colorScheme, displayMode, widgetState, viewportHeight]);\n\n const isFullscreen = displayMode === 'fullscreen';\n\n // Render children based on whether it's a function or ReactNode\n const renderChildren = () => {\n if (typeof children === 'function') {\n return children(selectedUISimulation);\n }\n return children;\n };\n\n return (\n <div className={`chatgpt-simulator chatgpt-simulator--${colorScheme}`} data-display-mode={displayMode}>\n {showControls && (\n <div className=\"chatgpt-simulator__sidebar\">\n <div className=\"chatgpt-simulator__sidebar-header\">\n <h2>Controls</h2>\n </div>\n <div className=\"chatgpt-simulator__control-group\">\n {uiSimulations && uiSimulations.length > 0 && (\n <label>\n App UI\n <select\n value={selectedUISimulation}\n onChange={(e) => setSelectedUISimulation(e.target.value)}\n >\n {uiSimulations.map((simulation) => (\n <option key={simulation} value={simulation}>\n {simulation}\n </option>\n ))}\n </select>\n </label>\n )}\n <label>\n Color Scheme\n <select value={colorScheme} onChange={(e) => setColorScheme(e.target.value as Theme)}>\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </label>\n <label>\n Display Mode\n <select\n value={displayMode}\n onChange={(e) => setDisplayMode(e.target.value as DisplayMode)}\n >\n <option value=\"inline\">Inline</option>\n <option value=\"fullscreen\">Fullscreen</option>\n <option value=\"pip\">Picture-in-Picture</option>\n </select>\n </label>\n <label>\n Body Width\n <select value={bodyWidth} onChange={(e) => setBodyWidth(e.target.value)}>\n <option value=\"100%\">100% (Full)</option>\n <option value=\"1024px\">1024px (Laptop)</option>\n <option value=\"768px\">768px (Tablet)</option>\n <option value=\"425px\">425px (Mobile L)</option>\n <option value=\"320px\">320px (Mobile S)</option>\n </select>\n </label>\n </div>\n </div>\n )}\n\n <div className=\"chatgpt-simulator__main\" style={{ width: bodyWidth, maxWidth: bodyWidth }}>\n {isFullscreen && (\n <button\n className=\"chatgpt-simulator__close-button\"\n onClick={() => setDisplayMode('inline')}\n aria-label=\"Exit fullscreen\"\n type=\"button\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n )}\n\n {!isFullscreen && (\n <div className=\"chatgpt-simulator__header\">\n <h1>ChatGPT</h1>\n </div>\n )}\n\n <div className=\"[--thread-content-max-width:40rem] thread-lg:[--thread-content-max-width:48rem] mx-auto max-w-[var(--thread-content-max-width)] flex-1 relative flex w-full min-w-0 flex-col\">\n <div className=\"flex max-w-full flex-col grow\">\n {!isFullscreen && (\n <>\n {/* User Message */}\n <div className=\"chatgpt-simulator__message chatgpt-simulator__message--user\">\n <div className=\"chatgpt-simulator__message-content\">{userMessage}</div>\n </div>\n\n {/* Assistant Message with Component */}\n <div className=\"min-h-8 relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal\">\n <div className=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n <div className=\"w-full break-words\">\n {/* App Title */}\n <div className=\"chatgpt-simulator__app-title\">\n <span className=\"chatgpt-simulator__app-icon\">✈️</span>\n <span className=\"chatgpt-simulator__app-name\">Splorin</span>\n </div>\n <div className=\"chatgpt-simulator__component-slot\">{renderChildren()}</div>\n </div>\n </div>\n </div>\n </>\n )}\n {isFullscreen && (\n <div className=\"chatgpt-simulator__fullscreen-content\">\n {renderChildren()}\n </div>\n )}\n </div>\n </div>\n <div className=\"chatgpt-simulator__input-container\">\n <input\n type=\"text\"\n className=\"chatgpt-simulator__input\"\n placeholder=\"Message ChatGPT\"\n disabled\n />\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Button/Button.tsx","../src/types/chatgpt.ts","../src/platforms/chatgpt.ts","../src/platforms/registry.ts","../src/context/PlatformContext.tsx","../src/hooks/usePlatformGlobal.ts","../src/hooks/useDisplayMode.ts","../src/hooks/useMaxHeight.ts","../src/hooks/useRequestDisplayMode.ts","../src/hooks/useColorScheme.ts","../src/hooks/useWidgetProps.ts","../src/hooks/useWidgetState.ts","../src/components/Card/Card.tsx","../src/components/Carousel/Carousel.tsx","../src/components/GenAI/GenAI.tsx","../src/components/ChatGPTSimulator/ChatGPTSimulator.tsx"],"names":["jsx","clsx","useState","useEffect","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["import { type ButtonHTMLAttributes } from 'react';\nimport { clsx } from 'clsx';\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /**\n * Whether to use primary styling (accent color) or secondary (outlined)\n * @default false\n */\n isPrimary?: boolean;\n /**\n * Click handler (required)\n */\n onClick: () => void;\n /**\n * Button label\n */\n children: React.ReactNode;\n}\n\n/**\n * Button - A button component that follows platform design guidelines.\n * Requires an action handler. Use isPrimary to toggle between primary and secondary styles.\n *\n * Design specs:\n * - Primary (isPrimary=true): Accent color background, white text\n * - Secondary (isPrimary=false): Transparent background with border\n * - Both: 14px medium font, rounded corners, hover/active states\n */\nexport const Button = ({\n isPrimary = false,\n onClick,\n children,\n className,\n type = 'button',\n ...props\n}: ButtonProps) => {\n const buttonClasses = clsx(\n 'sp-button',\n {\n 'sp-button-primary': isPrimary,\n 'sp-button-secondary': !isPrimary,\n },\n className\n );\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n onClick();\n };\n\n return (\n <button className={buttonClasses} onClick={handleClick} type={type} {...props}>\n {children}\n </button>\n );\n};\n","export type UnknownObject = Record<string, unknown>;\n\nexport type Theme = 'light' | 'dark';\n\nexport type SafeAreaInsets = {\n top: number;\n bottom: number;\n left: number;\n right: number;\n};\n\nexport type SafeArea = {\n insets: SafeAreaInsets;\n};\n\nexport type DeviceType = 'mobile' | 'tablet' | 'desktop' | 'unknown';\n\nexport type UserAgent = {\n device: { type: DeviceType };\n capabilities: {\n hover: boolean;\n touch: boolean;\n };\n};\n\n/** Display mode */\nexport type DisplayMode = 'pip' | 'inline' | 'fullscreen';\n\nexport type RequestDisplayMode = (args: { mode: DisplayMode }) => Promise<{\n /**\n * The granted display mode. The host may reject the request.\n * For mobile, PiP is always coerced to fullscreen.\n */\n mode: DisplayMode;\n}>;\n\nexport type CallToolResponse = {\n result: string;\n};\n\n/** Calling APIs */\nexport type CallTool = (\n name: string,\n args: Record<string, unknown>\n) => Promise<CallToolResponse>;\n\nexport type ChatGPTGlobals<\n ToolInput = UnknownObject,\n ToolOutput = UnknownObject,\n ToolResponseMetadata = UnknownObject,\n WidgetState = UnknownObject\n> = {\n // visuals\n colorScheme: Theme;\n userAgent: UserAgent;\n locale: string;\n\n // layout\n maxHeight: number;\n displayMode: DisplayMode;\n safeArea: SafeArea;\n\n // state\n toolInput: ToolInput;\n toolOutput: ToolOutput | null;\n toolResponseMetadata: ToolResponseMetadata | null;\n widgetState: WidgetState | null;\n setWidgetState: (state: WidgetState) => Promise<void>;\n};\n\ntype API = {\n callTool: CallTool;\n sendFollowUpMessage: (args: { prompt: string }) => Promise<void>;\n openExternal(payload: { href: string }): void;\n\n // Layout controls\n requestDisplayMode: RequestDisplayMode;\n};\n\n/** Extra events */\nexport const SET_GLOBALS_EVENT_TYPE = 'chatgpt:set_globals';\n\nexport class SetGlobalsEvent extends CustomEvent<{\n globals: Partial<ChatGPTGlobals>;\n}> {\n readonly type = SET_GLOBALS_EVENT_TYPE;\n}\n\n/**\n * Global openai object injected by the web sandbox for communicating with ChatGPT host page.\n */\ndeclare global {\n interface Window {\n openai?: API & ChatGPTGlobals;\n }\n\n interface WindowEventMap {\n [SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;\n }\n}\n","/**\n * OpenAI ChatGPT Apps SDK Platform Adapter\n *\n * Implements the PlatformAdapter interface for OpenAI's ChatGPT Apps SDK.\n * https://developers.openai.com/apps-sdk\n */\n\nimport type { PlatformAdapter, PlatformGlobals } from '../types/platform';\nimport { SET_GLOBALS_EVENT_TYPE, type SetGlobalsEvent } from '../types/chatgpt';\n\nexport class ChatGPTPlatformAdapter implements PlatformAdapter {\n readonly name = 'chatgpt';\n\n isAvailable(): boolean {\n return typeof window !== 'undefined' && 'openai' in window;\n }\n\n getGlobal<K extends keyof PlatformGlobals>(key: K): PlatformGlobals[K] | null {\n if (!this.isAvailable()) {\n return null;\n }\n return (window.openai?.[key] as PlatformGlobals[K]) ?? null;\n }\n\n getGlobals() {\n if (!this.isAvailable()) {\n return null;\n }\n return window.openai ?? null;\n }\n\n subscribe(callback: () => void): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const handleSetGlobal = (_event: SetGlobalsEvent) => {\n callback();\n };\n\n window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);\n };\n }\n}\n\n/**\n * Singleton instance of the ChatGPT platform adapter\n */\nexport const chatgptPlatform = new ChatGPTPlatformAdapter();\n","/**\n * Platform Registry\n *\n * Manages multiple platform adapters and auto-detects the active platform.\n */\n\nimport type { PlatformAdapter } from '../types/platform';\nimport { chatgptPlatform } from './chatgpt';\n\nexport interface PlatformRegistry {\n /**\n * Register a platform adapter\n */\n register(adapter: PlatformAdapter): void;\n\n /**\n * Get a specific platform adapter by name\n */\n get(name: string): PlatformAdapter | null;\n\n /**\n * Auto-detect and return the active platform\n * Returns the first available platform in the registry\n */\n detect(): PlatformAdapter | null;\n\n /**\n * Get all registered platforms\n */\n getAll(): PlatformAdapter[];\n}\n\nclass DefaultPlatformRegistry implements PlatformRegistry {\n private adapters = new Map<string, PlatformAdapter>();\n\n constructor() {\n // Register default platforms\n this.register(chatgptPlatform);\n }\n\n register(adapter: PlatformAdapter): void {\n this.adapters.set(adapter.name, adapter);\n }\n\n get(name: string): PlatformAdapter | null {\n return this.adapters.get(name) ?? null;\n }\n\n detect(): PlatformAdapter | null {\n // Return the first available platform\n for (const adapter of this.adapters.values()) {\n if (adapter.isAvailable()) {\n return adapter;\n }\n }\n return null;\n }\n\n getAll(): PlatformAdapter[] {\n return Array.from(this.adapters.values());\n }\n}\n\n/**\n * Create a new platform registry\n */\nexport function createPlatformRegistry(): PlatformRegistry {\n return new DefaultPlatformRegistry();\n}\n\n/**\n * Default platform registry instance\n */\nexport const defaultPlatformRegistry = createPlatformRegistry();\n","/**\n * Platform Context\n *\n * Provides the active platform adapter to all Sunpeak components and hooks.\n */\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport type { PlatformAdapter } from '../types/platform';\nimport { defaultPlatformRegistry } from '../platforms/registry';\n\nexport interface PlatformContextValue {\n adapter: PlatformAdapter | null;\n}\n\nconst PlatformContext = createContext<PlatformContextValue | null>(null);\n\nexport interface PlatformProviderProps {\n /**\n * The platform adapter to use. If not provided, will auto-detect.\n */\n adapter?: PlatformAdapter;\n\n /**\n * Platform name to use (e.g., 'chatgpt', 'gemini'). If not provided, will auto-detect.\n */\n platform?: string;\n\n children: ReactNode;\n}\n\n/**\n * Platform Provider\n *\n * Wrap your app with this provider to specify which genAI platform to use.\n * If no platform is specified, it will auto-detect the available platform.\n *\n * @example\n * ```tsx\n * import { PlatformProvider } from 'sunpeak';\n *\n * // Auto-detect platform\n * <PlatformProvider>\n * <App />\n * </PlatformProvider>\n *\n * // Explicitly use ChatGPT\n * <PlatformProvider platform=\"chatgpt\">\n * <App />\n * </PlatformProvider>\n * ```\n */\nexport function PlatformProvider({ adapter, platform, children }: PlatformProviderProps) {\n const resolvedAdapter =\n adapter ?? (platform ? defaultPlatformRegistry.get(platform) : null) ?? defaultPlatformRegistry.detect();\n\n return <PlatformContext.Provider value={{ adapter: resolvedAdapter }}>{children}</PlatformContext.Provider>;\n}\n\n/**\n * Hook to access the current platform adapter\n *\n * @internal\n */\nexport function usePlatformContext(): PlatformContextValue {\n const context = useContext(PlatformContext);\n\n // If no provider is found, auto-detect the platform\n if (!context) {\n return {\n adapter: defaultPlatformRegistry.detect(),\n };\n }\n\n return context;\n}\n\n/**\n * Hook to access the current platform adapter\n *\n * Returns null if no platform is available or detected.\n */\nexport function usePlatform(): PlatformAdapter | null {\n const { adapter } = usePlatformContext();\n return adapter;\n}\n","import { useSyncExternalStore } from 'react';\nimport type { PlatformGlobals } from '../types/platform';\nimport { usePlatform } from '../context/PlatformContext';\n\n/**\n * Hook to access platform global state in a platform-agnostic way.\n * Works with any genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * Uses React's useSyncExternalStore to efficiently subscribe to changes.\n *\n * @param key - The key of the global state to access\n * @returns The value of the global state, or null if not available\n *\n * @example\n * ```tsx\n * function MyWidget() {\n * const colorScheme = usePlatformGlobal('colorScheme');\n * const displayMode = usePlatformGlobal('displayMode');\n *\n * return <div className={colorScheme === 'dark' ? 'dark' : 'light'}>...</div>;\n * }\n * ```\n */\nexport function usePlatformGlobal<K extends keyof PlatformGlobals>(\n key: K\n): PlatformGlobals[K] | null {\n const platform = usePlatform();\n\n return useSyncExternalStore(\n (onChange) => {\n if (!platform) {\n return () => {};\n }\n\n return platform.subscribe(onChange);\n },\n () => platform?.getGlobal(key) ?? null,\n () => platform?.getGlobal(key) ?? null\n );\n}\n","import { usePlatformGlobal } from './usePlatformGlobal';\nimport { type DisplayMode } from '../types';\n\n/**\n * Hook to get the current display mode from the active genAI platform.\n * Display modes include: 'inline', 'fullscreen', and 'pip' (picture-in-picture).\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @returns The current display mode, or null if not in a supported environment\n */\nexport const useDisplayMode = (): DisplayMode | null => {\n return usePlatformGlobal('displayMode');\n};\n","import { usePlatformGlobal } from './usePlatformGlobal';\n\n/**\n * Hook to get the maximum height constraint from the active genAI platform.\n * Useful for ensuring your widget doesn't exceed the available space.\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @returns The maximum height in pixels, or null if not available\n */\nexport const useMaxHeight = (): number | null => {\n return usePlatformGlobal('maxHeight');\n};\n","import { usePlatform } from '../context/PlatformContext';\nimport type { DisplayMode, RequestDisplayMode } from '../types';\n\n/**\n * Hook to request a specific display mode from the platform\n *\n * @example\n * ```tsx\n * const requestDisplayMode = useRequestDisplayMode();\n *\n * const handleClick = async () => {\n * await requestDisplayMode({ mode: 'fullscreen' });\n * };\n * ```\n */\nexport function useRequestDisplayMode(): RequestDisplayMode {\n const platform = usePlatform();\n\n return async (args: { mode: DisplayMode }) => {\n const globals = platform?.getGlobals();\n\n if (globals?.requestDisplayMode) {\n return await globals.requestDisplayMode(args);\n }\n\n // Fallback if platform doesn't support requestDisplayMode\n console.warn('requestDisplayMode is not available on this platform');\n return { mode: args.mode };\n };\n}\n","import { usePlatformGlobal } from './usePlatformGlobal';\nimport { type Theme } from '../types';\n\n/**\n * Hook to get the current color scheme from the active genAI platform.\n * Color scheme can be 'light' or 'dark'.\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @returns The current color scheme, or null if not in a supported environment\n */\nexport const useColorScheme = (): Theme | null => {\n return usePlatformGlobal('colorScheme');\n};\n","import { usePlatformGlobal } from './usePlatformGlobal';\n\n/**\n * Hook to get widget props (tool output) from the active genAI platform.\n * This contains the data returned by your server's tool.\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @param defaultState - Default state to use if no props are available\n * @returns The widget props from the tool output\n */\nexport function useWidgetProps<T extends Record<string, unknown>>(\n defaultState?: T | (() => T)\n): T {\n const props = usePlatformGlobal('toolOutput') as T;\n\n const fallback =\n typeof defaultState === 'function'\n ? (defaultState as () => T | null)()\n : defaultState ?? null;\n\n return props ?? fallback;\n}\n","import { useCallback, useEffect, useState, type SetStateAction } from 'react';\nimport { usePlatformGlobal } from './usePlatformGlobal';\nimport { usePlatform } from '../context/PlatformContext';\nimport type { UnknownObject } from '../types';\n\n/**\n * Hook to manage widget state that persists in the active genAI platform.\n * Similar to useState, but syncs with the platform host page.\n *\n * Works with any supported genAI platform (ChatGPT, Gemini, Claude, etc.)\n *\n * @param defaultState - Default state value or function to generate it\n * @returns A tuple of [state, setState] similar to useState\n */\nexport function useWidgetState<T extends UnknownObject>(\n defaultState: T | (() => T)\n): readonly [T, (state: SetStateAction<T>) => void];\nexport function useWidgetState<T extends UnknownObject>(\n defaultState?: T | (() => T | null) | null\n): readonly [T | null, (state: SetStateAction<T | null>) => void];\nexport function useWidgetState<T extends UnknownObject>(\n defaultState?: T | (() => T | null) | null\n): readonly [T | null, (state: SetStateAction<T | null>) => void] {\n const widgetStateFromWindow = usePlatformGlobal('widgetState') as T;\n const platform = usePlatform();\n\n const [widgetState, _setWidgetState] = useState<T | null>(() => {\n if (widgetStateFromWindow != null) {\n return widgetStateFromWindow;\n }\n\n return typeof defaultState === 'function' ? defaultState() : defaultState ?? null;\n });\n\n useEffect(() => {\n _setWidgetState(widgetStateFromWindow);\n }, [widgetStateFromWindow]);\n\n const setWidgetState = useCallback(\n (state: SetStateAction<T | null>) => {\n _setWidgetState((prevState) => {\n const newState = typeof state === 'function' ? state(prevState) : state;\n\n if (newState != null && platform) {\n const globals = platform.getGlobals();\n if (globals?.setWidgetState) {\n globals.setWidgetState(newState);\n }\n }\n\n return newState;\n });\n },\n [platform]\n );\n\n return [widgetState, setWidgetState] as const;\n}\n","import { type ReactNode, type HTMLAttributes } from 'react';\nimport { clsx } from 'clsx';\nimport { Button, type ButtonProps } from '../Button';\nimport { useRequestDisplayMode, useDisplayMode, useMaxHeight, useColorScheme, useWidgetState } from '../../hooks';\nimport type { GenAIProps } from '../GenAI';\n\nexport interface CardProps extends Omit<GenAIProps, 'children'>, HTMLAttributes<HTMLDivElement> {\n /**\n * Card content\n */\n children?: ReactNode;\n /**\n * Image to display at the top of the card\n */\n image: string;\n /**\n * Alt text for the image\n */\n imageAlt: string;\n /**\n * Maximum width for the image in pixels\n */\n imageMaxWidth: number;\n /**\n * Maximum height for the image in pixels\n */\n imageMaxHeight: number;\n /**\n * Optional header text (title)\n */\n header?: ReactNode;\n /**\n * Optional metadata text (e.g., rating, category)\n */\n metadata?: ReactNode;\n /**\n * First action button (0-1)\n */\n button1?: ButtonProps;\n /**\n * Second action button (0-1)\n */\n button2?: ButtonProps;\n /**\n * Card variant\n */\n variant?: 'default' | 'bordered' | 'elevated';\n}\n\n/**\n * Card - A responsive card component that adapts to display mode.\n *\n * In inline mode:\n * - Width: 220px (fixed for carousel consistency)\n * - Compact layout optimized for horizontal scrolling\n * - Clickable to request fullscreen mode\n *\n * In fullscreen mode:\n * - Full width layout\n * - Expanded content display\n * - More breathing room for content\n *\n * Design specs:\n * - Image: aspect-square with 24px border radius\n * - Typography: 16px medium for header, 12px for metadata, 14px for description\n * - Spacing: 12px between sections\n * - Max 2 actions in footer (design guideline)\n */\nexport const Card = ({\n children,\n image,\n imageAlt,\n imageMaxWidth,\n imageMaxHeight,\n header,\n metadata,\n button1,\n button2,\n variant = 'default',\n maxWidth = 800,\n className,\n onClick,\n id,\n ...props\n}: CardProps) => {\n const requestDisplayMode = useRequestDisplayMode();\n const displayMode = useDisplayMode();\n const maxHeight = useMaxHeight();\n const colorScheme = useColorScheme();\n const [widgetState, setWidgetState] = useWidgetState<{ selectedCardId?: string }>({});\n\n // Default to inline mode if display mode is not detected\n const isInline = displayMode !== 'fullscreen' && displayMode !== 'pip';\n\n const cardClasses = clsx(\n 'sp-genai-app',\n 'sp-card',\n 'sp-select-none',\n 'sp-antialiased',\n {\n 'sp-card-elevated': variant === 'elevated',\n 'sp-card-bordered': variant === 'bordered',\n },\n colorScheme && `sp-theme-${colorScheme}`,\n className\n );\n\n const hasButtons = button1 || button2;\n\n const handleCardClick = async (e: React.MouseEvent<HTMLDivElement>) => {\n // Call custom onClick if provided\n onClick?.(e);\n\n // Only request fullscreen if we're in inline mode\n if (isInline && !e.defaultPrevented) {\n try {\n // Store the selected card ID in widget state\n if (id) {\n setWidgetState({ ...widgetState, selectedCardId: id });\n }\n await requestDisplayMode({ mode: 'fullscreen' });\n } catch (error) {\n console.error('Failed to request fullscreen mode:', error);\n }\n }\n };\n\n return (\n <div\n id={id}\n className={cardClasses}\n style={{\n width: isInline ? '220px' : '100%',\n maxWidth: isInline ? '220px' : `${maxWidth}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n cursor: isInline ? 'pointer' : 'default',\n overflow: 'auto',\n }}\n onClick={handleCardClick}\n {...props}\n >\n {image && (\n <div>\n <img\n src={image}\n alt={imageAlt}\n className=\"sp-card-image\"\n loading=\"lazy\"\n style={{\n maxWidth: `${imageMaxWidth}px`,\n maxHeight: `${imageMaxHeight}px`,\n }}\n />\n </div>\n )}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: isInline ? '12px' : '16px',\n padding: isInline ? '16px' : '24px',\n paddingTop: image ? (isInline ? '12px' : '16px') : isInline ? '16px' : '24px',\n flex: 1,\n }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: isInline ? '4px' : '8px', flex: 1 }}>\n {header && <div className=\"sp-card-header sp-truncate\">{header}</div>}\n {metadata && <div className=\"sp-card-metadata\">{metadata}</div>}\n {children && (\n <div\n className=\"sp-card-description\"\n style={{\n marginTop: metadata || header ? (isInline ? '4px' : '8px') : '0',\n WebkitLineClamp: isInline ? 2 : 'unset',\n }}\n >\n {children}\n </div>\n )}\n </div>\n {hasButtons && (\n <div style={{ display: 'flex', gap: '8px', flexWrap: 'wrap' }}>\n {button1 && <Button {...button1} />}\n {button2 && <Button {...button2} />}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { type ReactNode, type HTMLAttributes, useRef, useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\nimport { useMaxHeight, useColorScheme } from '../../hooks';\nimport type { GenAIProps } from '../GenAI';\n\nexport interface CarouselProps extends Omit<GenAIProps, 'children'>, HTMLAttributes<HTMLDivElement> {\n /**\n * Carousel items (typically Card components)\n */\n children: ReactNode;\n /**\n * Gap between items in pixels\n * @default 16\n */\n gap?: number;\n /**\n * Show navigation arrows\n * @default true\n */\n showArrows?: boolean;\n /**\n * Show edge gradients to indicate more content\n * @default true\n */\n showEdgeGradients?: boolean;\n}\n\n/**\n * Carousel - A carousel component for displaying multiple cards side-by-side.\n * Follows OpenAI ChatGPT Apps SDK design guidelines.\n *\n * Design specs:\n * - 3-8 items recommended (design guideline)\n * - 16px gap between items\n * - 32px circular navigation buttons with shadow\n * - Edge gradients with fade effect\n * - Padding: 20px vertical\n * - Draggable with mouse for smooth scrolling\n */\nexport const Carousel = ({\n children,\n gap = 16,\n maxWidth = 800,\n showArrows = true,\n showEdgeGradients = true,\n className,\n ...props\n}: CarouselProps) => {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [startX, setStartX] = useState(0);\n const [scrollLeft, setScrollLeft] = useState(0);\n const maxHeight = useMaxHeight();\n const colorScheme = useColorScheme();\n\n const checkScroll = () => {\n const el = scrollRef.current;\n if (!el) return;\n\n setCanScrollLeft(el.scrollLeft > 0);\n setCanScrollRight(el.scrollLeft < el.scrollWidth - el.clientWidth - 1);\n };\n\n useEffect(() => {\n checkScroll();\n const el = scrollRef.current;\n if (!el) return;\n\n el.addEventListener('scroll', checkScroll);\n window.addEventListener('resize', checkScroll);\n\n return () => {\n el.removeEventListener('scroll', checkScroll);\n window.removeEventListener('resize', checkScroll);\n };\n }, []);\n\n const scroll = (direction: 'left' | 'right') => {\n const el = scrollRef.current;\n if (!el) return;\n\n // Get the first card element to calculate card width\n const firstCard = el.children[0] as HTMLElement;\n if (!firstCard) return;\n\n // Card width + gap = scroll amount for one complete card\n const cardWidth = firstCard.offsetWidth;\n const scrollAmount = cardWidth + gap;\n\n const targetScroll =\n direction === 'left' ? el.scrollLeft - scrollAmount : el.scrollLeft + scrollAmount;\n\n el.scrollTo({\n left: targetScroll,\n behavior: 'smooth',\n });\n };\n\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n const el = scrollRef.current;\n if (!el) return;\n\n setIsDragging(true);\n setStartX(e.pageX - el.offsetLeft);\n setScrollLeft(el.scrollLeft);\n };\n\n const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!isDragging) return;\n\n e.preventDefault();\n const el = scrollRef.current;\n if (!el) return;\n\n const x = e.pageX - el.offsetLeft;\n const walk = (x - startX) * 2; // Multiply for faster scrolling\n el.scrollLeft = scrollLeft - walk;\n };\n\n const handleMouseUpOrLeave = () => {\n setIsDragging(false);\n };\n\n const containerClasses = clsx(\n 'sp-genai-app',\n 'sp-carousel',\n 'sp-antialiased',\n colorScheme && `sp-theme-${colorScheme}`,\n className\n );\n\n return (\n <div\n className={containerClasses}\n style={{\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n maxWidth: `${maxWidth}px`\n }}\n {...props}\n >\n <div className=\"overflow-hidden\">\n <div\n ref={scrollRef}\n className=\"sp-carousel-scroll\"\n style={{ gap: `${gap}px`, cursor: isDragging ? 'grabbing' : 'grab' }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUpOrLeave}\n onMouseLeave={handleMouseUpOrLeave}\n >\n {children}\n </div>\n </div>\n\n {/* Edge gradients */}\n {showEdgeGradients && canScrollLeft && (\n <div\n className=\"sp-carousel-edge sp-carousel-edge-left\"\n aria-hidden=\"true\"\n style={{ opacity: canScrollLeft ? 1 : 0 }}\n />\n )}\n\n {showEdgeGradients && canScrollRight && (\n <div\n className=\"sp-carousel-edge sp-carousel-edge-right\"\n aria-hidden=\"true\"\n style={{ opacity: canScrollRight ? 1 : 0 }}\n />\n )}\n\n {/* Navigation buttons */}\n {showArrows && canScrollLeft && (\n <button\n aria-label=\"Previous\"\n className=\"sp-carousel-nav-button sp-carousel-nav-button-prev\"\n onClick={() => scroll('left')}\n type=\"button\"\n >\n <svg\n className=\"sp-carousel-nav-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n {showArrows && canScrollRight && (\n <button\n aria-label=\"Next\"\n className=\"sp-carousel-nav-button sp-carousel-nav-button-next\"\n onClick={() => scroll('right')}\n type=\"button\"\n >\n <svg\n className=\"sp-carousel-nav-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n};\n","import { type ReactNode, type HTMLAttributes } from 'react';\nimport { clsx } from 'clsx';\nimport { useMaxHeight, useColorScheme } from '../../hooks';\n\nexport interface GenAIProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Maximum width in pixels\n * @default 800\n */\n maxWidth?: number;\n}\n\nexport interface GenAIRenderProps {\n /**\n * Maximum height from platform (in pixels)\n */\n maxHeight: number | null;\n /**\n * Color scheme from platform\n */\n colorScheme: 'light' | 'dark' | null;\n}\n\n/**\n * GenAI - Create platform-aware genAI Apps with automatic theming and constraints.\n *\n * @example\n * ```tsx\n * export const MyApp = GenAI(() => (\n * <div>My content</div>\n * ));\n * ```\n */\nexport function GenAI(\n renderFn: (props: GenAIRenderProps) => ReactNode\n) {\n const GenAIComponent = (props: GenAIProps = {}) => {\n const maxHeight = useMaxHeight();\n const colorScheme = useColorScheme();\n const { className, maxWidth = 800, ...rest } = props;\n\n const containerClasses = clsx(\n 'sp-genai-app',\n 'sp-antialiased',\n colorScheme && `sp-theme-${colorScheme}`,\n className\n );\n\n return (\n <div\n className={containerClasses}\n style={{\n maxWidth: `${maxWidth}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n }}\n {...rest}\n >\n {renderFn({ maxHeight, colorScheme })}\n </div>\n );\n };\n\n GenAIComponent.displayName = 'GenAI';\n return GenAIComponent;\n}\n","import { useEffect, useState, type ReactNode } from 'react';\nimport type { DisplayMode, Theme, ChatGPTGlobals } from '../../types';\nimport { SET_GLOBALS_EVENT_TYPE, SetGlobalsEvent } from '../../types/chatgpt';\n\nexport interface ChatGPTSimulatorProps {\n /**\n * The component to render in the ChatGPT message\n * Can be a function that receives the selected App UI\n */\n children: ReactNode | ((uiSimulation: string) => ReactNode);\n\n /**\n * Initial display mode\n */\n displayMode?: DisplayMode;\n\n /**\n * Initial color scheme\n */\n colorScheme?: Theme;\n\n /**\n * Initial tool input\n */\n toolInput?: Record<string, unknown>;\n\n /**\n * Initial tool output\n */\n toolOutput?: Record<string, unknown> | null;\n\n /**\n * Initial widget state\n */\n widgetState?: Record<string, unknown> | null;\n\n /**\n * User message to display above the component\n */\n userMessage?: string;\n\n /**\n * Show simulator controls\n */\n showControls?: boolean;\n\n /**\n * App UIs for the App UI selector\n */\n uiSimulations?: string[];\n\n /**\n * Initial App UI\n */\n initialUISimulation?: string;\n}\n\n/**\n * ChatGPT Simulator Component\n *\n * Emulates the ChatGPT environment for testing components locally.\n * Provides window.openai API and renders components in a ChatGPT-like UI.\n */\nexport function ChatGPTSimulator({\n children,\n displayMode: initialDisplayMode = 'inline',\n colorScheme: initialColorScheme = 'dark',\n toolInput = {},\n toolOutput = null,\n widgetState: initialWidgetState = null,\n userMessage = 'Show me some recommendations',\n showControls = true,\n uiSimulations,\n initialUISimulation,\n}: ChatGPTSimulatorProps) {\n const [displayMode, setDisplayMode] = useState<DisplayMode>(initialDisplayMode);\n const [widgetState, setWidgetStateInternal] = useState<Record<string, unknown> | null>(\n initialWidgetState\n );\n const [bodyWidth, setBodyWidth] = useState<string>('100%');\n const [selectedUISimulation, setSelectedUISimulation] = useState<string>(\n initialUISimulation || uiSimulations?.[0] || ''\n );\n const [viewportHeight, setViewportHeight] = useState<number>(window.innerHeight);\n\n // Sync colorScheme with window.openai.colorScheme as source of truth\n const [colorScheme, setColorScheme] = useState<Theme>(initialColorScheme);\n\n // Listen to changes in window.openai.colorScheme\n useEffect(() => {\n const handleSetGlobals = (event: Event) => {\n const customEvent = event as SetGlobalsEvent;\n if (customEvent.detail?.globals?.colorScheme) {\n setColorScheme(customEvent.detail.globals.colorScheme);\n }\n };\n\n window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobals);\n return () => window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobals);\n }, []);\n\n // Track viewport height for fullscreen mode\n useEffect(() => {\n const handleResize = () => {\n setViewportHeight(window.innerHeight);\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Initialize window.openai\n useEffect(() => {\n // In fullscreen, subtract input bar height (~80px) from viewport\n const inputBarHeight = 80;\n const openaiGlobals: ChatGPTGlobals = {\n colorScheme,\n displayMode,\n locale: 'en-US',\n maxHeight: displayMode === 'fullscreen' ? viewportHeight - inputBarHeight : 600,\n userAgent: {\n device: { type: 'desktop' },\n capabilities: { hover: true, touch: false },\n },\n safeArea: {\n insets: { top: 0, bottom: 0, left: 0, right: 0 },\n },\n toolInput,\n toolOutput,\n toolResponseMetadata: null,\n widgetState,\n setWidgetState: async (state: Record<string, unknown>) => {\n console.log('[ChatGPT Simulator] setWidgetState called:', state);\n setWidgetStateInternal(state);\n },\n };\n\n const openaiAPI = {\n callTool: async (name: string, args: Record<string, unknown>) => {\n console.log('[ChatGPT Simulator] callTool called:', name, args);\n return { result: 'Mock tool result' };\n },\n sendFollowUpMessage: async (args: { prompt: string }) => {\n console.log('[ChatGPT Simulator] sendFollowUpMessage called:', args);\n },\n openExternal: (payload: { href: string }) => {\n console.log('[ChatGPT Simulator] openExternal called:', payload);\n window.open(payload.href, '_blank');\n },\n requestDisplayMode: async (args: { mode: DisplayMode }) => {\n console.log('[ChatGPT Simulator] requestDisplayMode called:', args);\n setDisplayMode(args.mode);\n return { mode: args.mode };\n },\n };\n\n window.openai = { ...openaiGlobals, ...openaiAPI };\n\n // Dispatch initial event\n window.dispatchEvent(\n new CustomEvent(SET_GLOBALS_EVENT_TYPE, {\n detail: { globals: openaiGlobals },\n }) as SetGlobalsEvent\n );\n\n return () => {\n delete window.openai;\n };\n }, [colorScheme, displayMode, toolInput, toolOutput, widgetState, viewportHeight]);\n\n // Update window.openai when state changes\n useEffect(() => {\n if (window.openai) {\n const inputBarHeight = 80;\n const calculatedMaxHeight = displayMode === 'fullscreen' ? viewportHeight - inputBarHeight : 600;\n\n window.openai.colorScheme = colorScheme;\n window.openai.displayMode = displayMode;\n window.openai.widgetState = widgetState;\n window.openai.maxHeight = calculatedMaxHeight;\n\n window.dispatchEvent(\n new CustomEvent(SET_GLOBALS_EVENT_TYPE, {\n detail: {\n globals: { colorScheme, displayMode, widgetState, maxHeight: calculatedMaxHeight },\n },\n }) as SetGlobalsEvent\n );\n }\n }, [colorScheme, displayMode, widgetState, viewportHeight]);\n\n const isFullscreen = displayMode === 'fullscreen';\n\n // Render children based on whether it's a function or ReactNode\n const renderChildren = () => {\n if (typeof children === 'function') {\n return children(selectedUISimulation);\n }\n return children;\n };\n\n return (\n <div className={`chatgpt-simulator chatgpt-simulator--${colorScheme}`} data-display-mode={displayMode}>\n {showControls && (\n <div className=\"chatgpt-simulator__sidebar\">\n <div className=\"chatgpt-simulator__sidebar-header\">\n <h2>Controls</h2>\n </div>\n <div className=\"chatgpt-simulator__control-group\">\n {uiSimulations && uiSimulations.length > 0 && (\n <label>\n App UI\n <select\n value={selectedUISimulation}\n onChange={(e) => setSelectedUISimulation(e.target.value)}\n >\n {uiSimulations.map((simulation) => (\n <option key={simulation} value={simulation}>\n {simulation}\n </option>\n ))}\n </select>\n </label>\n )}\n <label>\n Color Scheme\n <select value={colorScheme} onChange={(e) => setColorScheme(e.target.value as Theme)}>\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </label>\n <label>\n Display Mode\n <select\n value={displayMode}\n onChange={(e) => setDisplayMode(e.target.value as DisplayMode)}\n >\n <option value=\"inline\">Inline</option>\n <option value=\"fullscreen\">Fullscreen</option>\n <option value=\"pip\">Picture-in-Picture</option>\n </select>\n </label>\n <label>\n Body Width\n <select value={bodyWidth} onChange={(e) => setBodyWidth(e.target.value)}>\n <option value=\"100%\">100% (Full)</option>\n <option value=\"1024px\">1024px (Laptop)</option>\n <option value=\"768px\">768px (Tablet)</option>\n <option value=\"425px\">425px (Mobile L)</option>\n <option value=\"320px\">320px (Mobile S)</option>\n </select>\n </label>\n </div>\n </div>\n )}\n\n <div className=\"chatgpt-simulator__main\" style={{ width: bodyWidth, maxWidth: bodyWidth }}>\n {isFullscreen && (\n <button\n className=\"chatgpt-simulator__close-button\"\n onClick={() => setDisplayMode('inline')}\n aria-label=\"Exit fullscreen\"\n type=\"button\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </button>\n )}\n\n {!isFullscreen && (\n <div className=\"chatgpt-simulator__header\">\n <h1>ChatGPT</h1>\n </div>\n )}\n\n <div className=\"[--thread-content-max-width:40rem] thread-lg:[--thread-content-max-width:48rem] mx-auto max-w-[var(--thread-content-max-width)] flex-1 relative flex w-full min-w-0 flex-col\">\n <div className=\"flex max-w-full flex-col grow\">\n {!isFullscreen && (\n <>\n {/* User Message */}\n <div className=\"chatgpt-simulator__message chatgpt-simulator__message--user\">\n <div className=\"chatgpt-simulator__message-content\">{userMessage}</div>\n </div>\n\n {/* Assistant Message with Component */}\n <div className=\"min-h-8 relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal\">\n <div className=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n <div className=\"w-full break-words\">\n {/* App Title */}\n <div className=\"chatgpt-simulator__app-title\">\n <span className=\"chatgpt-simulator__app-icon\">✈️</span>\n <span className=\"chatgpt-simulator__app-name\">Splorin</span>\n </div>\n <div className=\"chatgpt-simulator__component-slot\">{renderChildren()}</div>\n </div>\n </div>\n </div>\n </>\n )}\n {isFullscreen && (\n <div className=\"chatgpt-simulator__fullscreen-content\">\n {renderChildren()}\n </div>\n )}\n </div>\n </div>\n <div className=\"chatgpt-simulator__input-container\">\n <input\n type=\"text\"\n className=\"chatgpt-simulator__input\"\n placeholder=\"Message ChatGPT\"\n disabled\n />\n </div>\n </div>\n </div>\n );\n}\n"]}