@aperture-browser/session-react 0.0.0-init.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["Toaster","Sonner","TooltipPrimitive","Tooltip","Button","ButtonPrimitive","ContextMenu","ContextMenuPrimitive","Input","InputPrimitive","Input","ScrollArea","ScrollAreaPrimitive","ScrollArea","ContextMenu","Tooltip","Button","MenuPrimitive","Tooltip","Button","Input","Avatar","AvatarPrimitive","Popover","PopoverPrimitive","Popover","Button","Tooltip","Avatar","Tooltip","Button","ContextMenu","Toaster"],"sources":["../../ui/src/utils.ts","../../ui/src/components/empty.tsx","../../ui/src/components/sonner.tsx","../../ui/src/portal.tsx","../../ui/src/components/tooltip.tsx","../src/features.ts","../../ui/src/components/button.tsx","../../ui/src/components/context-menu.tsx","../../ui/src/components/input.tsx","../../ui/src/components/input-group.tsx","../../ui/src/components/scroll-area.tsx","../src/clipboard.ts","../src/components/browser-tab-strip.tsx","../../ui/src/components/label.tsx","../../ui/src/components/field.tsx","../../ui/src/components/dropdown-menu.tsx","../src/components/browser-toolbar-menus.tsx","../../ui/src/components/avatar.tsx","../../ui/src/components/popover.tsx","../src/components/collaboration-presence.tsx","../src/components/browser-toolbar.tsx","../../ui/src/components/badge.tsx","../src/notices.ts","../src/components/browser-viewport.tsx","../src/components/browser-devtools-pane.tsx","../../ui/src/components/resizable.tsx","../src/components/browser-control-pane.tsx","../src/aperture-session.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils.ts\";\n\nfunction Empty({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty\"\n className={cn(\n \"flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction EmptyHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-header\"\n className={cn(\"flex max-w-sm flex-col items-center gap-2\", className)}\n {...props}\n />\n );\n}\n\nconst emptyMediaVariants = cva(\n \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n icon: \"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction EmptyMedia({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof emptyMediaVariants>) {\n return (\n <div\n data-slot=\"empty-icon\"\n data-variant={variant}\n className={cn(emptyMediaVariants({ variant, className }))}\n {...props}\n />\n );\n}\n\nfunction EmptyTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-title\"\n className={cn(\"text-sm font-medium tracking-tight\", className)}\n {...props}\n />\n );\n}\n\nfunction EmptyDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <div\n data-slot=\"empty-description\"\n className={cn(\n \"text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction EmptyContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"empty-content\"\n className={cn(\n \"flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Empty, EmptyHeader, EmptyTitle, EmptyDescription, EmptyContent, EmptyMedia };\n","\"use client\";\n\nimport { useTheme } from \"next-themes\";\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n TriangleAlertIcon,\n OctagonXIcon,\n Loader2Icon,\n} from \"lucide-react\";\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme();\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n icons={{\n success: <CircleCheckIcon className=\"size-4\" />,\n info: <InfoIcon className=\"size-4\" />,\n warning: <TriangleAlertIcon className=\"size-4\" />,\n error: <OctagonXIcon className=\"size-4\" />,\n loading: <Loader2Icon className=\"size-4 animate-spin\" />,\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nconst PortalContainerContext = createContext<HTMLElement | null>(null);\n\nexport function PortalContainerProvider({\n container,\n children,\n}: {\n container: HTMLElement | null;\n children: ReactNode;\n}) {\n return (\n <PortalContainerContext.Provider value={container}>{children}</PortalContainerContext.Provider>\n );\n}\n\nexport function usePortalContainer(): HTMLElement | undefined {\n return useContext(PortalContainerContext) ?? undefined;\n}\n","import { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\n\nimport { cn } from \"../utils.ts\";\nimport { usePortalContainer } from \"../portal.tsx\";\n\nfunction TooltipProvider({ delay = 0, ...props }: TooltipPrimitive.Provider.Props) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delay={delay} {...props} />;\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n side = \"top\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n children,\n ...props\n}: TooltipPrimitive.Popup.Props &\n Pick<TooltipPrimitive.Positioner.Props, \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\">) {\n return (\n <TooltipPrimitive.Portal container={usePortalContainer()}>\n <TooltipPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-content\"\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5\" />\n </TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","export interface SessionFeatures {\n readonly tabs?: boolean;\n readonly navigation?: boolean;\n readonly addressBar?: boolean;\n readonly presence?: boolean;\n readonly drawing?: boolean;\n readonly devTools?: boolean;\n readonly menus?: boolean;\n readonly statusBadge?: boolean;\n}\n\nexport interface ApertureSessionFeatures extends SessionFeatures {\n readonly toaster?: boolean;\n}\n\nexport type ResolvedSessionFeatures = Required<SessionFeatures>;\n\nexport function resolveSessionFeatures(features?: SessionFeatures): ResolvedSessionFeatures {\n return {\n tabs: true,\n navigation: true,\n addressBar: true,\n presence: true,\n drawing: true,\n devTools: true,\n menus: true,\n statusBadge: true,\n ...features,\n };\n}\n","import { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils.ts\";\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm leading-none font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-8 gap-1.5 px-2.5 pt-px has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 pt-px text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 pt-px text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 gap-1.5 px-2.5 pt-px has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n icon: \"size-8\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n return (\n <ButtonPrimitive\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { ContextMenu as ContextMenuPrimitive } from \"@base-ui/react/context-menu\";\n\nimport { cn } from \"../utils.ts\";\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\";\nimport { usePortalContainer } from \"../portal.tsx\";\n\nfunction ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />;\n}\n\nfunction ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Props) {\n const container = usePortalContainer();\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" container={container} {...props} />\n );\n}\n\nfunction ContextMenuTrigger({ className, ...props }: ContextMenuPrimitive.Trigger.Props) {\n return (\n <ContextMenuPrimitive.Trigger\n data-slot=\"context-menu-trigger\"\n className={cn(\"select-none\", className)}\n {...props}\n />\n );\n}\n\nfunction ContextMenuContent({\n className,\n align = \"start\",\n alignOffset = 4,\n side = \"right\",\n sideOffset = 0,\n ...props\n}: ContextMenuPrimitive.Popup.Props &\n Pick<ContextMenuPrimitive.Positioner.Props, \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\">) {\n return (\n <ContextMenuPrimitive.Portal container={usePortalContainer()}>\n <ContextMenuPrimitive.Positioner\n className=\"isolate z-50 outline-none\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n >\n <ContextMenuPrimitive.Popup\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 max-h-(--available-height) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Positioner>\n </ContextMenuPrimitive.Portal>\n );\n}\n\nfunction ContextMenuGroup({ ...props }: ContextMenuPrimitive.Group.Props) {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />;\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: ContextMenuPrimitive.GroupLabel.Props & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.GroupLabel\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: ContextMenuPrimitive.Item.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.Props) {\n return <ContextMenuPrimitive.SubmenuRoot data-slot=\"context-menu-sub\" {...props} />;\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: ContextMenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.SubmenuTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubmenuTrigger>\n );\n}\n\nfunction ContextMenuSubContent({ ...props }: React.ComponentProps<typeof ContextMenuContent>) {\n return (\n <ContextMenuContent\n data-slot=\"context-menu-sub-content\"\n className=\"shadow-lg\"\n side=\"right\"\n {...props}\n />\n );\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: ContextMenuPrimitive.CheckboxItem.Props & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.CheckboxItemIndicator>\n <CheckIcon />\n </ContextMenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction ContextMenuRadioGroup({ ...props }: ContextMenuPrimitive.RadioGroup.Props) {\n return <ContextMenuPrimitive.RadioGroup data-slot=\"context-menu-radio-group\" {...props} />;\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: ContextMenuPrimitive.RadioItem.Props & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.RadioItemIndicator>\n <CheckIcon />\n </ContextMenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n}\n\nfunction ContextMenuSeparator({ className, ...props }: ContextMenuPrimitive.Separator.Props) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\nfunction ContextMenuShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n};\n","import * as React from \"react\";\nimport { Input as InputPrimitive } from \"@base-ui/react/input\";\n\nimport { cn } from \"../utils.ts\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <InputPrimitive\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils.ts\";\nimport { Button } from \"./button.tsx\";\nimport { Input } from \"./input.tsx\";\nimport { Textarea } from \"./textarea.tsx\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-lg border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\": \"order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n \"inline-end\": \"order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return;\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nconst inputGroupButtonVariants = cva(\"flex items-center gap-2 text-sm shadow-none\", {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\": \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n});\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\";\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupTextarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n};\n","\"use client\";\n\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\";\n\nimport { cn } from \"../utils.ts\";\n\ntype ScrollAreaProps = ScrollAreaPrimitive.Root.Props & {\n viewportClassName?: string;\n scrollbars?: \"vertical\" | \"horizontal\" | \"both\";\n};\n\nfunction ScrollArea({\n className,\n viewportClassName,\n scrollbars = \"vertical\",\n children,\n ...props\n}: ScrollAreaProps) {\n const vertical = scrollbars === \"vertical\" || scrollbars === \"both\";\n const horizontal = scrollbars === \"horizontal\" || scrollbars === \"both\";\n\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n style={{\n overflowX: horizontal ? \"scroll\" : \"hidden\",\n overflowY: vertical ? \"scroll\" : \"hidden\",\n }}\n className={cn(\n \"size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1\",\n viewportClassName,\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {vertical ? <ScrollBar /> : null}\n {horizontal ? <ScrollBar orientation=\"horizontal\" /> : null}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n return (\n <ScrollAreaPrimitive.Scrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none hover:bg-muted/50 data-[orientation=horizontal]:h-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:border-t data-[orientation=horizontal]:border-t-transparent data-[orientation=vertical]:h-full data-[orientation=vertical]:w-2.5 data-[orientation=vertical]:border-l data-[orientation=vertical]:border-l-transparent\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-foreground/35 transition-colors hover:bg-foreground/55\"\n />\n </ScrollAreaPrimitive.Scrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","import * as Data from \"effect/Data\";\nimport * as Effect from \"effect/Effect\";\nimport { toast } from \"sonner\";\n\n/** The browser refused to write to the clipboard. */\nexport class ClipboardError extends Data.TaggedError(\"ClipboardError\")<{\n readonly cause?: unknown;\n}> {\n override readonly message = \"Clipboard write is unavailable\";\n}\n\nexport const copyText = (value: string): Effect.Effect<void, ClipboardError> =>\n Effect.suspend(() => {\n const clipboard = navigator.clipboard;\n if (clipboard?.writeText) {\n return Effect.tryPromise({\n try: () => clipboard.writeText(value),\n catch: (cause) => new ClipboardError({ cause }),\n });\n }\n\n const textArea = document.createElement(\"textarea\");\n textArea.value = value;\n textArea.readOnly = true;\n textArea.style.position = \"fixed\";\n textArea.style.top = \"0\";\n textArea.style.left = \"-9999px\";\n\n document.body.append(textArea);\n textArea.select();\n const copied = document.execCommand(\"copy\");\n textArea.remove();\n\n return copied ? Effect.void : Effect.fail(new ClipboardError({}));\n });\n\n/** Copies `value`, then runs `onCopied`, or shows an error toast if the copy fails. */\nexport const copyTextWithToast = (value: string, onCopied: () => void = () => {}) =>\n copyText(value).pipe(\n Effect.andThen(Effect.sync(onCopied)),\n Effect.catchTag(\"ClipboardError\", (error) =>\n Effect.sync(() => {\n console.warn(\"Copy failed\", error);\n toast.error(\"Copy failed\");\n }),\n ),\n );\n","import { combine } from \"@atlaskit/pragmatic-drag-and-drop/combine\";\nimport {\n draggable,\n dropTargetForElements,\n} from \"@atlaskit/pragmatic-drag-and-drop/element/adapter\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Globe2, Plus, Wrench, X } from \"lucide-react\";\nimport { Button } from \"@aperture-browser/ui/components/button\";\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuGroup,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuTrigger,\n} from \"@aperture-browser/ui/components/context-menu\";\nimport { ScrollArea } from \"@aperture-browser/ui/components/scroll-area\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@aperture-browser/ui/components/tooltip\";\nimport { copyTextWithToast } from \"../clipboard.ts\";\nimport { useEffectCallback } from \"../effect.tsx\";\nimport { cn } from \"@aperture-browser/ui/utils\";\nimport type { LiveSessionTarget } from \"@aperture-browser/live-session\";\n\nconst BROWSER_TAB_DRAG_KIND = \"browser-tab\";\n\ninterface BrowserTabStripProps {\n targets: readonly LiveSessionTarget[];\n activeTargetId: string | null;\n recordingTargetIds: ReadonlySet<string>;\n devToolsTargetIds: ReadonlySet<string>;\n disabled?: boolean;\n mutationDisabled?: boolean;\n onActivate: (targetId: string) => void;\n onCreate: () => void;\n onDuplicate: (target: LiveSessionTarget) => void;\n onClose: (targetId: string) => void;\n onReload: (targetId: string) => void;\n onReorder: (\n sourceTargetId: string,\n destinationTargetId: string,\n placement: \"before\" | \"after\",\n ) => void;\n}\n\ninterface BrowserTabDragData extends Record<string, unknown> {\n kind: typeof BROWSER_TAB_DRAG_KIND;\n targetId: string;\n}\n\ntype DropPlacement = \"before\" | \"after\";\n\nexport function BrowserTabStrip({\n targets,\n activeTargetId,\n recordingTargetIds,\n devToolsTargetIds,\n disabled,\n mutationDisabled,\n onActivate,\n onCreate,\n onDuplicate,\n onClose,\n onReload,\n onReorder,\n}: BrowserTabStripProps) {\n if (targets.length === 0) {\n return (\n <div className=\"flex h-8 min-w-0 flex-1 items-center gap-2 px-2 text-xs text-muted-foreground\">\n <span>No tabs</span>\n <NewTabButton disabled={disabled || mutationDisabled} onCreate={onCreate} />\n </div>\n );\n }\n\n return (\n <ScrollArea scrollbars=\"horizontal\" className=\"h-8 min-w-0 flex-1\">\n <div className=\"flex min-w-max items-end gap-0.5 px-1 pt-1\">\n {targets.map((target, index) => {\n const active = target.id === activeTargetId;\n return (\n <BrowserTab\n key={target.id}\n target={target}\n active={active}\n recording={recordingTargetIds.has(target.id)}\n devToolsOpen={devToolsTargetIds.has(target.id)}\n disabled={disabled}\n mutationDisabled={mutationDisabled}\n onActivate={onActivate}\n onDuplicate={onDuplicate}\n onClose={onClose}\n onReload={onReload}\n onReorder={onReorder}\n closeOtherTargetIds={targets\n .filter((current) => current.id !== target.id)\n .map((current) => current.id)}\n closeRightTargetIds={targets.slice(index + 1).map((current) => current.id)}\n />\n );\n })}\n <NewTabButton disabled={disabled || mutationDisabled} onCreate={onCreate} />\n </div>\n </ScrollArea>\n );\n}\n\nfunction BrowserTab({\n target,\n active,\n recording,\n devToolsOpen,\n disabled,\n mutationDisabled,\n onActivate,\n onDuplicate,\n onClose,\n onReload,\n onReorder,\n closeOtherTargetIds,\n closeRightTargetIds,\n}: {\n target: LiveSessionTarget;\n active: boolean;\n recording: boolean;\n devToolsOpen: boolean;\n disabled?: boolean;\n mutationDisabled?: boolean;\n onActivate: (targetId: string) => void;\n onDuplicate: (target: LiveSessionTarget) => void;\n onClose: (targetId: string) => void;\n onReload: (targetId: string) => void;\n onReorder: (\n sourceTargetId: string,\n destinationTargetId: string,\n placement: DropPlacement,\n ) => void;\n closeOtherTargetIds: string[];\n closeRightTargetIds: string[];\n}) {\n const tabRef = useRef<HTMLDivElement | null>(null);\n const [dragging, setDragging] = useState(false);\n const [dropPlacement, setDropPlacement] = useState<DropPlacement | null>(null);\n const label = simplifyUrl(target.url);\n const copyUrl = useEffectCallback((url: string) => copyTextWithToast(url), []);\n\n useEffect(() => {\n const element = tabRef.current;\n if (!element) {\n return;\n }\n\n return combine(\n draggable({\n element,\n getInitialData: () => ({ kind: BROWSER_TAB_DRAG_KIND, targetId: target.id }),\n onDragStart: () => setDragging(true),\n onDrop: () => setDragging(false),\n }),\n dropTargetForElements({\n element,\n canDrop: ({ source }) => {\n return isBrowserTabDragData(source.data) && source.data.targetId !== target.id;\n },\n getData: () => ({ kind: BROWSER_TAB_DRAG_KIND, targetId: target.id }),\n onDrag: ({ location, self }) => {\n setDropPlacement(dropPlacementFromClientX(self.element, location.current.input.clientX));\n },\n onDragEnter: ({ location, self }) => {\n setDropPlacement(dropPlacementFromClientX(self.element, location.current.input.clientX));\n },\n onDragLeave: () => setDropPlacement(null),\n onDrop: ({ source, self, location }) => {\n setDropPlacement(null);\n if (!isBrowserTabDragData(source.data)) {\n return;\n }\n onReorder(\n source.data.targetId,\n target.id,\n dropPlacementFromClientX(self.element, location.current.input.clientX),\n );\n },\n }),\n );\n }, [onReorder, target.id]);\n\n return (\n <ContextMenu>\n <ContextMenuTrigger\n render={\n <div\n ref={tabRef}\n data-browser-tab\n className={cn(\n \"group relative flex h-7 w-52 max-w-[38vw] min-w-28 cursor-grab select-none items-center gap-1.5 rounded-t-lg border border-b-0 px-2 text-left text-xs transition-[background-color,border-color,color,opacity] active:cursor-grabbing\",\n active\n ? \"border-border bg-background text-foreground\"\n : \"border-transparent bg-muted/55 text-muted-foreground hover:bg-muted\",\n dragging && \"opacity-60\",\n )}\n title={target.url || \"about:blank\"}\n onMouseDown={(event) => {\n if (event.button === 1) {\n event.preventDefault();\n }\n }}\n onAuxClick={(event) => {\n if (event.button === 1 && !disabled && !mutationDisabled) {\n event.preventDefault();\n onClose(target.id);\n }\n }}\n />\n }\n >\n <span\n className={cn(\n \"pointer-events-none absolute inset-y-1 left-0 w-0.5 rounded-full bg-primary opacity-0\",\n dropPlacement === \"before\" && \"opacity-100\",\n )}\n />\n <span\n className={cn(\n \"pointer-events-none absolute inset-y-1 right-0 w-0.5 rounded-full bg-primary opacity-0\",\n dropPlacement === \"after\" && \"opacity-100\",\n )}\n />\n <button\n type=\"button\"\n aria-current={active ? \"page\" : undefined}\n disabled={disabled}\n className=\"flex min-w-0 flex-1 items-center gap-1.5 text-left\"\n onClick={() => onActivate(target.id)}\n >\n <TabFavicon url={target.url} />\n {devToolsOpen ? (\n <>\n <Wrench aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"sr-only\">DevTools open</span>\n </>\n ) : null}\n {recording ? (\n <>\n <span aria-hidden className=\"size-2 shrink-0 rounded-full bg-destructive\" />\n <span className=\"sr-only\">Recording</span>\n </>\n ) : null}\n <span className=\"min-w-0 truncate font-mono\">{label}</span>\n </button>\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"shrink-0 opacity-55 hover:opacity-100 group-hover:opacity-100\"\n aria-label=\"Close tab\"\n disabled={disabled || mutationDisabled}\n onClick={() => onClose(target.id)}\n />\n }\n >\n <X />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Close tab</TooltipContent>\n </Tooltip>\n </ContextMenuTrigger>\n <ContextMenuContent className=\"min-w-48\">\n <ContextMenuGroup>\n <ContextMenuItem\n disabled={disabled || mutationDisabled}\n onClick={() => onReload(target.id)}\n >\n Reload\n </ContextMenuItem>\n <ContextMenuItem\n disabled={disabled || mutationDisabled}\n onClick={() => onDuplicate(target)}\n >\n Duplicate\n </ContextMenuItem>\n <ContextMenuItem onClick={() => copyUrl(target.url || \"about:blank\")}>\n Copy URL\n </ContextMenuItem>\n </ContextMenuGroup>\n <ContextMenuSeparator />\n <ContextMenuGroup>\n <ContextMenuItem\n disabled={disabled || mutationDisabled}\n onClick={() => onClose(target.id)}\n >\n Close\n </ContextMenuItem>\n <ContextMenuItem\n disabled={disabled || mutationDisabled || closeOtherTargetIds.length === 0}\n onClick={() => {\n for (const targetId of closeOtherTargetIds) {\n onClose(targetId);\n }\n }}\n >\n Close other tabs\n </ContextMenuItem>\n <ContextMenuItem\n disabled={disabled || mutationDisabled || closeRightTargetIds.length === 0}\n onClick={() => {\n for (const targetId of closeRightTargetIds) {\n onClose(targetId);\n }\n }}\n >\n Close tabs to the right\n </ContextMenuItem>\n </ContextMenuGroup>\n </ContextMenuContent>\n </ContextMenu>\n );\n}\n\nfunction NewTabButton({ disabled, onCreate }: { disabled?: boolean; onCreate: () => void }) {\n return (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"mb-px shrink-0\"\n aria-label=\"New tab\"\n disabled={disabled}\n onClick={onCreate}\n />\n }\n >\n <Plus />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">New tab</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction TabFavicon({ url }: { url: string }) {\n const [failed, setFailed] = useState(false);\n const faviconUrl = resolveFaviconUrl(url);\n\n useEffect(() => {\n setFailed(false);\n }, [faviconUrl]);\n\n if (!faviconUrl || failed) {\n return <Globe2 className=\"size-4 shrink-0 text-muted-foreground\" />;\n }\n\n return (\n <img src={faviconUrl} alt=\"\" className=\"size-4 shrink-0\" onError={() => setFailed(true)} />\n );\n}\n\nfunction resolveFaviconUrl(url: string): string | null {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n return `${parsed.origin}/favicon.ico`;\n } catch {\n return null;\n }\n}\n\nfunction simplifyUrl(url: string): string {\n if (!url || url === \"about:blank\") {\n return \"about:blank\";\n }\n try {\n const parsed = new URL(url);\n return `${parsed.host}${parsed.pathname === \"/\" ? \"\" : parsed.pathname}`;\n } catch {\n return url;\n }\n}\n\nfunction isBrowserTabDragData(data: Record<string, unknown>): data is BrowserTabDragData {\n return data.kind === BROWSER_TAB_DRAG_KIND && typeof data.targetId === \"string\";\n}\n\nfunction dropPlacementFromClientX(element: Element, clientX: number): DropPlacement {\n const rect = element.getBoundingClientRect();\n return clientX < rect.left + rect.width / 2 ? \"before\" : \"after\";\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../utils.ts\";\n\nfunction Label({ className, ...props }: React.ComponentProps<\"label\">) {\n return (\n <label\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils.ts\";\nimport { Label } from \"./label.tsx\";\nimport { Separator } from \"./separator.tsx\";\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst fieldVariants = cva(\"group/field flex w-full gap-2 data-[invalid=true]:text-destructive\", {\n variants: {\n orientation: {\n vertical: \"flex-col *:w-full [&>.sr-only]:w-auto\",\n horizontal:\n \"flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n responsive:\n \"flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n});\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n );\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\"group/field-content flex flex-1 flex-col gap-0.5 leading-snug\", className)}\n {...props}\n />\n );\n}\n\nfunction FieldLabel({ className, ...props }: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm font-medium group-data-[disabled=true]/field:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-left text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5\",\n \"last:mt-0 nth-last-2:-mt-1\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode;\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"-my-2 flex items-center gap-2 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className,\n )}\n {...props}\n >\n <Separator className=\"flex-1\" />\n {children && (\n <>\n <span className=\"shrink-0 text-muted-foreground\" data-slot=\"field-separator-content\">\n {children}\n </span>\n <Separator className=\"flex-1\" aria-hidden />\n </>\n )}\n </div>\n );\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>;\n}) {\n const content = useMemo(() => {\n if (children) {\n return children;\n }\n\n if (!errors?.length) {\n return null;\n }\n\n const uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()];\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message;\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map((error, index) => error?.message && <li key={index}>{error.message}</li>)}\n </ul>\n );\n }, [children, errors]);\n\n if (!content) {\n return null;\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n );\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\n\nimport { cn } from \"../utils.ts\";\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\";\nimport { usePortalContainer } from \"../portal.tsx\";\n\nfunction DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {\n return <MenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {\n const container = usePortalContainer();\n return <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" container={container} {...props} />;\n}\n\nfunction DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nfunction DropdownMenuContent({\n align = \"start\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n className,\n ...props\n}: MenuPrimitive.Popup.Props &\n Pick<MenuPrimitive.Positioner.Props, \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\">) {\n return (\n <MenuPrimitive.Portal container={usePortalContainer()}>\n <MenuPrimitive.Positioner\n className=\"isolate z-50 outline-none\"\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n data-slot=\"dropdown-menu-content\"\n className={cn(\n \"z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n />\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<\"div\"> & {\n inset?: boolean;\n}) {\n return (\n <div\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <MenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.SubmenuTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-popup-open:bg-accent data-popup-open:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n align = \"start\",\n alignOffset = -3,\n side = \"right\",\n sideOffset = 0,\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n return (\n <DropdownMenuContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"w-auto min-w-[96px] rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <MenuPrimitive.CheckboxItemIndicator>\n <CheckIcon />\n </MenuPrimitive.CheckboxItemIndicator>\n </span>\n {children}\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {\n return <MenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />;\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: MenuPrimitive.RadioItem.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <MenuPrimitive.RadioItemIndicator>\n <CheckIcon />\n </MenuPrimitive.RadioItemIndicator>\n </span>\n {children}\n </MenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuSeparator({ className, ...props }: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n};\n","import { Fragment, useEffect, useId, useState } from \"react\";\nimport {\n Circle,\n Copy,\n Download,\n Gauge,\n Info,\n Lock,\n LockOpen,\n Maximize2,\n MoreVertical,\n Monitor,\n MousePointer2,\n RotateCcw,\n Share2,\n X,\n} from \"lucide-react\";\nimport { Button } from \"@aperture-browser/ui/components/button\";\nimport { Field, FieldGroup, FieldLabel } from \"@aperture-browser/ui/components/field\";\nimport { Input } from \"@aperture-browser/ui/components/input\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"@aperture-browser/ui/components/dropdown-menu\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@aperture-browser/ui/components/tooltip\";\nimport {\n createViewportPreset,\n formatViewportScale,\n VIEWPORT_DEVICE_SCALE_FACTORS,\n VIEWPORT_PRESETS,\n} from \"@aperture-browser/live-session\";\nimport type { UseBrowserControlResult } from \"../hooks/use-browser-control.ts\";\nimport { copyTextWithToast } from \"../clipboard.ts\";\nimport { useEffectCallback } from \"../effect.tsx\";\nimport { toast } from \"sonner\";\n\nconst STREAM_PRESETS = [\n {\n id: \"low\",\n label: \"Low\",\n detail: \"20 fps · max 800 kbps\",\n settings: { fps: 20, bitrateKbps: 800 },\n },\n {\n id: \"balanced\",\n label: \"Balanced\",\n detail: \"30 fps · max 3000 kbps\",\n settings: { fps: 30, bitrateKbps: 3000 },\n },\n {\n id: \"high\",\n label: \"High\",\n detail: \"60 fps · max 20000 kbps\",\n settings: { fps: 60, bitrateKbps: 20_000 },\n },\n] as const;\n\nconst STREAM_LIMITS = {\n fps: { min: 1, max: 120 },\n bitrateKbps: { min: 100, max: 50_000 },\n} as const;\n\nconst VIEWPORT_LIMITS = {\n width: { min: 1, max: 16_384 },\n height: { min: 1, max: 16_384 },\n deviceScaleFactor: { min: 0.25, max: 4 },\n} as const;\n\nexport function BrowserMenus({\n control,\n cdpUrl,\n shareUrls,\n busy,\n connected,\n localCursorEnabled,\n onLocalCursorChange,\n onReconnect,\n onSessionDetails,\n now,\n}: {\n control: UseBrowserControlResult;\n cdpUrl: string | null;\n shareUrls: { editor: string; viewer: string } | null;\n busy: boolean;\n connected: boolean;\n localCursorEnabled: boolean;\n onLocalCursorChange: (enabled: boolean) => void;\n onReconnect: () => void;\n onSessionDetails?: () => void;\n now: number;\n}) {\n const runningRecordings = control.recordings.filter(\n (recording) => recording.status === \"starting\" || recording.status === \"running\",\n );\n const recordingActive = runningRecordings.length > 0;\n\n return (\n <>\n <div className=\"shrink-0 sm:hidden\">\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger\n render={\n <DropdownMenuTrigger\n render={\n <Button\n type=\"button\"\n variant={recordingActive ? \"destructive\" : \"ghost\"}\n size=\"icon-sm\"\n aria-label={\n recordingActive ? \"Browser menu, recording active\" : \"Browser menu\"\n }\n />\n }\n />\n }\n >\n {recordingActive ? <Circle fill=\"currentColor\" /> : <MoreVertical />}\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {recordingActive ? \"Browser menu, recording active\" : \"Browser menu\"}\n </TooltipContent>\n </Tooltip>\n <DropdownMenuContent align=\"end\" className=\"w-72\">\n <RestMenuItems\n control={control}\n cdpUrl={cdpUrl}\n shareUrls={shareUrls}\n onSessionDetails={onSessionDetails}\n />\n <DropdownMenuSeparator />\n <RecordingMenuItems\n control={control}\n connected={connected && control.collaboration.role === \"owner\"}\n runningRecordings={runningRecordings}\n now={now}\n />\n <DropdownMenuSeparator />\n <ViewportStreamMenuItems\n control={control}\n connected={connected && control.collaboration.role !== \"viewer\"}\n localCursorEnabled={localCursorEnabled}\n onLocalCursorChange={onLocalCursorChange}\n busy={busy}\n onReconnect={onReconnect}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n <div className=\"hidden shrink-0 items-center gap-0.5 sm:flex\">\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger\n render={\n <DropdownMenuTrigger\n render={\n <Button\n type=\"button\"\n variant={recordingActive ? \"destructive\" : \"ghost\"}\n size=\"icon-sm\"\n aria-label={recordingActive ? \"Recording in progress\" : \"Recording\"}\n />\n }\n />\n }\n >\n <Circle fill={recordingActive ? \"currentColor\" : \"none\"} />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {recordingActive ? \"Recording in progress\" : \"Recording\"}\n </TooltipContent>\n </Tooltip>\n <DropdownMenuContent align=\"end\" className=\"w-72\">\n <RecordingMenuItems\n control={control}\n connected={connected && control.collaboration.role === \"owner\"}\n runningRecordings={runningRecordings}\n now={now}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger\n render={\n <DropdownMenuTrigger\n render={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Viewport and stream\"\n />\n }\n />\n }\n >\n <Monitor />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Viewport and stream</TooltipContent>\n </Tooltip>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <ViewportStreamMenuItems\n control={control}\n connected={connected && control.collaboration.role !== \"viewer\"}\n localCursorEnabled={localCursorEnabled}\n onLocalCursorChange={onLocalCursorChange}\n busy={busy}\n onReconnect={onReconnect}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger\n render={\n <DropdownMenuTrigger\n render={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"More browser actions\"\n />\n }\n />\n }\n >\n <MoreVertical />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">More browser actions</TooltipContent>\n </Tooltip>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <RestMenuItems\n control={control}\n cdpUrl={cdpUrl}\n shareUrls={shareUrls}\n onSessionDetails={onSessionDetails}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </>\n );\n}\n\nfunction RestMenuItems({\n control,\n cdpUrl,\n shareUrls,\n onSessionDetails,\n}: {\n control: UseBrowserControlResult;\n cdpUrl: string | null;\n shareUrls: { editor: string; viewer: string } | null;\n onSessionDetails?: () => void;\n}) {\n const copy = useEffectCallback(\n (value: string, copied: string) => copyTextWithToast(value, () => toast.success(copied)),\n [],\n );\n\n return (\n <DropdownMenuGroup>\n <InputControlMenuItem control={control} />\n {onSessionDetails ? (\n <DropdownMenuItem onClick={onSessionDetails}>\n <Info />\n Session details\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem\n disabled={!cdpUrl}\n onClick={() => {\n if (!cdpUrl) {\n return;\n }\n copy(cdpUrl, \"CDP URL copied\");\n }}\n >\n <Copy />\n Copy CDP URL\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!shareUrls}\n onClick={() => {\n if (!shareUrls) {\n return;\n }\n copy(shareUrls.editor, \"Editor URL copied\");\n }}\n >\n <Share2 />\n Copy editor URL\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!shareUrls}\n onClick={() => {\n if (!shareUrls) {\n return;\n }\n copy(shareUrls.viewer, \"Viewer URL copied\");\n }}\n >\n <Share2 />\n Copy viewer URL\n </DropdownMenuItem>\n </DropdownMenuGroup>\n );\n}\n\nfunction InputControlMenuItem({ control }: { control: UseBrowserControlResult }) {\n const collaboration = control.collaboration;\n const targetId = control.activeTargetId;\n const explicitControlClaimed =\n collaboration.holderClientId !== null && collaboration.leaseMode === \"explicit\";\n const localControlClaimed = collaboration.hasControl && collaboration.leaseMode === \"explicit\";\n let label = \"Control offline\";\n let disabled = collaboration.phase !== \"connected\" || !targetId;\n let action = () => undefined;\n\n if (collaboration.role === \"viewer\") {\n label = \"View only\";\n disabled = true;\n } else if (collaboration.hasControl && collaboration.leaseMode === \"explicit\") {\n label = \"Release control\";\n action = () => {\n collaboration.release();\n };\n } else if (collaboration.hasControl) {\n label = \"Claim control\";\n action = () => {\n if (targetId) {\n collaboration.claim(targetId, \"explicit\");\n }\n };\n } else {\n const holder = collaboration.participants.find(\n (participant) => participant.clientId === collaboration.holderClientId,\n );\n const canPreempt = collaboration.role === \"owner\" && holder?.role === \"editor\";\n const controlBlocked = explicitControlClaimed && !canPreempt;\n label = controlBlocked ? \"Control in use\" : \"Claim control\";\n disabled = disabled || controlBlocked;\n action = () => {\n if (targetId) {\n collaboration.claim(targetId, \"explicit\");\n }\n };\n }\n\n return (\n <DropdownMenuItem disabled={disabled} onClick={action}>\n {localControlClaimed ? <Lock /> : <LockOpen />}\n {label}\n </DropdownMenuItem>\n );\n}\n\nfunction RecordingMenuItems({\n control,\n connected,\n runningRecordings,\n now,\n}: {\n control: UseBrowserControlResult;\n connected: boolean;\n runningRecordings: UseBrowserControlResult[\"recordings\"];\n now: number;\n}) {\n const recordingAvailable = connected && control.collaboration.role === \"owner\";\n const canStart = recordingAvailable && Boolean(control.activeTargetId) && !control.recordingBusy;\n return (\n <>\n <DropdownMenuGroup>\n <DropdownMenuLabel>Recording</DropdownMenuLabel>\n <DropdownMenuItem disabled={!canStart} onClick={() => control.startRecording(\"tab\")}>\n <Circle />\n <span className=\"flex min-w-0 flex-col\">\n <span>Record this tab</span>\n <span className=\"text-xs text-muted-foreground\">Stay pinned to this target</span>\n </span>\n </DropdownMenuItem>\n <DropdownMenuItem disabled={!canStart} onClick={() => control.startRecording(\"viewer\")}>\n <Monitor />\n <span className=\"flex min-w-0 flex-col\">\n <span>Record this viewer</span>\n <span className=\"text-xs text-muted-foreground\">\n {recordingAvailable ? \"Follow tab switches\" : \"Owner connection required\"}\n </span>\n </span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n {runningRecordings.map((recording) => {\n const target = control.targets.find((candidate) => candidate.id === recording.targetId);\n return (\n <Fragment key={recording.recordingId}>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuLabel>\n <span className=\"flex min-w-0 items-center justify-between gap-2\">\n <span className=\"truncate\">\n {recording.mode === \"viewer\" ? \"Viewer\" : \"Tab\"}:{\" \"}\n {target?.title || recording.targetId.slice(0, 8)}\n </span>\n <span className=\"shrink-0 tabular-nums\">\n {formatElapsed(recording.startedAt, now)}\n </span>\n </span>\n </DropdownMenuLabel>\n <DropdownMenuItem\n disabled={control.recordingBusy}\n onClick={() => control.stopRecording(recording.recordingId)}\n >\n <Download />\n Stop and download\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={control.recordingBusy}\n onClick={() => control.cancelRecording(recording.recordingId)}\n >\n <X />\n Cancel without download\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </Fragment>\n );\n })}\n </>\n );\n}\n\nfunction ViewportStreamMenuItems({\n control,\n connected,\n localCursorEnabled,\n onLocalCursorChange,\n busy,\n onReconnect,\n}: {\n control: UseBrowserControlResult;\n connected: boolean;\n localCursorEnabled: boolean;\n onLocalCursorChange: (enabled: boolean) => void;\n busy: boolean;\n onReconnect: () => void;\n}) {\n return (\n <DropdownMenuGroup>\n <ViewportMenu control={control} connected={connected} />\n {control.mediaVideoProfiles.length > 0 ? (\n <StreamMenu\n control={control}\n qualityUpdatesEnabled={control.collaboration.role !== \"viewer\"}\n />\n ) : null}\n <DropdownMenuCheckboxItem\n disabled={!connected || control.collaboration.role === \"viewer\"}\n checked={control.remoteCursorEnabled}\n onCheckedChange={control.setRemoteCursorEnabled}\n >\n <MousePointer2 />\n Remote cursor\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem checked={localCursorEnabled} onCheckedChange={onLocalCursorChange}>\n <MousePointer2 />\n Local cursor\n </DropdownMenuCheckboxItem>\n <DropdownMenuItem disabled={busy} onClick={onReconnect}>\n <RotateCcw />\n Reconnect\n </DropdownMenuItem>\n </DropdownMenuGroup>\n );\n}\n\nfunction StreamMenu({\n control,\n qualityUpdatesEnabled,\n}: {\n control: UseBrowserControlResult;\n qualityUpdatesEnabled: boolean;\n}) {\n const settings = control.mediaStreamSettings;\n const source =\n control.mediaPath === \"websocket-live\"\n ? \"jpeg\"\n : qualityUpdatesEnabled\n ? settings?.profile\n : \"webrtc\";\n const disabled = control.mediaSwitching || control.phase !== \"connected\";\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Gauge />\n Stream\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-64\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>Source</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={source}\n onValueChange={(value) => {\n if (value === \"jpeg\") {\n control.selectMediaStream({ kind: \"jpeg\" });\n return;\n }\n if (value === \"webrtc\") {\n control.selectMediaStream({ kind: \"webrtc-retry\" });\n return;\n }\n const profile = control.mediaVideoProfiles.find(\n (candidate) => candidate.id === value,\n );\n if (profile && settings) {\n control.selectMediaStream({\n kind: \"webrtc\",\n quality: { ...settings, profile: profile.id },\n });\n }\n }}\n >\n {!qualityUpdatesEnabled ? (\n <DropdownMenuRadioItem value=\"webrtc\" disabled={disabled}>\n <span className=\"flex min-w-0 flex-col\">\n <span>WebRTC</span>\n <span className=\"text-xs text-muted-foreground\">Live video</span>\n </span>\n </DropdownMenuRadioItem>\n ) : null}\n {qualityUpdatesEnabled\n ? control.mediaVideoProfiles.map((profile) => (\n <DropdownMenuRadioItem\n key={profile.id}\n value={profile.id}\n disabled={disabled || !settings}\n >\n <span className=\"flex min-w-0 flex-col\">\n <span>{profile.label}</span>\n <span className=\"text-xs text-muted-foreground\">\n {profile.codec} · WebRTC\n </span>\n </span>\n </DropdownMenuRadioItem>\n ))\n : null}\n <DropdownMenuRadioItem value=\"jpeg\" disabled={disabled}>\n <span className=\"flex min-w-0 flex-col\">\n <span>JPEG</span>\n <span className=\"text-xs text-muted-foreground\">WebSocket raster stream</span>\n </span>\n </DropdownMenuRadioItem>\n </DropdownMenuRadioGroup>\n {qualityUpdatesEnabled && control.mediaPath === \"webrtc-live\" && settings ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Quality</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={activeStreamPresetId(settings)}\n onValueChange={(value) => {\n const preset = STREAM_PRESETS.find((item) => item.id === value);\n if (preset) {\n control.setWebRTCStreamSettings({ ...settings, ...preset.settings });\n }\n }}\n >\n {STREAM_PRESETS.map((preset) => (\n <DropdownMenuRadioItem key={preset.id} value={preset.id} disabled={disabled}>\n <span className=\"flex min-w-0 flex-col\">\n <span>{preset.label}</span>\n <span className=\"text-xs text-muted-foreground\">{preset.detail}</span>\n </span>\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n <DropdownMenuSeparator />\n <CustomStreamSettings\n settings={settings}\n disabled={disabled}\n onApply={control.setWebRTCStreamSettings}\n />\n </>\n ) : null}\n </DropdownMenuGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n );\n}\n\nfunction ViewportMenu({\n control,\n connected,\n}: {\n control: UseBrowserControlResult;\n connected: boolean;\n}) {\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Monitor />\n Viewport\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-64\">\n <DropdownMenuLabel>Viewport</DropdownMenuLabel>\n <DropdownMenuItem\n disabled={!connected || !control.browserViewportSize}\n onClick={() => control.setViewportToBrowserSize()}\n >\n <Maximize2 />\n Set to browser size\n </DropdownMenuItem>\n <DropdownMenuCheckboxItem\n disabled={!connected || !control.browserViewportSize}\n checked={control.viewportAutoSync}\n onCheckedChange={control.setViewportAutoSync}\n >\n <Monitor />\n Auto sync browser size\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuRadioGroup\n value={activeViewportPresetId(control.viewport)}\n onValueChange={(value) => {\n const preset = VIEWPORT_PRESETS.find((item) => item.id === value);\n if (preset) {\n control.setViewport(\n createViewportPreset(\n preset.width,\n preset.height,\n control.viewport.deviceScaleFactor,\n ),\n );\n }\n }}\n >\n {VIEWPORT_PRESETS.map((preset) => (\n <DropdownMenuRadioItem key={preset.id} value={preset.id} disabled={!connected}>\n <Monitor />\n {preset.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Scale</DropdownMenuLabel>\n <DropdownMenuRadioGroup\n value={activeViewportScaleId(control.viewport.deviceScaleFactor)}\n onValueChange={(value) => {\n const nextScale = VIEWPORT_DEVICE_SCALE_FACTORS.find(\n (item) => formatViewportScale(item) === value,\n );\n if (nextScale) {\n control.setViewport(\n createViewportPreset(control.viewport.width, control.viewport.height, nextScale),\n );\n }\n }}\n >\n {VIEWPORT_DEVICE_SCALE_FACTORS.map((deviceScaleFactor) => (\n <DropdownMenuRadioItem\n key={deviceScaleFactor}\n value={formatViewportScale(deviceScaleFactor)}\n disabled={!connected}\n >\n <Monitor />\n {formatViewportScale(deviceScaleFactor)}x\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n <DropdownMenuSeparator />\n <CustomViewportSettings\n viewport={control.viewport}\n connected={connected}\n onApply={control.setViewport}\n />\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n );\n}\n\nfunction CustomViewportSettings({\n viewport,\n connected,\n onApply,\n}: {\n viewport: UseBrowserControlResult[\"viewport\"];\n connected: boolean;\n onApply: UseBrowserControlResult[\"setViewport\"];\n}) {\n const [width, setWidth] = useState(String(viewport.width));\n const [height, setHeight] = useState(String(viewport.height));\n const [deviceScaleFactor, setDeviceScaleFactor] = useState(\n formatViewportScale(viewport.deviceScaleFactor),\n );\n\n useEffect(() => {\n setWidth(String(viewport.width));\n setHeight(String(viewport.height));\n setDeviceScaleFactor(formatViewportScale(viewport.deviceScaleFactor));\n }, [viewport]);\n\n const nextViewport = parseViewportSettings({ width, height, deviceScaleFactor });\n const unchanged = nextViewport\n ? viewport.width === nextViewport.width &&\n viewport.height === nextViewport.height &&\n viewport.deviceScaleFactor === nextViewport.deviceScaleFactor\n : false;\n\n return (\n <div\n className=\"grid gap-2 px-2 py-1.5\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n <DropdownMenuLabel className=\"px-0\">Custom</DropdownMenuLabel>\n <div className=\"grid grid-cols-3 gap-2\">\n <StreamNumberField label=\"Width\" value={width} onChange={setWidth} />\n <StreamNumberField label=\"Height\" value={height} onChange={setHeight} />\n <ViewportScaleField\n label=\"Scale\"\n value={deviceScaleFactor}\n onChange={setDeviceScaleFactor}\n />\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7\"\n disabled={!connected || !nextViewport || unchanged}\n onClick={() => {\n if (nextViewport) {\n onApply(nextViewport);\n }\n }}\n >\n Apply\n </Button>\n </div>\n );\n}\n\nfunction CustomStreamSettings({\n settings,\n disabled,\n onApply,\n}: {\n settings: NonNullable<UseBrowserControlResult[\"mediaStreamSettings\"]>;\n disabled: boolean;\n onApply: UseBrowserControlResult[\"setWebRTCStreamSettings\"];\n}) {\n const [fps, setFps] = useState(String(settings.fps));\n const [bitrateKbps, setBitrateKbps] = useState(String(settings.bitrateKbps));\n\n useEffect(() => {\n setFps(String(settings.fps));\n setBitrateKbps(String(settings.bitrateKbps));\n }, [settings]);\n\n const nextSettings = parseStreamSettings({ fps, bitrateKbps });\n const unchanged =\n settings.fps === nextSettings?.fps && settings.bitrateKbps === nextSettings?.bitrateKbps;\n\n return (\n <FieldGroup\n className=\"gap-2 px-2 py-1.5\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n <DropdownMenuLabel className=\"px-0\">Custom</DropdownMenuLabel>\n <div className=\"grid grid-cols-2 gap-2\">\n <StreamNumberField label=\"FPS\" value={fps} onChange={setFps} />\n <StreamNumberField label=\"Max Kbps\" value={bitrateKbps} onChange={setBitrateKbps} />\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7 w-full\"\n disabled={disabled || !nextSettings || unchanged}\n onClick={() => {\n if (nextSettings) {\n onApply({ ...settings, ...nextSettings });\n }\n }}\n >\n Apply\n </Button>\n </FieldGroup>\n );\n}\n\nfunction StreamNumberField({\n label,\n value,\n onChange,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n const id = useId();\n return (\n <Field className=\"gap-1\">\n <FieldLabel htmlFor={id}>{label}</FieldLabel>\n <Input\n id={id}\n type=\"text\"\n inputMode=\"numeric\"\n value={value}\n onChange={(event) => onChange(digitsOnly(event.currentTarget.value))}\n onFocus={(event) => event.currentTarget.select()}\n className=\"h-7\"\n />\n </Field>\n );\n}\n\nfunction ViewportScaleField({\n label,\n value,\n onChange,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n const id = useId();\n return (\n <Field className=\"gap-1\">\n <FieldLabel htmlFor={id}>{label}</FieldLabel>\n <Input\n id={id}\n type=\"text\"\n inputMode=\"decimal\"\n value={value}\n onChange={(event) => onChange(decimalNumber(event.currentTarget.value))}\n onFocus={(event) => event.currentTarget.select()}\n className=\"h-7\"\n />\n </Field>\n );\n}\n\nfunction parseViewportSettings({\n width,\n height,\n deviceScaleFactor,\n}: {\n width: string;\n height: string;\n deviceScaleFactor: string;\n}) {\n if (!width || !height || !deviceScaleFactor) {\n return null;\n }\n const parsedWidth = Number(width);\n const parsedHeight = Number(height);\n const parsedScale = Number(deviceScaleFactor);\n if (\n !Number.isFinite(parsedWidth) ||\n !Number.isFinite(parsedHeight) ||\n !Number.isFinite(parsedScale)\n ) {\n return null;\n }\n const nextWidth = clampInteger(parsedWidth, VIEWPORT_LIMITS.width.min, VIEWPORT_LIMITS.width.max);\n const nextHeight = clampInteger(\n parsedHeight,\n VIEWPORT_LIMITS.height.min,\n VIEWPORT_LIMITS.height.max,\n );\n const maxScale = Math.min(\n VIEWPORT_LIMITS.deviceScaleFactor.max,\n VIEWPORT_LIMITS.width.max / nextWidth,\n VIEWPORT_LIMITS.height.max / nextHeight,\n );\n const nextScale = clampDecimal(parsedScale, VIEWPORT_LIMITS.deviceScaleFactor.min, maxScale);\n return createViewportPreset(nextWidth, nextHeight, nextScale);\n}\n\nfunction parseStreamSettings({ fps, bitrateKbps }: { fps: string; bitrateKbps: string }) {\n if (!fps || !bitrateKbps) {\n return null;\n }\n return {\n fps: clampInteger(Number(fps), STREAM_LIMITS.fps.min, STREAM_LIMITS.fps.max),\n bitrateKbps: clampInteger(\n Number(bitrateKbps),\n STREAM_LIMITS.bitrateKbps.min,\n STREAM_LIMITS.bitrateKbps.max,\n ),\n };\n}\n\nfunction digitsOnly(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\nfunction decimalNumber(value: string): string {\n const [integer = \"\", ...fraction] = value.replace(/[^\\d.]/g, \"\").split(\".\");\n return fraction.length ? `${integer}.${fraction.join(\"\")}` : integer;\n}\n\nfunction clampInteger(value: number, min: number, max: number): number {\n return Math.min(Math.max(Math.round(value), min), max);\n}\n\nfunction clampDecimal(value: number, min: number, max: number): number {\n return Math.min(Math.max(Math.round(value * 100) / 100, min), max);\n}\n\nfunction activeViewportPresetId(viewport: UseBrowserControlResult[\"viewport\"]) {\n const preset = VIEWPORT_PRESETS.find(\n (item) => viewport.width === item.width && viewport.height === item.height,\n );\n return preset?.id ?? \"\";\n}\n\nfunction activeViewportScaleId(deviceScaleFactor: number) {\n const preset = VIEWPORT_DEVICE_SCALE_FACTORS.find((item) => item === deviceScaleFactor);\n return preset ? formatViewportScale(preset) : \"\";\n}\n\nfunction activeStreamPresetId(settings: UseBrowserControlResult[\"mediaStreamSettings\"]) {\n if (!settings) {\n return \"\";\n }\n const preset = STREAM_PRESETS.find(\n (item) =>\n settings.fps === item.settings.fps && settings.bitrateKbps === item.settings.bitrateKbps,\n );\n return preset?.id ?? \"\";\n}\n\nfunction formatElapsed(startedAt: string, now: number): string {\n const elapsed = Math.max(0, Math.floor((now - Date.parse(startedAt)) / 1000));\n const hours = Math.floor(elapsed / 3600);\n const minutes = Math.floor((elapsed % 3600) / 60);\n const seconds = elapsed % 60;\n return hours > 0\n ? `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`\n : `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`;\n}\n","import * as React from \"react\";\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\n\nimport { cn } from \"../utils.ts\";\n\nfunction Avatar({\n className,\n size = \"default\",\n ...props\n}: AvatarPrimitive.Root.Props & {\n size?: \"default\" | \"sm\" | \"lg\";\n}) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n \"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full rounded-full object-cover\", className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({ className, ...props }: AvatarPrimitive.Fallback.Props) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AvatarGroupCount({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarBadge };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\n\nimport { cn } from \"../utils.ts\";\nimport { usePortalContainer } from \"../portal.tsx\";\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n ...props\n}: PopoverPrimitive.Popup.Props &\n Pick<PopoverPrimitive.Positioner.Props, \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\">) {\n return (\n <PopoverPrimitive.Portal container={usePortalContainer()}>\n <PopoverPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n side={side}\n sideOffset={sideOffset}\n className=\"isolate z-50\"\n >\n <PopoverPrimitive.Popup\n data-slot=\"popover-content\"\n className={cn(\n \"z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-0.5 text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n return (\n <PopoverPrimitive.Title\n data-slot=\"popover-title\"\n className={cn(\"font-medium\", className)}\n {...props}\n />\n );\n}\n\nfunction PopoverDescription({ className, ...props }: PopoverPrimitive.Description.Props) {\n return (\n <PopoverPrimitive.Description\n data-slot=\"popover-description\"\n className={cn(\"text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport { Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger };\n","import { Lock, Radio } from \"lucide-react\";\nimport {\n Avatar,\n AvatarBadge,\n AvatarFallback,\n AvatarImage,\n} from \"@aperture-browser/ui/components/avatar\";\nimport { Button } from \"@aperture-browser/ui/components/button\";\nimport {\n Popover,\n PopoverContent,\n PopoverTitle,\n PopoverTrigger,\n} from \"@aperture-browser/ui/components/popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@aperture-browser/ui/components/tooltip\";\nimport type { CollaborationControl } from \"../hooks/use-live-session.ts\";\nimport type { CollaborationParticipant } from \"@aperture-browser/live-session\";\nimport { cn } from \"@aperture-browser/ui/utils\";\n\nconst visibleParticipantCount = 5;\n\nexport function CollaborationPresence({ collaboration }: { collaboration: CollaborationControl }) {\n const participants = [...collaboration.participants].sort((left, right) => {\n if (left.clientId === collaboration.clientId) {\n return -1;\n }\n if (right.clientId === collaboration.clientId) {\n return 1;\n }\n if (left.holdingInput !== right.holdingInput) {\n return left.holdingInput ? -1 : 1;\n }\n return left.name.localeCompare(right.name);\n });\n const visible = participants.slice(0, visibleParticipantCount);\n const overflow = participants.length - visible.length;\n\n if (visible.length === 0) {\n return null;\n }\n\n return (\n <div className=\"group flex shrink-0 items-center px-2\" aria-label=\"Session participants\">\n {overflow > 0 ? (\n <div\n className=\"relative transition-[margin] duration-200\"\n style={{ zIndex: visible.length + 1 }}\n >\n <OverflowParticipants\n overflow={overflow}\n participants={participants}\n collaboration={collaboration}\n />\n </div>\n ) : null}\n {visible.map((participant, index) => (\n <div\n key={participant.clientId}\n className={cn(\n \"relative transition-[margin] duration-200\",\n (index > 0 || overflow > 0) && \"-ml-4 group-hover:ml-0 group-focus-within:ml-0\",\n )}\n style={{ zIndex: visible.length - index }}\n >\n <ParticipantButton participant={participant} collaboration={collaboration} />\n </div>\n ))}\n </div>\n );\n}\n\nfunction OverflowParticipants({\n overflow,\n participants,\n collaboration,\n}: {\n overflow: number;\n participants: CollaborationParticipant[];\n collaboration: CollaborationControl;\n}) {\n return (\n <Popover>\n <PopoverTrigger\n render={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0 rounded-full border bg-background text-[0.65rem] text-muted-foreground\"\n aria-label={`${overflow} more participants`}\n />\n }\n >\n +{overflow}\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-auto gap-2\">\n <PopoverTitle className=\"text-xs text-muted-foreground\">Everyone</PopoverTitle>\n <div className=\"flex flex-wrap items-center gap-1\">\n {participants.map((participant) => (\n <ParticipantButton\n key={participant.clientId}\n participant={participant}\n collaboration={collaboration}\n />\n ))}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction ParticipantButton({\n participant,\n collaboration,\n}: {\n participant: CollaborationParticipant;\n collaboration: CollaborationControl;\n}) {\n const local = participant.clientId === collaboration.clientId;\n const followable = participant.role !== \"automation\";\n const following = participant.clientId === collaboration.followingClientId;\n const label = local\n ? `${participant.name} (you)`\n : !followable\n ? participant.name\n : following\n ? `${participant.name} · click to stop following`\n : `${participant.name} · click to follow`;\n const trigger =\n local || !followable ? (\n <span\n className=\"inline-flex size-7 shrink-0 items-center justify-center rounded-full\"\n aria-label={label}\n />\n ) : (\n <Button\n type=\"button\"\n variant={following ? \"secondary\" : \"ghost\"}\n size=\"icon-sm\"\n className=\"shrink-0 rounded-full p-0\"\n aria-label={label}\n aria-pressed={following}\n onClick={() => collaboration.follow(following ? null : participant.clientId)}\n />\n );\n\n return (\n <Tooltip>\n <TooltipTrigger render={trigger}>\n <ParticipantAvatar participant={participant} following={following} />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction ParticipantAvatar({\n participant,\n following,\n}: {\n participant: CollaborationParticipant;\n following: boolean;\n}) {\n const controlClaimed = participant.holdingInput && participant.leaseMode === \"explicit\";\n\n return (\n <Avatar size=\"sm\" className={cn(\"shrink-0 ring-2 ring-background\", following && \"ring-ring\")}>\n <AvatarImage src={gravatarURL(participant.avatarHash)} alt=\"\" />\n <AvatarFallback>{initials(participant.name)}</AvatarFallback>\n {participant.holdingInput ? (\n <AvatarBadge\n className={cn(\n \"bg-emerald-500\",\n controlClaimed &&\n \"group-data-[size=sm]/avatar:size-3 group-data-[size=sm]/avatar:[&>svg]:!block group-data-[size=sm]/avatar:[&>svg]:size-2\",\n )}\n title={controlClaimed ? \"Control claimed\" : \"Has input control\"}\n >\n {controlClaimed ? <Lock /> : <Radio />}\n </AvatarBadge>\n ) : null}\n </Avatar>\n );\n}\n\nfunction gravatarURL(hash: string) {\n return `https://www.gravatar.com/avatar/${encodeURIComponent(hash)}?d=identicon&s=64`;\n}\n\nfunction initials(name: string) {\n return name\n .split(/\\s+/)\n .slice(0, 2)\n .map((part) => part[0]?.toUpperCase() ?? \"\")\n .join(\"\");\n}\n","import { useState, type ReactNode } from \"react\";\nimport {\n ArrowLeft,\n ArrowRight,\n Loader2,\n PanelBottom,\n PanelRight,\n Pencil,\n RefreshCw,\n Square,\n Wrench,\n} from \"lucide-react\";\nimport * as Effect from \"effect/Effect\";\nimport * as Schedule from \"effect/Schedule\";\nimport { Button } from \"@aperture-browser/ui/components/button\";\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuGroup,\n ContextMenuLabel,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuTrigger,\n} from \"@aperture-browser/ui/components/context-menu\";\nimport { InputGroup, InputGroupInput } from \"@aperture-browser/ui/components/input-group\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@aperture-browser/ui/components/tooltip\";\nimport type { UseBrowserControlResult } from \"../hooks/use-browser-control.ts\";\nimport { useFork } from \"../effect.tsx\";\nimport type { ResolvedSessionFeatures } from \"../features.ts\";\nimport { BrowserTabStrip } from \"./browser-tab-strip.tsx\";\nimport { BrowserMenus } from \"./browser-toolbar-menus.tsx\";\nimport type { DevToolsDock } from \"./browser-devtools-pane.tsx\";\nimport type { CollaborationRole } from \"@aperture-browser/live-session\";\nimport { CollaborationPresence } from \"./collaboration-presence.tsx\";\n\ninterface BrowserToolbarProps {\n control: UseBrowserControlResult;\n leading?: ReactNode;\n features: ResolvedSessionFeatures;\n collaborationRole: CollaborationRole;\n cdpUrl: string | null;\n shareUrls: { editor: string; viewer: string } | null;\n localCursorEnabled: boolean;\n onLocalCursorChange: (enabled: boolean) => void;\n paintingEnabled: boolean;\n onPaintingEnabledChange: (enabled: boolean) => void;\n devToolsOpen: boolean;\n devToolsTargetIds: ReadonlySet<string>;\n devToolsDock: DevToolsDock;\n onDevToolsOpenChange: (open: boolean) => void;\n onDevToolsDockChange: (dock: DevToolsDock) => void;\n onSessionDetails?: () => void;\n}\n\nexport function BrowserToolbar({\n control,\n leading,\n features,\n collaborationRole,\n cdpUrl,\n shareUrls,\n localCursorEnabled,\n onLocalCursorChange,\n paintingEnabled,\n onPaintingEnabledChange,\n devToolsOpen,\n devToolsTargetIds,\n devToolsDock,\n onDevToolsOpenChange,\n onDevToolsDockChange,\n onSessionDetails,\n}: BrowserToolbarProps) {\n const [urlDraft, setUrlDraft] = useState<string | null>(null);\n\n const displayUrl = control.activeTarget?.url ?? \"\";\n const busy = control.phase === \"connecting\";\n const connected = control.phase === \"connected\";\n const browserMutationEnabled = connected && collaborationRole !== \"viewer\";\n const drawingAvailable =\n connected && control.collaboration.phase === \"connected\" && Boolean(control.activeTargetId);\n const loading = control.activeTarget?.loading ?? false;\n const runningRecordings = control.recordings.filter(\n (recording) => recording.status === \"starting\" || recording.status === \"running\",\n );\n const hasRunningRecordings = runningRecordings.length > 0;\n const recordingTargetIds = new Set(runningRecordings.map((recording) => recording.targetId));\n const [recordingNow, setRecordingNow] = useState(Date.now());\n\n useFork(\n () =>\n hasRunningRecordings\n ? Effect.repeat(\n Effect.sync(() => setRecordingNow(Date.now())),\n Schedule.spaced(1000),\n )\n : undefined,\n [hasRunningRecordings],\n );\n\n function handleNavigate(value: string) {\n const nextUrl = value.trim();\n if (!nextUrl) {\n return;\n }\n control.navigate(normalizeUrl(nextUrl));\n setUrlDraft(null);\n }\n\n return (\n <div className=\"flex min-w-0 flex-col bg-background\">\n {leading || features.tabs || features.presence ? (\n <div\n data-workbench-titlebar\n className=\"flex min-w-0 shrink-0 items-stretch border-b bg-muted/35\"\n >\n {leading}\n {features.tabs ? (\n <BrowserTabStrip\n targets={control.targets}\n activeTargetId={control.activeTargetId}\n recordingTargetIds={recordingTargetIds}\n devToolsTargetIds={devToolsTargetIds}\n disabled={!connected}\n mutationDisabled={!browserMutationEnabled}\n onActivate={control.activateTarget}\n onCreate={() => control.createTarget(\"about:blank\")}\n onDuplicate={control.duplicateTarget}\n onClose={control.closeTarget}\n onReload={control.reload}\n onReorder={control.reorderTargets}\n />\n ) : (\n <div className=\"min-w-0 flex-1\" />\n )}\n {features.presence ? (\n <CollaborationPresence collaboration={control.collaboration} />\n ) : null}\n </div>\n ) : null}\n {features.navigation ||\n features.addressBar ||\n features.drawing ||\n features.devTools ||\n features.menus ? (\n <div className=\"flex h-9 items-center gap-1 px-1.5\">\n {features.navigation ? (\n <div className=\"flex shrink-0 items-center gap-0.5\">\n <ToolbarButton\n label=\"Back\"\n disabled={!browserMutationEnabled}\n onClick={() => control.historyBack()}\n >\n <ArrowLeft />\n </ToolbarButton>\n <ToolbarButton\n label=\"Forward\"\n disabled={!browserMutationEnabled}\n onClick={() => control.historyForward()}\n >\n <ArrowRight />\n </ToolbarButton>\n <ToolbarButton\n label={loading ? \"Stop loading\" : \"Reload\"}\n disabled={!browserMutationEnabled}\n onClick={() => {\n if (loading) {\n control.stopLoading();\n } else if (control.activeTargetId) {\n control.reload(control.activeTargetId);\n }\n }}\n >\n {loading ? <Square /> : <RefreshCw />}\n </ToolbarButton>\n </div>\n ) : null}\n {features.addressBar ? (\n <InputGroup className=\"h-7 border-transparent bg-transparent transition-colors hover:border-input/50 hover:bg-muted/35 has-[[data-slot=input-group-control]:focus-visible]:border-input/70 has-[[data-slot=input-group-control]:focus-visible]:bg-background has-[[data-slot=input-group-control]:focus-visible]:ring-2 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/20 dark:hover:bg-input/20\">\n <InputGroupInput\n value={urlDraft ?? displayUrl}\n onChange={(event) => setUrlDraft(event.target.value)}\n onFocus={(event) => event.currentTarget.select()}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n handleNavigate(event.currentTarget.value);\n }\n }}\n placeholder=\"URL\"\n className=\"h-7 px-2 font-mono text-xs text-muted-foreground transition-colors focus-visible:text-foreground\"\n disabled={!browserMutationEnabled}\n />\n </InputGroup>\n ) : (\n <div className=\"min-w-0 flex-1\" />\n )}\n {busy ? <Loader2 className=\"size-4 shrink-0 animate-spin text-muted-foreground\" /> : null}\n {features.drawing ? (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n type=\"button\"\n variant={paintingEnabled ? \"secondary\" : \"ghost\"}\n size=\"icon-sm\"\n className=\"shrink-0\"\n disabled={!paintingEnabled && !drawingAvailable}\n aria-label={paintingEnabled ? \"Stop drawing\" : \"Draw on this tab\"}\n aria-pressed={paintingEnabled}\n onClick={() => onPaintingEnabledChange(!paintingEnabled)}\n />\n }\n >\n <Pencil />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {paintingEnabled ? \"Stop drawing\" : \"Draw on this tab\"}\n </TooltipContent>\n </Tooltip>\n ) : null}\n {features.devTools ? (\n <DevToolsButton\n open={devToolsOpen}\n dock={devToolsDock}\n available={\n collaborationRole === \"owner\" &&\n connected &&\n Boolean(cdpUrl && control.activeTargetId)\n }\n onOpenChange={onDevToolsOpenChange}\n onDockChange={onDevToolsDockChange}\n />\n ) : null}\n {features.menus ? (\n <BrowserMenus\n control={control}\n cdpUrl={cdpUrl}\n shareUrls={shareUrls}\n busy={busy}\n connected={connected}\n localCursorEnabled={localCursorEnabled}\n onLocalCursorChange={onLocalCursorChange}\n onReconnect={() => control.reconnect()}\n onSessionDetails={onSessionDetails}\n now={recordingNow}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction DevToolsButton({\n open,\n dock,\n available,\n onOpenChange,\n onDockChange,\n}: {\n open: boolean;\n dock: DevToolsDock;\n available: boolean;\n onOpenChange: (open: boolean) => void;\n onDockChange: (dock: DevToolsDock) => void;\n}) {\n const label = open ? \"Close DevTools\" : \"Open DevTools\";\n\n return (\n <ContextMenu>\n <Tooltip>\n <TooltipTrigger\n render={\n <ContextMenuTrigger\n render={\n <Button\n type=\"button\"\n variant={open ? \"secondary\" : \"ghost\"}\n size=\"icon-sm\"\n disabled={!open && !available}\n aria-label={label}\n aria-pressed={open}\n onClick={() => onOpenChange(!open)}\n />\n }\n />\n }\n >\n <Wrench />\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}. Right-click to choose dock side.</TooltipContent>\n </Tooltip>\n <ContextMenuContent>\n <ContextMenuGroup>\n <ContextMenuLabel>Dock side</ContextMenuLabel>\n <ContextMenuRadioGroup\n value={dock}\n onValueChange={(value) => {\n switch (value) {\n case \"bottom\":\n onDockChange(\"bottom\");\n break;\n case \"right\":\n onDockChange(\"right\");\n break;\n }\n }}\n >\n <ContextMenuRadioItem value=\"bottom\">\n <PanelBottom />\n Bottom\n </ContextMenuRadioItem>\n <ContextMenuRadioItem value=\"right\">\n <PanelRight />\n Right\n </ContextMenuRadioItem>\n </ContextMenuRadioGroup>\n </ContextMenuGroup>\n </ContextMenuContent>\n </ContextMenu>\n );\n}\n\nfunction ToolbarButton({\n label,\n disabled,\n onClick,\n children,\n}: {\n label: string;\n disabled?: boolean;\n onClick?: () => void;\n children: React.ReactNode;\n}) {\n return (\n <Tooltip>\n <TooltipTrigger\n render={\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n disabled={disabled}\n onClick={onClick}\n />\n }\n >\n {children}\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n\nfunction normalizeUrl(value: string): string {\n const trimmed = value.trim();\n if (isLocalHost(trimmed)) {\n return `http://${trimmed}`;\n }\n if (\n /^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed) ||\n /^(about|chrome|devtools|data|file):/i.test(trimmed)\n ) {\n return trimmed;\n }\n if (isLikelyHost(trimmed)) {\n return `https://${trimmed}`;\n }\n return `https://www.google.com/search?q=${encodeURIComponent(trimmed)}`;\n}\n\nfunction isLocalHost(value: string): boolean {\n return (\n /^localhost(?::\\d+)?(?:[/?#].*)?$/i.test(value) ||\n /^127(?:\\.\\d{1,3}){3}(?::\\d+)?(?:[/?#].*)?$/.test(value) ||\n /^[a-z0-9-]+:\\d+(?:[/?#].*)?$/i.test(value)\n );\n}\n\nfunction isLikelyHost(value: string): boolean {\n return !/\\s/.test(value) && /^[a-z0-9-]+(?:\\.[a-z0-9-]+)+(?:[/:?#].*)?$/i.test(value);\n}\n","import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils.ts\";\n\nconst badgeVariants = cva(\n \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary: \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline: \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n ghost: \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Badge({\n className,\n variant = \"default\",\n render,\n ...props\n}: useRender.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants>) {\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(\n {\n className: cn(badgeVariants({ variant }), className),\n },\n props,\n ),\n render,\n state: {\n slot: \"badge\",\n variant,\n },\n });\n}\n\nexport { Badge, badgeVariants };\n","import { toast } from \"sonner\";\nimport type { SessionNotice } from \"./hooks/use-browser-control.ts\";\n\nexport function showNotice(notice: SessionNotice): void {\n if (notice.level === \"error\") {\n toast.error(notice.message);\n } else {\n toast.success(notice.message);\n }\n}\n","import { Loader2, MousePointer2, Unplug } from \"lucide-react\";\nimport { Badge } from \"@aperture-browser/ui/components/badge\";\nimport { showNotice } from \"../notices.ts\";\nimport {\n SessionViewport,\n type SessionViewportOverlay,\n type SessionViewportPlaceholder,\n type SessionViewportProps,\n type SessionViewportStatus,\n} from \"./session-viewport.tsx\";\n\nexport interface BrowserViewportProps extends Omit<\n SessionViewportProps,\n \"renderOverlay\" | \"onNotice\"\n> {\n statusBadge?: boolean;\n}\n\nexport function BrowserViewport({ statusBadge = true, className, ...props }: BrowserViewportProps) {\n return (\n <SessionViewport\n {...props}\n className={className ?? \"bg-background\"}\n onNotice={showNotice}\n renderOverlay={(overlay) => <ViewportOverlay overlay={overlay} statusBadge={statusBadge} />}\n />\n );\n}\n\nfunction ViewportOverlay({\n overlay,\n statusBadge,\n}: {\n overlay: SessionViewportOverlay;\n statusBadge: boolean;\n}) {\n return (\n <>\n {overlay.placeholder ? (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <ViewportPlaceholder placeholder={overlay.placeholder} />\n </div>\n ) : null}\n {statusBadge ? (\n <div className=\"pointer-events-none absolute right-2 bottom-2 flex items-center gap-1.5\">\n <StatusBadge status={overlay.status} />\n </div>\n ) : null}\n {overlay.followedCursor ? (\n <div\n className=\"pointer-events-none absolute z-30 flex translate-x-[-2px] translate-y-[-2px] items-start text-primary drop-shadow-sm\"\n style={{ left: overlay.followedCursor.x, top: overlay.followedCursor.y }}\n >\n <MousePointer2 className=\"size-5 fill-primary stroke-background stroke-[1.5]\" />\n <span className=\"mt-4 -ml-1 rounded bg-primary px-1.5 py-0.5 text-[10px] leading-none font-medium whitespace-nowrap text-primary-foreground\">\n {overlay.followedCursor.name}\n </span>\n </div>\n ) : null}\n {overlay.cursorHint ? (\n <div\n className=\"pointer-events-none absolute z-20 max-w-64 translate-x-3 translate-y-3 rounded-md border bg-popover px-2 py-1 text-xs text-popover-foreground shadow-md\"\n style={{ left: overlay.cursorHint.x, top: overlay.cursorHint.y }}\n >\n {overlay.cursorHint.text}\n </div>\n ) : null}\n {overlay.collaborationError ? (\n <div className=\"pointer-events-none absolute bottom-10 left-2 max-w-[80%] rounded-md border border-amber-500/40 bg-background/90 px-2 py-1 text-xs text-amber-800 dark:text-amber-300\">\n {overlay.collaborationError}\n </div>\n ) : null}\n </>\n );\n}\n\nconst placeholderLabels: Record<SessionViewportPlaceholder, string> = {\n connecting: \"Connecting\",\n \"connecting-media\": \"Connecting media\",\n switching: \"Switching target\",\n disconnected: \"Disconnected\",\n waiting: \"Waiting for frame\",\n};\n\nfunction ViewportPlaceholder({ placeholder }: { placeholder: SessionViewportPlaceholder }) {\n return (\n <div className=\"flex flex-col items-center gap-2 text-sm text-muted-foreground\">\n {placeholder === \"disconnected\" ? (\n <Unplug className=\"size-5\" />\n ) : (\n <Loader2 className=\"size-5 animate-spin\" />\n )}\n {placeholderLabels[placeholder]}\n </div>\n );\n}\n\nfunction StatusBadge({ status }: { status: SessionViewportStatus }) {\n if (status === \"webrtc\" || status === \"websocket\") {\n return (\n <Badge\n variant=\"secondary\"\n className=\"bg-emerald-500/15 text-emerald-700 dark:text-emerald-300\"\n >\n {status}\n </Badge>\n );\n }\n return <Badge variant=\"outline\">offline</Badge>;\n}\n","import { useMemo } from \"react\";\nimport { Wrench } from \"lucide-react\";\nimport {\n Empty,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"@aperture-browser/ui/components/empty\";\n\nexport type DevToolsDock = \"bottom\" | \"right\";\n\ntype BrowserDevToolsPaneProps = {\n cdpUrl: string | null;\n targetId: string | null;\n};\n\nexport function BrowserDevToolsPane({ cdpUrl, targetId }: BrowserDevToolsPaneProps) {\n const src = useMemo(() => {\n if (!cdpUrl || !targetId) {\n return null;\n }\n\n const cdp = new URL(cdpUrl);\n const cdpPath = cdp.pathname.replace(/\\/$/, \"\");\n const frame = new URL(`${cdpPath}/devtools/devtools_app.html`, cdp.origin);\n const socket = `${cdp.host}${cdpPath}/devtools/page/${encodeURIComponent(targetId)}`;\n frame.searchParams.set(cdp.protocol === \"https:\" ? \"wss\" : \"ws\", socket);\n return frame.toString();\n }, [cdpUrl, targetId]);\n\n if (!src) {\n return (\n <Empty className=\"h-full rounded-none border-none\">\n <EmptyHeader>\n <EmptyMedia variant=\"icon\">\n <Wrench />\n </EmptyMedia>\n <EmptyTitle>DevTools unavailable</EmptyTitle>\n <EmptyDescription>Connect to a browser target to inspect it.</EmptyDescription>\n </EmptyHeader>\n </Empty>\n );\n }\n\n return (\n <iframe\n className=\"h-full w-full border-0 bg-background\"\n src={src}\n title=\"Browser DevTools\"\n allow=\"clipboard-read; clipboard-write\"\n referrerPolicy=\"no-referrer\"\n />\n );\n}\n","import * as ResizablePrimitive from \"react-resizable-panels\";\n\nimport { cn } from \"../utils.ts\";\n\nfunction ResizablePanelGroup({ className, ...props }: ResizablePrimitive.GroupProps) {\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n className={cn(\"flex h-full w-full aria-[orientation=vertical]:flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {\n return <ResizablePrimitive.Panel data-slot=\"resizable-panel\" {...props} />;\n}\n\nfunction ResizableHandle({\n withHandle,\n className,\n ...props\n}: ResizablePrimitive.SeparatorProps & {\n withHandle?: boolean;\n}) {\n return (\n <ResizablePrimitive.Separator\n data-slot=\"resizable-handle\"\n className={cn(\n \"relative flex w-px items-center justify-center bg-border ring-offset-background after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-hidden aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:w-full aria-[orientation=horizontal]:after:left-0 aria-[orientation=horizontal]:after:h-1 aria-[orientation=horizontal]:after:w-full aria-[orientation=horizontal]:after:translate-x-0 aria-[orientation=horizontal]:after:-translate-y-1/2 [&[aria-orientation=horizontal]>div]:rotate-90\",\n className,\n )}\n {...props}\n >\n {withHandle && <div className=\"z-10 flex h-6 w-1 shrink-0 rounded-lg bg-border\" />}\n </ResizablePrimitive.Separator>\n );\n}\n\nexport { ResizableHandle, ResizablePanel, ResizablePanelGroup };\n","import { useEffect, useLayoutEffect, useState, type ReactNode } from \"react\";\nimport { usePanelRef } from \"react-resizable-panels\";\nimport type { UseBrowserControlResult } from \"../hooks/use-browser-control.ts\";\nimport type { CollaborationRole } from \"@aperture-browser/live-session\";\nimport { resolveSessionFeatures, type SessionFeatures } from \"../features.ts\";\nimport { BrowserToolbar } from \"./browser-toolbar.tsx\";\nimport { BrowserViewport } from \"./browser-viewport.tsx\";\nimport { BrowserDevToolsPane, type DevToolsDock } from \"./browser-devtools-pane.tsx\";\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"@aperture-browser/ui/components/resizable\";\n\ntype BrowserControlPaneProps = {\n control: UseBrowserControlResult;\n leading?: ReactNode;\n features?: SessionFeatures;\n collaborationRole: CollaborationRole;\n cdpUrl: string | null;\n shareUrls: { editor: string; viewer: string } | null;\n onSessionDetails?: () => void;\n};\n\nconst LOCAL_CURSOR_STORAGE_KEY = \"aperture.workbench.localCursorEnabled\";\n\nexport function BrowserControlPane({\n control,\n leading,\n features: featureOverrides,\n collaborationRole,\n cdpUrl,\n shareUrls,\n onSessionDetails,\n}: BrowserControlPaneProps) {\n const features = resolveSessionFeatures(featureOverrides);\n const [localCursorEnabled, setLocalCursorEnabled] = useState(true);\n const [paintingEnabled, setPaintingEnabled] = useState(false);\n const [devToolsTargetIds, setDevToolsTargetIds] = useState<ReadonlySet<string>>(() => new Set());\n const [devToolsDock, setDevToolsDock] = useState<DevToolsDock>(\"bottom\");\n const devToolsPanelRef = usePanelRef();\n const activeTargetId = control.activeTargetId;\n const devToolsOpen =\n features.devTools && activeTargetId !== null && devToolsTargetIds.has(activeTargetId);\n\n useEffect(() => {\n try {\n const stored = window.localStorage.getItem(LOCAL_CURSOR_STORAGE_KEY);\n if (stored === \"false\") {\n setLocalCursorEnabled(false);\n }\n } catch {\n // Local cursor remains enabled when storage is unavailable.\n }\n }, []);\n\n useEffect(() => {\n const targetIds = new Set(control.targets.map((target) => target.id));\n setDevToolsTargetIds((current) => {\n let changed = false;\n const next = new Set<string>();\n\n for (const targetId of current) {\n if (targetIds.has(targetId)) {\n next.add(targetId);\n } else {\n changed = true;\n }\n }\n\n return changed ? next : current;\n });\n }, [control.targets]);\n\n useLayoutEffect(() => {\n if (devToolsOpen) {\n devToolsPanelRef.current?.expand();\n } else {\n devToolsPanelRef.current?.collapse();\n }\n }, [devToolsOpen, devToolsPanelRef]);\n\n function handleDevToolsOpenChange(open: boolean) {\n if (!activeTargetId) {\n return;\n }\n\n setDevToolsTargetIds((current) => {\n const next = new Set(current);\n if (open) {\n next.add(activeTargetId);\n } else {\n next.delete(activeTargetId);\n }\n return next;\n });\n }\n\n function handleLocalCursorChange(enabled: boolean) {\n setLocalCursorEnabled(enabled);\n try {\n window.localStorage.setItem(LOCAL_CURSOR_STORAGE_KEY, String(enabled));\n } catch {\n // Keep the preference for this page when storage is unavailable.\n }\n }\n\n return (\n <div className=\"flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <BrowserToolbar\n control={control}\n leading={leading}\n features={features}\n collaborationRole={collaborationRole}\n cdpUrl={cdpUrl}\n shareUrls={shareUrls}\n localCursorEnabled={localCursorEnabled}\n onLocalCursorChange={handleLocalCursorChange}\n paintingEnabled={paintingEnabled}\n onPaintingEnabledChange={setPaintingEnabled}\n devToolsOpen={devToolsOpen}\n devToolsTargetIds={devToolsTargetIds}\n devToolsDock={devToolsDock}\n onDevToolsOpenChange={handleDevToolsOpenChange}\n onDevToolsDockChange={setDevToolsDock}\n onSessionDetails={onSessionDetails}\n />\n <ResizablePanelGroup\n orientation={devToolsDock === \"bottom\" ? \"vertical\" : \"horizontal\"}\n className=\"min-h-0 min-w-0 flex-1 has-[[data-separator=active]]:[&_iframe]:pointer-events-none\"\n >\n <ResizablePanel className=\"flex min-h-0 min-w-0\" defaultSize=\"60%\" minSize=\"20%\">\n <BrowserViewport\n control={control}\n viewport={control.viewport}\n localCursorEnabled={localCursorEnabled}\n paintingEnabled={features.drawing && paintingEnabled}\n onPaintingEnabledChange={setPaintingEnabled}\n statusBadge={features.statusBadge}\n />\n </ResizablePanel>\n <ResizableHandle withHandle disabled={!devToolsOpen} hidden={!devToolsOpen} />\n <ResizablePanel\n panelRef={devToolsPanelRef}\n className=\"flex min-h-0 min-w-0\"\n collapsible\n defaultSize=\"40%\"\n minSize=\"20%\"\n >\n {Array.from(features.devTools ? devToolsTargetIds : [], (targetId) => (\n <div\n key={targetId}\n className=\"h-full min-h-0 w-full min-w-0\"\n hidden={targetId !== activeTargetId}\n >\n <BrowserDevToolsPane cdpUrl={cdpUrl} targetId={targetId} />\n </div>\n ))}\n </ResizablePanel>\n </ResizablePanelGroup>\n </div>\n );\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { Link2Off, Loader2 } from \"lucide-react\";\nimport {\n Empty,\n EmptyDescription,\n EmptyHeader,\n EmptyMedia,\n EmptyTitle,\n} from \"@aperture-browser/ui/components/empty\";\nimport { Toaster } from \"@aperture-browser/ui/components/sonner\";\nimport { TooltipProvider } from \"@aperture-browser/ui/components/tooltip\";\nimport { PortalContainerProvider } from \"@aperture-browser/ui/portal\";\nimport { cn } from \"@aperture-browser/ui/utils\";\nimport { BrowserControlPane } from \"./components/browser-control-pane.tsx\";\nimport type { ApertureSessionFeatures, SessionFeatures } from \"./features.ts\";\nimport { showNotice } from \"./notices.ts\";\nimport { ApertureProvider } from \"./provider.tsx\";\nimport { useSharedSession } from \"./shared-session.ts\";\n\nexport interface SharedSessionProps {\n readonly token: string;\n readonly features?: SessionFeatures;\n readonly leading?: ReactNode;\n}\n\nexport interface ApertureSessionProps extends SharedSessionProps {\n readonly baseUrl?: string;\n readonly features?: ApertureSessionFeatures;\n readonly theme?: \"light\" | \"dark\" | \"system\";\n readonly className?: string;\n}\n\nexport function ApertureSession({\n baseUrl,\n theme = \"system\",\n className,\n ...props\n}: ApertureSessionProps) {\n const [root, setRoot] = useState<HTMLDivElement | null>(null);\n const dark = useDarkTheme(theme);\n\n return (\n <div\n ref={setRoot}\n className={cn(\"aperture-root relative h-full w-full\", dark && \"dark\", className)}\n >\n {root ? (\n <ApertureProvider baseUrl={baseUrl}>\n <PortalContainerProvider container={root}>\n <TooltipProvider>\n <SharedSession {...props} />\n {props.features?.toaster !== false ? (\n <Toaster\n theme={dark ? \"dark\" : \"light\"}\n richColors\n closeButton\n position=\"bottom-center\"\n />\n ) : null}\n </TooltipProvider>\n </PortalContainerProvider>\n </ApertureProvider>\n ) : null}\n </div>\n );\n}\n\nfunction useDarkTheme(theme: \"light\" | \"dark\" | \"system\"): boolean {\n const [systemDark, setSystemDark] = useState(false);\n\n useEffect(() => {\n if (theme !== \"system\") {\n return;\n }\n const query = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const update = () => setSystemDark(query.matches);\n update();\n query.addEventListener(\"change\", update);\n return () => query.removeEventListener(\"change\", update);\n }, [theme]);\n\n return theme === \"dark\" || (theme === \"system\" && systemDark);\n}\n\nexport function SharedSession({ token, features, leading }: SharedSessionProps) {\n const { status, share, control } = useSharedSession({ token, onNotice: showNotice });\n\n switch (status) {\n case \"invalid\":\n return (\n <SessionState\n icon={<Link2Off />}\n title=\"Invalid share link\"\n description=\"This link does not contain a valid session capability.\"\n />\n );\n case \"loading\":\n return (\n <SessionState icon={<Loader2 className=\"animate-spin\" />} title=\"Opening shared session\" />\n );\n case \"expired\":\n return (\n <SessionState\n icon={<Link2Off />}\n title=\"Share link expired\"\n description=\"This session capability has expired. Ask the session owner for a new link.\"\n />\n );\n case \"unavailable\":\n return (\n <SessionState\n icon={<Link2Off />}\n title=\"Shared session unavailable\"\n description=\"This link is invalid, revoked, or the shared session is no longer available.\"\n />\n );\n case \"ready\":\n return (\n <div className=\"flex h-full min-h-0 flex-1 flex-col overflow-hidden bg-background\">\n <BrowserControlPane\n control={control}\n collaborationRole={share?.role ?? \"viewer\"}\n cdpUrl={null}\n shareUrls={null}\n leading={leading}\n features={{ devTools: false, ...features }}\n />\n </div>\n );\n }\n}\n\nexport function devToolsUrl(origin: string, cdpUrl: string, sessionToken: string): string {\n const sourceUrl = new URL(cdpUrl, origin);\n const url = new URL(origin);\n url.pathname = `${sourceUrl.pathname.replace(/\\/$/, \"\")}/${encodeURIComponent(sessionToken)}`;\n return url.toString();\n}\n\nfunction SessionState({\n icon,\n title,\n description,\n}: {\n icon: ReactNode;\n title: string;\n description?: string;\n}) {\n return (\n <Empty className=\"h-full border-none\">\n <EmptyHeader>\n <EmptyMedia variant=\"icon\">{icon}</EmptyMedia>\n <EmptyTitle>{title}</EmptyTitle>\n {description ? <EmptyDescription>{description}</EmptyDescription> : null}\n </EmptyHeader>\n </Empty>\n );\n}\n"],"mappings":"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"}