@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,58 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_RADIO_CSS = `
|
|
4
|
+
.ax-radiogroup { display: flex; flex-direction: column; gap: 10px; }
|
|
5
|
+
.ax-radiogroup--row { flex-direction: row; gap: 18px; flex-wrap: wrap; }
|
|
6
|
+
.ax-radio { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }
|
|
7
|
+
.ax-radio input { position: absolute; opacity: 0; width: 0; height: 0; }
|
|
8
|
+
.ax-radio__dot {
|
|
9
|
+
width: 16px; height: 16px; flex: none; position: relative;
|
|
10
|
+
background: var(--surface-card); border: 1px solid var(--border-strong);
|
|
11
|
+
border-radius: var(--radius-1);
|
|
12
|
+
transition: border-color var(--dur-1) var(--ease-out);
|
|
13
|
+
}
|
|
14
|
+
.ax-radio__dot::after {
|
|
15
|
+
content: ""; position: absolute; inset: 3px; background: var(--accent);
|
|
16
|
+
border-radius: 1px; opacity: 0; transform: scale(0.4);
|
|
17
|
+
transition: opacity var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out);
|
|
18
|
+
}
|
|
19
|
+
.ax-radio input:checked + .ax-radio__dot { border-color: var(--accent); }
|
|
20
|
+
.ax-radio input:checked + .ax-radio__dot::after { opacity: 1; transform: scale(1); }
|
|
21
|
+
.ax-radio input:focus-visible + .ax-radio__dot { box-shadow: var(--ring); }
|
|
22
|
+
.ax-radio input:disabled + .ax-radio__dot { opacity: 0.4; }
|
|
23
|
+
.ax-radio__label { font-size: var(--text-sm); color: var(--text-body); }
|
|
24
|
+
.ax-radio__desc { display: block; font-size: var(--text-xs); color: var(--text-faint); margin-top: 1px; }
|
|
25
|
+
`;
|
|
26
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-radio-css")) {
|
|
27
|
+
const s = document.createElement("style");
|
|
28
|
+
s.id = "ax-radio-css";
|
|
29
|
+
s.textContent = AX_RADIO_CSS;
|
|
30
|
+
document.head.appendChild(s);
|
|
31
|
+
}
|
|
32
|
+
function RadioGroup({ name, value, options = [], onChange, row = false, className = "", ...rest }) {
|
|
33
|
+
return /* @__PURE__ */ jsx("div", { role: "radiogroup", className: ["ax-radiogroup", row ? "ax-radiogroup--row" : "", className].filter(Boolean).join(" "), ...rest, children: options.map((opt) => {
|
|
34
|
+
const o = typeof opt === "string" ? { value: opt, label: opt } : opt;
|
|
35
|
+
return /* @__PURE__ */ jsxs("label", { className: "ax-radio", children: [
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
"input",
|
|
38
|
+
{
|
|
39
|
+
type: "radio",
|
|
40
|
+
name,
|
|
41
|
+
value: o.value,
|
|
42
|
+
checked: value === o.value,
|
|
43
|
+
disabled: o.disabled,
|
|
44
|
+
onChange: () => onChange && onChange(o.value)
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
/* @__PURE__ */ jsx("span", { className: "ax-radio__dot" }),
|
|
48
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-radio__label", children: [
|
|
49
|
+
o.label,
|
|
50
|
+
o.description ? /* @__PURE__ */ jsx("span", { className: "ax-radio__desc", children: o.description }) : null
|
|
51
|
+
] })
|
|
52
|
+
] }, o.value);
|
|
53
|
+
}) });
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
RadioGroup
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=RadioGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","sources":["../../../src/components/inputs/RadioGroup.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_RADIO_CSS = `\n.ax-radiogroup { display: flex; flex-direction: column; gap: 10px; }\n.ax-radiogroup--row { flex-direction: row; gap: 18px; flex-wrap: wrap; }\n.ax-radio { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }\n.ax-radio input { position: absolute; opacity: 0; width: 0; height: 0; }\n.ax-radio__dot {\n width: 16px; height: 16px; flex: none; position: relative;\n background: var(--surface-card); border: 1px solid var(--border-strong);\n border-radius: var(--radius-1);\n transition: border-color var(--dur-1) var(--ease-out);\n}\n.ax-radio__dot::after {\n content: \"\"; position: absolute; inset: 3px; background: var(--accent);\n border-radius: 1px; opacity: 0; transform: scale(0.4);\n transition: opacity var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out);\n}\n.ax-radio input:checked + .ax-radio__dot { border-color: var(--accent); }\n.ax-radio input:checked + .ax-radio__dot::after { opacity: 1; transform: scale(1); }\n.ax-radio input:focus-visible + .ax-radio__dot { box-shadow: var(--ring); }\n.ax-radio input:disabled + .ax-radio__dot { opacity: 0.4; }\n.ax-radio__label { font-size: var(--text-sm); color: var(--text-body); }\n.ax-radio__desc { display: block; font-size: var(--text-xs); color: var(--text-faint); margin-top: 1px; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-radio-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-radio-css\";\n s.textContent = AX_RADIO_CSS;\n document.head.appendChild(s);\n}\n\nexport function RadioGroup({ name, value, options = [], onChange, row = false, className = \"\", ...rest }) {\n return (\n <div role=\"radiogroup\" className={[\"ax-radiogroup\", row ? \"ax-radiogroup--row\" : \"\", className].filter(Boolean).join(\" \")} {...rest}>\n {options.map((opt) => {\n const o = typeof opt === \"string\" ? { value: opt, label: opt } : opt;\n return (\n <label className=\"ax-radio\" key={o.value}>\n <input\n type=\"radio\"\n name={name}\n value={o.value}\n checked={value === o.value}\n disabled={o.disabled}\n onChange={() => onChange && onChange(o.value)}\n />\n <span className=\"ax-radio__dot\"></span>\n <span className=\"ax-radio__label\">\n {o.label}\n {o.description ? <span className=\"ax-radio__desc\">{o.description}</span> : null}\n </span>\n </label>\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBrB,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,WAAW,EAAE,MAAM,OAAO,UAAU,CAAA,GAAI,UAAU,MAAM,OAAO,YAAY,IAAI,GAAG,QAAQ;AACxG,SACE,oBAAC,SAAI,MAAK,cAAa,WAAW,CAAC,iBAAiB,MAAM,uBAAuB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAC5H,UAAA,QAAQ,IAAI,CAAC,QAAQ;AACpB,UAAM,IAAI,OAAO,QAAQ,WAAW,EAAE,OAAO,KAAK,OAAO,IAAA,IAAQ;AACjE,WACE,qBAAC,SAAA,EAAM,WAAU,YACf,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA,OAAO,EAAE;AAAA,UACT,SAAS,UAAU,EAAE;AAAA,UACrB,UAAU,EAAE;AAAA,UACZ,UAAU,MAAM,YAAY,SAAS,EAAE,KAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAE9C,oBAAC,QAAA,EAAK,WAAU,gBAAA,CAAgB;AAAA,MAChC,qBAAC,QAAA,EAAK,WAAU,mBACb,UAAA;AAAA,QAAA,EAAE;AAAA,QACF,EAAE,cAAc,oBAAC,QAAA,EAAK,WAAU,kBAAkB,UAAA,EAAE,aAAY,IAAU;AAAA,MAAA,EAAA,CAC7E;AAAA,IAAA,EAAA,GAb+B,EAAE,KAcnC;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native select styled to match Input, with a drawn chevron.
|
|
3
|
+
*/
|
|
4
|
+
export interface SelectProps {
|
|
5
|
+
label?: string;
|
|
6
|
+
/** Strings or { value, label } objects. */
|
|
7
|
+
options: Array<string | { value: string; label: string }>;
|
|
8
|
+
value?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
onChange?: (e: any) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function Select(props: SelectProps): JSX.Element;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_SELECT_CSS = `
|
|
4
|
+
.ax-select-wrap { position: relative; display: flex; }
|
|
5
|
+
@layer ax-base {
|
|
6
|
+
.ax-select {
|
|
7
|
+
appearance: none; height: 36px; padding: 0 32px 0 12px; width: 100%;
|
|
8
|
+
background: var(--surface-card); color: var(--text-body);
|
|
9
|
+
border: 1px solid var(--border-default); border-radius: var(--radius-2);
|
|
10
|
+
font-family: var(--font-body); font-size: var(--text-sm); cursor: pointer;
|
|
11
|
+
transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
@layer ax-hover {
|
|
15
|
+
.ax-select:hover { border-color: var(--border-strong); }
|
|
16
|
+
}
|
|
17
|
+
@layer ax-focus {
|
|
18
|
+
.ax-select:focus { outline: none; border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }
|
|
19
|
+
}
|
|
20
|
+
@layer ax-disabled {
|
|
21
|
+
.ax-select:disabled { opacity: 0.4; cursor: not-allowed; border-color: var(--border-default); }
|
|
22
|
+
}
|
|
23
|
+
.ax-select-wrap::after {
|
|
24
|
+
content: ""; position: absolute; right: 12px; top: 50%;
|
|
25
|
+
width: 7px; height: 7px; pointer-events: none;
|
|
26
|
+
border-right: 1.5px solid var(--text-faint);
|
|
27
|
+
border-bottom: 1.5px solid var(--text-faint);
|
|
28
|
+
transform: translateY(-70%) rotate(45deg);
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-select-css")) {
|
|
32
|
+
const s = document.createElement("style");
|
|
33
|
+
s.id = "ax-select-css";
|
|
34
|
+
s.textContent = AX_SELECT_CSS;
|
|
35
|
+
document.head.appendChild(s);
|
|
36
|
+
}
|
|
37
|
+
function Select({ label, options = [], className = "", ...rest }) {
|
|
38
|
+
return /* @__PURE__ */ jsxs("label", { className: "ax-field", children: [
|
|
39
|
+
label ? /* @__PURE__ */ jsx("span", { className: "ax-field__label", children: label }) : null,
|
|
40
|
+
/* @__PURE__ */ jsx("span", { className: "ax-select-wrap", children: /* @__PURE__ */ jsx("select", { className: ["ax-select", className].filter(Boolean).join(" "), ...rest, children: options.map((opt) => {
|
|
41
|
+
const o = typeof opt === "string" ? { value: opt, label: opt } : opt;
|
|
42
|
+
return /* @__PURE__ */ jsx("option", { value: o.value, children: o.label }, o.value);
|
|
43
|
+
}) }) })
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
Select
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=Select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../../src/components/inputs/Select.jsx"],"sourcesContent":["import React from \"react\";\nimport { Input } from \"./Input.jsx\"; // ensures shared .ax-field CSS is injected\n\nconst AX_SELECT_CSS = `\n.ax-select-wrap { position: relative; display: flex; }\n@layer ax-base {\n .ax-select {\n appearance: none; height: 36px; padding: 0 32px 0 12px; width: 100%;\n background: var(--surface-card); color: var(--text-body);\n border: 1px solid var(--border-default); border-radius: var(--radius-2);\n font-family: var(--font-body); font-size: var(--text-sm); cursor: pointer;\n transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);\n }\n}\n@layer ax-hover {\n .ax-select:hover { border-color: var(--border-strong); }\n}\n@layer ax-focus {\n .ax-select:focus { outline: none; border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }\n}\n@layer ax-disabled {\n .ax-select:disabled { opacity: 0.4; cursor: not-allowed; border-color: var(--border-default); }\n}\n.ax-select-wrap::after {\n content: \"\"; position: absolute; right: 12px; top: 50%;\n width: 7px; height: 7px; pointer-events: none;\n border-right: 1.5px solid var(--text-faint);\n border-bottom: 1.5px solid var(--text-faint);\n transform: translateY(-70%) rotate(45deg);\n}\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-select-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-select-css\";\n s.textContent = AX_SELECT_CSS;\n document.head.appendChild(s);\n}\n\nexport function Select({ label, options = [], className = \"\", ...rest }) {\n return (\n <label className=\"ax-field\">\n {label ? <span className=\"ax-field__label\">{label}</span> : null}\n <span className=\"ax-select-wrap\">\n <select className={[\"ax-select\", className].filter(Boolean).join(\" \")} {...rest}>\n {options.map((opt) => {\n const o = typeof opt === \"string\" ? { value: opt, label: opt } : opt;\n return <option key={o.value} value={o.value}>{o.label}</option>;\n })}\n </select>\n </span>\n </label>\n );\n}\n"],"names":[],"mappings":";;AAGA,MAAM,gBAAgB;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;AA6BtB,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,OAAO,UAAU,CAAA,GAAI,YAAY,IAAI,GAAG,QAAQ;AACvE,SACE,qBAAC,SAAA,EAAM,WAAU,YACd,UAAA;AAAA,IAAA,QAAQ,oBAAC,QAAA,EAAK,WAAU,mBAAmB,iBAAM,IAAU;AAAA,IAC5D,oBAAC,UAAK,WAAU,kBACd,8BAAC,UAAA,EAAO,WAAW,CAAC,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACxE,UAAA,QAAQ,IAAI,CAAC,QAAQ;AACpB,YAAM,IAAI,OAAO,QAAQ,WAAW,EAAE,OAAO,KAAK,OAAO,IAAA,IAAQ;AACjE,aAAO,oBAAC,YAAqB,OAAO,EAAE,OAAQ,UAAA,EAAE,SAA5B,EAAE,KAAgC;AAAA,IACxD,CAAC,GACH,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-value range slider with a square thumb and mono value readout.
|
|
3
|
+
*/
|
|
4
|
+
export interface SliderProps {
|
|
5
|
+
/** Mono uppercase label; shows the live value on the right when set. */
|
|
6
|
+
label?: string;
|
|
7
|
+
value?: number;
|
|
8
|
+
min?: number;
|
|
9
|
+
max?: number;
|
|
10
|
+
step?: number;
|
|
11
|
+
/** Unit appended to the readout, e.g. "%" or "k". */
|
|
12
|
+
suffix?: string;
|
|
13
|
+
onChange?: (value: number) => void;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function Slider(props: SliderProps): JSX.Element;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_SLIDER_CSS = `
|
|
4
|
+
.ax-slider { display: flex; flex-direction: column; gap: 8px; }
|
|
5
|
+
.ax-slider__top { display: flex; align-items: baseline; justify-content: space-between; }
|
|
6
|
+
.ax-slider__val { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--text-body); }
|
|
7
|
+
.ax-slider__track {
|
|
8
|
+
position: relative; height: 20px; display: flex; align-items: center; cursor: pointer;
|
|
9
|
+
}
|
|
10
|
+
.ax-slider__rail { position: absolute; left: 0; right: 0; height: 4px; background: var(--surface-raised); border: 1px solid var(--border-default); border-radius: var(--radius-1); }
|
|
11
|
+
.ax-slider__fill { position: absolute; left: 0; height: 4px; background: var(--accent); border-radius: var(--radius-1); }
|
|
12
|
+
.ax-slider__thumb {
|
|
13
|
+
position: absolute; width: 14px; height: 14px; margin-left: -7px;
|
|
14
|
+
background: var(--accent); border: 2px solid var(--surface-page); border-radius: var(--radius-1);
|
|
15
|
+
box-shadow: 0 0 0 1px var(--border-strong);
|
|
16
|
+
transition: transform var(--dur-1) var(--ease-out);
|
|
17
|
+
}
|
|
18
|
+
.ax-slider__track:hover .ax-slider__thumb { transform: scale(1.1); }
|
|
19
|
+
.ax-slider input { position: absolute; opacity: 0; width: 100%; height: 20px; margin: 0; cursor: pointer; }
|
|
20
|
+
.ax-slider input:focus-visible + .ax-slider__thumb { box-shadow: var(--ring); }
|
|
21
|
+
.ax-slider input:disabled { cursor: not-allowed; }
|
|
22
|
+
.ax-slider--disabled { opacity: 0.4; }
|
|
23
|
+
`;
|
|
24
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-slider-css")) {
|
|
25
|
+
const s = document.createElement("style");
|
|
26
|
+
s.id = "ax-slider-css";
|
|
27
|
+
s.textContent = AX_SLIDER_CSS;
|
|
28
|
+
document.head.appendChild(s);
|
|
29
|
+
}
|
|
30
|
+
function Slider({ label, value = 0, min = 0, max = 100, step = 1, suffix = "", onChange, disabled = false, className = "", ...rest }) {
|
|
31
|
+
const pct = Math.max(0, Math.min(100, (value - min) / (max - min) * 100));
|
|
32
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-slider", disabled ? "ax-slider--disabled" : "", className].filter(Boolean).join(" "), ...rest, children: [
|
|
33
|
+
label != null ? /* @__PURE__ */ jsxs("div", { className: "ax-slider__top", children: [
|
|
34
|
+
/* @__PURE__ */ jsx("span", { className: "ax-label", children: label }),
|
|
35
|
+
/* @__PURE__ */ jsxs("span", { className: "ax-slider__val", children: [
|
|
36
|
+
value,
|
|
37
|
+
suffix
|
|
38
|
+
] })
|
|
39
|
+
] }) : null,
|
|
40
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-slider__track", children: [
|
|
41
|
+
/* @__PURE__ */ jsx("span", { className: "ax-slider__rail" }),
|
|
42
|
+
/* @__PURE__ */ jsx("span", { className: "ax-slider__fill", style: { width: pct + "%" } }),
|
|
43
|
+
/* @__PURE__ */ jsx(
|
|
44
|
+
"input",
|
|
45
|
+
{
|
|
46
|
+
type: "range",
|
|
47
|
+
min,
|
|
48
|
+
max,
|
|
49
|
+
step,
|
|
50
|
+
value,
|
|
51
|
+
disabled,
|
|
52
|
+
onChange: (e) => onChange && onChange(Number(e.target.value))
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
/* @__PURE__ */ jsx("span", { className: "ax-slider__thumb", style: { left: pct + "%" } })
|
|
56
|
+
] })
|
|
57
|
+
] });
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
Slider
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=Slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.js","sources":["../../../src/components/inputs/Slider.jsx"],"sourcesContent":["import React, { useRef, useCallback } from \"react\";\n\nconst AX_SLIDER_CSS = `\n.ax-slider { display: flex; flex-direction: column; gap: 8px; }\n.ax-slider__top { display: flex; align-items: baseline; justify-content: space-between; }\n.ax-slider__val { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--text-body); }\n.ax-slider__track {\n position: relative; height: 20px; display: flex; align-items: center; cursor: pointer;\n}\n.ax-slider__rail { position: absolute; left: 0; right: 0; height: 4px; background: var(--surface-raised); border: 1px solid var(--border-default); border-radius: var(--radius-1); }\n.ax-slider__fill { position: absolute; left: 0; height: 4px; background: var(--accent); border-radius: var(--radius-1); }\n.ax-slider__thumb {\n position: absolute; width: 14px; height: 14px; margin-left: -7px;\n background: var(--accent); border: 2px solid var(--surface-page); border-radius: var(--radius-1);\n box-shadow: 0 0 0 1px var(--border-strong);\n transition: transform var(--dur-1) var(--ease-out);\n}\n.ax-slider__track:hover .ax-slider__thumb { transform: scale(1.1); }\n.ax-slider input { position: absolute; opacity: 0; width: 100%; height: 20px; margin: 0; cursor: pointer; }\n.ax-slider input:focus-visible + .ax-slider__thumb { box-shadow: var(--ring); }\n.ax-slider input:disabled { cursor: not-allowed; }\n.ax-slider--disabled { opacity: 0.4; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-slider-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-slider-css\";\n s.textContent = AX_SLIDER_CSS;\n document.head.appendChild(s);\n}\n\nexport function Slider({ label, value = 0, min = 0, max = 100, step = 1, suffix = \"\", onChange, disabled = false, className = \"\", ...rest }) {\n const pct = Math.max(0, Math.min(100, ((value - min) / (max - min)) * 100));\n return (\n <div className={[\"ax-slider\", disabled ? \"ax-slider--disabled\" : \"\", className].filter(Boolean).join(\" \")} {...rest}>\n {(label != null) ? (\n <div className=\"ax-slider__top\">\n <span className=\"ax-label\">{label}</span>\n <span className=\"ax-slider__val\">{value}{suffix}</span>\n </div>\n ) : null}\n <div className=\"ax-slider__track\">\n <span className=\"ax-slider__rail\"></span>\n <span className=\"ax-slider__fill\" style={{ width: pct + \"%\" }}></span>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange && onChange(Number(e.target.value))}\n />\n <span className=\"ax-slider__thumb\" style={{ left: pct + \"%\" }}></span>\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBtB,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,OAAO,QAAQ,GAAG,MAAM,GAAG,MAAM,KAAK,OAAO,GAAG,SAAS,IAAI,UAAU,WAAW,OAAO,YAAY,IAAI,GAAG,QAAQ;AAC3I,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,MAAO,QAAQ,QAAQ,MAAM,OAAQ,GAAG,CAAC;AAC1E,8BACG,OAAA,EAAI,WAAW,CAAC,aAAa,WAAW,wBAAwB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAC3G,UAAA;AAAA,IAAA,SAAS,OACT,qBAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,YAAY,UAAA,OAAM;AAAA,MAClC,qBAAC,QAAA,EAAK,WAAU,kBAAkB,UAAA;AAAA,QAAA;AAAA,QAAO;AAAA,MAAA,EAAA,CAAO;AAAA,IAAA,EAAA,CAClD,IACE;AAAA,IACJ,qBAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,kBAAA,CAAkB;AAAA,MAClC,oBAAC,UAAK,WAAU,mBAAkB,OAAO,EAAE,OAAO,MAAM,IAAA,GAAO;AAAA,MAC/D;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,CAAC,MAAM,YAAY,SAAS,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAE9D,oBAAC,UAAK,WAAU,oBAAmB,OAAO,EAAE,MAAM,MAAM,MAAI,CAAG;AAAA,IAAA,EAAA,CACjE;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Square-thumbed toggle — Agentaily's hard-edged take on a switch.
|
|
3
|
+
*/
|
|
4
|
+
export interface SwitchProps {
|
|
5
|
+
/** Text rendered to the right of the track. */
|
|
6
|
+
label?: string;
|
|
7
|
+
checked?: boolean;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
onChange?: (e: any) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function Switch(props: SwitchProps): JSX.Element;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_SWITCH_CSS = `
|
|
4
|
+
.ax-switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }
|
|
5
|
+
.ax-switch input { position: absolute; opacity: 0; width: 0; height: 0; }
|
|
6
|
+
.ax-switch__track {
|
|
7
|
+
width: 36px; height: 20px; flex: none; position: relative;
|
|
8
|
+
background: var(--surface-raised); border: 1px solid var(--border-strong);
|
|
9
|
+
border-radius: var(--radius-1);
|
|
10
|
+
transition: background var(--dur-2) var(--ease-out), border-color var(--dur-2) var(--ease-out);
|
|
11
|
+
}
|
|
12
|
+
.ax-switch__thumb {
|
|
13
|
+
position: absolute; top: 2px; left: 2px; width: 14px; height: 14px;
|
|
14
|
+
background: var(--text-muted); border-radius: 1px;
|
|
15
|
+
transition: transform var(--dur-2) var(--ease-out), background var(--dur-2) var(--ease-out);
|
|
16
|
+
}
|
|
17
|
+
.ax-switch input:checked + .ax-switch__track { background: var(--accent); border-color: var(--accent); }
|
|
18
|
+
.ax-switch input:checked + .ax-switch__track .ax-switch__thumb { transform: translateX(16px); background: var(--accent-fg); }
|
|
19
|
+
.ax-switch input:focus-visible + .ax-switch__track { box-shadow: var(--ring); }
|
|
20
|
+
.ax-switch input:disabled + .ax-switch__track { opacity: 0.4; }
|
|
21
|
+
.ax-switch__label { font-size: var(--text-sm); color: var(--text-body); }
|
|
22
|
+
`;
|
|
23
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-switch-css")) {
|
|
24
|
+
const s = document.createElement("style");
|
|
25
|
+
s.id = "ax-switch-css";
|
|
26
|
+
s.textContent = AX_SWITCH_CSS;
|
|
27
|
+
document.head.appendChild(s);
|
|
28
|
+
}
|
|
29
|
+
function Switch({ label, className = "", ...rest }) {
|
|
30
|
+
return /* @__PURE__ */ jsxs("label", { className: ["ax-switch", className].filter(Boolean).join(" "), children: [
|
|
31
|
+
/* @__PURE__ */ jsx("input", { type: "checkbox", role: "switch", ...rest }),
|
|
32
|
+
/* @__PURE__ */ jsx("span", { className: "ax-switch__track", children: /* @__PURE__ */ jsx("span", { className: "ax-switch__thumb" }) }),
|
|
33
|
+
label ? /* @__PURE__ */ jsx("span", { className: "ax-switch__label", children: label }) : null
|
|
34
|
+
] });
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
Switch
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=Switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../../../src/components/inputs/Switch.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_SWITCH_CSS = `\n.ax-switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }\n.ax-switch input { position: absolute; opacity: 0; width: 0; height: 0; }\n.ax-switch__track {\n width: 36px; height: 20px; flex: none; position: relative;\n background: var(--surface-raised); border: 1px solid var(--border-strong);\n border-radius: var(--radius-1);\n transition: background var(--dur-2) var(--ease-out), border-color var(--dur-2) var(--ease-out);\n}\n.ax-switch__thumb {\n position: absolute; top: 2px; left: 2px; width: 14px; height: 14px;\n background: var(--text-muted); border-radius: 1px;\n transition: transform var(--dur-2) var(--ease-out), background var(--dur-2) var(--ease-out);\n}\n.ax-switch input:checked + .ax-switch__track { background: var(--accent); border-color: var(--accent); }\n.ax-switch input:checked + .ax-switch__track .ax-switch__thumb { transform: translateX(16px); background: var(--accent-fg); }\n.ax-switch input:focus-visible + .ax-switch__track { box-shadow: var(--ring); }\n.ax-switch input:disabled + .ax-switch__track { opacity: 0.4; }\n.ax-switch__label { font-size: var(--text-sm); color: var(--text-body); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-switch-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-switch-css\";\n s.textContent = AX_SWITCH_CSS;\n document.head.appendChild(s);\n}\n\nexport function Switch({ label, className = \"\", ...rest }) {\n return (\n <label className={[\"ax-switch\", className].filter(Boolean).join(\" \")}>\n <input type=\"checkbox\" role=\"switch\" {...rest} />\n <span className=\"ax-switch__track\"><span className=\"ax-switch__thumb\"></span></span>\n {label ? <span className=\"ax-switch__label\">{label}</span> : null}\n </label>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBtB,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,OAAO,YAAY,IAAI,GAAG,QAAQ;AACzD,SACE,qBAAC,SAAA,EAAM,WAAW,CAAC,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACjE,UAAA;AAAA,IAAA,oBAAC,WAAM,MAAK,YAAW,MAAK,UAAU,GAAG,MAAM;AAAA,IAC/C,oBAAC,UAAK,WAAU,oBAAmB,8BAAC,QAAA,EAAK,WAAU,oBAAmB,EAAA,CAAO;AAAA,IAC5E,QAAQ,oBAAC,QAAA,EAAK,WAAU,oBAAoB,iBAAM,IAAU;AAAA,EAAA,GAC/D;AAEJ;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-line text field, vertically resizable.
|
|
3
|
+
*/
|
|
4
|
+
export interface TextareaProps {
|
|
5
|
+
label?: string;
|
|
6
|
+
hint?: string;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
value?: string;
|
|
9
|
+
rows?: number;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
onChange?: (e: any) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function Textarea(props: TextareaProps): JSX.Element;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_TEXTAREA_CSS = `
|
|
4
|
+
@layer ax-base {
|
|
5
|
+
.ax-textarea {
|
|
6
|
+
min-height: 88px; padding: 10px 12px; width: 100%; resize: vertical;
|
|
7
|
+
background: var(--surface-card); color: var(--text-body);
|
|
8
|
+
border: 1px solid var(--border-default); border-radius: var(--radius-2);
|
|
9
|
+
font-family: var(--font-body); font-size: var(--text-sm);
|
|
10
|
+
line-height: var(--leading-body);
|
|
11
|
+
transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
|
|
12
|
+
}
|
|
13
|
+
.ax-textarea::placeholder { color: var(--text-faint); }
|
|
14
|
+
}
|
|
15
|
+
@layer ax-hover {
|
|
16
|
+
.ax-textarea:hover { border-color: var(--border-strong); }
|
|
17
|
+
}
|
|
18
|
+
@layer ax-focus {
|
|
19
|
+
.ax-textarea:focus { outline: none; border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }
|
|
20
|
+
}
|
|
21
|
+
@layer ax-disabled {
|
|
22
|
+
.ax-textarea:disabled { opacity: 0.4; cursor: not-allowed; border-color: var(--border-default); }
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-textarea-css")) {
|
|
26
|
+
const s = document.createElement("style");
|
|
27
|
+
s.id = "ax-textarea-css";
|
|
28
|
+
s.textContent = AX_TEXTAREA_CSS;
|
|
29
|
+
document.head.appendChild(s);
|
|
30
|
+
}
|
|
31
|
+
function Textarea({ label, hint, className = "", ...rest }) {
|
|
32
|
+
return /* @__PURE__ */ jsxs("label", { className: "ax-field", children: [
|
|
33
|
+
label ? /* @__PURE__ */ jsx("span", { className: "ax-field__label", children: label }) : null,
|
|
34
|
+
/* @__PURE__ */ jsx("textarea", { className: ["ax-textarea", className].filter(Boolean).join(" "), ...rest }),
|
|
35
|
+
hint ? /* @__PURE__ */ jsx("span", { className: "ax-field__hint", children: hint }) : null
|
|
36
|
+
] });
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
Textarea
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=Textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Textarea.js","sources":["../../../src/components/inputs/Textarea.jsx"],"sourcesContent":["import React from \"react\";\nimport { Input } from \"./Input.jsx\"; // ensures shared .ax-field CSS is injected\n\nconst AX_TEXTAREA_CSS = `\n@layer ax-base {\n .ax-textarea {\n min-height: 88px; padding: 10px 12px; width: 100%; resize: vertical;\n background: var(--surface-card); color: var(--text-body);\n border: 1px solid var(--border-default); border-radius: var(--radius-2);\n font-family: var(--font-body); font-size: var(--text-sm);\n line-height: var(--leading-body);\n transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);\n }\n .ax-textarea::placeholder { color: var(--text-faint); }\n}\n@layer ax-hover {\n .ax-textarea:hover { border-color: var(--border-strong); }\n}\n@layer ax-focus {\n .ax-textarea:focus { outline: none; border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }\n}\n@layer ax-disabled {\n .ax-textarea:disabled { opacity: 0.4; cursor: not-allowed; border-color: var(--border-default); }\n}\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-textarea-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-textarea-css\";\n s.textContent = AX_TEXTAREA_CSS;\n document.head.appendChild(s);\n}\n\nexport function Textarea({ label, hint, className = \"\", ...rest }) {\n return (\n <label className=\"ax-field\">\n {label ? <span className=\"ax-field__label\">{label}</span> : null}\n <textarea className={[\"ax-textarea\", className].filter(Boolean).join(\" \")} {...rest}></textarea>\n {hint ? <span className=\"ax-field__hint\">{hint}</span> : null}\n </label>\n );\n}\n"],"names":[],"mappings":";;AAGA,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBxB,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;AAEO,SAAS,SAAS,EAAE,OAAO,MAAM,YAAY,IAAI,GAAG,QAAQ;AACjE,SACE,qBAAC,SAAA,EAAM,WAAU,YACd,UAAA;AAAA,IAAA,QAAQ,oBAAC,QAAA,EAAK,WAAU,mBAAmB,iBAAM,IAAU;AAAA,IAC5D,oBAAC,YAAA,EAAS,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,KAAA,CAAM;AAAA,IACpF,OAAO,oBAAC,QAAA,EAAK,WAAU,kBAAkB,gBAAK,IAAU;AAAA,EAAA,GAC3D;AAEJ;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Two-state pressable button, and a segmented ToggleGroup of them.
|
|
3
|
+
*/
|
|
4
|
+
export interface ToggleProps {
|
|
5
|
+
pressed?: boolean;
|
|
6
|
+
onPressedChange?: (pressed: boolean) => void;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
children?: React.ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function Toggle(props: ToggleProps): JSX.Element;
|
|
11
|
+
|
|
12
|
+
export interface ToggleGroupProps {
|
|
13
|
+
/** Currently selected value (single-select). */
|
|
14
|
+
value?: string;
|
|
15
|
+
/** Strings or { value, label, icon? }. */
|
|
16
|
+
options: Array<string | { value: string; label?: string; icon?: React.ReactNode }>;
|
|
17
|
+
onChange?: (value: string) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function ToggleGroup(props: ToggleGroupProps): JSX.Element;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_TOGGLE_CSS = `
|
|
4
|
+
.ax-toggle {
|
|
5
|
+
display: inline-flex; align-items: center; justify-content: center; gap: 6px;
|
|
6
|
+
height: 32px; min-width: 32px; padding: 0 10px; cursor: pointer;
|
|
7
|
+
background: transparent; color: var(--text-muted);
|
|
8
|
+
border: 1px solid var(--border-default); border-radius: var(--radius-2);
|
|
9
|
+
font-family: var(--font-body); font-size: var(--text-sm); font-weight: var(--weight-medium);
|
|
10
|
+
transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);
|
|
11
|
+
}
|
|
12
|
+
.ax-toggle:hover:not(:disabled) { background: var(--surface-raised); color: var(--text-body); }
|
|
13
|
+
.ax-toggle:focus-visible { outline: none; box-shadow: var(--ring); }
|
|
14
|
+
.ax-toggle[aria-pressed="true"] { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
|
|
15
|
+
.ax-toggle:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
16
|
+
.ax-toggle svg { width: 15px; height: 15px; }
|
|
17
|
+
|
|
18
|
+
.ax-togglegroup { display: inline-flex; }
|
|
19
|
+
.ax-togglegroup .ax-toggle { border-radius: 0; margin-left: -1px; }
|
|
20
|
+
.ax-togglegroup .ax-toggle:first-child { border-radius: var(--radius-2) 0 0 var(--radius-2); margin-left: 0; }
|
|
21
|
+
.ax-togglegroup .ax-toggle:last-child { border-radius: 0 var(--radius-2) var(--radius-2) 0; }
|
|
22
|
+
.ax-togglegroup .ax-toggle[aria-pressed="true"] { position: relative; z-index: 1; }
|
|
23
|
+
`;
|
|
24
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-toggle-css")) {
|
|
25
|
+
const s = document.createElement("style");
|
|
26
|
+
s.id = "ax-toggle-css";
|
|
27
|
+
s.textContent = AX_TOGGLE_CSS;
|
|
28
|
+
document.head.appendChild(s);
|
|
29
|
+
}
|
|
30
|
+
function Toggle({ pressed = false, onPressedChange, children, className = "", disabled, ...rest }) {
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
"button",
|
|
33
|
+
{
|
|
34
|
+
type: "button",
|
|
35
|
+
"aria-pressed": pressed,
|
|
36
|
+
disabled,
|
|
37
|
+
className: ["ax-toggle", className].filter(Boolean).join(" "),
|
|
38
|
+
onClick: () => onPressedChange && onPressedChange(!pressed),
|
|
39
|
+
...rest,
|
|
40
|
+
children
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
function ToggleGroup({ value, options = [], onChange, className = "", ...rest }) {
|
|
45
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-togglegroup", className].filter(Boolean).join(" "), role: "group", ...rest, children: options.map((opt) => {
|
|
46
|
+
const o = typeof opt === "string" ? { value: opt, label: opt } : opt;
|
|
47
|
+
return /* @__PURE__ */ jsxs(Toggle, { pressed: value === o.value, onPressedChange: () => onChange && onChange(o.value), children: [
|
|
48
|
+
o.icon,
|
|
49
|
+
o.label
|
|
50
|
+
] }, o.value);
|
|
51
|
+
}) });
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
Toggle,
|
|
55
|
+
ToggleGroup
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=Toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toggle.js","sources":["../../../src/components/inputs/Toggle.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_TOGGLE_CSS = `\n.ax-toggle {\n display: inline-flex; align-items: center; justify-content: center; gap: 6px;\n height: 32px; min-width: 32px; padding: 0 10px; cursor: pointer;\n background: transparent; color: var(--text-muted);\n border: 1px solid var(--border-default); border-radius: var(--radius-2);\n font-family: var(--font-body); font-size: var(--text-sm); font-weight: var(--weight-medium);\n transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);\n}\n.ax-toggle:hover:not(:disabled) { background: var(--surface-raised); color: var(--text-body); }\n.ax-toggle:focus-visible { outline: none; box-shadow: var(--ring); }\n.ax-toggle[aria-pressed=\"true\"] { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }\n.ax-toggle:disabled { opacity: 0.4; cursor: not-allowed; }\n.ax-toggle svg { width: 15px; height: 15px; }\n\n.ax-togglegroup { display: inline-flex; }\n.ax-togglegroup .ax-toggle { border-radius: 0; margin-left: -1px; }\n.ax-togglegroup .ax-toggle:first-child { border-radius: var(--radius-2) 0 0 var(--radius-2); margin-left: 0; }\n.ax-togglegroup .ax-toggle:last-child { border-radius: 0 var(--radius-2) var(--radius-2) 0; }\n.ax-togglegroup .ax-toggle[aria-pressed=\"true\"] { position: relative; z-index: 1; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-toggle-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-toggle-css\";\n s.textContent = AX_TOGGLE_CSS;\n document.head.appendChild(s);\n}\n\nexport function Toggle({ pressed = false, onPressedChange, children, className = \"\", disabled, ...rest }) {\n return (\n <button\n type=\"button\"\n aria-pressed={pressed}\n disabled={disabled}\n className={[\"ax-toggle\", className].filter(Boolean).join(\" \")}\n onClick={() => onPressedChange && onPressedChange(!pressed)}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\nexport function ToggleGroup({ value, options = [], onChange, className = \"\", ...rest }) {\n return (\n <div className={[\"ax-togglegroup\", className].filter(Boolean).join(\" \")} role=\"group\" {...rest}>\n {options.map((opt) => {\n const o = typeof opt === \"string\" ? { value: opt, label: opt } : opt;\n return (\n <Toggle key={o.value} pressed={value === o.value} onPressedChange={() => onChange && onChange(o.value)}>\n {o.icon}{o.label}\n </Toggle>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBtB,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,UAAU,OAAO,iBAAiB,UAAU,YAAY,IAAI,UAAU,GAAG,QAAQ;AACxG,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,gBAAc;AAAA,MACd;AAAA,MACA,WAAW,CAAC,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC5D,SAAS,MAAM,mBAAmB,gBAAgB,CAAC,OAAO;AAAA,MACzD,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA;AAGP;AAEO,SAAS,YAAY,EAAE,OAAO,UAAU,CAAA,GAAI,UAAU,YAAY,IAAI,GAAG,QAAQ;AACtF,SACE,oBAAC,SAAI,WAAW,CAAC,kBAAkB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,MAAK,SAAS,GAAG,MACvF,UAAA,QAAQ,IAAI,CAAC,QAAQ;AACpB,UAAM,IAAI,OAAO,QAAQ,WAAW,EAAE,OAAO,KAAK,OAAO,IAAA,IAAQ;AACjE,WACE,qBAAC,QAAA,EAAqB,SAAS,UAAU,EAAE,OAAO,iBAAiB,MAAM,YAAY,SAAS,EAAE,KAAK,GAClG,UAAA;AAAA,MAAA,EAAE;AAAA,MAAM,EAAE;AAAA,IAAA,EAAA,GADA,EAAE,KAEf;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_ASPECT_CSS = `
|
|
4
|
+
.ax-aspect { position: relative; width: 100%; overflow: hidden; border-radius: var(--radius-3); background: var(--surface-raised); }
|
|
5
|
+
.ax-aspect > * { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
|
|
6
|
+
.ax-aspect__placeholder { display: flex; align-items: center; justify-content: center; color: var(--text-faint); font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; }
|
|
7
|
+
`;
|
|
8
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-aspect-css")) {
|
|
9
|
+
const s = document.createElement("style");
|
|
10
|
+
s.id = "ax-aspect-css";
|
|
11
|
+
s.textContent = AX_ASPECT_CSS;
|
|
12
|
+
document.head.appendChild(s);
|
|
13
|
+
}
|
|
14
|
+
function AspectRatio({ ratio = 16 / 9, children, className = "", style = {}, ...rest }) {
|
|
15
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-aspect", className].filter(Boolean).join(" "), style: { aspectRatio: String(ratio), ...style }, ...rest, children: children || /* @__PURE__ */ jsx("span", { className: "ax-aspect__placeholder", children: typeof ratio === "number" ? ratio.toFixed(2) : ratio }) });
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
AspectRatio
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=AspectRatio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AspectRatio.js","sources":["../../../src/components/layout/AspectRatio.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_ASPECT_CSS = `\n.ax-aspect { position: relative; width: 100%; overflow: hidden; border-radius: var(--radius-3); background: var(--surface-raised); }\n.ax-aspect > * { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }\n.ax-aspect__placeholder { display: flex; align-items: center; justify-content: center; color: var(--text-faint); font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-aspect-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-aspect-css\";\n s.textContent = AX_ASPECT_CSS;\n document.head.appendChild(s);\n}\n\nexport function AspectRatio({ ratio = 16 / 9, children, className = \"\", style = {}, ...rest }) {\n return (\n <div className={[\"ax-aspect\", className].filter(Boolean).join(\" \")} style={{ aspectRatio: String(ratio), ...style }} {...rest}>\n {children || <span className=\"ax-aspect__placeholder\">{typeof ratio === \"number\" ? ratio.toFixed(2) : ratio}</span>}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAMtB,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,YAAY,EAAE,QAAQ,KAAK,GAAG,UAAU,YAAY,IAAI,QAAQ,IAAI,GAAG,QAAQ;AAC7F,6BACG,OAAA,EAAI,WAAW,CAAC,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,OAAO,EAAE,aAAa,OAAO,KAAK,GAAG,GAAG,SAAU,GAAG,MACtH,UAAA,gCAAa,QAAA,EAAK,WAAU,0BAA0B,UAAA,OAAO,UAAU,WAAW,MAAM,QAAQ,CAAC,IAAI,OAAM,GAC9G;AAEJ;"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Two resizable panels with a draggable divider. */
|
|
2
|
+
export interface ResizableProps { orientation?: "horizontal" | "vertical"; defaultSize?: number; min?: number; max?: number; first?: React.ReactNode; second?: React.ReactNode; height?: number; }
|
|
3
|
+
export declare function Resizable(props: ResizableProps): JSX.Element;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useCallback } from "react";
|
|
3
|
+
const AX_RESIZABLE_CSS = `
|
|
4
|
+
.ax-resizable { display: flex; width: 100%; border: 1px solid var(--border-default); border-radius: var(--radius-3); overflow: hidden; }
|
|
5
|
+
.ax-resizable--vertical { flex-direction: column; }
|
|
6
|
+
.ax-resizable__panel { overflow: auto; min-width: 0; min-height: 0; }
|
|
7
|
+
.ax-resizable__handle { flex: none; position: relative; background: var(--border-default); transition: background var(--dur-1) var(--ease-out); }
|
|
8
|
+
.ax-resizable__handle:hover, .ax-resizable__handle--active { background: var(--border-strong); }
|
|
9
|
+
.ax-resizable--horizontal .ax-resizable__handle { width: 1px; cursor: col-resize; }
|
|
10
|
+
.ax-resizable--vertical .ax-resizable__handle { height: 1px; cursor: row-resize; }
|
|
11
|
+
.ax-resizable__handle::after { content: ""; position: absolute; }
|
|
12
|
+
.ax-resizable--horizontal .ax-resizable__handle::after { inset: 0 -4px; }
|
|
13
|
+
.ax-resizable--vertical .ax-resizable__handle::after { inset: -4px 0; }
|
|
14
|
+
.ax-resizable__grip { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); display: flex; gap: 2px; }
|
|
15
|
+
.ax-resizable--horizontal .ax-resizable__grip { flex-direction: column; }
|
|
16
|
+
.ax-resizable__grip span { width: 3px; height: 3px; border-radius: 1px; background: var(--text-faint); }
|
|
17
|
+
`;
|
|
18
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-resizable-css")) {
|
|
19
|
+
const s = document.createElement("style");
|
|
20
|
+
s.id = "ax-resizable-css";
|
|
21
|
+
s.textContent = AX_RESIZABLE_CSS;
|
|
22
|
+
document.head.appendChild(s);
|
|
23
|
+
}
|
|
24
|
+
function Resizable({ orientation = "horizontal", defaultSize = 50, min = 15, max = 85, first, second, height = 220, className = "", ...rest }) {
|
|
25
|
+
const [size, setSize] = useState(defaultSize);
|
|
26
|
+
const ref = useRef(null);
|
|
27
|
+
const dragging = useRef(false);
|
|
28
|
+
const vertical = orientation === "vertical";
|
|
29
|
+
const onMove = useCallback((e) => {
|
|
30
|
+
if (!dragging.current || !ref.current) return;
|
|
31
|
+
const rect = ref.current.getBoundingClientRect();
|
|
32
|
+
const pct = vertical ? (e.clientY - rect.top) / rect.height * 100 : (e.clientX - rect.left) / rect.width * 100;
|
|
33
|
+
setSize(Math.max(min, Math.min(max, pct)));
|
|
34
|
+
}, [vertical, min, max]);
|
|
35
|
+
const stop = useCallback(() => {
|
|
36
|
+
dragging.current = false;
|
|
37
|
+
document.removeEventListener("mousemove", onMove);
|
|
38
|
+
document.removeEventListener("mouseup", stop);
|
|
39
|
+
}, [onMove]);
|
|
40
|
+
const start = () => {
|
|
41
|
+
dragging.current = true;
|
|
42
|
+
document.addEventListener("mousemove", onMove);
|
|
43
|
+
document.addEventListener("mouseup", stop);
|
|
44
|
+
};
|
|
45
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-resizable", "ax-resizable--" + orientation, className].filter(Boolean).join(" "), ref, style: { height: vertical ? height : void 0 }, ...rest, children: [
|
|
46
|
+
/* @__PURE__ */ jsx("div", { className: "ax-resizable__panel", style: vertical ? { height: size + "%" } : { width: size + "%" }, children: first }),
|
|
47
|
+
/* @__PURE__ */ jsx("div", { className: "ax-resizable__handle", onMouseDown: start, children: /* @__PURE__ */ jsxs("span", { className: "ax-resizable__grip", children: [
|
|
48
|
+
/* @__PURE__ */ jsx("span", {}),
|
|
49
|
+
/* @__PURE__ */ jsx("span", {}),
|
|
50
|
+
/* @__PURE__ */ jsx("span", {})
|
|
51
|
+
] }) }),
|
|
52
|
+
/* @__PURE__ */ jsx("div", { className: "ax-resizable__panel", style: { flex: 1 }, children: second })
|
|
53
|
+
] });
|
|
54
|
+
}
|
|
55
|
+
export {
|
|
56
|
+
Resizable
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=Resizable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resizable.js","sources":["../../../src/components/layout/Resizable.jsx"],"sourcesContent":["import React, { useState, useRef, useCallback } from \"react\";\n\nconst AX_RESIZABLE_CSS = `\n.ax-resizable { display: flex; width: 100%; border: 1px solid var(--border-default); border-radius: var(--radius-3); overflow: hidden; }\n.ax-resizable--vertical { flex-direction: column; }\n.ax-resizable__panel { overflow: auto; min-width: 0; min-height: 0; }\n.ax-resizable__handle { flex: none; position: relative; background: var(--border-default); transition: background var(--dur-1) var(--ease-out); }\n.ax-resizable__handle:hover, .ax-resizable__handle--active { background: var(--border-strong); }\n.ax-resizable--horizontal .ax-resizable__handle { width: 1px; cursor: col-resize; }\n.ax-resizable--vertical .ax-resizable__handle { height: 1px; cursor: row-resize; }\n.ax-resizable__handle::after { content: \"\"; position: absolute; }\n.ax-resizable--horizontal .ax-resizable__handle::after { inset: 0 -4px; }\n.ax-resizable--vertical .ax-resizable__handle::after { inset: -4px 0; }\n.ax-resizable__grip { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); display: flex; gap: 2px; }\n.ax-resizable--horizontal .ax-resizable__grip { flex-direction: column; }\n.ax-resizable__grip span { width: 3px; height: 3px; border-radius: 1px; background: var(--text-faint); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-resizable-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-resizable-css\";\n s.textContent = AX_RESIZABLE_CSS;\n document.head.appendChild(s);\n}\n\nexport function Resizable({ orientation = \"horizontal\", defaultSize = 50, min = 15, max = 85, first, second, height = 220, className = \"\", ...rest }) {\n const [size, setSize] = useState(defaultSize);\n const ref = useRef(null);\n const dragging = useRef(false);\n const vertical = orientation === \"vertical\";\n\n const onMove = useCallback((e) => {\n if (!dragging.current || !ref.current) return;\n const rect = ref.current.getBoundingClientRect();\n const pct = vertical\n ? ((e.clientY - rect.top) / rect.height) * 100\n : ((e.clientX - rect.left) / rect.width) * 100;\n setSize(Math.max(min, Math.min(max, pct)));\n }, [vertical, min, max]);\n\n const stop = useCallback(() => {\n dragging.current = false;\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", stop);\n }, [onMove]);\n\n const start = () => {\n dragging.current = true;\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", stop);\n };\n\n return (\n <div className={[\"ax-resizable\", \"ax-resizable--\" + orientation, className].filter(Boolean).join(\" \")} ref={ref} style={{ height: vertical ? height : undefined }} {...rest}>\n <div className=\"ax-resizable__panel\" style={vertical ? { height: size + \"%\" } : { width: size + \"%\" }}>{first}</div>\n <div className=\"ax-resizable__handle\" onMouseDown={start}>\n <span className=\"ax-resizable__grip\"><span></span><span></span><span></span></span>\n </div>\n <div className=\"ax-resizable__panel\" style={{ flex: 1 }}>{second}</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;AAgBzB,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;AAEO,SAAS,UAAU,EAAE,cAAc,cAAc,cAAc,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,QAAQ,SAAS,KAAK,YAAY,IAAI,GAAG,QAAQ;AACpJ,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,WAAW;AAC5C,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,WAAW,OAAO,KAAK;AAC7B,QAAM,WAAW,gBAAgB;AAEjC,QAAM,SAAS,YAAY,CAAC,MAAM;AAChC,QAAI,CAAC,SAAS,WAAW,CAAC,IAAI,QAAS;AACvC,UAAM,OAAO,IAAI,QAAQ,sBAAA;AACzB,UAAM,MAAM,YACN,EAAE,UAAU,KAAK,OAAO,KAAK,SAAU,OACvC,EAAE,UAAU,KAAK,QAAQ,KAAK,QAAS;AAC7C,YAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;AAAA,EAC3C,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC;AAEvB,QAAM,OAAO,YAAY,MAAM;AAC7B,aAAS,UAAU;AACnB,aAAS,oBAAoB,aAAa,MAAM;AAChD,aAAS,oBAAoB,WAAW,IAAI;AAAA,EAC9C,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,QAAQ,MAAM;AAClB,aAAS,UAAU;AACnB,aAAS,iBAAiB,aAAa,MAAM;AAC7C,aAAS,iBAAiB,WAAW,IAAI;AAAA,EAC3C;AAEA,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,gBAAgB,mBAAmB,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,KAAU,OAAO,EAAE,QAAQ,WAAW,SAAS,OAAA,GAAc,GAAG,MACrK,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAU,uBAAsB,OAAO,WAAW,EAAE,QAAQ,OAAO,IAAA,IAAQ,EAAE,OAAO,OAAO,OAAQ,UAAA,OAAM;AAAA,IAC9G,oBAAC,SAAI,WAAU,wBAAuB,aAAa,OACjD,UAAA,qBAAC,QAAA,EAAK,WAAU,sBAAqB,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK;AAAA,0BAAQ,QAAA,EAAK;AAAA,0BAAQ,QAAA,CAAA,CAAK;AAAA,IAAA,EAAA,CAAO,EAAA,CAC9E;AAAA,IACA,oBAAC,SAAI,WAAU,uBAAsB,OAAO,EAAE,MAAM,EAAA,GAAM,UAAA,OAAA,CAAO;AAAA,EAAA,GACnE;AAEJ;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_SCROLLAREA_CSS = `
|
|
4
|
+
.ax-scrollarea { overflow: auto; position: relative; }
|
|
5
|
+
.ax-scrollarea::-webkit-scrollbar { width: 10px; height: 10px; }
|
|
6
|
+
.ax-scrollarea::-webkit-scrollbar-track { background: transparent; }
|
|
7
|
+
.ax-scrollarea::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: var(--radius-1); border: 3px solid transparent; background-clip: padding-box; }
|
|
8
|
+
.ax-scrollarea::-webkit-scrollbar-thumb:hover { background: var(--text-faint); background-clip: padding-box; }
|
|
9
|
+
.ax-scrollarea { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; }
|
|
10
|
+
.ax-scrollarea--fade::before, .ax-scrollarea--fade::after { content: ""; position: sticky; left: 0; right: 0; display: block; height: 16px; pointer-events: none; z-index: 1; }
|
|
11
|
+
`;
|
|
12
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-scrollarea-css")) {
|
|
13
|
+
const s = document.createElement("style");
|
|
14
|
+
s.id = "ax-scrollarea-css";
|
|
15
|
+
s.textContent = AX_SCROLLAREA_CSS;
|
|
16
|
+
document.head.appendChild(s);
|
|
17
|
+
}
|
|
18
|
+
function ScrollArea({ maxHeight = 240, children, className = "", style = {}, ...rest }) {
|
|
19
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-scrollarea", className].filter(Boolean).join(" "), style: { maxHeight, ...style }, ...rest, children });
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
ScrollArea
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=ScrollArea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollArea.js","sources":["../../../src/components/layout/ScrollArea.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_SCROLLAREA_CSS = `\n.ax-scrollarea { overflow: auto; position: relative; }\n.ax-scrollarea::-webkit-scrollbar { width: 10px; height: 10px; }\n.ax-scrollarea::-webkit-scrollbar-track { background: transparent; }\n.ax-scrollarea::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: var(--radius-1); border: 3px solid transparent; background-clip: padding-box; }\n.ax-scrollarea::-webkit-scrollbar-thumb:hover { background: var(--text-faint); background-clip: padding-box; }\n.ax-scrollarea { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; }\n.ax-scrollarea--fade::before, .ax-scrollarea--fade::after { content: \"\"; position: sticky; left: 0; right: 0; display: block; height: 16px; pointer-events: none; z-index: 1; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-scrollarea-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-scrollarea-css\";\n s.textContent = AX_SCROLLAREA_CSS;\n document.head.appendChild(s);\n}\n\nexport function ScrollArea({ maxHeight = 240, children, className = \"\", style = {}, ...rest }) {\n return (\n <div className={[\"ax-scrollarea\", className].filter(Boolean).join(\" \")} style={{ maxHeight, ...style }} {...rest}>\n {children}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU1B,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,mBAAmB,GAAG;AACpF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,WAAW,EAAE,YAAY,KAAK,UAAU,YAAY,IAAI,QAAQ,CAAA,GAAI,GAAG,QAAQ;AAC7F,SACE,oBAAC,SAAI,WAAW,CAAC,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,OAAO,EAAE,WAAW,GAAG,SAAU,GAAG,MACzG,UACH;AAEJ;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Generic app sidebar: grouped nav items with icons, badges, active accent bar; collapsible to icons. */
|
|
2
|
+
export interface SidebarItem { id: string; label: string; icon?: React.ReactNode; badge?: React.ReactNode; }
|
|
3
|
+
export interface SidebarGroup { label?: string; items: SidebarItem[]; }
|
|
4
|
+
export interface SidebarProps { groups: SidebarGroup[]; activeId?: string; onSelect?: (id: string) => void; header?: React.ReactNode; footer?: React.ReactNode; collapsed?: boolean; }
|
|
5
|
+
export declare function Sidebar(props: SidebarProps): JSX.Element;
|