@mcp-b/react-components 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Button-QCM8ZKgR.d.ts +98 -0
- package/dist/CodeBlock-CttHhWcb.js +356 -0
- package/dist/CodeBlock-V6pgafSS.d.ts +174 -0
- package/dist/Select-CRsKCJ9x.d.ts +200 -0
- package/dist/class-names-9UtZwb0J.js +12 -0
- package/dist/components/Accordion.d.ts +81 -0
- package/dist/components/Accordion.js +97 -0
- package/dist/components/AgentConnection.d.ts +69 -0
- package/dist/components/AgentConnection.js +176 -0
- package/dist/components/AlertDialog.d.ts +148 -0
- package/dist/components/AlertDialog.js +141 -0
- package/dist/components/Artifact.d.ts +128 -0
- package/dist/components/Artifact.js +115 -0
- package/dist/components/Autocomplete.d.ts +186 -0
- package/dist/components/Autocomplete.js +186 -0
- package/dist/components/Avatar.d.ts +134 -0
- package/dist/components/Avatar.js +118 -0
- package/dist/components/Badge.d.ts +68 -0
- package/dist/components/Badge.js +108 -0
- package/dist/components/Button.d.ts +2 -0
- package/dist/components/Button.js +73 -0
- package/dist/components/Card.d.ts +87 -0
- package/dist/components/Card.js +81 -0
- package/dist/components/ChainOfThought.d.ts +153 -0
- package/dist/components/ChainOfThought.js +157 -0
- package/dist/components/Checkbox.d.ts +35 -0
- package/dist/components/Checkbox.js +47 -0
- package/dist/components/CheckboxGroup.d.ts +76 -0
- package/dist/components/CheckboxGroup.js +69 -0
- package/dist/components/CodeBlock.d.ts +2 -0
- package/dist/components/CodeBlock.js +2 -0
- package/dist/components/Collapsible.d.ts +127 -0
- package/dist/components/Collapsible.js +103 -0
- package/dist/components/Combobox.d.ts +177 -0
- package/dist/components/Combobox.js +179 -0
- package/dist/components/Commit.d.ts +265 -0
- package/dist/components/Commit.js +282 -0
- package/dist/components/Context.d.ts +129 -0
- package/dist/components/Context.js +309 -0
- package/dist/components/ContextMenu.d.ts +282 -0
- package/dist/components/ContextMenu.js +270 -0
- package/dist/components/Conversation.d.ts +166 -0
- package/dist/components/Conversation.js +202 -0
- package/dist/components/Dialog.d.ts +120 -0
- package/dist/components/Dialog.js +114 -0
- package/dist/components/EnvironmentVariables.d.ts +176 -0
- package/dist/components/EnvironmentVariables.js +221 -0
- package/dist/components/Field.d.ts +281 -0
- package/dist/components/Field.js +274 -0
- package/dist/components/Fieldset.d.ts +93 -0
- package/dist/components/Fieldset.js +81 -0
- package/dist/components/FileTree.d.ts +116 -0
- package/dist/components/FileTree.js +310 -0
- package/dist/components/Form.d.ts +94 -0
- package/dist/components/Form.js +88 -0
- package/dist/components/GithubMotionMark.d.ts +13 -0
- package/dist/components/GithubMotionMark.js +23 -0
- package/dist/components/Input.d.ts +33 -0
- package/dist/components/Input.js +27 -0
- package/dist/components/Label.d.ts +44 -0
- package/dist/components/Label.js +41 -0
- package/dist/components/Menu.d.ts +395 -0
- package/dist/components/Menu.js +338 -0
- package/dist/components/Menubar.d.ts +331 -0
- package/dist/components/Menubar.js +299 -0
- package/dist/components/Message.d.ts +216 -0
- package/dist/components/Message.js +245 -0
- package/dist/components/Meter.d.ts +151 -0
- package/dist/components/Meter.js +121 -0
- package/dist/components/ModelSelector.d.ts +198 -0
- package/dist/components/ModelSelector.js +306 -0
- package/dist/components/NaniteScene.d.ts +33 -0
- package/dist/components/NaniteScene.js +405 -0
- package/dist/components/NavigationMenu.d.ts +256 -0
- package/dist/components/NavigationMenu.js +228 -0
- package/dist/components/NumberField.d.ts +159 -0
- package/dist/components/NumberField.js +123 -0
- package/dist/components/Popover.d.ts +278 -0
- package/dist/components/Popover.js +245 -0
- package/dist/components/PreviewCard.d.ts +156 -0
- package/dist/components/PreviewCard.js +156 -0
- package/dist/components/PricingPage.d.ts +209 -0
- package/dist/components/PricingPage.js +506 -0
- package/dist/components/Progress.d.ts +58 -0
- package/dist/components/Progress.js +51 -0
- package/dist/components/PromptInput.d.ts +399 -0
- package/dist/components/PromptInput.js +737 -0
- package/dist/components/Queue.d.ts +241 -0
- package/dist/components/Queue.js +225 -0
- package/dist/components/RadioGroup.d.ts +78 -0
- package/dist/components/RadioGroup.js +72 -0
- package/dist/components/Reasoning.d.ts +88 -0
- package/dist/components/Reasoning.js +187 -0
- package/dist/components/ScrollArea.d.ts +160 -0
- package/dist/components/ScrollArea.js +145 -0
- package/dist/components/Select.d.ts +2 -0
- package/dist/components/Select.js +260 -0
- package/dist/components/Separator.d.ts +45 -0
- package/dist/components/Separator.js +40 -0
- package/dist/components/Shell.d.ts +163 -0
- package/dist/components/Shell.js +137 -0
- package/dist/components/Slider.d.ts +120 -0
- package/dist/components/Slider.js +115 -0
- package/dist/components/Sources.d.ts +91 -0
- package/dist/components/Sources.js +121 -0
- package/dist/components/Stepper.d.ts +190 -0
- package/dist/components/Stepper.js +315 -0
- package/dist/components/Switch.d.ts +57 -0
- package/dist/components/Switch.js +55 -0
- package/dist/components/Tabs.d.ts +84 -0
- package/dist/components/Tabs.js +78 -0
- package/dist/components/Task.d.ts +100 -0
- package/dist/components/Task.js +120 -0
- package/dist/components/Terminal.d.ts +118 -0
- package/dist/components/Terminal.js +234 -0
- package/dist/components/TestResults.d.ts +236 -0
- package/dist/components/TestResults.js +346 -0
- package/dist/components/Toast.d.ts +192 -0
- package/dist/components/Toast.js +163 -0
- package/dist/components/Toggle.d.ts +69 -0
- package/dist/components/Toggle.js +66 -0
- package/dist/components/ToggleGroup.d.ts +69 -0
- package/dist/components/ToggleGroup.js +99 -0
- package/dist/components/Tool.d.ts +119 -0
- package/dist/components/Tool.js +192 -0
- package/dist/components/Toolbar.d.ts +162 -0
- package/dist/components/Toolbar.js +126 -0
- package/dist/components/Tooltip.d.ts +81 -0
- package/dist/components/Tooltip.js +74 -0
- package/dist/components/WebPreview.d.ts +143 -0
- package/dist/components/WebPreview.js +280 -0
- package/dist/components/useStickToBottom.d.ts +30 -0
- package/dist/components/useStickToBottom.js +95 -0
- package/dist/copy-button-BIATcZWZ.d.ts +16 -0
- package/dist/copy-button-BNgclDrO.js +43 -0
- package/dist/icons-BsWc8g4E.js +221 -0
- package/dist/styles/accordion.css +10 -10
- package/dist/styles/agent-connection.css +18 -17
- package/dist/styles/alert-dialog.css +48 -29
- package/dist/styles/artifact.css +10 -10
- package/dist/styles/autocomplete.css +25 -24
- package/dist/styles/avatar.css +96 -6
- package/dist/styles/badge.css +78 -14
- package/dist/styles/base.css +9 -9
- package/dist/styles/button.css +57 -38
- package/dist/styles/card.css +57 -10
- package/dist/styles/chain-of-thought.css +47 -33
- package/dist/styles/checkbox.css +24 -10
- package/dist/styles/code-block.css +22 -15
- package/dist/styles/collapsible.css +14 -12
- package/dist/styles/combobox.css +26 -25
- package/dist/styles/commit.css +49 -24
- package/dist/styles/context-menu.css +70 -16
- package/dist/styles/context.css +15 -15
- package/dist/styles/conversation.css +12 -12
- package/dist/styles/dialog.css +52 -16
- package/dist/styles/environment-variables.css +19 -19
- package/dist/styles/field.css +184 -22
- package/dist/styles/fieldset.css +5 -4
- package/dist/styles/file-tree.css +17 -17
- package/dist/styles/index.css.d.ts +1 -0
- package/dist/styles/input.css +45 -11
- package/dist/styles/label.css +21 -4
- package/dist/styles/menu.css +55 -32
- package/dist/styles/menubar.css +80 -28
- package/dist/styles/message.css +22 -13
- package/dist/styles/meter.css +8 -8
- package/dist/styles/model-selector.css +33 -21
- package/dist/styles/navigation-menu.css +26 -24
- package/dist/styles/number-field.css +20 -18
- package/dist/styles/popover.css +38 -28
- package/dist/styles/preview-card.css +15 -13
- package/dist/styles/pricing-page.css +53 -53
- package/dist/styles/progress.css +7 -7
- package/dist/styles/prompt-input.css +73 -24
- package/dist/styles/queue.css +58 -32
- package/dist/styles/radio.css +26 -11
- package/dist/styles/reasoning.css +15 -11
- package/dist/styles/scroll-area.css +6 -6
- package/dist/styles/scrollbars.css +4 -4
- package/dist/styles/select.css +84 -25
- package/dist/styles/separator.css +1 -1
- package/dist/styles/shell.css +21 -20
- package/dist/styles/slider.css +35 -11
- package/dist/styles/sources.css +20 -20
- package/dist/styles/stepper.css +22 -22
- package/dist/styles/switch.css +29 -13
- package/dist/styles/tabs.css +23 -16
- package/dist/styles/task.css +27 -23
- package/dist/styles/terminal.css +16 -13
- package/dist/styles/test-results.css +79 -32
- package/dist/styles/toast.css +26 -25
- package/dist/styles/toggle-group.css +12 -12
- package/dist/styles/toggle.css +29 -11
- package/dist/styles/tool.css +54 -32
- package/dist/styles/toolbar.css +30 -28
- package/dist/styles/tooltip.css +10 -8
- package/dist/styles/web-preview.css +37 -21
- package/dist/utils/structured-code.d.ts +10 -0
- package/dist/utils/structured-code.js +81 -0
- package/package.json +17 -8
- package/dist/index.d.ts +0 -7236
- package/dist/index.js +0 -8945
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { r as ButtonProps } from "../Button-QCM8ZKgR.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/components/ModelSelector.d.ts
|
|
5
|
+
interface ModelSelectorProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
6
|
+
/** Controlled dialog open state. */
|
|
7
|
+
open?: boolean;
|
|
8
|
+
/** Initial dialog open state for uncontrolled usage. */
|
|
9
|
+
defaultOpen?: boolean;
|
|
10
|
+
/** Called when the dialog opens or closes. */
|
|
11
|
+
onOpenChange?: (open: boolean) => void;
|
|
12
|
+
/** Additional class names for layout only; do not restyle dialog internals from apps. */
|
|
13
|
+
className?: string;
|
|
14
|
+
/** Trigger, content, search input, grouped list, and items. */
|
|
15
|
+
children?: React.ReactNode;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A searchable model picker. Click the trigger to open a dialog containing a
|
|
19
|
+
* search input and a grouped list of available models.
|
|
20
|
+
*
|
|
21
|
+
* Built internally for AI model selection. Use it when users choose one model
|
|
22
|
+
* from a grouped provider list. Do not use it as a general command palette or
|
|
23
|
+
* multiselect; use Combobox or a dedicated component for that.
|
|
24
|
+
*
|
|
25
|
+
* Sigvelo changes: composes the design-system Dialog and Button, filters item
|
|
26
|
+
* children locally, and maps provider logos plus listbox styling to Sigvelo
|
|
27
|
+
* CSS tokens.
|
|
28
|
+
*
|
|
29
|
+
* The dialog owns focus while open, the list uses `role="listbox"`, and items
|
|
30
|
+
* use `role="option"` with `aria-selected`. Styling consumes surface, border,
|
|
31
|
+
* spacing, radius, focus, and typography tokens. Add provider/item affordances
|
|
32
|
+
* here when they need to be shared.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* <ModelSelector>
|
|
37
|
+
* <ModelSelectorTrigger>
|
|
38
|
+
* <ModelSelectorLogo provider="anthropic" />
|
|
39
|
+
* <ModelSelectorName>Claude Opus 4.6</ModelSelectorName>
|
|
40
|
+
* </ModelSelectorTrigger>
|
|
41
|
+
* <ModelSelectorContent>
|
|
42
|
+
* <ModelSelectorDialog>
|
|
43
|
+
* <ModelSelectorInput placeholder="Search models…" />
|
|
44
|
+
* <ModelSelectorList>
|
|
45
|
+
* <ModelSelectorGroup label="Anthropic">
|
|
46
|
+
* <ModelSelectorItem value="claude-opus-4-6" onSelect={…}>
|
|
47
|
+
* <ModelSelectorLogo provider="anthropic" />
|
|
48
|
+
* <ModelSelectorName>Claude Opus 4.6</ModelSelectorName>
|
|
49
|
+
* </ModelSelectorItem>
|
|
50
|
+
* </ModelSelectorGroup>
|
|
51
|
+
* </ModelSelectorList>
|
|
52
|
+
* </ModelSelectorDialog>
|
|
53
|
+
* </ModelSelectorContent>
|
|
54
|
+
* </ModelSelector>
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
declare function ModelSelector({
|
|
58
|
+
open,
|
|
59
|
+
defaultOpen,
|
|
60
|
+
onOpenChange,
|
|
61
|
+
children,
|
|
62
|
+
className,
|
|
63
|
+
ref,
|
|
64
|
+
...props
|
|
65
|
+
}: ModelSelectorProps & {
|
|
66
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
67
|
+
}): React.JSX.Element;
|
|
68
|
+
interface ModelSelectorTriggerProps extends Omit<ButtonProps, "variant" | "color" | "className"> {
|
|
69
|
+
className?: string;
|
|
70
|
+
}
|
|
71
|
+
declare function ModelSelectorTrigger({
|
|
72
|
+
className,
|
|
73
|
+
children,
|
|
74
|
+
...props
|
|
75
|
+
}: ModelSelectorTriggerProps): React.JSX.Element;
|
|
76
|
+
interface ModelSelectorContentProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
|
|
77
|
+
title?: React.ReactNode;
|
|
78
|
+
}
|
|
79
|
+
declare function ModelSelectorContent({
|
|
80
|
+
children,
|
|
81
|
+
title,
|
|
82
|
+
...props
|
|
83
|
+
}: ModelSelectorContentProps): React.JSX.Element;
|
|
84
|
+
interface ModelSelectorDialogProps extends React.HTMLAttributes<HTMLDivElement> {}
|
|
85
|
+
declare function ModelSelectorDialog({
|
|
86
|
+
className,
|
|
87
|
+
children,
|
|
88
|
+
ref,
|
|
89
|
+
...props
|
|
90
|
+
}: ModelSelectorDialogProps & {
|
|
91
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
92
|
+
}): React.JSX.Element;
|
|
93
|
+
interface ModelSelectorInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange" | "value"> {}
|
|
94
|
+
declare function ModelSelectorInput({
|
|
95
|
+
className,
|
|
96
|
+
placeholder,
|
|
97
|
+
ref,
|
|
98
|
+
...props
|
|
99
|
+
}: ModelSelectorInputProps & {
|
|
100
|
+
ref?: React.Ref<HTMLInputElement>;
|
|
101
|
+
}): React.JSX.Element;
|
|
102
|
+
interface ModelSelectorListProps extends React.HTMLAttributes<HTMLDivElement> {}
|
|
103
|
+
declare function ModelSelectorList({
|
|
104
|
+
className,
|
|
105
|
+
children,
|
|
106
|
+
ref,
|
|
107
|
+
...props
|
|
108
|
+
}: ModelSelectorListProps & {
|
|
109
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
110
|
+
}): React.JSX.Element;
|
|
111
|
+
interface ModelSelectorGroupProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
112
|
+
label: string;
|
|
113
|
+
}
|
|
114
|
+
declare function ModelSelectorGroup({
|
|
115
|
+
className,
|
|
116
|
+
label,
|
|
117
|
+
children,
|
|
118
|
+
ref,
|
|
119
|
+
...props
|
|
120
|
+
}: ModelSelectorGroupProps & {
|
|
121
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
122
|
+
}): React.JSX.Element | null;
|
|
123
|
+
interface ModelSelectorItemProps extends Omit<React.HTMLAttributes<HTMLButtonElement>, "onSelect"> {
|
|
124
|
+
value: string;
|
|
125
|
+
/** Extra keywords for search matching. */
|
|
126
|
+
keywords?: string;
|
|
127
|
+
/** Whether this item is the currently selected one. */
|
|
128
|
+
selected?: boolean;
|
|
129
|
+
/** Called when the item is chosen. */
|
|
130
|
+
onSelect?: (value: string) => void;
|
|
131
|
+
}
|
|
132
|
+
declare function ModelSelectorItem({
|
|
133
|
+
className,
|
|
134
|
+
value,
|
|
135
|
+
keywords,
|
|
136
|
+
selected,
|
|
137
|
+
onSelect,
|
|
138
|
+
children,
|
|
139
|
+
onClick,
|
|
140
|
+
ref,
|
|
141
|
+
...props
|
|
142
|
+
}: ModelSelectorItemProps & {
|
|
143
|
+
ref?: React.Ref<HTMLButtonElement>;
|
|
144
|
+
}): React.JSX.Element;
|
|
145
|
+
interface ModelSelectorEmptyProps extends React.HTMLAttributes<HTMLDivElement> {}
|
|
146
|
+
declare function ModelSelectorEmpty({
|
|
147
|
+
className,
|
|
148
|
+
children,
|
|
149
|
+
ref,
|
|
150
|
+
...props
|
|
151
|
+
}: ModelSelectorEmptyProps & {
|
|
152
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
153
|
+
}): React.JSX.Element;
|
|
154
|
+
interface ModelSelectorSeparatorProps extends React.HTMLAttributes<HTMLHRElement> {}
|
|
155
|
+
declare function ModelSelectorSeparator({
|
|
156
|
+
className,
|
|
157
|
+
ref,
|
|
158
|
+
...props
|
|
159
|
+
}: ModelSelectorSeparatorProps & {
|
|
160
|
+
ref?: React.Ref<HTMLHRElement>;
|
|
161
|
+
}): React.JSX.Element;
|
|
162
|
+
interface ModelSelectorLogoProps extends React.SVGAttributes<SVGSVGElement> {
|
|
163
|
+
provider: string;
|
|
164
|
+
}
|
|
165
|
+
declare function ModelSelectorLogo({
|
|
166
|
+
className,
|
|
167
|
+
provider,
|
|
168
|
+
...props
|
|
169
|
+
}: ModelSelectorLogoProps): React.JSX.Element;
|
|
170
|
+
interface ModelSelectorLogoGroupProps extends React.HTMLAttributes<HTMLDivElement> {}
|
|
171
|
+
declare function ModelSelectorLogoGroup({
|
|
172
|
+
className,
|
|
173
|
+
children,
|
|
174
|
+
ref,
|
|
175
|
+
...props
|
|
176
|
+
}: ModelSelectorLogoGroupProps & {
|
|
177
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
178
|
+
}): React.JSX.Element;
|
|
179
|
+
interface ModelSelectorNameProps extends React.HTMLAttributes<HTMLSpanElement> {}
|
|
180
|
+
declare function ModelSelectorName({
|
|
181
|
+
className,
|
|
182
|
+
children,
|
|
183
|
+
ref,
|
|
184
|
+
...props
|
|
185
|
+
}: ModelSelectorNameProps & {
|
|
186
|
+
ref?: React.Ref<HTMLSpanElement>;
|
|
187
|
+
}): React.JSX.Element;
|
|
188
|
+
interface ModelSelectorShortcutProps extends React.HTMLAttributes<HTMLSpanElement> {}
|
|
189
|
+
declare function ModelSelectorShortcut({
|
|
190
|
+
className,
|
|
191
|
+
children,
|
|
192
|
+
ref,
|
|
193
|
+
...props
|
|
194
|
+
}: ModelSelectorShortcutProps & {
|
|
195
|
+
ref?: React.Ref<HTMLSpanElement>;
|
|
196
|
+
}): React.JSX.Element;
|
|
197
|
+
//#endregion
|
|
198
|
+
export { ModelSelector, ModelSelectorContent, ModelSelectorContentProps, ModelSelectorDialog, ModelSelectorDialogProps, ModelSelectorEmpty, ModelSelectorEmptyProps, ModelSelectorGroup, ModelSelectorGroupProps, ModelSelectorInput, ModelSelectorInputProps, ModelSelectorItem, ModelSelectorItemProps, ModelSelectorList, ModelSelectorListProps, ModelSelectorLogo, ModelSelectorLogoGroup, ModelSelectorLogoGroupProps, ModelSelectorLogoProps, ModelSelectorName, ModelSelectorNameProps, ModelSelectorProps, ModelSelectorSeparator, ModelSelectorSeparatorProps, ModelSelectorShortcut, ModelSelectorShortcutProps, ModelSelectorTrigger, ModelSelectorTriggerProps };
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { S as SearchIcon, s as ChevronDownIcon } from "../icons-BsWc8g4E.js";
|
|
2
|
+
import { t as cx } from "../class-names-9UtZwb0J.js";
|
|
3
|
+
import { Button } from "./Button.js";
|
|
4
|
+
import { Dialog, DialogBackdrop, DialogPopup, DialogPortal, DialogTitle, DialogTrigger } from "./Dialog.js";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/_internal/provider-logos.tsx
|
|
8
|
+
function Svg({ children, size = 16, ...props }) {
|
|
9
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
10
|
+
width: size,
|
|
11
|
+
height: size,
|
|
12
|
+
viewBox: "0 0 24 24",
|
|
13
|
+
fill: "currentColor",
|
|
14
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
15
|
+
"aria-hidden": "true",
|
|
16
|
+
focusable: "false",
|
|
17
|
+
...props,
|
|
18
|
+
children
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const OpenAILogo = (props) => /* @__PURE__ */ jsx(Svg, {
|
|
22
|
+
...props,
|
|
23
|
+
children: /* @__PURE__ */ jsx("path", { d: "M22.28 9.81a5.99 5.99 0 0 0-.52-4.91 6.05 6.05 0 0 0-6.52-2.9A6.05 6.05 0 0 0 10.58 0a6.05 6.05 0 0 0-5.77 4.18 5.99 5.99 0 0 0-4 2.9 6.05 6.05 0 0 0 .74 7.09 5.99 5.99 0 0 0 .52 4.91 6.05 6.05 0 0 0 6.52 2.9A5.99 5.99 0 0 0 13.25 24a6.05 6.05 0 0 0 5.77-4.19 5.99 5.99 0 0 0 4-2.9 6.05 6.05 0 0 0-.74-7.1ZM13.25 22.44a4.48 4.48 0 0 1-2.88-1.04l.14-.08 4.79-2.76a.78.78 0 0 0 .39-.68v-6.75l2.02 1.17c.02 0 .04.03.04.05v5.58a4.5 4.5 0 0 1-4.5 4.5ZM3.57 18.3a4.5 4.5 0 0 1-.54-3.03l.14.09 4.79 2.76a.78.78 0 0 0 .78 0l5.85-3.37v2.33c0 .02 0 .04-.03.06L9.72 19.94a4.5 4.5 0 0 1-6.15-1.64ZM2.31 7.88a4.48 4.48 0 0 1 2.35-1.97v5.69a.78.78 0 0 0 .39.67l5.83 3.36-2.02 1.17a.07.07 0 0 1-.07 0l-4.83-2.8A4.5 4.5 0 0 1 2.3 7.9Zm16.64 3.87L13.1 8.37l2.02-1.17c.02 0 .05-.01.07 0l4.83 2.8a4.5 4.5 0 0 1-.67 8.11V12.4a.77.77 0 0 0-.4-.66Zm2-3.03-.14-.09-4.78-2.78a.78.78 0 0 0-.79 0L9.4 9.25V6.92c0-.02 0-.04.02-.05l4.83-2.79a4.5 4.5 0 0 1 6.68 4.66Zm-12.68 4.17-2.02-1.17a.07.07 0 0 1-.04-.06V6.1a4.5 4.5 0 0 1 7.38-3.45l-.14.08L8.66 5.5a.78.78 0 0 0-.4.68v6.74Zm1.1-2.36 2.6-1.5 2.61 1.5v3l-2.6 1.5-2.6-1.5Z" })
|
|
24
|
+
});
|
|
25
|
+
const AnthropicLogo = (props) => /* @__PURE__ */ jsxs(Svg, {
|
|
26
|
+
...props,
|
|
27
|
+
children: [/* @__PURE__ */ jsx("path", { d: "M13.83 4H17.3L24 20h-3.47l-1.37-3.52h-7L10.82 20H7.36ZM13.25 13.58h4.8l-2.4-6.15Z" }), /* @__PURE__ */ jsx("path", { d: "M0 4h3.47l6.7 16H6.7Z" })]
|
|
28
|
+
});
|
|
29
|
+
const GoogleLogo = (props) => /* @__PURE__ */ jsx(Svg, {
|
|
30
|
+
...props,
|
|
31
|
+
children: /* @__PURE__ */ jsx("path", { d: "M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20Zm0 2a8 8 0 0 1 5.34 2.05l-2.2 2.2A5 5 0 1 0 17 12.6h-5v-2.6h7.9A8 8 0 0 1 12 20 8 8 0 0 1 12 4Z" })
|
|
32
|
+
});
|
|
33
|
+
const MetaLogo = (props) => /* @__PURE__ */ jsx(Svg, {
|
|
34
|
+
...props,
|
|
35
|
+
children: /* @__PURE__ */ jsx("path", { d: "M2 12.5c0-3.5 1.8-6.5 4.4-6.5 1.8 0 3.2 1.3 4.9 3.8 2.2 3.2 3.3 5 4.6 5 1 0 1.5-.8 1.5-2.3 0-2.1-1-4.3-2.7-4.3-1 0-2 .6-3.2 2l-1.3-1.7C11.5 6.8 12.9 6 14.5 6c3 0 5.5 3.3 5.5 7 0 3.3-1.6 5-3.8 5-2.3 0-3.6-1.6-6-5.3C8.9 10.4 8 9.2 6.8 9.2 5.4 9.2 4.3 10.6 4.3 13c0 1.8.5 3 1.3 3 .6 0 1.1-.3 1.8-1.1l1.3 1.7C7.6 17.6 6.3 18 5.3 18 3.3 18 2 16 2 12.5Z" })
|
|
36
|
+
});
|
|
37
|
+
const KimiLogo = (props) => /* @__PURE__ */ jsxs(Svg, {
|
|
38
|
+
...props,
|
|
39
|
+
children: [/* @__PURE__ */ jsx("circle", {
|
|
40
|
+
cx: "12",
|
|
41
|
+
cy: "12",
|
|
42
|
+
r: "9.5",
|
|
43
|
+
fill: "none",
|
|
44
|
+
stroke: "currentColor",
|
|
45
|
+
strokeWidth: "1.5"
|
|
46
|
+
}), /* @__PURE__ */ jsx("path", {
|
|
47
|
+
d: "M8 7.5v9M8 12l4.5-4.5M8 12l5 4.5M14 7.5h2.5v9H14z",
|
|
48
|
+
fill: "none",
|
|
49
|
+
stroke: "currentColor",
|
|
50
|
+
strokeWidth: "1.5",
|
|
51
|
+
strokeLinecap: "round",
|
|
52
|
+
strokeLinejoin: "round"
|
|
53
|
+
})]
|
|
54
|
+
});
|
|
55
|
+
const FallbackLogo = (props) => /* @__PURE__ */ jsx(Svg, {
|
|
56
|
+
...props,
|
|
57
|
+
children: /* @__PURE__ */ jsx("circle", {
|
|
58
|
+
cx: "12",
|
|
59
|
+
cy: "12",
|
|
60
|
+
r: "3"
|
|
61
|
+
})
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Resolves a provider string to its logo component.
|
|
65
|
+
* Unknown providers get a neutral dot fallback.
|
|
66
|
+
*/
|
|
67
|
+
function ProviderLogo({ provider, ...props }) {
|
|
68
|
+
switch (provider.toLowerCase()) {
|
|
69
|
+
case "openai": return /* @__PURE__ */ jsx(OpenAILogo, { ...props });
|
|
70
|
+
case "anthropic": return /* @__PURE__ */ jsx(AnthropicLogo, { ...props });
|
|
71
|
+
case "google": return /* @__PURE__ */ jsx(GoogleLogo, { ...props });
|
|
72
|
+
case "meta": return /* @__PURE__ */ jsx(MetaLogo, { ...props });
|
|
73
|
+
case "kimi": return /* @__PURE__ */ jsx(KimiLogo, { ...props });
|
|
74
|
+
default: return /* @__PURE__ */ jsx(FallbackLogo, { ...props });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
//#region src/components/ModelSelector.tsx
|
|
79
|
+
const ModelSelectorContext = React.createContext(null);
|
|
80
|
+
function useModelSelectorContext() {
|
|
81
|
+
const ctx = React.useContext(ModelSelectorContext);
|
|
82
|
+
if (!ctx) throw new Error("ModelSelector subcomponents must be used inside <ModelSelector>.");
|
|
83
|
+
return ctx;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A searchable model picker. Click the trigger to open a dialog containing a
|
|
87
|
+
* search input and a grouped list of available models.
|
|
88
|
+
*
|
|
89
|
+
* Built internally for AI model selection. Use it when users choose one model
|
|
90
|
+
* from a grouped provider list. Do not use it as a general command palette or
|
|
91
|
+
* multiselect; use Combobox or a dedicated component for that.
|
|
92
|
+
*
|
|
93
|
+
* Sigvelo changes: composes the design-system Dialog and Button, filters item
|
|
94
|
+
* children locally, and maps provider logos plus listbox styling to Sigvelo
|
|
95
|
+
* CSS tokens.
|
|
96
|
+
*
|
|
97
|
+
* The dialog owns focus while open, the list uses `role="listbox"`, and items
|
|
98
|
+
* use `role="option"` with `aria-selected`. Styling consumes surface, border,
|
|
99
|
+
* spacing, radius, focus, and typography tokens. Add provider/item affordances
|
|
100
|
+
* here when they need to be shared.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```tsx
|
|
104
|
+
* <ModelSelector>
|
|
105
|
+
* <ModelSelectorTrigger>
|
|
106
|
+
* <ModelSelectorLogo provider="anthropic" />
|
|
107
|
+
* <ModelSelectorName>Claude Opus 4.6</ModelSelectorName>
|
|
108
|
+
* </ModelSelectorTrigger>
|
|
109
|
+
* <ModelSelectorContent>
|
|
110
|
+
* <ModelSelectorDialog>
|
|
111
|
+
* <ModelSelectorInput placeholder="Search models…" />
|
|
112
|
+
* <ModelSelectorList>
|
|
113
|
+
* <ModelSelectorGroup label="Anthropic">
|
|
114
|
+
* <ModelSelectorItem value="claude-opus-4-6" onSelect={…}>
|
|
115
|
+
* <ModelSelectorLogo provider="anthropic" />
|
|
116
|
+
* <ModelSelectorName>Claude Opus 4.6</ModelSelectorName>
|
|
117
|
+
* </ModelSelectorItem>
|
|
118
|
+
* </ModelSelectorGroup>
|
|
119
|
+
* </ModelSelectorList>
|
|
120
|
+
* </ModelSelectorDialog>
|
|
121
|
+
* </ModelSelectorContent>
|
|
122
|
+
* </ModelSelector>
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
function ModelSelector({ open, defaultOpen = false, onOpenChange, children, className, ref, ...props }) {
|
|
126
|
+
const [internalOpen, setInternalOpen] = React.useState(defaultOpen);
|
|
127
|
+
const [query, setQuery] = React.useState("");
|
|
128
|
+
const isControlled = open !== void 0;
|
|
129
|
+
const currentOpen = isControlled ? open : internalOpen;
|
|
130
|
+
const handleOpenChange = React.useCallback((next) => {
|
|
131
|
+
if (!isControlled) setInternalOpen(next);
|
|
132
|
+
onOpenChange?.(next);
|
|
133
|
+
if (!next) setQuery("");
|
|
134
|
+
}, [isControlled, onOpenChange]);
|
|
135
|
+
const onSelectItem = React.useCallback(() => {
|
|
136
|
+
handleOpenChange(false);
|
|
137
|
+
}, [handleOpenChange]);
|
|
138
|
+
const ctxValue = React.useMemo(() => ({
|
|
139
|
+
query,
|
|
140
|
+
setQuery,
|
|
141
|
+
onSelectItem
|
|
142
|
+
}), [query, onSelectItem]);
|
|
143
|
+
return /* @__PURE__ */ jsx(ModelSelectorContext.Provider, {
|
|
144
|
+
value: ctxValue,
|
|
145
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
146
|
+
ref,
|
|
147
|
+
className: cx("model-selector", className),
|
|
148
|
+
...props,
|
|
149
|
+
children: /* @__PURE__ */ jsx(Dialog, {
|
|
150
|
+
open: currentOpen,
|
|
151
|
+
onOpenChange: handleOpenChange,
|
|
152
|
+
children
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function ModelSelectorTrigger({ className, children, ...props }) {
|
|
158
|
+
return /* @__PURE__ */ jsx(DialogTrigger, { render: /* @__PURE__ */ jsxs(Button, {
|
|
159
|
+
variant: "outline",
|
|
160
|
+
color: "neutral",
|
|
161
|
+
className: cx("model-selector__trigger", className),
|
|
162
|
+
...props,
|
|
163
|
+
children: [children, /* @__PURE__ */ jsx("span", {
|
|
164
|
+
className: "model-selector__trigger-chevron",
|
|
165
|
+
"aria-hidden": "true",
|
|
166
|
+
children: /* @__PURE__ */ jsx(ChevronDownIcon, {})
|
|
167
|
+
})]
|
|
168
|
+
}) });
|
|
169
|
+
}
|
|
170
|
+
function ModelSelectorContent({ children, title = "Model Selector", ...props }) {
|
|
171
|
+
return /* @__PURE__ */ jsxs(DialogPortal, { children: [/* @__PURE__ */ jsx(DialogBackdrop, {}), /* @__PURE__ */ jsxs(DialogPopup, {
|
|
172
|
+
...props,
|
|
173
|
+
children: [/* @__PURE__ */ jsx(DialogTitle, {
|
|
174
|
+
className: "model-selector__title",
|
|
175
|
+
children: title
|
|
176
|
+
}), children]
|
|
177
|
+
})] });
|
|
178
|
+
}
|
|
179
|
+
function ModelSelectorDialog({ className, children, ref, ...props }) {
|
|
180
|
+
return /* @__PURE__ */ jsx("div", {
|
|
181
|
+
ref,
|
|
182
|
+
className: cx("model-selector__dialog", className),
|
|
183
|
+
...props,
|
|
184
|
+
children
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function ModelSelectorInput({ className, placeholder = "Search models…", ref, ...props }) {
|
|
188
|
+
const { query, setQuery } = useModelSelectorContext();
|
|
189
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
190
|
+
className: "model-selector__search",
|
|
191
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
192
|
+
className: "model-selector__search-icon",
|
|
193
|
+
"aria-hidden": "true",
|
|
194
|
+
children: /* @__PURE__ */ jsx(SearchIcon, {})
|
|
195
|
+
}), /* @__PURE__ */ jsx("input", {
|
|
196
|
+
ref,
|
|
197
|
+
type: "search",
|
|
198
|
+
value: query,
|
|
199
|
+
onChange: (e) => setQuery(e.target.value),
|
|
200
|
+
placeholder,
|
|
201
|
+
className: cx("model-selector__input", className),
|
|
202
|
+
autoFocus: true,
|
|
203
|
+
...props
|
|
204
|
+
})]
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
function ModelSelectorList({ className, children, ref, ...props }) {
|
|
208
|
+
return /* @__PURE__ */ jsx("div", {
|
|
209
|
+
ref,
|
|
210
|
+
role: "listbox",
|
|
211
|
+
className: cx("model-selector__list", className),
|
|
212
|
+
...props,
|
|
213
|
+
children
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function ModelSelectorGroup({ className, label, children, ref, ...props }) {
|
|
217
|
+
const { query } = useModelSelectorContext();
|
|
218
|
+
const childArray = React.Children.toArray(children).filter((child) => React.isValidElement(child));
|
|
219
|
+
const q = query.trim().toLowerCase();
|
|
220
|
+
const filtered = q ? childArray.filter((child) => {
|
|
221
|
+
const value = String(child.props.value ?? "").toLowerCase();
|
|
222
|
+
const keywords = String(child.props.keywords ?? "").toLowerCase();
|
|
223
|
+
return value.includes(q) || keywords.includes(q);
|
|
224
|
+
}) : childArray;
|
|
225
|
+
if (filtered.length === 0) return null;
|
|
226
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
227
|
+
ref,
|
|
228
|
+
role: "group",
|
|
229
|
+
"aria-label": label,
|
|
230
|
+
className: cx("model-selector__group", className),
|
|
231
|
+
...props,
|
|
232
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
233
|
+
className: "model-selector__group-label",
|
|
234
|
+
children: label
|
|
235
|
+
}), filtered]
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
function ModelSelectorItem({ className, value, keywords, selected, onSelect, children, onClick, ref, ...props }) {
|
|
239
|
+
const { onSelectItem } = useModelSelectorContext();
|
|
240
|
+
const handleClick = (e) => {
|
|
241
|
+
onSelect?.(value);
|
|
242
|
+
onSelectItem();
|
|
243
|
+
onClick?.(e);
|
|
244
|
+
};
|
|
245
|
+
return /* @__PURE__ */ jsx("button", {
|
|
246
|
+
ref,
|
|
247
|
+
type: "button",
|
|
248
|
+
role: "option",
|
|
249
|
+
"aria-selected": selected,
|
|
250
|
+
"data-selected": selected ? "" : void 0,
|
|
251
|
+
className: cx("model-selector__item", className),
|
|
252
|
+
onClick: handleClick,
|
|
253
|
+
...props,
|
|
254
|
+
children
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
function ModelSelectorEmpty({ className, children = "No models found", ref, ...props }) {
|
|
258
|
+
return /* @__PURE__ */ jsx("div", {
|
|
259
|
+
ref,
|
|
260
|
+
className: cx("model-selector__empty", className),
|
|
261
|
+
...props,
|
|
262
|
+
children
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
function ModelSelectorSeparator({ className, ref, ...props }) {
|
|
266
|
+
return /* @__PURE__ */ jsx("hr", {
|
|
267
|
+
ref,
|
|
268
|
+
className: cx("model-selector__separator", className),
|
|
269
|
+
...props
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
function ModelSelectorLogo({ className, provider, ...props }) {
|
|
273
|
+
return /* @__PURE__ */ jsx("span", {
|
|
274
|
+
className: cx("model-selector__logo", className),
|
|
275
|
+
children: /* @__PURE__ */ jsx(ProviderLogo, {
|
|
276
|
+
provider,
|
|
277
|
+
...props
|
|
278
|
+
})
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
function ModelSelectorLogoGroup({ className, children, ref, ...props }) {
|
|
282
|
+
return /* @__PURE__ */ jsx("div", {
|
|
283
|
+
ref,
|
|
284
|
+
className: cx("model-selector__logo-group", className),
|
|
285
|
+
...props,
|
|
286
|
+
children
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
function ModelSelectorName({ className, children, ref, ...props }) {
|
|
290
|
+
return /* @__PURE__ */ jsx("span", {
|
|
291
|
+
ref,
|
|
292
|
+
className: cx("model-selector__name", className),
|
|
293
|
+
...props,
|
|
294
|
+
children
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
function ModelSelectorShortcut({ className, children, ref, ...props }) {
|
|
298
|
+
return /* @__PURE__ */ jsx("kbd", {
|
|
299
|
+
ref,
|
|
300
|
+
className: cx("model-selector__shortcut", className),
|
|
301
|
+
...props,
|
|
302
|
+
children
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
//#endregion
|
|
306
|
+
export { ModelSelector, ModelSelectorContent, ModelSelectorDialog, ModelSelectorEmpty, ModelSelectorGroup, ModelSelectorInput, ModelSelectorItem, ModelSelectorList, ModelSelectorLogo, ModelSelectorLogoGroup, ModelSelectorName, ModelSelectorSeparator, ModelSelectorShortcut, ModelSelectorTrigger };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region src/components/NaniteScene.d.ts
|
|
2
|
+
type NaniteSceneVariant = "idle" | "helmet" | "working" | "celebrating" | "concerned";
|
|
3
|
+
type NaniteSceneProps = {
|
|
4
|
+
/** Visual state to render. */readonly variant: NaniteSceneVariant; /** Render three compact Nanites or one status Nanite with optional screen art. */
|
|
5
|
+
readonly mode?: "trio" | "solo"; /** Additional class names for layout only. */
|
|
6
|
+
readonly className?: string; /** Accessible title when the illustration communicates state. */
|
|
7
|
+
readonly title?: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Decorative Nanites illustration used in setup, status, and empty states.
|
|
11
|
+
* Pass a title when the illustration communicates state; otherwise it remains
|
|
12
|
+
* hidden from assistive technology.
|
|
13
|
+
*
|
|
14
|
+
* Built internally for Sigvelo onboarding and agent-connection surfaces. Use
|
|
15
|
+
* it as supporting status art, not as a control or primary content.
|
|
16
|
+
*
|
|
17
|
+
* Styling consumes Nanite scene CSS animation hooks plus Sigvelo layout context.
|
|
18
|
+
* Respect reduced-motion CSS when adding animation. Add variants here when a
|
|
19
|
+
* state is reused across apps; keep one-off art local to the app.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <NaniteScene variant="working" mode="solo" title="Agent is checking GitHub" />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
declare function NaniteScene({
|
|
27
|
+
variant,
|
|
28
|
+
mode,
|
|
29
|
+
className,
|
|
30
|
+
title
|
|
31
|
+
}: NaniteSceneProps): import("react").JSX.Element;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { NaniteScene, NaniteSceneProps, NaniteSceneVariant };
|