@agentaily/design-system 0.1.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.
- package/DESIGN.md +112 -0
- package/README.md +81 -0
- package/dist/assets/logo/agentaily-mark-black.svg +5 -0
- package/dist/assets/logo/agentaily-mark-white.svg +5 -0
- package/dist/components/ai/Attachments.d.ts +23 -0
- package/dist/components/ai/Attachments.js +96 -0
- package/dist/components/ai/Attachments.js.map +1 -0
- package/dist/components/ai/Checkpoint.d.ts +3 -0
- package/dist/components/ai/Checkpoint.js +38 -0
- package/dist/components/ai/Checkpoint.js.map +1 -0
- package/dist/components/ai/Confirmation.d.ts +3 -0
- package/dist/components/ai/Confirmation.js +54 -0
- package/dist/components/ai/Confirmation.js.map +1 -0
- package/dist/components/ai/Context.d.ts +3 -0
- package/dist/components/ai/Context.js +63 -0
- package/dist/components/ai/Context.js.map +1 -0
- package/dist/components/ai/Conversation.d.ts +3 -0
- package/dist/components/ai/Conversation.js +53 -0
- package/dist/components/ai/Conversation.js.map +1 -0
- package/dist/components/ai/ModelSelector.d.ts +19 -0
- package/dist/components/ai/ModelSelector.js +92 -0
- package/dist/components/ai/ModelSelector.js.map +1 -0
- package/dist/components/ai/Plan.d.ts +4 -0
- package/dist/components/ai/Plan.js +49 -0
- package/dist/components/ai/Plan.js.map +1 -0
- package/dist/components/ai/Queue.d.ts +4 -0
- package/dist/components/ai/Queue.js +45 -0
- package/dist/components/ai/Queue.js.map +1 -0
- package/dist/components/ai/Reasoning.d.ts +17 -0
- package/dist/components/ai/Reasoning.js +60 -0
- package/dist/components/ai/Reasoning.js.map +1 -0
- package/dist/components/ai/Shimmer.d.ts +10 -0
- package/dist/components/ai/Shimmer.js +28 -0
- package/dist/components/ai/Shimmer.js.map +1 -0
- package/dist/components/ai/Sources.d.ts +23 -0
- package/dist/components/ai/Sources.js +65 -0
- package/dist/components/ai/Sources.js.map +1 -0
- package/dist/components/ai/Suggestion.d.ts +19 -0
- package/dist/components/ai/Suggestion.js +40 -0
- package/dist/components/ai/Suggestion.js.map +1 -0
- package/dist/components/ai/Task.d.ts +4 -0
- package/dist/components/ai/Task.js +48 -0
- package/dist/components/ai/Task.js.map +1 -0
- package/dist/components/ai/ToolCall.d.ts +16 -0
- package/dist/components/ai/ToolCall.js +70 -0
- package/dist/components/ai/ToolCall.js.map +1 -0
- package/dist/components/buttons/Button.d.ts +17 -0
- package/dist/components/buttons/Button.js +60 -0
- package/dist/components/buttons/Button.js.map +1 -0
- package/dist/components/buttons/ButtonGroup.d.ts +3 -0
- package/dist/components/buttons/ButtonGroup.js +27 -0
- package/dist/components/buttons/ButtonGroup.js.map +1 -0
- package/dist/components/buttons/IconButton.d.ts +16 -0
- package/dist/components/buttons/IconButton.js +49 -0
- package/dist/components/buttons/IconButton.js.map +1 -0
- package/dist/components/chat/CodeBlock.d.ts +9 -0
- package/dist/components/chat/CodeBlock.js +62 -0
- package/dist/components/chat/CodeBlock.js.map +1 -0
- package/dist/components/chat/Composer.d.ts +17 -0
- package/dist/components/chat/Composer.js +123 -0
- package/dist/components/chat/Composer.js.map +1 -0
- package/dist/components/chat/Message.d.ts +16 -0
- package/dist/components/chat/Message.js +63 -0
- package/dist/components/chat/Message.js.map +1 -0
- package/dist/components/code/Agent.d.ts +3 -0
- package/dist/components/code/Agent.js +44 -0
- package/dist/components/code/Agent.js.map +1 -0
- package/dist/components/code/Artifact.d.ts +3 -0
- package/dist/components/code/Artifact.js +50 -0
- package/dist/components/code/Artifact.js.map +1 -0
- package/dist/components/code/Commit.d.ts +3 -0
- package/dist/components/code/Commit.js +55 -0
- package/dist/components/code/Commit.js.map +1 -0
- package/dist/components/code/EnvironmentVariables.d.ts +4 -0
- package/dist/components/code/EnvironmentVariables.js +49 -0
- package/dist/components/code/EnvironmentVariables.js.map +1 -0
- package/dist/components/code/FileTree.d.ts +4 -0
- package/dist/components/code/FileTree.js +59 -0
- package/dist/components/code/FileTree.js.map +1 -0
- package/dist/components/code/JSXPreview.d.ts +3 -0
- package/dist/components/code/JSXPreview.js +35 -0
- package/dist/components/code/JSXPreview.js.map +1 -0
- package/dist/components/code/PackageInfo.d.ts +3 -0
- package/dist/components/code/PackageInfo.js +47 -0
- package/dist/components/code/PackageInfo.js.map +1 -0
- package/dist/components/code/Sandbox.d.ts +3 -0
- package/dist/components/code/Sandbox.js +43 -0
- package/dist/components/code/Sandbox.js.map +1 -0
- package/dist/components/code/SchemaDisplay.d.ts +4 -0
- package/dist/components/code/SchemaDisplay.js +43 -0
- package/dist/components/code/SchemaDisplay.js.map +1 -0
- package/dist/components/code/Snippet.d.ts +3 -0
- package/dist/components/code/Snippet.js +36 -0
- package/dist/components/code/Snippet.js.map +1 -0
- package/dist/components/code/StackTrace.d.ts +4 -0
- package/dist/components/code/StackTrace.js +46 -0
- package/dist/components/code/StackTrace.js.map +1 -0
- package/dist/components/code/Terminal.d.ts +4 -0
- package/dist/components/code/Terminal.js +73 -0
- package/dist/components/code/Terminal.js.map +1 -0
- package/dist/components/code/TestResults.d.ts +4 -0
- package/dist/components/code/TestResults.js +61 -0
- package/dist/components/code/TestResults.js.map +1 -0
- package/dist/components/code/WebPreview.d.ts +3 -0
- package/dist/components/code/WebPreview.js +48 -0
- package/dist/components/code/WebPreview.js.map +1 -0
- package/dist/components/display/Accordion.d.ts +12 -0
- package/dist/components/display/Accordion.js +60 -0
- package/dist/components/display/Accordion.js.map +1 -0
- package/dist/components/display/Avatar.d.ts +14 -0
- package/dist/components/display/Avatar.js +41 -0
- package/dist/components/display/Avatar.js.map +1 -0
- package/dist/components/display/Badge.d.ts +11 -0
- package/dist/components/display/Badge.js +40 -0
- package/dist/components/display/Badge.js.map +1 -0
- package/dist/components/display/Breadcrumb.d.ts +11 -0
- package/dist/components/display/Breadcrumb.js +32 -0
- package/dist/components/display/Breadcrumb.js.map +1 -0
- package/dist/components/display/Card.d.ts +14 -0
- package/dist/components/display/Card.js +61 -0
- package/dist/components/display/Card.js.map +1 -0
- package/dist/components/display/Carousel.d.ts +3 -0
- package/dist/components/display/Carousel.js +40 -0
- package/dist/components/display/Carousel.js.map +1 -0
- package/dist/components/display/Chart.d.ts +7 -0
- package/dist/components/display/Chart.js +68 -0
- package/dist/components/display/Chart.js.map +1 -0
- package/dist/components/display/Collapsible.d.ts +3 -0
- package/dist/components/display/Collapsible.js +36 -0
- package/dist/components/display/Collapsible.js.map +1 -0
- package/dist/components/display/DataTable.d.ts +4 -0
- package/dist/components/display/DataTable.js +72 -0
- package/dist/components/display/DataTable.js.map +1 -0
- package/dist/components/display/Empty.d.ts +14 -0
- package/dist/components/display/Empty.js +36 -0
- package/dist/components/display/Empty.js.map +1 -0
- package/dist/components/display/Item.d.ts +3 -0
- package/dist/components/display/Item.js +36 -0
- package/dist/components/display/Item.js.map +1 -0
- package/dist/components/display/Kbd.d.ts +7 -0
- package/dist/components/display/Kbd.js +27 -0
- package/dist/components/display/Kbd.js.map +1 -0
- package/dist/components/display/Pagination.d.ts +11 -0
- package/dist/components/display/Pagination.js +55 -0
- package/dist/components/display/Pagination.js.map +1 -0
- package/dist/components/display/Progress.d.ts +14 -0
- package/dist/components/display/Progress.js +43 -0
- package/dist/components/display/Progress.js.map +1 -0
- package/dist/components/display/Separator.d.ts +10 -0
- package/dist/components/display/Separator.js +33 -0
- package/dist/components/display/Separator.js.map +1 -0
- package/dist/components/display/Skeleton.d.ts +12 -0
- package/dist/components/display/Skeleton.js +43 -0
- package/dist/components/display/Skeleton.js.map +1 -0
- package/dist/components/display/Table.d.ts +20 -0
- package/dist/components/display/Table.js +42 -0
- package/dist/components/display/Table.js.map +1 -0
- package/dist/components/display/Tabs.d.ts +11 -0
- package/dist/components/display/Tabs.js +47 -0
- package/dist/components/display/Tabs.js.map +1 -0
- package/dist/components/display/Typography.d.ts +5 -0
- package/dist/components/display/Typography.js +45 -0
- package/dist/components/display/Typography.js.map +1 -0
- package/dist/components/feedback/Alert.d.ts +12 -0
- package/dist/components/feedback/Alert.js +41 -0
- package/dist/components/feedback/Alert.js.map +1 -0
- package/dist/components/feedback/Dialog.d.ts +17 -0
- package/dist/components/feedback/Dialog.js +90 -0
- package/dist/components/feedback/Dialog.js.map +1 -0
- package/dist/components/feedback/Spinner.d.ts +8 -0
- package/dist/components/feedback/Spinner.js +39 -0
- package/dist/components/feedback/Spinner.js.map +1 -0
- package/dist/components/feedback/Toast.d.ts +12 -0
- package/dist/components/feedback/Toast.js +50 -0
- package/dist/components/feedback/Toast.js.map +1 -0
- package/dist/components/feedback/Tooltip.d.ts +11 -0
- package/dist/components/feedback/Tooltip.js +34 -0
- package/dist/components/feedback/Tooltip.js.map +1 -0
- package/dist/components/inputs/Calendar.d.ts +3 -0
- package/dist/components/inputs/Calendar.js +81 -0
- package/dist/components/inputs/Calendar.js.map +1 -0
- package/dist/components/inputs/Checkbox.d.ts +10 -0
- package/dist/components/inputs/Checkbox.js +42 -0
- package/dist/components/inputs/Checkbox.js.map +1 -0
- package/dist/components/inputs/Combobox.d.ts +3 -0
- package/dist/components/inputs/Combobox.js +94 -0
- package/dist/components/inputs/Combobox.js.map +1 -0
- package/dist/components/inputs/DatePicker.d.ts +3 -0
- package/dist/components/inputs/DatePicker.js +56 -0
- package/dist/components/inputs/DatePicker.js.map +1 -0
- package/dist/components/inputs/Field.d.ts +5 -0
- package/dist/components/inputs/Field.js +44 -0
- package/dist/components/inputs/Field.js.map +1 -0
- package/dist/components/inputs/Input.d.ts +19 -0
- package/dist/components/inputs/Input.js +72 -0
- package/dist/components/inputs/Input.js.map +1 -0
- package/dist/components/inputs/InputGroup.d.ts +3 -0
- package/dist/components/inputs/InputGroup.js +32 -0
- package/dist/components/inputs/InputGroup.js.map +1 -0
- package/dist/components/inputs/InputOTP.d.ts +3 -0
- package/dist/components/inputs/InputOTP.js +49 -0
- package/dist/components/inputs/InputOTP.js.map +1 -0
- package/dist/components/inputs/Label.d.ts +13 -0
- package/dist/components/inputs/Label.js +33 -0
- package/dist/components/inputs/Label.js.map +1 -0
- package/dist/components/inputs/RadioGroup.d.ts +15 -0
- package/dist/components/inputs/RadioGroup.js +58 -0
- package/dist/components/inputs/RadioGroup.js.map +1 -0
- package/dist/components/inputs/Select.d.ts +12 -0
- package/dist/components/inputs/Select.js +49 -0
- package/dist/components/inputs/Select.js.map +1 -0
- package/dist/components/inputs/Slider.d.ts +16 -0
- package/dist/components/inputs/Slider.js +62 -0
- package/dist/components/inputs/Slider.js.map +1 -0
- package/dist/components/inputs/Switch.d.ts +11 -0
- package/dist/components/inputs/Switch.js +39 -0
- package/dist/components/inputs/Switch.js.map +1 -0
- package/dist/components/inputs/Textarea.d.ts +13 -0
- package/dist/components/inputs/Textarea.js +41 -0
- package/dist/components/inputs/Textarea.js.map +1 -0
- package/dist/components/inputs/Toggle.d.ts +19 -0
- package/dist/components/inputs/Toggle.js +57 -0
- package/dist/components/inputs/Toggle.js.map +1 -0
- package/dist/components/layout/AspectRatio.d.ts +3 -0
- package/dist/components/layout/AspectRatio.js +20 -0
- package/dist/components/layout/AspectRatio.js.map +1 -0
- package/dist/components/layout/Resizable.d.ts +3 -0
- package/dist/components/layout/Resizable.js +58 -0
- package/dist/components/layout/Resizable.js.map +1 -0
- package/dist/components/layout/ScrollArea.d.ts +3 -0
- package/dist/components/layout/ScrollArea.js +24 -0
- package/dist/components/layout/ScrollArea.js.map +1 -0
- package/dist/components/layout/Sidebar.d.ts +5 -0
- package/dist/components/layout/Sidebar.js +55 -0
- package/dist/components/layout/Sidebar.js.map +1 -0
- package/dist/components/overlay/AlertDialog.d.ts +3 -0
- package/dist/components/overlay/AlertDialog.js +51 -0
- package/dist/components/overlay/AlertDialog.js.map +1 -0
- package/dist/components/overlay/Command.d.ts +22 -0
- package/dist/components/overlay/Command.js +123 -0
- package/dist/components/overlay/Command.js.map +1 -0
- package/dist/components/overlay/ContextMenu.d.ts +4 -0
- package/dist/components/overlay/ContextMenu.js +66 -0
- package/dist/components/overlay/ContextMenu.js.map +1 -0
- package/dist/components/overlay/DropdownMenu.d.ts +20 -0
- package/dist/components/overlay/DropdownMenu.js +86 -0
- package/dist/components/overlay/DropdownMenu.js.map +1 -0
- package/dist/components/overlay/HoverCard.d.ts +3 -0
- package/dist/components/overlay/HoverCard.js +53 -0
- package/dist/components/overlay/HoverCard.js.map +1 -0
- package/dist/components/overlay/Menubar.d.ts +4 -0
- package/dist/components/overlay/Menubar.js +55 -0
- package/dist/components/overlay/Menubar.js.map +1 -0
- package/dist/components/overlay/NavigationMenu.d.ts +5 -0
- package/dist/components/overlay/NavigationMenu.js +42 -0
- package/dist/components/overlay/NavigationMenu.js.map +1 -0
- package/dist/components/overlay/Popover.d.ts +16 -0
- package/dist/components/overlay/Popover.js +53 -0
- package/dist/components/overlay/Popover.js.map +1 -0
- package/dist/components/overlay/Sheet.d.ts +13 -0
- package/dist/components/overlay/Sheet.js +49 -0
- package/dist/components/overlay/Sheet.js.map +1 -0
- package/dist/components/utilities/Image.d.ts +3 -0
- package/dist/components/utilities/Image.js +32 -0
- package/dist/components/utilities/Image.js.map +1 -0
- package/dist/components/utilities/OpenInChat.d.ts +3 -0
- package/dist/components/utilities/OpenInChat.js +26 -0
- package/dist/components/utilities/OpenInChat.js.map +1 -0
- package/dist/components/voice/AudioPlayer.d.ts +3 -0
- package/dist/components/voice/AudioPlayer.js +42 -0
- package/dist/components/voice/AudioPlayer.js.map +1 -0
- package/dist/components/voice/MicSelector.d.ts +3 -0
- package/dist/components/voice/MicSelector.js +36 -0
- package/dist/components/voice/MicSelector.js.map +1 -0
- package/dist/components/voice/Persona.d.ts +3 -0
- package/dist/components/voice/Persona.js +41 -0
- package/dist/components/voice/Persona.js.map +1 -0
- package/dist/components/voice/SpeechInput.d.ts +3 -0
- package/dist/components/voice/SpeechInput.js +42 -0
- package/dist/components/voice/SpeechInput.js.map +1 -0
- package/dist/components/voice/Transcription.d.ts +4 -0
- package/dist/components/voice/Transcription.js +48 -0
- package/dist/components/voice/Transcription.js.map +1 -0
- package/dist/components/voice/VoiceSelector.d.ts +3 -0
- package/dist/components/voice/VoiceSelector.js +58 -0
- package/dist/components/voice/VoiceSelector.js.map +1 -0
- package/dist/components/workflow/Flow.d.ts +20 -0
- package/dist/components/workflow/Flow.js +96 -0
- package/dist/components/workflow/Flow.js.map +1 -0
- package/dist/index.d.ts +120 -0
- package/dist/index.js +208 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +217 -0
- package/package.json +77 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useRef, useEffect } from "react";
|
|
3
|
+
const AX_CONVO_CSS = `
|
|
4
|
+
.ax-convo { position: relative; overflow-y: auto; display: flex; flex-direction: column; }
|
|
5
|
+
.ax-convo__inner { max-width: var(--thread-max); width: 100%; margin: 0 auto; padding: 24px; display: flex; flex-direction: column; gap: 24px; }
|
|
6
|
+
.ax-convo__stick {
|
|
7
|
+
position: sticky; bottom: 12px; align-self: center; margin-top: -36px;
|
|
8
|
+
display: inline-flex; align-items: center; gap: 6px; cursor: pointer;
|
|
9
|
+
background: var(--surface-panel); border: 1px solid var(--border-strong);
|
|
10
|
+
border-radius: var(--radius-full); padding: 6px 12px; box-shadow: var(--shadow-2);
|
|
11
|
+
font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-muted);
|
|
12
|
+
transition: opacity var(--dur-2) var(--ease-out);
|
|
13
|
+
}
|
|
14
|
+
.ax-convo__stick:hover { color: var(--text-body); }
|
|
15
|
+
`;
|
|
16
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-convo-css")) {
|
|
17
|
+
const s = document.createElement("style");
|
|
18
|
+
s.id = "ax-convo-css";
|
|
19
|
+
s.textContent = AX_CONVO_CSS;
|
|
20
|
+
document.head.appendChild(s);
|
|
21
|
+
}
|
|
22
|
+
function Conversation({ children, autoStick = true, className = "", style = {}, ...rest }) {
|
|
23
|
+
const ref = useRef(null);
|
|
24
|
+
const stickRef = useRef(true);
|
|
25
|
+
const [showJump, setShowJump] = React.useState(false);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
const el = ref.current;
|
|
28
|
+
if (!el) return;
|
|
29
|
+
const onScroll = () => {
|
|
30
|
+
const dist = el.scrollHeight - el.scrollTop - el.clientHeight;
|
|
31
|
+
stickRef.current = dist < 80;
|
|
32
|
+
setShowJump(dist >= 80);
|
|
33
|
+
};
|
|
34
|
+
el.addEventListener("scroll", onScroll, { passive: true });
|
|
35
|
+
return () => el.removeEventListener("scroll", onScroll);
|
|
36
|
+
}, []);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const el = ref.current;
|
|
39
|
+
if (el && autoStick && stickRef.current) el.scrollTop = el.scrollHeight;
|
|
40
|
+
});
|
|
41
|
+
const jump = () => {
|
|
42
|
+
const el = ref.current;
|
|
43
|
+
if (el) el.scrollTo({ top: el.scrollHeight, behavior: "smooth" });
|
|
44
|
+
};
|
|
45
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-convo", className].filter(Boolean).join(" "), ref, style, ...rest, children: [
|
|
46
|
+
/* @__PURE__ */ jsx("div", { className: "ax-convo__inner", children }),
|
|
47
|
+
showJump ? /* @__PURE__ */ jsx("button", { className: "ax-convo__stick", onClick: jump, children: "↓ Jump to latest" }) : null
|
|
48
|
+
] });
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
Conversation
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=Conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Conversation.js","sources":["../../../src/components/ai/Conversation.jsx"],"sourcesContent":["import React, { useRef, useEffect } from \"react\";\n\nconst AX_CONVO_CSS = `\n.ax-convo { position: relative; overflow-y: auto; display: flex; flex-direction: column; }\n.ax-convo__inner { max-width: var(--thread-max); width: 100%; margin: 0 auto; padding: 24px; display: flex; flex-direction: column; gap: 24px; }\n.ax-convo__stick {\n position: sticky; bottom: 12px; align-self: center; margin-top: -36px;\n display: inline-flex; align-items: center; gap: 6px; cursor: pointer;\n background: var(--surface-panel); border: 1px solid var(--border-strong);\n border-radius: var(--radius-full); padding: 6px 12px; box-shadow: var(--shadow-2);\n font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-muted);\n transition: opacity var(--dur-2) var(--ease-out);\n}\n.ax-convo__stick:hover { color: var(--text-body); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-convo-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-convo-css\";\n s.textContent = AX_CONVO_CSS;\n document.head.appendChild(s);\n}\n\nexport function Conversation({ children, autoStick = true, className = \"\", style = {}, ...rest }) {\n const ref = useRef(null);\n const stickRef = useRef(true);\n const [showJump, setShowJump] = React.useState(false);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const onScroll = () => {\n const dist = el.scrollHeight - el.scrollTop - el.clientHeight;\n stickRef.current = dist < 80;\n setShowJump(dist >= 80);\n };\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n useEffect(() => {\n const el = ref.current;\n if (el && autoStick && stickRef.current) el.scrollTop = el.scrollHeight;\n });\n\n const jump = () => {\n const el = ref.current;\n if (el) el.scrollTo({ top: el.scrollHeight, behavior: \"smooth\" });\n };\n\n return (\n <div className={[\"ax-convo\", className].filter(Boolean).join(\" \")} ref={ref} style={style} {...rest}>\n <div className=\"ax-convo__inner\">{children}</div>\n {showJump ? (\n <button className=\"ax-convo__stick\" onClick={jump}>↓ Jump to latest</button>\n ) : null}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcrB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,cAAc,GAAG;AAC/E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,aAAa,EAAE,UAAU,YAAY,MAAM,YAAY,IAAI,QAAQ,CAAA,GAAI,GAAG,QAAQ;AAChG,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,WAAW,OAAO,IAAI;AAC5B,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAAS,KAAK;AAEpD,YAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,UAAM,WAAW,MAAM;AACrB,YAAM,OAAO,GAAG,eAAe,GAAG,YAAY,GAAG;AACjD,eAAS,UAAU,OAAO;AAC1B,kBAAY,QAAQ,EAAE;AAAA,IACxB;AACA,OAAG,iBAAiB,UAAU,UAAU,EAAE,SAAS,MAAM;AACzD,WAAO,MAAM,GAAG,oBAAoB,UAAU,QAAQ;AAAA,EACxD,GAAG,CAAA,CAAE;AAEL,YAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,MAAM,aAAa,SAAS,QAAS,IAAG,YAAY,GAAG;AAAA,EAC7D,CAAC;AAED,QAAM,OAAO,MAAM;AACjB,UAAM,KAAK,IAAI;AACf,QAAI,OAAO,SAAS,EAAE,KAAK,GAAG,cAAc,UAAU,UAAU;AAAA,EAClE;AAEA,8BACG,OAAA,EAAI,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,KAAU,OAAe,GAAG,MAC7F,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAU,mBAAmB,SAAA,CAAS;AAAA,IAC1C,+BACE,UAAA,EAAO,WAAU,mBAAkB,SAAS,MAAM,8BAAgB,IACjE;AAAA,EAAA,GACN;AAEJ;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model picker dropdown with the ▣ glyph, descriptions, tags and a check on the active model.
|
|
3
|
+
*/
|
|
4
|
+
export interface ModelOption {
|
|
5
|
+
value: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
/** Small uppercase tag, e.g. "NEW" or "FAST". */
|
|
8
|
+
tag?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ModelSelectorProps {
|
|
11
|
+
/** Selected model id. */
|
|
12
|
+
value: string;
|
|
13
|
+
/** Strings or ModelOption objects. */
|
|
14
|
+
models: Array<string | ModelOption>;
|
|
15
|
+
onChange?: (value: string) => void;
|
|
16
|
+
/** Panel alignment. @default "start" */
|
|
17
|
+
align?: "start" | "end";
|
|
18
|
+
}
|
|
19
|
+
export declare function ModelSelector(props: ModelSelectorProps): JSX.Element;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useCallback, useEffect } from "react";
|
|
3
|
+
const AX_MODELSEL_CSS = `
|
|
4
|
+
.ax-modelsel { position: relative; display: inline-flex; }
|
|
5
|
+
.ax-modelsel__trigger {
|
|
6
|
+
display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
|
|
7
|
+
background: transparent; color: var(--text-body);
|
|
8
|
+
border: 1px solid var(--border-default); border-radius: var(--radius-2);
|
|
9
|
+
padding: 6px 10px; font-family: var(--font-mono); font-size: var(--text-sm);
|
|
10
|
+
transition: border-color var(--dur-1) var(--ease-out), background var(--dur-1) var(--ease-out);
|
|
11
|
+
}
|
|
12
|
+
.ax-modelsel__trigger:hover { border-color: var(--border-strong); background: var(--surface-raised); }
|
|
13
|
+
.ax-modelsel__trigger:focus-visible { outline: none; box-shadow: var(--ring); }
|
|
14
|
+
.ax-modelsel__glyph { color: var(--text-faint); }
|
|
15
|
+
.ax-modelsel__chev { width: 12px; height: 12px; color: var(--text-faint); transition: transform var(--dur-2) var(--ease-out); }
|
|
16
|
+
.ax-modelsel--open .ax-modelsel__chev { transform: rotate(180deg); }
|
|
17
|
+
.ax-modelsel__panel {
|
|
18
|
+
position: absolute; z-index: 60; top: calc(100% + 6px); left: 0; min-width: 280px;
|
|
19
|
+
background: var(--surface-panel); border: 1px solid var(--border-strong);
|
|
20
|
+
border-radius: var(--radius-3); box-shadow: var(--shadow-2); padding: var(--space-1);
|
|
21
|
+
animation: ax-modelsel-in var(--dur-2) var(--ease-out);
|
|
22
|
+
}
|
|
23
|
+
.ax-modelsel__panel--end { left: auto; right: 0; }
|
|
24
|
+
.ax-modelsel__item { display: flex; align-items: flex-start; gap: 10px; width: 100%; appearance: none; background: none; border: none; text-align: left; cursor: pointer; padding: 9px 10px; border-radius: var(--radius-2); transition: background var(--dur-1) var(--ease-out); }
|
|
25
|
+
.ax-modelsel__item:hover { background: var(--surface-raised); }
|
|
26
|
+
.ax-modelsel__check { width: 16px; flex: none; color: var(--accent); padding-top: 2px; }
|
|
27
|
+
.ax-modelsel__check svg { width: 14px; height: 14px; display: block; }
|
|
28
|
+
.ax-modelsel__body { flex: 1; min-width: 0; }
|
|
29
|
+
.ax-modelsel__name { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--text-body); display: flex; align-items: center; gap: 8px; }
|
|
30
|
+
.ax-modelsel__desc { font-size: var(--text-xs); color: var(--text-faint); margin-top: 2px; line-height: var(--leading-snug); }
|
|
31
|
+
.ax-modelsel__tag { font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-faint); border: 1px solid var(--border-default); border-radius: var(--radius-1); padding: 1px 4px; }
|
|
32
|
+
@keyframes ax-modelsel-in { from { opacity: 0; transform: translateY(-4px); } }
|
|
33
|
+
@media (prefers-reduced-motion: reduce) { .ax-modelsel__panel { animation: none; } }
|
|
34
|
+
`;
|
|
35
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-modelsel-css")) {
|
|
36
|
+
const s = document.createElement("style");
|
|
37
|
+
s.id = "ax-modelsel-css";
|
|
38
|
+
s.textContent = AX_MODELSEL_CSS;
|
|
39
|
+
document.head.appendChild(s);
|
|
40
|
+
}
|
|
41
|
+
const Check = /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) });
|
|
42
|
+
const Chev = /* @__PURE__ */ jsx("svg", { className: "ax-modelsel__chev", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) });
|
|
43
|
+
function ModelSelector({ value, models = [], onChange, align = "start", className = "", ...rest }) {
|
|
44
|
+
const [open, setOpen] = useState(false);
|
|
45
|
+
const ref = useRef(null);
|
|
46
|
+
const current = models.find((m) => (typeof m === "string" ? m : m.value) === value);
|
|
47
|
+
const currentLabel = current ? typeof current === "string" ? current : current.value : value;
|
|
48
|
+
const onDoc = useCallback((e) => {
|
|
49
|
+
if (ref.current && !ref.current.contains(e.target)) setOpen(false);
|
|
50
|
+
}, []);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
if (open) {
|
|
53
|
+
document.addEventListener("mousedown", onDoc);
|
|
54
|
+
const onKey = (e) => {
|
|
55
|
+
if (e.key === "Escape") setOpen(false);
|
|
56
|
+
};
|
|
57
|
+
document.addEventListener("keydown", onKey);
|
|
58
|
+
return () => {
|
|
59
|
+
document.removeEventListener("mousedown", onDoc);
|
|
60
|
+
document.removeEventListener("keydown", onKey);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}, [open, onDoc]);
|
|
64
|
+
return /* @__PURE__ */ jsxs("span", { className: ["ax-modelsel", open ? "ax-modelsel--open" : "", className].filter(Boolean).join(" "), ref, ...rest, children: [
|
|
65
|
+
/* @__PURE__ */ jsxs("button", { className: "ax-modelsel__trigger", onClick: () => setOpen((o) => !o), children: [
|
|
66
|
+
/* @__PURE__ */ jsx("span", { className: "ax-modelsel__glyph", children: "▣" }),
|
|
67
|
+
currentLabel,
|
|
68
|
+
Chev
|
|
69
|
+
] }),
|
|
70
|
+
open ? /* @__PURE__ */ jsx("div", { className: "ax-modelsel__panel" + (align === "end" ? " ax-modelsel__panel--end" : ""), role: "listbox", children: models.map((m) => {
|
|
71
|
+
const model = typeof m === "string" ? { value: m } : m;
|
|
72
|
+
const selected = model.value === value;
|
|
73
|
+
return /* @__PURE__ */ jsxs("button", { role: "option", "aria-selected": selected, className: "ax-modelsel__item", onClick: () => {
|
|
74
|
+
onChange && onChange(model.value);
|
|
75
|
+
setOpen(false);
|
|
76
|
+
}, children: [
|
|
77
|
+
/* @__PURE__ */ jsx("span", { className: "ax-modelsel__check", children: selected ? Check : null }),
|
|
78
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-modelsel__body", children: [
|
|
79
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-modelsel__name", children: [
|
|
80
|
+
model.value,
|
|
81
|
+
model.tag ? /* @__PURE__ */ jsx("span", { className: "ax-modelsel__tag", children: model.tag }) : null
|
|
82
|
+
] }),
|
|
83
|
+
model.description ? /* @__PURE__ */ jsx("span", { className: "ax-modelsel__desc", children: model.description }) : null
|
|
84
|
+
] })
|
|
85
|
+
] }, model.value);
|
|
86
|
+
}) }) : null
|
|
87
|
+
] });
|
|
88
|
+
}
|
|
89
|
+
export {
|
|
90
|
+
ModelSelector
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=ModelSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelSelector.js","sources":["../../../src/components/ai/ModelSelector.jsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\n\nconst AX_MODELSEL_CSS = `\n.ax-modelsel { position: relative; display: inline-flex; }\n.ax-modelsel__trigger {\n display: inline-flex; align-items: center; gap: 8px; cursor: pointer;\n background: transparent; color: var(--text-body);\n border: 1px solid var(--border-default); border-radius: var(--radius-2);\n padding: 6px 10px; font-family: var(--font-mono); font-size: var(--text-sm);\n transition: border-color var(--dur-1) var(--ease-out), background var(--dur-1) var(--ease-out);\n}\n.ax-modelsel__trigger:hover { border-color: var(--border-strong); background: var(--surface-raised); }\n.ax-modelsel__trigger:focus-visible { outline: none; box-shadow: var(--ring); }\n.ax-modelsel__glyph { color: var(--text-faint); }\n.ax-modelsel__chev { width: 12px; height: 12px; color: var(--text-faint); transition: transform var(--dur-2) var(--ease-out); }\n.ax-modelsel--open .ax-modelsel__chev { transform: rotate(180deg); }\n.ax-modelsel__panel {\n position: absolute; z-index: 60; top: calc(100% + 6px); left: 0; min-width: 280px;\n background: var(--surface-panel); border: 1px solid var(--border-strong);\n border-radius: var(--radius-3); box-shadow: var(--shadow-2); padding: var(--space-1);\n animation: ax-modelsel-in var(--dur-2) var(--ease-out);\n}\n.ax-modelsel__panel--end { left: auto; right: 0; }\n.ax-modelsel__item { display: flex; align-items: flex-start; gap: 10px; width: 100%; appearance: none; background: none; border: none; text-align: left; cursor: pointer; padding: 9px 10px; border-radius: var(--radius-2); transition: background var(--dur-1) var(--ease-out); }\n.ax-modelsel__item:hover { background: var(--surface-raised); }\n.ax-modelsel__check { width: 16px; flex: none; color: var(--accent); padding-top: 2px; }\n.ax-modelsel__check svg { width: 14px; height: 14px; display: block; }\n.ax-modelsel__body { flex: 1; min-width: 0; }\n.ax-modelsel__name { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--text-body); display: flex; align-items: center; gap: 8px; }\n.ax-modelsel__desc { font-size: var(--text-xs); color: var(--text-faint); margin-top: 2px; line-height: var(--leading-snug); }\n.ax-modelsel__tag { font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-faint); border: 1px solid var(--border-default); border-radius: var(--radius-1); padding: 1px 4px; }\n@keyframes ax-modelsel-in { from { opacity: 0; transform: translateY(-4px); } }\n@media (prefers-reduced-motion: reduce) { .ax-modelsel__panel { animation: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-modelsel-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-modelsel-css\";\n s.textContent = AX_MODELSEL_CSS;\n document.head.appendChild(s);\n}\n\nconst Check = <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"></path></svg>;\nconst Chev = <svg className=\"ax-modelsel__chev\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"m6 9 6 6 6-6\"></path></svg>;\n\nexport function ModelSelector({ value, models = [], onChange, align = \"start\", className = \"\", ...rest }) {\n const [open, setOpen] = useState(false);\n const ref = useRef(null);\n const current = models.find((m) => (typeof m === \"string\" ? m : m.value) === value);\n const currentLabel = current ? (typeof current === \"string\" ? current : current.value) : value;\n\n const onDoc = useCallback((e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }, []);\n useEffect(() => {\n if (open) {\n document.addEventListener(\"mousedown\", onDoc);\n const onKey = (e) => { if (e.key === \"Escape\") setOpen(false); };\n document.addEventListener(\"keydown\", onKey);\n return () => { document.removeEventListener(\"mousedown\", onDoc); document.removeEventListener(\"keydown\", onKey); };\n }\n }, [open, onDoc]);\n\n return (\n <span className={[\"ax-modelsel\", open ? \"ax-modelsel--open\" : \"\", className].filter(Boolean).join(\" \")} ref={ref} {...rest}>\n <button className=\"ax-modelsel__trigger\" onClick={() => setOpen((o) => !o)}>\n <span className=\"ax-modelsel__glyph\">▣</span>\n {currentLabel}\n {Chev}\n </button>\n {open ? (\n <div className={\"ax-modelsel__panel\" + (align === \"end\" ? \" ax-modelsel__panel--end\" : \"\")} role=\"listbox\">\n {models.map((m) => {\n const model = typeof m === \"string\" ? { value: m } : m;\n const selected = model.value === value;\n return (\n <button key={model.value} role=\"option\" aria-selected={selected} className=\"ax-modelsel__item\" onClick={() => { onChange && onChange(model.value); setOpen(false); }}>\n <span className=\"ax-modelsel__check\">{selected ? Check : null}</span>\n <span className=\"ax-modelsel__body\">\n <span className=\"ax-modelsel__name\">{model.value}{model.tag ? <span className=\"ax-modelsel__tag\">{model.tag}</span> : null}</span>\n {model.description ? <span className=\"ax-modelsel__desc\">{model.description}</span> : null}\n </span>\n </button>\n );\n })}\n </div>\n ) : null}\n </span>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCxB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,iBAAiB,GAAG;AAClF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEA,MAAM,QAAQ,oBAAC,OAAA,EAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,8BAAC,QAAA,EAAK,GAAE,mBAAkB,GAAO;AACzK,MAAM,2BAAQ,OAAA,EAAI,WAAU,qBAAoB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,UAAA,oBAAC,QAAA,EAAK,GAAE,eAAA,CAAe,EAAA,CAAO;AAE5L,SAAS,cAAc,EAAE,OAAO,SAAS,CAAA,GAAI,UAAU,QAAQ,SAAS,YAAY,IAAI,GAAG,QAAQ;AACxG,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,UAAU,OAAO,KAAK,CAAC,OAAO,OAAO,MAAM,WAAW,IAAI,EAAE,WAAW,KAAK;AAClF,QAAM,eAAe,UAAW,OAAO,YAAY,WAAW,UAAU,QAAQ,QAAS;AAEzF,QAAM,QAAQ,YAAY,CAAC,MAAM;AAAE,QAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAM,EAAG,SAAQ,KAAK;AAAA,EAAG,GAAG,CAAA,CAAE;AAC5G,YAAU,MAAM;AACd,QAAI,MAAM;AACR,eAAS,iBAAiB,aAAa,KAAK;AAC5C,YAAM,QAAQ,CAAC,MAAM;AAAE,YAAI,EAAE,QAAQ,SAAU,SAAQ,KAAK;AAAA,MAAG;AAC/D,eAAS,iBAAiB,WAAW,KAAK;AAC1C,aAAO,MAAM;AAAE,iBAAS,oBAAoB,aAAa,KAAK;AAAG,iBAAS,oBAAoB,WAAW,KAAK;AAAA,MAAG;AAAA,IACnH;AAAA,EACF,GAAG,CAAC,MAAM,KAAK,CAAC;AAEhB,8BACG,QAAA,EAAK,WAAW,CAAC,eAAe,OAAO,sBAAsB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,KAAW,GAAG,MACpH,UAAA;AAAA,IAAA,qBAAC,UAAA,EAAO,WAAU,wBAAuB,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GACvE,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,sBAAqB,UAAA,KAAC;AAAA,MACrC;AAAA,MACA;AAAA,IAAA,GACH;AAAA,IACC,OACC,oBAAC,OAAA,EAAI,WAAW,wBAAwB,UAAU,QAAQ,6BAA6B,KAAK,MAAK,WAC9F,UAAA,OAAO,IAAI,CAAC,MAAM;AACjB,YAAM,QAAQ,OAAO,MAAM,WAAW,EAAE,OAAO,MAAM;AACrD,YAAM,WAAW,MAAM,UAAU;AACjC,aACE,qBAAC,YAAyB,MAAK,UAAS,iBAAe,UAAU,WAAU,qBAAoB,SAAS,MAAM;AAAE,oBAAY,SAAS,MAAM,KAAK;AAAG,gBAAQ,KAAK;AAAA,MAAG,GACjK,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,sBAAsB,UAAA,WAAW,QAAQ,MAAK;AAAA,QAC9D,qBAAC,QAAA,EAAK,WAAU,qBACd,UAAA;AAAA,UAAA,qBAAC,QAAA,EAAK,WAAU,qBAAqB,UAAA;AAAA,YAAA,MAAM;AAAA,YAAO,MAAM,MAAM,oBAAC,QAAA,EAAK,WAAU,oBAAoB,UAAA,MAAM,KAAI,IAAU;AAAA,UAAA,GAAK;AAAA,UAC1H,MAAM,cAAc,oBAAC,QAAA,EAAK,WAAU,qBAAqB,UAAA,MAAM,aAAY,IAAU;AAAA,QAAA,EAAA,CACxF;AAAA,MAAA,EAAA,GALW,MAAM,KAMnB;AAAA,IAEJ,CAAC,GACH,IACE;AAAA,EAAA,GACN;AAEJ;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Numbered, connected step plan (vertical). Steps carry done/active/pending state. */
|
|
2
|
+
export interface PlanStep { title: React.ReactNode; description?: React.ReactNode; status?: "pending" | "active" | "done"; }
|
|
3
|
+
export interface PlanProps { steps: PlanStep[]; }
|
|
4
|
+
export declare function Plan(props: PlanProps): JSX.Element;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_PLAN_CSS = `
|
|
4
|
+
.ax-plan { display: flex; flex-direction: column; }
|
|
5
|
+
.ax-plan__step { display: flex; gap: 12px; }
|
|
6
|
+
.ax-plan__rail { display: flex; flex-direction: column; align-items: center; flex: none; }
|
|
7
|
+
.ax-plan__node {
|
|
8
|
+
width: 22px; height: 22px; flex: none; border-radius: var(--radius-1);
|
|
9
|
+
border: 1px solid var(--border-strong); background: var(--surface-card);
|
|
10
|
+
display: flex; align-items: center; justify-content: center;
|
|
11
|
+
font-family: var(--font-mono); font-size: 11px; color: var(--text-faint);
|
|
12
|
+
}
|
|
13
|
+
.ax-plan__step--done .ax-plan__node { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }
|
|
14
|
+
.ax-plan__step--active .ax-plan__node { border-color: var(--text-body); color: var(--text-body); }
|
|
15
|
+
.ax-plan__connector { width: 1px; flex: 1; min-height: 14px; background: var(--border-strong); margin: 2px 0; }
|
|
16
|
+
.ax-plan__step--done .ax-plan__connector { background: var(--accent); }
|
|
17
|
+
.ax-plan__body { padding-bottom: 16px; padding-top: 1px; }
|
|
18
|
+
.ax-plan__step:last-child .ax-plan__body { padding-bottom: 0; }
|
|
19
|
+
.ax-plan__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; }
|
|
20
|
+
.ax-plan__step--pending .ax-plan__title { color: var(--text-faint); }
|
|
21
|
+
.ax-plan__desc { font-size: var(--text-xs); color: var(--text-muted); margin: 3px 0 0; line-height: var(--leading-snug); }
|
|
22
|
+
`;
|
|
23
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-plan-css")) {
|
|
24
|
+
const s = document.createElement("style");
|
|
25
|
+
s.id = "ax-plan-css";
|
|
26
|
+
s.textContent = AX_PLAN_CSS;
|
|
27
|
+
document.head.appendChild(s);
|
|
28
|
+
}
|
|
29
|
+
const Check = /* @__PURE__ */ jsx("svg", { width: "11", height: "11", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) });
|
|
30
|
+
function Plan({ steps = [], className = "", ...rest }) {
|
|
31
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-plan", className].filter(Boolean).join(" "), ...rest, children: steps.map((st, i) => {
|
|
32
|
+
const status = st.status || "pending";
|
|
33
|
+
const last = i === steps.length - 1;
|
|
34
|
+
return /* @__PURE__ */ jsxs("div", { className: "ax-plan__step ax-plan__step--" + status, children: [
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-plan__rail", children: [
|
|
36
|
+
/* @__PURE__ */ jsx("span", { className: "ax-plan__node", children: status === "done" ? Check : i + 1 }),
|
|
37
|
+
!last ? /* @__PURE__ */ jsx("span", { className: "ax-plan__connector" }) : null
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-plan__body", children: [
|
|
40
|
+
/* @__PURE__ */ jsx("p", { className: "ax-plan__title", children: st.title }),
|
|
41
|
+
st.description ? /* @__PURE__ */ jsx("p", { className: "ax-plan__desc", children: st.description }) : null
|
|
42
|
+
] })
|
|
43
|
+
] }, i);
|
|
44
|
+
}) });
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
Plan
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=Plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plan.js","sources":["../../../src/components/ai/Plan.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_PLAN_CSS = `\n.ax-plan { display: flex; flex-direction: column; }\n.ax-plan__step { display: flex; gap: 12px; }\n.ax-plan__rail { display: flex; flex-direction: column; align-items: center; flex: none; }\n.ax-plan__node {\n width: 22px; height: 22px; flex: none; border-radius: var(--radius-1);\n border: 1px solid var(--border-strong); background: var(--surface-card);\n display: flex; align-items: center; justify-content: center;\n font-family: var(--font-mono); font-size: 11px; color: var(--text-faint);\n}\n.ax-plan__step--done .ax-plan__node { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }\n.ax-plan__step--active .ax-plan__node { border-color: var(--text-body); color: var(--text-body); }\n.ax-plan__connector { width: 1px; flex: 1; min-height: 14px; background: var(--border-strong); margin: 2px 0; }\n.ax-plan__step--done .ax-plan__connector { background: var(--accent); }\n.ax-plan__body { padding-bottom: 16px; padding-top: 1px; }\n.ax-plan__step:last-child .ax-plan__body { padding-bottom: 0; }\n.ax-plan__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; }\n.ax-plan__step--pending .ax-plan__title { color: var(--text-faint); }\n.ax-plan__desc { font-size: var(--text-xs); color: var(--text-muted); margin: 3px 0 0; line-height: var(--leading-snug); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-plan-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-plan-css\";\n s.textContent = AX_PLAN_CSS;\n document.head.appendChild(s);\n}\n\nconst Check = <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"></path></svg>;\n\nexport function Plan({ steps = [], className = \"\", ...rest }) {\n return (\n <div className={[\"ax-plan\", className].filter(Boolean).join(\" \")} {...rest}>\n {steps.map((st, i) => {\n const status = st.status || \"pending\";\n const last = i === steps.length - 1;\n return (\n <div key={i} className={\"ax-plan__step ax-plan__step--\" + status}>\n <div className=\"ax-plan__rail\">\n <span className=\"ax-plan__node\">{status === \"done\" ? Check : i + 1}</span>\n {!last ? <span className=\"ax-plan__connector\"></span> : null}\n </div>\n <div className=\"ax-plan__body\">\n <p className=\"ax-plan__title\">{st.title}</p>\n {st.description ? <p className=\"ax-plan__desc\">{st.description}</p> : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBpB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,aAAa,GAAG;AAC9E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEA,MAAM,4BAAS,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA,oBAAC,QAAA,EAAK,GAAE,kBAAA,CAAkB,EAAA,CAAO;AAEvL,SAAS,KAAK,EAAE,QAAQ,CAAA,GAAI,YAAY,IAAI,GAAG,QAAQ;AAC5D,6BACG,OAAA,EAAI,WAAW,CAAC,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACnE,gBAAM,IAAI,CAAC,IAAI,MAAM;AACpB,UAAM,SAAS,GAAG,UAAU;AAC5B,UAAM,OAAO,MAAM,MAAM,SAAS;AAClC,WACE,qBAAC,OAAA,EAAY,WAAW,kCAAkC,QACxD,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,QAAA,oBAAC,UAAK,WAAU,iBAAiB,qBAAW,SAAS,QAAQ,IAAI,EAAA,CAAE;AAAA,QAClE,CAAC,OAAO,oBAAC,QAAA,EAAK,WAAU,sBAAqB,IAAU;AAAA,MAAA,GAC1D;AAAA,MACA,qBAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,QAAA,oBAAC,KAAA,EAAE,WAAU,kBAAkB,UAAA,GAAG,OAAM;AAAA,QACvC,GAAG,cAAc,oBAAC,KAAA,EAAE,WAAU,iBAAiB,UAAA,GAAG,aAAY,IAAO;AAAA,MAAA,EAAA,CACxE;AAAA,IAAA,EAAA,GARQ,CASV;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Queued-prompts list; the running item is highlighted, pending items removable. */
|
|
2
|
+
export interface QueueItem { text: React.ReactNode; status?: "running" | "pending"; }
|
|
3
|
+
export interface QueueProps { title?: string; items: Array<string | QueueItem>; onRemove?: (index: number) => void; }
|
|
4
|
+
export declare function Queue(props: QueueProps): JSX.Element;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_QUEUE_CSS = `
|
|
4
|
+
.ax-queue { display: flex; flex-direction: column; gap: 6px; }
|
|
5
|
+
.ax-queue__head { display: flex; align-items: center; gap: 8px; margin-bottom: 2px; }
|
|
6
|
+
.ax-queue__title { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); flex: 1; }
|
|
7
|
+
.ax-queue__count { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); }
|
|
8
|
+
.ax-queue__item { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border: 1px solid var(--border-default); border-radius: var(--radius-2); background: var(--surface-card); }
|
|
9
|
+
.ax-queue__num { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); width: 16px; flex: none; }
|
|
10
|
+
.ax-queue__text { flex: 1; min-width: 0; font-size: var(--text-sm); color: var(--text-body); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
11
|
+
.ax-queue__item--running { border-color: var(--border-strong); }
|
|
12
|
+
.ax-queue__item--running .ax-queue__num { color: var(--warn); }
|
|
13
|
+
.ax-queue__status { font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-label); text-transform: uppercase; flex: none; color: var(--text-faint); }
|
|
14
|
+
.ax-queue__item--running .ax-queue__status { color: var(--warn); }
|
|
15
|
+
.ax-queue__remove { appearance: none; background: none; border: none; cursor: pointer; color: var(--text-faint); font-family: var(--font-mono); font-size: 11px; padding: 2px 4px; border-radius: var(--radius-1); flex: none; }
|
|
16
|
+
.ax-queue__remove:hover { color: var(--danger); background: var(--danger-dim); }
|
|
17
|
+
`;
|
|
18
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-queue-css")) {
|
|
19
|
+
const s = document.createElement("style");
|
|
20
|
+
s.id = "ax-queue-css";
|
|
21
|
+
s.textContent = AX_QUEUE_CSS;
|
|
22
|
+
document.head.appendChild(s);
|
|
23
|
+
}
|
|
24
|
+
function Queue({ title = "Queued", items = [], onRemove, className = "", ...rest }) {
|
|
25
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-queue", className].filter(Boolean).join(" "), ...rest, children: [
|
|
26
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-queue__head", children: [
|
|
27
|
+
/* @__PURE__ */ jsx("span", { className: "ax-queue__title", children: title }),
|
|
28
|
+
/* @__PURE__ */ jsx("span", { className: "ax-queue__count", children: items.length })
|
|
29
|
+
] }),
|
|
30
|
+
items.map((it, i) => {
|
|
31
|
+
const item = typeof it === "string" ? { text: it } : it;
|
|
32
|
+
const running = item.status === "running";
|
|
33
|
+
return /* @__PURE__ */ jsxs("div", { className: "ax-queue__item" + (running ? " ax-queue__item--running" : ""), children: [
|
|
34
|
+
/* @__PURE__ */ jsx("span", { className: "ax-queue__num", children: running ? "▶" : i + 1 }),
|
|
35
|
+
/* @__PURE__ */ jsx("span", { className: "ax-queue__text", children: item.text }),
|
|
36
|
+
item.status ? /* @__PURE__ */ jsx("span", { className: "ax-queue__status", children: item.status }) : null,
|
|
37
|
+
onRemove && !running ? /* @__PURE__ */ jsx("button", { className: "ax-queue__remove", "aria-label": "Remove", onClick: () => onRemove(i), children: "✕" }) : null
|
|
38
|
+
] }, i);
|
|
39
|
+
})
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
Queue
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=Queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Queue.js","sources":["../../../src/components/ai/Queue.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_QUEUE_CSS = `\n.ax-queue { display: flex; flex-direction: column; gap: 6px; }\n.ax-queue__head { display: flex; align-items: center; gap: 8px; margin-bottom: 2px; }\n.ax-queue__title { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); flex: 1; }\n.ax-queue__count { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); }\n.ax-queue__item { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border: 1px solid var(--border-default); border-radius: var(--radius-2); background: var(--surface-card); }\n.ax-queue__num { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); width: 16px; flex: none; }\n.ax-queue__text { flex: 1; min-width: 0; font-size: var(--text-sm); color: var(--text-body); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-queue__item--running { border-color: var(--border-strong); }\n.ax-queue__item--running .ax-queue__num { color: var(--warn); }\n.ax-queue__status { font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-label); text-transform: uppercase; flex: none; color: var(--text-faint); }\n.ax-queue__item--running .ax-queue__status { color: var(--warn); }\n.ax-queue__remove { appearance: none; background: none; border: none; cursor: pointer; color: var(--text-faint); font-family: var(--font-mono); font-size: 11px; padding: 2px 4px; border-radius: var(--radius-1); flex: none; }\n.ax-queue__remove:hover { color: var(--danger); background: var(--danger-dim); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-queue-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-queue-css\";\n s.textContent = AX_QUEUE_CSS;\n document.head.appendChild(s);\n}\n\nexport function Queue({ title = \"Queued\", items = [], onRemove, className = \"\", ...rest }) {\n return (\n <div className={[\"ax-queue\", className].filter(Boolean).join(\" \")} {...rest}>\n <div className=\"ax-queue__head\">\n <span className=\"ax-queue__title\">{title}</span>\n <span className=\"ax-queue__count\">{items.length}</span>\n </div>\n {items.map((it, i) => {\n const item = typeof it === \"string\" ? { text: it } : it;\n const running = item.status === \"running\";\n return (\n <div key={i} className={\"ax-queue__item\" + (running ? \" ax-queue__item--running\" : \"\")}>\n <span className=\"ax-queue__num\">{running ? \"▶\" : i + 1}</span>\n <span className=\"ax-queue__text\">{item.text}</span>\n {item.status ? <span className=\"ax-queue__status\">{item.status}</span> : null}\n {onRemove && !running ? <button className=\"ax-queue__remove\" aria-label=\"Remove\" onClick={() => onRemove(i)}>✕</button> : null}\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBrB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,cAAc,GAAG;AAC/E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,MAAM,EAAE,QAAQ,UAAU,QAAQ,CAAA,GAAI,UAAU,YAAY,IAAI,GAAG,QAAQ;AACzF,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACrE,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,mBAAmB,UAAA,OAAM;AAAA,MACzC,oBAAC,QAAA,EAAK,WAAU,mBAAmB,gBAAM,OAAA,CAAO;AAAA,IAAA,GAClD;AAAA,IACC,MAAM,IAAI,CAAC,IAAI,MAAM;AACpB,YAAM,OAAO,OAAO,OAAO,WAAW,EAAE,MAAM,OAAO;AACrD,YAAM,UAAU,KAAK,WAAW;AAChC,kCACG,OAAA,EAAY,WAAW,oBAAoB,UAAU,6BAA6B,KACjF,UAAA;AAAA,QAAA,oBAAC,UAAK,WAAU,iBAAiB,UAAA,UAAU,MAAM,IAAI,GAAE;AAAA,QACvD,oBAAC,QAAA,EAAK,WAAU,kBAAkB,eAAK,MAAK;AAAA,QAC3C,KAAK,SAAS,oBAAC,QAAA,EAAK,WAAU,oBAAoB,UAAA,KAAK,QAAO,IAAU;AAAA,QACxE,YAAY,CAAC,UAAU,oBAAC,YAAO,WAAU,oBAAmB,cAAW,UAAS,SAAS,MAAM,SAAS,CAAC,GAAG,eAAC,IAAY;AAAA,MAAA,EAAA,GAJlH,CAKV;AAAA,IAEJ,CAAC;AAAA,EAAA,GACH;AAEJ;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collapsible chain-of-thought block. Shows a "Thinking…" header with a blinking
|
|
3
|
+
* cursor while streaming, then a duration and expandable step list.
|
|
4
|
+
*/
|
|
5
|
+
export interface ReasoningProps {
|
|
6
|
+
/** Reasoning steps (strings or nodes), shown as a connected vertical list. */
|
|
7
|
+
steps?: React.ReactNode[];
|
|
8
|
+
/** Mono duration shown when not streaming, e.g. "3.2s". */
|
|
9
|
+
duration?: string;
|
|
10
|
+
/** Live: header reads "Thinking" + cursor, auto-expanded. @default false */
|
|
11
|
+
streaming?: boolean;
|
|
12
|
+
/** Expanded on mount. @default false */
|
|
13
|
+
defaultOpen?: boolean;
|
|
14
|
+
/** Header label when settled. @default "Reasoning" */
|
|
15
|
+
title?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function Reasoning(props: ReasoningProps): JSX.Element;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
const AX_REASONING_CSS = `
|
|
4
|
+
.ax-reasoning { border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); overflow: hidden; }
|
|
5
|
+
.ax-reasoning__head {
|
|
6
|
+
display: flex; align-items: center; gap: 10px; width: 100%;
|
|
7
|
+
appearance: none; background: none; border: none; cursor: pointer; text-align: left;
|
|
8
|
+
padding: 11px 14px; color: var(--text-muted);
|
|
9
|
+
}
|
|
10
|
+
.ax-reasoning__head:hover { color: var(--text-body); }
|
|
11
|
+
.ax-reasoning__head:focus-visible { outline: none; box-shadow: var(--ring); }
|
|
12
|
+
.ax-reasoning__glyph { width: 14px; height: 14px; flex: none; color: var(--text-faint); }
|
|
13
|
+
.ax-reasoning__title { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; }
|
|
14
|
+
.ax-reasoning__dur { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); }
|
|
15
|
+
.ax-reasoning__spacer { flex: 1; }
|
|
16
|
+
.ax-reasoning__chev { width: 12px; height: 12px; flex: none; color: var(--text-faint); transition: transform var(--dur-2) var(--ease-out); }
|
|
17
|
+
.ax-reasoning--open .ax-reasoning__chev { transform: rotate(180deg); }
|
|
18
|
+
.ax-reasoning__cursor { display: inline-block; width: 0.5em; height: 1em; background: currentColor; vertical-align: text-bottom; margin-left: 4px; animation: ax-rsn-blink 1.1s steps(1) infinite; }
|
|
19
|
+
@keyframes ax-rsn-blink { 50% { opacity: 0; } }
|
|
20
|
+
.ax-reasoning__panel { overflow: hidden; display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-2) var(--ease-out); }
|
|
21
|
+
.ax-reasoning--open .ax-reasoning__panel { grid-template-rows: 1fr; }
|
|
22
|
+
.ax-reasoning__panel-inner { min-height: 0; }
|
|
23
|
+
.ax-reasoning__steps { padding: 4px 16px 16px 16px; border-top: 1px solid var(--border-default); margin-top: 2px; }
|
|
24
|
+
.ax-reasoning__step { position: relative; padding: 8px 0 8px 22px; font-size: var(--text-sm); color: var(--text-muted); line-height: var(--leading-snug); }
|
|
25
|
+
.ax-reasoning__step::before { content: ""; position: absolute; left: 4px; top: 13px; width: 5px; height: 5px; border-radius: 1px; background: var(--text-faint); }
|
|
26
|
+
.ax-reasoning__step:not(:last-child)::after { content: ""; position: absolute; left: 6px; top: 18px; bottom: -4px; width: 1px; background: var(--border-strong); }
|
|
27
|
+
.ax-reasoning__step strong { color: var(--text-body); font-weight: var(--weight-medium); }
|
|
28
|
+
@media (prefers-reduced-motion: reduce) { .ax-reasoning__panel { transition: none; } .ax-reasoning__cursor { animation: none; } }
|
|
29
|
+
`;
|
|
30
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-reasoning-css")) {
|
|
31
|
+
const s = document.createElement("style");
|
|
32
|
+
s.id = "ax-reasoning-css";
|
|
33
|
+
s.textContent = AX_REASONING_CSS;
|
|
34
|
+
document.head.appendChild(s);
|
|
35
|
+
}
|
|
36
|
+
const Chev = /* @__PURE__ */ jsx("svg", { className: "ax-reasoning__chev", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) });
|
|
37
|
+
const Brain = /* @__PURE__ */ jsxs("svg", { className: "ax-reasoning__glyph", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
38
|
+
/* @__PURE__ */ jsx("path", { d: "M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z" }),
|
|
39
|
+
/* @__PURE__ */ jsx("path", { d: "M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z" })
|
|
40
|
+
] });
|
|
41
|
+
function Reasoning({ steps = [], duration, streaming = false, defaultOpen = false, title = "Reasoning", className = "", ...rest }) {
|
|
42
|
+
const [open, setOpen] = useState(defaultOpen || streaming);
|
|
43
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-reasoning", open ? "ax-reasoning--open" : "", className].filter(Boolean).join(" "), ...rest, children: [
|
|
44
|
+
/* @__PURE__ */ jsxs("button", { className: "ax-reasoning__head", "aria-expanded": open, onClick: () => setOpen((o) => !o), children: [
|
|
45
|
+
Brain,
|
|
46
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-reasoning__title", children: [
|
|
47
|
+
streaming ? "Thinking" : title,
|
|
48
|
+
streaming ? /* @__PURE__ */ jsx("span", { className: "ax-reasoning__cursor" }) : null
|
|
49
|
+
] }),
|
|
50
|
+
duration && !streaming ? /* @__PURE__ */ jsx("span", { className: "ax-reasoning__dur", children: duration }) : null,
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "ax-reasoning__spacer" }),
|
|
52
|
+
Chev
|
|
53
|
+
] }),
|
|
54
|
+
/* @__PURE__ */ jsx("div", { className: "ax-reasoning__panel", children: /* @__PURE__ */ jsx("div", { className: "ax-reasoning__panel-inner", children: /* @__PURE__ */ jsx("div", { className: "ax-reasoning__steps", children: steps.map((st, i) => /* @__PURE__ */ jsx("div", { className: "ax-reasoning__step", children: st }, i)) }) }) })
|
|
55
|
+
] });
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
Reasoning
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=Reasoning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reasoning.js","sources":["../../../src/components/ai/Reasoning.jsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nconst AX_REASONING_CSS = `\n.ax-reasoning { border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); overflow: hidden; }\n.ax-reasoning__head {\n display: flex; align-items: center; gap: 10px; width: 100%;\n appearance: none; background: none; border: none; cursor: pointer; text-align: left;\n padding: 11px 14px; color: var(--text-muted);\n}\n.ax-reasoning__head:hover { color: var(--text-body); }\n.ax-reasoning__head:focus-visible { outline: none; box-shadow: var(--ring); }\n.ax-reasoning__glyph { width: 14px; height: 14px; flex: none; color: var(--text-faint); }\n.ax-reasoning__title { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; }\n.ax-reasoning__dur { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); }\n.ax-reasoning__spacer { flex: 1; }\n.ax-reasoning__chev { width: 12px; height: 12px; flex: none; color: var(--text-faint); transition: transform var(--dur-2) var(--ease-out); }\n.ax-reasoning--open .ax-reasoning__chev { transform: rotate(180deg); }\n.ax-reasoning__cursor { display: inline-block; width: 0.5em; height: 1em; background: currentColor; vertical-align: text-bottom; margin-left: 4px; animation: ax-rsn-blink 1.1s steps(1) infinite; }\n@keyframes ax-rsn-blink { 50% { opacity: 0; } }\n.ax-reasoning__panel { overflow: hidden; display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-2) var(--ease-out); }\n.ax-reasoning--open .ax-reasoning__panel { grid-template-rows: 1fr; }\n.ax-reasoning__panel-inner { min-height: 0; }\n.ax-reasoning__steps { padding: 4px 16px 16px 16px; border-top: 1px solid var(--border-default); margin-top: 2px; }\n.ax-reasoning__step { position: relative; padding: 8px 0 8px 22px; font-size: var(--text-sm); color: var(--text-muted); line-height: var(--leading-snug); }\n.ax-reasoning__step::before { content: \"\"; position: absolute; left: 4px; top: 13px; width: 5px; height: 5px; border-radius: 1px; background: var(--text-faint); }\n.ax-reasoning__step:not(:last-child)::after { content: \"\"; position: absolute; left: 6px; top: 18px; bottom: -4px; width: 1px; background: var(--border-strong); }\n.ax-reasoning__step strong { color: var(--text-body); font-weight: var(--weight-medium); }\n@media (prefers-reduced-motion: reduce) { .ax-reasoning__panel { transition: none; } .ax-reasoning__cursor { animation: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-reasoning-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-reasoning-css\";\n s.textContent = AX_REASONING_CSS;\n document.head.appendChild(s);\n}\n\nconst Chev = (\n <svg className=\"ax-reasoning__chev\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"m6 9 6 6 6-6\"></path></svg>\n);\nconst Brain = (\n <svg className=\"ax-reasoning__glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z\"></path><path d=\"M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z\"></path></svg>\n);\n\nexport function Reasoning({ steps = [], duration, streaming = false, defaultOpen = false, title = \"Reasoning\", className = \"\", ...rest }) {\n const [open, setOpen] = useState(defaultOpen || streaming);\n return (\n <div className={[\"ax-reasoning\", open ? \"ax-reasoning--open\" : \"\", className].filter(Boolean).join(\" \")} {...rest}>\n <button className=\"ax-reasoning__head\" aria-expanded={open} onClick={() => setOpen((o) => !o)}>\n {Brain}\n <span className=\"ax-reasoning__title\">{streaming ? \"Thinking\" : title}{streaming ? <span className=\"ax-reasoning__cursor\"></span> : null}</span>\n {duration && !streaming ? <span className=\"ax-reasoning__dur\">{duration}</span> : null}\n <span className=\"ax-reasoning__spacer\"></span>\n {Chev}\n </button>\n <div className=\"ax-reasoning__panel\">\n <div className=\"ax-reasoning__panel-inner\">\n <div className=\"ax-reasoning__steps\">\n {steps.map((st, i) => (\n <div className=\"ax-reasoning__step\" key={i}>{st}</div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4BzB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,kBAAkB,GAAG;AACnF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEA,MAAM,2BACH,OAAA,EAAI,WAAU,sBAAqB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,UAAA,oBAAC,QAAA,EAAK,GAAE,eAAA,CAAe,EAAA,CAAO;AAEzL,MAAM,QACJ,qBAAC,OAAA,EAAI,WAAU,uBAAsB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,GAAE,oKAAA,CAAoK;AAAA,EAAO,oBAAC,QAAA,EAAK,GAAE,sKAAA,CAAsK;AAAA,GAAO;AAG3f,SAAS,UAAU,EAAE,QAAQ,CAAA,GAAI,UAAU,YAAY,OAAO,cAAc,OAAO,QAAQ,aAAa,YAAY,IAAI,GAAG,QAAQ;AACxI,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,eAAe,SAAS;AACzD,8BACG,OAAA,EAAI,WAAW,CAAC,gBAAgB,OAAO,uBAAuB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAC3G,UAAA;AAAA,IAAA,qBAAC,UAAA,EAAO,WAAU,sBAAqB,iBAAe,MAAM,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GACzF,UAAA;AAAA,MAAA;AAAA,MACD,qBAAC,QAAA,EAAK,WAAU,uBAAuB,UAAA;AAAA,QAAA,YAAY,aAAa;AAAA,QAAO,YAAY,oBAAC,QAAA,EAAK,WAAU,wBAAuB,IAAU;AAAA,MAAA,GAAK;AAAA,MACxI,YAAY,CAAC,YAAY,oBAAC,UAAK,WAAU,qBAAqB,oBAAS,IAAU;AAAA,MAClF,oBAAC,QAAA,EAAK,WAAU,uBAAA,CAAuB;AAAA,MACtC;AAAA,IAAA,GACH;AAAA,IACA,oBAAC,OAAA,EAAI,WAAU,uBACb,UAAA,oBAAC,OAAA,EAAI,WAAU,6BACb,UAAA,oBAAC,OAAA,EAAI,WAAU,uBACZ,UAAA,MAAM,IAAI,CAAC,IAAI,MACd,oBAAC,OAAA,EAAI,WAAU,sBAA8B,UAAA,GAAA,GAAJ,CAAO,CACjD,EAAA,CACH,EAAA,CACF,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shimmering text — a moving highlight sweep across the glyphs. Use for
|
|
3
|
+
* transient loading labels ("Searching the web…").
|
|
4
|
+
*/
|
|
5
|
+
export interface ShimmerProps {
|
|
6
|
+
/** Element tag to render. @default "span" */
|
|
7
|
+
as?: string;
|
|
8
|
+
children?: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function Shimmer(props: ShimmerProps): JSX.Element;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_SHIMMER_CSS = `
|
|
4
|
+
.ax-shimmer {
|
|
5
|
+
display: inline-block;
|
|
6
|
+
background: linear-gradient(90deg, var(--text-faint) 0%, var(--text-body) 20%, var(--text-faint) 40%, var(--text-faint) 100%);
|
|
7
|
+
background-size: 200% 100%;
|
|
8
|
+
-webkit-background-clip: text; background-clip: text;
|
|
9
|
+
-webkit-text-fill-color: transparent; color: transparent;
|
|
10
|
+
animation: ax-shimmer-text 2s linear infinite;
|
|
11
|
+
}
|
|
12
|
+
@keyframes ax-shimmer-text { to { background-position: -200% 0; } }
|
|
13
|
+
@media (prefers-reduced-motion: reduce) { .ax-shimmer { animation: none; -webkit-text-fill-color: var(--text-muted); color: var(--text-muted); } }
|
|
14
|
+
`;
|
|
15
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-shimmer-css")) {
|
|
16
|
+
const s = document.createElement("style");
|
|
17
|
+
s.id = "ax-shimmer-css";
|
|
18
|
+
s.textContent = AX_SHIMMER_CSS;
|
|
19
|
+
document.head.appendChild(s);
|
|
20
|
+
}
|
|
21
|
+
function Shimmer({ children, as = "span", className = "", ...rest }) {
|
|
22
|
+
const Tag = as;
|
|
23
|
+
return /* @__PURE__ */ jsx(Tag, { className: ["ax-shimmer", className].filter(Boolean).join(" "), ...rest, children });
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
Shimmer
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=Shimmer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Shimmer.js","sources":["../../../src/components/ai/Shimmer.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_SHIMMER_CSS = `\n.ax-shimmer {\n display: inline-block;\n background: linear-gradient(90deg, var(--text-faint) 0%, var(--text-body) 20%, var(--text-faint) 40%, var(--text-faint) 100%);\n background-size: 200% 100%;\n -webkit-background-clip: text; background-clip: text;\n -webkit-text-fill-color: transparent; color: transparent;\n animation: ax-shimmer-text 2s linear infinite;\n}\n@keyframes ax-shimmer-text { to { background-position: -200% 0; } }\n@media (prefers-reduced-motion: reduce) { .ax-shimmer { animation: none; -webkit-text-fill-color: var(--text-muted); color: var(--text-muted); } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-shimmer-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-shimmer-css\";\n s.textContent = AX_SHIMMER_CSS;\n document.head.appendChild(s);\n}\n\nexport function Shimmer({ children, as = \"span\", className = \"\", ...rest }) {\n const Tag = as;\n return <Tag className={[\"ax-shimmer\", className].filter(Boolean).join(\" \")} {...rest}>{children}</Tag>;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAavB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,gBAAgB,GAAG;AACjF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,QAAQ,EAAE,UAAU,KAAK,QAAQ,YAAY,IAAI,GAAG,QAAQ;AAC1E,QAAM,MAAM;AACZ,SAAO,oBAAC,KAAA,EAAI,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAAO,UAAS;AAClG;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cited-sources list plus an inline Citation chip for use within prose.
|
|
3
|
+
*/
|
|
4
|
+
export interface SourceItem {
|
|
5
|
+
title: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SourcesProps {
|
|
9
|
+
/** Strings or { title, url } objects. */
|
|
10
|
+
sources: Array<string | SourceItem>;
|
|
11
|
+
/** Mono header label. @default "Sources" */
|
|
12
|
+
label?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function Sources(props: SourcesProps): JSX.Element;
|
|
15
|
+
|
|
16
|
+
export interface CitationProps {
|
|
17
|
+
/** Number shown in the chip, e.g. 1. */
|
|
18
|
+
index: number | string;
|
|
19
|
+
href?: string;
|
|
20
|
+
onClick?: (e: any) => void;
|
|
21
|
+
}
|
|
22
|
+
/** Inline numbered citation chip — place inside assistant prose. */
|
|
23
|
+
export declare function Citation(props: CitationProps): JSX.Element;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_SOURCES_CSS = `
|
|
4
|
+
.ax-citation {
|
|
5
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
6
|
+
min-width: 16px; height: 16px; padding: 0 4px; vertical-align: top;
|
|
7
|
+
background: var(--surface-raised); border: 1px solid var(--border-strong);
|
|
8
|
+
border-radius: var(--radius-1); cursor: pointer; margin: 0 1px;
|
|
9
|
+
font-family: var(--font-mono); font-size: 10px; color: var(--text-muted);
|
|
10
|
+
text-decoration: none; transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
|
|
11
|
+
}
|
|
12
|
+
.ax-citation:hover { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
|
|
13
|
+
|
|
14
|
+
.ax-sources { border: 1px solid var(--border-default); border-radius: var(--radius-3); overflow: hidden; }
|
|
15
|
+
.ax-sources__head { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); padding: 10px 14px; border-bottom: 1px solid var(--border-default); display: flex; align-items: center; gap: 8px; }
|
|
16
|
+
.ax-sources__count { color: var(--text-body); }
|
|
17
|
+
.ax-source {
|
|
18
|
+
display: flex; align-items: flex-start; gap: 10px; padding: 11px 14px; text-decoration: none;
|
|
19
|
+
border-bottom: 1px solid var(--border-default); transition: background var(--dur-1) var(--ease-out);
|
|
20
|
+
}
|
|
21
|
+
.ax-source:last-child { border-bottom: none; }
|
|
22
|
+
.ax-source:hover { background: var(--surface-raised); }
|
|
23
|
+
.ax-source__num { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); flex: none; width: 18px; text-align: right; line-height: 1.5; }
|
|
24
|
+
.ax-source__body { min-width: 0; flex: 1; }
|
|
25
|
+
.ax-source__title { font-size: var(--text-sm); color: var(--text-body); font-weight: var(--weight-medium); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
26
|
+
.ax-source__url { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); margin: 2px 0 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
27
|
+
.ax-source__arrow { color: var(--text-faint); flex: none; }
|
|
28
|
+
`;
|
|
29
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-sources-css")) {
|
|
30
|
+
const s = document.createElement("style");
|
|
31
|
+
s.id = "ax-sources-css";
|
|
32
|
+
s.textContent = AX_SOURCES_CSS;
|
|
33
|
+
document.head.appendChild(s);
|
|
34
|
+
}
|
|
35
|
+
function Citation({ index, href, onClick, className = "", ...rest }) {
|
|
36
|
+
return /* @__PURE__ */ jsx("a", { className: ["ax-citation", className].filter(Boolean).join(" "), href: href || "#", onClick, ...rest, children: index });
|
|
37
|
+
}
|
|
38
|
+
function Sources({ sources = [], label = "Sources", className = "", ...rest }) {
|
|
39
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-sources", className].filter(Boolean).join(" "), ...rest, children: [
|
|
40
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-sources__head", children: [
|
|
41
|
+
label,
|
|
42
|
+
" ",
|
|
43
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-sources__count", children: [
|
|
44
|
+
"· ",
|
|
45
|
+
sources.length
|
|
46
|
+
] })
|
|
47
|
+
] }),
|
|
48
|
+
sources.map((src, i) => {
|
|
49
|
+
const s = typeof src === "string" ? { title: src } : src;
|
|
50
|
+
return /* @__PURE__ */ jsxs("a", { className: "ax-source", href: s.url || "#", target: "_blank", rel: "noreferrer", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "ax-source__num", children: i + 1 }),
|
|
52
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-source__body", children: [
|
|
53
|
+
/* @__PURE__ */ jsx("p", { className: "ax-source__title", children: s.title }),
|
|
54
|
+
s.url ? /* @__PURE__ */ jsx("p", { className: "ax-source__url", children: s.url.replace(/^https?:\/\//, "") }) : null
|
|
55
|
+
] }),
|
|
56
|
+
/* @__PURE__ */ jsx("svg", { className: "ax-source__arrow", width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M7 17 17 7M9 7h8v8" }) })
|
|
57
|
+
] }, i);
|
|
58
|
+
})
|
|
59
|
+
] });
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
Citation,
|
|
63
|
+
Sources
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=Sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sources.js","sources":["../../../src/components/ai/Sources.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_SOURCES_CSS = `\n.ax-citation {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 16px; height: 16px; padding: 0 4px; vertical-align: top;\n background: var(--surface-raised); border: 1px solid var(--border-strong);\n border-radius: var(--radius-1); cursor: pointer; margin: 0 1px;\n font-family: var(--font-mono); font-size: 10px; color: var(--text-muted);\n text-decoration: none; transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);\n}\n.ax-citation:hover { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }\n\n.ax-sources { border: 1px solid var(--border-default); border-radius: var(--radius-3); overflow: hidden; }\n.ax-sources__head { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); padding: 10px 14px; border-bottom: 1px solid var(--border-default); display: flex; align-items: center; gap: 8px; }\n.ax-sources__count { color: var(--text-body); }\n.ax-source {\n display: flex; align-items: flex-start; gap: 10px; padding: 11px 14px; text-decoration: none;\n border-bottom: 1px solid var(--border-default); transition: background var(--dur-1) var(--ease-out);\n}\n.ax-source:last-child { border-bottom: none; }\n.ax-source:hover { background: var(--surface-raised); }\n.ax-source__num { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); flex: none; width: 18px; text-align: right; line-height: 1.5; }\n.ax-source__body { min-width: 0; flex: 1; }\n.ax-source__title { font-size: var(--text-sm); color: var(--text-body); font-weight: var(--weight-medium); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-source__url { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); margin: 2px 0 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-source__arrow { color: var(--text-faint); flex: none; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-sources-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-sources-css\";\n s.textContent = AX_SOURCES_CSS;\n document.head.appendChild(s);\n}\n\nexport function Citation({ index, href, onClick, className = \"\", ...rest }) {\n return (\n <a className={[\"ax-citation\", className].filter(Boolean).join(\" \")} href={href || \"#\"} onClick={onClick} {...rest}>{index}</a>\n );\n}\n\nexport function Sources({ sources = [], label = \"Sources\", className = \"\", ...rest }) {\n return (\n <div className={[\"ax-sources\", className].filter(Boolean).join(\" \")} {...rest}>\n <div className=\"ax-sources__head\">{label} <span className=\"ax-sources__count\">· {sources.length}</span></div>\n {sources.map((src, i) => {\n const s = typeof src === \"string\" ? { title: src } : src;\n return (\n <a className=\"ax-source\" key={i} href={s.url || \"#\"} target=\"_blank\" rel=\"noreferrer\">\n <span className=\"ax-source__num\">{i + 1}</span>\n <span className=\"ax-source__body\">\n <p className=\"ax-source__title\">{s.title}</p>\n {s.url ? <p className=\"ax-source__url\">{s.url.replace(/^https?:\\/\\//, \"\")}</p> : null}\n </span>\n <svg className=\"ax-source__arrow\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M7 17 17 7M9 7h8v8\"></path></svg>\n </a>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BvB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,gBAAgB,GAAG;AACjF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,SAAS,EAAE,OAAO,MAAM,SAAS,YAAY,IAAI,GAAG,QAAQ;AAC1E,6BACG,KAAA,EAAE,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,MAAM,QAAQ,KAAK,SAAmB,GAAG,MAAO,UAAA,OAAM;AAE9H;AAEO,SAAS,QAAQ,EAAE,UAAU,CAAA,GAAI,QAAQ,WAAW,YAAY,IAAI,GAAG,QAAQ;AACpF,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACvE,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,oBAAoB,UAAA;AAAA,MAAA;AAAA,MAAM;AAAA,MAAC,qBAAC,QAAA,EAAK,WAAU,qBAAoB,UAAA;AAAA,QAAA;AAAA,QAAG,QAAQ;AAAA,MAAA,EAAA,CAAO;AAAA,IAAA,GAAO;AAAA,IACtG,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,YAAM,IAAI,OAAO,QAAQ,WAAW,EAAE,OAAO,QAAQ;AACrD,aACE,qBAAC,KAAA,EAAE,WAAU,aAAoB,MAAM,EAAE,OAAO,KAAK,QAAO,UAAS,KAAI,cACvE,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,kBAAkB,UAAA,IAAI,GAAE;AAAA,QACxC,qBAAC,QAAA,EAAK,WAAU,mBACd,UAAA;AAAA,UAAA,oBAAC,KAAA,EAAE,WAAU,oBAAoB,UAAA,EAAE,OAAM;AAAA,UACxC,EAAE,MAAM,oBAAC,KAAA,EAAE,WAAU,kBAAkB,UAAA,EAAE,IAAI,QAAQ,gBAAgB,EAAE,EAAA,CAAE,IAAO;AAAA,QAAA,GACnF;AAAA,QACA,oBAAC,OAAA,EAAI,WAAU,oBAAmB,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA,oBAAC,QAAA,EAAK,GAAE,qBAAA,CAAqB,EAAA,CAAO;AAAA,MAAA,EAAA,GANpL,CAO9B;AAAA,IAEJ,CAAC;AAAA,EAAA,GACH;AAEJ;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Suggested-prompt chips for empty states and follow-ups.
|
|
3
|
+
*/
|
|
4
|
+
export interface SuggestionProps {
|
|
5
|
+
/** Optional leading icon. */
|
|
6
|
+
icon?: React.ReactNode;
|
|
7
|
+
onClick?: () => void;
|
|
8
|
+
children?: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function Suggestion(props: SuggestionProps): JSX.Element;
|
|
11
|
+
|
|
12
|
+
export interface SuggestionsProps {
|
|
13
|
+
/** Strings or { label, value?, icon? }. */
|
|
14
|
+
items: Array<string | { label: string; value?: string; icon?: React.ReactNode }>;
|
|
15
|
+
onSelect?: (value: string) => void;
|
|
16
|
+
/** Single-row horizontal scroll instead of wrap. @default false */
|
|
17
|
+
scroll?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function Suggestions(props: SuggestionsProps): JSX.Element;
|