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