sunpeak 0.2.4 → 0.2.5
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 +10 -0
- package/dist/index.cjs +264 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +212 -12
- package/dist/index.d.ts +212 -12
- package/dist/index.js +246 -76
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.cjs +250 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +12 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.js +243 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/styles/globals.css +0 -1
- package/package.json +10 -2
- package/template/README.md +38 -2
- package/template/dev/main.tsx +51 -48
- package/template/mcp/server.ts +66 -0
- package/template/package.json +3 -0
- package/template/postcss.config.js +5 -0
- package/template/src/App.tsx +8 -4
- package/template/src/components/sunpeak-card.tsx +43 -12
- package/template/src/components/sunpeak-carousel.tsx +42 -8
- package/template/src/index.chatgpt.tsx +8 -0
- package/template/src/styles/globals.css +0 -1
- package/template/tsup.config.ts +29 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/theme-provider.tsx","../src/types/openai.ts","../src/providers/openai.ts","../src/providers/index.ts","../src/hooks/use-widget-global.ts","../src/hooks/use-widget-api.ts","../src/hooks/use-display-mode.ts","../src/hooks/use-locale.ts","../src/hooks/use-max-height.ts","../src/hooks/use-mobile.ts","../src/hooks/use-safe-area.ts","../src/hooks/use-theme.ts","../src/hooks/use-tool-input.ts","../src/hooks/use-tool-response-metadata.ts","../src/hooks/use-user-agent.ts","../src/hooks/use-view.ts","../src/hooks/use-widget-props.ts","../src/hooks/use-widget-state.ts","../src/lib/utils.ts","../src/lib/media-queries.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/types/simulator.ts","../src/components/simulator/conversation.tsx","../src/components/simulator/mock-openai.ts","../src/components/simulator/chatgpt-simulator.tsx"],"names":["React","React2","useState","useEffect","jsx","open","jsxs","React4","cva","Label","React5","React6","useMemo"],"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 ViewMode = 'modal' | 'default';\n\nexport type View = {\n mode: ViewMode;\n params?: UnknownObject;\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 view: View | null;\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 RequestModal = (args: {\n mode: ViewMode;\n params?: UnknownObject;\n}) => Promise<void>;\n\nexport type NotifyIntrinsicHeight = (height: number) => void;\n\nexport type OpenAiAPI = {\n callTool: CallTool;\n sendFollowUpMessage: (args: { prompt: string }) => Promise<void>;\n openExternal(payload: { href: string }): void;\n requestDisplayMode: RequestDisplayMode;\n requestModal: RequestModal;\n notifyIntrinsicHeight: NotifyIntrinsicHeight;\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","/**\n * OpenAI/ChatGPT provider implementation.\n * Bridges the OpenAI-specific window.openai API to the provider-agnostic interface.\n */\n\nimport type { WidgetProvider, WidgetGlobals, WidgetAPI } from './types';\nimport {\n SET_GLOBALS_EVENT_TYPE,\n type SetGlobalsEvent,\n} from '../types/openai';\n\n/**\n * Check if the OpenAI provider is available.\n */\nexport function isOpenAiAvailable(): boolean {\n return typeof window !== 'undefined' && window.openai != null;\n}\n\n/**\n * OpenAI provider implementation.\n */\nclass OpenAiProvider implements WidgetProvider {\n readonly id = 'openai';\n\n getGlobal<K extends keyof WidgetGlobals>(key: K): WidgetGlobals[K] | null {\n if (typeof window === 'undefined' || !window.openai) {\n return null;\n }\n return window.openai[key] ?? null;\n }\n\n subscribe(key: keyof WidgetGlobals, onChange: () => void): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n // Listen to OpenAI set_globals events\n const handleEvent = (event: SetGlobalsEvent) => {\n if (event.detail.globals[key] !== undefined) {\n onChange();\n }\n };\n\n window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleEvent, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleEvent);\n };\n }\n\n getAPI(): WidgetAPI | null {\n if (typeof window === 'undefined' || !window.openai) {\n return null;\n }\n\n const api = window.openai;\n return {\n callTool: api.callTool?.bind(api),\n sendFollowUpMessage: api.sendFollowUpMessage?.bind(api),\n openExternal: api.openExternal?.bind(api),\n requestDisplayMode: api.requestDisplayMode?.bind(api),\n requestModal: api.requestModal?.bind(api),\n notifyIntrinsicHeight: api.notifyIntrinsicHeight?.bind(api),\n setWidgetState: api.setWidgetState?.bind(api),\n };\n }\n}\n\n// Singleton instance\nlet openAiProvider: OpenAiProvider | null = null;\n\n/**\n * Get the OpenAI provider instance (singleton).\n */\nexport function getOpenAiProvider(): OpenAiProvider {\n if (!openAiProvider) {\n openAiProvider = new OpenAiProvider();\n }\n return openAiProvider;\n}\n","/**\n * Provider detection and routing.\n *\n * This module automatically detects which widget runtime environment is available\n * and provides the appropriate provider. The detection happens once on first access,\n * and subsequent calls return the cached provider directly.\n */\n\nimport type { WidgetProvider, WidgetGlobals, WidgetAPI } from './types';\nimport { isOpenAiAvailable, getOpenAiProvider } from './openai';\n\n// Re-export only provider-specific types (not the shared types already in ./types)\nexport type { WidgetGlobals, WidgetAPI, WidgetProvider } from './types';\nexport { isOpenAiAvailable, getOpenAiProvider } from './openai';\n\n// Cached provider instance - detection happens only once\nlet cachedProvider: WidgetProvider | null = null;\nlet detectionComplete = false;\n\n/**\n * Detect and return the appropriate provider for the current environment.\n * This function caches the result, so detection only happens once.\n *\n * @returns The detected provider, or null if no provider is available.\n */\nexport function getProvider(): WidgetProvider | null {\n if (detectionComplete) {\n return cachedProvider;\n }\n\n // Detect available provider (order matters for priority)\n if (isOpenAiAvailable()) {\n cachedProvider = getOpenAiProvider();\n }\n // Future providers can be added here:\n // else if (isSomeOtherProviderAvailable()) {\n // cachedProvider = getSomeOtherProvider();\n // }\n\n detectionComplete = true;\n return cachedProvider;\n}\n\n/**\n * Check if any provider is available.\n */\nexport function isProviderAvailable(): boolean {\n return getProvider() !== null;\n}\n\n/**\n * Get a global value from the detected provider.\n *\n * @param key - The global property key to retrieve.\n * @returns The value, or null if not available.\n */\nexport function getGlobal<K extends keyof WidgetGlobals>(\n key: K\n): WidgetGlobals[K] | null {\n const provider = getProvider();\n return provider?.getGlobal(key) ?? null;\n}\n\n/**\n * Subscribe to changes for a global property.\n *\n * @param key - The global property key to subscribe to.\n * @param onChange - Callback to invoke when the value changes.\n * @returns An unsubscribe function.\n */\nexport function subscribeToGlobal(\n key: keyof WidgetGlobals,\n onChange: () => void\n): () => void {\n const provider = getProvider();\n return provider?.subscribe(key, onChange) ?? (() => {});\n}\n\n/**\n * Get the API from the detected provider.\n *\n * @returns The API object, or null if not available.\n */\nexport function getAPI(): WidgetAPI | null {\n const provider = getProvider();\n return provider?.getAPI() ?? null;\n}\n\n/**\n * Reset the provider detection cache.\n * Useful for testing or when the environment changes.\n */\nexport function resetProviderCache(): void {\n cachedProvider = null;\n detectionComplete = false;\n}\n","import { useSyncExternalStore } from 'react';\nimport {\n getGlobal,\n subscribeToGlobal,\n type WidgetGlobals,\n} from '../providers';\n\n/**\n * Hook to read and subscribe to a global property from the widget runtime.\n * Automatically detects and uses the appropriate provider (OpenAI, etc.).\n *\n * @param key - The global property key to read.\n * @returns The current value, or null if not available.\n */\nexport function useWidgetGlobal<K extends keyof WidgetGlobals>(\n key: K\n): WidgetGlobals[K] | null {\n return useSyncExternalStore(\n (onChange) => subscribeToGlobal(key, onChange),\n () => getGlobal(key),\n () => getGlobal(key)\n );\n}\n","import { useMemo } from 'react';\nimport { getAPI, type WidgetAPI } from '../providers';\n\n/**\n * Hook to get the widget runtime API.\n * Automatically detects and uses the appropriate provider (OpenAI, etc.).\n *\n * @returns The API object, or null if not available.\n */\nexport function useWidgetAPI(): WidgetAPI | null {\n return useMemo(() => getAPI(), []);\n}\n","import { useWidgetGlobal } from './use-widget-global';\nimport type { DisplayMode } from '../types';\n\nexport const useDisplayMode = (): DisplayMode | null => {\n return useWidgetGlobal('displayMode');\n};\n","import { useWidgetGlobal } from './use-widget-global';\n\nexport const useLocale = (): string | null => {\n return useWidgetGlobal('locale');\n};\n","import { useWidgetGlobal } from './use-widget-global';\n\nexport const useMaxHeight = (): number | null => {\n return useWidgetGlobal('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 { useWidgetGlobal } from './use-widget-global';\nimport type { SafeArea } from '../types';\n\nexport const useSafeArea = (): SafeArea | null => {\n return useWidgetGlobal('safeArea');\n};\n","import { useWidgetGlobal } from './use-widget-global';\nimport type { Theme } from '../types';\n\nexport const useTheme = (): Theme | null => {\n return useWidgetGlobal('theme');\n};\n","import { useWidgetGlobal } from './use-widget-global';\nimport type { UnknownObject } from '../types';\n\nexport function useToolInput<T extends UnknownObject = UnknownObject>(): T | null {\n return useWidgetGlobal('toolInput') as T | null;\n}\n","import { useWidgetGlobal } from './use-widget-global';\nimport type { UnknownObject } from '../types';\n\nexport function useToolResponseMetadata<T extends UnknownObject = UnknownObject>(): T | null {\n return useWidgetGlobal('toolResponseMetadata') as T | null;\n}\n","import { useWidgetGlobal } from './use-widget-global';\nimport type { UserAgent } from '../types';\n\nexport const useUserAgent = (): UserAgent | null => {\n return useWidgetGlobal('userAgent');\n};\n","import { useWidgetGlobal } from './use-widget-global';\nimport type { View } from '../types';\n\nexport function useView(): View | null {\n return useWidgetGlobal('view');\n}\n","import { useWidgetGlobal } from './use-widget-global';\n\nexport function useWidgetProps<T extends Record<string, unknown>>(\n defaultState?: T | (() => T)\n): T {\n const props = useWidgetGlobal('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 { useWidgetGlobal } from './use-widget-global';\nimport { useWidgetAPI } from './use-widget-api';\nimport type { UnknownObject } from '../types';\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 widgetStateFromProvider = useWidgetGlobal('widgetState') as T;\n const api = useWidgetAPI();\n\n const [widgetState, _setWidgetState] = useState<T | null>(() => {\n if (widgetStateFromProvider != null) {\n return widgetStateFromProvider;\n }\n\n return typeof defaultState === 'function'\n ? defaultState()\n : defaultState ?? null;\n });\n\n useEffect(() => {\n _setWidgetState(widgetStateFromProvider);\n }, [widgetStateFromProvider]);\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 && api?.setWidgetState) {\n api.setWidgetState(newState);\n }\n\n return newState;\n });\n },\n [api]\n );\n\n return [widgetState, setWidgetState] as const;\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","function matchMediaQuery(query: string) {\n return window.matchMedia(query).matches;\n}\n\nfunction createMediaQueryFn(query: string) {\n return () => matchMediaQuery(query);\n}\n\nexport const prefersReducedMotion = createMediaQueryFn(\n '(prefers-reduced-motion: reduce)'\n);\n\nexport const isPrimarilyTouchDevice = createMediaQueryFn('(pointer: coarse)');\n\nexport const isHoverAvailable = createMediaQueryFn('(hover: hover)');\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 { 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 * as React from 'react';\nimport { cn } from '~/lib/index';\nimport { SidebarInset } from '../shadcn/sidebar';\nimport { useDisplayMode } from '../../hooks';\nimport { SCREEN_WIDTHS, type ScreenWidth } from '../../types/simulator';\n\ninterface ConversationProps {\n children: React.ReactNode;\n screenWidth: ScreenWidth;\n appName?: string;\n appIcon?: string;\n userMessage?: string;\n}\n\nexport function Conversation({\n children,\n screenWidth,\n appName = 'ChatGPT',\n appIcon,\n userMessage = 'Show me some interesting places to visit.',\n}: ConversationProps) {\n // Read displayMode from window.openai (same source the App uses)\n const displayMode = useDisplayMode() ?? 'inline';\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 type View,\n type ViewMode,\n type UnknownObject,\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 view: View | null = null;\n toolInput: Record<string, unknown> = {};\n toolOutput: Record<string, unknown> | null = null;\n toolResponseMetadata: Record<string, unknown> | null = 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 requestModal(args: { mode: ViewMode; params?: UnknownObject }) {\n console.log('Mock requestModal:', args);\n this.view = { mode: args.mode, params: args.params };\n this.emitUpdate({ view: this.view });\n }\n\n notifyIntrinsicHeight(height: number) {\n console.log('Mock notifyIntrinsicHeight:', height);\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 setToolOutput(toolOutput: Record<string, unknown> | null) {\n this.toolOutput = toolOutput;\n this.emitUpdate({ toolOutput });\n }\n\n setWidgetStateExternal(widgetState: Record<string, unknown> | null) {\n this.widgetState = widgetState;\n this.emitUpdate({ widgetState });\n }\n\n emitUpdate(globals: Partial<OpenAiGlobals>) {\n if (typeof window !== 'undefined') {\n // Defer event dispatch to avoid setState during render warnings\n queueMicrotask(() => {\n const event = new CustomEvent(SET_GLOBALS_EVENT_TYPE, {\n detail: { globals },\n });\n window.dispatchEvent(event);\n });\n }\n }\n}\n\nexport function initMockOpenAI(initialData?: {\n theme?: Theme;\n displayMode?: DisplayMode;\n toolOutput?: Record<string, unknown> | null;\n widgetState?: Record<string, unknown> | null;\n}): MockOpenAI {\n if (typeof window !== 'undefined') {\n const mock = new MockOpenAI();\n\n // Set initial data on the mock object before registering\n if (initialData?.theme !== undefined) {\n mock.theme = initialData.theme;\n }\n if (initialData?.displayMode !== undefined) {\n mock.displayMode = initialData.displayMode;\n }\n if (initialData?.toolOutput !== undefined) {\n mock.toolOutput = initialData.toolOutput;\n }\n if (initialData?.widgetState !== undefined) {\n mock.widgetState = initialData.widgetState;\n }\n\n // Register mock on window - data is already set\n (window as unknown as { openai: MockOpenAI }).openai = mock;\n\n return mock;\n }\n return new MockOpenAI();\n}\n\nexport type { MockOpenAI };\n","import * as React from 'react';\nimport { useEffect, useLayoutEffect, 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 { useTheme, useDisplayMode } from '../../hooks';\nimport type { Theme, DisplayMode } from '../../types';\nimport type { ScreenWidth } from '../../types/simulator';\n\nconst DEFAULT_THEME: Theme = 'dark';\nconst DEFAULT_DISPLAY_MODE: DisplayMode = 'inline';\n\ninterface ChatGPTSimulatorProps {\n children: React.ReactNode;\n appName?: string;\n appIcon?: string;\n userMessage?: string;\n toolOutput?: Record<string, unknown> | null;\n widgetState?: Record<string, unknown> | null;\n}\n\nexport function ChatGPTSimulator({\n children,\n appName,\n appIcon,\n userMessage,\n toolOutput = null,\n widgetState = null,\n}: ChatGPTSimulatorProps) {\n const [screenWidth, setScreenWidth] = React.useState<ScreenWidth>('full');\n\n const mock = useMemo(\n () =>\n initMockOpenAI({\n theme: DEFAULT_THEME,\n displayMode: DEFAULT_DISPLAY_MODE,\n }),\n []\n );\n\n // Read theme and displayMode from window.openai (same as widget code would)\n const theme = useTheme() ?? DEFAULT_THEME;\n const displayMode = useDisplayMode() ?? DEFAULT_DISPLAY_MODE;\n\n // Re-register mock on window.openai after each mount (handles Strict Mode remounts)\n // Also set initial toolOutput and widgetState values synchronously\n useLayoutEffect(() => {\n if (mock && typeof window !== 'undefined') {\n (window as unknown as { openai: typeof mock }).openai = mock;\n // Set initial values synchronously before first paint\n if (toolOutput !== undefined) {\n mock.setToolOutput(toolOutput);\n }\n if (widgetState !== undefined) {\n mock.setWidgetStateExternal(widgetState);\n }\n }\n }, [mock, toolOutput, widgetState]);\n\n useEffect(() => {\n return () => {\n if (typeof window !== 'undefined') {\n delete (window as unknown as { openai?: unknown }).openai;\n }\n };\n }, []);\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=\"theme-select\" className=\"text-xs\">\n Theme\n </Label>\n <Select value={theme} onValueChange={(value) => mock.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) => mock.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 appName={appName}\n appIcon={appIcon}\n userMessage={userMessage}\n >\n {children}\n </Conversation>\n </SidebarProvider>\n </ThemeProvider>\n );\n}\n"]}
|