@mcp-b/react-components 0.38.0 → 0.40.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.
Files changed (89) hide show
  1. package/dist/{CodeBlock-DO4Hdu1R.js → CodeBlock-CWk1FVtm.js} +1 -1
  2. package/dist/{FileTree-DbQMpvxV.js → FileTree-xqHYBw4g.js} +1 -1
  3. package/dist/{WorkspaceFileView-DeGzWwhK.js → WorkspaceFileView-Lab3om3F.js} +2 -2
  4. package/dist/components/agents-sdk/AgentActivity.js +1 -1
  5. package/dist/components/agents-sdk/AgentActivityPreview.js +1 -1
  6. package/dist/components/agents-sdk/AgentChat.js +7 -7
  7. package/dist/components/agents-sdk/BrowserLiveView.d.ts +73 -25
  8. package/dist/components/agents-sdk/BrowserLiveView.js +95 -65
  9. package/dist/components/agents-sdk/BrowserReplay.js +1 -1
  10. package/dist/components/agents-sdk/BrowserRunPanel.d.ts +72 -25
  11. package/dist/components/agents-sdk/BrowserRunPanel.js +109 -62
  12. package/dist/components/agents-sdk/McpConnectionRequest.js +1 -1
  13. package/dist/components/agents-sdk/McpPluginCatalog.js +1 -1
  14. package/dist/components/agents-sdk/McpServerPicker.js +1 -1
  15. package/dist/components/agents-sdk/ModelSelector.js +1 -1
  16. package/dist/components/agents-sdk/PromptInputCommands.js +1 -1
  17. package/dist/components/agents-sdk/SubagentRunIndicator.js +1 -1
  18. package/dist/components/agents-sdk/SubagentRunSelector.js +1 -1
  19. package/dist/components/agents-sdk/ThinkChatToolPanels.js +1 -1
  20. package/dist/components/agents-sdk/ThinkExecutionDetail.js +1 -1
  21. package/dist/components/agents-sdk/ThinkExecutionStatus.js +1 -1
  22. package/dist/components/agents-sdk/ThinkExecutionWorkbench.js +1 -1
  23. package/dist/components/agents-sdk/ThinkFullApp.js +8 -7
  24. package/dist/components/agents-sdk/ThinkRoutineBrowser.js +1 -1
  25. package/dist/components/agents-sdk/ThinkRoutineForm.js +1 -1
  26. package/dist/components/agents-sdk/ThinkRoutineLibrary.js +1 -1
  27. package/dist/components/agents-sdk/ThinkThreadPicker.js +1 -1
  28. package/dist/components/agents-sdk/WorkspaceBrowser.js +1 -1
  29. package/dist/components/agents-sdk/WorkspaceExplorer.js +1 -1
  30. package/dist/components/agents-sdk/WorkspaceFileView.js +1 -1
  31. package/dist/components/agents-sdk/WorkspaceHeader.js +1 -1
  32. package/dist/components/agents-sdk/WorkspaceMountManager.js +1 -1
  33. package/dist/components/ai-sdk/Activity.js +1 -1
  34. package/dist/components/ai-sdk/AgentChatStartScreen.js +1 -1
  35. package/dist/components/ai-sdk/Approval.js +1 -1
  36. package/dist/components/ai-sdk/Artifact.js +1 -1
  37. package/dist/components/ai-sdk/ChainOfThought.d.ts +1 -1
  38. package/dist/components/ai-sdk/ChainOfThought.js +1 -1
  39. package/dist/components/ai-sdk/Checkpoint.js +1 -1
  40. package/dist/components/ai-sdk/CodeBlock.js +1 -1
  41. package/dist/components/ai-sdk/Conversation.js +1 -1
  42. package/dist/components/ai-sdk/Goal.js +1 -1
  43. package/dist/components/ai-sdk/MediaPreviewCard.js +1 -1
  44. package/dist/components/ai-sdk/Message.js +1 -1
  45. package/dist/components/ai-sdk/MessageScroller.js +1 -1
  46. package/dist/components/ai-sdk/MessageScrollerVirtual.js +1 -1
  47. package/dist/components/ai-sdk/Plan.js +1 -1
  48. package/dist/components/ai-sdk/PromptInput.js +1 -1
  49. package/dist/components/ai-sdk/Queue.js +1 -1
  50. package/dist/components/ai-sdk/Reasoning.js +1 -1
  51. package/dist/components/ai-sdk/Sources.js +1 -1
  52. package/dist/components/ai-sdk/Task.js +1 -1
  53. package/dist/components/extension/ChatGptSignInScreen.d.ts +21 -10
  54. package/dist/components/extension/ChatGptSignInScreen.js +42 -34
  55. package/dist/components/extension/CodexModelSelector.js +1 -1
  56. package/dist/components/extension/ConversationTabPicker.js +1 -1
  57. package/dist/components/foundations/Checkbox.js +1 -1
  58. package/dist/components/foundations/ContextMenu.js +1 -1
  59. package/dist/components/foundations/EmptyState.d.ts +10 -0
  60. package/dist/components/foundations/EmptyState.js +10 -0
  61. package/dist/components/foundations/Menubar.js +1 -1
  62. package/dist/components/foundations/SearchField.js +1 -1
  63. package/dist/components/foundations/Select.js +1 -1
  64. package/dist/components/foundations/Stepper.js +1 -1
  65. package/dist/components/foundations/Toast.js +1 -1
  66. package/dist/components/foundations/icons.d.ts +2 -2
  67. package/dist/components/foundations/icons.js +2 -2
  68. package/dist/components/general-purpose/Commit.js +2 -2
  69. package/dist/components/general-purpose/EnvironmentVariables.js +2 -2
  70. package/dist/components/general-purpose/FileTree.js +1 -1
  71. package/dist/components/general-purpose/PricingPlanCard.js +1 -1
  72. package/dist/components/general-purpose/ResponsiveSidebarShell.js +1 -1
  73. package/dist/components/general-purpose/SetupChecklist.js +1 -1
  74. package/dist/components/general-purpose/Terminal.js +2 -2
  75. package/dist/components/general-purpose/TestResults.js +1 -1
  76. package/dist/components/general-purpose/ThemeModeControl.js +1 -1
  77. package/dist/components/general-purpose/WebPreview.js +1 -1
  78. package/dist/components/nanites/AgentConnection.js +2 -2
  79. package/dist/components/nanites/AgentToolDetail.js +1 -1
  80. package/dist/{copy-button-4YvddK4e.js → copy-button-Bc7jsYv_.js} +1 -1
  81. package/dist/{icons-BGZ916hb.d.ts → icons-DwgNir1Q.d.ts} +6 -1
  82. package/dist/{icons-B4mGvCvc.js → icons-MmIXciMO.js} +3 -2
  83. package/dist/styles/agent-chat.css +2 -2
  84. package/dist/styles/base.css +4 -0
  85. package/dist/styles/browser-live-view.css +45 -0
  86. package/dist/styles/browser-run-panel.css +3 -1
  87. package/dist/styles/chatgpt-sign-in-screen.css +6 -0
  88. package/dist/styles/think-full-app.css +14 -0
  89. package/package.json +2 -2
