@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,47 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import "react";
3
+ const AX_TABS_CSS = `
4
+ .ax-tabs { display: flex; gap: var(--space-5); border-bottom: 1px solid var(--border-default); }
5
+ .ax-tabs__tab {
6
+ appearance: none; background: none; border: none; cursor: pointer;
7
+ padding: 0 2px 10px; margin-bottom: -1px; position: relative;
8
+ font-family: var(--font-body); font-size: var(--text-sm);
9
+ font-weight: var(--weight-medium); color: var(--text-faint);
10
+ border-bottom: 1px solid transparent;
11
+ transition: color var(--dur-1) var(--ease-out);
12
+ }
13
+ .ax-tabs__tab:hover { color: var(--text-muted); }
14
+ .ax-tabs__tab:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--radius-1); }
15
+ .ax-tabs__tab--active { color: var(--text-body); border-bottom-color: var(--text-body); }
16
+ .ax-tabs__count { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint); margin-left: 6px; }
17
+ `;
18
+ if (typeof document !== "undefined" && !document.getElementById("ax-tabs-css")) {
19
+ const s = document.createElement("style");
20
+ s.id = "ax-tabs-css";
21
+ s.textContent = AX_TABS_CSS;
22
+ document.head.appendChild(s);
23
+ }
24
+ function Tabs({ items = [], active, onChange, className = "", ...rest }) {
25
+ return /* @__PURE__ */ jsx("div", { role: "tablist", className: ["ax-tabs", className].filter(Boolean).join(" "), ...rest, children: items.map((item) => {
26
+ const it = typeof item === "string" ? { id: item, label: item } : item;
27
+ const isActive = it.id === active;
28
+ return /* @__PURE__ */ jsxs(
29
+ "button",
30
+ {
31
+ role: "tab",
32
+ "aria-selected": isActive,
33
+ className: "ax-tabs__tab" + (isActive ? " ax-tabs__tab--active" : ""),
34
+ onClick: () => onChange && onChange(it.id),
35
+ children: [
36
+ it.label,
37
+ it.count != null ? /* @__PURE__ */ jsx("span", { className: "ax-tabs__count", children: it.count }) : null
38
+ ]
39
+ },
40
+ it.id
41
+ );
42
+ }) });
43
+ }
44
+ export {
45
+ Tabs
46
+ };
47
+ //# sourceMappingURL=Tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.js","sources":["../../../src/components/display/Tabs.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_TABS_CSS = `\n.ax-tabs { display: flex; gap: var(--space-5); border-bottom: 1px solid var(--border-default); }\n.ax-tabs__tab {\n appearance: none; background: none; border: none; cursor: pointer;\n padding: 0 2px 10px; margin-bottom: -1px; position: relative;\n font-family: var(--font-body); font-size: var(--text-sm);\n font-weight: var(--weight-medium); color: var(--text-faint);\n border-bottom: 1px solid transparent;\n transition: color var(--dur-1) var(--ease-out);\n}\n.ax-tabs__tab:hover { color: var(--text-muted); }\n.ax-tabs__tab:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--radius-1); }\n.ax-tabs__tab--active { color: var(--text-body); border-bottom-color: var(--text-body); }\n.ax-tabs__count { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--text-faint); margin-left: 6px; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-tabs-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-tabs-css\";\n s.textContent = AX_TABS_CSS;\n document.head.appendChild(s);\n}\n\nexport function Tabs({ items = [], active, onChange, className = \"\", ...rest }) {\n return (\n <div role=\"tablist\" className={[\"ax-tabs\", className].filter(Boolean).join(\" \")} {...rest}>\n {items.map((item) => {\n const it = typeof item === \"string\" ? { id: item, label: item } : item;\n const isActive = it.id === active;\n return (\n <button\n key={it.id}\n role=\"tab\"\n aria-selected={isActive}\n className={\"ax-tabs__tab\" + (isActive ? \" ax-tabs__tab--active\" : \"\")}\n onClick={() => onChange && onChange(it.id)}\n >\n {it.label}\n {it.count != null ? <span className=\"ax-tabs__count\">{it.count}</span> : null}\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBpB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,aAAa,GAAG;AAC9E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,KAAK,EAAE,QAAQ,CAAA,GAAI,QAAQ,UAAU,YAAY,IAAI,GAAG,QAAQ;AAC9E,SACE,oBAAC,SAAI,MAAK,WAAU,WAAW,CAAC,WAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAClF,UAAA,MAAM,IAAI,CAAC,SAAS;AACnB,UAAM,KAAK,OAAO,SAAS,WAAW,EAAE,IAAI,MAAM,OAAO,KAAA,IAAS;AAClE,UAAM,WAAW,GAAG,OAAO;AAC3B,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,WAAW,kBAAkB,WAAW,0BAA0B;AAAA,QAClE,SAAS,MAAM,YAAY,SAAS,GAAG,EAAE;AAAA,QAExC,UAAA;AAAA,UAAA,GAAG;AAAA,UACH,GAAG,SAAS,OAAO,oBAAC,UAAK,WAAU,kBAAkB,UAAA,GAAG,MAAA,CAAM,IAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAPpE,GAAG;AAAA,IAAA;AAAA,EAUd,CAAC,EAAA,CACH;AAEJ;"}
@@ -0,0 +1,5 @@
1
+ /** Prose wrapper (styles raw HTML headings/lists/code) + Text helper with variants. */
2
+ export interface ProseProps { children?: React.ReactNode; }
3
+ export declare function Prose(props: ProseProps): JSX.Element;
4
+ export interface TextProps { as?: string; variant?: "mono" | "muted" | "faint" | "label" | "display"; children?: React.ReactNode; }
5
+ export declare function Text(props: TextProps): JSX.Element;
@@ -0,0 +1,45 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ const AX_TYPOGRAPHY_CSS = `
4
+ .ax-prose { color: var(--text-body); font-size: var(--text-md); line-height: var(--leading-body); max-width: 68ch; }
5
+ .ax-prose > * { margin: 0 0 1em; }
6
+ .ax-prose > *:last-child { margin-bottom: 0; }
7
+ .ax-prose h1 { font-family: var(--font-display); font-size: var(--text-2xl); font-weight: var(--weight-medium); letter-spacing: var(--tracking-tight); line-height: var(--leading-tight); margin: 0 0 0.5em; }
8
+ .ax-prose h2 { font-family: var(--font-display); font-size: var(--text-xl); font-weight: var(--weight-medium); letter-spacing: var(--tracking-tight); margin: 1.5em 0 0.5em; }
9
+ .ax-prose h3 { font-family: var(--font-display); font-size: var(--text-lg); font-weight: var(--weight-medium); margin: 1.4em 0 0.4em; }
10
+ .ax-prose a { color: var(--text-body); text-decoration: underline; text-decoration-color: var(--border-strong); text-underline-offset: 2px; }
11
+ .ax-prose a:hover { text-decoration-color: var(--text-body); }
12
+ .ax-prose strong { font-weight: var(--weight-medium); color: var(--text-body); }
13
+ .ax-prose code { font-family: var(--font-mono); font-size: 0.88em; padding: 1px 5px; background: var(--surface-raised); border: 1px solid var(--border-default); border-radius: var(--radius-1); }
14
+ .ax-prose blockquote { border-left: 2px solid var(--border-strong); padding-left: 16px; color: var(--text-muted); font-style: normal; }
15
+ .ax-prose ul, .ax-prose ol { padding-left: 20px; }
16
+ .ax-prose li { margin-bottom: 0.4em; }
17
+ .ax-prose hr { border: none; border-top: 1px solid var(--border-default); margin: 2em 0; }
18
+
19
+ .ax-text--mono { font-family: var(--font-mono); }
20
+ .ax-text--muted { color: var(--text-muted); }
21
+ .ax-text--faint { color: var(--text-faint); }
22
+ .ax-text--label { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); }
23
+ .ax-text--display { font-family: var(--font-display); letter-spacing: var(--tracking-tight); }
24
+ `;
25
+ if (typeof document !== "undefined" && !document.getElementById("ax-typography-css")) {
26
+ const s = document.createElement("style");
27
+ s.id = "ax-typography-css";
28
+ s.textContent = AX_TYPOGRAPHY_CSS;
29
+ document.head.appendChild(s);
30
+ }
31
+ function Prose({ children, className = "", ...rest }) {
32
+ return /* @__PURE__ */ jsx("div", { className: ["ax-prose", className].filter(Boolean).join(" "), ...rest, children });
33
+ }
34
+ function Text({ as = "span", variant, className = "", children, ...rest }) {
35
+ const Tag = as;
36
+ const cls = ["ax-text", variant ? "ax-text--" + variant : "", className].filter(Boolean).join(" ");
37
+ return /* @__PURE__ */ jsx(Tag, { className: cls, ...rest, children });
38
+ }
39
+ const Typography = Prose;
40
+ export {
41
+ Prose,
42
+ Text,
43
+ Typography
44
+ };
45
+ //# sourceMappingURL=Typography.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Typography.js","sources":["../../../src/components/display/Typography.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_TYPOGRAPHY_CSS = `\n.ax-prose { color: var(--text-body); font-size: var(--text-md); line-height: var(--leading-body); max-width: 68ch; }\n.ax-prose > * { margin: 0 0 1em; }\n.ax-prose > *:last-child { margin-bottom: 0; }\n.ax-prose h1 { font-family: var(--font-display); font-size: var(--text-2xl); font-weight: var(--weight-medium); letter-spacing: var(--tracking-tight); line-height: var(--leading-tight); margin: 0 0 0.5em; }\n.ax-prose h2 { font-family: var(--font-display); font-size: var(--text-xl); font-weight: var(--weight-medium); letter-spacing: var(--tracking-tight); margin: 1.5em 0 0.5em; }\n.ax-prose h3 { font-family: var(--font-display); font-size: var(--text-lg); font-weight: var(--weight-medium); margin: 1.4em 0 0.4em; }\n.ax-prose a { color: var(--text-body); text-decoration: underline; text-decoration-color: var(--border-strong); text-underline-offset: 2px; }\n.ax-prose a:hover { text-decoration-color: var(--text-body); }\n.ax-prose strong { font-weight: var(--weight-medium); color: var(--text-body); }\n.ax-prose code { font-family: var(--font-mono); font-size: 0.88em; padding: 1px 5px; background: var(--surface-raised); border: 1px solid var(--border-default); border-radius: var(--radius-1); }\n.ax-prose blockquote { border-left: 2px solid var(--border-strong); padding-left: 16px; color: var(--text-muted); font-style: normal; }\n.ax-prose ul, .ax-prose ol { padding-left: 20px; }\n.ax-prose li { margin-bottom: 0.4em; }\n.ax-prose hr { border: none; border-top: 1px solid var(--border-default); margin: 2em 0; }\n\n.ax-text--mono { font-family: var(--font-mono); }\n.ax-text--muted { color: var(--text-muted); }\n.ax-text--faint { color: var(--text-faint); }\n.ax-text--label { font-family: var(--font-mono); font-size: var(--text-xs); letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); }\n.ax-text--display { font-family: var(--font-display); letter-spacing: var(--tracking-tight); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-typography-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-typography-css\";\n s.textContent = AX_TYPOGRAPHY_CSS;\n document.head.appendChild(s);\n}\n\nexport function Prose({ children, className = \"\", ...rest }) {\n return <div className={[\"ax-prose\", className].filter(Boolean).join(\" \")} {...rest}>{children}</div>;\n}\n\nexport function Text({ as = \"span\", variant, className = \"\", children, ...rest }) {\n const Tag = as;\n const cls = [\"ax-text\", variant ? \"ax-text--\" + variant : \"\", className].filter(Boolean).join(\" \");\n return <Tag className={cls} {...rest}>{children}</Tag>;\n}\n\n/** Namesake export — Typography is the Prose wrapper. Prose / Text are the primary exports. */\nexport const Typography = Prose;\n"],"names":[],"mappings":";;AAEA,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuB1B,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,MAAM,EAAE,UAAU,YAAY,IAAI,GAAG,QAAQ;AAC3D,SAAO,oBAAC,OAAA,EAAI,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MAAO,UAAS;AAChG;AAEO,SAAS,KAAK,EAAE,KAAK,QAAQ,SAAS,YAAY,IAAI,UAAU,GAAG,QAAQ;AAChF,QAAM,MAAM;AACZ,QAAM,MAAM,CAAC,WAAW,UAAU,cAAc,UAAU,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACjG,6BAAQ,KAAA,EAAI,WAAW,KAAM,GAAG,MAAO,UAAS;AAClD;AAGO,MAAM,aAAa;"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Inline alert with a status bar (or icon) and optional title.
3
+ */
4
+ export interface AlertProps {
5
+ /** @default "neutral" */
6
+ variant?: "neutral" | "ok" | "warn" | "danger";
7
+ /** Optional leading icon (replaces the status bar). */
8
+ icon?: React.ReactNode;
9
+ title?: React.ReactNode;
10
+ children?: React.ReactNode;
11
+ }
12
+ export declare function Alert(props: AlertProps): JSX.Element;
@@ -0,0 +1,41 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ const AX_ALERT_CSS = `
4
+ .ax-alert {
5
+ display: flex; gap: 12px; padding: 14px 16px;
6
+ border: 1px solid var(--border-default); border-radius: var(--radius-3);
7
+ background: var(--surface-card);
8
+ }
9
+ .ax-alert__bar { width: 2px; flex: none; align-self: stretch; border-radius: 1px; background: var(--text-faint); }
10
+ .ax-alert--ok .ax-alert__bar { background: var(--ok); }
11
+ .ax-alert--warn .ax-alert__bar { background: var(--warn); }
12
+ .ax-alert--danger .ax-alert__bar { background: var(--danger); }
13
+ .ax-alert__icon { flex: none; color: var(--text-muted); margin-top: 1px; }
14
+ .ax-alert--ok .ax-alert__icon { color: var(--ok); }
15
+ .ax-alert--warn .ax-alert__icon { color: var(--warn); }
16
+ .ax-alert--danger .ax-alert__icon { color: var(--danger); }
17
+ .ax-alert__icon svg { width: 16px; height: 16px; display: block; }
18
+ .ax-alert__body { flex: 1; min-width: 0; }
19
+ .ax-alert__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; }
20
+ .ax-alert__desc { font-size: var(--text-sm); color: var(--text-muted); margin: 3px 0 0; line-height: var(--leading-body); }
21
+ `;
22
+ if (typeof document !== "undefined" && !document.getElementById("ax-alert-css")) {
23
+ const s = document.createElement("style");
24
+ s.id = "ax-alert-css";
25
+ s.textContent = AX_ALERT_CSS;
26
+ document.head.appendChild(s);
27
+ }
28
+ function Alert({ variant = "neutral", icon, title, children, className = "", ...rest }) {
29
+ const cls = ["ax-alert", variant !== "neutral" ? "ax-alert--" + variant : "", className].filter(Boolean).join(" ");
30
+ return /* @__PURE__ */ jsxs("div", { role: "alert", className: cls, ...rest, children: [
31
+ icon ? /* @__PURE__ */ jsx("span", { className: "ax-alert__icon", children: icon }) : /* @__PURE__ */ jsx("span", { className: "ax-alert__bar" }),
32
+ /* @__PURE__ */ jsxs("div", { className: "ax-alert__body", children: [
33
+ title ? /* @__PURE__ */ jsx("p", { className: "ax-alert__title", children: title }) : null,
34
+ children ? /* @__PURE__ */ jsx("p", { className: "ax-alert__desc", children }) : null
35
+ ] })
36
+ ] });
37
+ }
38
+ export {
39
+ Alert
40
+ };
41
+ //# sourceMappingURL=Alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Alert.js","sources":["../../../src/components/feedback/Alert.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_ALERT_CSS = `\n.ax-alert {\n display: flex; gap: 12px; padding: 14px 16px;\n border: 1px solid var(--border-default); border-radius: var(--radius-3);\n background: var(--surface-card);\n}\n.ax-alert__bar { width: 2px; flex: none; align-self: stretch; border-radius: 1px; background: var(--text-faint); }\n.ax-alert--ok .ax-alert__bar { background: var(--ok); }\n.ax-alert--warn .ax-alert__bar { background: var(--warn); }\n.ax-alert--danger .ax-alert__bar { background: var(--danger); }\n.ax-alert__icon { flex: none; color: var(--text-muted); margin-top: 1px; }\n.ax-alert--ok .ax-alert__icon { color: var(--ok); }\n.ax-alert--warn .ax-alert__icon { color: var(--warn); }\n.ax-alert--danger .ax-alert__icon { color: var(--danger); }\n.ax-alert__icon svg { width: 16px; height: 16px; display: block; }\n.ax-alert__body { flex: 1; min-width: 0; }\n.ax-alert__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; }\n.ax-alert__desc { font-size: var(--text-sm); color: var(--text-muted); margin: 3px 0 0; line-height: var(--leading-body); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-alert-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-alert-css\";\n s.textContent = AX_ALERT_CSS;\n document.head.appendChild(s);\n}\n\nexport function Alert({ variant = \"neutral\", icon, title, children, className = \"\", ...rest }) {\n const cls = [\"ax-alert\", variant !== \"neutral\" ? \"ax-alert--\" + variant : \"\", className].filter(Boolean).join(\" \");\n return (\n <div role=\"alert\" className={cls} {...rest}>\n {icon ? <span className=\"ax-alert__icon\">{icon}</span> : <span className=\"ax-alert__bar\"></span>}\n <div className=\"ax-alert__body\">\n {title ? <p className=\"ax-alert__title\">{title}</p> : null}\n {children ? <p className=\"ax-alert__desc\">{children}</p> : null}\n </div>\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;AAoBrB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,cAAc,GAAG;AAC/E,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,MAAM,EAAE,UAAU,WAAW,MAAM,OAAO,UAAU,YAAY,IAAI,GAAG,QAAQ;AAC7F,QAAM,MAAM,CAAC,YAAY,YAAY,YAAY,eAAe,UAAU,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACjH,8BACG,OAAA,EAAI,MAAK,SAAQ,WAAW,KAAM,GAAG,MACnC,UAAA;AAAA,IAAA,OAAO,oBAAC,UAAK,WAAU,kBAAkB,gBAAK,IAAU,oBAAC,QAAA,EAAK,WAAU,gBAAA,CAAgB;AAAA,IACzF,qBAAC,OAAA,EAAI,WAAU,kBACZ,UAAA;AAAA,MAAA,QAAQ,oBAAC,KAAA,EAAE,WAAU,mBAAmB,iBAAM,IAAO;AAAA,MACrD,WAAW,oBAAC,KAAA,EAAE,WAAU,kBAAkB,UAAS,IAAO;AAAA,IAAA,EAAA,CAC7D;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Modal dialog on a blurred overlay. inline renders without the overlay (for docs).
3
+ */
4
+ export interface DialogProps {
5
+ /** @default true */
6
+ open?: boolean;
7
+ /** Render without fixed overlay. @default false */
8
+ inline?: boolean;
9
+ /** Mono uppercase header label. */
10
+ title?: string;
11
+ /** Footer actions (right-aligned). */
12
+ footer?: React.ReactNode;
13
+ /** Called on overlay click / close button. */
14
+ onClose?: () => void;
15
+ children?: React.ReactNode;
16
+ }
17
+ export declare function Dialog(props: DialogProps): JSX.Element;
@@ -0,0 +1,90 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ const AX_DIALOG_CSS = `
4
+ .ax-dialog-overlay {
5
+ position: fixed; inset: 0; z-index: 100;
6
+ display: flex; align-items: center; justify-content: center;
7
+ background: var(--bg-overlay);
8
+ backdrop-filter: blur(var(--blur-overlay));
9
+ -webkit-backdrop-filter: blur(var(--blur-overlay));
10
+ animation: ax-dialog-fade var(--dur-2) var(--ease-out);
11
+ }
12
+ .ax-dialog {
13
+ width: min(480px, calc(100vw - 48px));
14
+ background: var(--surface-panel);
15
+ border: 1px solid var(--border-strong);
16
+ border-radius: var(--radius-3);
17
+ box-shadow: var(--shadow-3);
18
+ animation: ax-dialog-rise var(--dur-3) var(--ease-out);
19
+ }
20
+ .ax-dialog--inline { position: relative; animation: none; }
21
+ .ax-dialog__head {
22
+ display: flex; align-items: center; justify-content: space-between;
23
+ padding: var(--space-4) var(--space-5);
24
+ border-bottom: 1px solid var(--border-default);
25
+ }
26
+ .ax-dialog__title {
27
+ margin: 0; font-family: var(--font-mono); font-size: var(--text-xs);
28
+ font-weight: var(--weight-medium); letter-spacing: var(--tracking-label);
29
+ text-transform: uppercase; color: var(--text-muted);
30
+ }
31
+ .ax-dialog__close {
32
+ appearance: none; background: none; border: none; cursor: pointer;
33
+ color: var(--text-faint); font-family: var(--font-mono); font-size: 13px;
34
+ padding: 2px 4px; border-radius: var(--radius-1);
35
+ }
36
+ .ax-dialog__close:hover { color: var(--text-body); background: var(--surface-raised); }
37
+ .ax-dialog__body { padding: var(--space-5); }
38
+ .ax-dialog__foot {
39
+ display: flex; justify-content: flex-end; gap: var(--space-2);
40
+ padding: var(--space-4) var(--space-5);
41
+ border-top: 1px solid var(--border-default);
42
+ }
43
+ @keyframes ax-dialog-fade { from { opacity: 0; } }
44
+ @keyframes ax-dialog-rise { from { opacity: 0; transform: translateY(8px); } }
45
+ @media (prefers-reduced-motion: reduce) {
46
+ .ax-dialog-overlay, .ax-dialog { animation: none; }
47
+ }
48
+ `;
49
+ if (typeof document !== "undefined" && !document.getElementById("ax-dialog-css")) {
50
+ const s = document.createElement("style");
51
+ s.id = "ax-dialog-css";
52
+ s.textContent = AX_DIALOG_CSS;
53
+ document.head.appendChild(s);
54
+ }
55
+ function Dialog({
56
+ open = true,
57
+ inline = false,
58
+ title,
59
+ footer,
60
+ onClose,
61
+ children,
62
+ className = "",
63
+ ...rest
64
+ }) {
65
+ if (!open) return null;
66
+ const panel = /* @__PURE__ */ jsxs(
67
+ "div",
68
+ {
69
+ role: "dialog",
70
+ "aria-modal": !inline,
71
+ className: ["ax-dialog", inline ? "ax-dialog--inline" : "", className].filter(Boolean).join(" "),
72
+ onClick: (e) => e.stopPropagation(),
73
+ ...rest,
74
+ children: [
75
+ /* @__PURE__ */ jsxs("div", { className: "ax-dialog__head", children: [
76
+ /* @__PURE__ */ jsx("h2", { className: "ax-dialog__title", children: title }),
77
+ onClose ? /* @__PURE__ */ jsx("button", { className: "ax-dialog__close", "aria-label": "Close", onClick: onClose, children: "ESC ✕" }) : null
78
+ ] }),
79
+ /* @__PURE__ */ jsx("div", { className: "ax-dialog__body", children }),
80
+ footer ? /* @__PURE__ */ jsx("div", { className: "ax-dialog__foot", children: footer }) : null
81
+ ]
82
+ }
83
+ );
84
+ if (inline) return panel;
85
+ return /* @__PURE__ */ jsx("div", { className: "ax-dialog-overlay", onClick: onClose, children: panel });
86
+ }
87
+ export {
88
+ Dialog
89
+ };
90
+ //# sourceMappingURL=Dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.js","sources":["../../../src/components/feedback/Dialog.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_DIALOG_CSS = `\n.ax-dialog-overlay {\n position: fixed; inset: 0; z-index: 100;\n display: flex; align-items: center; justify-content: center;\n background: var(--bg-overlay);\n backdrop-filter: blur(var(--blur-overlay));\n -webkit-backdrop-filter: blur(var(--blur-overlay));\n animation: ax-dialog-fade var(--dur-2) var(--ease-out);\n}\n.ax-dialog {\n width: min(480px, calc(100vw - 48px));\n background: var(--surface-panel);\n border: 1px solid var(--border-strong);\n border-radius: var(--radius-3);\n box-shadow: var(--shadow-3);\n animation: ax-dialog-rise var(--dur-3) var(--ease-out);\n}\n.ax-dialog--inline { position: relative; animation: none; }\n.ax-dialog__head {\n display: flex; align-items: center; justify-content: space-between;\n padding: var(--space-4) var(--space-5);\n border-bottom: 1px solid var(--border-default);\n}\n.ax-dialog__title {\n margin: 0; 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-muted);\n}\n.ax-dialog__close {\n appearance: none; background: none; border: none; cursor: pointer;\n color: var(--text-faint); font-family: var(--font-mono); font-size: 13px;\n padding: 2px 4px; border-radius: var(--radius-1);\n}\n.ax-dialog__close:hover { color: var(--text-body); background: var(--surface-raised); }\n.ax-dialog__body { padding: var(--space-5); }\n.ax-dialog__foot {\n display: flex; justify-content: flex-end; gap: var(--space-2);\n padding: var(--space-4) var(--space-5);\n border-top: 1px solid var(--border-default);\n}\n@keyframes ax-dialog-fade { from { opacity: 0; } }\n@keyframes ax-dialog-rise { from { opacity: 0; transform: translateY(8px); } }\n@media (prefers-reduced-motion: reduce) {\n .ax-dialog-overlay, .ax-dialog { animation: none; }\n}\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-dialog-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-dialog-css\";\n s.textContent = AX_DIALOG_CSS;\n document.head.appendChild(s);\n}\n\nexport function Dialog({\n open = true,\n inline = false,\n title,\n footer,\n onClose,\n children,\n className = \"\",\n ...rest\n}) {\n if (!open) return null;\n const panel = (\n <div\n role=\"dialog\"\n aria-modal={!inline}\n className={[\"ax-dialog\", inline ? \"ax-dialog--inline\" : \"\", className].filter(Boolean).join(\" \")}\n onClick={(e) => e.stopPropagation()}\n {...rest}\n >\n <div className=\"ax-dialog__head\">\n <h2 className=\"ax-dialog__title\">{title}</h2>\n {onClose ? <button className=\"ax-dialog__close\" aria-label=\"Close\" onClick={onClose}>ESC ✕</button> : null}\n </div>\n <div className=\"ax-dialog__body\">{children}</div>\n {footer ? <div className=\"ax-dialog__foot\">{footer}</div> : null}\n </div>\n );\n if (inline) return panel;\n return (\n <div className=\"ax-dialog-overlay\" onClick={onClose}>\n {panel}\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;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;AA+CtB,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;AAAA,EACrB,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,GAAG;AACD,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,CAAC;AAAA,MACb,WAAW,CAAC,aAAa,SAAS,sBAAsB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC/F,SAAS,CAAC,MAAM,EAAE,gBAAA;AAAA,MACjB,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA,qBAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,UAAA,oBAAC,MAAA,EAAG,WAAU,oBAAoB,UAAA,OAAM;AAAA,UACvC,UAAU,oBAAC,UAAA,EAAO,WAAU,oBAAmB,cAAW,SAAQ,SAAS,SAAS,UAAA,QAAA,CAAK,IAAY;AAAA,QAAA,GACxG;AAAA,QACA,oBAAC,OAAA,EAAI,WAAU,mBAAmB,SAAA,CAAS;AAAA,QAC1C,SAAS,oBAAC,OAAA,EAAI,WAAU,mBAAmB,kBAAO,IAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGhE,MAAI,OAAQ,QAAO;AACnB,6BACG,OAAA,EAAI,WAAU,qBAAoB,SAAS,SACzC,UAAA,OACH;AAEJ;"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Mechanical square spinner — rotates in 8 ticks, not smoothly.
3
+ */
4
+ export interface SpinnerProps {
5
+ /** 14 / 20 / 28px. @default "md" */
6
+ size?: "sm" | "md" | "lg";
7
+ }
8
+ export declare function Spinner(props: SpinnerProps): JSX.Element;
@@ -0,0 +1,39 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ const AX_SPINNER_CSS = `
4
+ .ax-spinner {
5
+ display: inline-block; flex: none;
6
+ border: 2px solid var(--border-strong);
7
+ border-top-color: var(--text-body);
8
+ border-radius: var(--radius-1);
9
+ animation: ax-spin 0.9s steps(8) infinite;
10
+ }
11
+ .ax-spinner--sm { width: 14px; height: 14px; }
12
+ .ax-spinner--md { width: 20px; height: 20px; }
13
+ .ax-spinner--lg { width: 28px; height: 28px; }
14
+ @keyframes ax-spin { to { transform: rotate(360deg); } }
15
+ @media (prefers-reduced-motion: reduce) {
16
+ .ax-spinner { animation-duration: 2s; }
17
+ }
18
+ `;
19
+ if (typeof document !== "undefined" && !document.getElementById("ax-spinner-css")) {
20
+ const s = document.createElement("style");
21
+ s.id = "ax-spinner-css";
22
+ s.textContent = AX_SPINNER_CSS;
23
+ document.head.appendChild(s);
24
+ }
25
+ function Spinner({ size = "md", className = "", ...rest }) {
26
+ return /* @__PURE__ */ jsx(
27
+ "span",
28
+ {
29
+ role: "status",
30
+ "aria-label": "Loading",
31
+ className: ["ax-spinner", `ax-spinner--${size}`, className].filter(Boolean).join(" "),
32
+ ...rest
33
+ }
34
+ );
35
+ }
36
+ export {
37
+ Spinner
38
+ };
39
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sources":["../../../src/components/feedback/Spinner.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_SPINNER_CSS = `\n.ax-spinner {\n display: inline-block; flex: none;\n border: 2px solid var(--border-strong);\n border-top-color: var(--text-body);\n border-radius: var(--radius-1);\n animation: ax-spin 0.9s steps(8) infinite;\n}\n.ax-spinner--sm { width: 14px; height: 14px; }\n.ax-spinner--md { width: 20px; height: 20px; }\n.ax-spinner--lg { width: 28px; height: 28px; }\n@keyframes ax-spin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) {\n .ax-spinner { animation-duration: 2s; }\n}\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-spinner-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-spinner-css\";\n s.textContent = AX_SPINNER_CSS;\n document.head.appendChild(s);\n}\n\nexport function Spinner({ size = \"md\", className = \"\", ...rest }) {\n return (\n <span\n role=\"status\"\n aria-label=\"Loading\"\n className={[\"ax-spinner\", `ax-spinner--${size}`, className].filter(Boolean).join(\" \")}\n {...rest}\n ></span>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBvB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,gBAAgB,GAAG;AACjF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,QAAQ,EAAE,OAAO,MAAM,YAAY,IAAI,GAAG,QAAQ;AAChE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAW,CAAC,cAAc,eAAe,IAAI,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACnF,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Notification card with a thin status bar. Presentational — position it yourself.
3
+ */
4
+ export interface ToastProps {
5
+ /** @default "neutral" */
6
+ variant?: "neutral" | "ok" | "warn" | "danger";
7
+ title: string;
8
+ description?: string;
9
+ /** Renders a ✕ button when provided. */
10
+ onClose?: () => void;
11
+ }
12
+ export declare function Toast(props: ToastProps): JSX.Element;
@@ -0,0 +1,50 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ const AX_TOAST_CSS = `
4
+ .ax-toast {
5
+ display: flex; align-items: flex-start; gap: 10px;
6
+ width: 340px; padding: 12px 14px;
7
+ background: var(--surface-card);
8
+ border: 1px solid var(--border-default);
9
+ border-radius: var(--radius-3);
10
+ box-shadow: var(--shadow-2);
11
+ }
12
+ .ax-toast__bar { width: 3px; align-self: stretch; flex: none; border-radius: 1px; background: var(--text-faint); }
13
+ .ax-toast--ok .ax-toast__bar { background: var(--ok); }
14
+ .ax-toast--warn .ax-toast__bar { background: var(--warn); }
15
+ .ax-toast--danger .ax-toast__bar { background: var(--danger); }
16
+ .ax-toast__body { flex: 1; min-width: 0; }
17
+ .ax-toast__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; }
18
+ .ax-toast__desc { font-size: var(--text-sm); color: var(--text-muted); margin: 2px 0 0; line-height: var(--leading-snug); }
19
+ .ax-toast__close {
20
+ appearance: none; background: none; border: none; cursor: pointer;
21
+ color: var(--text-faint); font-size: 14px; line-height: 1; padding: 2px;
22
+ font-family: var(--font-mono);
23
+ }
24
+ .ax-toast__close:hover { color: var(--text-body); }
25
+ `;
26
+ if (typeof document !== "undefined" && !document.getElementById("ax-toast-css")) {
27
+ const s = document.createElement("style");
28
+ s.id = "ax-toast-css";
29
+ s.textContent = AX_TOAST_CSS;
30
+ document.head.appendChild(s);
31
+ }
32
+ function Toast({ variant = "neutral", title, description, onClose, className = "", ...rest }) {
33
+ const cls = [
34
+ "ax-toast",
35
+ variant !== "neutral" ? `ax-toast--${variant}` : "",
36
+ className
37
+ ].filter(Boolean).join(" ");
38
+ return /* @__PURE__ */ jsxs("div", { role: "status", className: cls, ...rest, children: [
39
+ /* @__PURE__ */ jsx("span", { className: "ax-toast__bar" }),
40
+ /* @__PURE__ */ jsxs("div", { className: "ax-toast__body", children: [
41
+ /* @__PURE__ */ jsx("p", { className: "ax-toast__title", children: title }),
42
+ description ? /* @__PURE__ */ jsx("p", { className: "ax-toast__desc", children: description }) : null
43
+ ] }),
44
+ onClose ? /* @__PURE__ */ jsx("button", { className: "ax-toast__close", "aria-label": "Dismiss", onClick: onClose, children: "✕" }) : null
45
+ ] });
46
+ }
47
+ export {
48
+ Toast
49
+ };
50
+ //# sourceMappingURL=Toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toast.js","sources":["../../../src/components/feedback/Toast.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_TOAST_CSS = `\n.ax-toast {\n display: flex; align-items: flex-start; gap: 10px;\n width: 340px; padding: 12px 14px;\n background: var(--surface-card);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-3);\n box-shadow: var(--shadow-2);\n}\n.ax-toast__bar { width: 3px; align-self: stretch; flex: none; border-radius: 1px; background: var(--text-faint); }\n.ax-toast--ok .ax-toast__bar { background: var(--ok); }\n.ax-toast--warn .ax-toast__bar { background: var(--warn); }\n.ax-toast--danger .ax-toast__bar { background: var(--danger); }\n.ax-toast__body { flex: 1; min-width: 0; }\n.ax-toast__title { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); margin: 0; }\n.ax-toast__desc { font-size: var(--text-sm); color: var(--text-muted); margin: 2px 0 0; line-height: var(--leading-snug); }\n.ax-toast__close {\n appearance: none; background: none; border: none; cursor: pointer;\n color: var(--text-faint); font-size: 14px; line-height: 1; padding: 2px;\n font-family: var(--font-mono);\n}\n.ax-toast__close:hover { color: var(--text-body); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-toast-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-toast-css\";\n s.textContent = AX_TOAST_CSS;\n document.head.appendChild(s);\n}\n\nexport function Toast({ variant = \"neutral\", title, description, onClose, className = \"\", ...rest }) {\n const cls = [\n \"ax-toast\",\n variant !== \"neutral\" ? `ax-toast--${variant}` : \"\",\n className,\n ].filter(Boolean).join(\" \");\n return (\n <div role=\"status\" className={cls} {...rest}>\n <span className=\"ax-toast__bar\"></span>\n <div className=\"ax-toast__body\">\n <p className=\"ax-toast__title\">{title}</p>\n {description ? <p className=\"ax-toast__desc\">{description}</p> : null}\n </div>\n {onClose ? <button className=\"ax-toast__close\" aria-label=\"Dismiss\" onClick={onClose}>✕</button> : null}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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,MAAM,EAAE,UAAU,WAAW,OAAO,aAAa,SAAS,YAAY,IAAI,GAAG,QAAQ;AACnG,QAAM,MAAM;AAAA,IACV;AAAA,IACA,YAAY,YAAY,aAAa,OAAO,KAAK;AAAA,IACjD;AAAA,EAAA,EACA,OAAO,OAAO,EAAE,KAAK,GAAG;AAC1B,8BACG,OAAA,EAAI,MAAK,UAAS,WAAW,KAAM,GAAG,MACrC,UAAA;AAAA,IAAA,oBAAC,QAAA,EAAK,WAAU,gBAAA,CAAgB;AAAA,IAChC,qBAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,MAAA,oBAAC,KAAA,EAAE,WAAU,mBAAmB,UAAA,OAAM;AAAA,MACrC,cAAc,oBAAC,KAAA,EAAE,WAAU,kBAAkB,uBAAY,IAAO;AAAA,IAAA,GACnE;AAAA,IACC,UAAU,oBAAC,UAAA,EAAO,WAAU,mBAAkB,cAAW,WAAU,SAAS,SAAS,UAAA,IAAA,CAAC,IAAY;AAAA,EAAA,GACrG;AAEJ;"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hover/focus tooltip — inverted mono bubble, CSS only.
3
+ */
4
+ export interface TooltipProps {
5
+ label: string;
6
+ /** @default "top" */
7
+ side?: "top" | "bottom";
8
+ /** The trigger element. */
9
+ children?: React.ReactNode;
10
+ }
11
+ export declare function Tooltip(props: TooltipProps): JSX.Element;
@@ -0,0 +1,34 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import "react";
3
+ const AX_TOOLTIP_CSS = `
4
+ .ax-tip { position: relative; display: inline-flex; }
5
+ .ax-tip__bubble {
6
+ position: absolute; left: 50%; transform: translateX(-50%) translateY(2px);
7
+ bottom: calc(100% + 8px); z-index: 50;
8
+ padding: 4px 8px; white-space: nowrap; pointer-events: none;
9
+ background: var(--accent); color: var(--accent-fg);
10
+ border-radius: var(--radius-1);
11
+ font-family: var(--font-mono); font-size: var(--text-xs);
12
+ opacity: 0;
13
+ transition: opacity var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out);
14
+ }
15
+ .ax-tip--bottom .ax-tip__bubble { bottom: auto; top: calc(100% + 8px); transform: translateX(-50%) translateY(-2px); }
16
+ .ax-tip:hover .ax-tip__bubble, .ax-tip:focus-within .ax-tip__bubble { opacity: 1; transform: translateX(-50%) translateY(0); }
17
+ `;
18
+ if (typeof document !== "undefined" && !document.getElementById("ax-tooltip-css")) {
19
+ const s = document.createElement("style");
20
+ s.id = "ax-tooltip-css";
21
+ s.textContent = AX_TOOLTIP_CSS;
22
+ document.head.appendChild(s);
23
+ }
24
+ function Tooltip({ label, side = "top", children, className = "", ...rest }) {
25
+ const cls = ["ax-tip", side === "bottom" ? "ax-tip--bottom" : "", className].filter(Boolean).join(" ");
26
+ return /* @__PURE__ */ jsxs("span", { className: cls, ...rest, children: [
27
+ children,
28
+ /* @__PURE__ */ jsx("span", { className: "ax-tip__bubble", role: "tooltip", children: label })
29
+ ] });
30
+ }
31
+ export {
32
+ Tooltip
33
+ };
34
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","sources":["../../../src/components/feedback/Tooltip.jsx"],"sourcesContent":["import React from \"react\";\n\nconst AX_TOOLTIP_CSS = `\n.ax-tip { position: relative; display: inline-flex; }\n.ax-tip__bubble {\n position: absolute; left: 50%; transform: translateX(-50%) translateY(2px);\n bottom: calc(100% + 8px); z-index: 50;\n padding: 4px 8px; white-space: nowrap; pointer-events: none;\n background: var(--accent); color: var(--accent-fg);\n border-radius: var(--radius-1);\n font-family: var(--font-mono); font-size: var(--text-xs);\n opacity: 0;\n transition: opacity var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out);\n}\n.ax-tip--bottom .ax-tip__bubble { bottom: auto; top: calc(100% + 8px); transform: translateX(-50%) translateY(-2px); }\n.ax-tip:hover .ax-tip__bubble, .ax-tip:focus-within .ax-tip__bubble { opacity: 1; transform: translateX(-50%) translateY(0); }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-tooltip-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-tooltip-css\";\n s.textContent = AX_TOOLTIP_CSS;\n document.head.appendChild(s);\n}\n\nexport function Tooltip({ label, side = \"top\", children, className = \"\", ...rest }) {\n const cls = [\"ax-tip\", side === \"bottom\" ? \"ax-tip--bottom\" : \"\", className].filter(Boolean).join(\" \");\n return (\n <span className={cls} {...rest}>\n {children}\n <span className=\"ax-tip__bubble\" role=\"tooltip\">{label}</span>\n </span>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBvB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,gBAAgB,GAAG;AACjF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEO,SAAS,QAAQ,EAAE,OAAO,OAAO,OAAO,UAAU,YAAY,IAAI,GAAG,QAAQ;AAClF,QAAM,MAAM,CAAC,UAAU,SAAS,WAAW,mBAAmB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACrG,SACE,qBAAC,QAAA,EAAK,WAAW,KAAM,GAAG,MACvB,UAAA;AAAA,IAAA;AAAA,wBACA,QAAA,EAAK,WAAU,kBAAiB,MAAK,WAAW,UAAA,MAAA,CAAM;AAAA,EAAA,GACzD;AAEJ;"}
@@ -0,0 +1,3 @@
1
+ /** Month calendar grid (Monday-first), single-date selection, today marker. */
2
+ export interface CalendarProps { value?: Date; onChange?: (date: Date) => void; month?: Date; }
3
+ export declare function Calendar(props: CalendarProps): JSX.Element;
@@ -0,0 +1,81 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ const AX_CALENDAR_CSS = `
4
+ .ax-calendar { display: inline-block; padding: 14px; background: var(--surface-panel); border: 1px solid var(--border-default); border-radius: var(--radius-3); font-family: var(--font-body); user-select: none; }
5
+ .ax-calendar__head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
6
+ .ax-calendar__month { font-family: var(--font-mono); font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); letter-spacing: 0.02em; }
7
+ .ax-calendar__nav { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; cursor: pointer; background: none; border: 1px solid var(--border-default); border-radius: var(--radius-2); color: var(--text-muted); transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }
8
+ .ax-calendar__nav:hover { background: var(--surface-raised); color: var(--text-body); }
9
+ .ax-calendar__grid { display: grid; grid-template-columns: repeat(7, 32px); gap: 2px; }
10
+ .ax-calendar__dow { height: 28px; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); }
11
+ .ax-calendar__day { height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; background: none; border: none; border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-mono); font-size: var(--text-sm); transition: background var(--dur-1) var(--ease-out); }
12
+ .ax-calendar__day:hover:not(:disabled) { background: var(--surface-raised); }
13
+ .ax-calendar__day--muted { color: var(--text-faint); opacity: 0.5; }
14
+ .ax-calendar__day--today { box-shadow: inset 0 0 0 1px var(--border-strong); }
15
+ .ax-calendar__day--selected { background: var(--accent) !important; color: var(--accent-fg); }
16
+ .ax-calendar__day:disabled { color: var(--text-faint); opacity: 0.3; cursor: not-allowed; }
17
+ `;
18
+ if (typeof document !== "undefined" && !document.getElementById("ax-calendar-css")) {
19
+ const s = document.createElement("style");
20
+ s.id = "ax-calendar-css";
21
+ s.textContent = AX_CALENDAR_CSS;
22
+ document.head.appendChild(s);
23
+ }
24
+ const MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
25
+ const DOW = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
26
+ function sameDay(a, b) {
27
+ return a && b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
28
+ }
29
+ function Calendar({ value, onChange, month: monthProp, className = "", ...rest }) {
30
+ const init = value || /* @__PURE__ */ new Date();
31
+ const [view, setView] = useState({ y: (monthProp || init).getFullYear(), m: (monthProp || init).getMonth() });
32
+ const today = /* @__PURE__ */ new Date();
33
+ const first = new Date(view.y, view.m, 1);
34
+ const startOffset = (first.getDay() + 6) % 7;
35
+ const daysInMonth = new Date(view.y, view.m + 1, 0).getDate();
36
+ const prevDays = new Date(view.y, view.m, 0).getDate();
37
+ const cells = [];
38
+ for (let i = 0; i < startOffset; i++) cells.push({ day: prevDays - startOffset + i + 1, muted: true });
39
+ for (let d = 1; d <= daysInMonth; d++) cells.push({ day: d, muted: false, date: new Date(view.y, view.m, d) });
40
+ while (cells.length % 7 !== 0) cells.push({ day: cells.length - startOffset - daysInMonth + 1, muted: true });
41
+ const shift = (delta) => {
42
+ let m = view.m + delta, y = view.y;
43
+ if (m < 0) {
44
+ m = 11;
45
+ y--;
46
+ }
47
+ if (m > 11) {
48
+ m = 0;
49
+ y++;
50
+ }
51
+ setView({ y, m });
52
+ };
53
+ return /* @__PURE__ */ jsxs("div", { className: ["ax-calendar", className].filter(Boolean).join(" "), ...rest, children: [
54
+ /* @__PURE__ */ jsxs("div", { className: "ax-calendar__head", children: [
55
+ /* @__PURE__ */ jsx("button", { className: "ax-calendar__nav", onClick: () => shift(-1), "aria-label": "Previous month", children: "‹" }),
56
+ /* @__PURE__ */ jsxs("span", { className: "ax-calendar__month", children: [
57
+ MONTHS[view.m],
58
+ " ",
59
+ view.y
60
+ ] }),
61
+ /* @__PURE__ */ jsx("button", { className: "ax-calendar__nav", onClick: () => shift(1), "aria-label": "Next month", children: "›" })
62
+ ] }),
63
+ /* @__PURE__ */ jsxs("div", { className: "ax-calendar__grid", children: [
64
+ DOW.map((d) => /* @__PURE__ */ jsx("span", { className: "ax-calendar__dow", children: d }, d)),
65
+ cells.map((c, i) => /* @__PURE__ */ jsx(
66
+ "button",
67
+ {
68
+ className: ["ax-calendar__day", c.muted ? "ax-calendar__day--muted" : "", c.date && sameDay(c.date, today) ? "ax-calendar__day--today" : "", c.date && sameDay(c.date, value) ? "ax-calendar__day--selected" : ""].filter(Boolean).join(" "),
69
+ disabled: c.muted,
70
+ onClick: () => c.date && onChange && onChange(c.date),
71
+ children: c.day
72
+ },
73
+ i
74
+ ))
75
+ ] })
76
+ ] });
77
+ }
78
+ export {
79
+ Calendar
80
+ };
81
+ //# sourceMappingURL=Calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Calendar.js","sources":["../../../src/components/inputs/Calendar.jsx"],"sourcesContent":["import React, { useState } from \"react\";\n\nconst AX_CALENDAR_CSS = `\n.ax-calendar { display: inline-block; padding: 14px; background: var(--surface-panel); border: 1px solid var(--border-default); border-radius: var(--radius-3); font-family: var(--font-body); user-select: none; }\n.ax-calendar__head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }\n.ax-calendar__month { font-family: var(--font-mono); font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-body); letter-spacing: 0.02em; }\n.ax-calendar__nav { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; cursor: pointer; background: none; border: 1px solid var(--border-default); border-radius: var(--radius-2); color: var(--text-muted); transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }\n.ax-calendar__nav:hover { background: var(--surface-raised); color: var(--text-body); }\n.ax-calendar__grid { display: grid; grid-template-columns: repeat(7, 32px); gap: 2px; }\n.ax-calendar__dow { height: 28px; display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 10px; letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--text-faint); }\n.ax-calendar__day { height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; background: none; border: none; border-radius: var(--radius-2); color: var(--text-body); font-family: var(--font-mono); font-size: var(--text-sm); transition: background var(--dur-1) var(--ease-out); }\n.ax-calendar__day:hover:not(:disabled) { background: var(--surface-raised); }\n.ax-calendar__day--muted { color: var(--text-faint); opacity: 0.5; }\n.ax-calendar__day--today { box-shadow: inset 0 0 0 1px var(--border-strong); }\n.ax-calendar__day--selected { background: var(--accent) !important; color: var(--accent-fg); }\n.ax-calendar__day:disabled { color: var(--text-faint); opacity: 0.3; cursor: not-allowed; }\n`;\n\nif (typeof document !== \"undefined\" && !document.getElementById(\"ax-calendar-css\")) {\n const s = document.createElement(\"style\");\n s.id = \"ax-calendar-css\";\n s.textContent = AX_CALENDAR_CSS;\n document.head.appendChild(s);\n}\n\nconst MONTHS = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];\nconst DOW = [\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\",\"Su\"];\n\nfunction sameDay(a, b) { return a && b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); }\n\nexport function Calendar({ value, onChange, month: monthProp, className = \"\", ...rest }) {\n const init = value || new Date();\n const [view, setView] = useState({ y: (monthProp || init).getFullYear(), m: (monthProp || init).getMonth() });\n const today = new Date();\n\n const first = new Date(view.y, view.m, 1);\n const startOffset = (first.getDay() + 6) % 7; // Monday-first\n const daysInMonth = new Date(view.y, view.m + 1, 0).getDate();\n const prevDays = new Date(view.y, view.m, 0).getDate();\n\n const cells = [];\n for (let i = 0; i < startOffset; i++) cells.push({ day: prevDays - startOffset + i + 1, muted: true });\n for (let d = 1; d <= daysInMonth; d++) cells.push({ day: d, muted: false, date: new Date(view.y, view.m, d) });\n while (cells.length % 7 !== 0) cells.push({ day: cells.length - startOffset - daysInMonth + 1, muted: true });\n\n const shift = (delta) => {\n let m = view.m + delta, y = view.y;\n if (m < 0) { m = 11; y--; } if (m > 11) { m = 0; y++; }\n setView({ y, m });\n };\n\n return (\n <div className={[\"ax-calendar\", className].filter(Boolean).join(\" \")} {...rest}>\n <div className=\"ax-calendar__head\">\n <button className=\"ax-calendar__nav\" onClick={() => shift(-1)} aria-label=\"Previous month\">‹</button>\n <span className=\"ax-calendar__month\">{MONTHS[view.m]} {view.y}</span>\n <button className=\"ax-calendar__nav\" onClick={() => shift(1)} aria-label=\"Next month\">›</button>\n </div>\n <div className=\"ax-calendar__grid\">\n {DOW.map((d) => <span key={d} className=\"ax-calendar__dow\">{d}</span>)}\n {cells.map((c, i) => (\n <button\n key={i}\n className={[\"ax-calendar__day\", c.muted ? \"ax-calendar__day--muted\" : \"\", c.date && sameDay(c.date, today) ? \"ax-calendar__day--today\" : \"\", c.date && sameDay(c.date, value) ? \"ax-calendar__day--selected\" : \"\"].filter(Boolean).join(\" \")}\n disabled={c.muted}\n onClick={() => c.date && onChange && onChange(c.date)}\n >{c.day}</button>\n ))}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;AAEA,MAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBxB,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,eAAe,iBAAiB,GAAG;AAClF,QAAM,IAAI,SAAS,cAAc,OAAO;AACxC,IAAE,KAAK;AACP,IAAE,cAAc;AAChB,WAAS,KAAK,YAAY,CAAC;AAC7B;AAEA,MAAM,SAAS,CAAC,WAAU,YAAW,SAAQ,SAAQ,OAAM,QAAO,QAAO,UAAS,aAAY,WAAU,YAAW,UAAU;AAC7H,MAAM,MAAM,CAAC,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,IAAI;AAE/C,SAAS,QAAQ,GAAG,GAAG;AAAE,SAAO,KAAK,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAA,MAAe,EAAE,SAAA,KAAc,EAAE,QAAA,MAAc,EAAE,QAAA;AAAW;AAExI,SAAS,SAAS,EAAE,OAAO,UAAU,OAAO,WAAW,YAAY,IAAI,GAAG,QAAQ;AACvF,QAAM,OAAO,SAAS,oBAAI,KAAA;AAC1B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE,IAAI,aAAa,MAAM,YAAA,GAAe,IAAI,aAAa,MAAM,SAAA,GAAY;AAC5G,QAAM,4BAAY,KAAA;AAElB,QAAM,QAAQ,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG,CAAC;AACxC,QAAM,eAAe,MAAM,OAAA,IAAW,KAAK;AAC3C,QAAM,cAAc,IAAI,KAAK,KAAK,GAAG,KAAK,IAAI,GAAG,CAAC,EAAE,QAAA;AACpD,QAAM,WAAW,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,QAAA;AAE7C,QAAM,QAAQ,CAAA;AACd,WAAS,IAAI,GAAG,IAAI,aAAa,IAAK,OAAM,KAAK,EAAE,KAAK,WAAW,cAAc,IAAI,GAAG,OAAO,MAAM;AACrG,WAAS,IAAI,GAAG,KAAK,aAAa,IAAK,OAAM,KAAK,EAAE,KAAK,GAAG,OAAO,OAAO,MAAM,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG;AAC7G,SAAO,MAAM,SAAS,MAAM,SAAS,KAAK,EAAE,KAAK,MAAM,SAAS,cAAc,cAAc,GAAG,OAAO,MAAM;AAE5G,QAAM,QAAQ,CAAC,UAAU;AACvB,QAAI,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK;AACjC,QAAI,IAAI,GAAG;AAAE,UAAI;AAAI;AAAA,IAAK;AAAE,QAAI,IAAI,IAAI;AAAE,UAAI;AAAG;AAAA,IAAK;AACtD,YAAQ,EAAE,GAAG,GAAG;AAAA,EAClB;AAEA,SACE,qBAAC,OAAA,EAAI,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,MACxE,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,MAAA,oBAAC,UAAA,EAAO,WAAU,oBAAmB,SAAS,MAAM,MAAM,EAAE,GAAG,cAAW,kBAAiB,UAAA,IAAA,CAAC;AAAA,MAC5F,qBAAC,QAAA,EAAK,WAAU,sBAAsB,UAAA;AAAA,QAAA,OAAO,KAAK,CAAC;AAAA,QAAE;AAAA,QAAE,KAAK;AAAA,MAAA,GAAE;AAAA,MAC9D,oBAAC,UAAA,EAAO,WAAU,oBAAmB,SAAS,MAAM,MAAM,CAAC,GAAG,cAAW,cAAa,UAAA,IAAA,CAAC;AAAA,IAAA,GACzF;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,MAAA,IAAI,IAAI,CAAC,MAAM,oBAAC,UAAa,WAAU,oBAAoB,UAAA,EAAA,GAAjC,CAAmC,CAAO;AAAA,MACpE,MAAM,IAAI,CAAC,GAAG,MACb;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,CAAC,oBAAoB,EAAE,QAAQ,4BAA4B,IAAI,EAAE,QAAQ,QAAQ,EAAE,MAAM,KAAK,IAAI,4BAA4B,IAAI,EAAE,QAAQ,QAAQ,EAAE,MAAM,KAAK,IAAI,+BAA+B,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAC3O,UAAU,EAAE;AAAA,UACZ,SAAS,MAAM,EAAE,QAAQ,YAAY,SAAS,EAAE,IAAI;AAAA,UACpD,UAAA,EAAE;AAAA,QAAA;AAAA,QAJG;AAAA,MAAA,CAKR;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 16px square checkbox with mono-inverted checked state.
3
+ */
4
+ export interface CheckboxProps {
5
+ label?: string;
6
+ checked?: boolean;
7
+ disabled?: boolean;
8
+ onChange?: (e: any) => void;
9
+ }
10
+ export declare function Checkbox(props: CheckboxProps): JSX.Element;