@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,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vertically stacked disclosure sections. Plus-icon rotates to a cross when open.
|
|
3
|
+
*/
|
|
4
|
+
export interface AccordionProps {
|
|
5
|
+
/** { id?, title, content }. */
|
|
6
|
+
items: Array<{ id?: string; title: React.ReactNode; content: React.ReactNode }>;
|
|
7
|
+
/** Allow multiple open at once. @default false */
|
|
8
|
+
multiple?: boolean;
|
|
9
|
+
/** ids open on mount. */
|
|
10
|
+
defaultOpen?: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function Accordion(props: AccordionProps): JSX.Element;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
const AX_ACCORDION_CSS = `
|
|
4
|
+
.ax-accordion { border-top: 1px solid var(--border-default); }
|
|
5
|
+
.ax-accordion__item { border-bottom: 1px solid var(--border-default); }
|
|
6
|
+
.ax-accordion__trigger {
|
|
7
|
+
display: flex; align-items: center; gap: 12px; width: 100%;
|
|
8
|
+
appearance: none; background: none; border: none; cursor: pointer; text-align: left;
|
|
9
|
+
padding: 16px 4px; color: var(--text-body);
|
|
10
|
+
font-family: var(--font-body); font-size: var(--text-md); font-weight: var(--weight-medium);
|
|
11
|
+
}
|
|
12
|
+
.ax-accordion__trigger:hover { color: var(--text-body); }
|
|
13
|
+
.ax-accordion__trigger:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--radius-1); }
|
|
14
|
+
.ax-accordion__label { flex: 1; }
|
|
15
|
+
.ax-accordion__icon {
|
|
16
|
+
width: 14px; height: 14px; flex: none; position: relative; color: var(--text-faint);
|
|
17
|
+
transition: transform var(--dur-2) var(--ease-out);
|
|
18
|
+
}
|
|
19
|
+
.ax-accordion__item--open .ax-accordion__icon { transform: rotate(45deg); }
|
|
20
|
+
.ax-accordion__icon::before, .ax-accordion__icon::after { content: ""; position: absolute; background: currentColor; }
|
|
21
|
+
.ax-accordion__icon::before { left: 0; right: 0; top: 6px; height: 2px; }
|
|
22
|
+
.ax-accordion__icon::after { top: 0; bottom: 0; left: 6px; width: 2px; }
|
|
23
|
+
.ax-accordion__panel { overflow: hidden; display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-2) var(--ease-out); }
|
|
24
|
+
.ax-accordion__item--open .ax-accordion__panel { grid-template-rows: 1fr; }
|
|
25
|
+
.ax-accordion__panel-inner { min-height: 0; }
|
|
26
|
+
.ax-accordion__body { padding: 0 4px 18px; font-size: var(--text-sm); color: var(--text-muted); line-height: var(--leading-body); max-width: 64ch; }
|
|
27
|
+
@media (prefers-reduced-motion: reduce) { .ax-accordion__panel { transition: none; } }
|
|
28
|
+
`;
|
|
29
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-accordion-css")) {
|
|
30
|
+
const s = document.createElement("style");
|
|
31
|
+
s.id = "ax-accordion-css";
|
|
32
|
+
s.textContent = AX_ACCORDION_CSS;
|
|
33
|
+
document.head.appendChild(s);
|
|
34
|
+
}
|
|
35
|
+
function Accordion({ items = [], multiple = false, defaultOpen = [], className = "", ...rest }) {
|
|
36
|
+
const [open, setOpen] = useState(new Set(defaultOpen));
|
|
37
|
+
const toggle = (id) => {
|
|
38
|
+
setOpen((prev) => {
|
|
39
|
+
const next = new Set(multiple ? prev : []);
|
|
40
|
+
if (prev.has(id)) next.delete(id);
|
|
41
|
+
else next.add(id);
|
|
42
|
+
return next;
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-accordion", className].filter(Boolean).join(" "), ...rest, children: items.map((it, i) => {
|
|
46
|
+
const id = it.id || String(i);
|
|
47
|
+
const isOpen = open.has(id);
|
|
48
|
+
return /* @__PURE__ */ jsxs("div", { className: "ax-accordion__item" + (isOpen ? " ax-accordion__item--open" : ""), children: [
|
|
49
|
+
/* @__PURE__ */ jsxs("button", { className: "ax-accordion__trigger", "aria-expanded": isOpen, onClick: () => toggle(id), children: [
|
|
50
|
+
/* @__PURE__ */ jsx("span", { className: "ax-accordion__label", children: it.title }),
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "ax-accordion__icon" })
|
|
52
|
+
] }),
|
|
53
|
+
/* @__PURE__ */ jsx("div", { className: "ax-accordion__panel", children: /* @__PURE__ */ jsx("div", { className: "ax-accordion__panel-inner", children: /* @__PURE__ */ jsx("div", { className: "ax-accordion__body", children: it.content }) }) })
|
|
54
|
+
] }, id);
|
|
55
|
+
}) });
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
Accordion
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=Accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.js","sources":["../../../src/components/display/Accordion.jsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nconst AX_ACCORDION_CSS = `\n.ax-accordion { border-top: 1px solid var(--border-default); }\n.ax-accordion__item { border-bottom: 1px solid var(--border-default); }\n.ax-accordion__trigger {\n display: flex; align-items: center; gap: 12px; width: 100%;\n appearance: none; background: none; border: none; cursor: pointer; text-align: left;\n padding: 16px 4px; color: var(--text-body);\n font-family: var(--font-body); font-size: var(--text-md); font-weight: var(--weight-medium);\n}\n.ax-accordion__trigger:hover { color: var(--text-body); }\n.ax-accordion__trigger:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--radius-1); }\n.ax-accordion__label { flex: 1; }\n.ax-accordion__icon {\n width: 14px; height: 14px; flex: none; position: relative; color: var(--text-faint);\n transition: transform var(--dur-2) var(--ease-out);\n}\n.ax-accordion__item--open .ax-accordion__icon { transform: rotate(45deg); }\n.ax-accordion__icon::before, .ax-accordion__icon::after { content: \"\"; position: absolute; background: currentColor; }\n.ax-accordion__icon::before { left: 0; right: 0; top: 6px; height: 2px; }\n.ax-accordion__icon::after { top: 0; bottom: 0; left: 6px; width: 2px; }\n.ax-accordion__panel { overflow: hidden; display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-2) var(--ease-out); }\n.ax-accordion__item--open .ax-accordion__panel { grid-template-rows: 1fr; }\n.ax-accordion__panel-inner { min-height: 0; }\n.ax-accordion__body { padding: 0 4px 18px; font-size: var(--text-sm); color: var(--text-muted); line-height: var(--leading-body); max-width: 64ch; }\n@media (prefers-reduced-motion: reduce) { .ax-accordion__panel { transition: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-accordion-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-accordion-css\";\n s.textContent = AX_ACCORDION_CSS;\n document.head.appendChild(s);\n}\n\nexport function Accordion({ items = [], multiple = false, defaultOpen = [], className = \"\", ...rest }) {\n const [open, setOpen] = useState(new Set(defaultOpen));\n const toggle = (id) => {\n setOpen((prev) => {\n const next = new Set(multiple ? prev : []);\n if (prev.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n return (\n <div className={[\"ax-accordion\", className].filter(Boolean).join(\" \")} {...rest}>\n {items.map((it, i) => {\n const id = it.id || String(i);\n const isOpen = open.has(id);\n return (\n <div key={id} className={\"ax-accordion__item\" + (isOpen ? \" ax-accordion__item--open\" : \"\")}>\n <button className=\"ax-accordion__trigger\" aria-expanded={isOpen} onClick={() => toggle(id)}>\n <span className=\"ax-accordion__label\">{it.title}</span>\n <span className=\"ax-accordion__icon\"></span>\n </button>\n <div className=\"ax-accordion__panel\">\n <div className=\"ax-accordion__panel-inner\">\n <div className=\"ax-accordion__body\">{it.content}</div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BzB,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,QAAQ,CAAA,GAAI,WAAW,OAAO,cAAc,CAAA,GAAI,YAAY,IAAI,GAAG,QAAQ;AACrG,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,IAAI,IAAI,WAAW,CAAC;AACrD,QAAM,SAAS,CAAC,OAAO;AACrB,YAAQ,CAAC,SAAS;AAChB,YAAM,OAAO,IAAI,IAAI,WAAW,OAAO,CAAA,CAAE;AACzC,UAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,UAC3B,MAAK,IAAI,EAAE;AAChB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,6BACG,OAAA,EAAI,WAAW,CAAC,gBAAgB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACxE,gBAAM,IAAI,CAAC,IAAI,MAAM;AACpB,UAAM,KAAK,GAAG,MAAM,OAAO,CAAC;AAC5B,UAAM,SAAS,KAAK,IAAI,EAAE;AAC1B,gCACG,OAAA,EAAa,WAAW,wBAAwB,SAAS,8BAA8B,KACtF,UAAA;AAAA,MAAA,qBAAC,UAAA,EAAO,WAAU,yBAAwB,iBAAe,QAAQ,SAAS,MAAM,OAAO,EAAE,GACvF,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,uBAAuB,UAAA,GAAG,OAAM;AAAA,QAChD,oBAAC,QAAA,EAAK,WAAU,qBAAA,CAAqB;AAAA,MAAA,GACvC;AAAA,MACA,oBAAC,OAAA,EAAI,WAAU,uBACb,8BAAC,OAAA,EAAI,WAAU,6BACb,UAAA,oBAAC,SAAI,WAAU,sBAAsB,UAAA,GAAG,SAAQ,GAClD,EAAA,CACF;AAAA,IAAA,EAAA,GATQ,EAUV;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Square avatar (radius-2) with mono initials fallback.
|
|
3
|
+
*/
|
|
4
|
+
export interface AvatarProps {
|
|
5
|
+
/** Used for initials + title attr. */
|
|
6
|
+
name?: string;
|
|
7
|
+
/** Image url; omit for initials. */
|
|
8
|
+
src?: string;
|
|
9
|
+
/** 24 / 32 / 44px. @default "md" */
|
|
10
|
+
size?: "sm" | "md" | "lg";
|
|
11
|
+
/** Inverted fill (used for the Agentaily assistant). @default false */
|
|
12
|
+
solid?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function Avatar(props: AvatarProps): JSX.Element;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_AVATAR_CSS = `
|
|
4
|
+
.ax-avatar {
|
|
5
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
6
|
+
flex: none; overflow: hidden;
|
|
7
|
+
background: var(--surface-raised); border: 1px solid var(--border-default);
|
|
8
|
+
border-radius: var(--radius-2); color: var(--text-muted);
|
|
9
|
+
font-family: var(--font-mono); font-weight: var(--weight-medium);
|
|
10
|
+
}
|
|
11
|
+
.ax-avatar--solid { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }
|
|
12
|
+
.ax-avatar img { width: 100%; height: 100%; object-fit: cover; }
|
|
13
|
+
.ax-avatar--sm { width: 24px; height: 24px; font-size: 10px; }
|
|
14
|
+
.ax-avatar--md { width: 32px; height: 32px; font-size: 12px; }
|
|
15
|
+
.ax-avatar--lg { width: 44px; height: 44px; font-size: var(--text-md); }
|
|
16
|
+
`;
|
|
17
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-avatar-css")) {
|
|
18
|
+
const s = document.createElement("style");
|
|
19
|
+
s.id = "ax-avatar-css";
|
|
20
|
+
s.textContent = AX_AVATAR_CSS;
|
|
21
|
+
document.head.appendChild(s);
|
|
22
|
+
}
|
|
23
|
+
function initials(name = "") {
|
|
24
|
+
const parts = name.trim().split(/\s+/);
|
|
25
|
+
if (!parts[0]) return "?";
|
|
26
|
+
if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();
|
|
27
|
+
return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
|
|
28
|
+
}
|
|
29
|
+
function Avatar({ name = "", src, size = "md", solid = false, className = "", ...rest }) {
|
|
30
|
+
const cls = [
|
|
31
|
+
"ax-avatar",
|
|
32
|
+
`ax-avatar--${size}`,
|
|
33
|
+
solid ? "ax-avatar--solid" : "",
|
|
34
|
+
className
|
|
35
|
+
].filter(Boolean).join(" ");
|
|
36
|
+
return /* @__PURE__ */ jsx("span", { className: cls, title: name, ...rest, children: src ? /* @__PURE__ */ jsx("img", { src, alt: name }) : initials(name) });
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
Avatar
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=Avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../../src/components/display/Avatar.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_AVATAR_CSS = `\n.ax-avatar {\n display: inline-flex; align-items: center; justify-content: center;\n flex: none; overflow: hidden;\n background: var(--surface-raised); border: 1px solid var(--border-default);\n border-radius: var(--radius-2); color: var(--text-muted);\n font-family: var(--font-mono); font-weight: var(--weight-medium);\n}\n.ax-avatar--solid { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }\n.ax-avatar img { width: 100%; height: 100%; object-fit: cover; }\n.ax-avatar--sm { width: 24px; height: 24px; font-size: 10px; }\n.ax-avatar--md { width: 32px; height: 32px; font-size: 12px; }\n.ax-avatar--lg { width: 44px; height: 44px; font-size: var(--text-md); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-avatar-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-avatar-css\";\n s.textContent = AX_AVATAR_CSS;\n document.head.appendChild(s);\n}\n\nfunction initials(name = \"\") {\n const parts = name.trim().split(/\\s+/);\n if (!parts[0]) return \"?\";\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nexport function Avatar({ name = \"\", src, size = \"md\", solid = false, className = \"\", ...rest }) {\n const cls = [\n \"ax-avatar\",\n `ax-avatar--${size}`,\n solid ? \"ax-avatar--solid\" : \"\",\n className,\n ].filter(Boolean).join(\" \");\n return (\n <span className={cls} title={name} {...rest}>\n {src ? <img src={src} alt={name} /> : initials(name)}\n </span>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAetB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,eAAe,GAAG;AAChF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEA,SAAS,SAAS,OAAO,IAAI;AAC3B,QAAM,QAAQ,KAAK,KAAA,EAAO,MAAM,KAAK;AACrC,MAAI,CAAC,MAAM,CAAC,EAAG,QAAO;AACtB,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,YAAA;AACpD,UAAQ,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,CAAC,GAAG,YAAA;AACpD;AAEO,SAAS,OAAO,EAAE,OAAO,IAAI,KAAK,OAAO,MAAM,QAAQ,OAAO,YAAY,IAAI,GAAG,QAAQ;AAC9F,QAAM,MAAM;AAAA,IACV;AAAA,IACA,cAAc,IAAI;AAAA,IAClB,QAAQ,qBAAqB;AAAA,IAC7B;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAC1B,6BACG,QAAA,EAAK,WAAW,KAAK,OAAO,MAAO,GAAG,MACpC,UAAA,MAAM,oBAAC,SAAI,KAAU,KAAK,MAAM,IAAK,SAAS,IAAI,GACrD;AAEJ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mono uppercase status chip. Semantic colors are used sparingly.
|
|
3
|
+
*/
|
|
4
|
+
export interface BadgeProps {
|
|
5
|
+
/** @default "neutral" */
|
|
6
|
+
variant?: "neutral" | "solid" | "outline" | "ok" | "warn" | "danger";
|
|
7
|
+
/** Leading 6px square status dot. @default false */
|
|
8
|
+
dot?: boolean;
|
|
9
|
+
children?: React.ReactNode;
|
|
10
|
+
}
|
|
11
|
+
export declare function Badge(props: BadgeProps): JSX.Element;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_BADGE_CSS = `
|
|
4
|
+
.ax-badge {
|
|
5
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
6
|
+
padding: 2px 7px; border-radius: var(--radius-1);
|
|
7
|
+
font-family: var(--font-mono); font-size: var(--text-xs);
|
|
8
|
+
font-weight: var(--weight-medium); letter-spacing: var(--tracking-label);
|
|
9
|
+
text-transform: uppercase; white-space: nowrap;
|
|
10
|
+
border: 1px solid var(--border-default);
|
|
11
|
+
background: var(--surface-raised); color: var(--text-muted);
|
|
12
|
+
}
|
|
13
|
+
.ax-badge__dot { width: 6px; height: 6px; border-radius: 1px; background: currentColor; }
|
|
14
|
+
.ax-badge--solid { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }
|
|
15
|
+
.ax-badge--outline { background: transparent; border-color: var(--border-strong); color: var(--text-body); }
|
|
16
|
+
.ax-badge--ok { background: var(--ok-dim); border-color: transparent; color: var(--ok); }
|
|
17
|
+
.ax-badge--warn { background: var(--warn-dim); border-color: transparent; color: var(--warn); }
|
|
18
|
+
.ax-badge--danger { background: var(--danger-dim); border-color: transparent; color: var(--danger); }
|
|
19
|
+
`;
|
|
20
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-badge-css")) {
|
|
21
|
+
const s = document.createElement("style");
|
|
22
|
+
s.id = "ax-badge-css";
|
|
23
|
+
s.textContent = AX_BADGE_CSS;
|
|
24
|
+
document.head.appendChild(s);
|
|
25
|
+
}
|
|
26
|
+
function Badge({ variant = "neutral", dot = false, children, className = "", ...rest }) {
|
|
27
|
+
const cls = [
|
|
28
|
+
"ax-badge",
|
|
29
|
+
variant !== "neutral" ? `ax-badge--${variant}` : "",
|
|
30
|
+
className
|
|
31
|
+
].filter(Boolean).join(" ");
|
|
32
|
+
return /* @__PURE__ */ jsxs("span", { className: cls, ...rest, children: [
|
|
33
|
+
dot ? /* @__PURE__ */ jsx("span", { className: "ax-badge__dot" }) : null,
|
|
34
|
+
children
|
|
35
|
+
] });
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
Badge
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=Badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Badge.js","sources":["../../../src/components/display/Badge.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_BADGE_CSS = `\n.ax-badge {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 2px 7px; border-radius: var(--radius-1);\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; white-space: nowrap;\n border: 1px solid var(--border-default);\n background: var(--surface-raised); color: var(--text-muted);\n}\n.ax-badge__dot { width: 6px; height: 6px; border-radius: 1px; background: currentColor; }\n.ax-badge--solid { background: var(--accent); border-color: var(--accent); color: var(--accent-fg); }\n.ax-badge--outline { background: transparent; border-color: var(--border-strong); color: var(--text-body); }\n.ax-badge--ok { background: var(--ok-dim); border-color: transparent; color: var(--ok); }\n.ax-badge--warn { background: var(--warn-dim); border-color: transparent; color: var(--warn); }\n.ax-badge--danger { background: var(--danger-dim); border-color: transparent; color: var(--danger); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-badge-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-badge-css\";\n s.textContent = AX_BADGE_CSS;\n document.head.appendChild(s);\n}\n\nexport function Badge({ variant = \"neutral\", dot = false, children, className = \"\", ...rest }) {\n const cls = [\n \"ax-badge\",\n variant !== \"neutral\" ? `ax-badge--${variant}` : \"\",\n className,\n ].filter(Boolean).join(\" \");\n return (\n <span className={cls} {...rest}>\n {dot ? <span className=\"ax-badge__dot\"></span> : null}\n {children}\n </span>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBrB,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,UAAU,WAAW,MAAM,OAAO,UAAU,YAAY,IAAI,GAAG,QAAQ;AAC7F,QAAM,MAAM;AAAA,IACV;AAAA,IACA,YAAY,YAAY,aAAa,OAAO,KAAK;AAAA,IACjD;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAC1B,SACE,qBAAC,QAAA,EAAK,WAAW,KAAM,GAAG,MACvB,UAAA;AAAA,IAAA,MAAM,oBAAC,QAAA,EAAK,WAAU,gBAAA,CAAgB,IAAU;AAAA,IAChD;AAAA,EAAA,GACH;AAEJ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mono uppercase breadcrumb trail; last item is the current page.
|
|
3
|
+
*/
|
|
4
|
+
export interface BreadcrumbProps {
|
|
5
|
+
/** Strings or { id?, label }. */
|
|
6
|
+
items: Array<string | { id?: string; label: string }>;
|
|
7
|
+
/** Separator glyph. @default "/" */
|
|
8
|
+
separator?: string;
|
|
9
|
+
onNavigate?: (id: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function Breadcrumb(props: BreadcrumbProps): JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
const AX_BREADCRUMB_CSS = `
|
|
4
|
+
.ax-breadcrumb { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-family: var(--font-mono); font-size: var(--text-xs); }
|
|
5
|
+
.ax-breadcrumb__link {
|
|
6
|
+
color: var(--text-faint); text-decoration: none; letter-spacing: var(--tracking-label); text-transform: uppercase;
|
|
7
|
+
transition: color var(--dur-1) var(--ease-out); cursor: pointer; background: none; border: none; padding: 0; font: inherit;
|
|
8
|
+
}
|
|
9
|
+
.ax-breadcrumb__link:hover { color: var(--text-body); }
|
|
10
|
+
.ax-breadcrumb__sep { color: var(--text-faint); opacity: 0.5; }
|
|
11
|
+
.ax-breadcrumb__current { color: var(--text-body); letter-spacing: var(--tracking-label); text-transform: uppercase; }
|
|
12
|
+
`;
|
|
13
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-breadcrumb-css")) {
|
|
14
|
+
const s = document.createElement("style");
|
|
15
|
+
s.id = "ax-breadcrumb-css";
|
|
16
|
+
s.textContent = AX_BREADCRUMB_CSS;
|
|
17
|
+
document.head.appendChild(s);
|
|
18
|
+
}
|
|
19
|
+
function Breadcrumb({ items = [], separator = "/", onNavigate, className = "", ...rest }) {
|
|
20
|
+
return /* @__PURE__ */ jsx("nav", { "aria-label": "Breadcrumb", className: ["ax-breadcrumb", className].filter(Boolean).join(" "), ...rest, children: items.map((item, i) => {
|
|
21
|
+
const it = typeof item === "string" ? { label: item } : item;
|
|
22
|
+
const last = i === items.length - 1;
|
|
23
|
+
return /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
24
|
+
last ? /* @__PURE__ */ jsx("span", { className: "ax-breadcrumb__current", "aria-current": "page", children: it.label }) : /* @__PURE__ */ jsx("button", { className: "ax-breadcrumb__link", onClick: () => onNavigate && onNavigate(it.id ?? it.label), children: it.label }),
|
|
25
|
+
!last ? /* @__PURE__ */ jsx("span", { className: "ax-breadcrumb__sep", children: separator }) : null
|
|
26
|
+
] }, i);
|
|
27
|
+
}) });
|
|
28
|
+
}
|
|
29
|
+
export {
|
|
30
|
+
Breadcrumb
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=Breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","sources":["../../../src/components/display/Breadcrumb.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_BREADCRUMB_CSS = `\n.ax-breadcrumb { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-family: var(--font-mono); font-size: var(--text-xs); }\n.ax-breadcrumb__link {\n color: var(--text-faint); text-decoration: none; letter-spacing: var(--tracking-label); text-transform: uppercase;\n transition: color var(--dur-1) var(--ease-out); cursor: pointer; background: none; border: none; padding: 0; font: inherit;\n}\n.ax-breadcrumb__link:hover { color: var(--text-body); }\n.ax-breadcrumb__sep { color: var(--text-faint); opacity: 0.5; }\n.ax-breadcrumb__current { color: var(--text-body); letter-spacing: var(--tracking-label); text-transform: uppercase; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-breadcrumb-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-breadcrumb-css\";\n s.textContent = AX_BREADCRUMB_CSS;\n document.head.appendChild(s);\n}\n\nexport function Breadcrumb({ items = [], separator = \"/\", onNavigate, className = \"\", ...rest }) {\n return (\n <nav aria-label=\"Breadcrumb\" className={[\"ax-breadcrumb\", className].filter(Boolean).join(\" \")} {...rest}>\n {items.map((item, i) => {\n const it = typeof item === \"string\" ? { label: item } : item;\n const last = i === items.length - 1;\n return (\n <React.Fragment key={i}>\n {last\n ? <span className=\"ax-breadcrumb__current\" aria-current=\"page\">{it.label}</span>\n : <button className=\"ax-breadcrumb__link\" onClick={() => onNavigate && onNavigate(it.id ?? it.label)}>{it.label}</button>}\n {!last ? <span className=\"ax-breadcrumb__sep\">{separator}</span> : null}\n </React.Fragment>\n );\n })}\n </nav>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW1B,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,CAAA,GAAI,YAAY,KAAK,YAAY,YAAY,IAAI,GAAG,QAAQ;AAC/F,SACE,oBAAC,SAAI,cAAW,cAAa,WAAW,CAAC,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACjG,UAAA,MAAM,IAAI,CAAC,MAAM,MAAM;AACtB,UAAM,KAAK,OAAO,SAAS,WAAW,EAAE,OAAO,SAAS;AACxD,UAAM,OAAO,MAAM,MAAM,SAAS;AAClC,WACE,qBAAC,MAAM,UAAN,EACE,UAAA;AAAA,MAAA,OACG,oBAAC,UAAK,WAAU,0BAAyB,gBAAa,QAAQ,UAAA,GAAG,MAAA,CAAM,IACvE,oBAAC,UAAA,EAAO,WAAU,uBAAsB,SAAS,MAAM,cAAc,WAAW,GAAG,MAAM,GAAG,KAAK,GAAI,UAAA,GAAG,MAAA,CAAM;AAAA,MACjH,CAAC,OAAO,oBAAC,UAAK,WAAU,sBAAsB,qBAAU,IAAU;AAAA,IAAA,EAAA,GAJhD,CAKrB;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hairline-bordered surface. ticks adds Agentaily's corner-tick frame motif.
|
|
3
|
+
*/
|
|
4
|
+
export interface CardProps {
|
|
5
|
+
/** Mono uppercase eyebrow above the title. */
|
|
6
|
+
eyebrow?: string;
|
|
7
|
+
title?: string;
|
|
8
|
+
/** Inner padding. @default "md" */
|
|
9
|
+
padding?: "none" | "md" | "lg";
|
|
10
|
+
/** Draw corner ticks on opposite corners. @default false */
|
|
11
|
+
ticks?: boolean;
|
|
12
|
+
children?: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export declare function Card(props: CardProps): JSX.Element;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_CARD_CSS = `
|
|
4
|
+
.ax-card {
|
|
5
|
+
position: relative;
|
|
6
|
+
background: var(--surface-card);
|
|
7
|
+
border: 1px solid var(--border-default);
|
|
8
|
+
border-radius: var(--radius-3);
|
|
9
|
+
}
|
|
10
|
+
.ax-card--pad-md { padding: var(--space-5); }
|
|
11
|
+
.ax-card--pad-lg { padding: var(--space-8); }
|
|
12
|
+
.ax-card--pad-none { padding: 0; }
|
|
13
|
+
.ax-card__eyebrow {
|
|
14
|
+
font-family: var(--font-mono); font-size: var(--text-xs);
|
|
15
|
+
font-weight: var(--weight-medium); letter-spacing: var(--tracking-label);
|
|
16
|
+
text-transform: uppercase; color: var(--text-faint);
|
|
17
|
+
margin: 0 0 var(--space-2);
|
|
18
|
+
}
|
|
19
|
+
.ax-card__title {
|
|
20
|
+
font-family: var(--font-display); font-size: var(--text-lg);
|
|
21
|
+
font-weight: var(--weight-medium); letter-spacing: var(--tracking-tight);
|
|
22
|
+
color: var(--text-body); margin: 0 0 var(--space-3);
|
|
23
|
+
}
|
|
24
|
+
.ax-card--ticks::before, .ax-card--ticks::after {
|
|
25
|
+
content: ""; position: absolute; width: 9px; height: 9px;
|
|
26
|
+
border-color: var(--text-faint); border-style: solid;
|
|
27
|
+
}
|
|
28
|
+
.ax-card--ticks::before { top: -1px; left: -1px; border-width: 1px 0 0 1px; }
|
|
29
|
+
.ax-card--ticks::after { bottom: -1px; right: -1px; border-width: 0 1px 1px 0; }
|
|
30
|
+
`;
|
|
31
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-card-css")) {
|
|
32
|
+
const s = document.createElement("style");
|
|
33
|
+
s.id = "ax-card-css";
|
|
34
|
+
s.textContent = AX_CARD_CSS;
|
|
35
|
+
document.head.appendChild(s);
|
|
36
|
+
}
|
|
37
|
+
function Card({
|
|
38
|
+
eyebrow,
|
|
39
|
+
title,
|
|
40
|
+
padding = "md",
|
|
41
|
+
ticks = false,
|
|
42
|
+
children,
|
|
43
|
+
className = "",
|
|
44
|
+
...rest
|
|
45
|
+
}) {
|
|
46
|
+
const cls = [
|
|
47
|
+
"ax-card",
|
|
48
|
+
`ax-card--pad-${padding}`,
|
|
49
|
+
ticks ? "ax-card--ticks" : "",
|
|
50
|
+
className
|
|
51
|
+
].filter(Boolean).join(" ");
|
|
52
|
+
return /* @__PURE__ */ jsxs("div", { className: cls, ...rest, children: [
|
|
53
|
+
eyebrow ? /* @__PURE__ */ jsx("p", { className: "ax-card__eyebrow", children: eyebrow }) : null,
|
|
54
|
+
title ? /* @__PURE__ */ jsx("h3", { className: "ax-card__title", children: title }) : null,
|
|
55
|
+
children
|
|
56
|
+
] });
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
Card
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=Card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.js","sources":["../../../src/components/display/Card.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_CARD_CSS = `\n.ax-card {\n position: relative;\n background: var(--surface-card);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-3);\n}\n.ax-card--pad-md { padding: var(--space-5); }\n.ax-card--pad-lg { padding: var(--space-8); }\n.ax-card--pad-none { padding: 0; }\n.ax-card__eyebrow {\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 margin: 0 0 var(--space-2);\n}\n.ax-card__title {\n font-family: var(--font-display); font-size: var(--text-lg);\n font-weight: var(--weight-medium); letter-spacing: var(--tracking-tight);\n color: var(--text-body); margin: 0 0 var(--space-3);\n}\n.ax-card--ticks::before, .ax-card--ticks::after {\n content: \"\"; position: absolute; width: 9px; height: 9px;\n border-color: var(--text-faint); border-style: solid;\n}\n.ax-card--ticks::before { top: -1px; left: -1px; border-width: 1px 0 0 1px; }\n.ax-card--ticks::after { bottom: -1px; right: -1px; border-width: 0 1px 1px 0; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-card-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-card-css\";\n s.textContent = AX_CARD_CSS;\n document.head.appendChild(s);\n}\n\nexport function Card({\n eyebrow,\n title,\n padding = \"md\",\n ticks = false,\n children,\n className = \"\",\n ...rest\n}) {\n const cls = [\n \"ax-card\",\n `ax-card--pad-${padding}`,\n ticks ? \"ax-card--ticks\" : \"\",\n className,\n ].filter(Boolean).join(\" \");\n return (\n <div className={cls} {...rest}>\n {eyebrow ? <p className=\"ax-card__eyebrow\">{eyebrow}</p> : null}\n {title ? <h3 className=\"ax-card__title\">{title}</h3> : null}\n {children}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BpB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,aAAa,GAAG;AAC9E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,GAAG;AACD,QAAM,MAAM;AAAA,IACV;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,QAAQ,mBAAmB;AAAA,IAC3B;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAC1B,SACE,qBAAC,OAAA,EAAI,WAAW,KAAM,GAAG,MACtB,UAAA;AAAA,IAAA,UAAU,oBAAC,KAAA,EAAE,WAAU,oBAAoB,mBAAQ,IAAO;AAAA,IAC1D,QAAQ,oBAAC,MAAA,EAAG,WAAU,kBAAkB,iBAAM,IAAQ;AAAA,IACtD;AAAA,EAAA,GACH;AAEJ;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { Children, useState } from "react";
|
|
3
|
+
const AX_CAROUSEL_CSS = `
|
|
4
|
+
.ax-carousel { position: relative; }
|
|
5
|
+
.ax-carousel__viewport { overflow: hidden; border-radius: var(--radius-3); }
|
|
6
|
+
.ax-carousel__track { display: flex; transition: transform var(--dur-3) var(--ease-out); }
|
|
7
|
+
.ax-carousel__slide { flex: 0 0 100%; min-width: 0; }
|
|
8
|
+
.ax-carousel__btn { position: absolute; top: 50%; transform: translateY(-50%); width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; background: var(--surface-panel); border: 1px solid var(--border-strong); border-radius: var(--radius-2); color: var(--text-body); box-shadow: var(--shadow-1); transition: background var(--dur-1) var(--ease-out); }
|
|
9
|
+
.ax-carousel__btn:hover:not(:disabled) { background: var(--surface-raised); }
|
|
10
|
+
.ax-carousel__btn:disabled { opacity: 0.3; cursor: not-allowed; }
|
|
11
|
+
.ax-carousel__btn--prev { left: 10px; }
|
|
12
|
+
.ax-carousel__btn--next { right: 10px; }
|
|
13
|
+
.ax-carousel__dots { display: flex; justify-content: center; gap: 6px; margin-top: 12px; }
|
|
14
|
+
.ax-carousel__dot { width: 6px; height: 6px; border-radius: 1px; background: var(--border-strong); border: none; cursor: pointer; padding: 0; transition: background var(--dur-1) var(--ease-out), width var(--dur-1) var(--ease-out); }
|
|
15
|
+
.ax-carousel__dot--active { background: var(--text-body); width: 16px; }
|
|
16
|
+
@media (prefers-reduced-motion: reduce) { .ax-carousel__track { transition: none; } }
|
|
17
|
+
`;
|
|
18
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-carousel-css")) {
|
|
19
|
+
const s = document.createElement("style");
|
|
20
|
+
s.id = "ax-carousel-css";
|
|
21
|
+
s.textContent = AX_CAROUSEL_CSS;
|
|
22
|
+
document.head.appendChild(s);
|
|
23
|
+
}
|
|
24
|
+
function Carousel({ children, dots = true, arrows = true, className = "", ...rest }) {
|
|
25
|
+
const slides = Children.toArray(children);
|
|
26
|
+
const [idx, setIdx] = useState(0);
|
|
27
|
+
const go = (i) => setIdx(Math.max(0, Math.min(slides.length - 1, i)));
|
|
28
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-carousel", className].filter(Boolean).join(" "), ...rest, children: [
|
|
29
|
+
/* @__PURE__ */ jsx("div", { className: "ax-carousel__viewport", children: /* @__PURE__ */ jsx("div", { className: "ax-carousel__track", style: { transform: `translateX(-${idx * 100}%)` }, children: slides.map((s, i) => /* @__PURE__ */ jsx("div", { className: "ax-carousel__slide", children: s }, i)) }) }),
|
|
30
|
+
arrows && slides.length > 1 ? /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
31
|
+
/* @__PURE__ */ jsx("button", { className: "ax-carousel__btn ax-carousel__btn--prev", disabled: idx === 0, onClick: () => go(idx - 1), "aria-label": "Previous", children: "‹" }),
|
|
32
|
+
/* @__PURE__ */ jsx("button", { className: "ax-carousel__btn ax-carousel__btn--next", disabled: idx === slides.length - 1, onClick: () => go(idx + 1), "aria-label": "Next", children: "›" })
|
|
33
|
+
] }) : null,
|
|
34
|
+
dots && slides.length > 1 ? /* @__PURE__ */ jsx("div", { className: "ax-carousel__dots", children: slides.map((_, i) => /* @__PURE__ */ jsx("button", { className: "ax-carousel__dot" + (i === idx ? " ax-carousel__dot--active" : ""), onClick: () => go(i), "aria-label": "Go to slide " + (i + 1) }, i)) }) : null
|
|
35
|
+
] });
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
Carousel
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=Carousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Carousel.js","sources":["../../../src/components/display/Carousel.jsx"],"sourcesContent":["import React, { useState, Children } from \"react\";\n\nconst AX_CAROUSEL_CSS = `\n.ax-carousel { position: relative; }\n.ax-carousel__viewport { overflow: hidden; border-radius: var(--radius-3); }\n.ax-carousel__track { display: flex; transition: transform var(--dur-3) var(--ease-out); }\n.ax-carousel__slide { flex: 0 0 100%; min-width: 0; }\n.ax-carousel__btn { position: absolute; top: 50%; transform: translateY(-50%); width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; background: var(--surface-panel); border: 1px solid var(--border-strong); border-radius: var(--radius-2); color: var(--text-body); box-shadow: var(--shadow-1); transition: background var(--dur-1) var(--ease-out); }\n.ax-carousel__btn:hover:not(:disabled) { background: var(--surface-raised); }\n.ax-carousel__btn:disabled { opacity: 0.3; cursor: not-allowed; }\n.ax-carousel__btn--prev { left: 10px; }\n.ax-carousel__btn--next { right: 10px; }\n.ax-carousel__dots { display: flex; justify-content: center; gap: 6px; margin-top: 12px; }\n.ax-carousel__dot { width: 6px; height: 6px; border-radius: 1px; background: var(--border-strong); border: none; cursor: pointer; padding: 0; transition: background var(--dur-1) var(--ease-out), width var(--dur-1) var(--ease-out); }\n.ax-carousel__dot--active { background: var(--text-body); width: 16px; }\n@media (prefers-reduced-motion: reduce) { .ax-carousel__track { transition: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-carousel-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-carousel-css\";\n s.textContent = AX_CAROUSEL_CSS;\n document.head.appendChild(s);\n}\n\nexport function Carousel({ children, dots = true, arrows = true, className = \"\", ...rest }) {\n const slides = Children.toArray(children);\n const [idx, setIdx] = useState(0);\n const go = (i) => setIdx(Math.max(0, Math.min(slides.length - 1, i)));\n return (\n <div className={[\"ax-carousel\", className].filter(Boolean).join(\" \")} {...rest}>\n <div className=\"ax-carousel__viewport\">\n <div className=\"ax-carousel__track\" style={{ transform: `translateX(-${idx * 100}%)` }}>\n {slides.map((s, i) => <div className=\"ax-carousel__slide\" key={i}>{s}</div>)}\n </div>\n </div>\n {arrows && slides.length > 1 ? (\n <React.Fragment>\n <button className=\"ax-carousel__btn ax-carousel__btn--prev\" disabled={idx === 0} onClick={() => go(idx - 1)} aria-label=\"Previous\">‹</button>\n <button className=\"ax-carousel__btn ax-carousel__btn--next\" disabled={idx === slides.length - 1} onClick={() => go(idx + 1)} aria-label=\"Next\">›</button>\n </React.Fragment>\n ) : null}\n {dots && slides.length > 1 ? (\n <div className=\"ax-carousel__dots\">\n {slides.map((_, i) => <button key={i} className={\"ax-carousel__dot\" + (i === idx ? \" ax-carousel__dot--active\" : \"\")} onClick={() => go(i)} aria-label={\"Go to slide \" + (i + 1)}></button>)}\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;AAgBxB,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,UAAU,OAAO,MAAM,SAAS,MAAM,YAAY,IAAI,GAAG,QAAQ;AAC1F,QAAM,SAAS,SAAS,QAAQ,QAAQ;AACxC,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,CAAC;AAChC,QAAM,KAAK,CAAC,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC;AACpE,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACxE,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAU,yBACb,UAAA,oBAAC,OAAA,EAAI,WAAU,sBAAqB,OAAO,EAAE,WAAW,eAAe,MAAM,GAAG,KAAA,GAC7E,UAAA,OAAO,IAAI,CAAC,GAAG,MAAM,oBAAC,OAAA,EAAI,WAAU,sBAA8B,UAAA,EAAA,GAAJ,CAAM,CAAM,EAAA,CAC7E,GACF;AAAA,IACC,UAAU,OAAO,SAAS,IACzB,qBAAC,MAAM,UAAN,EACC,UAAA;AAAA,MAAA,oBAAC,UAAA,EAAO,WAAU,2CAA0C,UAAU,QAAQ,GAAG,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,cAAW,YAAW,UAAA,KAAC;AAAA,0BACnI,UAAA,EAAO,WAAU,2CAA0C,UAAU,QAAQ,OAAO,SAAS,GAAG,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,cAAW,QAAO,UAAA,IAAA,CAAC;AAAA,IAAA,EAAA,CAClJ,IACE;AAAA,IACH,QAAQ,OAAO,SAAS,wBACtB,OAAA,EAAI,WAAU,qBACZ,UAAA,OAAO,IAAI,CAAC,GAAG,0BAAO,UAAA,EAAe,WAAW,sBAAsB,MAAM,MAAM,8BAA8B,KAAK,SAAS,MAAM,GAAG,CAAC,GAAG,cAAY,kBAAkB,IAAI,GAAA,GAA3I,CAA+I,CAAS,GAC7L,IACE;AAAA,EAAA,GACN;AAEJ;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Minimal mono charts. BarChart + LineChart. */
|
|
2
|
+
export interface BarDatum { value: number; label?: string; muted?: boolean; }
|
|
3
|
+
export interface BarChartProps { data: Array<number | BarDatum>; title?: string; }
|
|
4
|
+
export declare function BarChart(props: BarChartProps): JSX.Element;
|
|
5
|
+
export interface LineDatum { value: number; label?: string; }
|
|
6
|
+
export interface LineChartProps { data: Array<number | LineDatum>; title?: string; height?: number; }
|
|
7
|
+
export declare function LineChart(props: LineChartProps): JSX.Element;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_CHART_CSS = `
|
|
4
|
+
.ax-chart { font-family: var(--font-mono); }
|
|
5
|
+
.ax-chart__title { font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); margin-bottom: 12px; }
|
|
6
|
+
.ax-barchart { display: flex; align-items: flex-end; gap: 8px; height: 140px; }
|
|
7
|
+
.ax-barchart__col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; height: 100%; justify-content: flex-end; }
|
|
8
|
+
.ax-barchart__bar { width: 100%; background: var(--text-body); border-radius: var(--radius-1) var(--radius-1) 0 0; transition: height var(--dur-3) var(--ease-out); min-height: 2px; }
|
|
9
|
+
.ax-barchart__col--accent .ax-barchart__bar { background: var(--text-faint); }
|
|
10
|
+
.ax-barchart__val { font-size: 10px; color: var(--text-muted); }
|
|
11
|
+
.ax-barchart__label { font-size: 10px; color: var(--text-faint); white-space: nowrap; }
|
|
12
|
+
.ax-linechart { position: relative; }
|
|
13
|
+
.ax-linechart svg { width: 100%; display: block; overflow: visible; }
|
|
14
|
+
.ax-linechart__labels { display: flex; justify-content: space-between; margin-top: 8px; }
|
|
15
|
+
.ax-linechart__label { font-size: 10px; color: var(--text-faint); }
|
|
16
|
+
`;
|
|
17
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-chart-css")) {
|
|
18
|
+
const s = document.createElement("style");
|
|
19
|
+
s.id = "ax-chart-css";
|
|
20
|
+
s.textContent = AX_CHART_CSS;
|
|
21
|
+
document.head.appendChild(s);
|
|
22
|
+
}
|
|
23
|
+
function BarChart({ data = [], title, className = "", ...rest }) {
|
|
24
|
+
const max = Math.max(...data.map((d) => typeof d === "number" ? d : d.value), 1);
|
|
25
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-chart", className].filter(Boolean).join(" "), ...rest, children: [
|
|
26
|
+
title ? /* @__PURE__ */ jsx("div", { className: "ax-chart__title", children: title }) : null,
|
|
27
|
+
/* @__PURE__ */ jsx("div", { className: "ax-barchart", children: data.map((d, i) => {
|
|
28
|
+
const item = typeof d === "number" ? { value: d } : d;
|
|
29
|
+
return /* @__PURE__ */ jsxs("div", { className: "ax-barchart__col" + (item.muted ? " ax-barchart__col--accent" : ""), children: [
|
|
30
|
+
/* @__PURE__ */ jsx("span", { className: "ax-barchart__val", children: item.value }),
|
|
31
|
+
/* @__PURE__ */ jsx("span", { className: "ax-barchart__bar", style: { height: item.value / max * 100 + "%" } }),
|
|
32
|
+
item.label ? /* @__PURE__ */ jsx("span", { className: "ax-barchart__label", children: item.label }) : null
|
|
33
|
+
] }, i);
|
|
34
|
+
}) })
|
|
35
|
+
] });
|
|
36
|
+
}
|
|
37
|
+
function LineChart({ data = [], title, height = 120, className = "", ...rest }) {
|
|
38
|
+
const values = data.map((d) => typeof d === "number" ? d : d.value);
|
|
39
|
+
const max = Math.max(...values, 1);
|
|
40
|
+
const min = Math.min(...values, 0);
|
|
41
|
+
const range = max - min || 1;
|
|
42
|
+
const w = 100, h = height;
|
|
43
|
+
const pts = values.map((v, i) => {
|
|
44
|
+
const x = i / (values.length - 1 || 1) * w;
|
|
45
|
+
const y = h - (v - min) / range * h;
|
|
46
|
+
return [x, y];
|
|
47
|
+
});
|
|
48
|
+
const path = pts.map((p, i) => (i === 0 ? "M" : "L") + p[0].toFixed(2) + " " + p[1].toFixed(2)).join(" ");
|
|
49
|
+
const area = path + ` L ${w} ${h} L 0 ${h} Z`;
|
|
50
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-chart ax-linechart", className].filter(Boolean).join(" "), ...rest, children: [
|
|
51
|
+
title ? /* @__PURE__ */ jsx("div", { className: "ax-chart__title", children: title }) : null,
|
|
52
|
+
/* @__PURE__ */ jsxs("svg", { viewBox: `0 0 ${w} ${h}`, preserveAspectRatio: "none", style: { height }, children: [
|
|
53
|
+
/* @__PURE__ */ jsx("path", { d: area, fill: "var(--surface-raised)", opacity: "0.6" }),
|
|
54
|
+
/* @__PURE__ */ jsx("path", { d: path, fill: "none", stroke: "var(--text-body)", strokeWidth: "1.5", vectorEffect: "non-scaling-stroke" }),
|
|
55
|
+
pts.map((p, i) => /* @__PURE__ */ jsx("circle", { cx: p[0], cy: p[1], r: "2", fill: "var(--surface-page)", stroke: "var(--text-body)", strokeWidth: "1.5", vectorEffect: "non-scaling-stroke" }, i))
|
|
56
|
+
] }),
|
|
57
|
+
/* @__PURE__ */ jsx("div", { className: "ax-linechart__labels", children: data.map((d, i) => /* @__PURE__ */ jsx("span", { className: "ax-linechart__label", children: typeof d === "number" ? "" : d.label }, i)) })
|
|
58
|
+
] });
|
|
59
|
+
}
|
|
60
|
+
function Chart({ type = "bar", ...props }) {
|
|
61
|
+
return type === "line" ? /* @__PURE__ */ jsx(LineChart, { ...props }) : /* @__PURE__ */ jsx(BarChart, { ...props });
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
BarChart,
|
|
65
|
+
Chart,
|
|
66
|
+
LineChart
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=Chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Chart.js","sources":["../../../src/components/display/Chart.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_CHART_CSS = `\n.ax-chart { font-family: var(--font-mono); }\n.ax-chart__title { font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); margin-bottom: 12px; }\n.ax-barchart { display: flex; align-items: flex-end; gap: 8px; height: 140px; }\n.ax-barchart__col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; height: 100%; justify-content: flex-end; }\n.ax-barchart__bar { width: 100%; background: var(--text-body); border-radius: var(--radius-1) var(--radius-1) 0 0; transition: height var(--dur-3) var(--ease-out); min-height: 2px; }\n.ax-barchart__col--accent .ax-barchart__bar { background: var(--text-faint); }\n.ax-barchart__val { font-size: 10px; color: var(--text-muted); }\n.ax-barchart__label { font-size: 10px; color: var(--text-faint); white-space: nowrap; }\n.ax-linechart { position: relative; }\n.ax-linechart svg { width: 100%; display: block; overflow: visible; }\n.ax-linechart__labels { display: flex; justify-content: space-between; margin-top: 8px; }\n.ax-linechart__label { font-size: 10px; color: var(--text-faint); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-chart-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-chart-css\";\n s.textContent = AX_CHART_CSS;\n document.head.appendChild(s);\n}\n\nexport function BarChart({ data = [], title, className = \"\", ...rest }) {\n const max = Math.max(...data.map((d) => (typeof d === \"number\" ? d : d.value)), 1);\n return (\n <div className={[\"ax-chart\", className].filter(Boolean).join(\" \")} {...rest}>\n {title ? <div className=\"ax-chart__title\">{title}</div> : null}\n <div className=\"ax-barchart\">\n {data.map((d, i) => {\n const item = typeof d === \"number\" ? { value: d } : d;\n return (\n <div key={i} className={\"ax-barchart__col\" + (item.muted ? \" ax-barchart__col--accent\" : \"\")}>\n <span className=\"ax-barchart__val\">{item.value}</span>\n <span className=\"ax-barchart__bar\" style={{ height: (item.value / max) * 100 + \"%\" }}></span>\n {item.label ? <span className=\"ax-barchart__label\">{item.label}</span> : null}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport function LineChart({ data = [], title, height = 120, className = \"\", ...rest }) { const values = data.map((d) => (typeof d === \"number\" ? d : d.value));\n const max = Math.max(...values, 1);\n const min = Math.min(...values, 0);\n const range = max - min || 1;\n const w = 100, h = height;\n const pts = values.map((v, i) => {\n const x = (i / (values.length - 1 || 1)) * w;\n const y = h - ((v - min) / range) * h;\n return [x, y];\n });\n const path = pts.map((p, i) => (i === 0 ? \"M\" : \"L\") + p[0].toFixed(2) + \" \" + p[1].toFixed(2)).join(\" \");\n const area = path + ` L ${w} ${h} L 0 ${h} Z`;\n return (\n <div className={[\"ax-chart ax-linechart\", className].filter(Boolean).join(\" \")} {...rest}>\n {title ? <div className=\"ax-chart__title\">{title}</div> : null}\n <svg viewBox={`0 0 ${w} ${h}`} preserveAspectRatio=\"none\" style={{ height }}>\n <path d={area} fill=\"var(--surface-raised)\" opacity=\"0.6\"></path>\n <path d={path} fill=\"none\" stroke=\"var(--text-body)\" strokeWidth=\"1.5\" vectorEffect=\"non-scaling-stroke\"></path>\n {pts.map((p, i) => <circle key={i} cx={p[0]} cy={p[1]} r=\"2\" fill=\"var(--surface-page)\" stroke=\"var(--text-body)\" strokeWidth=\"1.5\" vectorEffect=\"non-scaling-stroke\"></circle>)}\n </svg>\n <div className=\"ax-linechart__labels\">\n {data.map((d, i) => <span key={i} className=\"ax-linechart__label\">{typeof d === \"number\" ? \"\" : d.label}</span>)}\n </div>\n </div>\n );\n}\n\n/** Namesake convenience: <Chart type=\"bar|line\" …>. BarChart / LineChart remain the primary exports. */\nexport function Chart({ type = \"bar\", ...props }) {\n return type === \"line\" ? <LineChart {...props} /> : <BarChart {...props} />;\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,SAAS,EAAE,OAAO,IAAI,OAAO,YAAY,IAAI,GAAG,QAAQ;AACtE,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,KAAM,GAAG,CAAC;AACjF,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACpE,UAAA;AAAA,IAAA,QAAQ,oBAAC,OAAA,EAAI,WAAU,mBAAmB,iBAAM,IAAS;AAAA,IAC1D,oBAAC,SAAI,WAAU,eACZ,eAAK,IAAI,CAAC,GAAG,MAAM;AAClB,YAAM,OAAO,OAAO,MAAM,WAAW,EAAE,OAAO,MAAM;AACpD,kCACG,OAAA,EAAY,WAAW,sBAAsB,KAAK,QAAQ,8BAA8B,KACvF,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,oBAAoB,UAAA,KAAK,OAAM;AAAA,QAC/C,oBAAC,QAAA,EAAK,WAAU,oBAAmB,OAAO,EAAE,QAAS,KAAK,QAAQ,MAAO,MAAM,IAAA,EAAI,CAAG;AAAA,QACrF,KAAK,QAAQ,oBAAC,QAAA,EAAK,WAAU,sBAAsB,UAAA,KAAK,OAAM,IAAU;AAAA,MAAA,EAAA,GAHjE,CAIV;AAAA,IAEJ,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEO,SAAS,UAAU,EAAE,OAAO,CAAA,GAAI,OAAO,SAAS,KAAK,YAAY,IAAI,GAAG,QAAQ;AAAG,QAAM,SAAS,KAAK,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,EAAE,KAAM;AAC5J,QAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC;AACjC,QAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC;AACjC,QAAM,QAAQ,MAAM,OAAO;AAC3B,QAAM,IAAI,KAAK,IAAI;AACnB,QAAM,MAAM,OAAO,IAAI,CAAC,GAAG,MAAM;AAC/B,UAAM,IAAK,KAAK,OAAO,SAAS,KAAK,KAAM;AAC3C,UAAM,IAAI,KAAM,IAAI,OAAO,QAAS;AACpC,WAAO,CAAC,GAAG,CAAC;AAAA,EACd,CAAC;AACD,QAAM,OAAO,IAAI,IAAI,CAAC,GAAG,OAAO,MAAM,IAAI,MAAM,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG;AACxG,QAAM,OAAO,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AACzC,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,yBAAyB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACjF,UAAA;AAAA,IAAA,QAAQ,oBAAC,OAAA,EAAI,WAAU,mBAAmB,iBAAM,IAAS;AAAA,IAC1D,qBAAC,OAAA,EAAI,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,qBAAoB,QAAO,OAAO,EAAE,UACjE,UAAA;AAAA,MAAA,oBAAC,UAAK,GAAG,MAAM,MAAK,yBAAwB,SAAQ,OAAM;AAAA,MAC1D,oBAAC,QAAA,EAAK,GAAG,MAAM,MAAK,QAAO,QAAO,oBAAmB,aAAY,OAAM,cAAa,qBAAA,CAAqB;AAAA,MACxG,IAAI,IAAI,CAAC,GAAG,MAAM,oBAAC,UAAA,EAAe,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAE,KAAI,MAAK,uBAAsB,QAAO,oBAAmB,aAAY,OAAM,cAAa,qBAAA,GAAjH,CAAsI,CAAS;AAAA,IAAA,GACjL;AAAA,IACA,oBAAC,SAAI,WAAU,wBACZ,eAAK,IAAI,CAAC,GAAG,MAAM,oBAAC,UAAa,WAAU,uBAAuB,iBAAO,MAAM,WAAW,KAAK,EAAE,SAAnE,CAAyE,CAAO,EAAA,CACjH;AAAA,EAAA,GACF;AAEJ;AAGO,SAAS,MAAM,EAAE,OAAO,OAAO,GAAG,SAAS;AAChD,SAAO,SAAS,SAAS,oBAAC,WAAA,EAAW,GAAG,OAAO,IAAK,oBAAC,UAAA,EAAU,GAAG,MAAA,CAAO;AAC3E;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
const AX_COLLAPSIBLE_CSS = `
|
|
4
|
+
.ax-collapsible { border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); }
|
|
5
|
+
.ax-collapsible__trigger { display: flex; align-items: center; gap: 10px; width: 100%; appearance: none; background: none; border: none; cursor: pointer; text-align: left; padding: 12px 14px; color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); font-weight: var(--weight-medium); }
|
|
6
|
+
.ax-collapsible__trigger:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--radius-3); }
|
|
7
|
+
.ax-collapsible__label { flex: 1; }
|
|
8
|
+
.ax-collapsible__chev { width: 14px; height: 14px; color: var(--text-faint); transition: transform var(--dur-2) var(--ease-out); }
|
|
9
|
+
.ax-collapsible--open .ax-collapsible__chev { transform: rotate(180deg); }
|
|
10
|
+
.ax-collapsible__panel { overflow: hidden; display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-2) var(--ease-out); }
|
|
11
|
+
.ax-collapsible--open .ax-collapsible__panel { grid-template-rows: 1fr; }
|
|
12
|
+
.ax-collapsible__inner { min-height: 0; }
|
|
13
|
+
.ax-collapsible__body { padding: 0 14px 14px; font-size: var(--text-sm); color: var(--text-muted); line-height: var(--leading-body); }
|
|
14
|
+
@media (prefers-reduced-motion: reduce) { .ax-collapsible__panel { transition: none; } }
|
|
15
|
+
`;
|
|
16
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-collapsible-css")) {
|
|
17
|
+
const s = document.createElement("style");
|
|
18
|
+
s.id = "ax-collapsible-css";
|
|
19
|
+
s.textContent = AX_COLLAPSIBLE_CSS;
|
|
20
|
+
document.head.appendChild(s);
|
|
21
|
+
}
|
|
22
|
+
const Chev = /* @__PURE__ */ jsx("svg", { className: "ax-collapsible__chev", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) });
|
|
23
|
+
function Collapsible({ label, defaultOpen = false, children, className = "", ...rest }) {
|
|
24
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
25
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-collapsible", open ? "ax-collapsible--open" : "", className].filter(Boolean).join(" "), ...rest, children: [
|
|
26
|
+
/* @__PURE__ */ jsxs("button", { className: "ax-collapsible__trigger", "aria-expanded": open, onClick: () => setOpen((o) => !o), children: [
|
|
27
|
+
/* @__PURE__ */ jsx("span", { className: "ax-collapsible__label", children: label }),
|
|
28
|
+
Chev
|
|
29
|
+
] }),
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "ax-collapsible__panel", children: /* @__PURE__ */ jsx("div", { className: "ax-collapsible__inner", children: /* @__PURE__ */ jsx("div", { className: "ax-collapsible__body", children }) }) })
|
|
31
|
+
] });
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
Collapsible
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=Collapsible.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Collapsible.js","sources":["../../../src/components/display/Collapsible.jsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nconst AX_COLLAPSIBLE_CSS = `\n.ax-collapsible { border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); }\n.ax-collapsible__trigger { display: flex; align-items: center; gap: 10px; width: 100%; appearance: none; background: none; border: none; cursor: pointer; text-align: left; padding: 12px 14px; color: var(--text-body); font-family: var(--font-body); font-size: var(--text-sm); font-weight: var(--weight-medium); }\n.ax-collapsible__trigger:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--radius-3); }\n.ax-collapsible__label { flex: 1; }\n.ax-collapsible__chev { width: 14px; height: 14px; color: var(--text-faint); transition: transform var(--dur-2) var(--ease-out); }\n.ax-collapsible--open .ax-collapsible__chev { transform: rotate(180deg); }\n.ax-collapsible__panel { overflow: hidden; display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-2) var(--ease-out); }\n.ax-collapsible--open .ax-collapsible__panel { grid-template-rows: 1fr; }\n.ax-collapsible__inner { min-height: 0; }\n.ax-collapsible__body { padding: 0 14px 14px; font-size: var(--text-sm); color: var(--text-muted); line-height: var(--leading-body); }\n@media (prefers-reduced-motion: reduce) { .ax-collapsible__panel { transition: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-collapsible-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-collapsible-css\";\n s.textContent = AX_COLLAPSIBLE_CSS;\n document.head.appendChild(s);\n}\n\nconst Chev = <svg className=\"ax-collapsible__chev\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"m6 9 6 6 6-6\"></path></svg>;\n\nexport function Collapsible({ label, defaultOpen = false, children, className = \"\", ...rest }) {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <div className={[\"ax-collapsible\", open ? \"ax-collapsible--open\" : \"\", className].filter(Boolean).join(\" \")} {...rest}>\n <button className=\"ax-collapsible__trigger\" aria-expanded={open} onClick={() => setOpen((o) => !o)}>\n <span className=\"ax-collapsible__label\">{label}</span>\n {Chev}\n </button>\n <div className=\"ax-collapsible__panel\">\n <div className=\"ax-collapsible__inner\">\n <div className=\"ax-collapsible__body\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc3B,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,oBAAoB,GAAG;AACrF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEA,MAAM,2BAAQ,OAAA,EAAI,WAAU,wBAAuB,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,UAAA,oBAAC,QAAA,EAAK,GAAE,eAAA,CAAe,EAAA,CAAO;AAE/L,SAAS,YAAY,EAAE,OAAO,cAAc,OAAO,UAAU,YAAY,IAAI,GAAG,QAAQ;AAC7F,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,WAAW;AAC5C,8BACG,OAAA,EAAI,WAAW,CAAC,kBAAkB,OAAO,yBAAyB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAC/G,UAAA;AAAA,IAAA,qBAAC,UAAA,EAAO,WAAU,2BAA0B,iBAAe,MAAM,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GAC/F,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,yBAAyB,UAAA,OAAM;AAAA,MAC9C;AAAA,IAAA,GACH;AAAA,IACA,oBAAC,OAAA,EAAI,WAAU,yBACb,8BAAC,OAAA,EAAI,WAAU,yBACb,UAAA,oBAAC,OAAA,EAAI,WAAU,wBAAwB,SAAA,CAAS,GAClD,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Sortable, optionally paginated table. Click headers to sort. */
|
|
2
|
+
export interface DataColumn { key: string; label?: string; numeric?: boolean; sortable?: boolean; render?: (value: any, row: any) => React.ReactNode; }
|
|
3
|
+
export interface DataTableProps { columns: Array<string | DataColumn>; rows: Array<Record<string, any>>; pageSize?: number; caption?: string; }
|
|
4
|
+
export declare function DataTable(props: DataTableProps): JSX.Element;
|