@@ -7,26 +7,37 @@ interface ChatGptSignInSecondaryAction {
7
7
  disabled?: boolean;
8
8
  }
9
9
  interface ChatGptSignInScreenProps extends React.HTMLAttributes<HTMLElement> {
10
- /** Whether the sign-in request is currently opening ChatGPT. */
11
- busy?: boolean;
12
- /** Shows the sign-in action in its error state. */
13
- error?: boolean;
14
- /** Button label for the ChatGPT sign-in action. */
15
- label?: string;
16
- /** Main heading shown above the sign-in button. */
10
+ /**
11
+ * Why sign-in failed, announced under the sign-in control. Truthy also
12
+ * puts the built-in button in its error color.
13
+ */
14
+ error?: React.ReactNode;
15
+ /** Main heading shown above the sign-in control. */
17
16
  title?: string;
18
17
  /** Brand name displayed under the heading. */
19
18
  brandName?: string;
20
19
  /** Brand mark displayed next to the brand name. */
21
20
  brandLogo?: React.ReactNode;
22
- /** Called when the user clicks the sign-in action. */
23
- onSignIn?: () => void;
24
21
  /** Optional app-owned alternative rendered in the shared full-screen layout. */
25
22
  secondaryAction?: ChatGptSignInSecondaryAction;
23
+ /**
24
+ * A sign-in control the host must own — a Google Identity Services button
25
+ * renders its own DOM and may not be restyled, so the screen seats it where
26
+ * its button would sit instead of drawing one. When set, `busy`, `label`,
27
+ * and `onSignIn` are unused.
28
+ */
29
+ control?: React.ReactNode;
30
+ /** Whether the sign-in request is currently opening the provider. */
31
+ busy?: boolean;
32
+ /** Button label for the sign-in action. */
33
+ label?: string;
34
+ /** Called when the user clicks the sign-in action. */
35
+ onSignIn?: () => void;
26
36
  }
