@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.
Files changed (294) hide show
  1. package/DESIGN.md +112 -0
  2. package/README.md +81 -0
  3. package/dist/assets/logo/agentaily-mark-black.svg +5 -0
  4. package/dist/assets/logo/agentaily-mark-white.svg +5 -0
  5. package/dist/components/ai/Attachments.d.ts +23 -0
  6. package/dist/components/ai/Attachments.js +96 -0
  7. package/dist/components/ai/Attachments.js.map +1 -0
  8. package/dist/components/ai/Checkpoint.d.ts +3 -0
  9. package/dist/components/ai/Checkpoint.js +38 -0
  10. package/dist/components/ai/Checkpoint.js.map +1 -0
  11. package/dist/components/ai/Confirmation.d.ts +3 -0
  12. package/dist/components/ai/Confirmation.js +54 -0
  13. package/dist/components/ai/Confirmation.js.map +1 -0
  14. package/dist/components/ai/Context.d.ts +3 -0
  15. package/dist/components/ai/Context.js +63 -0
  16. package/dist/components/ai/Context.js.map +1 -0
  17. package/dist/components/ai/Conversation.d.ts +3 -0
  18. package/dist/components/ai/Conversation.js +53 -0
  19. package/dist/components/ai/Conversation.js.map +1 -0
  20. package/dist/components/ai/ModelSelector.d.ts +19 -0
  21. package/dist/components/ai/ModelSelector.js +92 -0
  22. package/dist/components/ai/ModelSelector.js.map +1 -0
  23. package/dist/components/ai/Plan.d.ts +4 -0
  24. package/dist/components/ai/Plan.js +49 -0
  25. package/dist/components/ai/Plan.js.map +1 -0
  26. package/dist/components/ai/Queue.d.ts +4 -0
  27. package/dist/components/ai/Queue.js +45 -0
  28. package/dist/components/ai/Queue.js.map +1 -0
  29. package/dist/components/ai/Reasoning.d.ts +17 -0
  30. package/dist/components/ai/Reasoning.js +60 -0
  31. package/dist/components/ai/Reasoning.js.map +1 -0
  32. package/dist/components/ai/Shimmer.d.ts +10 -0
  33. package/dist/components/ai/Shimmer.js +28 -0
  34. package/dist/components/ai/Shimmer.js.map +1 -0
  35. package/dist/components/ai/Sources.d.ts +23 -0
  36. package/dist/components/ai/Sources.js +65 -0
  37. package/dist/components/ai/Sources.js.map +1 -0
  38. package/dist/components/ai/Suggestion.d.ts +19 -0
  39. package/dist/components/ai/Suggestion.js +40 -0
  40. package/dist/components/ai/Suggestion.js.map +1 -0
  41. package/dist/components/ai/Task.d.ts +4 -0
  42. package/dist/components/ai/Task.js +48 -0
  43. package/dist/components/ai/Task.js.map +1 -0
  44. package/dist/components/ai/ToolCall.d.ts +16 -0
  45. package/dist/components/ai/ToolCall.js +70 -0
  46. package/dist/components/ai/ToolCall.js.map +1 -0
  47. package/dist/components/buttons/Button.d.ts +17 -0
  48. package/dist/components/buttons/Button.js +60 -0
  49. package/dist/components/buttons/Button.js.map +1 -0
  50. package/dist/components/buttons/ButtonGroup.d.ts +3 -0
  51. package/dist/components/buttons/ButtonGroup.js +27 -0
  52. package/dist/components/buttons/ButtonGroup.js.map +1 -0
  53. package/dist/components/buttons/IconButton.d.ts +16 -0
  54. package/dist/components/buttons/IconButton.js +49 -0
  55. package/dist/components/buttons/IconButton.js.map +1 -0
  56. package/dist/components/chat/CodeBlock.d.ts +9 -0
  57. package/dist/components/chat/CodeBlock.js +62 -0
  58. package/dist/components/chat/CodeBlock.js.map +1 -0
  59. package/dist/components/chat/Composer.d.ts +17 -0
  60. package/dist/components/chat/Composer.js +123 -0
  61. package/dist/components/chat/Composer.js.map +1 -0
  62. package/dist/components/chat/Message.d.ts +16 -0
  63. package/dist/components/chat/Message.js +63 -0
  64. package/dist/components/chat/Message.js.map +1 -0
  65. package/dist/components/code/Agent.d.ts +3 -0
  66. package/dist/components/code/Agent.js +44 -0
  67. package/dist/components/code/Agent.js.map +1 -0
  68. package/dist/components/code/Artifact.d.ts +3 -0
  69. package/dist/components/code/Artifact.js +50 -0
  70. package/dist/components/code/Artifact.js.map +1 -0
  71. package/dist/components/code/Commit.d.ts +3 -0
  72. package/dist/components/code/Commit.js +55 -0
  73. package/dist/components/code/Commit.js.map +1 -0
  74. package/dist/components/code/EnvironmentVariables.d.ts +4 -0
  75. package/dist/components/code/EnvironmentVariables.js +49 -0
  76. package/dist/components/code/EnvironmentVariables.js.map +1 -0
  77. package/dist/components/code/FileTree.d.ts +4 -0
  78. package/dist/components/code/FileTree.js +59 -0
  79. package/dist/components/code/FileTree.js.map +1 -0
  80. package/dist/components/code/JSXPreview.d.ts +3 -0
  81. package/dist/components/code/JSXPreview.js +35 -0
  82. package/dist/components/code/JSXPreview.js.map +1 -0
  83. package/dist/components/code/PackageInfo.d.ts +3 -0
  84. package/dist/components/code/PackageInfo.js +47 -0
  85. package/dist/components/code/PackageInfo.js.map +1 -0
  86. package/dist/components/code/Sandbox.d.ts +3 -0
  87. package/dist/components/code/Sandbox.js +43 -0
  88. package/dist/components/code/Sandbox.js.map +1 -0
  89. package/dist/components/code/SchemaDisplay.d.ts +4 -0
  90. package/dist/components/code/SchemaDisplay.js +43 -0
  91. package/dist/components/code/SchemaDisplay.js.map +1 -0
  92. package/dist/components/code/Snippet.d.ts +3 -0
  93. package/dist/components/code/Snippet.js +36 -0
  94. package/dist/components/code/Snippet.js.map +1 -0
  95. package/dist/components/code/StackTrace.d.ts +4 -0
  96. package/dist/components/code/StackTrace.js +46 -0
  97. package/dist/components/code/StackTrace.js.map +1 -0
  98. package/dist/components/code/Terminal.d.ts +4 -0
  99. package/dist/components/code/Terminal.js +73 -0
  100. package/dist/components/code/Terminal.js.map +1 -0
  101. package/dist/components/code/TestResults.d.ts +4 -0
  102. package/dist/components/code/TestResults.js +61 -0
  103. package/dist/components/code/TestResults.js.map +1 -0
  104. package/dist/components/code/WebPreview.d.ts +3 -0
  105. package/dist/components/code/WebPreview.js +48 -0
  106. package/dist/components/code/WebPreview.js.map +1 -0
  107. package/dist/components/display/Accordion.d.ts +12 -0
  108. package/dist/components/display/Accordion.js +60 -0
  109. package/dist/components/display/Accordion.js.map +1 -0
  110. package/dist/components/display/Avatar.d.ts +14 -0
  111. package/dist/components/display/Avatar.js +41 -0
  112. package/dist/components/display/Avatar.js.map +1 -0
  113. package/dist/components/display/Badge.d.ts +11 -0
  114. package/dist/components/display/Badge.js +40 -0
  115. package/dist/components/display/Badge.js.map +1 -0
  116. package/dist/components/display/Breadcrumb.d.ts +11 -0
  117. package/dist/components/display/Breadcrumb.js +32 -0
  118. package/dist/components/display/Breadcrumb.js.map +1 -0
  119. package/dist/components/display/Card.d.ts +14 -0
  120. package/dist/components/display/Card.js +61 -0
  121. package/dist/components/display/Card.js.map +1 -0
  122. package/dist/components/display/Carousel.d.ts +3 -0
  123. package/dist/components/display/Carousel.js +40 -0
  124. package/dist/components/display/Carousel.js.map +1 -0
  125. package/dist/components/display/Chart.d.ts +7 -0
  126. package/dist/components/display/Chart.js +68 -0
  127. package/dist/components/display/Chart.js.map +1 -0
  128. package/dist/components/display/Collapsible.d.ts +3 -0
  129. package/dist/components/display/Collapsible.js +36 -0
  130. package/dist/components/display/Collapsible.js.map +1 -0
  131. package/dist/components/display/DataTable.d.ts +4 -0
  132. package/dist/components/display/DataTable.js +72 -0
  133. package/dist/components/display/DataTable.js.map +1 -0
  134. package/dist/components/display/Empty.d.ts +14 -0
  135. package/dist/components/display/Empty.js +36 -0
  136. package/dist/components/display/Empty.js.map +1 -0
  137. package/dist/components/display/Item.d.ts +3 -0
  138. package/dist/components/display/Item.js +36 -0
  139. package/dist/components/display/Item.js.map +1 -0
  140. package/dist/components/display/Kbd.d.ts +7 -0
  141. package/dist/components/display/Kbd.js +27 -0
  142. package/dist/components/display/Kbd.js.map +1 -0
  143. package/dist/components/display/Pagination.d.ts +11 -0
  144. package/dist/components/display/Pagination.js +55 -0
  145. package/dist/components/display/Pagination.js.map +1 -0
  146. package/dist/components/display/Progress.d.ts +14 -0
  147. package/dist/components/display/Progress.js +43 -0
  148. package/dist/components/display/Progress.js.map +1 -0
  149. package/dist/components/display/Separator.d.ts +10 -0
  150. package/dist/components/display/Separator.js +33 -0
  151. package/dist/components/display/Separator.js.map +1 -0
  152. package/dist/components/display/Skeleton.d.ts +12 -0
  153. package/dist/components/display/Skeleton.js +43 -0
  154. package/dist/components/display/Skeleton.js.map +1 -0
  155. package/dist/components/display/Table.d.ts +20 -0
  156. package/dist/components/display/Table.js +42 -0
  157. package/dist/components/display/Table.js.map +1 -0
  158. package/dist/components/display/Tabs.d.ts +11 -0
  159. package/dist/components/display/Tabs.js +47 -0
  160. package/dist/components/display/Tabs.js.map +1 -0
  161. package/dist/components/display/Typography.d.ts +5 -0
  162. package/dist/components/display/Typography.js +45 -0
  163. package/dist/components/display/Typography.js.map +1 -0
  164. package/dist/components/feedback/Alert.d.ts +12 -0
  165. package/dist/components/feedback/Alert.js +41 -0
  166. package/dist/components/feedback/Alert.js.map +1 -0
  167. package/dist/components/feedback/Dialog.d.ts +17 -0
  168. package/dist/components/feedback/Dialog.js +90 -0
  169. package/dist/components/feedback/Dialog.js.map +1 -0
  170. package/dist/components/feedback/Spinner.d.ts +8 -0
  171. package/dist/components/feedback/Spinner.js +39 -0
  172. package/dist/components/feedback/Spinner.js.map +1 -0
  173. package/dist/components/feedback/Toast.d.ts +12 -0
  174. package/dist/components/feedback/Toast.js +50 -0
  175. package/dist/components/feedback/Toast.js.map +1 -0
  176. package/dist/components/feedback/Tooltip.d.ts +11 -0
  177. package/dist/components/feedback/Tooltip.js +34 -0
  178. package/dist/components/feedback/Tooltip.js.map +1 -0
  179. package/dist/components/inputs/Calendar.d.ts +3 -0
  180. package/dist/components/inputs/Calendar.js +81 -0
  181. package/dist/components/inputs/Calendar.js.map +1 -0
  182. package/dist/components/inputs/Checkbox.d.ts +10 -0
  183. package/dist/components/inputs/Checkbox.js +42 -0
  184. package/dist/components/inputs/Checkbox.js.map +1 -0
  185. package/dist/components/inputs/Combobox.d.ts +3 -0
  186. package/dist/components/inputs/Combobox.js +94 -0
  187. package/dist/components/inputs/Combobox.js.map +1 -0
  188. package/dist/components/inputs/DatePicker.d.ts +3 -0
  189. package/dist/components/inputs/DatePicker.js +56 -0
  190. package/dist/components/inputs/DatePicker.js.map +1 -0
  191. package/dist/components/inputs/Field.d.ts +5 -0
  192. package/dist/components/inputs/Field.js +44 -0
  193. package/dist/components/inputs/Field.js.map +1 -0
  194. package/dist/components/inputs/Input.d.ts +19 -0
  195. package/dist/components/inputs/Input.js +72 -0
  196. package/dist/components/inputs/Input.js.map +1 -0
  197. package/dist/components/inputs/InputGroup.d.ts +3 -0
  198. package/dist/components/inputs/InputGroup.js +32 -0
  199. package/dist/components/inputs/InputGroup.js.map +1 -0
  200. package/dist/components/inputs/InputOTP.d.ts +3 -0
  201. package/dist/components/inputs/InputOTP.js +49 -0
  202. package/dist/components/inputs/InputOTP.js.map +1 -0
  203. package/dist/components/inputs/Label.d.ts +13 -0
  204. package/dist/components/inputs/Label.js +33 -0
  205. package/dist/components/inputs/Label.js.map +1 -0
  206. package/dist/components/inputs/RadioGroup.d.ts +15 -0
  207. package/dist/components/inputs/RadioGroup.js +58 -0
  208. package/dist/components/inputs/RadioGroup.js.map +1 -0
  209. package/dist/components/inputs/Select.d.ts +12 -0
  210. package/dist/components/inputs/Select.js +49 -0
  211. package/dist/components/inputs/Select.js.map +1 -0
  212. package/dist/components/inputs/Slider.d.ts +16 -0
  213. package/dist/components/inputs/Slider.js +62 -0
  214. package/dist/components/inputs/Slider.js.map +1 -0
  215. package/dist/components/inputs/Switch.d.ts +11 -0
  216. package/dist/components/inputs/Switch.js +39 -0
  217. package/dist/components/inputs/Switch.js.map +1 -0
  218. package/dist/components/inputs/Textarea.d.ts +13 -0
  219. package/dist/components/inputs/Textarea.js +41 -0
  220. package/dist/components/inputs/Textarea.js.map +1 -0
  221. package/dist/components/inputs/Toggle.d.ts +19 -0
  222. package/dist/components/inputs/Toggle.js +57 -0
  223. package/dist/components/inputs/Toggle.js.map +1 -0
  224. package/dist/components/layout/AspectRatio.d.ts +3 -0
  225. package/dist/components/layout/AspectRatio.js +20 -0
  226. package/dist/components/layout/AspectRatio.js.map +1 -0
  227. package/dist/components/layout/Resizable.d.ts +3 -0
  228. package/dist/components/layout/Resizable.js +58 -0
  229. package/dist/components/layout/Resizable.js.map +1 -0
  230. package/dist/components/layout/ScrollArea.d.ts +3 -0
  231. package/dist/components/layout/ScrollArea.js +24 -0
  232. package/dist/components/layout/ScrollArea.js.map +1 -0
  233. package/dist/components/layout/Sidebar.d.ts +5 -0
  234. package/dist/components/layout/Sidebar.js +55 -0
  235. package/dist/components/layout/Sidebar.js.map +1 -0
  236. package/dist/components/overlay/AlertDialog.d.ts +3 -0
  237. package/dist/components/overlay/AlertDialog.js +51 -0
  238. package/dist/components/overlay/AlertDialog.js.map +1 -0
  239. package/dist/components/overlay/Command.d.ts +22 -0
  240. package/dist/components/overlay/Command.js +123 -0
  241. package/dist/components/overlay/Command.js.map +1 -0
  242. package/dist/components/overlay/ContextMenu.d.ts +4 -0
  243. package/dist/components/overlay/ContextMenu.js +66 -0
  244. package/dist/components/overlay/ContextMenu.js.map +1 -0
  245. package/dist/components/overlay/DropdownMenu.d.ts +20 -0
  246. package/dist/components/overlay/DropdownMenu.js +86 -0
  247. package/dist/components/overlay/DropdownMenu.js.map +1 -0
  248. package/dist/components/overlay/HoverCard.d.ts +3 -0
  249. package/dist/components/overlay/HoverCard.js +53 -0
  250. package/dist/components/overlay/HoverCard.js.map +1 -0
  251. package/dist/components/overlay/Menubar.d.ts +4 -0
  252. package/dist/components/overlay/Menubar.js +55 -0
  253. package/dist/components/overlay/Menubar.js.map +1 -0
  254. package/dist/components/overlay/NavigationMenu.d.ts +5 -0
  255. package/dist/components/overlay/NavigationMenu.js +42 -0
  256. package/dist/components/overlay/NavigationMenu.js.map +1 -0
  257. package/dist/components/overlay/Popover.d.ts +16 -0
  258. package/dist/components/overlay/Popover.js +53 -0
  259. package/dist/components/overlay/Popover.js.map +1 -0
  260. package/dist/components/overlay/Sheet.d.ts +13 -0
  261. package/dist/components/overlay/Sheet.js +49 -0
  262. package/dist/components/overlay/Sheet.js.map +1 -0
  263. package/dist/components/utilities/Image.d.ts +3 -0
  264. package/dist/components/utilities/Image.js +32 -0
  265. package/dist/components/utilities/Image.js.map +1 -0
  266. package/dist/components/utilities/OpenInChat.d.ts +3 -0
  267. package/dist/components/utilities/OpenInChat.js +26 -0
  268. package/dist/components/utilities/OpenInChat.js.map +1 -0
  269. package/dist/components/voice/AudioPlayer.d.ts +3 -0
  270. package/dist/components/voice/AudioPlayer.js +42 -0
  271. package/dist/components/voice/AudioPlayer.js.map +1 -0
  272. package/dist/components/voice/MicSelector.d.ts +3 -0
  273. package/dist/components/voice/MicSelector.js +36 -0
  274. package/dist/components/voice/MicSelector.js.map +1 -0
  275. package/dist/components/voice/Persona.d.ts +3 -0
  276. package/dist/components/voice/Persona.js +41 -0
  277. package/dist/components/voice/Persona.js.map +1 -0
  278. package/dist/components/voice/SpeechInput.d.ts +3 -0
  279. package/dist/components/voice/SpeechInput.js +42 -0
  280. package/dist/components/voice/SpeechInput.js.map +1 -0
  281. package/dist/components/voice/Transcription.d.ts +4 -0
  282. package/dist/components/voice/Transcription.js +48 -0
  283. package/dist/components/voice/Transcription.js.map +1 -0
  284. package/dist/components/voice/VoiceSelector.d.ts +3 -0
  285. package/dist/components/voice/VoiceSelector.js +58 -0
  286. package/dist/components/voice/VoiceSelector.js.map +1 -0
  287. package/dist/components/workflow/Flow.d.ts +20 -0
  288. package/dist/components/workflow/Flow.js +96 -0
  289. package/dist/components/workflow/Flow.js.map +1 -0
  290. package/dist/index.d.ts +120 -0
  291. package/dist/index.js +208 -0
  292. package/dist/index.js.map +1 -0
  293. package/dist/styles.css +217 -0
  294. 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,3 @@
1
+ /** Horizontal slide carousel with arrows and dot pagination. Each child is a slide. */
2
+ export interface CarouselProps { dots?: boolean; arrows?: boolean; children?: React.ReactNode; }
3
+ export declare function Carousel(props: CarouselProps): JSX.Element;
@@ -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,3 @@
1
+ /** Single expand/collapse disclosure with a chevron. */
2
+ export interface CollapsibleProps { label: React.ReactNode; defaultOpen?: boolean; children?: React.ReactNode; }
3
+ export declare function Collapsible(props: CollapsibleProps): JSX.Element;
@@ -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;