sunpeak 0.1.25 → 0.2.2
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/README.md +9 -76
- package/bin/sunpeak.js +87 -0
- package/dist/index.cjs +827 -1361
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +98 -589
- package/dist/index.d.ts +98 -589
- package/dist/index.js +795 -1337
- package/dist/index.js.map +1 -1
- package/dist/styles/chatgpt/index.css +146 -0
- package/dist/styles/globals.css +220 -0
- package/package.json +34 -36
- package/template/.prettierignore +4 -0
- package/template/.prettierrc +9 -0
- package/template/README.md +47 -0
- package/template/assets/favicon.ico +0 -0
- package/template/components.json +21 -0
- package/template/dev/main.tsx +65 -0
- package/template/dev/styles.css +5 -0
- package/template/eslint.config.cjs +49 -0
- package/template/index.html +13 -0
- package/template/package.json +56 -0
- package/template/src/App.tsx +45 -0
- package/template/src/components/index.ts +2 -0
- package/template/src/components/shadcn/button.tsx +60 -0
- package/template/src/components/shadcn/card.tsx +76 -0
- package/template/src/components/shadcn/carousel.tsx +260 -0
- package/template/src/components/shadcn/index.ts +5 -0
- package/template/src/components/shadcn/label.tsx +24 -0
- package/template/src/components/shadcn/select.tsx +157 -0
- package/template/src/components/sunpeak-card.test.tsx +76 -0
- package/template/src/components/sunpeak-card.tsx +140 -0
- package/template/src/components/sunpeak-carousel.test.tsx +42 -0
- package/template/src/components/sunpeak-carousel.tsx +126 -0
- package/template/src/index.ts +3 -0
- package/template/src/lib/index.ts +1 -0
- package/template/src/lib/utils.ts +6 -0
- package/template/src/styles/chatgpt.css +146 -0
- package/template/src/styles/globals.css +220 -0
- package/template/src/test/setup.ts +37 -0
- package/template/tsconfig.json +32 -0
- package/template/tsconfig.node.json +11 -0
- package/template/tsup.config.ts +23 -0
- package/template/vite.config.ts +35 -0
- package/template/vitest.config.ts +15 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/themes/base.ts","../src/themes/chatgpt.ts","../src/themes/index.ts","../src/components/GenAI/GenAI.tsx","../src/components/ChatGPTSimulator/ChatGPTSimulator.tsx"],"names":["children","jsx","useState","useTheme","useEffect","cardWidth","jsxs","Box","createTheme","ThemeProvider","IconButton"],"mappings":"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","file":"index.js","sourcesContent":["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 { Button, type ButtonProps as MuiButtonProps, Box, useTheme } from '@mui/material';\nimport { useRequestDisplayMode, useDisplayMode, useMaxHeight, useWidgetState } from '../../hooks';\nimport type { GenAIProps } from '../GenAI';\n\nexport interface ButtonProps extends Omit<MuiButtonProps, 'onClick'> {\n /**\n * Whether to use primary styling (accent color) or secondary (outlined)\n */\n isPrimary?: boolean;\n /**\n * Click handler (required)\n */\n onClick: () => void;\n}\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 * - Fixed width 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 className,\n onClick,\n id,\n ...props\n}: CardProps) => {\n const requestDisplayMode = useRequestDisplayMode();\n const displayMode = useDisplayMode();\n const maxHeight = useMaxHeight();\n const theme = useTheme();\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 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 const renderButton = (buttonProps: ButtonProps) => {\n const { isPrimary = false, onClick: buttonOnClick, children, ...muiProps } = buttonProps;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n buttonOnClick();\n };\n\n return (\n <Button\n {...muiProps}\n variant={isPrimary ? 'contained' : 'outlined'}\n onClick={handleClick}\n >\n {children}\n </Button>\n );\n };\n\n return (\n <Box\n id={id}\n className={className}\n onClick={handleCardClick}\n sx={{\n backgroundColor: theme.palette.background.default,\n borderRadius: theme.spacing(3),\n overflow: 'auto',\n display: 'flex',\n flexDirection: 'column',\n fontFamily: theme.typography.fontFamily,\n width: isInline ? '220px' : '100%',\n maxWidth: isInline ? '220px' : `${imageMaxWidth}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n cursor: isInline ? 'pointer' : 'default',\n userSelect: 'none',\n marginLeft: isInline ? undefined : 'auto',\n marginRight: isInline ? undefined : 'auto',\n ...(variant === 'bordered' && {\n border: `1px solid ${theme.palette.divider}`,\n }),\n ...(variant === 'elevated' && {\n boxShadow: theme.shadows[2],\n border: `1px solid ${theme.palette.divider}`,\n }),\n }}\n {...props}\n >\n {image && (\n <Box>\n <Box\n component=\"img\"\n src={image}\n alt={imageAlt}\n loading=\"lazy\"\n sx={{\n width: '100%',\n height: 'auto',\n aspectRatio: '1',\n objectFit: 'cover',\n borderRadius: theme.spacing(3),\n display: 'block',\n maxWidth: `${imageMaxWidth}px`,\n maxHeight: `${imageMaxHeight}px`,\n }}\n />\n </Box>\n )}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n gap: isInline ? theme.spacing(3) : theme.spacing(4),\n padding: isInline ? theme.spacing(4) : theme.spacing(6),\n ...(image && {\n paddingTop: isInline ? theme.spacing(3) : theme.spacing(4),\n }),\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n gap: isInline ? theme.spacing(1) : theme.spacing(2),\n }}\n >\n {header && (\n <Box\n sx={{\n fontSize: theme.typography.body1.fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n color: theme.palette.text.primary,\n lineHeight: 1.25,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {header}\n </Box>\n )}\n {metadata && (\n <Box\n sx={{\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n lineHeight: 1.5,\n }}\n >\n {metadata}\n </Box>\n )}\n {children && (\n <Box\n sx={{\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n lineHeight: 1.5,\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n ...(isInline && (metadata || header) && {\n marginTop: theme.spacing(1),\n WebkitLineClamp: 2,\n }),\n ...(!isInline && (metadata || header) && {\n marginTop: theme.spacing(2),\n WebkitLineClamp: 'unset',\n }),\n }}\n >\n {children}\n </Box>\n )}\n </Box>\n {hasButtons && (\n <Box\n sx={{\n display: 'flex',\n gap: theme.spacing(2),\n flexWrap: 'wrap',\n }}\n >\n {button1 && renderButton(button1)}\n {button2 && renderButton(button2)}\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n","import { type ReactNode, type HTMLAttributes, useRef, useState, useEffect, Children } from 'react';\nimport { Box, IconButton, useTheme } from '@mui/material';\nimport { useMaxHeight, useDisplayMode } from '../../hooks';\nimport type { GenAIProps } from '../GenAI';\n\nconst ChevronLeftIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\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);\n\nconst ChevronRightIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\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);\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 * Card width configuration. Can be a single number or an object specifying inline and fullscreen widths.\n * @default { inline: 220, fullscreen: 340 }\n */\n cardWidth?: number | { inline?: number; fullscreen?: number };\n}\n\n/**\n * Carousel - MUI-based carousel for displaying cards side-by-side.\n * Follows OpenAI ChatGPT Apps SDK design guidelines.\n */\nexport const Carousel = ({\n children,\n gap = 16,\n maxWidth = 800,\n showArrows = true,\n showEdgeGradients = true,\n cardWidth: cardWidthProp,\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 displayMode = useDisplayMode();\n const theme = useTheme();\n\n const isFullscreen = displayMode === 'fullscreen';\n\n // Calculate card width based on display mode and configuration\n const getCardWidth = (): number => {\n if (typeof cardWidthProp === 'number') {\n return cardWidthProp;\n }\n if (typeof cardWidthProp === 'object') {\n return isFullscreen\n ? (cardWidthProp.fullscreen ?? 340)\n : (cardWidthProp.inline ?? 220);\n }\n // Default widths\n return isFullscreen ? 340 : 220;\n };\n\n const cardWidth = getCardWidth();\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 return (\n <Box\n className={className}\n sx={{\n position: 'relative',\n width: '100%',\n maxWidth: `${maxWidth}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n }}\n {...props}\n >\n <Box sx={{ overflow: 'hidden' }}>\n <Box\n ref={scrollRef}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUpOrLeave}\n onMouseLeave={handleMouseUpOrLeave}\n sx={{\n display: 'flex',\n gap: `${gap}px`,\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollBehavior: isDragging ? 'auto' : 'smooth',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n userSelect: 'none',\n cursor: isDragging ? 'grabbing' : 'grab',\n '&::-webkit-scrollbar': {\n display: 'none',\n },\n }}\n >\n {Children.map(children, (child) => (\n <Box\n sx={{\n flexShrink: 0,\n width: `${cardWidth}px`,\n '& > *': {\n width: '100%',\n maxWidth: '100%',\n },\n }}\n >\n {child}\n </Box>\n ))}\n </Box>\n </Box>\n\n {/* Edge gradients */}\n {showEdgeGradients && canScrollLeft && (\n <Box\n aria-hidden=\"true\"\n sx={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n width: '80px',\n pointerEvents: 'none',\n background: `linear-gradient(to right, ${theme.palette.background.default} 0%, transparent 100%)`,\n opacity: canScrollLeft ? 1 : 0,\n transition: 'opacity 0.2s ease',\n zIndex: 1,\n }}\n />\n )}\n\n {showEdgeGradients && canScrollRight && (\n <Box\n aria-hidden=\"true\"\n sx={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n width: '80px',\n pointerEvents: 'none',\n background: `linear-gradient(to left, ${theme.palette.background.default} 0%, transparent 100%)`,\n opacity: canScrollRight ? 1 : 0,\n transition: 'opacity 0.2s ease',\n zIndex: 1,\n }}\n />\n )}\n\n {/* Navigation buttons */}\n {showArrows && canScrollLeft && (\n <IconButton\n aria-label=\"Previous\"\n onClick={() => scroll('left')}\n sx={{\n position: 'absolute',\n top: '50%',\n left: theme.spacing(0.5),\n transform: 'translateY(-50%)',\n width: 32,\n height: 32,\n backgroundColor: theme.palette.background.default,\n boxShadow: theme.shadows[2],\n zIndex: 2,\n '&:hover': {\n boxShadow: theme.shadows[3],\n transform: 'translateY(-50%) scale(1.05)',\n },\n '&:active': {\n transform: 'translateY(-50%) scale(0.95)',\n },\n transition: 'all 0.2s ease',\n }}\n >\n <ChevronLeftIcon />\n </IconButton>\n )}\n\n {showArrows && canScrollRight && (\n <IconButton\n aria-label=\"Next\"\n onClick={() => scroll('right')}\n sx={{\n position: 'absolute',\n top: '50%',\n right: theme.spacing(0.5),\n transform: 'translateY(-50%)',\n width: 32,\n height: 32,\n backgroundColor: theme.palette.background.default,\n boxShadow: theme.shadows[2],\n zIndex: 2,\n '&:hover': {\n boxShadow: theme.shadows[3],\n transform: 'translateY(-50%) scale(1.05)',\n },\n '&:active': {\n transform: 'translateY(-50%) scale(0.95)',\n },\n transition: 'all 0.2s ease',\n }}\n >\n <ChevronRightIcon />\n </IconButton>\n )}\n </Box>\n );\n};\n","/**\n * Base Theme Configuration\n *\n * Common theme configuration shared across all platforms.\n * Platform-specific themes extend this base configuration.\n */\n\nimport { createTheme, type ThemeOptions } from '@mui/material/styles';\n\n/**\n * Base theme options that all platform themes extend\n */\nexport const baseThemeOptions: ThemeOptions = {\n spacing: 4, // 4px base unit\n\n shape: {\n borderRadius: 8, // Default border radius in pixels\n },\n\n typography: {\n fontFamily: [\n '-apple-system',\n 'BlinkMacSystemFont',\n '\"Segoe UI\"',\n 'Roboto',\n '\"Helvetica Neue\"',\n 'Arial',\n 'sans-serif',\n ].join(','),\n },\n\n // Common breakpoints for responsive design\n breakpoints: {\n values: {\n xs: 0,\n sm: 600,\n md: 900,\n lg: 1200,\n xl: 1536,\n },\n },\n};\n\n/**\n * Creates a base theme with common configuration\n */\nexport const createBaseTheme = () => createTheme(baseThemeOptions);\n","/**\n * ChatGPT Theme\n *\n * Material UI theme implementing OpenAI ChatGPT Apps SDK design guidelines.\n *\n * @see https://developers.openai.com/apps-sdk/concepts/design-guidelines\n */\n\nimport { createTheme } from '@mui/material/styles';\nimport { baseThemeOptions } from './base';\n\n/**\n * ChatGPT Light Mode Colors\n */\nconst lightPalette = {\n mode: 'light' as const,\n primary: {\n main: '#f46c21',\n dark: '#d45e1c',\n light: 'rgba(244, 108, 33, 0.9)',\n contrastText: '#ffffff',\n },\n secondary: {\n main: '#5d5d5d',\n contrastText: '#ffffff',\n },\n error: {\n main: '#e02e2a',\n contrastText: '#ffffff',\n },\n warning: {\n main: '#e25507',\n contrastText: '#ffffff',\n },\n info: {\n main: '#0285ff',\n contrastText: '#ffffff',\n },\n success: {\n main: '#008635',\n contrastText: '#ffffff',\n },\n background: {\n default: '#ffffff',\n paper: '#f3f3f3',\n },\n text: {\n primary: '#0d0d0d',\n secondary: '#5d5d5d',\n disabled: '#8f8f8f',\n },\n divider: 'rgba(0, 0, 0, 0.15)',\n action: {\n hover: 'rgba(0, 0, 0, 0.04)',\n selected: 'rgba(0, 0, 0, 0.08)',\n disabled: '#8f8f8f',\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n },\n grey: {\n 50: '#f3f3f3',\n 100: '#e8e8e8',\n 200: 'rgba(0, 0, 0, 0.05)',\n 300: 'rgba(0, 0, 0, 0.15)',\n 400: '#8f8f8f',\n 500: '#5d5d5d',\n 900: '#0d0d0d',\n },\n};\n\n/**\n * ChatGPT Dark Mode Colors\n */\nconst darkPalette = {\n mode: 'dark' as const,\n primary: {\n main: '#f46c21',\n dark: '#d45e1c',\n light: 'rgba(244, 108, 33, 0.9)',\n contrastText: '#ffffff',\n },\n secondary: {\n main: '#cdcdcd',\n contrastText: '#212121',\n },\n error: {\n main: '#ff8583',\n contrastText: '#212121',\n },\n warning: {\n main: '#ff9e6c',\n contrastText: '#212121',\n },\n info: {\n main: '#0285ff',\n contrastText: '#ffffff',\n },\n success: {\n main: '#40c977',\n contrastText: '#212121',\n },\n background: {\n default: '#212121',\n paper: '#414141',\n },\n text: {\n primary: '#ffffff',\n secondary: '#cdcdcd',\n disabled: '#afafaf',\n },\n divider: 'rgba(0, 0, 0, 0.15)',\n action: {\n hover: 'rgba(255, 255, 255, 0.08)',\n selected: 'rgba(255, 255, 255, 0.16)',\n disabled: '#afafaf',\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\n },\n grey: {\n 50: '#414141',\n 100: '#303030',\n 200: 'rgba(0, 0, 0, 0.05)',\n 300: 'rgba(0, 0, 0, 0.15)',\n 400: '#afafaf',\n 500: '#cdcdcd',\n 900: '#ffffff',\n 800: '#212121',\n },\n};\n\n/**\n * ChatGPT Typography System\n * System font stack with platform-native fonts\n */\nconst typography = {\n fontFamily: [\n '-apple-system',\n 'BlinkMacSystemFont',\n '\"Segoe UI\"',\n 'Roboto',\n '\"Helvetica Neue\"',\n 'Arial',\n 'sans-serif',\n ].join(','),\n fontSize: 16,\n fontWeightLight: 300,\n fontWeightRegular: 400,\n fontWeightMedium: 500,\n fontWeightBold: 600,\n h1: {\n fontSize: '1.25rem',\n fontWeight: 600,\n lineHeight: 1.25,\n },\n h2: {\n fontSize: '1.125rem',\n fontWeight: 600,\n lineHeight: 1.25,\n },\n h3: {\n fontSize: '1rem',\n fontWeight: 600,\n lineHeight: 1.25,\n },\n h4: {\n fontSize: '1rem',\n fontWeight: 500,\n lineHeight: 1.25,\n },\n h5: {\n fontSize: '0.875rem',\n fontWeight: 600,\n lineHeight: 1.25,\n },\n h6: {\n fontSize: '0.75rem',\n fontWeight: 600,\n lineHeight: 1.25,\n },\n body1: {\n fontSize: '1rem',\n lineHeight: 1.5,\n },\n body2: {\n fontSize: '0.875rem',\n lineHeight: 1.5,\n },\n button: {\n fontSize: '0.875rem',\n fontWeight: 500,\n lineHeight: 1.25,\n textTransform: 'none' as const,\n },\n caption: {\n fontSize: '0.75rem',\n lineHeight: 1.5,\n },\n overline: {\n fontSize: '0.75rem',\n fontWeight: 500,\n lineHeight: 1.5,\n textTransform: 'uppercase' as const,\n },\n};\n\n/**\n * ChatGPT Spacing System\n * 4px base unit (1 unit = 4px)\n */\nconst spacing = 4;\n\n/**\n * ChatGPT Shape/Border Radius\n */\nconst shape = {\n borderRadius: 8,\n};\n\n/**\n * ChatGPT Shadows\n */\nconst shadows: [\n 'none',\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n] = [\n 'none',\n '0px 1px 2px rgba(0, 0, 0, 0.05)',\n '0px 2px 6px rgba(0, 0, 0, 0.06)',\n '0px 4px 12px rgba(0, 0, 0, 0.1)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n '0px 8px 24px rgba(0, 0, 0, 0.12)',\n];\n\n/**\n * Component-specific overrides following ChatGPT design guidelines\n */\nconst components = {\n MuiButton: {\n styleOverrides: {\n root: {\n borderRadius: '0.5rem',\n padding: '0.375rem 1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n textTransform: 'none' as const,\n transition: 'all 0.2s ease',\n },\n contained: {\n boxShadow: 'none',\n '&:hover': {\n boxShadow: 'none',\n },\n },\n },\n },\n MuiCard: {\n styleOverrides: {\n root: {\n borderRadius: '0.75rem',\n overflow: 'hidden',\n },\n },\n },\n MuiPaper: {\n styleOverrides: {\n rounded: {\n borderRadius: '0.75rem',\n },\n },\n },\n};\n\n/**\n * Create ChatGPT Light Theme\n */\nexport const chatgptLightTheme = createTheme({\n ...baseThemeOptions,\n palette: lightPalette,\n typography,\n spacing,\n shape,\n shadows,\n components,\n});\n\n/**\n * Create ChatGPT Dark Theme\n */\nexport const chatgptDarkTheme = createTheme({\n ...baseThemeOptions,\n palette: darkPalette,\n typography,\n spacing,\n shape,\n shadows,\n components,\n});\n\n/**\n * Get ChatGPT theme based on mode\n */\nexport const getChatGPTTheme = (mode: 'light' | 'dark') => {\n return mode === 'dark' ? chatgptDarkTheme : chatgptLightTheme;\n};\n","/**\n * Theme System - Multi-Platform Support\n *\n * This module provides build-time theme substitution for multi-platform support.\n * The active theme is determined by the SUNPEAK_PLATFORM environment variable.\n *\n * Supported platforms:\n * - chatgpt (default): OpenAI ChatGPT Apps SDK\n * - Add more platforms as needed\n *\n * Usage:\n * ```bash\n * # Build for ChatGPT platform (default)\n * SUNPEAK_PLATFORM=chatgpt npm run build\n *\n * # Build for another platform (future)\n * SUNPEAK_PLATFORM=gemini npm run build\n * ```\n */\n\nimport type { Theme } from '@mui/material/styles';\n\n// Platform theme imports\nimport { getChatGPTTheme, chatgptLightTheme, chatgptDarkTheme } from './chatgpt';\n\n/**\n * Platform identifier type\n */\nexport type Platform = 'chatgpt';\n\n/**\n * Get the current platform\n * Currently only supports 'chatgpt'\n * Future: Can be extended to support multiple platforms via build-time configuration\n */\nexport const getCurrentPlatform = (): Platform => {\n return 'chatgpt';\n};\n\n/**\n * Theme getter function type\n */\nexport type ThemeGetter = (mode: 'light' | 'dark') => Theme;\n\n/**\n * Platform theme registry\n * Maps platform names to their theme getter functions\n */\nconst platformThemes: Record<Platform, ThemeGetter> = {\n chatgpt: getChatGPTTheme,\n // Add more platforms here:\n // gemini: getGeminiTheme,\n // claude: getClaudeTheme,\n};\n\n/**\n * Get theme for current platform\n * This is the main function used by components\n *\n * @param mode - Light or dark mode\n * @returns MUI Theme object for the current platform\n */\nexport const getTheme = (mode: 'light' | 'dark'): Theme => {\n const platform = getCurrentPlatform();\n const themeGetter = platformThemes[platform];\n\n if (!themeGetter) {\n console.warn(`Unknown platform \"${platform}\", falling back to chatgpt theme`);\n return getChatGPTTheme(mode);\n }\n\n return themeGetter(mode);\n};\n\n/**\n * Get light theme for current platform\n */\nexport const getLightTheme = (): Theme => getTheme('light');\n\n/**\n * Get dark theme for current platform\n */\nexport const getDarkTheme = (): Theme => getTheme('dark');\n\n// Export specific platform themes for direct access if needed\nexport { chatgptLightTheme, chatgptDarkTheme, getChatGPTTheme };\n\n// Export base theme utilities\nexport { baseThemeOptions, createBaseTheme } from './base';\n\n// Export types\nexport type { Theme } from '@mui/material/styles';\n","import { type ReactNode, type HTMLAttributes } from 'react';\nimport { Box } from '@mui/material';\nimport { ThemeProvider } from '@mui/material/styles';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { useMaxHeight, useColorScheme } from '../../hooks';\nimport { getTheme } from '../../themes';\n\nexport interface GenAIProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Maximum width in pixels\n * @default 800\n */\n maxWidth?: number;\n\n /**\n * Override the color scheme detection\n * If not provided, uses window.openai.colorScheme\n */\n mode?: 'light' | 'dark';\n\n /**\n * Whether to inject MUI's CssBaseline component\n * @default true\n */\n enableCssBaseline?: boolean;\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 * This is the single interface for building genAI Apps. It automatically provides:\n * - MUI theming (light/dark mode from platform)\n * - Platform constraints (maxHeight)\n * - Color scheme information\n *\n * @example\n * ```tsx\n * export const MyApp = GenAI(({ maxHeight, colorScheme }) => (\n * <div>\n * <h2>My App</h2>\n * <p>Theme: {colorScheme}</p>\n * <p>Max height: {maxHeight}px</p>\n * </div>\n * ));\n * ```\n */\nexport function GenAI(\n renderFn: (props: GenAIRenderProps) => ReactNode\n) {\n const GenAIComponent = (props: GenAIProps = {}) => {\n const maxHeight = useMaxHeight();\n const detectedColorScheme = useColorScheme();\n const {\n className,\n maxWidth = 800,\n mode: overrideMode,\n enableCssBaseline = true,\n ...rest\n } = props;\n\n // Determine effective color scheme\n const colorScheme = overrideMode || detectedColorScheme || 'light';\n\n const theme = getTheme(colorScheme);\n\n return (\n <ThemeProvider theme={theme}>\n {enableCssBaseline && <CssBaseline />}\n <Box\n className={className}\n sx={{\n maxWidth: `${maxWidth}px`,\n maxHeight: maxHeight ? `${maxHeight}px` : undefined,\n }}\n {...rest}\n >\n {renderFn({ maxHeight, colorScheme })}\n </Box>\n </ThemeProvider>\n );\n };\n\n GenAIComponent.displayName = 'GenAI';\n return GenAIComponent;\n}\n","import { useEffect, useState, type ReactNode } from 'react';\nimport {\n Box,\n Typography,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n TextField,\n IconButton,\n} from '@mui/material';\nimport { ThemeProvider } from '@mui/material/styles';\nimport CloseIcon from '@mui/icons-material/Close';\nimport type { DisplayMode, Theme, ChatGPTGlobals } from '../../types';\nimport { SET_GLOBALS_EVENT_TYPE, SetGlobalsEvent } from '../../types/chatgpt';\nimport { getTheme } from '../../themes';\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 const theme = getTheme(colorScheme);\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 <ThemeProvider theme={theme}>\n <Box\n sx={{\n minHeight: '100vh',\n width: '100vw',\n display: 'flex',\n fontFamily: theme.typography.fontFamily,\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n boxSizing: 'border-box',\n '@media (max-width: 768px)': {\n flexDirection: 'column',\n },\n }}\n >\n {showControls && (\n <Box\n sx={{\n width: '250px',\n flexShrink: 0,\n padding: theme.spacing(5),\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(5),\n overflowY: 'auto',\n backgroundColor: theme.palette.mode === 'light'\n ? theme.palette.background.paper\n : theme.palette.background.default,\n borderRight: `1px solid ${theme.palette.divider}`,\n boxSizing: 'border-box',\n '@media (max-width: 768px)': {\n width: '100%',\n borderRight: 'none',\n borderBottom: `1px solid ${theme.palette.divider}`,\n padding: theme.spacing(4),\n },\n }}\n >\n <Box>\n <Typography variant=\"h6\" sx={{ fontWeight: 600 }}>\n Controls\n </Typography>\n </Box>\n\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: theme.spacing(3) }}>\n {uiSimulations && uiSimulations.length > 0 && (\n <FormControl fullWidth size=\"small\">\n <InputLabel>App UI</InputLabel>\n <Select\n value={selectedUISimulation}\n onChange={(e) => setSelectedUISimulation(e.target.value)}\n label=\"App UI\"\n >\n {uiSimulations.map((simulation) => (\n <MenuItem key={simulation} value={simulation}>\n {simulation}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )}\n\n <FormControl fullWidth size=\"small\">\n <InputLabel>Color Scheme</InputLabel>\n <Select\n value={colorScheme}\n onChange={(e) => setColorScheme(e.target.value as Theme)}\n label=\"Color Scheme\"\n >\n <MenuItem value=\"light\">Light</MenuItem>\n <MenuItem value=\"dark\">Dark</MenuItem>\n </Select>\n </FormControl>\n\n <FormControl fullWidth size=\"small\">\n <InputLabel>Display Mode</InputLabel>\n <Select\n value={displayMode}\n onChange={(e) => setDisplayMode(e.target.value as DisplayMode)}\n label=\"Display Mode\"\n >\n <MenuItem value=\"inline\">Inline</MenuItem>\n <MenuItem value=\"fullscreen\">Fullscreen</MenuItem>\n <MenuItem value=\"pip\">Picture-in-Picture</MenuItem>\n </Select>\n </FormControl>\n\n <FormControl fullWidth size=\"small\">\n <InputLabel>Body Width</InputLabel>\n <Select\n value={bodyWidth}\n onChange={(e) => setBodyWidth(e.target.value)}\n label=\"Body Width\"\n >\n <MenuItem value=\"100%\">100% (Full)</MenuItem>\n <MenuItem value=\"1024px\">1024px (Laptop)</MenuItem>\n <MenuItem value=\"768px\">768px (Tablet)</MenuItem>\n <MenuItem value=\"425px\">425px (Mobile L)</MenuItem>\n <MenuItem value=\"320px\">320px (Mobile S)</MenuItem>\n </Select>\n </FormControl>\n </Box>\n </Box>\n )}\n\n <Box\n sx={{\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n padding: isFullscreen ? 0 : `${theme.spacing(4)} 0 ${theme.spacing(4)} ${theme.spacing(6)}`,\n position: 'relative',\n height: isFullscreen ? '100vh' : 'auto',\n boxSizing: 'border-box',\n }}\n >\n {isFullscreen && (\n <IconButton\n onClick={() => setDisplayMode('inline')}\n aria-label=\"Exit fullscreen\"\n sx={{\n position: 'absolute',\n top: theme.spacing(4),\n left: theme.spacing(4),\n width: 40,\n height: 40,\n backgroundColor: theme.palette.background.paper,\n zIndex: 10,\n '&:hover': {\n backgroundColor: theme.palette.mode === 'light'\n ? theme.palette.grey[200]\n : theme.palette.grey[800],\n },\n }}\n >\n <CloseIcon />\n </IconButton>\n )}\n\n {!isFullscreen && (\n <Box sx={{ mb: theme.spacing(4) }}>\n <Typography variant=\"h4\" sx={{ fontWeight: 600, margin: 0 }}>\n ChatGPT\n </Typography>\n </Box>\n )}\n\n <Box\n sx={{\n maxWidth: bodyWidth === '100%' ? '48rem' : bodyWidth,\n mx: 'auto',\n flex: 1,\n position: 'relative',\n display: 'flex',\n width: '100%',\n minWidth: 0,\n flexDirection: 'column',\n boxSizing: 'border-box',\n }}\n >\n <Box sx={{ display: 'flex', maxWidth: '100%', flexDirection: 'column', flexGrow: 1, minWidth: 0, boxSizing: 'border-box' }}>\n {!isFullscreen && (\n <>\n {/* User Message */}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'flex-end',\n marginLeft: 'auto',\n marginRight: theme.spacing(6),\n maxWidth: '70%',\n '@media (max-width: 768px)': {\n maxWidth: '85%',\n },\n }}\n >\n <Box\n sx={{\n flex: '0 1 auto',\n padding: `${theme.spacing(2)} ${theme.spacing(4)}`,\n borderRadius: theme.spacing(3),\n lineHeight: 1.5,\n fontSize: theme.typography.body1.fontSize,\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n minWidth: 0,\n backgroundColor: theme.palette.grey[100],\n color: theme.palette.text.primary,\n boxSizing: 'border-box',\n }}\n >\n {userMessage}\n </Box>\n </Box>\n\n {/* Assistant Message with Component */}\n <Box\n sx={{\n minHeight: '32px',\n position: 'relative',\n display: 'flex',\n width: '100%',\n minWidth: 0,\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: theme.spacing(2),\n textAlign: 'start',\n wordBreak: 'break-word',\n whiteSpace: 'normal',\n boxSizing: 'border-box',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n width: '100%',\n minWidth: 0,\n flexDirection: 'column',\n gap: theme.spacing(1),\n '&:empty': { display: 'none' },\n '&:first-of-type': { pt: '1px' },\n boxSizing: 'border-box',\n }}\n >\n <Box sx={{ width: '100%', minWidth: 0, wordBreak: 'break-word', boxSizing: 'border-box' }}>\n {/* App Title */}\n <Box\n sx={{\n color: theme.palette.text.secondary,\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n margin: `${theme.spacing(4)} 0`,\n fontSize: theme.typography.body2.fontSize,\n fontWeight: 500,\n opacity: 0.7,\n }}\n >\n <Box component=\"span\" sx={{ fontSize: theme.typography.body1.fontSize, lineHeight: 1 }}>\n ✈️\n </Box>\n <Box component=\"span\" sx={{ lineHeight: 1 }}>\n Splorin\n </Box>\n </Box>\n <Box\n sx={{\n overflow: 'hidden',\n width: '100%',\n minWidth: 0,\n boxSizing: 'border-box',\n }}\n >\n {renderChildren()}\n </Box>\n </Box>\n </Box>\n </Box>\n </>\n )}\n {isFullscreen && (\n <Box\n sx={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n minWidth: 0,\n height: '100%',\n overflowY: 'auto',\n paddingBottom: '80px',\n boxSizing: 'border-box',\n }}\n >\n {renderChildren()}\n </Box>\n )}\n </Box>\n <Box\n sx={{\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n margin: `${theme.spacing(4)} 0`,\n padding: `0 ${theme.spacing(10)} 0 ${theme.spacing(4)}`,\n display: 'flex',\n justifyContent: 'center',\n pointerEvents: 'none',\n boxSizing: 'border-box',\n }}\n >\n <TextField\n placeholder=\"Message ChatGPT\"\n disabled\n sx={{\n pointerEvents: 'auto',\n width: '100%',\n maxWidth: '800px',\n boxSizing: 'border-box',\n '& .MuiOutlinedInput-root': {\n borderRadius: theme.spacing(8),\n backgroundColor: theme.palette.grey[100],\n '& fieldset': {\n borderColor: theme.palette.mode === 'light'\n ? theme.palette.grey[300]\n : theme.palette.grey[700],\n },\n '&.Mui-disabled': {\n cursor: 'not-allowed',\n opacity: 0.6,\n },\n },\n '& .MuiInputBase-input::placeholder': {\n color: theme.palette.text.secondary,\n opacity: 0.7,\n },\n }}\n />\n </Box>\n </Box>\n </Box>\n </Box>\n </ThemeProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/theme-provider.tsx","../src/types/openai.ts","../src/types/simulator.ts","../src/hooks/use-openai-global.ts","../src/hooks/use-display-mode.ts","../src/hooks/use-max-height.ts","../src/hooks/use-mobile.ts","../src/hooks/use-theme.ts","../src/hooks/use-widget-state.ts","../src/lib/utils.ts","../src/components/shadcn/sheet.tsx","../src/components/shadcn/tooltip.tsx","../src/components/shadcn/sidebar.tsx","../src/components/shadcn/select.tsx","../src/components/shadcn/label.tsx","../src/components/simulator/conversation.tsx","../src/components/simulator/mock-openai.ts","../src/components/simulator/chatgpt-simulator.tsx"],"names":["React","React2","jsx","open","jsxs","React4","cva","Label","React5","useState","useMemo","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from \"react\"\n\ntype Theme = \"light\" | \"dark\"\n\ntype ThemeProviderProps = {\n children: React.ReactNode\n defaultTheme?: Theme\n theme?: Theme\n}\n\ntype ThemeProviderState = {\n theme: Theme\n}\n\nconst ThemeProviderContext = React.createContext<ThemeProviderState | undefined>(\n undefined\n)\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"light\",\n theme: controlledTheme,\n ...props\n}: ThemeProviderProps) {\n const [internalTheme] = React.useState<Theme>(defaultTheme)\n\n const theme = controlledTheme ?? internalTheme\n\n React.useEffect(() => {\n const root = window.document.documentElement\n root.classList.remove(\"light\", \"dark\")\n root.classList.add(theme)\n }, [theme])\n\n const value = {\n theme,\n }\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n )\n}\n\nexport const useThemeContext = () => {\n const context = React.useContext(ThemeProviderContext)\n\n if (context === undefined)\n throw new Error(\"useThemeContext must be used within a ThemeProvider\")\n\n return context\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\nexport type DisplayMode = 'pip' | 'inline' | 'fullscreen';\n\nexport type RequestDisplayMode = (args: { mode: DisplayMode }) => Promise<{\n mode: DisplayMode;\n}>;\n\nexport type CallToolResponse = {\n result: string;\n};\n\nexport type CallTool = (\n name: string,\n args: Record<string, unknown>\n) => Promise<CallToolResponse>;\n\nexport type OpenAiGlobals<\n ToolInput = UnknownObject,\n ToolOutput = UnknownObject,\n ToolResponseMetadata = UnknownObject,\n WidgetState = UnknownObject\n> = {\n theme: Theme;\n userAgent: UserAgent;\n locale: string;\n maxHeight: number;\n displayMode: DisplayMode;\n safeArea: SafeArea;\n toolInput: ToolInput;\n toolOutput: ToolOutput | null;\n toolResponseMetadata: ToolResponseMetadata | null;\n widgetState: WidgetState | null;\n setWidgetState: (state: WidgetState) => Promise<void>;\n};\n\nexport type OpenAiAPI = {\n callTool: CallTool;\n sendFollowUpMessage: (args: { prompt: string }) => Promise<void>;\n openExternal(payload: { href: string }): void;\n requestDisplayMode: RequestDisplayMode;\n};\n\nexport const SET_GLOBALS_EVENT_TYPE = 'openai:set_globals';\n\nexport class SetGlobalsEvent extends CustomEvent<{\n globals: Partial<OpenAiGlobals>;\n}> {\n readonly type = SET_GLOBALS_EVENT_TYPE;\n}\n\ndeclare global {\n interface Window {\n openai: OpenAiAPI & OpenAiGlobals;\n }\n\n interface WindowEventMap {\n [SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;\n }\n}\n","import { DisplayMode, Theme } from './openai';\n\nexport type ScreenWidth = 'mobile-s' | 'mobile-l' | 'tablet' | 'full';\n\nexport type SimulatorConfig = {\n theme: Theme;\n displayMode: DisplayMode;\n screenWidth: ScreenWidth;\n};\n\nexport const SCREEN_WIDTHS: Record<ScreenWidth, number> = {\n 'mobile-s': 375,\n 'mobile-l': 425,\n tablet: 768,\n full: 1024,\n};\n","import { useSyncExternalStore } from 'react';\nimport {\n SET_GLOBALS_EVENT_TYPE,\n SetGlobalsEvent,\n type OpenAiGlobals,\n} from '../types';\n\nexport function useOpenAiGlobal<K extends keyof OpenAiGlobals>(\n key: K\n): OpenAiGlobals[K] | null {\n return useSyncExternalStore(\n (onChange) => {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const handleSetGlobal = (event: SetGlobalsEvent) => {\n const value = event.detail.globals[key];\n if (value === undefined) {\n return;\n }\n\n onChange();\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 () => window.openai?.[key] ?? null,\n () => window.openai?.[key] ?? null\n );\n}\n","import { type DisplayMode } from '../types';\nimport { useOpenAiGlobal } from './use-openai-global';\n\nexport const useDisplayMode = (): DisplayMode | null => {\n return useOpenAiGlobal('displayMode');\n};\n","import { useOpenAiGlobal } from './use-openai-global';\n\nexport const useMaxHeight = (): number | null => {\n return useOpenAiGlobal('maxHeight');\n};\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n }\n mql.addEventListener(\"change\", onChange)\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return !!isMobile\n}\n","import { type Theme } from '../types';\nimport { useOpenAiGlobal } from './use-openai-global';\n\nexport const useTheme = (): Theme | null => {\n return useOpenAiGlobal('theme');\n};\n","import { useCallback, useMemo } from 'react';\nimport { useOpenAiGlobal } from './use-openai-global';\nimport type { UnknownObject } from '../types';\n\nexport function useWidgetState<T extends UnknownObject = UnknownObject>(): [\n T | null,\n (state: T) => Promise<void>\n] {\n const widgetState = useOpenAiGlobal('widgetState') as T | null;\n const setWidgetState = useOpenAiGlobal('setWidgetState');\n\n const setter = useCallback(\n async (state: T) => {\n if (setWidgetState) {\n await setWidgetState(state);\n }\n },\n [setWidgetState]\n );\n\n return useMemo(() => [widgetState, setter], [widgetState, setter]);\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"~/lib/index\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"~/lib/index\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { PanelLeftIcon } from \"lucide-react\"\n\nimport { useIsMobile } from \"~/hooks/use-mobile\"\nimport { cn } from \"~/lib/index\"\nimport { Button } from \"~/components/shadcn/button\"\nimport { Input } from \"~/components/shadcn/input\"\nimport { Separator } from \"~/components/shadcn/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"~/components/shadcn/sheet\"\nimport { Skeleton } from \"~/components/shadcn/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"~/components/shadcn/tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"bg-sidebar text-sidebar-foreground flex h-full w-(--sidebar-width) flex-col\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"bg-sidebar text-sidebar-foreground w-(--sidebar-width) p-0 [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n className=\"group peer text-sidebar-foreground hidden md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"bg-sidebar group-data-[variant=floating]:border-sidebar-border flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"bg-background relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"bg-background h-8 w-full shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"bg-sidebar-border mx-2 w-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-hidden transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-data-[sidebar=menu-action]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%` // eslint-disable-line\n }, [])\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground [&>svg]:text-sidebar-accent-foreground flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 outline-hidden focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"~/lib/index\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"~/lib/index\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import * as React from 'react';\nimport { cn } from '~/lib/index';\nimport { SidebarInset } from '../shadcn/sidebar';\nimport { SCREEN_WIDTHS, type ScreenWidth } from '../../types/simulator';\nimport type { DisplayMode } from '../../types';\n\ninterface ConversationProps {\n children: React.ReactNode;\n screenWidth: ScreenWidth;\n displayMode: DisplayMode;\n appName?: string;\n appIcon?: string;\n userMessage?: string;\n}\n\nexport function Conversation({\n children,\n screenWidth,\n displayMode,\n appName = 'ChatGPT',\n appIcon,\n userMessage = 'Show me some interesting places to visit.',\n}: ConversationProps) {\n const containerWidth =\n screenWidth === 'full' ? '100%' : `${SCREEN_WIDTHS[screenWidth]}px`;\n\n // Fullscreen mode: children take over the entire conversation area\n if (displayMode === 'fullscreen') {\n return (\n <SidebarInset className=\"flex flex-col bg-background\">\n <div className=\"flex-1 overflow-auto\">{children}</div>\n </SidebarInset>\n );\n }\n\n return (\n <SidebarInset className=\"flex flex-col bg-background\">\n {/* Header bar */}\n <header className=\"h-12 border-b border-border bg-background flex items-center px-4 text-lg\">\n <span className=\"text-foreground\">ChatGPT</span>\n </header>\n\n {/* Conversation container with configurable width */}\n <div\n className=\"flex flex-col flex-1 mx-auto w-full transition-all duration-200 overflow-hidden\"\n style={{ maxWidth: containerWidth }}\n >\n <main className=\"flex-1 overflow-y-auto overflow-x-hidden\">\n {/* User turn */}\n <article\n className=\"text-foreground w-full focus:outline-none\"\n dir=\"auto\"\n data-turn=\"user\"\n >\n <h5 className=\"sr-only\">You said:</h5>\n <div className=\"text-base my-auto mx-auto pt-12 px-4\">\n <div className=\"max-w-[48rem] mx-auto flex-1 relative flex w-full min-w-0 flex-col\">\n <div className=\"flex max-w-full flex-col grow\">\n <div\n data-message-author-role=\"user\"\n className=\"min-h-8 relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal\"\n >\n <div className=\"flex w-full flex-col gap-1 empty:hidden items-end\">\n <div className=\"bg-secondary text-secondary-foreground relative rounded-[18px] px-4 py-3 max-w-[70%]\">\n <div className=\"whitespace-pre-wrap\">{userMessage}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </article>\n\n {/* Assistant turn */}\n <article\n className=\"text-foreground w-full focus:outline-none\"\n dir=\"auto\"\n data-turn=\"assistant\"\n >\n <h6 className=\"sr-only\">{appName} said:</h6>\n <div className=\"text-base my-auto mx-auto pb-10 px-4\">\n <div className=\"max-w-[48rem] mx-auto flex-1 relative flex w-full min-w-0 flex-col\">\n <div className=\"flex max-w-full flex-col grow\">\n {/* Assistant avatar and name */}\n <div className=\"flex items-center gap-2 mb-3\">\n {appIcon ? (\n <div className=\"size-6 flex items-center justify-center text-base\">\n {appIcon}\n </div>\n ) : (\n <div className=\"size-6 rounded-full bg-primary flex items-center justify-center text-primary-foreground font-medium text-xs\">\n AI\n </div>\n )}\n <span className=\"font-semibold text-sm\">{appName}</span>\n </div>\n\n {/* Assistant message content */}\n <div\n data-message-author-role=\"assistant\"\n className=\"min-h-8 relative flex w-full flex-col items-start gap-2 text-start break-words whitespace-normal\"\n >\n <div className=\"flex w-full flex-col gap-1 empty:hidden\">\n {/* App UI content area - allows horizontal overflow for carousel */}\n <div\n className={cn(\n 'w-full overflow-x-auto',\n displayMode === 'pip' &&\n 'fixed bottom-20 right-6 z-50 w-80 rounded-xl shadow-xl border bg-card p-4 overflow-x-hidden'\n )}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </article>\n </main>\n\n {/* Input area */}\n <footer className=\"bg-background\">\n <div className=\"max-w-[48rem] mx-auto px-4 py-4\">\n <div className=\"relative\">\n <input\n type=\"text\"\n disabled\n placeholder=\"Message ChatGPT\"\n className=\"w-full bg-secondary text-secondary-foreground placeholder:text-muted-foreground rounded-3xl px-5 py-3 pr-12 outline-none\"\n />\n </div>\n </div>\n </footer>\n </div>\n </SidebarInset>\n );\n}\n","import {\n type OpenAiGlobals,\n type OpenAiAPI,\n type Theme,\n type DisplayMode,\n SET_GLOBALS_EVENT_TYPE,\n} from '../../types';\n\nclass MockOpenAI implements OpenAiAPI, OpenAiGlobals {\n\n theme: Theme = 'light';\n userAgent = {\n device: { type: 'desktop' as const },\n capabilities: {\n hover: true,\n touch: false,\n },\n };\n locale = 'en-US';\n maxHeight = 600;\n displayMode: DisplayMode = 'inline';\n safeArea = {\n insets: {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n },\n };\n toolInput = {};\n toolOutput = null;\n toolResponseMetadata = null;\n widgetState: Record<string, unknown> | null = null;\n\n async callTool(name: string, args: Record<string, unknown>) {\n console.log('Mock callTool:', name, args);\n return { result: JSON.stringify({ success: true }) };\n }\n\n async sendFollowUpMessage(args: { prompt: string }) {\n console.log('Mock sendFollowUpMessage:', args.prompt);\n }\n\n openExternal(payload: { href: string }) {\n console.log('Mock openExternal:', payload.href);\n window.open(payload.href, '_blank');\n }\n\n async requestDisplayMode(args: { mode: DisplayMode }) {\n this.setDisplayMode(args.mode);\n return { mode: args.mode };\n }\n\n async setWidgetState(state: Record<string, unknown>) {\n this.widgetState = state;\n this.emitUpdate({ widgetState: state });\n }\n\n setTheme(theme: Theme) {\n this.theme = theme;\n this.emitUpdate({ theme });\n }\n\n setDisplayMode(displayMode: DisplayMode) {\n this.displayMode = displayMode;\n this.emitUpdate({ displayMode });\n }\n\n private emitUpdate(globals: Partial<OpenAiGlobals>) {\n if (typeof window !== 'undefined') {\n const event = new CustomEvent(SET_GLOBALS_EVENT_TYPE, {\n detail: { globals },\n });\n window.dispatchEvent(event);\n }\n }\n}\n\nexport function initMockOpenAI(): MockOpenAI {\n if (typeof window !== 'undefined') {\n const mock = new MockOpenAI();\n (window as unknown as { openai: MockOpenAI }).openai = mock;\n return mock;\n }\n return new MockOpenAI();\n}\n\nexport type { MockOpenAI };\n","import * as React from 'react';\nimport { useEffect, useState, useMemo } from 'react';\nimport {\n Sidebar,\n SidebarContent,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarProvider,\n} from '../shadcn/sidebar';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { Label } from '../shadcn/label';\nimport { Conversation } from './conversation';\nimport { initMockOpenAI } from './mock-openai';\nimport { ThemeProvider } from '../theme-provider';\nimport type { Theme, DisplayMode } from '../../types';\nimport type { ScreenWidth } from '../../types/simulator';\n\ninterface ChatGPTSimulatorProps {\n children: React.ReactNode;\n appName?: string;\n appIcon?: string;\n userMessage?: string;\n}\n\nexport function ChatGPTSimulator({\n children,\n appName,\n appIcon,\n userMessage\n}: ChatGPTSimulatorProps) {\n const [theme, setTheme] = useState<Theme>('dark');\n const [displayMode, setDisplayMode] = useState<DisplayMode>('inline');\n const [screenWidth, setScreenWidth] = useState<ScreenWidth>('full');\n\n const mock = useMemo(() => initMockOpenAI(), []);\n\n useEffect(() => {\n return () => {\n if (typeof window !== 'undefined') {\n delete (window as unknown as { openai?: unknown }).openai;\n }\n };\n }, []);\n\n useEffect(() => {\n if (mock) {\n mock.setTheme(theme);\n }\n }, [mock, theme]);\n\n useEffect(() => {\n if (mock) {\n mock.setDisplayMode(displayMode);\n }\n }, [mock, displayMode]);\n\n return (\n <ThemeProvider theme={theme}>\n <SidebarProvider defaultOpen={true}>\n <Sidebar>\n <SidebarContent>\n <SidebarGroup>\n <SidebarGroupLabel className=\"text-md\">\n Controls\n </SidebarGroupLabel>\n <SidebarGroupContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"app-ui-select\" className=\"text-xs\">\n App UI\n </Label>\n <Select value=\"carousel\" onValueChange={() => {}}>\n <SelectTrigger id=\"app-ui-select\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"carousel\">Carousel</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"theme-select\" className=\"text-xs\">\n Color Scheme\n </Label>\n <Select value={theme} onValueChange={(value) => setTheme(value as Theme)}>\n <SelectTrigger id=\"theme-select\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"light\">Light</SelectItem>\n <SelectItem value=\"dark\">Dark</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"display-mode-select\" className=\"text-xs\">\n Display Mode\n </Label>\n <Select value={displayMode} onValueChange={(value) => setDisplayMode(value as DisplayMode)}>\n <SelectTrigger id=\"display-mode-select\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"inline\">Inline</SelectItem>\n <SelectItem value=\"pip\">Picture in Picture</SelectItem>\n <SelectItem value=\"fullscreen\">Fullscreen</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"screen-width-select\" className=\"text-xs\">\n Body Width\n </Label>\n <Select value={screenWidth} onValueChange={(value) => setScreenWidth(value as ScreenWidth)}>\n <SelectTrigger id=\"screen-width-select\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"mobile-s\">Mobile S (375px)</SelectItem>\n <SelectItem value=\"mobile-l\">Mobile L (425px)</SelectItem>\n <SelectItem value=\"tablet\">Tablet (768px)</SelectItem>\n <SelectItem value=\"full\">100% (Full)</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </SidebarGroupContent>\n </SidebarGroup>\n </SidebarContent>\n </Sidebar>\n <Conversation\n screenWidth={screenWidth}\n displayMode={displayMode}\n appName={appName}\n appIcon={appIcon}\n userMessage={userMessage}\n >\n {children}\n </Conversation>\n </SidebarProvider>\n </ThemeProvider>\n );\n}\n"]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI ChatGPT Apps SDK Design System
|
|
3
|
+
*
|
|
4
|
+
* Implements Sunpeak base variables according to OpenAI ChatGPT Apps SDK design guidelines.
|
|
5
|
+
* https://developers.openai.com/apps-sdk/concepts/design-guidelines
|
|
6
|
+
*
|
|
7
|
+
* Design Principles:
|
|
8
|
+
* - "Always inherit the system font stack"
|
|
9
|
+
* - "Use system colors for text, icons, and spatial elements"
|
|
10
|
+
* - "Use system grid spacing"
|
|
11
|
+
* - "Respect system specified corner rounds"
|
|
12
|
+
*
|
|
13
|
+
* ⚠️ These values should NOT be overridden unless you want to break
|
|
14
|
+
* compliance with OpenAI ChatGPT Apps SDK design guidelines.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
:root {
|
|
18
|
+
/* ===================================
|
|
19
|
+
* TYPOGRAPHY - System Fonts
|
|
20
|
+
* ===================================
|
|
21
|
+
* "Always inherit the system font stack"
|
|
22
|
+
* Platform-native: SF Pro (iOS/macOS), Roboto (Android), Segoe UI (Windows)
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
--sp-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
26
|
+
|
|
27
|
+
/* Font sizes - System-defined scale */
|
|
28
|
+
--sp-font-size-xs: 0.75rem; /* 12px - metadata */
|
|
29
|
+
--sp-font-size-sm: 0.875rem; /* 14px - descriptions */
|
|
30
|
+
--sp-font-size-base: 1rem; /* 16px - headers */
|
|
31
|
+
--sp-font-size-lg: 1.125rem; /* 18px */
|
|
32
|
+
--sp-font-size-xl: 1.25rem; /* 20px */
|
|
33
|
+
|
|
34
|
+
/* Font weights - System-defined */
|
|
35
|
+
--sp-font-weight-normal: 400;
|
|
36
|
+
--sp-font-weight-medium: 500;
|
|
37
|
+
--sp-font-weight-semibold: 600;
|
|
38
|
+
--sp-font-weight-bold: 700;
|
|
39
|
+
|
|
40
|
+
/* Line heights - System-defined */
|
|
41
|
+
--sp-line-height-tight: 1.25;
|
|
42
|
+
--sp-line-height-normal: 1.5;
|
|
43
|
+
--sp-line-height-relaxed: 1.75;
|
|
44
|
+
|
|
45
|
+
/* ===================================
|
|
46
|
+
* SYSTEM COLORS
|
|
47
|
+
* ===================================
|
|
48
|
+
* "Use system colors for text, icons, and spatial elements"
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
/* Light Mode - OpenAI ChatGPT System Colors */
|
|
52
|
+
--sp-light-color-bg-primary: #ffffff;
|
|
53
|
+
--sp-light-color-bg-secondary: #e8e8e8;
|
|
54
|
+
--sp-light-color-bg-tertiary: #f3f3f3;
|
|
55
|
+
--sp-light-color-text-primary: #0d0d0d;
|
|
56
|
+
--sp-light-color-text-secondary: #5d5d5d;
|
|
57
|
+
--sp-light-color-text-tertiary: #8f8f8f;
|
|
58
|
+
--sp-light-color-text-inverted: #8f8f8f;
|
|
59
|
+
--sp-light-color-border: rgba(0, 0, 0, 0.05);
|
|
60
|
+
--sp-light-success: #008635;
|
|
61
|
+
--sp-light-warning: #e25507;
|
|
62
|
+
--sp-light-error: #e02e2a;
|
|
63
|
+
--sp-light-info: #0285ff;
|
|
64
|
+
--sp-light-sidebar: #f9f9f9;
|
|
65
|
+
/* Customizable light styles */
|
|
66
|
+
--sp-light-accent: #f46c21;
|
|
67
|
+
--sp-light-accent-hover: rgba(244, 108, 33, 0.9);
|
|
68
|
+
--sp-light-accent-active: #d45e1c;
|
|
69
|
+
--sp-light-accent-foreground: #ffffff;
|
|
70
|
+
|
|
71
|
+
/* Dark Mode - OpenAI ChatGPT System Colors */
|
|
72
|
+
--sp-dark-color-bg-primary: #212121;
|
|
73
|
+
--sp-dark-color-bg-secondary: #303030;
|
|
74
|
+
--sp-dark-color-bg-tertiary: #414141;
|
|
75
|
+
--sp-dark-color-text-primary: #ffffff;
|
|
76
|
+
--sp-dark-color-text-secondary: #cdcdcd;
|
|
77
|
+
--sp-dark-color-text-tertiary: #afafaf;
|
|
78
|
+
--sp-dark-color-text-inverted: #afafaf;
|
|
79
|
+
--sp-dark-color-border: #ffffff0d;
|
|
80
|
+
--sp-dark-success: #40c977;
|
|
81
|
+
--sp-dark-warning: #ff9e6c;
|
|
82
|
+
--sp-dark-error: #ff8583;
|
|
83
|
+
--sp-dark-info: #0285ff;
|
|
84
|
+
--sp-dark-sidebar: #181818;
|
|
85
|
+
/* Customizable dark styles */
|
|
86
|
+
--sp-dark-accent: #f46c21;
|
|
87
|
+
--sp-dark-accent-hover: rgba(244, 108, 33, 0.9);
|
|
88
|
+
--sp-dark-accent-active: #d45e1c;
|
|
89
|
+
--sp-dark-accent-foreground: #ffffff;
|
|
90
|
+
|
|
91
|
+
/* ===================================
|
|
92
|
+
* SPACING - System Grid
|
|
93
|
+
* ===================================
|
|
94
|
+
* "Use system grid spacing"
|
|
95
|
+
* 4px base grid system
|
|
96
|
+
*/
|
|
97
|
+
|
|
98
|
+
--sp-spacing-1: 0.25rem; /* 4px */
|
|
99
|
+
--sp-spacing-2: 0.5rem; /* 8px */
|
|
100
|
+
--sp-spacing-3: 0.75rem; /* 12px */
|
|
101
|
+
--sp-spacing-4: 1rem; /* 16px */
|
|
102
|
+
--sp-spacing-5: 1.25rem; /* 20px */
|
|
103
|
+
--sp-spacing-6: 1.5rem; /* 24px */
|
|
104
|
+
--sp-spacing-8: 2rem; /* 32px */
|
|
105
|
+
|
|
106
|
+
/* ===================================
|
|
107
|
+
* BORDER RADIUS
|
|
108
|
+
* ===================================
|
|
109
|
+
* "Respect system specified corner rounds"
|
|
110
|
+
*/
|
|
111
|
+
|
|
112
|
+
--sp-radius-sm: 0.375rem; /* 6px */
|
|
113
|
+
--sp-radius-md: 0.5rem; /* 8px */
|
|
114
|
+
--sp-radius-lg: 0.75rem; /* 12px */
|
|
115
|
+
--sp-radius-xl: 1rem; /* 16px */
|
|
116
|
+
--sp-radius-2xl: 1.5rem; /* 24px */
|
|
117
|
+
--sp-radius-full: 9999px;
|
|
118
|
+
|
|
119
|
+
/* ===================================
|
|
120
|
+
* SHADOWS - System Elevation
|
|
121
|
+
* ===================================
|
|
122
|
+
*/
|
|
123
|
+
|
|
124
|
+
--sp-shadow-sm: 0px 1px 2px rgba(0, 0, 0, 0.05);
|
|
125
|
+
--sp-shadow-md: 0px 2px 6px rgba(0, 0, 0, 0.06);
|
|
126
|
+
--sp-shadow-lg: 0px 4px 12px rgba(0, 0, 0, 0.1);
|
|
127
|
+
--sp-shadow-xl: 0px 8px 24px rgba(0, 0, 0, 0.12);
|
|
128
|
+
|
|
129
|
+
/* ===================================
|
|
130
|
+
* COMPONENT DIMENSIONS
|
|
131
|
+
* ===================================
|
|
132
|
+
* Standard component sizing from OpenAI ChatGPT examples
|
|
133
|
+
*/
|
|
134
|
+
|
|
135
|
+
/* Card width - 220px (OpenAI ChatGPT standard) */
|
|
136
|
+
--sp-card-width: 220px;
|
|
137
|
+
|
|
138
|
+
/* Card gap - 16px (OpenAI ChatGPT standard) */
|
|
139
|
+
--sp-card-gap: 1rem;
|
|
140
|
+
|
|
141
|
+
/* Button padding */
|
|
142
|
+
--sp-button-padding-x: 1rem; /* 16px */
|
|
143
|
+
--sp-button-padding-y: 0.375rem; /* 6px */
|
|
144
|
+
--sp-button-padding-x-sm: 0.75rem; /* 12px */
|
|
145
|
+
--sp-button-padding-y-sm: 0.25rem; /* 4px */
|
|
146
|
+
}
|