27
- /** Full-screen ChatGPT authentication prompt for MCP-B onboarding. */
37
+ /** Full-screen provider authentication prompt for MCP-B onboarding. */
28
38
  declare function ChatGptSignInScreen({
29
39
  busy,
40
+ control,
30
41
  error,
31
42
  label,
32
43
  title,
@@ -1,12 +1,12 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { J as SpinnerIcon } from "../../icons-B4mGvCvc.js";
2
+ import { Y as SpinnerIcon } from "../../icons-MmIXciMO.js";
3
3
  import { Button } from "../foundations/Button.js";
4
4
  import { t as ProviderLogo } from "../../provider-logos-zjZycgV6.js";
5
5
  import "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region src/components/extension/ChatGptSignInScreen.tsx
8
- /** Full-screen ChatGPT authentication prompt for MCP-B onboarding. */
9
- function ChatGptSignInScreen({ busy = false, error = false, label = "Sign in with ChatGPT", title = "Welcome to MCP-B", brandName = "SigVelo", brandLogo = /* @__PURE__ */ jsx(SigVeloMark, {}), className, onPointerLeave, onPointerMove, onSignIn, secondaryAction, ref, ...props }) {
8
+ /** Full-screen provider authentication prompt for MCP-B onboarding. */
9
+ function ChatGptSignInScreen({ busy = false, control, error, label = "Sign in with ChatGPT", title = "Welcome to MCP-B", brandName = "SigVelo", brandLogo = /* @__PURE__ */ jsx(SigVeloMark, {}), className, onPointerLeave, onPointerMove, onSignIn, secondaryAction, ref, ...props }) {
10
10
  const handlePointerMove = (event) => {
11
11
  onPointerMove?.(event);
12
12
  setPointerPosition(event.currentTarget, event, "chatgpt-sign-in-pointer");
@@ -25,37 +25,45 @@ function ChatGptSignInScreen({ busy = false, error = false, label = "Sign in wit
25
25
  ...props,
26
26
  children: [/* @__PURE__ */ jsxs("div", {
27
27
  className: "chatgpt-sign-in__panel",
28
- children: [/* @__PURE__ */ jsxs("div", {
29
- className: "chatgpt-sign-in__brand",
30
- children: [/* @__PURE__ */ jsx("h1", { children: title }), /* @__PURE__ */ jsxs("p", { children: [
31
- "by ",
32
- brandLogo ? /* @__PURE__ */ jsx("span", {
33
- className: "chatgpt-sign-in__brand-mark",
34
- children: brandLogo
35
- }) : null,
36
- /* @__PURE__ */ jsx("span", { children: brandName })
37
- ] })]
38
- }), /* @__PURE__ */ jsxs(Button, {
39
- type: "button",
40
- variant: "normal",
41
- color: error ? "destructive" : "primary",
42
- size: "sm",
43
- className: "chatgpt-sign-in__button",
44
- "data-busy": busy ? "true" : void 0,
45
- disabled: busy,
46
- onClick: onSignIn,
47
- onPointerMove: handleSignInButtonPointerMove,
48
- children: [/* @__PURE__ */ jsx("span", {
49
- className: "chatgpt-sign-in__button-icon",
50
- children: busy ? /* @__PURE__ */ jsx(SpinnerIcon, { size: 16 }) : /* @__PURE__ */ jsx(ProviderLogo, {
51
- provider: "openai",
52
- className: "chatgpt-sign-in__logo"
53
- })
54
- }), /* @__PURE__ */ jsx("span", {
55
- className: "chatgpt-sign-in__button-label",
56
- children: label
57
- })]
58
- })]
28
+ children: [
29
+ /* @__PURE__ */ jsxs("div", {
30
+ className: "chatgpt-sign-in__brand",
31
+ children: [/* @__PURE__ */ jsx("h1", { children: title }), /* @__PURE__ */ jsxs("p", { children: [
32
+ "by ",
33
+ brandLogo ? /* @__PURE__ */ jsx("span", {
34
+ className: "chatgpt-sign-in__brand-mark",
35
+ children: brandLogo
36
+ }) : null,
37
+ /* @__PURE__ */ jsx("span", { children: brandName })
38
+ ] })]
39
+ }),
40
+ control ?? /* @__PURE__ */ jsxs(Button, {
41
+ type: "button",
42
+ variant: "normal",
43
+ color: error ? "destructive" : "primary",
44
+ size: "sm",
45
+ className: "chatgpt-sign-in__button",
46
+ "data-busy": busy ? "true" : void 0,
47
+ disabled: busy,
48
+ onClick: onSignIn,
49
+ onPointerMove: handleSignInButtonPointerMove,
50
+ children: [/* @__PURE__ */ jsx("span", {
51
+ className: "chatgpt-sign-in__button-icon",
52
+ children: busy ? /* @__PURE__ */ jsx(SpinnerIcon, { size: 16 }) : /* @__PURE__ */ jsx(ProviderLogo, {
53
+ provider: "openai",
54
+ className: "chatgpt-sign-in__logo"
55
+ })
56
+ }), /* @__PURE__ */ jsx("span", {
57
+ className: "chatgpt-sign-in__button-label",
58
+ children: label
59
+ })]
60
+ }),
61
+ error ? /* @__PURE__ */ jsx("p", {
62
+ role: "alert",
63
+ className: "chatgpt-sign-in__error",
64
+ children: error
65
+ }) : null
66
+ ]
59
67
  }), secondaryAction ? /* @__PURE__ */ jsx("div", {
60
68
  className: "chatgpt-sign-in__secondary-action",
61
69
  children: /* @__PURE__ */ jsx(Button, {
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { W as RefreshIcon, d as CheckIcon, f as ChevronDownIcon, l as BrainIcon, m as ChevronRightIcon } from "../../icons-B4mGvCvc.js";
2
+ import { G as RefreshIcon, d as CheckIcon, f as ChevronDownIcon, l as BrainIcon, m as ChevronRightIcon } from "../../icons-MmIXciMO.js";
3
3
  import { Tooltip } from "../foundations/Tooltip.js";
4
4
  import { Menu } from "../foundations/Menu.js";
5
5
  import { o as titleCase } from "../../format-DB2mX9DA.js";
@@ -1,4 +1,4 @@
1
- import { tt as WarningIcon } from "../../icons-B4mGvCvc.js";
1
+ import { nt as WarningIcon } from "../../icons-MmIXciMO.js";
2
2
  import { Button } from "../foundations/Button.js";
3
3
  import { Menu } from "../foundations/Menu.js";
4
4
  import { i as formatErrorMessage } from "../../format-DB2mX9DA.js";
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName } from "../../class-names-BiMDVpUo.js";
2
- import { d as CheckIcon } from "../../icons-B4mGvCvc.js";
2
+ import { d as CheckIcon } from "../../icons-MmIXciMO.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { Checkbox as Checkbox$1 } from "@base-ui/react/checkbox";
5
5
  //#region src/components/foundations/Checkbox.tsx
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName, t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { d as CheckIcon, v as DotIcon } from "../../icons-B4mGvCvc.js";
2
+ import { d as CheckIcon, v as DotIcon } from "../../icons-MmIXciMO.js";
3
3
  import "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import { ContextMenu as ContextMenu$1 } from "@base-ui/react/context-menu";
@@ -21,10 +21,20 @@ interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "ti
21
21
  * `children` land under the description, for the action that makes the region
22
22
  * non-empty.
23
23
  *
24
+ * A region waiting on data is empty too, and this is the shape for it:
25
+ * `icon={<SpinnerIcon />}` with a description of what is being waited on, in a
26
+ * `role="status"` container. The description is not optional there —
27
+ * `prefers-reduced-motion` stops the spinner outright, so an icon on its own
28
+ * leaves a still circle and no way to tell loading from broken.
29
+ *
24
30
  * @example
25
31
  * ```tsx
26
32
  * <EmptyState description="No runs yet." />
27
33
  *
34
+ * <div role="status">
35
+ * <EmptyState icon={<SpinnerIcon />} description="Loading conversation" />
36
+ * </div>
37
+ *
28
38
  * <EmptyState
29
39
  * icon={<MessageIcon />}
30
40
  * title="Start a conversation"
@@ -14,10 +14,20 @@ import { jsx, jsxs } from "react/jsx-runtime";
14
14
  * `children` land under the description, for the action that makes the region
15
15
  * non-empty.
16
16
  *
17
+ * A region waiting on data is empty too, and this is the shape for it:
18
+ * `icon={<SpinnerIcon />}` with a description of what is being waited on, in a
19
+ * `role="status"` container. The description is not optional there —
20
+ * `prefers-reduced-motion` stops the spinner outright, so an icon on its own
21
+ * leaves a still circle and no way to tell loading from broken.
22
+ *
17
23
  * @example
18
24
  * ```tsx
19
25
  * <EmptyState description="No runs yet." />
20
26
  *
27
+ * <div role="status">
28
+ * <EmptyState icon={<SpinnerIcon />} description="Loading conversation" />
29
+ * </div>
30
+ *
21
31
  * <EmptyState
22
32
  * icon={<MessageIcon />}
23
33
  * title="Start a conversation"
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName, t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { d as CheckIcon, v as DotIcon } from "../../icons-B4mGvCvc.js";
2
+ import { d as CheckIcon, v as DotIcon } from "../../icons-MmIXciMO.js";
3
3
  import { buttonVariants } from "./Button.js";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName } from "../../class-names-BiMDVpUo.js";
2
- import { G as SearchIcon } from "../../icons-B4mGvCvc.js";
2
+ import { K as SearchIcon } from "../../icons-MmIXciMO.js";
3
3
  import { Field } from "./Field.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/foundations/SearchField.tsx
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName } from "../../class-names-BiMDVpUo.js";
2
- import { a as ArrowUpIcon, d as CheckIcon, n as ArrowDownIcon } from "../../icons-B4mGvCvc.js";
2
+ import { a as ArrowUpIcon, d as CheckIcon, n as ArrowDownIcon } from "../../icons-MmIXciMO.js";
3
3
  import "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import { Select as Select$1 } from "@base-ui/react/select";
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName, t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { J as SpinnerIcon, d as CheckIcon } from "../../icons-B4mGvCvc.js";
2
+ import { Y as SpinnerIcon, d as CheckIcon } from "../../icons-MmIXciMO.js";
3
3
  import { Tabs } from "./Tabs.js";
4
4
  import * as React from "react";
5
5
  import { jsx } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName } from "../../class-names-BiMDVpUo.js";
2
- import { rt as XIcon } from "../../icons-B4mGvCvc.js";
2
+ import { it as XIcon } from "../../icons-MmIXciMO.js";
3
3
  import { buttonVariants } from "./Button.js";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
@@ -1,2 +1,2 @@
1
- import { $ as SunIcon, A as InfoIcon, B as PaperclipIcon, C as EyeOffIcon, D as HashIcon, E as FolderOpenIcon, F as MicrophoneIcon, G as QueueIcon, H as PencilIcon, I as MinusIcon, J as SidebarIcon, K as RefreshIcon, L as MonitorIcon, M as MaximizeIcon, N as McpIcon, O as IconProps, P as MessageSquareIcon, Q as StopIcon, R as MoonIcon, S as EyeIcon, T as FolderIcon, U as PlayIcon, V as PauseIcon, W as PlusIcon, X as SpinnerIcon, Y as SlackIcon, Z as SquareIcon, _ as CopyIcon, a as ArrowUpIcon, at as XIcon, b as DownloadIcon, c as BoxIcon, d as CalendarIcon, et as TargetIcon, f as CheckIcon, g as CodeIcon, h as ChevronRightIcon, i as ArrowRightIcon, it as WrenchIcon, j as LinkIcon, k as ImageIcon, l as BrainIcon, m as ChevronLeftIcon, n as ArrowDownIcon, nt as TrashIcon, o as ArrowUpRightIcon, p as ChevronDownIcon, q as SearchIcon, r as ArrowLeftIcon, rt as WarningIcon, s as BookmarkIcon, t as ArchiveIcon, tt as TerminalIcon, u as BrandIconProps, v as DiscordIcon, w as FileIcon, x as EllipsisIcon, y as DotIcon, z as MoveToFrontIcon } from "../../icons-BGZ916hb.js";
2
- export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowUpRightIcon, BookmarkIcon, BoxIcon, BrainIcon, BrandIconProps, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, IconProps, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SlackIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TargetIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
1
+ import { $ as StopIcon, A as InfoIcon, B as MoveToFrontIcon, C as EyeOffIcon, D as HashIcon, E as FolderOpenIcon, F as MessageSquareIcon, G as PlusIcon, H as PauseIcon, I as MicrophoneIcon, J as SearchIcon, K as QueueIcon, L as MinusIcon, M as LinkIcon, N as MaximizeIcon, O as IconProps, P as McpIcon, Q as SquareIcon, R as MonitorIcon, S as EyeIcon, T as FolderIcon, U as PencilIcon, V as PaperclipIcon, W as PlayIcon, X as SlackIcon, Y as SidebarIcon, Z as SpinnerIcon, _ as CopyIcon, a as ArrowUpIcon, at as WrenchIcon, b as DownloadIcon, c as BoxIcon, d as CalendarIcon, et as SunIcon, f as CheckIcon, g as CodeIcon, h as ChevronRightIcon, i as ArrowRightIcon, it as WarningIcon, j as KeyboardIcon, k as ImageIcon, l as BrainIcon, m as ChevronLeftIcon, n as ArrowDownIcon, nt as TerminalIcon, o as ArrowUpRightIcon, ot as XIcon, p as ChevronDownIcon, q as RefreshIcon, r as ArrowLeftIcon, rt as TrashIcon, s as BookmarkIcon, t as ArchiveIcon, tt as TargetIcon, u as BrandIconProps, v as DiscordIcon, w as FileIcon, x as EllipsisIcon, y as DotIcon, z as MoonIcon } from "../../icons-DwgNir1Q.js";
2
+ export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowUpRightIcon, BookmarkIcon, BoxIcon, BrainIcon, BrandIconProps, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, IconProps, ImageIcon, InfoIcon, KeyboardIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SlackIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TargetIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
@@ -1,2 +1,2 @@
1
- import { $ as TerminalIcon, A as MaximizeIcon, B as PencilIcon, C as FileIcon, D as ImageIcon, E as HashIcon, F as MonitorIcon, G as SearchIcon, H as PlusIcon, I as MoonIcon, J as SpinnerIcon, K as SidebarIcon, L as MoveToFrontIcon, M as MessageSquareIcon, N as MicrophoneIcon, O as InfoIcon, P as MinusIcon, Q as TargetIcon, R as PaperclipIcon, S as EyeOffIcon, T as FolderOpenIcon, U as QueueIcon, V as PlayIcon, W as RefreshIcon, X as StopIcon, Y as SquareIcon, Z as SunIcon, _ as DiscordIcon, a as ArrowUpIcon, b as EllipsisIcon, c as BoxIcon, d as CheckIcon, et as TrashIcon, f as ChevronDownIcon, g as CopyIcon, h as CodeIcon, i as ArrowRightIcon, j as McpIcon, k as LinkIcon, l as BrainIcon, m as ChevronRightIcon, n as ArrowDownIcon, nt as WrenchIcon, o as ArrowUpRightIcon, p as ChevronLeftIcon, q as SlackIcon, r as ArrowLeftIcon, rt as XIcon, s as BookmarkIcon, t as ArchiveIcon, tt as WarningIcon, u as CalendarIcon, v as DotIcon, w as FolderIcon, x as EyeIcon, y as DownloadIcon, z as PauseIcon } from "../../icons-B4mGvCvc.js";
2
- export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowUpRightIcon, BookmarkIcon, BoxIcon, BrainIcon, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SlackIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TargetIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
1
+ import { $ as TargetIcon, A as LinkIcon, B as PauseIcon, C as FileIcon, D as ImageIcon, E as HashIcon, F as MinusIcon, G as RefreshIcon, H as PlayIcon, I as MonitorIcon, J as SlackIcon, K as SearchIcon, L as MoonIcon, M as McpIcon, N as MessageSquareIcon, O as InfoIcon, P as MicrophoneIcon, Q as SunIcon, R as MoveToFrontIcon, S as EyeOffIcon, T as FolderOpenIcon, U as PlusIcon, V as PencilIcon, W as QueueIcon, X as SquareIcon, Y as SpinnerIcon, Z as StopIcon, _ as DiscordIcon, a as ArrowUpIcon, b as EllipsisIcon, c as BoxIcon, d as CheckIcon, et as TerminalIcon, f as ChevronDownIcon, g as CopyIcon, h as CodeIcon, i as ArrowRightIcon, it as XIcon, j as MaximizeIcon, k as KeyboardIcon, l as BrainIcon, m as ChevronRightIcon, n as ArrowDownIcon, nt as WarningIcon, o as ArrowUpRightIcon, p as ChevronLeftIcon, q as SidebarIcon, r as ArrowLeftIcon, rt as WrenchIcon, s as BookmarkIcon, t as ArchiveIcon, tt as TrashIcon, u as CalendarIcon, v as DotIcon, w as FolderIcon, x as EyeIcon, y as DownloadIcon, z as PaperclipIcon } from "../../icons-MmIXciMO.js";
2
+ export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowUpRightIcon, BookmarkIcon, BoxIcon, BrainIcon, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, ImageIcon, InfoIcon, KeyboardIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SlackIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TargetIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
@@ -1,7 +1,7 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
2
  import { Collapsible } from "../foundations/Collapsible.js";
3
- import { C as FileIcon, m as ChevronRightIcon } from "../../icons-B4mGvCvc.js";
4
- import { t as CopyButton } from "../../copy-button-4YvddK4e.js";
3
+ import { C as FileIcon, m as ChevronRightIcon } from "../../icons-MmIXciMO.js";
4
+ import { t as CopyButton } from "../../copy-button-Bc7jsYv_.js";
5
5
  import { Badge } from "../foundations/Badge.js";
6
6
  import { Avatar } from "../foundations/Avatar.js";
7
7
  import "react";
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { S as EyeOffIcon, x as EyeIcon } from "../../icons-B4mGvCvc.js";
3
- import { t as CopyButton } from "../../copy-button-4YvddK4e.js";
2
+ import { S as EyeOffIcon, x as EyeIcon } from "../../icons-MmIXciMO.js";
3
+ import { t as CopyButton } from "../../copy-button-Bc7jsYv_.js";
4
4
  import { Badge } from "../foundations/Badge.js";
5
5
  import { Switch } from "../foundations/Switch.js";
6
6
  import * as React from "react";
@@ -1,2 +1,2 @@
1
- import { a as FileTreeIcon, i as FileTreeFolder, n as FileTreeActions, o as FileTreeName, r as FileTreeFile, t as FileTree } from "../../FileTree-DbQMpvxV.js";
1
+ import { a as FileTreeIcon, i as FileTreeFolder, n as FileTreeActions, o as FileTreeName, r as FileTreeFile, t as FileTree } from "../../FileTree-xqHYBw4g.js";
2
2
  export { FileTree, FileTreeActions, FileTreeFile, FileTreeFolder, FileTreeIcon, FileTreeName };
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { O as InfoIcon, P as MinusIcon, d as CheckIcon } from "../../icons-B4mGvCvc.js";
2
+ import { F as MinusIcon, O as InfoIcon, d as CheckIcon } from "../../icons-MmIXciMO.js";
3
3
  import { Button } from "../foundations/Button.js";
4
4
  import { IconButton } from "../foundations/IconButton.js";
5
5
  import { Separator } from "../foundations/Separator.js";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { K as SidebarIcon } from "../../icons-B4mGvCvc.js";
2
+ import { q as SidebarIcon } from "../../icons-MmIXciMO.js";
3
3
  import { Button } from "../foundations/Button.js";
4
4
  import { t as capitalize } from "../../format-DB2mX9DA.js";
5
5
  import { n as mergeRefs } from "../../merge-refs-DF_7w2x_.js";
@@ -1,5 +1,5 @@
1
1
  import { n as mergeBaseClassName } from "../../class-names-BiMDVpUo.js";
2
- import { H as PlusIcon, d as CheckIcon, f as ChevronDownIcon, tt as WarningIcon } from "../../icons-B4mGvCvc.js";
2
+ import { U as PlusIcon, d as CheckIcon, f as ChevronDownIcon, nt as WarningIcon } from "../../icons-MmIXciMO.js";
3
3
  import { Button } from "../foundations/Button.js";
4
4
  import { Menu } from "../foundations/Menu.js";
5
5
  import * as React from "react";
@@ -1,7 +1,7 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { $ as TerminalIcon, rt as XIcon } from "../../icons-B4mGvCvc.js";
2
+ import { et as TerminalIcon, it as XIcon } from "../../icons-MmIXciMO.js";
3
3
  import { IconButton } from "../foundations/IconButton.js";
4
- import { t as CopyButton } from "../../copy-button-4YvddK4e.js";
4
+ import { t as CopyButton } from "../../copy-button-Bc7jsYv_.js";
5
5
  import { Badge } from "../foundations/Badge.js";
6
6
  import { ScrollArea } from "../foundations/ScrollArea.js";
7
7
  import * as React from "react";
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
2
  import { Collapsible } from "../foundations/Collapsible.js";
3
- import { J as SpinnerIcon, d as CheckIcon, m as ChevronRightIcon, rt as XIcon } from "../../icons-B4mGvCvc.js";
3
+ import { Y as SpinnerIcon, d as CheckIcon, it as XIcon, m as ChevronRightIcon } from "../../icons-MmIXciMO.js";
4
4
  import { Badge } from "../foundations/Badge.js";
5
5
  import { Progress } from "../foundations/Progress.js";
6
6
  import * as React from "react";
@@ -1,4 +1,4 @@
1
- import { F as MonitorIcon, I as MoonIcon, Z as SunIcon } from "../../icons-B4mGvCvc.js";
1
+ import { I as MonitorIcon, L as MoonIcon, Q as SunIcon } from "../../icons-MmIXciMO.js";
2
2
  import { Radio, RadioGroup } from "../foundations/RadioGroup.js";
3
3
  import { useTheme } from "../foundations/ThemeProvider.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
2
  import { Collapsible } from "../foundations/Collapsible.js";
3
- import { W as RefreshIcon, f as ChevronDownIcon, i as ArrowRightIcon, r as ArrowLeftIcon } from "../../icons-B4mGvCvc.js";
3
+ import { G as RefreshIcon, f as ChevronDownIcon, i as ArrowRightIcon, r as ArrowLeftIcon } from "../../icons-MmIXciMO.js";
4
4
  import { IconButton } from "../foundations/IconButton.js";
5
5
  import { Badge } from "../foundations/Badge.js";
6
6
  import { ScrollArea } from "../foundations/ScrollArea.js";
@@ -1,7 +1,7 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { k as LinkIcon } from "../../icons-B4mGvCvc.js";
2
+ import { A as LinkIcon } from "../../icons-MmIXciMO.js";
3
3
  import { Button } from "../foundations/Button.js";
4
- import { a as CodeBlockCopyButton, i as CodeBlockContent, n as CodeBlockActions, p as CodeBlockTitle, r as CodeBlockContainer, s as CodeBlockHeader, t as CodeBlock } from "../../CodeBlock-DO4Hdu1R.js";
4
+ import { a as CodeBlockCopyButton, i as CodeBlockContent, n as CodeBlockActions, p as CodeBlockTitle, r as CodeBlockContainer, s as CodeBlockHeader, t as CodeBlock } from "../../CodeBlock-CWk1FVtm.js";
5
5
  import { Popover } from "../foundations/Popover.js";
6
6
  import { ToggleGroup } from "../foundations/ToggleGroup.js";
7
7
  import * as React from "react";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../../class-names-BiMDVpUo.js";
2
- import { r as ArrowLeftIcon } from "../../icons-B4mGvCvc.js";
2
+ import { r as ArrowLeftIcon } from "../../icons-MmIXciMO.js";
3
3
  import { TransitionSurface } from "../foundations/TransitionSurface.js";
4
4
  import { AppTopBar } from "../general-purpose/AppTopBar.js";
5
5
  import { NaniteMark } from "./NaniteScene.js";
@@ -1,4 +1,4 @@
1
- import { d as CheckIcon, g as CopyIcon } from "./icons-B4mGvCvc.js";
1
+ import { d as CheckIcon, g as CopyIcon } from "./icons-MmIXciMO.js";
2
2
  import { IconButton } from "./components/foundations/IconButton.js";
3
3
  import * as React from "react";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -203,6 +203,11 @@ declare const LinkIcon: ({
203
203
  strokeWidth,
204
204
  ...props
205
205
  }: IconProps) => import("react").JSX.Element;
206
+ declare const KeyboardIcon: ({
207
+ size,
208
+ strokeWidth,
209
+ ...props
210
+ }: IconProps) => import("react").JSX.Element;
206
211
  declare const QueueIcon: ({
207
212
  size,
208
213
  strokeWidth,
@@ -296,4 +301,4 @@ declare const MaximizeIcon: ({
296
301
  ...props
297
302
  }: IconProps) => import("react").JSX.Element;
298
303
  //#endregion
299
- export { SunIcon as $, InfoIcon as A, PaperclipIcon as B, EyeOffIcon as C, HashIcon as D, FolderOpenIcon as E, MicrophoneIcon as F, QueueIcon as G, PencilIcon as H, MinusIcon as I, SidebarIcon as J, RefreshIcon as K, MonitorIcon as L, MaximizeIcon as M, McpIcon as N, IconProps as O, MessageSquareIcon as P, StopIcon as Q, MoonIcon as R, EyeIcon as S, FolderIcon as T, PlayIcon as U, PauseIcon as V, PlusIcon as W, SpinnerIcon as X, SlackIcon as Y, SquareIcon as Z, CopyIcon as _, ArrowUpIcon as a, XIcon as at, DownloadIcon as b, BoxIcon as c, CalendarIcon as d, TargetIcon as et, CheckIcon as f, CodeIcon as g, ChevronRightIcon as h, ArrowRightIcon as i, WrenchIcon as it, LinkIcon as j, ImageIcon as k, BrainIcon as l, ChevronLeftIcon as m, ArrowDownIcon as n, TrashIcon as nt, ArrowUpRightIcon as o, ChevronDownIcon as p, SearchIcon as q, ArrowLeftIcon as r, WarningIcon as rt, BookmarkIcon as s, ArchiveIcon as t, TerminalIcon as tt, BrandIconProps as u, DiscordIcon as v, FileIcon as w, EllipsisIcon as x, DotIcon as y, MoveToFrontIcon as z };
304
+ export { StopIcon as $, InfoIcon as A, MoveToFrontIcon as B, EyeOffIcon as C, HashIcon as D, FolderOpenIcon as E, MessageSquareIcon as F, PlusIcon as G, PauseIcon as H, MicrophoneIcon as I, SearchIcon as J, QueueIcon as K, MinusIcon as L, LinkIcon as M, MaximizeIcon as N, IconProps as O, McpIcon as P, SquareIcon as Q, MonitorIcon as R, EyeIcon as S, FolderIcon as T, PencilIcon as U, PaperclipIcon as V, PlayIcon as W, SlackIcon as X, SidebarIcon as Y, SpinnerIcon as Z, CopyIcon as _, ArrowUpIcon as a, WrenchIcon as at, DownloadIcon as b, BoxIcon as c, CalendarIcon as d, SunIcon as et, CheckIcon as f, CodeIcon as g, ChevronRightIcon as h, ArrowRightIcon as i, WarningIcon as it, KeyboardIcon as j, ImageIcon as k, BrainIcon as l, ChevronLeftIcon as m, ArrowDownIcon as n, TerminalIcon as nt, ArrowUpRightIcon as o, XIcon as ot, ChevronDownIcon as p, RefreshIcon as q, ArrowLeftIcon as r, TrashIcon as rt, BookmarkIcon as s, ArchiveIcon as t, TargetIcon as tt, BrandIconProps as u, DiscordIcon as v, FileIcon as w, EllipsisIcon as x, DotIcon as y, MoonIcon as z };
@@ -1,6 +1,6 @@
1
1
  import { t as cx } from "./class-names-BiMDVpUo.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, ArrowUpRight, Bookmark, Box, Brain, CalendarDays, Check, ChevronDown, ChevronLeft, ChevronRight, CircleStop, CodeXml, Copy, CornerDownRight, Dot, Download, Ellipsis, Eye, EyeOff, File, Folder, FolderOpen, Hash, Image, Info, Link2, ListRestart, LoaderCircle, Maximize2, MessageSquare, Mic, Minus, Monitor, Moon, PanelLeft, Paperclip, Pause, Pencil, Play, Plus, RefreshCw, Search, Square, Sun, Target, Terminal, Trash2, TriangleAlert, Wrench, X } from "lucide-react";
3
+ import { Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, ArrowUpRight, Bookmark, Box, Brain, CalendarDays, Check, ChevronDown, ChevronLeft, ChevronRight, CircleStop, CodeXml, Copy, CornerDownRight, Dot, Download, Ellipsis, Eye, EyeOff, File, Folder, FolderOpen, Hash, Image, Info, Keyboard, Link2, ListRestart, LoaderCircle, Maximize2, MessageSquare, Mic, Minus, Monitor, Moon, PanelLeft, Paperclip, Pause, Pencil, Play, Plus, RefreshCw, Search, Square, Sun, Target, Terminal, Trash2, TriangleAlert, Wrench, X } from "lucide-react";
4
4
  import { FaSlack } from "react-icons/fa6";
5
5
  import { SiDiscord, SiModelcontextprotocol } from "react-icons/si";
6
6
  //#region src/components/_internal/icons.tsx
@@ -72,6 +72,7 @@ const SearchIcon = icon(Search);
72
72
  const SidebarIcon = icon(PanelLeft);
73
73
  const TerminalIcon = icon(Terminal);
74
74
  const LinkIcon = icon(Link2);
75
+ const KeyboardIcon = icon(Keyboard);
75
76
  const QueueIcon = icon(ListRestart);
76
77
  const TrashIcon = icon(Trash2);
77
78
  const WarningIcon = icon(TriangleAlert);
@@ -92,4 +93,4 @@ const SunIcon = icon(Sun);
92
93
  const TargetIcon = icon(Target);
93
94
  const MaximizeIcon = icon(Maximize2);
94
95
  //#endregion
95
- export { TerminalIcon as $, MaximizeIcon as A, PencilIcon as B, FileIcon as C, ImageIcon as D, HashIcon as E, MonitorIcon as F, SearchIcon as G, PlusIcon as H, MoonIcon as I, SpinnerIcon as J, SidebarIcon as K, MoveToFrontIcon as L, MessageSquareIcon as M, MicrophoneIcon as N, InfoIcon as O, MinusIcon as P, TargetIcon as Q, PaperclipIcon as R, EyeOffIcon as S, FolderOpenIcon as T, QueueIcon as U, PlayIcon as V, RefreshIcon as W, StopIcon as X, SquareIcon as Y, SunIcon as Z, DiscordIcon as _, ArrowUpIcon as a, EllipsisIcon as b, BoxIcon as c, CheckIcon as d, TrashIcon as et, ChevronDownIcon as f, CopyIcon as g, CodeIcon as h, ArrowRightIcon as i, McpIcon as j, LinkIcon as k, BrainIcon as l, ChevronRightIcon as m, ArrowDownIcon as n, WrenchIcon as nt, ArrowUpRightIcon as o, ChevronLeftIcon as p, SlackIcon as q, ArrowLeftIcon as r, XIcon as rt, BookmarkIcon as s, ArchiveIcon as t, WarningIcon as tt, CalendarIcon as u, DotIcon as v, FolderIcon as w, EyeIcon as x, DownloadIcon as y, PauseIcon as z };
96
+ export { TargetIcon as $, LinkIcon as A, PauseIcon as B, FileIcon as C, ImageIcon as D, HashIcon as E, MinusIcon as F, RefreshIcon as G, PlayIcon as H, MonitorIcon as I, SlackIcon as J, SearchIcon as K, MoonIcon as L, McpIcon as M, MessageSquareIcon as N, InfoIcon as O, MicrophoneIcon as P, SunIcon as Q, MoveToFrontIcon as R, EyeOffIcon as S, FolderOpenIcon as T, PlusIcon as U, PencilIcon as V, QueueIcon as W, SquareIcon as X, SpinnerIcon as Y, StopIcon as Z, DiscordIcon as _, ArrowUpIcon as a, EllipsisIcon as b, BoxIcon as c, CheckIcon as d, TerminalIcon as et, ChevronDownIcon as f, CopyIcon as g, CodeIcon as h, ArrowRightIcon as i, XIcon as it, MaximizeIcon as j, KeyboardIcon as k, BrainIcon as l, ChevronRightIcon as m, ArrowDownIcon as n, WarningIcon as nt, ArrowUpRightIcon as o, ChevronLeftIcon as p, SidebarIcon as q, ArrowLeftIcon as r, WrenchIcon as rt, BookmarkIcon as s, ArchiveIcon as t, TrashIcon as tt, CalendarIcon as u, DotIcon as v, FolderIcon as w, EyeIcon as x, DownloadIcon as y, PaperclipIcon as z };
@@ -59,14 +59,14 @@
59
59
 
60
60
  /* Takes the whole transcript region, the way the scroller it stands in for
61
61
  does, so nothing moves when the rows arrive. The composer floats over its
62
- lower edge, so the spinner sits slightly high rather than under it. */
62
+ lower edge, so the state sits slightly high rather than under it. The
63
+ .empty-state inside brings its own type and colour. */
63
64
  .agent-chat__transcript-loading {
64
65
  display: grid;
65
66
  block-size: 100%;
66
67
  min-block-size: 0;
67
68
  place-items: center;
68
69
  padding-block-end: var(--agent-chat-composer-size, 5rem);
69
- color: var(--sigvelo-color-text-muted);
70
70
  }
71
71
 
72
72
  .agent-chat[data-composer-hidden] .agent-chat__transcript-loading {
@@ -135,6 +135,10 @@ body {
135
135
  }
136
136
  }
137
137
 
138
+ /* A spinner that cannot spin is a circle. Plenty of people — most of them on
139
+ phones — browse with this on, so nothing may rely on the rotation to say
140
+ "still working": pair the icon with text that reads the same either way.
141
+ `.empty-state` is that pairing for a whole region. */
138
142
  @media (prefers-reduced-motion: reduce) {
139
143
  .sigvelo-icon--spinner {
140
144
  animation: none;
@@ -15,6 +15,18 @@
15
15
  overflow: hidden;
16
16
  }
17
17
 
18
+ /* `fill`: the view is the surface, not a card on it. Nothing sits beside it to
19
+ be separated from, so the aspect box, the hairline and the corners go and the
20
+ frame takes whatever its container gives it. The picture still letterboxes
21
+ inside — `object-fit: contain` further down is what keeps the remote page's
22
+ own proportions honest at any shape. */
23
+ .browser-live-view[data-fill] {
24
+ block-size: 100%;
25
+ aspect-ratio: auto;
26
+ border: 0;
27
+ border-radius: 0;
28
+ }
29
+
18
30
  .browser-live-view__frame {
19
31
  inline-size: 100%;
20
32
  block-size: 100%;
@@ -60,6 +72,20 @@
60
72
  max-inline-size: 80%;
61
73
  }
62
74
 
75
+ /* Host-drawn media. Styled by element rather than by class so a host that
76
+ renders its own picture into the frame inherits the shape without opting in:
77
+ `contain` keeps the remote viewport's proportions whatever the box is, and
78
+ the letterbox inherits the frame's fill, so a host that recolors the frame
79
+ recolors the bars with it. */
80
+ .browser-live-view video,
81
+ .browser-live-view canvas {
82
+ display: block;
83
+ inline-size: 100%;
84
+ block-size: 100%;
85
+ object-fit: contain;
86
+ background-color: inherit;
87
+ }
88
+
63
89
  /* An expired view showing a screenshot fallback keeps the image flush */
64
90
  .browser-live-view[data-expired] > img {
65
91
  inline-size: 100%;
@@ -83,6 +109,25 @@
83
109
  z-index: 1;
84
110
  }
85
111
 
112
+ /* A fault that leaves the picture running: a caption on the frame, opposite
113
+ the expand control, rather than an overlay that would hide what still
114
+ arrives. */
115
+ .browser-live-view__notice {
116
+ position: absolute;
117
+ inset-block-end: var(--sigvelo-spacing-2);
118
+ inset-inline-start: var(--sigvelo-spacing-2);
119
+ z-index: 1;
120
+ max-inline-size: calc(100% - var(--sigvelo-spacing-12));
121
+ margin: 0;
122
+ padding: var(--sigvelo-spacing-1) var(--sigvelo-spacing-2);
123
+ border-radius: var(--sigvelo-radius-md);
124
+ background-color: var(--sigvelo-color-surface-raised);
125
+ box-shadow: var(--sigvelo-elevation-raised);
126
+ color: var(--sigvelo-color-text-muted);
127
+ font-size: var(--sigvelo-text-xs);
128
+ pointer-events: none;
129
+ }
130
+
86
131
  /* Expand affordance, video-player style: quiet until the box is hovered or
87
132
  the button is focused */
88
133
  .browser-live-view__expand {
@@ -77,7 +77,9 @@
77
77
  padding: var(--sigvelo-spacing-2-5);
78
78
  }
79
79
 
80
- .browser-run-panel__live-view {
80
+ /* Whichever live surface the body holds — the panel's own embedded view or a
81
+ * host-fed stream — fills the frame the same way. */
82
+ .browser-run-panel__body > .browser-live-view {
81
83
  flex: 1;
82
84
  min-block-size: 16rem;
83
85
  aspect-ratio: auto;
@@ -70,6 +70,12 @@
70
70
  margin-block-start: var(--sigvelo-spacing-4);
71
71
  }
72
72
 
73
+ .chatgpt-sign-in__error {
74
+ margin: 0;
75
+ color: var(--sigvelo-color-text-muted);
76
+ font-size: var(--sigvelo-text-sm);
77
+ }
78
+
73
79
  .chatgpt-sign-in__brand {
74
80
  display: grid;
75
81
  gap: var(--sigvelo-spacing-1-5);
@@ -158,6 +158,12 @@ body.is-resizing-side-panel .think-full-app__view-scope {
158
158
  );
159
159
  }
160
160
 
161
+ /* The panel stands in for itself while its first read is in flight, so the
162
+ waiting state sits where the content will rather than in the top corner. */
163
+ .think-full-app__workbench--loading {
164
+ justify-content: center;
165
+ }
166
+
161
167
  .think-full-app__workbench.workspace-explorer {
162
168
  border: 0;
163
169
  border-radius: 0;
@@ -293,6 +299,14 @@ body.is-resizing-side-panel .think-full-app__view-scope {
293
299
  max(var(--sigvelo-spacing-3), env(safe-area-inset-right, 0px));
294
300
  }
295
301
 
302
+ /* The gutter above belongs to the composer pinned under a transcript. On the
303
+ start screen the composer is in flow and the utility tray docks against
304
+ the card's bottom edge, so any bottom padding here reads as the tray
305
+ floating detached. */
306
+ .think-full-app .agent-chat-start-screen__composer > .agent-chat__composer {
307
+ padding: 0;
308
+ }
309
+
296
310
  .think-full-app .prompt-input {
297
311
  gap: var(--sigvelo-spacing-1);
298
312
  padding-block: var(--sigvelo-spacing-2);