@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,42 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_CHECKBOX_CSS = `
|
|
4
|
+
.ax-check { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }
|
|
5
|
+
.ax-check input { position: absolute; opacity: 0; width: 0; height: 0; }
|
|
6
|
+
.ax-check__box {
|
|
7
|
+
width: 16px; height: 16px; flex: none; position: relative;
|
|
8
|
+
background: var(--surface-card); border: 1px solid var(--border-strong);
|
|
9
|
+
border-radius: var(--radius-1);
|
|
10
|
+
transition: background var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);
|
|
11
|
+
}
|
|
12
|
+
.ax-check__box::after {
|
|
13
|
+
content: ""; position: absolute; left: 4.5px; top: 1.5px;
|
|
14
|
+
width: 4px; height: 8px; opacity: 0;
|
|
15
|
+
border-right: 2px solid var(--accent-fg);
|
|
16
|
+
border-bottom: 2px solid var(--accent-fg);
|
|
17
|
+
transform: rotate(45deg);
|
|
18
|
+
transition: opacity var(--dur-1) var(--ease-out);
|
|
19
|
+
}
|
|
20
|
+
.ax-check input:checked + .ax-check__box { background: var(--accent); border-color: var(--accent); }
|
|
21
|
+
.ax-check input:checked + .ax-check__box::after { opacity: 1; }
|
|
22
|
+
.ax-check input:focus-visible + .ax-check__box { box-shadow: var(--ring); }
|
|
23
|
+
.ax-check input:disabled + .ax-check__box { opacity: 0.4; }
|
|
24
|
+
.ax-check__label { font-size: var(--text-sm); color: var(--text-body); }
|
|
25
|
+
`;
|
|
26
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-checkbox-css")) {
|
|
27
|
+
const s = document.createElement("style");
|
|
28
|
+
s.id = "ax-checkbox-css";
|
|
29
|
+
s.textContent = AX_CHECKBOX_CSS;
|
|
30
|
+
document.head.appendChild(s);
|
|
31
|
+
}
|
|
32
|
+
function Checkbox({ label, className = "", ...rest }) {
|
|
33
|
+
return /* @__PURE__ */ jsxs("label", { className: ["ax-check", className].filter(Boolean).join(" "), children: [
|
|
34
|
+
/* @__PURE__ */ jsx("input", { type: "checkbox", ...rest }),
|
|
35
|
+
/* @__PURE__ */ jsx("span", { className: "ax-check__box" }),
|
|
36
|
+
label ? /* @__PURE__ */ jsx("span", { className: "ax-check__label", children: label }) : null
|
|
37
|
+
] });
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
Checkbox
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/inputs/Checkbox.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_CHECKBOX_CSS = `\n.ax-check { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }\n.ax-check input { position: absolute; opacity: 0; width: 0; height: 0; }\n.ax-check__box {\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: background var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);\n}\n.ax-check__box::after {\n content: \"\"; position: absolute; left: 4.5px; top: 1.5px;\n width: 4px; height: 8px; opacity: 0;\n border-right: 2px solid var(--accent-fg);\n border-bottom: 2px solid var(--accent-fg);\n transform: rotate(45deg);\n transition: opacity var(--dur-1) var(--ease-out);\n}\n.ax-check input:checked + .ax-check__box { background: var(--accent); border-color: var(--accent); }\n.ax-check input:checked + .ax-check__box::after { opacity: 1; }\n.ax-check input:focus-visible + .ax-check__box { box-shadow: var(--ring); }\n.ax-check input:disabled + .ax-check__box { opacity: 0.4; }\n.ax-check__label { font-size: var(--text-sm); color: var(--text-body); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-checkbox-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-checkbox-css\";\n s.textContent = AX_CHECKBOX_CSS;\n document.head.appendChild(s);\n}\n\nexport function Checkbox({ label, className = \"\", ...rest }) {\n return (\n <label className={[\"ax-check\", className].filter(Boolean).join(\" \")}>\n <input type=\"checkbox\" {...rest} />\n <span className=\"ax-check__box\"></span>\n {label ? <span className=\"ax-check__label\">{label}</span> : null}\n </label>\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;AAwBxB,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,YAAY,IAAI,GAAG,QAAQ;AAC3D,SACE,qBAAC,SAAA,EAAM,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAChE,UAAA;AAAA,IAAA,oBAAC,SAAA,EAAM,MAAK,YAAY,GAAG,KAAA,CAAM;AAAA,IACjC,oBAAC,QAAA,EAAK,WAAU,gBAAA,CAAgB;AAAA,IAC/B,QAAQ,oBAAC,QAAA,EAAK,WAAU,mBAAmB,iBAAM,IAAU;AAAA,EAAA,GAC9D;AAEJ;"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Searchable single-select with keyboard nav and a check on the chosen option. */
|
|
2
|
+
export interface ComboboxProps { value?: string; options: Array<string | { value: string; label: string }>; placeholder?: string; searchPlaceholder?: string; onChange?: (value: string) => void; }
|
|
3
|
+
export declare function Combobox(props: ComboboxProps): JSX.Element;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useMemo, useCallback, useEffect } from "react";
|
|
3
|
+
const AX_COMBOBOX_CSS = `
|
|
4
|
+
.ax-combobox { position: relative; display: inline-flex; flex-direction: column; min-width: 220px; }
|
|
5
|
+
.ax-combobox__trigger { display: flex; align-items: center; gap: 8px; height: 36px; padding: 0 10px 0 12px; cursor: pointer; background: var(--surface-card); border: 1px solid var(--border-default); border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); transition: border-color var(--dur-1) var(--ease-out); }
|
|
6
|
+
.ax-combobox__trigger:hover { border-color: var(--border-strong); }
|
|
7
|
+
.ax-combobox__trigger:focus-visible { outline: none; box-shadow: var(--ring); }
|
|
8
|
+
.ax-combobox__value { flex: 1; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
9
|
+
.ax-combobox__value--empty { color: var(--text-faint); }
|
|
10
|
+
.ax-combobox__chev { width: 14px; height: 14px; color: var(--text-faint); }
|
|
11
|
+
.ax-combobox__panel { position: absolute; z-index: 60; top: calc(100% + 6px); left: 0; right: 0; background: var(--surface-panel); border: 1px solid var(--border-strong); border-radius: var(--radius-3); box-shadow: var(--shadow-2); overflow: hidden; animation: ax-combobox-in var(--dur-2) var(--ease-out); }
|
|
12
|
+
.ax-combobox__search { width: 100%; height: 38px; padding: 0 12px; background: none; border: none; border-bottom: 1px solid var(--border-default); outline: none; color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); }
|
|
13
|
+
.ax-combobox__search::placeholder { color: var(--text-faint); }
|
|
14
|
+
.ax-combobox__list { max-height: 200px; overflow-y: auto; padding: var(--space-1); }
|
|
15
|
+
.ax-combobox__opt { display: flex; align-items: center; gap: 8px; width: 100%; appearance: none; background: none; border: none; text-align: left; cursor: pointer; padding: 8px 10px; border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); }
|
|
16
|
+
.ax-combobox__opt--active { background: var(--surface-raised); }
|
|
17
|
+
.ax-combobox__check { width: 14px; flex: none; color: var(--accent); }
|
|
18
|
+
.ax-combobox__empty { padding: 20px; text-align: center; color: var(--text-faint); font-size: var(--text-sm); }
|
|
19
|
+
@keyframes ax-combobox-in { from { opacity: 0; transform: translateY(-4px); } }
|
|
20
|
+
@media (prefers-reduced-motion: reduce) { .ax-combobox__panel { animation: none; } }
|
|
21
|
+
`;
|
|
22
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-combobox-css")) {
|
|
23
|
+
const s = document.createElement("style");
|
|
24
|
+
s.id = "ax-combobox-css";
|
|
25
|
+
s.textContent = AX_COMBOBOX_CSS;
|
|
26
|
+
document.head.appendChild(s);
|
|
27
|
+
}
|
|
28
|
+
const Chev = /* @__PURE__ */ jsx("svg", { className: "ax-combobox__chev", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m7 15 5 5 5-5M7 9l5-5 5 5" }) });
|
|
29
|
+
const Check = /* @__PURE__ */ jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) });
|
|
30
|
+
function Combobox({ value, options = [], placeholder = "Select…", searchPlaceholder = "Search…", onChange, className = "", ...rest }) {
|
|
31
|
+
const [open, setOpen] = useState(false);
|
|
32
|
+
const [query, setQuery] = useState("");
|
|
33
|
+
const [active, setActive] = useState(0);
|
|
34
|
+
const ref = useRef(null);
|
|
35
|
+
const searchRef = useRef(null);
|
|
36
|
+
const norm = (o) => typeof o === "string" ? { value: o, label: o } : o;
|
|
37
|
+
const filtered = useMemo(() => {
|
|
38
|
+
const q = query.trim().toLowerCase();
|
|
39
|
+
return options.map(norm).filter((o) => !q || o.label.toLowerCase().includes(q));
|
|
40
|
+
}, [options, query]);
|
|
41
|
+
const current = options.map(norm).find((o) => o.value === value);
|
|
42
|
+
const onDoc = useCallback((e) => {
|
|
43
|
+
if (ref.current && !ref.current.contains(e.target)) setOpen(false);
|
|
44
|
+
}, []);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (open) {
|
|
47
|
+
document.addEventListener("mousedown", onDoc);
|
|
48
|
+
if (searchRef.current) searchRef.current.focus();
|
|
49
|
+
return () => document.removeEventListener("mousedown", onDoc);
|
|
50
|
+
} else {
|
|
51
|
+
setQuery("");
|
|
52
|
+
setActive(0);
|
|
53
|
+
}
|
|
54
|
+
}, [open, onDoc]);
|
|
55
|
+
const choose = (o) => {
|
|
56
|
+
onChange && onChange(o.value);
|
|
57
|
+
setOpen(false);
|
|
58
|
+
};
|
|
59
|
+
const onKey = (e) => {
|
|
60
|
+
if (e.key === "ArrowDown") {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
setActive((a) => Math.min(a + 1, filtered.length - 1));
|
|
63
|
+
} else if (e.key === "ArrowUp") {
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
setActive((a) => Math.max(a - 1, 0));
|
|
66
|
+
} else if (e.key === "Enter") {
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
if (filtered[active]) choose(filtered[active]);
|
|
69
|
+
} else if (e.key === "Escape") setOpen(false);
|
|
70
|
+
};
|
|
71
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-combobox", className].filter(Boolean).join(" "), ref, ...rest, children: [
|
|
72
|
+
/* @__PURE__ */ jsxs("button", { className: "ax-combobox__trigger", onClick: () => setOpen((o) => !o), children: [
|
|
73
|
+
/* @__PURE__ */ jsx("span", { className: "ax-combobox__value" + (current ? "" : " ax-combobox__value--empty"), children: current ? current.label : placeholder }),
|
|
74
|
+
Chev
|
|
75
|
+
] }),
|
|
76
|
+
open ? /* @__PURE__ */ jsxs("div", { className: "ax-combobox__panel", children: [
|
|
77
|
+
/* @__PURE__ */ jsx("input", { ref: searchRef, className: "ax-combobox__search", placeholder: searchPlaceholder, value: query, onChange: (e) => {
|
|
78
|
+
setQuery(e.target.value);
|
|
79
|
+
setActive(0);
|
|
80
|
+
}, onKeyDown: onKey }),
|
|
81
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-combobox__list", children: [
|
|
82
|
+
filtered.length === 0 ? /* @__PURE__ */ jsx("div", { className: "ax-combobox__empty", children: "No match." }) : null,
|
|
83
|
+
filtered.map((o, i) => /* @__PURE__ */ jsxs("button", { className: "ax-combobox__opt" + (i === active ? " ax-combobox__opt--active" : ""), onMouseEnter: () => setActive(i), onClick: () => choose(o), children: [
|
|
84
|
+
/* @__PURE__ */ jsx("span", { className: "ax-combobox__check", children: o.value === value ? Check : null }),
|
|
85
|
+
o.label
|
|
86
|
+
] }, o.value))
|
|
87
|
+
] })
|
|
88
|
+
] }) : null
|
|
89
|
+
] });
|
|
90
|
+
}
|
|
91
|
+
export {
|
|
92
|
+
Combobox
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=Combobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.js","sources":["../../../src/components/inputs/Combobox.jsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, useMemo } from \"react\";\n\nconst AX_COMBOBOX_CSS = `\n.ax-combobox { position: relative; display: inline-flex; flex-direction: column; min-width: 220px; }\n.ax-combobox__trigger { display: flex; align-items: center; gap: 8px; height: 36px; padding: 0 10px 0 12px; cursor: pointer; background: var(--surface-card); border: 1px solid var(--border-default); border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); transition: border-color var(--dur-1) var(--ease-out); }\n.ax-combobox__trigger:hover { border-color: var(--border-strong); }\n.ax-combobox__trigger:focus-visible { outline: none; box-shadow: var(--ring); }\n.ax-combobox__value { flex: 1; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-combobox__value--empty { color: var(--text-faint); }\n.ax-combobox__chev { width: 14px; height: 14px; color: var(--text-faint); }\n.ax-combobox__panel { position: absolute; z-index: 60; top: calc(100% + 6px); left: 0; right: 0; background: var(--surface-panel); border: 1px solid var(--border-strong); border-radius: var(--radius-3); box-shadow: var(--shadow-2); overflow: hidden; animation: ax-combobox-in var(--dur-2) var(--ease-out); }\n.ax-combobox__search { width: 100%; height: 38px; padding: 0 12px; background: none; border: none; border-bottom: 1px solid var(--border-default); outline: none; color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); }\n.ax-combobox__search::placeholder { color: var(--text-faint); }\n.ax-combobox__list { max-height: 200px; overflow-y: auto; padding: var(--space-1); }\n.ax-combobox__opt { display: flex; align-items: center; gap: 8px; width: 100%; appearance: none; background: none; border: none; text-align: left; cursor: pointer; padding: 8px 10px; border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); }\n.ax-combobox__opt--active { background: var(--surface-raised); }\n.ax-combobox__check { width: 14px; flex: none; color: var(--accent); }\n.ax-combobox__empty { padding: 20px; text-align: center; color: var(--text-faint); font-size: var(--text-sm); }\n@keyframes ax-combobox-in { from { opacity: 0; transform: translateY(-4px); } }\n@media (prefers-reduced-motion: reduce) { .ax-combobox__panel { animation: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-combobox-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-combobox-css\";\n s.textContent = AX_COMBOBOX_CSS;\n document.head.appendChild(s);\n}\n\nconst Chev = <svg className=\"ax-combobox__chev\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"m7 15 5 5 5-5M7 9l5-5 5 5\"></path></svg>;\nconst Check = <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"></path></svg>;\n\nexport function Combobox({ value, options = [], placeholder = \"Select…\", searchPlaceholder = \"Search…\", onChange, className = \"\", ...rest }) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [active, setActive] = useState(0);\n const ref = useRef(null);\n const searchRef = useRef(null);\n\n const norm = (o) => (typeof o === \"string\" ? { value: o, label: o } : o);\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n return options.map(norm).filter((o) => !q || o.label.toLowerCase().includes(q));\n }, [options, query]);\n\n const current = options.map(norm).find((o) => o.value === value);\n\n const onDoc = useCallback((e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }, []);\n useEffect(() => {\n if (open) {\n document.addEventListener(\"mousedown\", onDoc);\n if (searchRef.current) searchRef.current.focus();\n return () => document.removeEventListener(\"mousedown\", onDoc);\n } else { setQuery(\"\"); setActive(0); }\n }, [open, onDoc]);\n\n const choose = (o) => { onChange && onChange(o.value); setOpen(false); };\n const onKey = (e) => {\n if (e.key === \"ArrowDown\") { e.preventDefault(); setActive((a) => Math.min(a + 1, filtered.length - 1)); }\n else if (e.key === \"ArrowUp\") { e.preventDefault(); setActive((a) => Math.max(a - 1, 0)); }\n else if (e.key === \"Enter\") { e.preventDefault(); if (filtered[active]) choose(filtered[active]); }\n else if (e.key === \"Escape\") setOpen(false);\n };\n\n return (\n <div className={[\"ax-combobox\", className].filter(Boolean).join(\" \")} ref={ref} {...rest}>\n <button className=\"ax-combobox__trigger\" onClick={() => setOpen((o) => !o)}>\n <span className={\"ax-combobox__value\" + (current ? \"\" : \" ax-combobox__value--empty\")}>{current ? current.label : placeholder}</span>\n {Chev}\n </button>\n {open ? (\n <div className=\"ax-combobox__panel\">\n <input ref={searchRef} className=\"ax-combobox__search\" placeholder={searchPlaceholder} value={query} onChange={(e) => { setQuery(e.target.value); setActive(0); }} onKeyDown={onKey} />\n <div className=\"ax-combobox__list\">\n {filtered.length === 0 ? <div className=\"ax-combobox__empty\">No match.</div> : null}\n {filtered.map((o, i) => (\n <button key={o.value} className={\"ax-combobox__opt\" + (i === active ? \" ax-combobox__opt--active\" : \"\")} onMouseEnter={() => setActive(i)} onClick={() => choose(o)}>\n <span className=\"ax-combobox__check\">{o.value === value ? Check : null}</span>\n {o.label}\n </button>\n ))}\n </div>\n </div>\n ) : null}\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;AAoBxB,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,2BAAQ,OAAA,EAAI,WAAU,qBAAoB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA,oBAAC,QAAA,EAAK,GAAE,4BAAA,CAA4B,EAAA,CAAO;AAC9M,MAAM,4BAAS,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,UAAA,oBAAC,QAAA,EAAK,GAAE,kBAAA,CAAkB,EAAA,CAAO;AAEzL,SAAS,SAAS,EAAE,OAAO,UAAU,CAAA,GAAI,cAAc,WAAW,oBAAoB,WAAW,UAAU,YAAY,IAAI,GAAG,QAAQ;AAC3I,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,CAAC;AACtC,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,YAAY,OAAO,IAAI;AAE7B,QAAM,OAAO,CAAC,MAAO,OAAO,MAAM,WAAW,EAAE,OAAO,GAAG,OAAO,EAAA,IAAM;AACtE,QAAM,WAAW,QAAQ,MAAM;AAC7B,UAAM,IAAI,MAAM,KAAA,EAAO,YAAA;AACvB,WAAO,QAAQ,IAAI,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,YAAA,EAAc,SAAS,CAAC,CAAC;AAAA,EAChF,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,UAAU,QAAQ,IAAI,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AAE/D,QAAM,QAAQ,YAAY,CAAC,MAAM;AAAE,QAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAM,EAAG,SAAQ,KAAK;AAAA,EAAG,GAAG,CAAA,CAAE;AAC5G,YAAU,MAAM;AACd,QAAI,MAAM;AACR,eAAS,iBAAiB,aAAa,KAAK;AAC5C,UAAI,UAAU,QAAS,WAAU,QAAQ,MAAA;AACzC,aAAO,MAAM,SAAS,oBAAoB,aAAa,KAAK;AAAA,IAC9D,OAAO;AAAE,eAAS,EAAE;AAAG,gBAAU,CAAC;AAAA,IAAG;AAAA,EACvC,GAAG,CAAC,MAAM,KAAK,CAAC;AAEhB,QAAM,SAAS,CAAC,MAAM;AAAE,gBAAY,SAAS,EAAE,KAAK;AAAG,YAAQ,KAAK;AAAA,EAAG;AACvE,QAAM,QAAQ,CAAC,MAAM;AACnB,QAAI,EAAE,QAAQ,aAAa;AAAE,QAAE,eAAA;AAAkB,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,SAAS,SAAS,CAAC,CAAC;AAAA,IAAG,WAChG,EAAE,QAAQ,WAAW;AAAE,QAAE,eAAA;AAAkB,gBAAU,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IAAG,WACjF,EAAE,QAAQ,SAAS;AAAE,QAAE,eAAA;AAAkB,UAAI,SAAS,MAAM,EAAG,QAAO,SAAS,MAAM,CAAC;AAAA,IAAG,WACzF,EAAE,QAAQ,kBAAkB,KAAK;AAAA,EAC5C;AAEA,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,KAAW,GAAG,MAClF,UAAA;AAAA,IAAA,qBAAC,UAAA,EAAO,WAAU,wBAAuB,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GACvE,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAW,wBAAwB,UAAU,KAAK,+BAAgC,UAAA,UAAU,QAAQ,QAAQ,YAAA,CAAY;AAAA,MAC7H;AAAA,IAAA,GACH;AAAA,IACC,OACC,qBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,MAAA,oBAAC,SAAA,EAAM,KAAK,WAAW,WAAU,uBAAsB,aAAa,mBAAmB,OAAO,OAAO,UAAU,CAAC,MAAM;AAAE,iBAAS,EAAE,OAAO,KAAK;AAAG,kBAAU,CAAC;AAAA,MAAG,GAAG,WAAW,OAAO;AAAA,MACrL,qBAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,QAAA,SAAS,WAAW,IAAI,oBAAC,SAAI,WAAU,sBAAqB,uBAAS,IAAS;AAAA,QAC9E,SAAS,IAAI,CAAC,GAAG,MAChB,qBAAC,UAAA,EAAqB,WAAW,sBAAsB,MAAM,SAAS,8BAA8B,KAAK,cAAc,MAAM,UAAU,CAAC,GAAG,SAAS,MAAM,OAAO,CAAC,GAChK,UAAA;AAAA,UAAA,oBAAC,UAAK,WAAU,sBAAsB,YAAE,UAAU,QAAQ,QAAQ,KAAA,CAAK;AAAA,UACtE,EAAE;AAAA,QAAA,EAAA,GAFQ,EAAE,KAGf,CACD;AAAA,MAAA,EAAA,CACH;AAAA,IAAA,EAAA,CACF,IACE;AAAA,EAAA,GACN;AAEJ;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useCallback, useEffect } from "react";
|
|
3
|
+
import { Calendar } from "./Calendar.js";
|
|
4
|
+
const AX_DATEPICKER_CSS = `
|
|
5
|
+
.ax-datepicker { position: relative; display: inline-flex; }
|
|
6
|
+
.ax-datepicker__trigger { display: inline-flex; align-items: center; gap: 10px; height: 36px; padding: 0 12px; cursor: pointer; background: var(--surface-card); border: 1px solid var(--border-default); border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-mono); font-size: var(--text-sm); transition: border-color var(--dur-1) var(--ease-out); }
|
|
7
|
+
.ax-datepicker__trigger:hover { border-color: var(--border-strong); }
|
|
8
|
+
.ax-datepicker__trigger:focus-visible { outline: none; box-shadow: var(--ring); }
|
|
9
|
+
.ax-datepicker__icon { width: 15px; height: 15px; color: var(--text-faint); }
|
|
10
|
+
.ax-datepicker__value--empty { color: var(--text-faint); }
|
|
11
|
+
.ax-datepicker__pop { position: absolute; z-index: 60; top: calc(100% + 6px); left: 0; animation: ax-datepicker-in var(--dur-2) var(--ease-out); }
|
|
12
|
+
@keyframes ax-datepicker-in { from { opacity: 0; transform: translateY(-4px); } }
|
|
13
|
+
@media (prefers-reduced-motion: reduce) { .ax-datepicker__pop { animation: none; } }
|
|
14
|
+
`;
|
|
15
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-datepicker-css")) {
|
|
16
|
+
const s = document.createElement("style");
|
|
17
|
+
s.id = "ax-datepicker-css";
|
|
18
|
+
s.textContent = AX_DATEPICKER_CSS;
|
|
19
|
+
document.head.appendChild(s);
|
|
20
|
+
}
|
|
21
|
+
const CalIcon = /* @__PURE__ */ jsxs("svg", { className: "ax-datepicker__icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
22
|
+
/* @__PURE__ */ jsx("rect", { x: "3", y: "4", width: "18", height: "18", rx: "2" }),
|
|
23
|
+
/* @__PURE__ */ jsx("path", { d: "M16 2v4M8 2v4M3 10h18" })
|
|
24
|
+
] });
|
|
25
|
+
function format(d) {
|
|
26
|
+
if (!d) return null;
|
|
27
|
+
const p = (n) => String(n).padStart(2, "0");
|
|
28
|
+
return d.getFullYear() + "-" + p(d.getMonth() + 1) + "-" + p(d.getDate());
|
|
29
|
+
}
|
|
30
|
+
function DatePicker({ value, onChange, placeholder = "Pick a date", className = "", ...rest }) {
|
|
31
|
+
const [open, setOpen] = useState(false);
|
|
32
|
+
const ref = useRef(null);
|
|
33
|
+
const onDoc = useCallback((e) => {
|
|
34
|
+
if (ref.current && !ref.current.contains(e.target)) setOpen(false);
|
|
35
|
+
}, []);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (open) {
|
|
38
|
+
document.addEventListener("mousedown", onDoc);
|
|
39
|
+
return () => document.removeEventListener("mousedown", onDoc);
|
|
40
|
+
}
|
|
41
|
+
}, [open, onDoc]);
|
|
42
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-datepicker", className].filter(Boolean).join(" "), ref, ...rest, children: [
|
|
43
|
+
/* @__PURE__ */ jsxs("button", { className: "ax-datepicker__trigger", onClick: () => setOpen((o) => !o), children: [
|
|
44
|
+
CalIcon,
|
|
45
|
+
/* @__PURE__ */ jsx("span", { className: value ? "" : "ax-datepicker__value--empty", children: value ? format(value) : placeholder })
|
|
46
|
+
] }),
|
|
47
|
+
open ? /* @__PURE__ */ jsx("div", { className: "ax-datepicker__pop", children: /* @__PURE__ */ jsx(Calendar, { value, onChange: (d) => {
|
|
48
|
+
onChange && onChange(d);
|
|
49
|
+
setOpen(false);
|
|
50
|
+
} }) }) : null
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
DatePicker
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=DatePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DatePicker.js","sources":["../../../src/components/inputs/DatePicker.jsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Calendar } from \"./Calendar.jsx\";\n\nconst AX_DATEPICKER_CSS = `\n.ax-datepicker { position: relative; display: inline-flex; }\n.ax-datepicker__trigger { display: inline-flex; align-items: center; gap: 10px; height: 36px; padding: 0 12px; cursor: pointer; background: var(--surface-card); border: 1px solid var(--border-default); border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-mono); font-size: var(--text-sm); transition: border-color var(--dur-1) var(--ease-out); }\n.ax-datepicker__trigger:hover { border-color: var(--border-strong); }\n.ax-datepicker__trigger:focus-visible { outline: none; box-shadow: var(--ring); }\n.ax-datepicker__icon { width: 15px; height: 15px; color: var(--text-faint); }\n.ax-datepicker__value--empty { color: var(--text-faint); }\n.ax-datepicker__pop { position: absolute; z-index: 60; top: calc(100% + 6px); left: 0; animation: ax-datepicker-in var(--dur-2) var(--ease-out); }\n@keyframes ax-datepicker-in { from { opacity: 0; transform: translateY(-4px); } }\n@media (prefers-reduced-motion: reduce) { .ax-datepicker__pop { animation: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-datepicker-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-datepicker-css\";\n s.textContent = AX_DATEPICKER_CSS;\n document.head.appendChild(s);\n}\n\nconst CalIcon = <svg className=\"ax-datepicker__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect><path d=\"M16 2v4M8 2v4M3 10h18\"></path></svg>;\n\nfunction format(d) {\n if (!d) return null;\n const p = (n) => String(n).padStart(2, \"0\");\n return d.getFullYear() + \"-\" + p(d.getMonth() + 1) + \"-\" + p(d.getDate());\n}\n\nexport function DatePicker({ value, onChange, placeholder = \"Pick a date\", className = \"\", ...rest }) {\n const [open, setOpen] = useState(false);\n const ref = useRef(null);\n const onDoc = useCallback((e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }, []);\n useEffect(() => {\n if (open) { document.addEventListener(\"mousedown\", onDoc); return () => document.removeEventListener(\"mousedown\", onDoc); }\n }, [open, onDoc]);\n return (\n <div className={[\"ax-datepicker\", className].filter(Boolean).join(\" \")} ref={ref} {...rest}>\n <button className=\"ax-datepicker__trigger\" onClick={() => setOpen((o) => !o)}>\n {CalIcon}\n <span className={value ? \"\" : \"ax-datepicker__value--empty\"}>{value ? format(value) : placeholder}</span>\n </button>\n {open ? (\n <div className=\"ax-datepicker__pop\">\n <Calendar value={value} onChange={(d) => { onChange && onChange(d); setOpen(false); }} />\n </div>\n ) : null}\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY1B,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;AAEA,MAAM,UAAU,qBAAC,OAAA,EAAI,WAAU,uBAAsB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,UAAA;AAAA,EAAA,oBAAC,QAAA,EAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,IAAA,CAAI;AAAA,EAAO,oBAAC,QAAA,EAAK,GAAE,wBAAA,CAAwB;AAAA,GAAO;AAEtQ,SAAS,OAAO,GAAG;AACjB,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAC1C,SAAO,EAAE,YAAA,IAAgB,MAAM,EAAE,EAAE,aAAa,CAAC,IAAI,MAAM,EAAE,EAAE,SAAS;AAC1E;AAEO,SAAS,WAAW,EAAE,OAAO,UAAU,cAAc,eAAe,YAAY,IAAI,GAAG,QAAQ;AACpG,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,QAAQ,YAAY,CAAC,MAAM;AAAE,QAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAM,EAAG,SAAQ,KAAK;AAAA,EAAG,GAAG,CAAA,CAAE;AAC5G,YAAU,MAAM;AACd,QAAI,MAAM;AAAE,eAAS,iBAAiB,aAAa,KAAK;AAAG,aAAO,MAAM,SAAS,oBAAoB,aAAa,KAAK;AAAA,IAAG;AAAA,EAC5H,GAAG,CAAC,MAAM,KAAK,CAAC;AAChB,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,KAAW,GAAG,MACpF,UAAA;AAAA,IAAA,qBAAC,UAAA,EAAO,WAAU,0BAAyB,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GACxE,UAAA;AAAA,MAAA;AAAA,MACD,oBAAC,QAAA,EAAK,WAAW,QAAQ,KAAK,+BAAgC,UAAA,QAAQ,OAAO,KAAK,IAAI,YAAA,CAAY;AAAA,IAAA,GACpG;AAAA,IACC,OACC,oBAAC,OAAA,EAAI,WAAU,sBACb,8BAAC,UAAA,EAAS,OAAc,UAAU,CAAC,MAAM;AAAE,kBAAY,SAAS,CAAC;AAAG,cAAQ,KAAK;AAAA,IAAG,EAAA,CAAG,GACzF,IACE;AAAA,EAAA,GACN;AAEJ;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Field wrapper (label + control + hint/error) and FieldGroup (stack or bordered fieldset). */
|
|
2
|
+
export interface FieldProps { label?: React.ReactNode; required?: boolean; hint?: React.ReactNode; error?: React.ReactNode; row?: boolean; children?: React.ReactNode; }
|
|
3
|
+
export declare function Field(props: FieldProps): JSX.Element;
|
|
4
|
+
export interface FieldGroupProps { legend?: React.ReactNode; children?: React.ReactNode; }
|
|
5
|
+
export declare function FieldGroup(props: FieldGroupProps): JSX.Element;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_FIELD_GRP_CSS = `
|
|
4
|
+
.ax-field-group { display: flex; flex-direction: column; gap: 18px; }
|
|
5
|
+
.ax-field2 { display: flex; flex-direction: column; gap: 6px; }
|
|
6
|
+
.ax-field2__label { font-family: var(--font-mono); font-size: var(--text-xs); font-weight: var(--weight-medium); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); display: flex; align-items: center; gap: 6px; }
|
|
7
|
+
.ax-field2__req { color: var(--danger); }
|
|
8
|
+
.ax-field2__hint { font-size: var(--text-xs); color: var(--text-faint); }
|
|
9
|
+
.ax-field2__error { font-size: var(--text-xs); color: var(--danger); }
|
|
10
|
+
.ax-field2--row { flex-direction: row; align-items: center; justify-content: space-between; gap: 16px; }
|
|
11
|
+
.ax-field2--row .ax-field2__control { flex: none; }
|
|
12
|
+
.ax-fieldset { border: 1px solid var(--border-default); border-radius: var(--radius-3); padding: 16px; display: flex; flex-direction: column; gap: 16px; }
|
|
13
|
+
.ax-fieldset__legend { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-muted); padding: 0 4px; }
|
|
14
|
+
`;
|
|
15
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-field-grp-css")) {
|
|
16
|
+
const s = document.createElement("style");
|
|
17
|
+
s.id = "ax-field-grp-css";
|
|
18
|
+
s.textContent = AX_FIELD_GRP_CSS;
|
|
19
|
+
document.head.appendChild(s);
|
|
20
|
+
}
|
|
21
|
+
function Field({ label, required, hint, error, row = false, children, className = "", ...rest }) {
|
|
22
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-field2", row ? "ax-field2--row" : "", className].filter(Boolean).join(" "), ...rest, children: [
|
|
23
|
+
label ? /* @__PURE__ */ jsxs("span", { className: "ax-field2__label", children: [
|
|
24
|
+
label,
|
|
25
|
+
required ? /* @__PURE__ */ jsx("span", { className: "ax-field2__req", children: "*" }) : null
|
|
26
|
+
] }) : null,
|
|
27
|
+
/* @__PURE__ */ jsx("div", { className: "ax-field2__control", children }),
|
|
28
|
+
error ? /* @__PURE__ */ jsx("span", { className: "ax-field2__error", children: error }) : hint ? /* @__PURE__ */ jsx("span", { className: "ax-field2__hint", children: hint }) : null
|
|
29
|
+
] });
|
|
30
|
+
}
|
|
31
|
+
function FieldGroup({ legend, children, className = "", ...rest }) {
|
|
32
|
+
if (legend) {
|
|
33
|
+
return /* @__PURE__ */ jsxs("fieldset", { className: ["ax-fieldset", className].filter(Boolean).join(" "), ...rest, children: [
|
|
34
|
+
/* @__PURE__ */ jsx("legend", { className: "ax-fieldset__legend", children: legend }),
|
|
35
|
+
children
|
|
36
|
+
] });
|
|
37
|
+
}
|
|
38
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-field-group", className].filter(Boolean).join(" "), ...rest, children });
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
Field,
|
|
42
|
+
FieldGroup
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=Field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Field.js","sources":["../../../src/components/inputs/Field.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_FIELD_GRP_CSS = `\n.ax-field-group { display: flex; flex-direction: column; gap: 18px; }\n.ax-field2 { display: flex; flex-direction: column; gap: 6px; }\n.ax-field2__label { font-family: var(--font-mono); font-size: var(--text-xs); font-weight: var(--weight-medium); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); display: flex; align-items: center; gap: 6px; }\n.ax-field2__req { color: var(--danger); }\n.ax-field2__hint { font-size: var(--text-xs); color: var(--text-faint); }\n.ax-field2__error { font-size: var(--text-xs); color: var(--danger); }\n.ax-field2--row { flex-direction: row; align-items: center; justify-content: space-between; gap: 16px; }\n.ax-field2--row .ax-field2__control { flex: none; }\n.ax-fieldset { border: 1px solid var(--border-default); border-radius: var(--radius-3); padding: 16px; display: flex; flex-direction: column; gap: 16px; }\n.ax-fieldset__legend { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-muted); padding: 0 4px; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-field-grp-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-field-grp-css\";\n s.textContent = AX_FIELD_GRP_CSS;\n document.head.appendChild(s);\n}\n\nexport function Field({ label, required, hint, error, row = false, children, className = \"\", ...rest }) {\n return (\n <div className={[\"ax-field2\", row ? \"ax-field2--row\" : \"\", className].filter(Boolean).join(\" \")} {...rest}>\n {label ? <span className=\"ax-field2__label\">{label}{required ? <span className=\"ax-field2__req\">*</span> : null}</span> : null}\n <div className=\"ax-field2__control\">{children}</div>\n {error ? <span className=\"ax-field2__error\">{error}</span> : hint ? <span className=\"ax-field2__hint\">{hint}</span> : null}\n </div>\n );\n}\n\nexport function FieldGroup({ legend, children, className = \"\", ...rest }) {\n if (legend) {\n return (\n <fieldset className={[\"ax-fieldset\", className].filter(Boolean).join(\" \")} {...rest}>\n <legend className=\"ax-fieldset__legend\">{legend}</legend>\n {children}\n </fieldset>\n );\n }\n return <div className={[\"ax-field-group\", className].filter(Boolean).join(\" \")} {...rest}>{children}</div>;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazB,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,MAAM,EAAE,OAAO,UAAU,MAAM,OAAO,MAAM,OAAO,UAAU,YAAY,IAAI,GAAG,QAAQ;AACtG,8BACG,OAAA,EAAI,WAAW,CAAC,aAAa,MAAM,mBAAmB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAClG,UAAA;AAAA,IAAA,QAAQ,qBAAC,QAAA,EAAK,WAAU,oBAAoB,UAAA;AAAA,MAAA;AAAA,MAAO,WAAW,oBAAC,QAAA,EAAK,WAAU,kBAAiB,eAAC,IAAU;AAAA,IAAA,EAAA,CAAK,IAAU;AAAA,IAC1H,oBAAC,OAAA,EAAI,WAAU,sBAAsB,SAAA,CAAS;AAAA,IAC7C,QAAQ,oBAAC,QAAA,EAAK,WAAU,oBAAoB,UAAA,MAAA,CAAM,IAAU,OAAO,oBAAC,QAAA,EAAK,WAAU,mBAAmB,gBAAK,IAAU;AAAA,EAAA,GACxH;AAEJ;AAEO,SAAS,WAAW,EAAE,QAAQ,UAAU,YAAY,IAAI,GAAG,QAAQ;AACxE,MAAI,QAAQ;AACV,WACE,qBAAC,YAAA,EAAS,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAC7E,UAAA;AAAA,MAAA,oBAAC,UAAA,EAAO,WAAU,uBAAuB,UAAA,QAAO;AAAA,MAC/C;AAAA,IAAA,GACH;AAAA,EAEJ;AACA,SAAO,oBAAC,OAAA,EAAI,WAAW,CAAC,kBAAkB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAAO,UAAS;AACtG;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-line text field with optional mono ALL-CAPS label, hint and error.
|
|
3
|
+
*/
|
|
4
|
+
export interface InputProps {
|
|
5
|
+
/** Field label, rendered as a mono uppercase eyebrow. */
|
|
6
|
+
label?: string;
|
|
7
|
+
/** Helper text below the field. */
|
|
8
|
+
hint?: string;
|
|
9
|
+
/** Error message; also paints the border red. */
|
|
10
|
+
error?: string;
|
|
11
|
+
/** Use the mono font for the value (ids, keys, code). @default false */
|
|
12
|
+
mono?: boolean;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
value?: string;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
type?: string;
|
|
17
|
+
onChange?: (e: any) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare function Input(props: InputProps): JSX.Element;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_FIELD_CSS = `
|
|
4
|
+
.ax-field { display: flex; flex-direction: column; gap: 6px; }
|
|
5
|
+
.ax-field__label {
|
|
6
|
+
font-family: var(--font-mono); font-size: var(--text-xs);
|
|
7
|
+
font-weight: var(--weight-medium); letter-spacing: var(--tracking-label);
|
|
8
|
+
text-transform: uppercase; color: var(--text-faint);
|
|
9
|
+
}
|
|
10
|
+
/* State priority is declared explicitly via layer order, low -> high.
|
|
11
|
+
This frees each state rule from fighting specificity, so no :not() chains
|
|
12
|
+
are needed and source order is no longer load-bearing. Add a new state by
|
|
13
|
+
slotting a layer, not by patching every other rule. */
|
|
14
|
+
@layer ax-base, ax-hover, ax-focus, ax-error, ax-disabled;
|
|
15
|
+
|
|
16
|
+
@layer ax-base {
|
|
17
|
+
.ax-input {
|
|
18
|
+
height: 36px; padding: 0 12px; width: 100%;
|
|
19
|
+
background: var(--surface-card); color: var(--text-body);
|
|
20
|
+
border: 1px solid var(--border-default); border-radius: var(--radius-2);
|
|
21
|
+
font-family: var(--font-body); font-size: var(--text-sm);
|
|
22
|
+
transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out), background var(--dur-1) var(--ease-out);
|
|
23
|
+
}
|
|
24
|
+
.ax-input::placeholder { color: var(--text-faint); }
|
|
25
|
+
.ax-input--mono { font-family: var(--font-mono); }
|
|
26
|
+
}
|
|
27
|
+
@layer ax-hover {
|
|
28
|
+
.ax-input:hover { border-color: var(--border-strong); }
|
|
29
|
+
}
|
|
30
|
+
@layer ax-focus {
|
|
31
|
+
.ax-input:focus { outline: none; border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }
|
|
32
|
+
}
|
|
33
|
+
@layer ax-error {
|
|
34
|
+
.ax-input--error { border-color: var(--danger); }
|
|
35
|
+
.ax-input--error:focus { box-shadow: 0 0 0 3px var(--danger-dim); }
|
|
36
|
+
}
|
|
37
|
+
@layer ax-disabled {
|
|
38
|
+
.ax-input:disabled { opacity: 0.4; cursor: not-allowed; border-color: var(--border-default); }
|
|
39
|
+
}
|
|
40
|
+
.ax-field__hint { font-size: var(--text-xs); color: var(--text-faint); }
|
|
41
|
+
.ax-field__hint--error { color: var(--danger); }
|
|
42
|
+
`;
|
|
43
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-field-css")) {
|
|
44
|
+
const s = document.createElement("style");
|
|
45
|
+
s.id = "ax-field-css";
|
|
46
|
+
s.textContent = AX_FIELD_CSS;
|
|
47
|
+
document.head.appendChild(s);
|
|
48
|
+
}
|
|
49
|
+
function Input({
|
|
50
|
+
label,
|
|
51
|
+
hint,
|
|
52
|
+
error,
|
|
53
|
+
mono = false,
|
|
54
|
+
className = "",
|
|
55
|
+
...rest
|
|
56
|
+
}) {
|
|
57
|
+
const cls = [
|
|
58
|
+
"ax-input",
|
|
59
|
+
mono ? "ax-input--mono" : "",
|
|
60
|
+
error ? "ax-input--error" : "",
|
|
61
|
+
className
|
|
62
|
+
].filter(Boolean).join(" ");
|
|
63
|
+
return /* @__PURE__ */ jsxs("label", { className: "ax-field", children: [
|
|
64
|
+
label ? /* @__PURE__ */ jsx("span", { className: "ax-field__label", children: label }) : null,
|
|
65
|
+
/* @__PURE__ */ jsx("input", { className: cls, ...rest }),
|
|
66
|
+
error ? /* @__PURE__ */ jsx("span", { className: "ax-field__hint ax-field__hint--error", children: error }) : hint ? /* @__PURE__ */ jsx("span", { className: "ax-field__hint", children: hint }) : null
|
|
67
|
+
] });
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
Input
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=Input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.js","sources":["../../../src/components/inputs/Input.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_FIELD_CSS = `\n.ax-field { display: flex; flex-direction: column; gap: 6px; }\n.ax-field__label {\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/* State priority is declared explicitly via layer order, low -> high.\n This frees each state rule from fighting specificity, so no :not() chains\n are needed and source order is no longer load-bearing. Add a new state by\n slotting a layer, not by patching every other rule. */\n@layer ax-base, ax-hover, ax-focus, ax-error, ax-disabled;\n\n@layer ax-base {\n .ax-input {\n height: 36px; padding: 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);\n transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out), background var(--dur-1) var(--ease-out);\n }\n .ax-input::placeholder { color: var(--text-faint); }\n .ax-input--mono { font-family: var(--font-mono); }\n}\n@layer ax-hover {\n .ax-input:hover { border-color: var(--border-strong); }\n}\n@layer ax-focus {\n .ax-input:focus { outline: none; border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }\n}\n@layer ax-error {\n .ax-input--error { border-color: var(--danger); }\n .ax-input--error:focus { box-shadow: 0 0 0 3px var(--danger-dim); }\n}\n@layer ax-disabled {\n .ax-input:disabled { opacity: 0.4; cursor: not-allowed; border-color: var(--border-default); }\n}\n.ax-field__hint { font-size: var(--text-xs); color: var(--text-faint); }\n.ax-field__hint--error { color: var(--danger); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-field-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-field-css\";\n s.textContent = AX_FIELD_CSS;\n document.head.appendChild(s);\n}\n\nexport function Input({\n label,\n hint,\n error,\n mono = false,\n className = \"\",\n ...rest\n}) {\n const cls = [\n \"ax-input\",\n mono ? \"ax-input--mono\" : \"\",\n error ? \"ax-input--error\" : \"\",\n className,\n ].filter(Boolean).join(\" \");\n return (\n <label className=\"ax-field\">\n {label ? <span className=\"ax-field__label\">{label}</span> : null}\n <input className={cls} {...rest} />\n {error ? <span className=\"ax-field__hint ax-field__hint--error\">{error}</span> :\n hint ? <span className=\"ax-field__hint\">{hint}</span> : null}\n </label>\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyCrB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,cAAc,GAAG;AAC/E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,GAAG;AACL,GAAG;AACD,QAAM,MAAM;AAAA,IACV;AAAA,IACA,OAAO,mBAAmB;AAAA,IAC1B,QAAQ,oBAAoB;AAAA,IAC5B;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAC1B,SACE,qBAAC,SAAA,EAAM,WAAU,YACd,UAAA;AAAA,IAAA,QAAQ,oBAAC,QAAA,EAAK,WAAU,mBAAmB,iBAAM,IAAU;AAAA,IAC5D,oBAAC,SAAA,EAAM,WAAW,KAAM,GAAG,KAAA,CAAM;AAAA,IAChC,QAAQ,oBAAC,QAAA,EAAK,WAAU,wCAAwC,UAAA,MAAA,CAAM,IACrE,OAAO,oBAAC,QAAA,EAAK,WAAU,kBAAkB,gBAAK,IAAU;AAAA,EAAA,GAC5D;AAEJ;"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Input with prefix/suffix addons and an optional attached button. */
|
|
2
|
+
export interface InputGroupProps { prefix?: React.ReactNode; suffix?: React.ReactNode; button?: React.ReactNode; onButtonClick?: () => void; inputProps?: Record<string, any>; }
|
|
3
|
+
export declare function InputGroup(props: InputGroupProps): JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_INPUTGROUP_CSS = `
|
|
4
|
+
.ax-inputgroup { display: flex; align-items: stretch; border: 1px solid var(--border-default); border-radius: var(--radius-2); background: var(--surface-card); overflow: hidden; transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out); }
|
|
5
|
+
.ax-inputgroup:focus-within { border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }
|
|
6
|
+
.ax-inputgroup__input { flex: 1; min-width: 0; height: 36px; padding: 0 12px; background: none; border: none; outline: none; color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); }
|
|
7
|
+
.ax-inputgroup__input::placeholder { color: var(--text-faint); }
|
|
8
|
+
.ax-inputgroup__addon { display: inline-flex; align-items: center; gap: 6px; padding: 0 12px; color: var(--text-faint); font-family: var(--font-mono); font-size: var(--text-sm); background: var(--surface-raised); white-space: nowrap; }
|
|
9
|
+
.ax-inputgroup__addon--start { border-right: 1px solid var(--border-default); }
|
|
10
|
+
.ax-inputgroup__addon--end { border-left: 1px solid var(--border-default); }
|
|
11
|
+
.ax-inputgroup__addon svg { width: 15px; height: 15px; }
|
|
12
|
+
.ax-inputgroup__btn { display: inline-flex; align-items: center; gap: 6px; padding: 0 12px; cursor: pointer; border: none; background: var(--accent); color: var(--accent-fg); font-family: var(--font-body); font-size: var(--text-sm); font-weight: var(--weight-medium); }
|
|
13
|
+
.ax-inputgroup__btn:hover { background: var(--accent-hover); }
|
|
14
|
+
`;
|
|
15
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-inputgroup-css")) {
|
|
16
|
+
const s = document.createElement("style");
|
|
17
|
+
s.id = "ax-inputgroup-css";
|
|
18
|
+
s.textContent = AX_INPUTGROUP_CSS;
|
|
19
|
+
document.head.appendChild(s);
|
|
20
|
+
}
|
|
21
|
+
function InputGroup({ prefix, suffix, button, onButtonClick, className = "", inputProps = {}, ...rest }) {
|
|
22
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-inputgroup", className].filter(Boolean).join(" "), ...rest, children: [
|
|
23
|
+
prefix ? /* @__PURE__ */ jsx("span", { className: "ax-inputgroup__addon ax-inputgroup__addon--start", children: prefix }) : null,
|
|
24
|
+
/* @__PURE__ */ jsx("input", { className: "ax-inputgroup__input", ...inputProps }),
|
|
25
|
+
suffix ? /* @__PURE__ */ jsx("span", { className: "ax-inputgroup__addon ax-inputgroup__addon--end", children: suffix }) : null,
|
|
26
|
+
button ? /* @__PURE__ */ jsx("button", { type: "button", className: "ax-inputgroup__btn", onClick: onButtonClick, children: button }) : null
|
|
27
|
+
] });
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
InputGroup
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=InputGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputGroup.js","sources":["../../../src/components/inputs/InputGroup.jsx"],"sourcesContent":["import React, { useRef, useState, useEffect } from \"react\";\n\nconst AX_INPUTGROUP_CSS = `\n.ax-inputgroup { display: flex; align-items: stretch; border: 1px solid var(--border-default); border-radius: var(--radius-2); background: var(--surface-card); overflow: hidden; transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out); }\n.ax-inputgroup:focus-within { border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }\n.ax-inputgroup__input { flex: 1; min-width: 0; height: 36px; padding: 0 12px; background: none; border: none; outline: none; color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); }\n.ax-inputgroup__input::placeholder { color: var(--text-faint); }\n.ax-inputgroup__addon { display: inline-flex; align-items: center; gap: 6px; padding: 0 12px; color: var(--text-faint); font-family: var(--font-mono); font-size: var(--text-sm); background: var(--surface-raised); white-space: nowrap; }\n.ax-inputgroup__addon--start { border-right: 1px solid var(--border-default); }\n.ax-inputgroup__addon--end { border-left: 1px solid var(--border-default); }\n.ax-inputgroup__addon svg { width: 15px; height: 15px; }\n.ax-inputgroup__btn { display: inline-flex; align-items: center; gap: 6px; padding: 0 12px; cursor: pointer; border: none; background: var(--accent); color: var(--accent-fg); font-family: var(--font-body); font-size: var(--text-sm); font-weight: var(--weight-medium); }\n.ax-inputgroup__btn:hover { background: var(--accent-hover); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-inputgroup-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-inputgroup-css\";\n s.textContent = AX_INPUTGROUP_CSS;\n document.head.appendChild(s);\n}\n\nexport function InputGroup({ prefix, suffix, button, onButtonClick, className = \"\", inputProps = {}, ...rest }) {\n return (\n <div className={[\"ax-inputgroup\", className].filter(Boolean).join(\" \")} {...rest}>\n {prefix ? <span className=\"ax-inputgroup__addon ax-inputgroup__addon--start\">{prefix}</span> : null}\n <input className=\"ax-inputgroup__input\" {...inputProps} />\n {suffix ? <span className=\"ax-inputgroup__addon ax-inputgroup__addon--end\">{suffix}</span> : null}\n {button ? <button type=\"button\" className=\"ax-inputgroup__btn\" onClick={onButtonClick}>{button}</button> : null}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa1B,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,QAAQ,QAAQ,QAAQ,eAAe,YAAY,IAAI,aAAa,IAAI,GAAG,QAAQ;AAC9G,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACzE,UAAA;AAAA,IAAA,SAAS,oBAAC,QAAA,EAAK,WAAU,oDAAoD,kBAAO,IAAU;AAAA,IAC/F,oBAAC,SAAA,EAAM,WAAU,wBAAwB,GAAG,WAAA,CAAY;AAAA,IACvD,SAAS,oBAAC,QAAA,EAAK,WAAU,kDAAkD,kBAAO,IAAU;AAAA,IAC5F,SAAS,oBAAC,UAAA,EAAO,MAAK,UAAS,WAAU,sBAAqB,SAAS,eAAgB,UAAA,OAAA,CAAO,IAAY;AAAA,EAAA,GAC7G;AAEJ;"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** One-time-code input: N single-char slots with auto-advance and backspace nav. */
|
|
2
|
+
export interface InputOTPProps { length?: number; value?: string; onChange?: (value: string) => void; groupSize?: number; }
|
|
3
|
+
export declare function InputOTP(props: InputOTPProps): JSX.Element;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useRef } from "react";
|
|
3
|
+
const AX_OTP_CSS = `
|
|
4
|
+
.ax-otp { display: inline-flex; gap: 8px; }
|
|
5
|
+
.ax-otp__slot { width: 40px; height: 48px; text-align: center; background: var(--surface-card); border: 1px solid var(--border-strong); border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-mono); font-size: var(--text-xl); transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out); }
|
|
6
|
+
.ax-otp__slot:focus { outline: none; border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }
|
|
7
|
+
.ax-otp__slot--filled { border-color: var(--fg-2); }
|
|
8
|
+
.ax-otp__sep { display: flex; align-items: center; color: var(--text-faint); font-family: var(--font-mono); }
|
|
9
|
+
`;
|
|
10
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-otp-css")) {
|
|
11
|
+
const s = document.createElement("style");
|
|
12
|
+
s.id = "ax-otp-css";
|
|
13
|
+
s.textContent = AX_OTP_CSS;
|
|
14
|
+
document.head.appendChild(s);
|
|
15
|
+
}
|
|
16
|
+
function InputOTP({ length = 6, value = "", onChange, groupSize, className = "", ...rest }) {
|
|
17
|
+
const refs = useRef([]);
|
|
18
|
+
const chars = value.split("").slice(0, length);
|
|
19
|
+
while (chars.length < length) chars.push("");
|
|
20
|
+
const setChar = (i, ch) => {
|
|
21
|
+
const next = chars.slice();
|
|
22
|
+
next[i] = ch.slice(-1);
|
|
23
|
+
const joined = next.join("").slice(0, length);
|
|
24
|
+
onChange && onChange(joined);
|
|
25
|
+
if (ch && i < length - 1) refs.current[i + 1] && refs.current[i + 1].focus();
|
|
26
|
+
};
|
|
27
|
+
const onKeyDown = (i, e) => {
|
|
28
|
+
if (e.key === "Backspace" && !chars[i] && i > 0) refs.current[i - 1] && refs.current[i - 1].focus();
|
|
29
|
+
};
|
|
30
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-otp", className].filter(Boolean).join(" "), ...rest, children: chars.map((c, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
31
|
+
/* @__PURE__ */ jsx(
|
|
32
|
+
"input",
|
|
33
|
+
{
|
|
34
|
+
ref: (el) => refs.current[i] = el,
|
|
35
|
+
className: "ax-otp__slot" + (c ? " ax-otp__slot--filled" : ""),
|
|
36
|
+
inputMode: "numeric",
|
|
37
|
+
maxLength: 1,
|
|
38
|
+
value: c,
|
|
39
|
+
onChange: (e) => setChar(i, e.target.value),
|
|
40
|
+
onKeyDown: (e) => onKeyDown(i, e)
|
|
41
|
+
}
|
|
42
|
+
),
|
|
43
|
+
groupSize && (i + 1) % groupSize === 0 && i < length - 1 ? /* @__PURE__ */ jsx("span", { className: "ax-otp__sep", children: "·" }) : null
|
|
44
|
+
] }, i)) });
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
InputOTP
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=InputOTP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputOTP.js","sources":["../../../src/components/inputs/InputOTP.jsx"],"sourcesContent":["import React, { useRef, useState } from \"react\";\n\nconst AX_OTP_CSS = `\n.ax-otp { display: inline-flex; gap: 8px; }\n.ax-otp__slot { width: 40px; height: 48px; text-align: center; background: var(--surface-card); border: 1px solid var(--border-strong); border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-mono); font-size: var(--text-xl); transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out); }\n.ax-otp__slot:focus { outline: none; border-color: var(--fg-2); box-shadow: 0 0 0 3px var(--focus-soft); }\n.ax-otp__slot--filled { border-color: var(--fg-2); }\n.ax-otp__sep { display: flex; align-items: center; color: var(--text-faint); font-family: var(--font-mono); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-otp-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-otp-css\";\n s.textContent = AX_OTP_CSS;\n document.head.appendChild(s);\n}\n\nexport function InputOTP({ length = 6, value = \"\", onChange, groupSize, className = \"\", ...rest }) {\n const refs = useRef([]);\n const chars = value.split(\"\").slice(0, length);\n while (chars.length < length) chars.push(\"\");\n\n const setChar = (i, ch) => {\n const next = chars.slice();\n next[i] = ch.slice(-1);\n const joined = next.join(\"\").slice(0, length);\n onChange && onChange(joined);\n if (ch && i < length - 1) refs.current[i + 1] && refs.current[i + 1].focus();\n };\n const onKeyDown = (i, e) => {\n if (e.key === \"Backspace\" && !chars[i] && i > 0) refs.current[i - 1] && refs.current[i - 1].focus();\n };\n\n return (\n <div className={[\"ax-otp\", className].filter(Boolean).join(\" \")} {...rest}>\n {chars.map((c, i) => (\n <React.Fragment key={i}>\n <input\n ref={(el) => (refs.current[i] = el)}\n className={\"ax-otp__slot\" + (c ? \" ax-otp__slot--filled\" : \"\")}\n inputMode=\"numeric\"\n maxLength={1}\n value={c}\n onChange={(e) => setChar(i, e.target.value)}\n onKeyDown={(e) => onKeyDown(i, e)}\n />\n {groupSize && (i + 1) % groupSize === 0 && i < length - 1 ? <span className=\"ax-otp__sep\">·</span> : null}\n </React.Fragment>\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQnB,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,SAAS,EAAE,SAAS,GAAG,QAAQ,IAAI,UAAU,WAAW,YAAY,IAAI,GAAG,KAAA,GAAQ;AACjG,QAAM,OAAO,OAAO,EAAE;AACtB,QAAM,QAAQ,MAAM,MAAM,EAAE,EAAE,MAAM,GAAG,MAAM;AAC7C,SAAO,MAAM,SAAS,OAAQ,OAAM,KAAK,EAAE;AAE3C,QAAM,UAAU,CAAC,GAAG,OAAO;AACzB,UAAM,OAAO,MAAM,MAAA;AACnB,SAAK,CAAC,IAAI,GAAG,MAAM,EAAE;AACrB,UAAM,SAAS,KAAK,KAAK,EAAE,EAAE,MAAM,GAAG,MAAM;AAC5C,gBAAY,SAAS,MAAM;AAC3B,QAAI,MAAM,IAAI,SAAS,QAAQ,QAAQ,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,EAAE,MAAA;AAAA,EACvE;AACA,QAAM,YAAY,CAAC,GAAG,MAAM;AAC1B,QAAI,EAAE,QAAQ,eAAe,CAAC,MAAM,CAAC,KAAK,IAAI,QAAQ,QAAQ,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,EAAE,MAAA;AAAA,EAC9F;AAEA,SACE,oBAAC,SAAI,WAAW,CAAC,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAClE,UAAA,MAAM,IAAI,CAAC,GAAG,MACb,qBAAC,MAAM,UAAN,EACC,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK,CAAC,OAAQ,KAAK,QAAQ,CAAC,IAAI;AAAA,QAChC,WAAW,kBAAkB,IAAI,0BAA0B;AAAA,QAC3D,WAAU;AAAA,QACV,WAAW;AAAA,QACX,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,QAAQ,GAAG,EAAE,OAAO,KAAK;AAAA,QAC1C,WAAW,CAAC,MAAM,UAAU,GAAG,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjC,cAAc,IAAI,KAAK,cAAc,KAAK,IAAI,SAAS,IAAI,oBAAC,QAAA,EAAK,WAAU,eAAc,eAAC,IAAU;AAAA,EAAA,KAVlF,CAWrB,CACD,GACH;AAEJ;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form label. Defaults to the mono ALL-CAPS motif; `plain` for sentence-case.
|
|
3
|
+
*/
|
|
4
|
+
export interface LabelProps {
|
|
5
|
+
/** Sentence-case body label instead of mono uppercase. @default false */
|
|
6
|
+
plain?: boolean;
|
|
7
|
+
/** Append a red required asterisk. @default false */
|
|
8
|
+
required?: boolean;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
htmlFor?: string;
|
|
11
|
+
children?: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export declare function Label(props: LabelProps): JSX.Element;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_LABEL_CSS = `
|
|
4
|
+
.ax-lbl {
|
|
5
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
6
|
+
font-family: var(--font-mono); font-size: var(--text-xs);
|
|
7
|
+
font-weight: var(--weight-medium); letter-spacing: var(--tracking-label);
|
|
8
|
+
text-transform: uppercase; color: var(--text-faint);
|
|
9
|
+
}
|
|
10
|
+
.ax-lbl--plain {
|
|
11
|
+
font-family: var(--font-body); font-size: var(--text-sm);
|
|
12
|
+
letter-spacing: 0; text-transform: none; color: var(--text-body); font-weight: var(--weight-medium);
|
|
13
|
+
}
|
|
14
|
+
.ax-lbl__req { color: var(--danger); }
|
|
15
|
+
.ax-lbl--disabled { opacity: 0.4; }
|
|
16
|
+
`;
|
|
17
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-label-css")) {
|
|
18
|
+
const s = document.createElement("style");
|
|
19
|
+
s.id = "ax-label-css";
|
|
20
|
+
s.textContent = AX_LABEL_CSS;
|
|
21
|
+
document.head.appendChild(s);
|
|
22
|
+
}
|
|
23
|
+
function Label({ plain = false, required = false, disabled = false, children, className = "", ...rest }) {
|
|
24
|
+
const cls = ["ax-lbl", plain ? "ax-lbl--plain" : "", disabled ? "ax-lbl--disabled" : "", className].filter(Boolean).join(" ");
|
|
25
|
+
return /* @__PURE__ */ jsxs("label", { className: cls, ...rest, children: [
|
|
26
|
+
children,
|
|
27
|
+
required ? /* @__PURE__ */ jsx("span", { className: "ax-lbl__req", children: "*" }) : null
|
|
28
|
+
] });
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
Label
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=Label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Label.js","sources":["../../../src/components/inputs/Label.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_LABEL_CSS = `\n.ax-lbl {\n display: inline-flex; align-items: center; gap: 6px;\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-lbl--plain {\n font-family: var(--font-body); font-size: var(--text-sm);\n letter-spacing: 0; text-transform: none; color: var(--text-body); font-weight: var(--weight-medium);\n}\n.ax-lbl__req { color: var(--danger); }\n.ax-lbl--disabled { opacity: 0.4; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-label-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-label-css\";\n s.textContent = AX_LABEL_CSS;\n document.head.appendChild(s);\n}\n\nexport function Label({ plain = false, required = false, disabled = false, children, className = \"\", ...rest }) {\n const cls = [\"ax-lbl\", plain ? \"ax-lbl--plain\" : \"\", disabled ? \"ax-lbl--disabled\" : \"\", className].filter(Boolean).join(\" \");\n return (\n <label className={cls} {...rest}>\n {children}\n {required ? <span className=\"ax-lbl__req\">*</span> : null}\n </label>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAerB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,cAAc,GAAG;AAC/E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,MAAM,EAAE,QAAQ,OAAO,WAAW,OAAO,WAAW,OAAO,UAAU,YAAY,IAAI,GAAG,QAAQ;AAC9G,QAAM,MAAM,CAAC,UAAU,QAAQ,kBAAkB,IAAI,WAAW,qBAAqB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC5H,SACE,qBAAC,SAAA,EAAM,WAAW,KAAM,GAAG,MACxB,UAAA;AAAA,IAAA;AAAA,IACA,WAAW,oBAAC,QAAA,EAAK,WAAU,eAAc,eAAC,IAAU;AAAA,EAAA,GACvD;AAEJ;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Square-marked radio group. Options can carry a description line.
|
|
3
|
+
*/
|
|
4
|
+
export interface RadioGroupProps {
|
|
5
|
+
/** Shared input name. */
|
|
6
|
+
name: string;
|
|
7
|
+
/** Selected value. */
|
|
8
|
+
value?: string;
|
|
9
|
+
/** Strings or { value, label, description?, disabled? }. */
|
|
10
|
+
options: Array<string | { value: string; label: string; description?: string; disabled?: boolean }>;
|
|
11
|
+
onChange?: (value: string) => void;
|
|
12
|
+
/** Lay options out horizontally. @default false */
|
|
13
|
+
row?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function RadioGroup(props: RadioGroupProps): JSX.Element;
|