@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,72 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo } from "react";
|
|
3
|
+
const AX_DATATABLE_CSS = `
|
|
4
|
+
.ax-datatable-wrap { width: 100%; overflow-x: auto; border: 1px solid var(--border-default); border-radius: var(--radius-3); }
|
|
5
|
+
.ax-datatable { width: 100%; border-collapse: collapse; font-size: var(--text-sm); }
|
|
6
|
+
.ax-datatable thead th { text-align: left; padding: 10px 14px; background: var(--surface-card); border-bottom: 1px solid var(--border-strong); white-space: nowrap; 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); }
|
|
7
|
+
.ax-datatable th--sortable { cursor: pointer; user-select: none; }
|
|
8
|
+
.ax-datatable th--sortable:hover { color: var(--text-body); }
|
|
9
|
+
.ax-datatable__sort { display: inline-flex; flex-direction: column; margin-left: 6px; vertical-align: middle; }
|
|
10
|
+
.ax-datatable__sort span { font-size: 7px; line-height: 6px; color: var(--border-strong); }
|
|
11
|
+
.ax-datatable__sort span.on { color: var(--text-body); }
|
|
12
|
+
.ax-datatable tbody td { padding: 11px 14px; border-bottom: 1px solid var(--border-default); color: var(--text-body); }
|
|
13
|
+
.ax-datatable tbody tr:last-child td { border-bottom: none; }
|
|
14
|
+
.ax-datatable tbody tr:hover { background: var(--surface-raised); }
|
|
15
|
+
.ax-datatable__num { font-family: var(--font-mono); text-align: right; }
|
|
16
|
+
.ax-datatable__foot { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; border-top: 1px solid var(--border-default); font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint); }
|
|
17
|
+
`;
|
|
18
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-datatable-css")) {
|
|
19
|
+
const s = document.createElement("style");
|
|
20
|
+
s.id = "ax-datatable-css";
|
|
21
|
+
s.textContent = AX_DATATABLE_CSS;
|
|
22
|
+
document.head.appendChild(s);
|
|
23
|
+
}
|
|
24
|
+
function DataTable({ columns = [], rows = [], pageSize, caption, className = "", ...rest }) {
|
|
25
|
+
const [sort, setSort] = useState({ key: null, dir: 1 });
|
|
26
|
+
const [page, setPage] = useState(0);
|
|
27
|
+
const norm = (c) => typeof c === "string" ? { key: c, label: c } : c;
|
|
28
|
+
const cols = columns.map(norm);
|
|
29
|
+
const sorted = useMemo(() => {
|
|
30
|
+
if (!sort.key) return rows;
|
|
31
|
+
const copy = rows.slice();
|
|
32
|
+
copy.sort((a, b) => {
|
|
33
|
+
const av = a[sort.key], bv = b[sort.key];
|
|
34
|
+
if (av === bv) return 0;
|
|
35
|
+
if (typeof av === "number" && typeof bv === "number") return (av - bv) * sort.dir;
|
|
36
|
+
return String(av).localeCompare(String(bv)) * sort.dir;
|
|
37
|
+
});
|
|
38
|
+
return copy;
|
|
39
|
+
}, [rows, sort]);
|
|
40
|
+
const paged = pageSize ? sorted.slice(page * pageSize, (page + 1) * pageSize) : sorted;
|
|
41
|
+
const totalPages = pageSize ? Math.ceil(sorted.length / pageSize) : 1;
|
|
42
|
+
const toggleSort = (key) => setSort((s) => s.key === key ? { key, dir: -s.dir } : { key, dir: 1 });
|
|
43
|
+
return /* @__PURE__ */ jsx("div", { className, ...rest, children: /* @__PURE__ */ jsxs("div", { className: "ax-datatable-wrap", children: [
|
|
44
|
+
/* @__PURE__ */ jsxs("table", { className: "ax-datatable", children: [
|
|
45
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: cols.map((c) => /* @__PURE__ */ jsxs("th", { className: (c.sortable !== false ? "th--sortable " : "") + (c.numeric ? "ax-datatable__num" : ""), onClick: () => c.sortable !== false && toggleSort(c.key), children: [
|
|
46
|
+
c.label,
|
|
47
|
+
c.sortable !== false ? /* @__PURE__ */ jsxs("span", { className: "ax-datatable__sort", children: [
|
|
48
|
+
/* @__PURE__ */ jsx("span", { className: sort.key === c.key && sort.dir === 1 ? "on" : "", children: "▲" }),
|
|
49
|
+
/* @__PURE__ */ jsx("span", { className: sort.key === c.key && sort.dir === -1 ? "on" : "", children: "▼" })
|
|
50
|
+
] }) : null
|
|
51
|
+
] }, c.key)) }) }),
|
|
52
|
+
/* @__PURE__ */ jsx("tbody", { children: paged.map((row, ri) => /* @__PURE__ */ jsx("tr", { children: cols.map((c) => /* @__PURE__ */ jsx("td", { className: c.numeric ? "ax-datatable__num" : "", children: c.render ? c.render(row[c.key], row) : row[c.key] }, c.key)) }, ri)) })
|
|
53
|
+
] }),
|
|
54
|
+
pageSize && totalPages > 1 ? /* @__PURE__ */ jsxs("div", { className: "ax-datatable__foot", children: [
|
|
55
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
56
|
+
page * pageSize + 1,
|
|
57
|
+
"–",
|
|
58
|
+
Math.min((page + 1) * pageSize, sorted.length),
|
|
59
|
+
" of ",
|
|
60
|
+
sorted.length
|
|
61
|
+
] }),
|
|
62
|
+
/* @__PURE__ */ jsxs("span", { style: { display: "flex", gap: 8 }, children: [
|
|
63
|
+
/* @__PURE__ */ jsx("button", { onClick: () => setPage((p) => Math.max(0, p - 1)), disabled: page === 0, style: { background: "none", border: "none", color: "inherit", cursor: "pointer", fontFamily: "inherit" }, children: "‹ prev" }),
|
|
64
|
+
/* @__PURE__ */ jsx("button", { onClick: () => setPage((p) => Math.min(totalPages - 1, p + 1)), disabled: page >= totalPages - 1, style: { background: "none", border: "none", color: "inherit", cursor: "pointer", fontFamily: "inherit" }, children: "next ›" })
|
|
65
|
+
] })
|
|
66
|
+
] }) : null
|
|
67
|
+
] }) });
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
DataTable
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=DataTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.js","sources":["../../../src/components/display/DataTable.jsx"],"sourcesContent":["import React, { useState, useMemo } from \"react\";\n\nconst AX_DATATABLE_CSS = `\n.ax-datatable-wrap { width: 100%; overflow-x: auto; border: 1px solid var(--border-default); border-radius: var(--radius-3); }\n.ax-datatable { width: 100%; border-collapse: collapse; font-size: var(--text-sm); }\n.ax-datatable thead th { text-align: left; padding: 10px 14px; background: var(--surface-card); border-bottom: 1px solid var(--border-strong); white-space: nowrap; 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); }\n.ax-datatable th--sortable { cursor: pointer; user-select: none; }\n.ax-datatable th--sortable:hover { color: var(--text-body); }\n.ax-datatable__sort { display: inline-flex; flex-direction: column; margin-left: 6px; vertical-align: middle; }\n.ax-datatable__sort span { font-size: 7px; line-height: 6px; color: var(--border-strong); }\n.ax-datatable__sort span.on { color: var(--text-body); }\n.ax-datatable tbody td { padding: 11px 14px; border-bottom: 1px solid var(--border-default); color: var(--text-body); }\n.ax-datatable tbody tr:last-child td { border-bottom: none; }\n.ax-datatable tbody tr:hover { background: var(--surface-raised); }\n.ax-datatable__num { font-family: var(--font-mono); text-align: right; }\n.ax-datatable__foot { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; border-top: 1px solid var(--border-default); font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-datatable-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-datatable-css\";\n s.textContent = AX_DATATABLE_CSS;\n document.head.appendChild(s);\n}\n\nexport function DataTable({ columns = [], rows = [], pageSize, caption, className = \"\", ...rest }) {\n const [sort, setSort] = useState({ key: null, dir: 1 });\n const [page, setPage] = useState(0);\n\n const norm = (c) => (typeof c === \"string\" ? { key: c, label: c } : c);\n const cols = columns.map(norm);\n\n const sorted = useMemo(() => {\n if (!sort.key) return rows;\n const copy = rows.slice();\n copy.sort((a, b) => {\n const av = a[sort.key], bv = b[sort.key];\n if (av === bv) return 0;\n if (typeof av === \"number\" && typeof bv === \"number\") return (av - bv) * sort.dir;\n return String(av).localeCompare(String(bv)) * sort.dir;\n });\n return copy;\n }, [rows, sort]);\n\n const paged = pageSize ? sorted.slice(page * pageSize, (page + 1) * pageSize) : sorted;\n const totalPages = pageSize ? Math.ceil(sorted.length / pageSize) : 1;\n\n const toggleSort = (key) => setSort((s) => s.key === key ? { key, dir: -s.dir } : { key, dir: 1 });\n\n return (\n <div className={className} {...rest}>\n <div className=\"ax-datatable-wrap\">\n <table className=\"ax-datatable\">\n <thead>\n <tr>\n {cols.map((c) => (\n <th key={c.key} className={(c.sortable !== false ? \"th--sortable \" : \"\") + (c.numeric ? \"ax-datatable__num\" : \"\")} onClick={() => c.sortable !== false && toggleSort(c.key)}>\n {c.label}\n {c.sortable !== false ? (\n <span className=\"ax-datatable__sort\">\n <span className={sort.key === c.key && sort.dir === 1 ? \"on\" : \"\"}>▲</span>\n <span className={sort.key === c.key && sort.dir === -1 ? \"on\" : \"\"}>▼</span>\n </span>\n ) : null}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {paged.map((row, ri) => (\n <tr key={ri}>\n {cols.map((c) => <td key={c.key} className={c.numeric ? \"ax-datatable__num\" : \"\"}>{c.render ? c.render(row[c.key], row) : row[c.key]}</td>)}\n </tr>\n ))}\n </tbody>\n </table>\n {pageSize && totalPages > 1 ? (\n <div className=\"ax-datatable__foot\">\n <span>{page * pageSize + 1}–{Math.min((page + 1) * pageSize, sorted.length)} of {sorted.length}</span>\n <span style={{ display: \"flex\", gap: 8 }}>\n <button onClick={() => setPage((p) => Math.max(0, p - 1))} disabled={page === 0} style={{ background: \"none\", border: \"none\", color: \"inherit\", cursor: \"pointer\", fontFamily: \"inherit\" }}>‹ prev</button>\n <button onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))} disabled={page >= totalPages - 1} style={{ background: \"none\", border: \"none\", color: \"inherit\", cursor: \"pointer\", fontFamily: \"inherit\" }}>next ›</button>\n </span>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBzB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,kBAAkB,GAAG;AACnF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,UAAU,EAAE,UAAU,CAAA,GAAI,OAAO,CAAA,GAAI,UAAU,SAAS,YAAY,IAAI,GAAG,QAAQ;AACjG,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE,KAAK,MAAM,KAAK,GAAG;AACtD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAElC,QAAM,OAAO,CAAC,MAAO,OAAO,MAAM,WAAW,EAAE,KAAK,GAAG,OAAO,EAAA,IAAM;AACpE,QAAM,OAAO,QAAQ,IAAI,IAAI;AAE7B,QAAM,SAAS,QAAQ,MAAM;AAC3B,QAAI,CAAC,KAAK,IAAK,QAAO;AACtB,UAAM,OAAO,KAAK,MAAA;AAClB,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,KAAK,EAAE,KAAK,GAAG,GAAG,KAAK,EAAE,KAAK,GAAG;AACvC,UAAI,OAAO,GAAI,QAAO;AACtB,UAAI,OAAO,OAAO,YAAY,OAAO,OAAO,SAAU,SAAQ,KAAK,MAAM,KAAK;AAC9E,aAAO,OAAO,EAAE,EAAE,cAAc,OAAO,EAAE,CAAC,IAAI,KAAK;AAAA,IACrD,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,QAAM,QAAQ,WAAW,OAAO,MAAM,OAAO,WAAW,OAAO,KAAK,QAAQ,IAAI;AAChF,QAAM,aAAa,WAAW,KAAK,KAAK,OAAO,SAAS,QAAQ,IAAI;AAEpE,QAAM,aAAa,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,QAAQ,MAAM,EAAE,KAAK,KAAK,CAAC,EAAE,IAAA,IAAQ,EAAE,KAAK,KAAK,GAAG;AAEjG,SACE,oBAAC,SAAI,WAAuB,GAAG,MAC7B,UAAA,qBAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,IAAA,qBAAC,SAAA,EAAM,WAAU,gBACf,UAAA;AAAA,MAAA,oBAAC,SAAA,EACC,UAAA,oBAAC,MAAA,EACE,UAAA,KAAK,IAAI,CAAC,MACT,qBAAC,MAAA,EAAe,YAAY,EAAE,aAAa,QAAQ,kBAAkB,OAAO,EAAE,UAAU,sBAAsB,KAAK,SAAS,MAAM,EAAE,aAAa,SAAS,WAAW,EAAE,GAAG,GACvK,UAAA;AAAA,QAAA,EAAE;AAAA,QACF,EAAE,aAAa,QACd,qBAAC,QAAA,EAAK,WAAU,sBACd,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAW,KAAK,QAAQ,EAAE,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,UAAA,KAAC;AAAA,UACpE,oBAAC,QAAA,EAAK,WAAW,KAAK,QAAQ,EAAE,OAAO,KAAK,QAAQ,KAAK,OAAO,IAAI,UAAA,IAAA,CAAC;AAAA,QAAA,EAAA,CACvE,IACE;AAAA,MAAA,EAAA,GAPG,EAAE,GAQX,CACD,EAAA,CACH,EAAA,CACF;AAAA,0BACC,SAAA,EACE,UAAA,MAAM,IAAI,CAAC,KAAK,OACf,oBAAC,MAAA,EACE,UAAA,KAAK,IAAI,CAAC,MAAM,oBAAC,QAAe,WAAW,EAAE,UAAU,sBAAsB,IAAK,UAAA,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,KAAzG,EAAE,GAAyG,CAAK,EAAA,GADnI,EAET,CACD,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IACC,YAAY,aAAa,IACxB,qBAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,MAAA,qBAAC,QAAA,EAAM,UAAA;AAAA,QAAA,OAAO,WAAW;AAAA,QAAE;AAAA,QAAE,KAAK,KAAK,OAAO,KAAK,UAAU,OAAO,MAAM;AAAA,QAAE;AAAA,QAAK,OAAO;AAAA,MAAA,GAAO;AAAA,MAC/F,qBAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,KAAK,KACnC,UAAA;AAAA,QAAA,oBAAC,UAAA,EAAO,SAAS,MAAM,QAAQ,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,SAAS,GAAG,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,OAAO,WAAW,QAAQ,WAAW,YAAY,UAAA,GAAa,UAAA,SAAA,CAAM;AAAA,QAClM,oBAAC,UAAA,EAAO,SAAS,MAAM,QAAQ,CAAC,MAAM,KAAK,IAAI,aAAa,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,QAAQ,aAAa,GAAG,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,OAAO,WAAW,QAAQ,WAAW,YAAY,UAAA,GAAa,UAAA,SAAA,CAAM;AAAA,MAAA,EAAA,CAC7N;AAAA,IAAA,EAAA,CACF,IACE;AAAA,EAAA,EAAA,CACN,EAAA,CACF;AAEJ;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Empty-state block: framed icon, title, description, optional actions.
|
|
3
|
+
*/
|
|
4
|
+
export interface EmptyProps {
|
|
5
|
+
/** Icon element (rendered in a 44px bordered square). */
|
|
6
|
+
icon?: React.ReactNode;
|
|
7
|
+
title?: React.ReactNode;
|
|
8
|
+
description?: React.ReactNode;
|
|
9
|
+
/** Action buttons row. */
|
|
10
|
+
actions?: React.ReactNode;
|
|
11
|
+
/** Dashed border frame. @default false */
|
|
12
|
+
bordered?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function Empty(props: EmptyProps): JSX.Element;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_EMPTY_CSS = `
|
|
4
|
+
.ax-empty {
|
|
5
|
+
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
|
6
|
+
text-align: center; padding: var(--space-16) var(--space-8); gap: var(--space-3);
|
|
7
|
+
}
|
|
8
|
+
.ax-empty--bordered { border: 1px dashed var(--border-strong); border-radius: var(--radius-3); }
|
|
9
|
+
.ax-empty__icon {
|
|
10
|
+
display: flex; align-items: center; justify-content: center;
|
|
11
|
+
width: 44px; height: 44px; margin-bottom: var(--space-2);
|
|
12
|
+
color: var(--text-faint); border: 1px solid var(--border-default); border-radius: var(--radius-2);
|
|
13
|
+
}
|
|
14
|
+
.ax-empty__icon svg { width: 20px; height: 20px; }
|
|
15
|
+
.ax-empty__title { font-family: var(--font-display); font-size: var(--text-lg); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; letter-spacing: var(--tracking-tight); }
|
|
16
|
+
.ax-empty__desc { font-size: var(--text-sm); color: var(--text-muted); margin: 0; max-width: 38ch; line-height: var(--leading-body); }
|
|
17
|
+
.ax-empty__actions { display: flex; gap: var(--space-2); margin-top: var(--space-3); }
|
|
18
|
+
`;
|
|
19
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-empty-css")) {
|
|
20
|
+
const s = document.createElement("style");
|
|
21
|
+
s.id = "ax-empty-css";
|
|
22
|
+
s.textContent = AX_EMPTY_CSS;
|
|
23
|
+
document.head.appendChild(s);
|
|
24
|
+
}
|
|
25
|
+
function Empty({ icon, title, description, actions, bordered = false, className = "", ...rest }) {
|
|
26
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-empty", bordered ? "ax-empty--bordered" : "", className].filter(Boolean).join(" "), ...rest, children: [
|
|
27
|
+
icon ? /* @__PURE__ */ jsx("div", { className: "ax-empty__icon", children: icon }) : null,
|
|
28
|
+
title ? /* @__PURE__ */ jsx("p", { className: "ax-empty__title", children: title }) : null,
|
|
29
|
+
description ? /* @__PURE__ */ jsx("p", { className: "ax-empty__desc", children: description }) : null,
|
|
30
|
+
actions ? /* @__PURE__ */ jsx("div", { className: "ax-empty__actions", children: actions }) : null
|
|
31
|
+
] });
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
Empty
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=Empty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Empty.js","sources":["../../../src/components/display/Empty.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_EMPTY_CSS = `\n.ax-empty {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; padding: var(--space-16) var(--space-8); gap: var(--space-3);\n}\n.ax-empty--bordered { border: 1px dashed var(--border-strong); border-radius: var(--radius-3); }\n.ax-empty__icon {\n display: flex; align-items: center; justify-content: center;\n width: 44px; height: 44px; margin-bottom: var(--space-2);\n color: var(--text-faint); border: 1px solid var(--border-default); border-radius: var(--radius-2);\n}\n.ax-empty__icon svg { width: 20px; height: 20px; }\n.ax-empty__title { font-family: var(--font-display); font-size: var(--text-lg); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; letter-spacing: var(--tracking-tight); }\n.ax-empty__desc { font-size: var(--text-sm); color: var(--text-muted); margin: 0; max-width: 38ch; line-height: var(--leading-body); }\n.ax-empty__actions { display: flex; gap: var(--space-2); margin-top: var(--space-3); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-empty-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-empty-css\";\n s.textContent = AX_EMPTY_CSS;\n document.head.appendChild(s);\n}\n\nexport function Empty({ icon, title, description, actions, bordered = false, className = \"\", ...rest }) {\n return (\n <div className={[\"ax-empty\", bordered ? \"ax-empty--bordered\" : \"\", className].filter(Boolean).join(\" \")} {...rest}>\n {icon ? <div className=\"ax-empty__icon\">{icon}</div> : null}\n {title ? <p className=\"ax-empty__title\">{title}</p> : null}\n {description ? <p className=\"ax-empty__desc\">{description}</p> : null}\n {actions ? <div className=\"ax-empty__actions\">{actions}</div> : null}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBrB,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,MAAM,OAAO,aAAa,SAAS,WAAW,OAAO,YAAY,IAAI,GAAG,KAAA,GAAQ;AACtG,8BACG,OAAA,EAAI,WAAW,CAAC,YAAY,WAAW,uBAAuB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAC1G,UAAA;AAAA,IAAA,OAAO,oBAAC,OAAA,EAAI,WAAU,kBAAkB,gBAAK,IAAS;AAAA,IACtD,QAAQ,oBAAC,KAAA,EAAE,WAAU,mBAAmB,iBAAM,IAAO;AAAA,IACrD,cAAc,oBAAC,KAAA,EAAE,WAAU,kBAAkB,uBAAY,IAAO;AAAA,IAChE,UAAU,oBAAC,OAAA,EAAI,WAAU,qBAAqB,mBAAQ,IAAS;AAAA,EAAA,GAClE;AAEJ;"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Generic list row: media slot, title + description, actions slot; optionally interactive/flush. */
|
|
2
|
+
export interface ItemProps { media?: React.ReactNode; mediaBox?: boolean; title?: React.ReactNode; description?: React.ReactNode; actions?: React.ReactNode; interactive?: boolean; flush?: boolean; children?: React.ReactNode; }
|
|
3
|
+
export declare function Item(props: ItemProps): JSX.Element;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_ITEM_CSS = `
|
|
4
|
+
.ax-item { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); transition: border-color var(--dur-1) var(--ease-out), background var(--dur-1) var(--ease-out); }
|
|
5
|
+
.ax-item--interactive { cursor: pointer; }
|
|
6
|
+
.ax-item--interactive:hover { border-color: var(--border-strong); background: var(--surface-raised); }
|
|
7
|
+
.ax-item--flush { border: none; border-radius: 0; background: none; padding: 10px 0; }
|
|
8
|
+
.ax-item__media { flex: none; display: flex; align-items: center; justify-content: center; color: var(--text-muted); }
|
|
9
|
+
.ax-item__media--box { width: 36px; height: 36px; border: 1px solid var(--border-default); border-radius: var(--radius-2); }
|
|
10
|
+
.ax-item__content { flex: 1; min-width: 0; }
|
|
11
|
+
.ax-item__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
12
|
+
.ax-item__desc { font-size: var(--text-xs); color: var(--text-muted); margin: 2px 0 0; line-height: var(--leading-snug); }
|
|
13
|
+
.ax-item__actions { flex: none; display: flex; align-items: center; gap: 6px; }
|
|
14
|
+
`;
|
|
15
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-item-css")) {
|
|
16
|
+
const s = document.createElement("style");
|
|
17
|
+
s.id = "ax-item-css";
|
|
18
|
+
s.textContent = AX_ITEM_CSS;
|
|
19
|
+
document.head.appendChild(s);
|
|
20
|
+
}
|
|
21
|
+
function Item({ media, mediaBox = true, title, description, actions, interactive = false, flush = false, children, className = "", ...rest }) {
|
|
22
|
+
const cls = ["ax-item", interactive ? "ax-item--interactive" : "", flush ? "ax-item--flush" : "", className].filter(Boolean).join(" ");
|
|
23
|
+
return /* @__PURE__ */ jsxs("div", { className: cls, ...rest, children: [
|
|
24
|
+
media ? /* @__PURE__ */ jsx("span", { className: "ax-item__media" + (mediaBox ? " ax-item__media--box" : ""), children: media }) : null,
|
|
25
|
+
/* @__PURE__ */ jsxs("div", { className: "ax-item__content", children: [
|
|
26
|
+
title ? /* @__PURE__ */ jsx("p", { className: "ax-item__title", children: title }) : null,
|
|
27
|
+
description ? /* @__PURE__ */ jsx("p", { className: "ax-item__desc", children: description }) : null,
|
|
28
|
+
children
|
|
29
|
+
] }),
|
|
30
|
+
actions ? /* @__PURE__ */ jsx("div", { className: "ax-item__actions", children: actions }) : null
|
|
31
|
+
] });
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
Item
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=Item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Item.js","sources":["../../../src/components/display/Item.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_ITEM_CSS = `\n.ax-item { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border: 1px solid var(--border-default); border-radius: var(--radius-3); background: var(--surface-card); transition: border-color var(--dur-1) var(--ease-out), background var(--dur-1) var(--ease-out); }\n.ax-item--interactive { cursor: pointer; }\n.ax-item--interactive:hover { border-color: var(--border-strong); background: var(--surface-raised); }\n.ax-item--flush { border: none; border-radius: 0; background: none; padding: 10px 0; }\n.ax-item__media { flex: none; display: flex; align-items: center; justify-content: center; color: var(--text-muted); }\n.ax-item__media--box { width: 36px; height: 36px; border: 1px solid var(--border-default); border-radius: var(--radius-2); }\n.ax-item__content { flex: 1; min-width: 0; }\n.ax-item__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ax-item__desc { font-size: var(--text-xs); color: var(--text-muted); margin: 2px 0 0; line-height: var(--leading-snug); }\n.ax-item__actions { flex: none; display: flex; align-items: center; gap: 6px; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-item-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-item-css\";\n s.textContent = AX_ITEM_CSS;\n document.head.appendChild(s);\n}\n\nexport function Item({ media, mediaBox = true, title, description, actions, interactive = false, flush = false, children, className = \"\", ...rest }) {\n const cls = [\"ax-item\", interactive ? \"ax-item--interactive\" : \"\", flush ? \"ax-item--flush\" : \"\", className].filter(Boolean).join(\" \");\n return (\n <div className={cls} {...rest}>\n {media ? <span className={\"ax-item__media\" + (mediaBox ? \" ax-item__media--box\" : \"\")}>{media}</span> : null}\n <div className=\"ax-item__content\">\n {title ? <p className=\"ax-item__title\">{title}</p> : null}\n {description ? <p className=\"ax-item__desc\">{description}</p> : null}\n {children}\n </div>\n {actions ? <div className=\"ax-item__actions\">{actions}</div> : null}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAapB,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,EAAE,OAAO,WAAW,MAAM,OAAO,aAAa,SAAS,cAAc,OAAO,QAAQ,OAAO,UAAU,YAAY,IAAI,GAAG,QAAQ;AACnJ,QAAM,MAAM,CAAC,WAAW,cAAc,yBAAyB,IAAI,QAAQ,mBAAmB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACrI,SACE,qBAAC,OAAA,EAAI,WAAW,KAAM,GAAG,MACtB,UAAA;AAAA,IAAA,QAAQ,oBAAC,UAAK,WAAW,oBAAoB,WAAW,yBAAyB,KAAM,iBAAM,IAAU;AAAA,IACxG,qBAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,MAAA,QAAQ,oBAAC,KAAA,EAAE,WAAU,kBAAkB,iBAAM,IAAO;AAAA,MACpD,cAAc,oBAAC,KAAA,EAAE,WAAU,iBAAiB,uBAAY,IAAO;AAAA,MAC/D;AAAA,IAAA,GACH;AAAA,IACC,UAAU,oBAAC,OAAA,EAAI,WAAU,oBAAoB,mBAAQ,IAAS;AAAA,EAAA,GACjE;AAEJ;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_KBD_CSS = `
|
|
4
|
+
.ax-kbd {
|
|
5
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
6
|
+
min-width: 20px; height: 20px; padding: 0 5px;
|
|
7
|
+
background: var(--surface-raised);
|
|
8
|
+
border: 1px solid var(--border-strong);
|
|
9
|
+
border-bottom-width: 2px;
|
|
10
|
+
border-radius: var(--radius-1);
|
|
11
|
+
font-family: var(--font-mono); font-size: 11px;
|
|
12
|
+
font-weight: var(--weight-medium); color: var(--text-muted);
|
|
13
|
+
}
|
|
14
|
+
`;
|
|
15
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-kbd-css")) {
|
|
16
|
+
const s = document.createElement("style");
|
|
17
|
+
s.id = "ax-kbd-css";
|
|
18
|
+
s.textContent = AX_KBD_CSS;
|
|
19
|
+
document.head.appendChild(s);
|
|
20
|
+
}
|
|
21
|
+
function Kbd({ children, className = "", ...rest }) {
|
|
22
|
+
return /* @__PURE__ */ jsx("kbd", { className: ["ax-kbd", className].filter(Boolean).join(" "), ...rest, children });
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
Kbd
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=Kbd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Kbd.js","sources":["../../../src/components/display/Kbd.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_KBD_CSS = `\n.ax-kbd {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 20px; height: 20px; padding: 0 5px;\n background: var(--surface-raised);\n border: 1px solid var(--border-strong);\n border-bottom-width: 2px;\n border-radius: var(--radius-1);\n font-family: var(--font-mono); font-size: 11px;\n font-weight: var(--weight-medium); color: var(--text-muted);\n}\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-kbd-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-kbd-css\";\n s.textContent = AX_KBD_CSS;\n document.head.appendChild(s);\n}\n\nexport function Kbd({ children, className = \"\", ...rest }) {\n return <kbd className={[\"ax-kbd\", className].filter(Boolean).join(\" \")} {...rest}>{children}</kbd>;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAanB,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,IAAI,EAAE,UAAU,YAAY,IAAI,GAAG,QAAQ;AACzD,SAAO,oBAAC,OAAA,EAAI,WAAW,CAAC,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAAO,UAAS;AAC9F;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page navigation with truncation (… ) for large ranges.
|
|
3
|
+
*/
|
|
4
|
+
export interface PaginationProps {
|
|
5
|
+
/** Current page (1-indexed). */
|
|
6
|
+
page: number;
|
|
7
|
+
/** Total page count. */
|
|
8
|
+
total: number;
|
|
9
|
+
onChange?: (page: number) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function Pagination(props: PaginationProps): JSX.Element;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_PAGINATION_CSS = `
|
|
4
|
+
.ax-pagination { display: flex; align-items: center; gap: 4px; }
|
|
5
|
+
.ax-pagination__btn {
|
|
6
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
7
|
+
min-width: 32px; height: 32px; padding: 0 8px; cursor: pointer;
|
|
8
|
+
background: transparent; color: var(--text-muted);
|
|
9
|
+
border: 1px solid var(--border-default); border-radius: var(--radius-2);
|
|
10
|
+
font-family: var(--font-mono); font-size: var(--text-sm);
|
|
11
|
+
transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);
|
|
12
|
+
}
|
|
13
|
+
.ax-pagination__btn:hover:not(:disabled) { background: var(--surface-raised); color: var(--text-body); border-color: var(--border-strong); }
|
|
14
|
+
.ax-pagination__btn:focus-visible { outline: none; box-shadow: var(--ring); }
|
|
15
|
+
.ax-pagination__btn:disabled { opacity: 0.35; cursor: not-allowed; }
|
|
16
|
+
.ax-pagination__btn--active { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
|
|
17
|
+
.ax-pagination__ellipsis { min-width: 24px; text-align: center; color: var(--text-faint); font-family: var(--font-mono); font-size: var(--text-sm); }
|
|
18
|
+
`;
|
|
19
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-pagination-css")) {
|
|
20
|
+
const s = document.createElement("style");
|
|
21
|
+
s.id = "ax-pagination-css";
|
|
22
|
+
s.textContent = AX_PAGINATION_CSS;
|
|
23
|
+
document.head.appendChild(s);
|
|
24
|
+
}
|
|
25
|
+
function range(start, end) {
|
|
26
|
+
const out = [];
|
|
27
|
+
for (let i = start; i <= end; i++) out.push(i);
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
function Pagination({ page = 1, total = 1, onChange, className = "", ...rest }) {
|
|
31
|
+
let pages;
|
|
32
|
+
if (total <= 7) {
|
|
33
|
+
pages = range(1, total);
|
|
34
|
+
} else if (page <= 4) {
|
|
35
|
+
pages = [...range(1, 5), "…", total];
|
|
36
|
+
} else if (page >= total - 3) {
|
|
37
|
+
pages = [1, "…", ...range(total - 4, total)];
|
|
38
|
+
} else {
|
|
39
|
+
pages = [1, "…", page - 1, page, page + 1, "…", total];
|
|
40
|
+
}
|
|
41
|
+
const go = (p) => {
|
|
42
|
+
if (p >= 1 && p <= total && p !== page && onChange) onChange(p);
|
|
43
|
+
};
|
|
44
|
+
return /* @__PURE__ */ jsxs("nav", { className: ["ax-pagination", className].filter(Boolean).join(" "), "aria-label": "Pagination", ...rest, children: [
|
|
45
|
+
/* @__PURE__ */ jsx("button", { className: "ax-pagination__btn", disabled: page <= 1, onClick: () => go(page - 1), "aria-label": "Previous", children: "‹" }),
|
|
46
|
+
pages.map(
|
|
47
|
+
(p, i) => p === "…" ? /* @__PURE__ */ jsx("span", { className: "ax-pagination__ellipsis", children: "…" }, "e" + i) : /* @__PURE__ */ jsx("button", { className: "ax-pagination__btn" + (p === page ? " ax-pagination__btn--active" : ""), onClick: () => go(p), "aria-current": p === page ? "page" : void 0, children: p }, p)
|
|
48
|
+
),
|
|
49
|
+
/* @__PURE__ */ jsx("button", { className: "ax-pagination__btn", disabled: page >= total, onClick: () => go(page + 1), "aria-label": "Next", children: "›" })
|
|
50
|
+
] });
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
Pagination
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../../src/components/display/Pagination.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_PAGINATION_CSS = `\n.ax-pagination { display: flex; align-items: center; gap: 4px; }\n.ax-pagination__btn {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 32px; height: 32px; padding: 0 8px; cursor: pointer;\n background: transparent; color: var(--text-muted);\n border: 1px solid var(--border-default); border-radius: var(--radius-2);\n font-family: var(--font-mono); font-size: var(--text-sm);\n transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);\n}\n.ax-pagination__btn:hover:not(:disabled) { background: var(--surface-raised); color: var(--text-body); border-color: var(--border-strong); }\n.ax-pagination__btn:focus-visible { outline: none; box-shadow: var(--ring); }\n.ax-pagination__btn:disabled { opacity: 0.35; cursor: not-allowed; }\n.ax-pagination__btn--active { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }\n.ax-pagination__ellipsis { min-width: 24px; text-align: center; color: var(--text-faint); font-family: var(--font-mono); font-size: var(--text-sm); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-pagination-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-pagination-css\";\n s.textContent = AX_PAGINATION_CSS;\n document.head.appendChild(s);\n}\n\nfunction range(start, end) {\n const out = [];\n for (let i = start; i <= end; i++) out.push(i);\n return out;\n}\n\nexport function Pagination({ page = 1, total = 1, onChange, className = \"\", ...rest }) {\n let pages;\n if (total <= 7) {\n pages = range(1, total);\n } else if (page <= 4) {\n pages = [...range(1, 5), \"…\", total];\n } else if (page >= total - 3) {\n pages = [1, \"…\", ...range(total - 4, total)];\n } else {\n pages = [1, \"…\", page - 1, page, page + 1, \"…\", total];\n }\n const go = (p) => { if (p >= 1 && p <= total && p !== page && onChange) onChange(p); };\n return (\n <nav className={[\"ax-pagination\", className].filter(Boolean).join(\" \")} aria-label=\"Pagination\" {...rest}>\n <button className=\"ax-pagination__btn\" disabled={page <= 1} onClick={() => go(page - 1)} aria-label=\"Previous\">‹</button>\n {pages.map((p, i) => p === \"…\"\n ? <span key={\"e\" + i} className=\"ax-pagination__ellipsis\">…</span>\n : <button key={p} className={\"ax-pagination__btn\" + (p === page ? \" ax-pagination__btn--active\" : \"\")} onClick={() => go(p)} aria-current={p === page ? \"page\" : undefined}>{p}</button>\n )}\n <button className=\"ax-pagination__btn\" disabled={page >= total} onClick={() => go(page + 1)} aria-label=\"Next\">›</button>\n </nav>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB1B,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,SAAS,MAAM,OAAO,KAAK;AACzB,QAAM,MAAM,CAAA;AACZ,WAAS,IAAI,OAAO,KAAK,KAAK,IAAK,KAAI,KAAK,CAAC;AAC7C,SAAO;AACT;AAEO,SAAS,WAAW,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,YAAY,IAAI,GAAG,QAAQ;AACrF,MAAI;AACJ,MAAI,SAAS,GAAG;AACd,YAAQ,MAAM,GAAG,KAAK;AAAA,EACxB,WAAW,QAAQ,GAAG;AACpB,YAAQ,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK,KAAK;AAAA,EACrC,WAAW,QAAQ,QAAQ,GAAG;AAC5B,YAAQ,CAAC,GAAG,KAAK,GAAG,MAAM,QAAQ,GAAG,KAAK,CAAC;AAAA,EAC7C,OAAO;AACL,YAAQ,CAAC,GAAG,KAAK,OAAO,GAAG,MAAM,OAAO,GAAG,KAAK,KAAK;AAAA,EACvD;AACA,QAAM,KAAK,CAAC,MAAM;AAAE,QAAI,KAAK,KAAK,KAAK,SAAS,MAAM,QAAQ,mBAAmB,CAAC;AAAA,EAAG;AACrF,8BACG,OAAA,EAAI,WAAW,CAAC,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,cAAW,cAAc,GAAG,MAClG,UAAA;AAAA,IAAA,oBAAC,UAAA,EAAO,WAAU,sBAAqB,UAAU,QAAQ,GAAG,SAAS,MAAM,GAAG,OAAO,CAAC,GAAG,cAAW,YAAW,UAAA,KAAC;AAAA,IAC/G,MAAM;AAAA,MAAI,CAAC,GAAG,MAAM,MAAM,MACvB,oBAAC,QAAA,EAAmB,WAAU,2BAA0B,UAAA,IAAA,GAA7C,MAAM,CAAwC,wBACxD,UAAA,EAAe,WAAW,wBAAwB,MAAM,OAAO,gCAAgC,KAAK,SAAS,MAAM,GAAG,CAAC,GAAG,gBAAc,MAAM,OAAO,SAAS,QAAY,eAA9J,CAAgK;AAAA,IAAA;AAAA,IAEjL,oBAAC,UAAA,EAAO,WAAU,sBAAqB,UAAU,QAAQ,OAAO,SAAS,MAAM,GAAG,OAAO,CAAC,GAAG,cAAW,QAAO,UAAA,IAAA,CAAC;AAAA,EAAA,GAClH;AAEJ;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Determinate or indeterminate progress bar.
|
|
3
|
+
*/
|
|
4
|
+
export interface ProgressProps {
|
|
5
|
+
value?: number;
|
|
6
|
+
max?: number;
|
|
7
|
+
/** Mono uppercase label above the track. */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Show the percent readout. @default false */
|
|
10
|
+
showValue?: boolean;
|
|
11
|
+
/** Ignore value; show a looping sweep. @default false */
|
|
12
|
+
indeterminate?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function Progress(props: ProgressProps): JSX.Element;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_PROGRESS_CSS = `
|
|
4
|
+
.ax-progress { display: flex; flex-direction: column; gap: 6px; }
|
|
5
|
+
.ax-progress__top { display: flex; align-items: baseline; justify-content: space-between; }
|
|
6
|
+
.ax-progress__val { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-muted); }
|
|
7
|
+
.ax-progress__track {
|
|
8
|
+
height: 6px; width: 100%; background: var(--surface-raised);
|
|
9
|
+
border: 1px solid var(--border-default); border-radius: var(--radius-1); overflow: hidden;
|
|
10
|
+
}
|
|
11
|
+
.ax-progress__bar {
|
|
12
|
+
height: 100%; background: var(--accent); border-radius: 1px;
|
|
13
|
+
transition: width var(--dur-3) var(--ease-out);
|
|
14
|
+
}
|
|
15
|
+
.ax-progress--indeterminate .ax-progress__bar {
|
|
16
|
+
width: 35% !important; animation: ax-prog-slide 1.3s var(--ease-out) infinite;
|
|
17
|
+
}
|
|
18
|
+
@keyframes ax-prog-slide { 0% { margin-left: -35%; } 100% { margin-left: 100%; } }
|
|
19
|
+
@media (prefers-reduced-motion: reduce) { .ax-progress--indeterminate .ax-progress__bar { animation-duration: 3s; } }
|
|
20
|
+
`;
|
|
21
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-progress-css")) {
|
|
22
|
+
const s = document.createElement("style");
|
|
23
|
+
s.id = "ax-progress-css";
|
|
24
|
+
s.textContent = AX_PROGRESS_CSS;
|
|
25
|
+
document.head.appendChild(s);
|
|
26
|
+
}
|
|
27
|
+
function Progress({ value = 0, max = 100, label, showValue = false, indeterminate = false, className = "", ...rest }) {
|
|
28
|
+
const pct = Math.max(0, Math.min(100, value / max * 100));
|
|
29
|
+
return /* @__PURE__ */ jsxs("div", { className: ["ax-progress", indeterminate ? "ax-progress--indeterminate" : "", className].filter(Boolean).join(" "), ...rest, children: [
|
|
30
|
+
label != null || showValue ? /* @__PURE__ */ jsxs("div", { className: "ax-progress__top", children: [
|
|
31
|
+
label != null ? /* @__PURE__ */ jsx("span", { className: "ax-label", children: label }) : /* @__PURE__ */ jsx("span", {}),
|
|
32
|
+
showValue && !indeterminate ? /* @__PURE__ */ jsxs("span", { className: "ax-progress__val", children: [
|
|
33
|
+
Math.round(pct),
|
|
34
|
+
"%"
|
|
35
|
+
] }) : null
|
|
36
|
+
] }) : null,
|
|
37
|
+
/* @__PURE__ */ jsx("div", { className: "ax-progress__track", role: "progressbar", "aria-valuenow": indeterminate ? void 0 : value, "aria-valuemax": max, children: /* @__PURE__ */ jsx("div", { className: "ax-progress__bar", style: { width: pct + "%" } }) })
|
|
38
|
+
] });
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
Progress
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=Progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Progress.js","sources":["../../../src/components/display/Progress.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_PROGRESS_CSS = `\n.ax-progress { display: flex; flex-direction: column; gap: 6px; }\n.ax-progress__top { display: flex; align-items: baseline; justify-content: space-between; }\n.ax-progress__val { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-muted); }\n.ax-progress__track {\n height: 6px; width: 100%; background: var(--surface-raised);\n border: 1px solid var(--border-default); border-radius: var(--radius-1); overflow: hidden;\n}\n.ax-progress__bar {\n height: 100%; background: var(--accent); border-radius: 1px;\n transition: width var(--dur-3) var(--ease-out);\n}\n.ax-progress--indeterminate .ax-progress__bar {\n width: 35% !important; animation: ax-prog-slide 1.3s var(--ease-out) infinite;\n}\n@keyframes ax-prog-slide { 0% { margin-left: -35%; } 100% { margin-left: 100%; } }\n@media (prefers-reduced-motion: reduce) { .ax-progress--indeterminate .ax-progress__bar { animation-duration: 3s; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-progress-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-progress-css\";\n s.textContent = AX_PROGRESS_CSS;\n document.head.appendChild(s);\n}\n\nexport function Progress({ value = 0, max = 100, label, showValue = false, indeterminate = false, className = \"\", ...rest }) {\n const pct = Math.max(0, Math.min(100, (value / max) * 100));\n return (\n <div className={[\"ax-progress\", indeterminate ? \"ax-progress--indeterminate\" : \"\", className].filter(Boolean).join(\" \")} {...rest}>\n {(label != null || showValue) ? (\n <div className=\"ax-progress__top\">\n {label != null ? <span className=\"ax-label\">{label}</span> : <span></span>}\n {showValue && !indeterminate ? <span className=\"ax-progress__val\">{Math.round(pct)}%</span> : null}\n </div>\n ) : null}\n <div className=\"ax-progress__track\" role=\"progressbar\" aria-valuenow={indeterminate ? undefined : value} aria-valuemax={max}>\n <div className=\"ax-progress__bar\" style={{ width: pct + \"%\" }}></div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBxB,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,QAAQ,GAAG,MAAM,KAAK,OAAO,YAAY,OAAO,gBAAgB,OAAO,YAAY,IAAI,GAAG,QAAQ;AAC3H,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM,QAAQ,MAAO,GAAG,CAAC;AAC1D,8BACG,OAAA,EAAI,WAAW,CAAC,eAAe,gBAAgB,+BAA+B,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACzH,UAAA;AAAA,IAAA,SAAS,QAAQ,YACjB,qBAAC,OAAA,EAAI,WAAU,oBACZ,UAAA;AAAA,MAAA,SAAS,2BAAQ,QAAA,EAAK,WAAU,YAAY,UAAA,MAAA,CAAM,wBAAW,QAAA,CAAA,CAAK;AAAA,MAClE,aAAa,CAAC,gBAAgB,qBAAC,QAAA,EAAK,WAAU,oBAAoB,UAAA;AAAA,QAAA,KAAK,MAAM,GAAG;AAAA,QAAE;AAAA,MAAA,EAAA,CAAC,IAAU;AAAA,IAAA,EAAA,CAChG,IACE;AAAA,IACJ,oBAAC,SAAI,WAAU,sBAAqB,MAAK,eAAc,iBAAe,gBAAgB,SAAY,OAAO,iBAAe,KACtH,UAAA,oBAAC,OAAA,EAAI,WAAU,oBAAmB,OAAO,EAAE,OAAO,MAAM,IAAA,EAAI,CAAG,EAAA,CACjE;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hairline divider — horizontal, vertical, or with a centered mono label.
|
|
3
|
+
*/
|
|
4
|
+
export interface SeparatorProps {
|
|
5
|
+
/** @default "horizontal" */
|
|
6
|
+
orientation?: "horizontal" | "vertical";
|
|
7
|
+
/** Centered mono uppercase label (forces horizontal). */
|
|
8
|
+
label?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function Separator(props: SeparatorProps): JSX.Element;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_SEPARATOR_CSS = `
|
|
4
|
+
.ax-sep { border: none; background: var(--border-default); flex: none; }
|
|
5
|
+
.ax-sep--h { width: 100%; height: 1px; margin: var(--space-4) 0; }
|
|
6
|
+
.ax-sep--v { width: 1px; align-self: stretch; min-height: 1em; margin: 0 var(--space-4); }
|
|
7
|
+
.ax-sep--label {
|
|
8
|
+
display: flex; align-items: center; gap: 12px; width: 100%; margin: var(--space-4) 0;
|
|
9
|
+
background: none; height: auto;
|
|
10
|
+
}
|
|
11
|
+
.ax-sep--label::before, .ax-sep--label::after { content: ""; flex: 1; height: 1px; background: var(--border-default); }
|
|
12
|
+
.ax-sep__text {
|
|
13
|
+
font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label);
|
|
14
|
+
text-transform: uppercase; color: var(--text-faint); white-space: nowrap;
|
|
15
|
+
}
|
|
16
|
+
`;
|
|
17
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-separator-css")) {
|
|
18
|
+
const s = document.createElement("style");
|
|
19
|
+
s.id = "ax-separator-css";
|
|
20
|
+
s.textContent = AX_SEPARATOR_CSS;
|
|
21
|
+
document.head.appendChild(s);
|
|
22
|
+
}
|
|
23
|
+
function Separator({ orientation = "horizontal", label, className = "", ...rest }) {
|
|
24
|
+
if (label) {
|
|
25
|
+
return /* @__PURE__ */ jsx("div", { className: ["ax-sep--label", className].filter(Boolean).join(" "), role: "separator", ...rest, children: /* @__PURE__ */ jsx("span", { className: "ax-sep__text", children: label }) });
|
|
26
|
+
}
|
|
27
|
+
const cls = ["ax-sep", orientation === "vertical" ? "ax-sep--v" : "ax-sep--h", className].filter(Boolean).join(" ");
|
|
28
|
+
return /* @__PURE__ */ jsx("hr", { className: cls, role: "separator", "aria-orientation": orientation, ...rest });
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
Separator
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=Separator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Separator.js","sources":["../../../src/components/display/Separator.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_SEPARATOR_CSS = `\n.ax-sep { border: none; background: var(--border-default); flex: none; }\n.ax-sep--h { width: 100%; height: 1px; margin: var(--space-4) 0; }\n.ax-sep--v { width: 1px; align-self: stretch; min-height: 1em; margin: 0 var(--space-4); }\n.ax-sep--label {\n display: flex; align-items: center; gap: 12px; width: 100%; margin: var(--space-4) 0;\n background: none; height: auto;\n}\n.ax-sep--label::before, .ax-sep--label::after { content: \"\"; flex: 1; height: 1px; background: var(--border-default); }\n.ax-sep__text {\n font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label);\n text-transform: uppercase; color: var(--text-faint); white-space: nowrap;\n}\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-separator-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-separator-css\";\n s.textContent = AX_SEPARATOR_CSS;\n document.head.appendChild(s);\n}\n\nexport function Separator({ orientation = \"horizontal\", label, className = \"\", ...rest }) {\n if (label) {\n return (\n <div className={[\"ax-sep--label\", className].filter(Boolean).join(\" \")} role=\"separator\" {...rest}>\n <span className=\"ax-sep__text\">{label}</span>\n </div>\n );\n }\n const cls = [\"ax-sep\", orientation === \"vertical\" ? \"ax-sep--v\" : \"ax-sep--h\", className].filter(Boolean).join(\" \");\n return <hr className={cls} role=\"separator\" aria-orientation={orientation} {...rest} />;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAezB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,kBAAkB,GAAG;AACnF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,UAAU,EAAE,cAAc,cAAc,OAAO,YAAY,IAAI,GAAG,QAAQ;AACxF,MAAI,OAAO;AACT,WACE,oBAAC,SAAI,WAAW,CAAC,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,MAAK,aAAa,GAAG,MAC3F,8BAAC,QAAA,EAAK,WAAU,gBAAgB,UAAA,MAAA,CAAM,EAAA,CACxC;AAAA,EAEJ;AACA,QAAM,MAAM,CAAC,UAAU,gBAAgB,aAAa,cAAc,aAAa,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAClH,SAAO,oBAAC,QAAG,WAAW,KAAK,MAAK,aAAY,oBAAkB,aAAc,GAAG,KAAA,CAAM;AACvF;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shimmering loading placeholder.
|
|
3
|
+
*/
|
|
4
|
+
export interface SkeletonProps {
|
|
5
|
+
/** @default "block" */
|
|
6
|
+
variant?: "block" | "text" | "circle";
|
|
7
|
+
width?: string | number;
|
|
8
|
+
height?: string | number;
|
|
9
|
+
/** For variant="text": render N stacked lines (last is shorter). @default 1 */
|
|
10
|
+
lines?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function Skeleton(props: SkeletonProps): JSX.Element;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_SKELETON_CSS = `
|
|
4
|
+
.ax-skeleton {
|
|
5
|
+
display: block; background: var(--surface-raised);
|
|
6
|
+
border-radius: var(--radius-1); position: relative; overflow: hidden;
|
|
7
|
+
}
|
|
8
|
+
.ax-skeleton::after {
|
|
9
|
+
content: ""; position: absolute; inset: 0;
|
|
10
|
+
background: linear-gradient(90deg, transparent, var(--bg-3), transparent);
|
|
11
|
+
transform: translateX(-100%);
|
|
12
|
+
animation: ax-shimmer 1.4s var(--ease-out) infinite;
|
|
13
|
+
}
|
|
14
|
+
[data-theme="light"] .ax-skeleton::after { background: linear-gradient(90deg, transparent, rgba(255,255,255,0.6), transparent); }
|
|
15
|
+
.ax-skeleton--text { height: 0.7em; margin: 0.2em 0; }
|
|
16
|
+
.ax-skeleton--circle { border-radius: var(--radius-2); }
|
|
17
|
+
@keyframes ax-shimmer { 100% { transform: translateX(100%); } }
|
|
18
|
+
@media (prefers-reduced-motion: reduce) { .ax-skeleton::after { animation: none; } }
|
|
19
|
+
`;
|
|
20
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-skeleton-css")) {
|
|
21
|
+
const s = document.createElement("style");
|
|
22
|
+
s.id = "ax-skeleton-css";
|
|
23
|
+
s.textContent = AX_SKELETON_CSS;
|
|
24
|
+
document.head.appendChild(s);
|
|
25
|
+
}
|
|
26
|
+
function Skeleton({ variant = "block", width, height, lines = 1, className = "", style = {}, ...rest }) {
|
|
27
|
+
if (variant === "text" && lines > 1) {
|
|
28
|
+
return /* @__PURE__ */ jsx("div", { className, ...rest, children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx(
|
|
29
|
+
"span",
|
|
30
|
+
{
|
|
31
|
+
className: "ax-skeleton ax-skeleton--text",
|
|
32
|
+
style: { width: i === lines - 1 ? "60%" : "100%" }
|
|
33
|
+
},
|
|
34
|
+
i
|
|
35
|
+
)) });
|
|
36
|
+
}
|
|
37
|
+
const cls = ["ax-skeleton", variant === "text" ? "ax-skeleton--text" : "", variant === "circle" ? "ax-skeleton--circle" : "", className].filter(Boolean).join(" ");
|
|
38
|
+
return /* @__PURE__ */ jsx("span", { className: cls, style: { width, height, ...style }, ...rest });
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
Skeleton
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=Skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Skeleton.js","sources":["../../../src/components/display/Skeleton.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_SKELETON_CSS = `\n.ax-skeleton {\n display: block; background: var(--surface-raised);\n border-radius: var(--radius-1); position: relative; overflow: hidden;\n}\n.ax-skeleton::after {\n content: \"\"; position: absolute; inset: 0;\n background: linear-gradient(90deg, transparent, var(--bg-3), transparent);\n transform: translateX(-100%);\n animation: ax-shimmer 1.4s var(--ease-out) infinite;\n}\n[data-theme=\"light\"] .ax-skeleton::after { background: linear-gradient(90deg, transparent, rgba(255,255,255,0.6), transparent); }\n.ax-skeleton--text { height: 0.7em; margin: 0.2em 0; }\n.ax-skeleton--circle { border-radius: var(--radius-2); }\n@keyframes ax-shimmer { 100% { transform: translateX(100%); } }\n@media (prefers-reduced-motion: reduce) { .ax-skeleton::after { animation: none; } }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-skeleton-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-skeleton-css\";\n s.textContent = AX_SKELETON_CSS;\n document.head.appendChild(s);\n}\n\nexport function Skeleton({ variant = \"block\", width, height, lines = 1, className = \"\", style = {}, ...rest }) {\n if (variant === \"text\" && lines > 1) {\n return (\n <div className={className} {...rest}>\n {Array.from({ length: lines }).map((_, i) => (\n <span\n key={i}\n className=\"ax-skeleton ax-skeleton--text\"\n style={{ width: i === lines - 1 ? \"60%\" : \"100%\" }}\n ></span>\n ))}\n </div>\n );\n }\n const cls = [\"ax-skeleton\", variant === \"text\" ? \"ax-skeleton--text\" : \"\", variant === \"circle\" ? \"ax-skeleton--circle\" : \"\", className].filter(Boolean).join(\" \");\n return <span className={cls} style={{ width, height, ...style }} {...rest}></span>;\n}\n"],"names":[],"mappings":";;AAEA,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBxB,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,SAAS,OAAO,QAAQ,QAAQ,GAAG,YAAY,IAAI,QAAQ,CAAA,GAAI,GAAG,QAAQ;AAC7G,MAAI,YAAY,UAAU,QAAQ,GAAG;AACnC,WACE,oBAAC,OAAA,EAAI,WAAuB,GAAG,MAC5B,UAAA,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,IAAI,CAAC,GAAG,MACrC;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO,EAAE,OAAO,MAAM,QAAQ,IAAI,QAAQ,OAAA;AAAA,MAAO;AAAA,MAF5C;AAAA,IAAA,CAIR,GACH;AAAA,EAEJ;AACA,QAAM,MAAM,CAAC,eAAe,YAAY,SAAS,sBAAsB,IAAI,YAAY,WAAW,wBAAwB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACjK,SAAO,oBAAC,QAAA,EAAK,WAAW,KAAK,OAAO,EAAE,OAAO,QAAQ,GAAG,SAAU,GAAG,KAAA,CAAM;AAC7E;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data table inside a bordered, horizontally-scrollable frame. Mono headers.
|
|
3
|
+
*/
|
|
4
|
+
export interface TableColumn {
|
|
5
|
+
key: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
/** Right-align + mono the cells (use for figures). */
|
|
8
|
+
numeric?: boolean;
|
|
9
|
+
align?: "left" | "right";
|
|
10
|
+
/** Custom cell renderer: (value, row) => node. */
|
|
11
|
+
render?: (value: any, row: any) => React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export interface TableProps {
|
|
14
|
+
/** Strings or TableColumn objects. */
|
|
15
|
+
columns: Array<string | TableColumn>;
|
|
16
|
+
rows: Array<Record<string, any>>;
|
|
17
|
+
/** Row hover highlight. @default true */
|
|
18
|
+
hover?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function Table(props: TableProps): JSX.Element;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
const AX_TABLE_CSS = `
|
|
4
|
+
.ax-table-wrap { width: 100%; overflow-x: auto; border: 1px solid var(--border-default); border-radius: var(--radius-3); }
|
|
5
|
+
.ax-table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); }
|
|
6
|
+
.ax-table thead th {
|
|
7
|
+
text-align: left; padding: 10px 14px; background: var(--surface-card);
|
|
8
|
+
border-bottom: 1px solid var(--border-strong); white-space: nowrap;
|
|
9
|
+
font-family: var(--font-mono); font-size: var(--text-xs); font-weight: var(--weight-medium);
|
|
10
|
+
letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint);
|
|
11
|
+
}
|
|
12
|
+
.ax-table tbody td { padding: 11px 14px; border-bottom: 1px solid var(--border-default); color: var(--text-body); vertical-align: middle; }
|
|
13
|
+
.ax-table tbody tr:last-child td { border-bottom: none; }
|
|
14
|
+
.ax-table tbody tr { transition: background var(--dur-1) var(--ease-out); }
|
|
15
|
+
.ax-table--hover tbody tr:hover { background: var(--surface-raised); }
|
|
16
|
+
.ax-table__num { font-family: var(--font-mono); text-align: right; color: var(--text-muted); }
|
|
17
|
+
.ax-table__align-right { text-align: right; }
|
|
18
|
+
`;
|
|
19
|
+
if (typeof document !== "undefined" && !document.getElementById("ax-table-css")) {
|
|
20
|
+
const s = document.createElement("style");
|
|
21
|
+
s.id = "ax-table-css";
|
|
22
|
+
s.textContent = AX_TABLE_CSS;
|
|
23
|
+
document.head.appendChild(s);
|
|
24
|
+
}
|
|
25
|
+
function Table({ columns = [], rows = [], hover = true, className = "", ...rest }) {
|
|
26
|
+
return /* @__PURE__ */ jsx("div", { className: "ax-table-wrap", children: /* @__PURE__ */ jsxs("table", { className: ["ax-table", hover ? "ax-table--hover" : "", className].filter(Boolean).join(" "), ...rest, children: [
|
|
27
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: columns.map((c) => {
|
|
28
|
+
const col = typeof c === "string" ? { key: c, label: c } : c;
|
|
29
|
+
return /* @__PURE__ */ jsx("th", { className: col.align === "right" ? "ax-table__align-right" : "", children: col.label }, col.key);
|
|
30
|
+
}) }) }),
|
|
31
|
+
/* @__PURE__ */ jsx("tbody", { children: rows.map((row, ri) => /* @__PURE__ */ jsx("tr", { children: columns.map((c) => {
|
|
32
|
+
const col = typeof c === "string" ? { key: c } : c;
|
|
33
|
+
const val = row[col.key];
|
|
34
|
+
const cls = col.numeric ? "ax-table__num" : col.align === "right" ? "ax-table__align-right" : "";
|
|
35
|
+
return /* @__PURE__ */ jsx("td", { className: cls, children: col.render ? col.render(val, row) : val }, col.key);
|
|
36
|
+
}) }, ri)) })
|
|
37
|
+
] }) });
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
Table
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=Table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Table.js","sources":["../../../src/components/display/Table.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_TABLE_CSS = `\n.ax-table-wrap { width: 100%; overflow-x: auto; border: 1px solid var(--border-default); border-radius: var(--radius-3); }\n.ax-table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); }\n.ax-table thead th {\n text-align: left; padding: 10px 14px; background: var(--surface-card);\n border-bottom: 1px solid var(--border-strong); white-space: nowrap;\n font-family: var(--font-mono); font-size: var(--text-xs); font-weight: var(--weight-medium);\n letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint);\n}\n.ax-table tbody td { padding: 11px 14px; border-bottom: 1px solid var(--border-default); color: var(--text-body); vertical-align: middle; }\n.ax-table tbody tr:last-child td { border-bottom: none; }\n.ax-table tbody tr { transition: background var(--dur-1) var(--ease-out); }\n.ax-table--hover tbody tr:hover { background: var(--surface-raised); }\n.ax-table__num { font-family: var(--font-mono); text-align: right; color: var(--text-muted); }\n.ax-table__align-right { text-align: right; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-table-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-table-css\";\n s.textContent = AX_TABLE_CSS;\n document.head.appendChild(s);\n}\n\nexport function Table({ columns = [], rows = [], hover = true, className = \"\", ...rest }) {\n return (\n <div className=\"ax-table-wrap\">\n <table className={[\"ax-table\", hover ? \"ax-table--hover\" : \"\", className].filter(Boolean).join(\" \")} {...rest}>\n <thead>\n <tr>\n {columns.map((c) => {\n const col = typeof c === \"string\" ? { key: c, label: c } : c;\n return <th key={col.key} className={col.align === \"right\" ? \"ax-table__align-right\" : \"\"}>{col.label}</th>;\n })}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, ri) => (\n <tr key={ri}>\n {columns.map((c) => {\n const col = typeof c === \"string\" ? { key: c } : c;\n const val = row[col.key];\n const cls = col.numeric ? \"ax-table__num\" : col.align === \"right\" ? \"ax-table__align-right\" : \"\";\n return <td key={col.key} className={cls}>{col.render ? col.render(val, row) : val}</td>;\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBrB,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,CAAA,GAAI,OAAO,CAAA,GAAI,QAAQ,MAAM,YAAY,IAAI,GAAG,QAAQ;AACxF,SACE,oBAAC,SAAI,WAAU,iBACb,+BAAC,SAAA,EAAM,WAAW,CAAC,YAAY,QAAQ,oBAAoB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACvG,UAAA;AAAA,IAAA,oBAAC,WACC,UAAA,oBAAC,MAAA,EACE,UAAA,QAAQ,IAAI,CAAC,MAAM;AAClB,YAAM,MAAM,OAAO,MAAM,WAAW,EAAE,KAAK,GAAG,OAAO,EAAA,IAAM;AAC3D,aAAO,oBAAC,MAAA,EAAiB,WAAW,IAAI,UAAU,UAAU,0BAA0B,IAAK,UAAA,IAAI,MAAA,GAA/E,IAAI,GAAiF;AAAA,IACvG,CAAC,GACH,GACF;AAAA,IACA,oBAAC,SAAA,EACE,UAAA,KAAK,IAAI,CAAC,KAAK,OACd,oBAAC,MAAA,EACE,UAAA,QAAQ,IAAI,CAAC,MAAM;AAClB,YAAM,MAAM,OAAO,MAAM,WAAW,EAAE,KAAK,MAAM;AACjD,YAAM,MAAM,IAAI,IAAI,GAAG;AACvB,YAAM,MAAM,IAAI,UAAU,kBAAkB,IAAI,UAAU,UAAU,0BAA0B;AAC9F,aAAO,oBAAC,MAAA,EAAiB,WAAW,KAAM,UAAA,IAAI,SAAS,IAAI,OAAO,KAAK,GAAG,IAAI,IAAA,GAA9D,IAAI,GAA8D;AAAA,IACpF,CAAC,EAAA,GANM,EAOT,CACD,EAAA,CACH;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Underline tabs on a hairline rule. Optional mono count per tab.
|
|
3
|
+
*/
|
|
4
|
+
export interface TabsProps {
|
|
5
|
+
/** Strings or { id, label, count? } objects. */
|
|
6
|
+
items: Array<string | { id: string; label: string; count?: number }>;
|
|
7
|
+
/** id of the active tab. */
|
|
8
|
+
active: string;
|
|
9
|
+
onChange?: (id: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function Tabs(props: TabsProps): JSX.Element;
|