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