@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,123 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from "react";
|
|
3
|
+
const AX_COMPOSER_CSS = `
|
|
4
|
+
.ax-composer {
|
|
5
|
+
background: var(--surface-card);
|
|
6
|
+
border: 1px solid var(--border-strong);
|
|
7
|
+
border-radius: var(--radius-3);
|
|
8
|
+
transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
|
|
9
|
+
}
|
|
10
|
+
.ax-composer:focus-within { border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }
|
|
11
|
+
.ax-composer__input {
|
|
12
|
+
display: block; width: 100%; resize: none;
|
|
13
|
+
background: transparent; border: none; outline: none;
|
|
14
|
+
padding: 14px 16px 4px; min-height: 44px; max-height: 200px;
|
|
15
|
+
color: var(--text-body); font-family: var(--font-body);
|
|
16
|
+
font-size: var(--text-md); line-height: var(--leading-snug);
|
|
17
|
+
}
|
|
18
|
+
.ax-composer__input::placeholder { color: var(--text-faint); }
|
|
19
|
+
.ax-composer__row {
|
|
20
|
+
display: flex; align-items: center; gap: 8px;
|
|
21
|
+
padding: 6px 8px 8px 16px;
|
|
22
|
+
}
|
|
23
|
+
.ax-composer__model {
|
|
24
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
25
|
+
font-family: var(--font-mono); font-size: var(--text-xs);
|
|
26
|
+
letter-spacing: 0.04em; color: var(--text-faint);
|
|
27
|
+
border: 1px solid var(--border-default); border-radius: var(--radius-1);
|
|
28
|
+
padding: 3px 8px; background: transparent; cursor: pointer;
|
|
29
|
+
transition: color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);
|
|
30
|
+
}
|
|
31
|
+
.ax-composer__model:hover { color: var(--text-muted); border-color: var(--border-strong); }
|
|
32
|
+
.ax-composer__spacer { flex: 1; }
|
|
33
|
+
.ax-composer__send {
|
|
34
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
35
|
+
width: 32px; height: 32px; flex: none; cursor: pointer;
|
|
36
|
+
background: var(--accent); color: var(--accent-fg);
|
|
37
|
+
border: none; border-radius: var(--radius-2);
|
|
38
|
+
transition: background var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out);
|
|
39
|
+
}
|
|
40
|
+
.ax-composer__send:hover:not(:disabled) { background: var(--accent-hover); }
|
|
41
|
+
.ax-composer__send:active:not(:disabled) { transform: translateY(1px); }
|
|
42
|
+
.ax-composer__send:focus-visible { outline: none; box-shadow: var(--ring); }
|
|
43
|
+
.ax-composer__send:disabled { opacity: 0.3; cursor: not-allowed; }
|
|
44
|
+
.ax-composer__hint {
|
|
45
|
+
font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint);
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-composer-css")) {
|
|
49
|
+
const s = document.createElement("style");
|
|
50
|
+
s.id = "ax-composer-css";
|
|
51
|
+
s.textContent = AX_COMPOSER_CSS;
|
|
52
|
+
document.head.appendChild(s);
|
|
53
|
+
}
|
|
54
|
+
const SendIcon = /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
55
|
+
/* @__PURE__ */ jsx("path", { d: "M12 19V5" }),
|
|
56
|
+
/* @__PURE__ */ jsx("path", { d: "M5 12l7-7 7 7" })
|
|
57
|
+
] });
|
|
58
|
+
function Composer({
|
|
59
|
+
value,
|
|
60
|
+
onChange,
|
|
61
|
+
onSend,
|
|
62
|
+
placeholder = "Message Agentaily…",
|
|
63
|
+
model = "agentaily-2",
|
|
64
|
+
onModelClick,
|
|
65
|
+
disabled = false,
|
|
66
|
+
className = "",
|
|
67
|
+
...rest
|
|
68
|
+
}) {
|
|
69
|
+
const ref = useRef(null);
|
|
70
|
+
const handleKeyDown = (e) => {
|
|
71
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
72
|
+
e.preventDefault();
|
|
73
|
+
if (value && value.trim() && onSend) onSend();
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const autoGrow = () => {
|
|
77
|
+
const el = ref.current;
|
|
78
|
+
if (!el) return;
|
|
79
|
+
el.style.height = "auto";
|
|
80
|
+
el.style.height = Math.min(el.scrollHeight, 200) + "px";
|
|
81
|
+
};
|
|
82
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-composer", className].filter(Boolean).join(" "), ...rest, children: [
|
|
83
|
+
/* @__PURE__ */ jsx(
|
|
84
|
+
"textarea",
|
|
85
|
+
{
|
|
86
|
+
ref,
|
|
87
|
+
className: "ax-composer__input",
|
|
88
|
+
rows: 1,
|
|
89
|
+
value,
|
|
90
|
+
placeholder,
|
|
91
|
+
disabled,
|
|
92
|
+
onChange: (e) => {
|
|
93
|
+
autoGrow();
|
|
94
|
+
onChange && onChange(e.target.value);
|
|
95
|
+
},
|
|
96
|
+
onKeyDown: handleKeyDown
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-composer__row", children: [
|
|
100
|
+
/* @__PURE__ */ jsxs("button", { type: "button", className: "ax-composer__model", onClick: onModelClick, children: [
|
|
101
|
+
"▣ ",
|
|
102
|
+
model
|
|
103
|
+
] }),
|
|
104
|
+
/* @__PURE__ */ jsx("span", { className: "ax-composer__spacer" }),
|
|
105
|
+
/* @__PURE__ */ jsx("span", { className: "ax-composer__hint", children: "⏎ send" }),
|
|
106
|
+
/* @__PURE__ */ jsx(
|
|
107
|
+
"button",
|
|
108
|
+
{
|
|
109
|
+
type: "button",
|
|
110
|
+
className: "ax-composer__send",
|
|
111
|
+
"aria-label": "Send",
|
|
112
|
+
disabled: disabled || !value || !value.trim(),
|
|
113
|
+
onClick: () => onSend && onSend(),
|
|
114
|
+
children: SendIcon
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
] })
|
|
118
|
+
] });
|
|
119
|
+
}
|
|
120
|
+
export {
|
|
121
|
+
Composer
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=Composer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composer.js","sources":["../../../src/components/chat/Composer.jsx"],"sourcesContent":["import React, { useRef } from \"react\";\n\nconst AX_COMPOSER_CSS = `\n.ax-composer {\n background: var(--surface-card);\n border: 1px solid var(--border-strong);\n border-radius: var(--radius-3);\n transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);\n}\n.ax-composer:focus-within { border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }\n.ax-composer__input {\n display: block; width: 100%; resize: none;\n background: transparent; border: none; outline: none;\n padding: 14px 16px 4px; min-height: 44px; max-height: 200px;\n color: var(--text-body); font-family: var(--font-body);\n font-size: var(--text-md); line-height: var(--leading-snug);\n}\n.ax-composer__input::placeholder { color: var(--text-faint); }\n.ax-composer__row {\n display: flex; align-items: center; gap: 8px;\n padding: 6px 8px 8px 16px;\n}\n.ax-composer__model {\n display: inline-flex; align-items: center; gap: 6px;\n font-family: var(--font-mono); font-size: var(--text-xs);\n letter-spacing: 0.04em; color: var(--text-faint);\n border: 1px solid var(--border-default); border-radius: var(--radius-1);\n padding: 3px 8px; background: transparent; cursor: pointer;\n transition: color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);\n}\n.ax-composer__model:hover { color: var(--text-muted); border-color: var(--border-strong); }\n.ax-composer__spacer { flex: 1; }\n.ax-composer__send {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; flex: none; cursor: pointer;\n background: var(--accent); color: var(--accent-fg);\n border: none; border-radius: var(--radius-2);\n transition: background var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out);\n}\n.ax-composer__send:hover:not(:disabled) { background: var(--accent-hover); }\n.ax-composer__send:active:not(:disabled) { transform: translateY(1px); }\n.ax-composer__send:focus-visible { outline: none; box-shadow: var(--ring); }\n.ax-composer__send:disabled { opacity: 0.3; cursor: not-allowed; }\n.ax-composer__hint {\n font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint);\n}\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-composer-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-composer-css\";\n s.textContent = AX_COMPOSER_CSS;\n document.head.appendChild(s);\n}\n\nconst SendIcon = (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5\"></path>\n <path d=\"M5 12l7-7 7 7\"></path>\n </svg>\n);\n\nexport function Composer({\n value,\n onChange,\n onSend,\n placeholder = \"Message Agentaily…\",\n model = \"agentaily-2\",\n onModelClick,\n disabled = false,\n className = \"\",\n ...rest\n}) {\n const ref = useRef(null);\n\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (value && value.trim() && onSend) onSend();\n }\n };\n\n const autoGrow = () => {\n const el = ref.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = Math.min(el.scrollHeight, 200) + \"px\";\n };\n\n return (\n <div className={[\"ax-composer\", className].filter(Boolean).join(\" \")} {...rest}>\n <textarea\n ref={ref}\n className=\"ax-composer__input\"\n rows={1}\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => { autoGrow(); onChange && onChange(e.target.value); }}\n onKeyDown={handleKeyDown}\n ></textarea>\n <div className=\"ax-composer__row\">\n <button type=\"button\" className=\"ax-composer__model\" onClick={onModelClick}>\n ▣ {model}\n </button>\n <span className=\"ax-composer__spacer\"></span>\n <span className=\"ax-composer__hint\">⏎ send</span>\n <button\n type=\"button\"\n className=\"ax-composer__send\"\n aria-label=\"Send\"\n disabled={disabled || !value || !value.trim()}\n onClick={() => onSend && onSend()}\n >\n {SendIcon}\n </button>\n </div>\n </div>\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8CxB,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,WACJ,qBAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACvI,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,GAAE,WAAA,CAAW;AAAA,EACnB,oBAAC,QAAA,EAAK,GAAE,gBAAA,CAAgB;AAAA,GAC1B;AAGK,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,QAAQ;AAAA,EACR;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,GAAG;AACL,GAAG;AACD,QAAM,MAAM,OAAO,IAAI;AAEvB,QAAM,gBAAgB,CAAC,MAAM;AAC3B,QAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,QAAE,eAAA;AACF,UAAI,SAAS,MAAM,KAAA,KAAU,OAAQ,QAAA;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,WAAW,MAAM;AACrB,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,OAAG,MAAM,SAAS;AAClB,OAAG,MAAM,SAAS,KAAK,IAAI,GAAG,cAAc,GAAG,IAAI;AAAA,EACrD;AAEA,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACxE,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAU;AAAA,QACV,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,CAAC,MAAM;AAAE,mBAAA;AAAY,sBAAY,SAAS,EAAE,OAAO,KAAK;AAAA,QAAG;AAAA,QACrE,WAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAEb,qBAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,qBAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,SAAS,cAAc,UAAA;AAAA,QAAA;AAAA,QACvE;AAAA,MAAA,GACL;AAAA,MACA,oBAAC,QAAA,EAAK,WAAU,sBAAA,CAAsB;AAAA,MACtC,oBAAC,QAAA,EAAK,WAAU,qBAAoB,UAAA,UAAM;AAAA,MAC1C;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAW;AAAA,UACX,UAAU,YAAY,CAAC,SAAS,CAAC,MAAM,KAAA;AAAA,UACvC,SAAS,MAAM,UAAU,OAAA;AAAA,UAExB,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One chat turn. User turns are right-aligned cards; assistant turns are
|
|
3
|
+
* full-width prose under a mono name label.
|
|
4
|
+
*/
|
|
5
|
+
export interface MessageProps {
|
|
6
|
+
/** @default "assistant" */
|
|
7
|
+
role?: "user" | "assistant";
|
|
8
|
+
/** Assistant label. @default "Agentaily" */
|
|
9
|
+
name?: string;
|
|
10
|
+
/** Mono timestamp next to the name. */
|
|
11
|
+
time?: string;
|
|
12
|
+
/** Append a blinking block cursor (response in progress). @default false */
|
|
13
|
+
streaming?: boolean;
|
|
14
|
+
children?: React.ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export declare function Message(props: MessageProps): JSX.Element;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_MSG_CSS = `
|
|
4
|
+
.ax-msg { display: flex; flex-direction: column; }
|
|
5
|
+
.ax-msg--user { align-items: flex-end; }
|
|
6
|
+
.ax-msg--user .ax-msg__body {
|
|
7
|
+
max-width: 78%;
|
|
8
|
+
background: var(--surface-card);
|
|
9
|
+
border: 1px solid var(--border-default);
|
|
10
|
+
border-radius: var(--radius-3);
|
|
11
|
+
padding: 10px 14px;
|
|
12
|
+
}
|
|
13
|
+
.ax-msg--assistant { align-items: stretch; }
|
|
14
|
+
.ax-msg__head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; }
|
|
15
|
+
.ax-msg__name {
|
|
16
|
+
font-family: var(--font-mono); font-size: var(--text-xs);
|
|
17
|
+
font-weight: var(--weight-medium); letter-spacing: var(--tracking-label);
|
|
18
|
+
text-transform: uppercase; color: var(--text-faint);
|
|
19
|
+
}
|
|
20
|
+
.ax-msg__time { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint); opacity: 0.7; }
|
|
21
|
+
.ax-msg__body { font-size: var(--text-md); line-height: var(--leading-body); color: var(--text-body); min-width: 0; }
|
|
22
|
+
.ax-msg__body > p { margin: 0 0 0.7em; }
|
|
23
|
+
.ax-msg__body > p:last-child { margin-bottom: 0; }
|
|
24
|
+
.ax-msg__cursor {
|
|
25
|
+
display: inline-block; width: 0.55em; height: 1.05em;
|
|
26
|
+
background: currentColor; vertical-align: text-bottom; margin-left: 2px;
|
|
27
|
+
animation: ax-msg-blink 1.1s steps(1) infinite;
|
|
28
|
+
}
|
|
29
|
+
@keyframes ax-msg-blink { 50% { opacity: 0; } }
|
|
30
|
+
@media (prefers-reduced-motion: reduce) { .ax-msg__cursor { animation: none; } }
|
|
31
|
+
`;
|
|
32
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-msg-css")) {
|
|
33
|
+
const s = document.createElement("style");
|
|
34
|
+
s.id = "ax-msg-css";
|
|
35
|
+
s.textContent = AX_MSG_CSS;
|
|
36
|
+
document.head.appendChild(s);
|
|
37
|
+
}
|
|
38
|
+
function Message({
|
|
39
|
+
role = "assistant",
|
|
40
|
+
name,
|
|
41
|
+
time,
|
|
42
|
+
streaming = false,
|
|
43
|
+
children,
|
|
44
|
+
className = "",
|
|
45
|
+
...rest
|
|
46
|
+
}) {
|
|
47
|
+
const isUser = role === "user";
|
|
48
|
+
const cls = ["ax-msg", isUser ? "ax-msg--user" : "ax-msg--assistant", className].filter(Boolean).join(" ");
|
|
49
|
+
return /* @__PURE__ */ jsxs("div", { className: cls, ...rest, children: [
|
|
50
|
+
!isUser ? /* @__PURE__ */ jsxs("div", { className: "ax-msg__head", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "ax-msg__name", children: name || "Agentaily" }),
|
|
52
|
+
time ? /* @__PURE__ */ jsx("span", { className: "ax-msg__time", children: time }) : null
|
|
53
|
+
] }) : null,
|
|
54
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-msg__body", children: [
|
|
55
|
+
children,
|
|
56
|
+
streaming ? /* @__PURE__ */ jsx("span", { className: "ax-msg__cursor" }) : null
|
|
57
|
+
] })
|
|
58
|
+
] });
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
Message
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=Message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Message.js","sources":["../../../src/components/chat/Message.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_MSG_CSS = `\n.ax-msg { display: flex; flex-direction: column; }\n.ax-msg--user { align-items: flex-end; }\n.ax-msg--user .ax-msg__body {\n max-width: 78%;\n background: var(--surface-card);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-3);\n padding: 10px 14px;\n}\n.ax-msg--assistant { align-items: stretch; }\n.ax-msg__head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; }\n.ax-msg__name {\n font-family: var(--font-mono); font-size: var(--text-xs);\n font-weight: var(--weight-medium); letter-spacing: var(--tracking-label);\n text-transform: uppercase; color: var(--text-faint);\n}\n.ax-msg__time { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint); opacity: 0.7; }\n.ax-msg__body { font-size: var(--text-md); line-height: var(--leading-body); color: var(--text-body); min-width: 0; }\n.ax-msg__body > p { margin: 0 0 0.7em; }\n.ax-msg__body > p:last-child { margin-bottom: 0; }\n.ax-msg__cursor {\n display: inline-block; width: 0.55em; height: 1.05em;\n background: currentColor; vertical-align: text-bottom; margin-left: 2px;\n animation: ax-msg-blink 1.1s steps(1) infinite;\n}\n@keyframes ax-msg-blink { 50% { opacity: 0; } }\n@media (prefers-reduced-motion: reduce) { .ax-msg__cursor { animation: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-msg-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-msg-css\";\n s.textContent = AX_MSG_CSS;\n document.head.appendChild(s);\n}\n\nexport function Message({\n role = \"assistant\",\n name,\n time,\n streaming = false,\n children,\n className = \"\",\n ...rest\n}) {\n const isUser = role === \"user\";\n const cls = [\"ax-msg\", isUser ? \"ax-msg--user\" : \"ax-msg--assistant\", className].filter(Boolean).join(\" \");\n return (\n <div className={cls} {...rest}>\n {!isUser ? (\n <div className=\"ax-msg__head\">\n <span className=\"ax-msg__name\">{name || \"Agentaily\"}</span>\n {time ? <span className=\"ax-msg__time\">{time}</span> : null}\n </div>\n ) : null}\n <div className=\"ax-msg__body\">\n {children}\n {streaming ? <span className=\"ax-msg__cursor\"></span> : null}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,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;AA8BnB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,YAAY,GAAG;AAC7E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,QAAQ;AAAA,EACtB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,GAAG;AACD,QAAM,SAAS,SAAS;AACxB,QAAM,MAAM,CAAC,UAAU,SAAS,iBAAiB,qBAAqB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACzG,SACE,qBAAC,OAAA,EAAI,WAAW,KAAM,GAAG,MACtB,UAAA;AAAA,IAAA,CAAC,SACA,qBAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,gBAAgB,UAAA,QAAQ,aAAY;AAAA,MACnD,OAAO,oBAAC,QAAA,EAAK,WAAU,gBAAgB,gBAAK,IAAU;AAAA,IAAA,EAAA,CACzD,IACE;AAAA,IACJ,qBAAC,OAAA,EAAI,WAAU,gBACZ,UAAA;AAAA,MAAA;AAAA,MACA,YAAY,oBAAC,QAAA,EAAK,WAAU,kBAAiB,IAAU;AAAA,IAAA,EAAA,CAC1D;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Agent identity pill: square avatar, name, optional model tag, working/idle/error status. */
|
|
2
|
+
export interface AgentProps { name?: string; model?: string; status?: "working" | "idle" | "error"; task?: string; }
|
|
3
|
+
export declare function Agent(props: AgentProps): JSX.Element;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_AGENT_CSS = `
|
|
4
|
+
.ax-agent { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border: 1px solid var(--border-default); border-radius: var(--radius-full); background: var(--surface-card); }
|
|
5
|
+
.ax-agent__avatar { width: 26px; height: 26px; flex: none; border-radius: var(--radius-2); background: var(--accent); color: var(--accent-fg); display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 12px; font-weight: var(--weight-bold); }
|
|
6
|
+
.ax-agent__body { display: flex; flex-direction: column; min-width: 0; }
|
|
7
|
+
.ax-agent__name { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--text-body); display: flex; align-items: center; gap: 7px; }
|
|
8
|
+
.ax-agent__status { display: flex; align-items: center; gap: 5px; font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); }
|
|
9
|
+
.ax-agent__dot { width: 6px; height: 6px; border-radius: 1px; background: var(--text-faint); }
|
|
10
|
+
.ax-agent--working .ax-agent__dot { background: var(--warn); animation: ax-agent-pulse 1s var(--ease-out) infinite; }
|
|
11
|
+
.ax-agent--working .ax-agent__status { color: var(--warn); }
|
|
12
|
+
.ax-agent--idle .ax-agent__dot { background: var(--ok); }
|
|
13
|
+
.ax-agent--idle .ax-agent__status { color: var(--ok); }
|
|
14
|
+
.ax-agent__model { font-size: 10px; color: var(--text-faint); border: 1px solid var(--border-default); border-radius: var(--radius-1); padding: 1px 5px; }
|
|
15
|
+
@keyframes ax-agent-pulse { 50% { opacity: 0.35; } }
|
|
16
|
+
@media (prefers-reduced-motion: reduce) { .ax-agent--working .ax-agent__dot { animation: none; } }
|
|
17
|
+
`;
|
|
18
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-agent-css")) {
|
|
19
|
+
const s = document.createElement("style");
|
|
20
|
+
s.id = "ax-agent-css";
|
|
21
|
+
s.textContent = AX_AGENT_CSS;
|
|
22
|
+
document.head.appendChild(s);
|
|
23
|
+
}
|
|
24
|
+
const STATUS = { working: "Working", idle: "Ready", error: "Error" };
|
|
25
|
+
function Agent({ name = "agent", model, status = "idle", task, className = "", ...rest }) {
|
|
26
|
+
const initials = name.slice(0, 2).toUpperCase();
|
|
27
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-agent", "ax-agent--" + status, className].filter(Boolean).join(" "), ...rest, children: [
|
|
28
|
+
/* @__PURE__ */ jsx("span", { className: "ax-agent__avatar", children: initials }),
|
|
29
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-agent__body", children: [
|
|
30
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-agent__name", children: [
|
|
31
|
+
name,
|
|
32
|
+
model ? /* @__PURE__ */ jsx("span", { className: "ax-agent__model", children: model }) : null
|
|
33
|
+
] }),
|
|
34
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-agent__status", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("span", { className: "ax-agent__dot" }),
|
|
36
|
+
task || STATUS[status]
|
|
37
|
+
] })
|
|
38
|
+
] })
|
|
39
|
+
] });
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
Agent
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=Agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Agent.js","sources":["../../../src/components/code/Agent.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_AGENT_CSS = `\n.ax-agent { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border: 1px solid var(--border-default); border-radius: var(--radius-full); background: var(--surface-card); }\n.ax-agent__avatar { width: 26px; height: 26px; flex: none; border-radius: var(--radius-2); background: var(--accent); color: var(--accent-fg); display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 12px; font-weight: var(--weight-bold); }\n.ax-agent__body { display: flex; flex-direction: column; min-width: 0; }\n.ax-agent__name { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--text-body); display: flex; align-items: center; gap: 7px; }\n.ax-agent__status { display: flex; align-items: center; gap: 5px; font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); }\n.ax-agent__dot { width: 6px; height: 6px; border-radius: 1px; background: var(--text-faint); }\n.ax-agent--working .ax-agent__dot { background: var(--warn); animation: ax-agent-pulse 1s var(--ease-out) infinite; }\n.ax-agent--working .ax-agent__status { color: var(--warn); }\n.ax-agent--idle .ax-agent__dot { background: var(--ok); }\n.ax-agent--idle .ax-agent__status { color: var(--ok); }\n.ax-agent__model { font-size: 10px; color: var(--text-faint); border: 1px solid var(--border-default); border-radius: var(--radius-1); padding: 1px 5px; }\n@keyframes ax-agent-pulse { 50% { opacity: 0.35; } }\n@media (prefers-reduced-motion: reduce) { .ax-agent--working .ax-agent__dot { animation: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-agent-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-agent-css\";\n s.textContent = AX_AGENT_CSS;\n document.head.appendChild(s);\n}\n\nconst STATUS = { working: \"Working\", idle: \"Ready\", error: \"Error\" };\n\nexport function Agent({ name = \"agent\", model, status = \"idle\", task, className = \"\", ...rest }) {\n const initials = name.slice(0, 2).toUpperCase();\n return (\n <div className={[\"ax-agent\", \"ax-agent--\" + status, className].filter(Boolean).join(\" \")} {...rest}>\n <span className=\"ax-agent__avatar\">{initials}</span>\n <span className=\"ax-agent__body\">\n <span className=\"ax-agent__name\">{name}{model ? <span className=\"ax-agent__model\">{model}</span> : null}</span>\n <span className=\"ax-agent__status\"><span className=\"ax-agent__dot\"></span>{task || STATUS[status]}</span>\n </span>\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;AAEA,MAAM,SAAS,EAAE,SAAS,WAAW,MAAM,SAAS,OAAO,QAAA;AAEpD,SAAS,MAAM,EAAE,OAAO,SAAS,OAAO,SAAS,QAAQ,MAAM,YAAY,IAAI,GAAG,KAAA,GAAQ;AAC/F,QAAM,WAAW,KAAK,MAAM,GAAG,CAAC,EAAE,YAAA;AAClC,8BACG,OAAA,EAAI,WAAW,CAAC,YAAY,eAAe,QAAQ,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAC5F,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,WAAU,oBAAoB,UAAA,UAAS;AAAA,IAC7C,qBAAC,QAAA,EAAK,WAAU,kBACd,UAAA;AAAA,MAAA,qBAAC,QAAA,EAAK,WAAU,kBAAkB,UAAA;AAAA,QAAA;AAAA,QAAM,QAAQ,oBAAC,QAAA,EAAK,WAAU,mBAAmB,iBAAM,IAAU;AAAA,MAAA,GAAK;AAAA,MACxG,qBAAC,QAAA,EAAK,WAAU,oBAAmB,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,gBAAA,CAAgB;AAAA,QAAQ,QAAQ,OAAO,MAAM;AAAA,MAAA,EAAA,CAAE;AAAA,IAAA,EAAA,CACpG;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Generated artifact frame with Preview/Code tabs and an action slot. */
|
|
2
|
+
export interface ArtifactProps { title?: string; subtitle?: string; code?: string; preview?: React.ReactNode; defaultTab?: "preview" | "code"; actions?: React.ReactNode; }
|
|
3
|
+
export declare function Artifact(props: ArtifactProps): JSX.Element;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
const AX_ARTIFACT_CSS = `
|
|
4
|
+
.ax-artifact { border: 1px solid var(--border-strong); border-radius: var(--radius-3); overflow: hidden; background: var(--surface-card); }
|
|
5
|
+
.ax-artifact__head { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-bottom: 1px solid var(--border-default); }
|
|
6
|
+
.ax-artifact__icon { width: 16px; height: 16px; flex: none; color: var(--text-faint); }
|
|
7
|
+
.ax-artifact__meta { flex: 1; min-width: 0; }
|
|
8
|
+
.ax-artifact__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
9
|
+
.ax-artifact__sub { font-family: var(--font-mono); font-size: 10px; color: var(--text-faint); margin-top: 1px; }
|
|
10
|
+
.ax-artifact__tabs { display: flex; gap: 2px; padding: 2px; background: var(--surface-raised); border-radius: var(--radius-2); }
|
|
11
|
+
.ax-artifact__tab { appearance: none; background: none; border: none; cursor: pointer; padding: 4px 10px; border-radius: var(--radius-1); font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); }
|
|
12
|
+
.ax-artifact__tab--active { background: var(--surface-card); color: var(--text-body); }
|
|
13
|
+
.ax-artifact__actions { display: flex; gap: 2px; }
|
|
14
|
+
.ax-artifact__body { max-height: 280px; overflow: auto; }
|
|
15
|
+
.ax-artifact__preview { padding: 20px; background: var(--bg-0); min-height: 120px; }
|
|
16
|
+
[data-theme="light"] .ax-artifact__preview { background: var(--bg-1); }
|
|
17
|
+
.ax-artifact__pre { margin: 0; padding: 14px 16px; font-family: var(--font-mono); font-size: var(--text-sm); line-height: 1.6; color: var(--text-body); white-space: pre; overflow-x: auto; }
|
|
18
|
+
`;
|
|
19
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-artifact-css")) {
|
|
20
|
+
const s = document.createElement("style");
|
|
21
|
+
s.id = "ax-artifact-css";
|
|
22
|
+
s.textContent = AX_ARTIFACT_CSS;
|
|
23
|
+
document.head.appendChild(s);
|
|
24
|
+
}
|
|
25
|
+
const Box = /* @__PURE__ */ jsxs("svg", { className: "ax-artifact__icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
26
|
+
/* @__PURE__ */ jsx("path", { d: "M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z" }),
|
|
27
|
+
/* @__PURE__ */ jsx("path", { d: "m3.3 7 8.7 5 8.7-5M12 22V12" })
|
|
28
|
+
] });
|
|
29
|
+
function Artifact({ title = "Artifact", subtitle, code, preview, defaultTab = "preview", actions, className = "", ...rest }) {
|
|
30
|
+
const [tab, setTab] = useState(preview ? defaultTab : "code");
|
|
31
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-artifact", className].filter(Boolean).join(" "), ...rest, children: [
|
|
32
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-artifact__head", children: [
|
|
33
|
+
Box,
|
|
34
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-artifact__meta", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("p", { className: "ax-artifact__title", children: title }),
|
|
36
|
+
subtitle ? /* @__PURE__ */ jsx("p", { className: "ax-artifact__sub", children: subtitle }) : null
|
|
37
|
+
] }),
|
|
38
|
+
preview && code ? /* @__PURE__ */ jsxs("div", { className: "ax-artifact__tabs", children: [
|
|
39
|
+
/* @__PURE__ */ jsx("button", { className: "ax-artifact__tab" + (tab === "preview" ? " ax-artifact__tab--active" : ""), onClick: () => setTab("preview"), children: "Preview" }),
|
|
40
|
+
/* @__PURE__ */ jsx("button", { className: "ax-artifact__tab" + (tab === "code" ? " ax-artifact__tab--active" : ""), onClick: () => setTab("code"), children: "Code" })
|
|
41
|
+
] }) : null,
|
|
42
|
+
actions ? /* @__PURE__ */ jsx("div", { className: "ax-artifact__actions", children: actions }) : null
|
|
43
|
+
] }),
|
|
44
|
+
/* @__PURE__ */ jsx("div", { className: "ax-artifact__body", children: tab === "preview" && preview ? /* @__PURE__ */ jsx("div", { className: "ax-artifact__preview", children: preview }) : /* @__PURE__ */ jsx("pre", { className: "ax-artifact__pre", children: code }) })
|
|
45
|
+
] });
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
Artifact
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=Artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Artifact.js","sources":["../../../src/components/code/Artifact.jsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nconst AX_ARTIFACT_CSS = `\n.ax-artifact { border: 1px solid var(--border-strong); border-radius: var(--radius-3); overflow: hidden; background: var(--surface-card); }\n.ax-artifact__head { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-bottom: 1px solid var(--border-default); }\n.ax-artifact__icon { width: 16px; height: 16px; flex: none; color: var(--text-faint); }\n.ax-artifact__meta { flex: 1; min-width: 0; }\n.ax-artifact__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-artifact__sub { font-family: var(--font-mono); font-size: 10px; color: var(--text-faint); margin-top: 1px; }\n.ax-artifact__tabs { display: flex; gap: 2px; padding: 2px; background: var(--surface-raised); border-radius: var(--radius-2); }\n.ax-artifact__tab { appearance: none; background: none; border: none; cursor: pointer; padding: 4px 10px; border-radius: var(--radius-1); font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); }\n.ax-artifact__tab--active { background: var(--surface-card); color: var(--text-body); }\n.ax-artifact__actions { display: flex; gap: 2px; }\n.ax-artifact__body { max-height: 280px; overflow: auto; }\n.ax-artifact__preview { padding: 20px; background: var(--bg-0); min-height: 120px; }\n[data-theme=\"light\"] .ax-artifact__preview { background: var(--bg-1); }\n.ax-artifact__pre { margin: 0; padding: 14px 16px; font-family: var(--font-mono); font-size: var(--text-sm); line-height: 1.6; color: var(--text-body); white-space: pre; overflow-x: auto; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-artifact-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-artifact-css\";\n s.textContent = AX_ARTIFACT_CSS;\n document.head.appendChild(s);\n}\n\nconst Box = <svg className=\"ax-artifact__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"></path><path d=\"m3.3 7 8.7 5 8.7-5M12 22V12\"></path></svg>;\n\nexport function Artifact({ title = \"Artifact\", subtitle, code, preview, defaultTab = \"preview\", actions, className = \"\", ...rest }) {\n const [tab, setTab] = useState(preview ? defaultTab : \"code\");\n return (\n <div className={[\"ax-artifact\", className].filter(Boolean).join(\" \")} {...rest}>\n <div className=\"ax-artifact__head\">\n {Box}\n <div className=\"ax-artifact__meta\">\n <p className=\"ax-artifact__title\">{title}</p>\n {subtitle ? <p className=\"ax-artifact__sub\">{subtitle}</p> : null}\n </div>\n {preview && code ? (\n <div className=\"ax-artifact__tabs\">\n <button className={\"ax-artifact__tab\" + (tab === \"preview\" ? \" ax-artifact__tab--active\" : \"\")} onClick={() => setTab(\"preview\")}>Preview</button>\n <button className={\"ax-artifact__tab\" + (tab === \"code\" ? \" ax-artifact__tab--active\" : \"\")} onClick={() => setTab(\"code\")}>Code</button>\n </div>\n ) : null}\n {actions ? <div className=\"ax-artifact__actions\">{actions}</div> : null}\n </div>\n <div className=\"ax-artifact__body\">\n {tab === \"preview\" && preview ? <div className=\"ax-artifact__preview\">{preview}</div> : <pre className=\"ax-artifact__pre\">{code}</pre>}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBxB,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,MAAM,qBAAC,OAAA,EAAI,WAAU,qBAAoB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,GAAE,4HAAA,CAA4H;AAAA,EAAO,oBAAC,QAAA,EAAK,GAAE,8BAAA,CAA8B;AAAA,GAAO;AAEnV,SAAS,SAAS,EAAE,QAAQ,YAAY,UAAU,MAAM,SAAS,aAAa,WAAW,SAAS,YAAY,IAAI,GAAG,QAAQ;AAClI,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,UAAU,aAAa,MAAM;AAC5D,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACxE,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,MAAA;AAAA,MACD,qBAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,QAAA,oBAAC,KAAA,EAAE,WAAU,sBAAsB,UAAA,OAAM;AAAA,QACxC,WAAW,oBAAC,KAAA,EAAE,WAAU,oBAAoB,oBAAS,IAAO;AAAA,MAAA,GAC/D;AAAA,MACC,WAAW,OACV,qBAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,QAAA,oBAAC,UAAA,EAAO,WAAW,sBAAsB,QAAQ,YAAY,8BAA8B,KAAK,SAAS,MAAM,OAAO,SAAS,GAAG,UAAA,WAAO;AAAA,QACzI,oBAAC,UAAA,EAAO,WAAW,sBAAsB,QAAQ,SAAS,8BAA8B,KAAK,SAAS,MAAM,OAAO,MAAM,GAAG,UAAA,OAAA,CAAI;AAAA,MAAA,EAAA,CAClI,IACE;AAAA,MACH,UAAU,oBAAC,OAAA,EAAI,WAAU,wBAAwB,mBAAQ,IAAS;AAAA,IAAA,GACrE;AAAA,wBACC,OAAA,EAAI,WAAU,qBACZ,UAAA,QAAQ,aAAa,UAAU,oBAAC,OAAA,EAAI,WAAU,wBAAwB,mBAAQ,IAAS,oBAAC,SAAI,WAAU,oBAAoB,gBAAK,EAAA,CAClI;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Git commit row: graph node, message, hash, author, +/- stat. */
|
|
2
|
+
export interface CommitProps { message: React.ReactNode; hash?: string; author?: string; time?: string; additions?: number; deletions?: number; connected?: boolean; }
|
|
3
|
+
export declare function Commit(props: CommitProps): JSX.Element;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_COMMIT_CSS = `
|
|
4
|
+
.ax-commit { display: flex; gap: 12px; padding: 10px 12px; border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); font-family: var(--font-mono); }
|
|
5
|
+
.ax-commit__graph { display: flex; flex-direction: column; align-items: center; flex: none; padding-top: 2px; }
|
|
6
|
+
.ax-commit__node { width: 10px; height: 10px; border-radius: var(--radius-1); border: 2px solid var(--text-muted); background: var(--surface-card); }
|
|
7
|
+
.ax-commit__line { width: 2px; flex: 1; background: var(--border-strong); margin-top: 2px; min-height: 8px; }
|
|
8
|
+
.ax-commit__body { flex: 1; min-width: 0; }
|
|
9
|
+
.ax-commit__msg { font-family: var(--font-body); font-size: var(--text-sm); color: var(--text-body); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
10
|
+
.ax-commit__meta { display: flex; align-items: center; gap: 8px; margin-top: 4px; font-size: 11px; color: var(--text-faint); }
|
|
11
|
+
.ax-commit__hash { color: var(--text-muted); background: var(--surface-raised); padding: 0 5px; border-radius: var(--radius-1); }
|
|
12
|
+
.ax-commit__author { color: var(--text-faint); }
|
|
13
|
+
.ax-commit__stat { display: inline-flex; gap: 6px; margin-left: auto; }
|
|
14
|
+
.ax-commit__add { color: var(--ok); }
|
|
15
|
+
.ax-commit__del { color: var(--danger); }
|
|
16
|
+
`;
|
|
17
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-commit-css")) {
|
|
18
|
+
const s = document.createElement("style");
|
|
19
|
+
s.id = "ax-commit-css";
|
|
20
|
+
s.textContent = AX_COMMIT_CSS;
|
|
21
|
+
document.head.appendChild(s);
|
|
22
|
+
}
|
|
23
|
+
function Commit({ message, hash, author, time, additions, deletions, connected = false, className = "", ...rest }) {
|
|
24
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-commit", className].filter(Boolean).join(" "), ...rest, children: [
|
|
25
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-commit__graph", children: [
|
|
26
|
+
/* @__PURE__ */ jsx("span", { className: "ax-commit__node" }),
|
|
27
|
+
connected ? /* @__PURE__ */ jsx("span", { className: "ax-commit__line" }) : null
|
|
28
|
+
] }),
|
|
29
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-commit__body", children: [
|
|
30
|
+
/* @__PURE__ */ jsx("p", { className: "ax-commit__msg", children: message }),
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-commit__meta", children: [
|
|
32
|
+
hash ? /* @__PURE__ */ jsx("span", { className: "ax-commit__hash", children: hash }) : null,
|
|
33
|
+
author ? /* @__PURE__ */ jsx("span", { className: "ax-commit__author", children: author }) : null,
|
|
34
|
+
time ? /* @__PURE__ */ jsxs("span", { className: "ax-commit__author", children: [
|
|
35
|
+
"· ",
|
|
36
|
+
time
|
|
37
|
+
] }) : null,
|
|
38
|
+
additions != null || deletions != null ? /* @__PURE__ */ jsxs("span", { className: "ax-commit__stat", children: [
|
|
39
|
+
additions != null ? /* @__PURE__ */ jsxs("span", { className: "ax-commit__add", children: [
|
|
40
|
+
"+",
|
|
41
|
+
additions
|
|
42
|
+
] }) : null,
|
|
43
|
+
deletions != null ? /* @__PURE__ */ jsxs("span", { className: "ax-commit__del", children: [
|
|
44
|
+
"−",
|
|
45
|
+
deletions
|
|
46
|
+
] }) : null
|
|
47
|
+
] }) : null
|
|
48
|
+
] })
|
|
49
|
+
] })
|
|
50
|
+
] });
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
Commit
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=Commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Commit.js","sources":["../../../src/components/code/Commit.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_COMMIT_CSS = `\n.ax-commit { display: flex; gap: 12px; padding: 10px 12px; border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); font-family: var(--font-mono); }\n.ax-commit__graph { display: flex; flex-direction: column; align-items: center; flex: none; padding-top: 2px; }\n.ax-commit__node { width: 10px; height: 10px; border-radius: var(--radius-1); border: 2px solid var(--text-muted); background: var(--surface-card); }\n.ax-commit__line { width: 2px; flex: 1; background: var(--border-strong); margin-top: 2px; min-height: 8px; }\n.ax-commit__body { flex: 1; min-width: 0; }\n.ax-commit__msg { font-family: var(--font-body); font-size: var(--text-sm); color: var(--text-body); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-commit__meta { display: flex; align-items: center; gap: 8px; margin-top: 4px; font-size: 11px; color: var(--text-faint); }\n.ax-commit__hash { color: var(--text-muted); background: var(--surface-raised); padding: 0 5px; border-radius: var(--radius-1); }\n.ax-commit__author { color: var(--text-faint); }\n.ax-commit__stat { display: inline-flex; gap: 6px; margin-left: auto; }\n.ax-commit__add { color: var(--ok); }\n.ax-commit__del { color: var(--danger); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-commit-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-commit-css\";\n s.textContent = AX_COMMIT_CSS;\n document.head.appendChild(s);\n}\n\nexport function Commit({ message, hash, author, time, additions, deletions, connected = false, className = \"\", ...rest }) {\n return (\n <div className={[\"ax-commit\", className].filter(Boolean).join(\" \")} {...rest}>\n <div className=\"ax-commit__graph\">\n <span className=\"ax-commit__node\"></span>\n {connected ? <span className=\"ax-commit__line\"></span> : null}\n </div>\n <div className=\"ax-commit__body\">\n <p className=\"ax-commit__msg\">{message}</p>\n <div className=\"ax-commit__meta\">\n {hash ? <span className=\"ax-commit__hash\">{hash}</span> : null}\n {author ? <span className=\"ax-commit__author\">{author}</span> : null}\n {time ? <span className=\"ax-commit__author\">· {time}</span> : null}\n {(additions != null || deletions != null) ? (\n <span className=\"ax-commit__stat\">\n {additions != null ? <span className=\"ax-commit__add\">+{additions}</span> : null}\n {deletions != null ? <span className=\"ax-commit__del\">−{deletions}</span> : null}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAetB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,eAAe,GAAG;AAChF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,OAAO,EAAE,SAAS,MAAM,QAAQ,MAAM,WAAW,WAAW,YAAY,OAAO,YAAY,IAAI,GAAG,QAAQ;AACxH,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACtE,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,kBAAA,CAAkB;AAAA,MACjC,YAAY,oBAAC,QAAA,EAAK,WAAU,mBAAkB,IAAU;AAAA,IAAA,GAC3D;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,MAAA,oBAAC,KAAA,EAAE,WAAU,kBAAkB,UAAA,SAAQ;AAAA,MACvC,qBAAC,OAAA,EAAI,WAAU,mBACZ,UAAA;AAAA,QAAA,OAAO,oBAAC,QAAA,EAAK,WAAU,mBAAmB,gBAAK,IAAU;AAAA,QACzD,SAAS,oBAAC,QAAA,EAAK,WAAU,qBAAqB,kBAAO,IAAU;AAAA,QAC/D,OAAO,qBAAC,QAAA,EAAK,WAAU,qBAAoB,UAAA;AAAA,UAAA;AAAA,UAAG;AAAA,QAAA,EAAA,CAAK,IAAU;AAAA,QAC5D,aAAa,QAAQ,aAAa,OAClC,qBAAC,QAAA,EAAK,WAAU,mBACb,UAAA;AAAA,UAAA,aAAa,OAAO,qBAAC,QAAA,EAAK,WAAU,kBAAiB,UAAA;AAAA,YAAA;AAAA,YAAE;AAAA,UAAA,EAAA,CAAU,IAAU;AAAA,UAC3E,aAAa,OAAO,qBAAC,QAAA,EAAK,WAAU,kBAAiB,UAAA;AAAA,YAAA;AAAA,YAAE;AAAA,UAAA,EAAA,CAAU,IAAU;AAAA,QAAA,EAAA,CAC9E,IACE;AAAA,MAAA,EAAA,CACN;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Env var table with masked secret values and a reveal toggle. */
|
|
2
|
+
export interface EnvVar { key: string; value: string; secret?: boolean; }
|
|
3
|
+
export interface EnvironmentVariablesProps { title?: string; vars: Array<EnvVar | [string, string]>; }
|
|
4
|
+
export declare function EnvironmentVariables(props: EnvironmentVariablesProps): JSX.Element;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
const AX_ENVVARS_CSS = `
|
|
4
|
+
.ax-envvars { border: 1px solid var(--border-default); border-radius: var(--radius-3); overflow: hidden; background: var(--surface-card); font-family: var(--font-mono); }
|
|
5
|
+
.ax-envvars__head { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--border-default); }
|
|
6
|
+
.ax-envvars__title { font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); flex: 1; }
|
|
7
|
+
.ax-envvars__reveal { appearance: none; background: none; border: 1px solid var(--border-default); cursor: pointer; color: var(--text-faint); font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase; padding: 3px 7px; border-radius: var(--radius-1); }
|
|
8
|
+
.ax-envvars__reveal:hover { color: var(--text-body); border-color: var(--border-strong); }
|
|
9
|
+
.ax-envvars__row { display: flex; align-items: center; gap: 12px; padding: 8px 12px; border-bottom: 1px solid var(--border-default); }
|
|
10
|
+
.ax-envvars__row:last-child { border-bottom: none; }
|
|
11
|
+
.ax-envvars__key { color: var(--text-body); font-size: var(--text-sm); flex: none; min-width: 140px; }
|
|
12
|
+
.ax-envvars__val { color: var(--text-muted); font-size: var(--text-sm); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
13
|
+
.ax-envvars__val--hidden { letter-spacing: 1px; }
|
|
14
|
+
.ax-envvars__copy { appearance: none; background: none; border: none; cursor: pointer; color: var(--text-faint); font-size: 11px; padding: 2px 5px; border-radius: var(--radius-1); flex: none; }
|
|
15
|
+
.ax-envvars__copy:hover { color: var(--text-body); }
|
|
16
|
+
`;
|
|
17
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-envvars-css")) {
|
|
18
|
+
const s = document.createElement("style");
|
|
19
|
+
s.id = "ax-envvars-css";
|
|
20
|
+
s.textContent = AX_ENVVARS_CSS;
|
|
21
|
+
document.head.appendChild(s);
|
|
22
|
+
}
|
|
23
|
+
function EnvironmentVariables({ title = "Environment", vars = [], className = "", ...rest }) {
|
|
24
|
+
const [reveal, setReveal] = useState(false);
|
|
25
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-envvars", className].filter(Boolean).join(" "), ...rest, children: [
|
|
26
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-envvars__head", children: [
|
|
27
|
+
/* @__PURE__ */ jsx("span", { className: "ax-envvars__title", children: title }),
|
|
28
|
+
/* @__PURE__ */ jsx("button", { className: "ax-envvars__reveal", onClick: () => setReveal((r) => !r), children: reveal ? "Hide" : "Reveal" })
|
|
29
|
+
] }),
|
|
30
|
+
vars.map((v, i) => {
|
|
31
|
+
const item = Array.isArray(v) ? { key: v[0], value: v[1] } : v;
|
|
32
|
+
const secret = item.secret !== false;
|
|
33
|
+
return /* @__PURE__ */ jsxs("div", { className: "ax-envvars__row", children: [
|
|
34
|
+
/* @__PURE__ */ jsx("span", { className: "ax-envvars__key", children: item.key }),
|
|
35
|
+
/* @__PURE__ */ jsx("span", { className: "ax-envvars__val" + (secret && !reveal ? " ax-envvars__val--hidden" : ""), children: secret && !reveal ? "••••••••••••" : item.value }),
|
|
36
|
+
/* @__PURE__ */ jsx("button", { className: "ax-envvars__copy", onClick: () => {
|
|
37
|
+
try {
|
|
38
|
+
navigator.clipboard && navigator.clipboard.writeText(item.value);
|
|
39
|
+
} catch (e) {
|
|
40
|
+
}
|
|
41
|
+
}, children: "copy" })
|
|
42
|
+
] }, i);
|
|
43
|
+
})
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
EnvironmentVariables
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=EnvironmentVariables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentVariables.js","sources":["../../../src/components/code/EnvironmentVariables.jsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nconst AX_ENVVARS_CSS = `\n.ax-envvars { border: 1px solid var(--border-default); border-radius: var(--radius-3); overflow: hidden; background: var(--surface-card); font-family: var(--font-mono); }\n.ax-envvars__head { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--border-default); }\n.ax-envvars__title { font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); flex: 1; }\n.ax-envvars__reveal { appearance: none; background: none; border: 1px solid var(--border-default); cursor: pointer; color: var(--text-faint); font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase; padding: 3px 7px; border-radius: var(--radius-1); }\n.ax-envvars__reveal:hover { color: var(--text-body); border-color: var(--border-strong); }\n.ax-envvars__row { display: flex; align-items: center; gap: 12px; padding: 8px 12px; border-bottom: 1px solid var(--border-default); }\n.ax-envvars__row:last-child { border-bottom: none; }\n.ax-envvars__key { color: var(--text-body); font-size: var(--text-sm); flex: none; min-width: 140px; }\n.ax-envvars__val { color: var(--text-muted); font-size: var(--text-sm); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-envvars__val--hidden { letter-spacing: 1px; }\n.ax-envvars__copy { appearance: none; background: none; border: none; cursor: pointer; color: var(--text-faint); font-size: 11px; padding: 2px 5px; border-radius: var(--radius-1); flex: none; }\n.ax-envvars__copy:hover { color: var(--text-body); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-envvars-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-envvars-css\";\n s.textContent = AX_ENVVARS_CSS;\n document.head.appendChild(s);\n}\n\nexport function EnvironmentVariables({ title = \"Environment\", vars = [], className = \"\", ...rest }) {\n const [reveal, setReveal] = useState(false);\n return (\n <div className={[\"ax-envvars\", className].filter(Boolean).join(\" \")} {...rest}>\n <div className=\"ax-envvars__head\">\n <span className=\"ax-envvars__title\">{title}</span>\n <button className=\"ax-envvars__reveal\" onClick={() => setReveal((r) => !r)}>{reveal ? \"Hide\" : \"Reveal\"}</button>\n </div>\n {vars.map((v, i) => {\n const item = Array.isArray(v) ? { key: v[0], value: v[1] } : v;\n const secret = item.secret !== false;\n return (\n <div className=\"ax-envvars__row\" key={i}>\n <span className=\"ax-envvars__key\">{item.key}</span>\n <span className={\"ax-envvars__val\" + (secret && !reveal ? \" ax-envvars__val--hidden\" : \"\")}>\n {secret && !reveal ? \"••••••••••••\" : item.value}\n </span>\n <button className=\"ax-envvars__copy\" onClick={() => { try { navigator.clipboard && navigator.clipboard.writeText(item.value); } catch (e) {} }}>copy</button>\n </div>\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;AAevB,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,qBAAqB,EAAE,QAAQ,eAAe,OAAO,CAAA,GAAI,YAAY,IAAI,GAAG,QAAQ;AAClG,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACvE,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,qBAAqB,UAAA,OAAM;AAAA,MAC3C,oBAAC,UAAA,EAAO,WAAU,sBAAqB,SAAS,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC,GAAI,UAAA,SAAS,SAAS,SAAA,CAAS;AAAA,IAAA,GAC1G;AAAA,IACC,KAAK,IAAI,CAAC,GAAG,MAAM;AAClB,YAAM,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,MAAM;AAC7D,YAAM,SAAS,KAAK,WAAW;AAC/B,aACE,qBAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,mBAAmB,UAAA,KAAK,KAAI;AAAA,QAC5C,oBAAC,QAAA,EAAK,WAAW,qBAAqB,UAAU,CAAC,SAAS,6BAA6B,KACpF,UAAA,UAAU,CAAC,SAAS,iBAAiB,KAAK,OAC7C;AAAA,QACA,oBAAC,UAAA,EAAO,WAAU,oBAAmB,SAAS,MAAM;AAAE,cAAI;AAAE,sBAAU,aAAa,UAAU,UAAU,UAAU,KAAK,KAAK;AAAA,UAAG,SAAS,GAAG;AAAA,UAAC;AAAA,QAAE,GAAG,UAAA,OAAA,CAAI;AAAA,MAAA,EAAA,GALhH,CAMtC;AAAA,IAEJ,CAAC;AAAA,EAAA,GACH;AAEJ;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Collapsible file tree with folder/file icons and git status badges (add/mod/del). */
|
|
2
|
+
export interface FileNode { name: string; type?: "dir" | "file"; path?: string; status?: "add" | "mod" | "del"; defaultOpen?: boolean; children?: FileNode[]; }
|
|
3
|
+
export interface FileTreeProps { tree: FileNode[]; activePath?: string; onSelect?: (path: string) => void; }
|
|
4
|
+
export declare function FileTree(props: FileTreeProps): JSX.Element;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState } from "react";
|
|
3
|
+
const AX_FILETREE_CSS = `
|
|
4
|
+
.ax-filetree { border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); padding: 8px; font-family: var(--font-mono); font-size: var(--text-sm); }
|
|
5
|
+
.ax-filetree__row { display: flex; align-items: center; gap: 7px; padding: 4px 6px; border-radius: var(--radius-1); cursor: pointer; color: var(--text-muted); user-select: none; transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }
|
|
6
|
+
.ax-filetree__row:hover { background: var(--surface-raised); color: var(--text-body); }
|
|
7
|
+
.ax-filetree__row--active { background: var(--surface-raised); color: var(--text-body); }
|
|
8
|
+
.ax-filetree__row--active::before { content: ""; position: absolute; }
|
|
9
|
+
.ax-filetree__chev { width: 12px; height: 12px; flex: none; color: var(--text-faint); transition: transform var(--dur-1) var(--ease-out); }
|
|
10
|
+
.ax-filetree__chev--open { transform: rotate(90deg); }
|
|
11
|
+
.ax-filetree__chev--spacer { visibility: hidden; }
|
|
12
|
+
.ax-filetree__icon { width: 14px; height: 14px; flex: none; color: var(--text-faint); }
|
|
13
|
+
.ax-filetree__name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
14
|
+
.ax-filetree__badge { font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase; padding: 1px 4px; border-radius: var(--radius-1); }
|
|
15
|
+
.ax-filetree__badge--add { color: var(--ok); background: var(--ok-dim); }
|
|
16
|
+
.ax-filetree__badge--mod { color: var(--warn); background: var(--warn-dim); }
|
|
17
|
+
.ax-filetree__badge--del { color: var(--danger); background: var(--danger-dim); }
|
|
18
|
+
`;
|
|
19
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-filetree-css")) {
|
|
20
|
+
const s = document.createElement("style");
|
|
21
|
+
s.id = "ax-filetree-css";
|
|
22
|
+
s.textContent = AX_FILETREE_CSS;
|
|
23
|
+
document.head.appendChild(s);
|
|
24
|
+
}
|
|
25
|
+
const Folder = /* @__PURE__ */ jsx("svg", { className: "ax-filetree__icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" }) });
|
|
26
|
+
const FileIcon = /* @__PURE__ */ jsxs("svg", { className: "ax-filetree__icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
27
|
+
/* @__PURE__ */ jsx("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z" }),
|
|
28
|
+
/* @__PURE__ */ jsx("path", { d: "M14 2v6h6" })
|
|
29
|
+
] });
|
|
30
|
+
const Chev = /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.4", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" }) });
|
|
31
|
+
function Node({ node, depth, activePath, onSelect }) {
|
|
32
|
+
const [open, setOpen] = useState(node.defaultOpen !== false);
|
|
33
|
+
const isDir = node.type === "dir" || node.children;
|
|
34
|
+
const pad = { paddingLeft: 6 + depth * 14 };
|
|
35
|
+
return /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
36
|
+
/* @__PURE__ */ jsxs(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
className: "ax-filetree__row" + (activePath === node.path ? " ax-filetree__row--active" : ""),
|
|
40
|
+
style: pad,
|
|
41
|
+
onClick: () => isDir ? setOpen((o) => !o) : onSelect && onSelect(node.path || node.name),
|
|
42
|
+
children: [
|
|
43
|
+
isDir ? /* @__PURE__ */ jsx("span", { className: "ax-filetree__chev" + (open ? " ax-filetree__chev--open" : ""), children: Chev }) : /* @__PURE__ */ jsx("span", { className: "ax-filetree__chev ax-filetree__chev--spacer", children: Chev }),
|
|
44
|
+
isDir ? Folder : FileIcon,
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: "ax-filetree__name", children: node.name }),
|
|
46
|
+
node.status ? /* @__PURE__ */ jsx("span", { className: "ax-filetree__badge ax-filetree__badge--" + node.status, children: node.status === "add" ? "A" : node.status === "mod" ? "M" : "D" }) : null
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
isDir && open && node.children ? node.children.map((c, i) => /* @__PURE__ */ jsx(Node, { node: c, depth: depth + 1, activePath, onSelect }, i)) : null
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
function FileTree({ tree = [], activePath, onSelect, className = "", ...rest }) {
|
|
54
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-filetree", className].filter(Boolean).join(" "), ...rest, children: tree.map((n, i) => /* @__PURE__ */ jsx(Node, { node: n, depth: 0, activePath, onSelect }, i)) });
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
FileTree
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=FileTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileTree.js","sources":["../../../src/components/code/FileTree.jsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nconst AX_FILETREE_CSS = `\n.ax-filetree { border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); padding: 8px; font-family: var(--font-mono); font-size: var(--text-sm); }\n.ax-filetree__row { display: flex; align-items: center; gap: 7px; padding: 4px 6px; border-radius: var(--radius-1); cursor: pointer; color: var(--text-muted); user-select: none; transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }\n.ax-filetree__row:hover { background: var(--surface-raised); color: var(--text-body); }\n.ax-filetree__row--active { background: var(--surface-raised); color: var(--text-body); }\n.ax-filetree__row--active::before { content: \"\"; position: absolute; }\n.ax-filetree__chev { width: 12px; height: 12px; flex: none; color: var(--text-faint); transition: transform var(--dur-1) var(--ease-out); }\n.ax-filetree__chev--open { transform: rotate(90deg); }\n.ax-filetree__chev--spacer { visibility: hidden; }\n.ax-filetree__icon { width: 14px; height: 14px; flex: none; color: var(--text-faint); }\n.ax-filetree__name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-filetree__badge { font-size: 9px; letter-spacing: 0.06em; text-transform: uppercase; padding: 1px 4px; border-radius: var(--radius-1); }\n.ax-filetree__badge--add { color: var(--ok); background: var(--ok-dim); }\n.ax-filetree__badge--mod { color: var(--warn); background: var(--warn-dim); }\n.ax-filetree__badge--del { color: var(--danger); background: var(--danger-dim); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-filetree-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-filetree-css\";\n s.textContent = AX_FILETREE_CSS;\n document.head.appendChild(s);\n}\n\nconst Folder = <svg className=\"ax-filetree__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"></path></svg>;\nconst FileIcon = <svg className=\"ax-filetree__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z\"></path><path d=\"M14 2v6h6\"></path></svg>;\nconst Chev = <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"m9 18 6-6-6-6\"></path></svg>;\n\nfunction Node({ node, depth, activePath, onSelect }) {\n const [open, setOpen] = useState(node.defaultOpen !== false);\n const isDir = node.type === \"dir\" || node.children;\n const pad = { paddingLeft: 6 + depth * 14 };\n return (\n <React.Fragment>\n <div\n className={\"ax-filetree__row\" + (activePath === node.path ? \" ax-filetree__row--active\" : \"\")}\n style={pad}\n onClick={() => isDir ? setOpen((o) => !o) : onSelect && onSelect(node.path || node.name)}\n >\n {isDir\n ? <span className={\"ax-filetree__chev\" + (open ? \" ax-filetree__chev--open\" : \"\")}>{Chev}</span>\n : <span className=\"ax-filetree__chev ax-filetree__chev--spacer\">{Chev}</span>}\n {isDir ? Folder : FileIcon}\n <span className=\"ax-filetree__name\">{node.name}</span>\n {node.status ? <span className={\"ax-filetree__badge ax-filetree__badge--\" + node.status}>{node.status === \"add\" ? \"A\" : node.status === \"mod\" ? \"M\" : \"D\"}</span> : null}\n </div>\n {isDir && open && node.children ? node.children.map((c, i) => (\n <Node key={i} node={c} depth={depth + 1} activePath={activePath} onSelect={onSelect} />\n )) : null}\n </React.Fragment>\n );\n}\n\nexport function FileTree({ tree = [], activePath, onSelect, className = \"\", ...rest }) {\n return (\n <div className={[\"ax-filetree\", className].filter(Boolean).join(\" \")} {...rest}>\n {tree.map((n, i) => <Node key={i} node={n} depth={0} activePath={activePath} onSelect={onSelect} />)}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBxB,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,6BAAU,OAAA,EAAI,WAAU,qBAAoB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA,oBAAC,QAAA,EAAK,GAAE,yHAAA,CAAyH,EAAA,CAAO;AAC7S,MAAM,WAAW,qBAAC,OAAA,EAAI,WAAU,qBAAoB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,GAAE,6DAAA,CAA6D;AAAA,EAAO,oBAAC,QAAA,EAAK,GAAE,YAAA,CAAY;AAAA,GAAO;AAC9Q,MAAM,OAAO,oBAAC,OAAA,EAAI,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,8BAAC,QAAA,EAAK,GAAE,iBAAgB,GAAO;AAEtK,SAAS,KAAK,EAAE,MAAM,OAAO,YAAY,YAAY;AACnD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK,gBAAgB,KAAK;AAC3D,QAAM,QAAQ,KAAK,SAAS,SAAS,KAAK;AAC1C,QAAM,MAAM,EAAE,aAAa,IAAI,QAAQ,GAAA;AACvC,SACE,qBAAC,MAAM,UAAN,EACC,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,sBAAsB,eAAe,KAAK,OAAO,8BAA8B;AAAA,QAC1F,OAAO;AAAA,QACP,SAAS,MAAM,QAAQ,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,YAAY,SAAS,KAAK,QAAQ,KAAK,IAAI;AAAA,QAEtF,UAAA;AAAA,UAAA,QACG,oBAAC,QAAA,EAAK,WAAW,uBAAuB,OAAO,6BAA6B,KAAM,UAAA,KAAA,CAAK,IACvF,oBAAC,QAAA,EAAK,WAAU,+CAA+C,UAAA,MAAK;AAAA,UACvE,QAAQ,SAAS;AAAA,UAClB,oBAAC,QAAA,EAAK,WAAU,qBAAqB,eAAK,MAAK;AAAA,UAC9C,KAAK,SAAS,oBAAC,QAAA,EAAK,WAAW,4CAA4C,KAAK,QAAS,UAAA,KAAK,WAAW,QAAQ,MAAM,KAAK,WAAW,QAAQ,MAAM,KAAI,IAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAErK,SAAS,QAAQ,KAAK,WAAW,KAAK,SAAS,IAAI,CAAC,GAAG,0BACrD,MAAA,EAAa,MAAM,GAAG,OAAO,QAAQ,GAAG,YAAwB,SAAA,GAAtD,CAA0E,CACtF,IAAI;AAAA,EAAA,GACP;AAEJ;AAEO,SAAS,SAAS,EAAE,OAAO,CAAA,GAAI,YAAY,UAAU,YAAY,IAAI,GAAG,QAAQ;AACrF,SACE,oBAAC,OAAA,EAAI,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACvE,UAAA,KAAK,IAAI,CAAC,GAAG,MAAM,oBAAC,MAAA,EAAa,MAAM,GAAG,OAAO,GAAG,YAAwB,SAAA,GAA9C,CAAkE,CAAE,EAAA,CACrG;AAEJ;"}
|