@hyperpackai/hyperui 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 (321) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +82 -0
  3. package/dist/components/Accordion/index.d.ts +17 -0
  4. package/dist/components/Accordion/index.d.ts.map +1 -0
  5. package/dist/components/Accordion/index.js +46 -0
  6. package/dist/components/Alert/index.d.ts +13 -0
  7. package/dist/components/Alert/index.d.ts.map +1 -0
  8. package/dist/components/Alert/index.js +46 -0
  9. package/dist/components/AppBar/index.d.ts +19 -0
  10. package/dist/components/AppBar/index.d.ts.map +1 -0
  11. package/dist/components/AppBar/index.js +48 -0
  12. package/dist/components/AspectRatio/index.d.ts +8 -0
  13. package/dist/components/AspectRatio/index.d.ts.map +1 -0
  14. package/dist/components/AspectRatio/index.js +32 -0
  15. package/dist/components/Autocomplete/index.d.ts +21 -0
  16. package/dist/components/Autocomplete/index.d.ts.map +1 -0
  17. package/dist/components/Autocomplete/index.js +94 -0
  18. package/dist/components/Avatar/index.d.ts +12 -0
  19. package/dist/components/Avatar/index.d.ts.map +1 -0
  20. package/dist/components/Avatar/index.js +32 -0
  21. package/dist/components/AvatarGroup/index.d.ts +9 -0
  22. package/dist/components/AvatarGroup/index.d.ts.map +1 -0
  23. package/dist/components/AvatarGroup/index.js +24 -0
  24. package/dist/components/Backdrop/index.d.ts +10 -0
  25. package/dist/components/Backdrop/index.d.ts.map +1 -0
  26. package/dist/components/Backdrop/index.js +25 -0
  27. package/dist/components/Badge/index.d.ts +10 -0
  28. package/dist/components/Badge/index.d.ts.map +1 -0
  29. package/dist/components/Badge/index.js +30 -0
  30. package/dist/components/BottomNavigation/index.d.ts +16 -0
  31. package/dist/components/BottomNavigation/index.d.ts.map +1 -0
  32. package/dist/components/BottomNavigation/index.js +43 -0
  33. package/dist/components/Box/index.d.ts +21 -0
  34. package/dist/components/Box/index.d.ts.map +1 -0
  35. package/dist/components/Box/index.js +30 -0
  36. package/dist/components/Breadcrumb/index.d.ts +13 -0
  37. package/dist/components/Breadcrumb/index.d.ts.map +1 -0
  38. package/dist/components/Breadcrumb/index.js +19 -0
  39. package/dist/components/Button/index.d.ts +22 -0
  40. package/dist/components/Button/index.d.ts.map +1 -0
  41. package/dist/components/Button/index.js +93 -0
  42. package/dist/components/ButtonGroup/index.d.ts +9 -0
  43. package/dist/components/ButtonGroup/index.d.ts.map +1 -0
  44. package/dist/components/ButtonGroup/index.js +27 -0
  45. package/dist/components/Card/index.d.ts +14 -0
  46. package/dist/components/Card/index.d.ts.map +1 -0
  47. package/dist/components/Card/index.js +33 -0
  48. package/dist/components/Checkbox/index.d.ts +17 -0
  49. package/dist/components/Checkbox/index.d.ts.map +1 -0
  50. package/dist/components/Checkbox/index.js +42 -0
  51. package/dist/components/Chip/index.d.ts +18 -0
  52. package/dist/components/Chip/index.d.ts.map +1 -0
  53. package/dist/components/Chip/index.js +60 -0
  54. package/dist/components/CircularProgress/index.d.ts +14 -0
  55. package/dist/components/CircularProgress/index.d.ts.map +1 -0
  56. package/dist/components/CircularProgress/index.js +58 -0
  57. package/dist/components/ClickAwayListener/index.d.ts +11 -0
  58. package/dist/components/ClickAwayListener/index.d.ts.map +1 -0
  59. package/dist/components/ClickAwayListener/index.js +31 -0
  60. package/dist/components/Code/index.d.ts +9 -0
  61. package/dist/components/Code/index.d.ts.map +1 -0
  62. package/dist/components/Code/index.js +50 -0
  63. package/dist/components/Collapse/index.d.ts +11 -0
  64. package/dist/components/Collapse/index.d.ts.map +1 -0
  65. package/dist/components/Collapse/index.js +30 -0
  66. package/dist/components/CommandPalette/index.d.ts +26 -0
  67. package/dist/components/CommandPalette/index.d.ts.map +1 -0
  68. package/dist/components/CommandPalette/index.js +141 -0
  69. package/dist/components/Container/index.d.ts +11 -0
  70. package/dist/components/Container/index.d.ts.map +1 -0
  71. package/dist/components/Container/index.js +18 -0
  72. package/dist/components/DashboardLayout/index.d.ts +15 -0
  73. package/dist/components/DashboardLayout/index.d.ts.map +1 -0
  74. package/dist/components/DashboardLayout/index.js +67 -0
  75. package/dist/components/DataTable/index.d.ts +27 -0
  76. package/dist/components/DataTable/index.d.ts.map +1 -0
  77. package/dist/components/DataTable/index.js +59 -0
  78. package/dist/components/Dialog/index.d.ts +19 -0
  79. package/dist/components/Dialog/index.d.ts.map +1 -0
  80. package/dist/components/Dialog/index.js +96 -0
  81. package/dist/components/Divider/index.d.ts +13 -0
  82. package/dist/components/Divider/index.d.ts.map +1 -0
  83. package/dist/components/Divider/index.js +40 -0
  84. package/dist/components/Drawer/index.d.ts +17 -0
  85. package/dist/components/Drawer/index.d.ts.map +1 -0
  86. package/dist/components/Drawer/index.js +77 -0
  87. package/dist/components/DropdownMenu/index.d.ts +25 -0
  88. package/dist/components/DropdownMenu/index.d.ts.map +1 -0
  89. package/dist/components/DropdownMenu/index.js +67 -0
  90. package/dist/components/EmptyState/index.d.ts +11 -0
  91. package/dist/components/EmptyState/index.d.ts.map +1 -0
  92. package/dist/components/EmptyState/index.js +53 -0
  93. package/dist/components/ErrorState/index.d.ts +12 -0
  94. package/dist/components/ErrorState/index.d.ts.map +1 -0
  95. package/dist/components/ErrorState/index.js +54 -0
  96. package/dist/components/Fab/index.d.ts +16 -0
  97. package/dist/components/Fab/index.d.ts.map +1 -0
  98. package/dist/components/Fab/index.js +39 -0
  99. package/dist/components/Fade/index.d.ts +10 -0
  100. package/dist/components/Fade/index.d.ts.map +1 -0
  101. package/dist/components/Fade/index.js +13 -0
  102. package/dist/components/FocusTrap/index.d.ts +11 -0
  103. package/dist/components/FocusTrap/index.d.ts.map +1 -0
  104. package/dist/components/FocusTrap/index.js +69 -0
  105. package/dist/components/FormControl/index.d.ts +34 -0
  106. package/dist/components/FormControl/index.d.ts.map +1 -0
  107. package/dist/components/FormControl/index.js +52 -0
  108. package/dist/components/GlobalSearch/index.d.ts +23 -0
  109. package/dist/components/GlobalSearch/index.d.ts.map +1 -0
  110. package/dist/components/GlobalSearch/index.js +91 -0
  111. package/dist/components/Grid/index.d.ts +19 -0
  112. package/dist/components/Grid/index.d.ts.map +1 -0
  113. package/dist/components/Grid/index.js +30 -0
  114. package/dist/components/Grow/index.d.ts +10 -0
  115. package/dist/components/Grow/index.d.ts.map +1 -0
  116. package/dist/components/Grow/index.js +13 -0
  117. package/dist/components/IconButton/index.d.ts +16 -0
  118. package/dist/components/IconButton/index.d.ts.map +1 -0
  119. package/dist/components/IconButton/index.js +43 -0
  120. package/dist/components/ImageList/index.d.ts +21 -0
  121. package/dist/components/ImageList/index.d.ts.map +1 -0
  122. package/dist/components/ImageList/index.js +39 -0
  123. package/dist/components/Input/index.d.ts +33 -0
  124. package/dist/components/Input/index.d.ts.map +1 -0
  125. package/dist/components/Input/index.js +45 -0
  126. package/dist/components/Kbd/index.d.ts +8 -0
  127. package/dist/components/Kbd/index.d.ts.map +1 -0
  128. package/dist/components/Kbd/index.js +41 -0
  129. package/dist/components/KeyboardShortcut/index.d.ts +20 -0
  130. package/dist/components/KeyboardShortcut/index.d.ts.map +1 -0
  131. package/dist/components/KeyboardShortcut/index.js +63 -0
  132. package/dist/components/Label/index.d.ts +10 -0
  133. package/dist/components/Label/index.d.ts.map +1 -0
  134. package/dist/components/Label/index.js +17 -0
  135. package/dist/components/LinearProgress/index.d.ts +13 -0
  136. package/dist/components/LinearProgress/index.d.ts.map +1 -0
  137. package/dist/components/LinearProgress/index.js +69 -0
  138. package/dist/components/Link/index.d.ts +16 -0
  139. package/dist/components/Link/index.d.ts.map +1 -0
  140. package/dist/components/Link/index.js +25 -0
  141. package/dist/components/List/index.d.ts +40 -0
  142. package/dist/components/List/index.d.ts.map +1 -0
  143. package/dist/components/List/index.js +70 -0
  144. package/dist/components/LoadingState/index.d.ts +11 -0
  145. package/dist/components/LoadingState/index.d.ts.map +1 -0
  146. package/dist/components/LoadingState/index.js +66 -0
  147. package/dist/components/Menu/index.d.ts +40 -0
  148. package/dist/components/Menu/index.d.ts.map +1 -0
  149. package/dist/components/Menu/index.js +103 -0
  150. package/dist/components/MobileStepper/index.d.ts +16 -0
  151. package/dist/components/MobileStepper/index.d.ts.map +1 -0
  152. package/dist/components/MobileStepper/index.js +67 -0
  153. package/dist/components/Modal/index.d.ts +14 -0
  154. package/dist/components/Modal/index.d.ts.map +1 -0
  155. package/dist/components/Modal/index.js +51 -0
  156. package/dist/components/Navbar/index.d.ts +14 -0
  157. package/dist/components/Navbar/index.d.ts.map +1 -0
  158. package/dist/components/Navbar/index.js +27 -0
  159. package/dist/components/NoSSR/index.d.ts +7 -0
  160. package/dist/components/NoSSR/index.d.ts.map +1 -0
  161. package/dist/components/NoSSR/index.js +9 -0
  162. package/dist/components/PageLayout/index.d.ts +13 -0
  163. package/dist/components/PageLayout/index.d.ts.map +1 -0
  164. package/dist/components/PageLayout/index.js +41 -0
  165. package/dist/components/Pagination/index.d.ts +11 -0
  166. package/dist/components/Pagination/index.d.ts.map +1 -0
  167. package/dist/components/Pagination/index.js +56 -0
  168. package/dist/components/Paper/index.d.ts +12 -0
  169. package/dist/components/Paper/index.d.ts.map +1 -0
  170. package/dist/components/Paper/index.js +24 -0
  171. package/dist/components/Popover/index.d.ts +13 -0
  172. package/dist/components/Popover/index.d.ts.map +1 -0
  173. package/dist/components/Popover/index.js +34 -0
  174. package/dist/components/Progress/index.d.ts +13 -0
  175. package/dist/components/Progress/index.d.ts.map +1 -0
  176. package/dist/components/Progress/index.js +40 -0
  177. package/dist/components/Radio/index.d.ts +7 -0
  178. package/dist/components/Radio/index.d.ts.map +1 -0
  179. package/dist/components/Radio/index.js +28 -0
  180. package/dist/components/Rating/index.d.ts +15 -0
  181. package/dist/components/Rating/index.d.ts.map +1 -0
  182. package/dist/components/Rating/index.js +41 -0
  183. package/dist/components/ResizablePanel/index.d.ts +16 -0
  184. package/dist/components/ResizablePanel/index.d.ts.map +1 -0
  185. package/dist/components/ResizablePanel/index.js +41 -0
  186. package/dist/components/ScrollArea/index.d.ts +12 -0
  187. package/dist/components/ScrollArea/index.d.ts.map +1 -0
  188. package/dist/components/ScrollArea/index.js +50 -0
  189. package/dist/components/Select/index.d.ts +23 -0
  190. package/dist/components/Select/index.d.ts.map +1 -0
  191. package/dist/components/Select/index.js +52 -0
  192. package/dist/components/Sheet/index.d.ts +15 -0
  193. package/dist/components/Sheet/index.d.ts.map +1 -0
  194. package/dist/components/Sheet/index.js +61 -0
  195. package/dist/components/Sidebar/index.d.ts +23 -0
  196. package/dist/components/Sidebar/index.d.ts.map +1 -0
  197. package/dist/components/Sidebar/index.js +37 -0
  198. package/dist/components/Skeleton/index.d.ts +9 -0
  199. package/dist/components/Skeleton/index.d.ts.map +1 -0
  200. package/dist/components/Skeleton/index.js +22 -0
  201. package/dist/components/Slide/index.d.ts +12 -0
  202. package/dist/components/Slide/index.d.ts.map +1 -0
  203. package/dist/components/Slide/index.js +21 -0
  204. package/dist/components/Slider/index.d.ts +19 -0
  205. package/dist/components/Slider/index.d.ts.map +1 -0
  206. package/dist/components/Slider/index.js +49 -0
  207. package/dist/components/Snackbar/index.d.ts +28 -0
  208. package/dist/components/Snackbar/index.d.ts.map +1 -0
  209. package/dist/components/Snackbar/index.js +71 -0
  210. package/dist/components/SpeedDial/index.d.ts +18 -0
  211. package/dist/components/SpeedDial/index.d.ts.map +1 -0
  212. package/dist/components/SpeedDial/index.js +71 -0
  213. package/dist/components/Spinner/index.d.ts +10 -0
  214. package/dist/components/Spinner/index.d.ts.map +1 -0
  215. package/dist/components/Spinner/index.js +67 -0
  216. package/dist/components/SplitPane/index.d.ts +11 -0
  217. package/dist/components/SplitPane/index.d.ts.map +1 -0
  218. package/dist/components/SplitPane/index.js +46 -0
  219. package/dist/components/Stack/index.d.ts +17 -0
  220. package/dist/components/Stack/index.d.ts.map +1 -0
  221. package/dist/components/Stack/index.js +30 -0
  222. package/dist/components/Stepper/index.d.ts +20 -0
  223. package/dist/components/Stepper/index.d.ts.map +1 -0
  224. package/dist/components/Stepper/index.js +66 -0
  225. package/dist/components/Switch/index.d.ts +13 -0
  226. package/dist/components/Switch/index.d.ts.map +1 -0
  227. package/dist/components/Switch/index.js +38 -0
  228. package/dist/components/Tabs/index.d.ts +20 -0
  229. package/dist/components/Tabs/index.d.ts.map +1 -0
  230. package/dist/components/Tabs/index.js +62 -0
  231. package/dist/components/TextField/index.d.ts +35 -0
  232. package/dist/components/TextField/index.d.ts.map +1 -0
  233. package/dist/components/TextField/index.js +69 -0
  234. package/dist/components/Textarea/index.d.ts +22 -0
  235. package/dist/components/Textarea/index.d.ts.map +1 -0
  236. package/dist/components/Textarea/index.js +27 -0
  237. package/dist/components/Timeline/index.d.ts +16 -0
  238. package/dist/components/Timeline/index.d.ts.map +1 -0
  239. package/dist/components/Timeline/index.js +30 -0
  240. package/dist/components/Toast/index.d.ts +34 -0
  241. package/dist/components/Toast/index.d.ts.map +1 -0
  242. package/dist/components/Toast/index.js +106 -0
  243. package/dist/components/ToggleButton/index.d.ts +21 -0
  244. package/dist/components/ToggleButton/index.d.ts.map +1 -0
  245. package/dist/components/ToggleButton/index.js +81 -0
  246. package/dist/components/Tooltip/index.d.ts +14 -0
  247. package/dist/components/Tooltip/index.d.ts.map +1 -0
  248. package/dist/components/Tooltip/index.js +47 -0
  249. package/dist/components/TreeView/index.d.ts +19 -0
  250. package/dist/components/TreeView/index.d.ts.map +1 -0
  251. package/dist/components/TreeView/index.js +50 -0
  252. package/dist/components/Typography/index.d.ts +17 -0
  253. package/dist/components/Typography/index.d.ts.map +1 -0
  254. package/dist/components/Typography/index.js +44 -0
  255. package/dist/components/VisuallyHidden/index.d.ts +7 -0
  256. package/dist/components/VisuallyHidden/index.d.ts.map +1 -0
  257. package/dist/components/VisuallyHidden/index.js +18 -0
  258. package/dist/components/Zoom/index.d.ts +10 -0
  259. package/dist/components/Zoom/index.d.ts.map +1 -0
  260. package/dist/components/Zoom/index.js +13 -0
  261. package/dist/components/ai.d.ts +133 -0
  262. package/dist/components/ai.d.ts.map +1 -0
  263. package/dist/components/ai.js +184 -0
  264. package/dist/components/charts.d.ts +143 -0
  265. package/dist/components/charts.d.ts.map +1 -0
  266. package/dist/components/charts.js +435 -0
  267. package/dist/components/data.d.ts +192 -0
  268. package/dist/components/data.d.ts.map +1 -0
  269. package/dist/components/data.js +581 -0
  270. package/dist/components/date.d.ts +73 -0
  271. package/dist/components/date.d.ts.map +1 -0
  272. package/dist/components/date.js +199 -0
  273. package/dist/components/enterprise.d.ts +246 -0
  274. package/dist/components/enterprise.d.ts.map +1 -0
  275. package/dist/components/enterprise.js +428 -0
  276. package/dist/components/form.d.ts +132 -0
  277. package/dist/components/form.d.ts.map +1 -0
  278. package/dist/components/form.js +380 -0
  279. package/dist/components/index.d.ts +173 -0
  280. package/dist/components/index.d.ts.map +1 -0
  281. package/dist/components/index.js +107 -0
  282. package/dist/components/inputs.d.ts +169 -0
  283. package/dist/components/inputs.d.ts.map +1 -0
  284. package/dist/components/inputs.js +437 -0
  285. package/dist/components/layout.d.ts +224 -0
  286. package/dist/components/layout.d.ts.map +1 -0
  287. package/dist/components/layout.js +644 -0
  288. package/dist/components/overlay.d.ts +102 -0
  289. package/dist/components/overlay.d.ts.map +1 -0
  290. package/dist/components/overlay.js +318 -0
  291. package/dist/components/surfaces.d.ts +180 -0
  292. package/dist/components/surfaces.d.ts.map +1 -0
  293. package/dist/components/surfaces.js +423 -0
  294. package/dist/components/typography.d.ts +69 -0
  295. package/dist/components/typography.d.ts.map +1 -0
  296. package/dist/components/typography.js +206 -0
  297. package/dist/index.d.ts +23 -0
  298. package/dist/index.d.ts.map +1 -0
  299. package/dist/index.js +29 -0
  300. package/dist/portal.d.ts +3 -0
  301. package/dist/portal.d.ts.map +1 -0
  302. package/dist/portal.js +17 -0
  303. package/dist/theme/index.d.ts +31 -0
  304. package/dist/theme/index.d.ts.map +1 -0
  305. package/dist/theme/index.js +258 -0
  306. package/dist/tokens/component.d.ts +124 -0
  307. package/dist/tokens/component.d.ts.map +1 -0
  308. package/dist/tokens/component.js +113 -0
  309. package/dist/tokens/index.d.ts +494 -0
  310. package/dist/tokens/index.d.ts.map +1 -0
  311. package/dist/tokens/index.js +345 -0
  312. package/dist/tokens/primitives.d.ts +675 -0
  313. package/dist/tokens/primitives.d.ts.map +1 -0
  314. package/dist/tokens/primitives.js +356 -0
  315. package/dist/tokens/semantic.d.ts +252 -0
  316. package/dist/tokens/semantic.d.ts.map +1 -0
  317. package/dist/tokens/semantic.js +242 -0
  318. package/dist/tokens/themes.d.ts +18 -0
  319. package/dist/tokens/themes.d.ts.map +1 -0
  320. package/dist/tokens/themes.js +316 -0
  321. package/package.json +69 -0
@@ -0,0 +1,22 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface TextareaProps {
3
+ value?: string;
4
+ placeholder?: string;
5
+ disabled?: boolean;
6
+ readOnly?: boolean;
7
+ required?: boolean;
8
+ rows?: number;
9
+ error?: string;
10
+ helper?: string;
11
+ label?: string;
12
+ resize?: boolean;
13
+ id?: string;
14
+ name?: string;
15
+ maxLength?: number;
16
+ class?: string;
17
+ onInput?: (e: InputEvent) => void;
18
+ onChange?: (e: Event) => void;
19
+ onBlur?: (e: FocusEvent) => void;
20
+ }
21
+ export declare function Textarea(props: TextareaProps): VNode;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Textarea/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAqBpE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAapD"}
@@ -0,0 +1,27 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ import { Label } from "../Label/index.js";
3
+ const TEXTAREA_CSS = `
4
+ .hu-textarea {
5
+ width: 100%; font-family: var(--hu-font-sans); font-size: var(--hu-font-size-sm);
6
+ color: var(--hu-text); background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2));
7
+ border: 1px solid var(--hu-border); border-radius: var(--hu-radius-md);
8
+ padding: 10px 12px; transition: border-color var(--hu-duration) var(--hu-ease), box-shadow var(--hu-duration) var(--hu-ease), background var(--hu-duration) var(--hu-ease);
9
+ outline: none; resize: vertical; min-height: 80px; line-height: var(--hu-line-height);
10
+ box-shadow: var(--hu-shadow-xs);
11
+ }
12
+ .hu-textarea::placeholder { color: var(--hu-text-3); }
13
+ .hu-textarea:hover:not(:disabled) { border-color: color-mix(in srgb, var(--hu-primary) 35%, var(--hu-border-2)); }
14
+ .hu-textarea:focus { border-color: var(--hu-primary); background: var(--hu-bg); box-shadow: 0 0 0 3px color-mix(in srgb, var(--hu-primary) 18%, transparent), var(--hu-shadow-sm); }
15
+ .hu-textarea:disabled { opacity: .5; cursor: not-allowed; background: var(--hu-bg-3); }
16
+ .hu-textarea--error { border-color: var(--hu-error) !important; }
17
+ .hu-textarea--error:focus { box-shadow: 0 0 0 3px color-mix(in srgb, var(--hu-error) 18%, transparent); }
18
+ .hu-textarea--no-resize { resize: none; }
19
+ `;
20
+ export function Textarea(props) {
21
+ injectCSS("hu-textarea", TEXTAREA_CSS);
22
+ const { error, helper, label, resize = true, id, ...rest } = props;
23
+ return h("div", { class: "hu-input-wrap" }, label && Label({ for: id, required: props.required, children: label }), h("textarea", {
24
+ ...rest, id,
25
+ class: cn("hu-textarea", error && "hu-textarea--error", !resize && "hu-textarea--no-resize", props.class)
26
+ }), error && h("span", { class: "hu-input-error-msg", role: "alert" }, error), !error && helper && h("span", { class: "hu-input-helper" }, helper));
27
+ }
@@ -0,0 +1,16 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface TimelineItem {
3
+ id: string;
4
+ title: string;
5
+ description?: unknown;
6
+ time?: string;
7
+ status?: "default" | "success" | "warning" | "error" | "info";
8
+ marker?: unknown;
9
+ actions?: unknown;
10
+ }
11
+ export interface TimelineProps {
12
+ items: TimelineItem[];
13
+ class?: string;
14
+ }
15
+ export declare function Timeline(props: TimelineProps): VNode;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Timeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAyBpE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAoBpD"}
@@ -0,0 +1,30 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const TIMELINE_CSS = `
3
+ .hu-timeline { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0; }
4
+ .hu-timeline-item { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--hu-space-3); position: relative; min-width: 0; }
5
+ .hu-timeline-item:not(:last-child) { padding-block-end: var(--hu-space-5); }
6
+ .hu-timeline-marker-wrap { position: relative; display: flex; justify-content: center; min-width: 24px; }
7
+ .hu-timeline-marker {
8
+ width: 12px; height: 12px; border-radius: var(--hu-radius-full);
9
+ margin-block-start: 5px; background: var(--hu-border-2); border: 2px solid var(--hu-bg); box-shadow: 0 0 0 1px var(--hu-border);
10
+ }
11
+ .hu-timeline-item:not(:last-child) .hu-timeline-marker-wrap::after {
12
+ content: ""; position: absolute; inset-block-start: 24px; inset-block-end: 0; width: 1px; background: var(--hu-border);
13
+ }
14
+ .hu-timeline-item--success .hu-timeline-marker { background: var(--hu-success); box-shadow: 0 0 0 1px var(--hu-success); }
15
+ .hu-timeline-item--warning .hu-timeline-marker { background: var(--hu-warning); box-shadow: 0 0 0 1px var(--hu-warning); }
16
+ .hu-timeline-item--error .hu-timeline-marker { background: var(--hu-error); box-shadow: 0 0 0 1px var(--hu-error); }
17
+ .hu-timeline-item--info .hu-timeline-marker { background: var(--hu-info); box-shadow: 0 0 0 1px var(--hu-info); }
18
+ .hu-timeline-content { min-width: 0; }
19
+ .hu-timeline-title { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); color: var(--hu-text); }
20
+ .hu-timeline-time { margin-block-start: 1px; font-size: var(--hu-font-size-xs); color: var(--hu-text-3); }
21
+ .hu-timeline-description { margin-block-start: var(--hu-space-1); font-size: var(--hu-font-size-sm); color: var(--hu-text-2); line-height: 1.55; }
22
+ .hu-timeline-actions { margin-block-start: var(--hu-space-2); }
23
+ `;
24
+ export function Timeline(props) {
25
+ injectCSS("hu-timeline", TIMELINE_CSS);
26
+ return h("ol", { class: cn("hu-timeline", props.class), "aria-label": "Timeline" }, ...props.items.map((item) => h("li", {
27
+ key: item.id,
28
+ class: cn("hu-timeline-item", item.status && item.status !== "default" && `hu-timeline-item--${item.status}`)
29
+ }, h("div", { class: "hu-timeline-marker-wrap", "aria-hidden": "true" }, h("span", { class: "hu-timeline-marker" }, item.marker)), h("div", { class: "hu-timeline-content" }, h("div", { class: "hu-timeline-title" }, item.title), item.time && h("time", { class: "hu-timeline-time" }, item.time), item.description && h("div", { class: "hu-timeline-description" }, item.description), item.actions && h("div", { class: "hu-timeline-actions" }, item.actions)))));
30
+ }
@@ -0,0 +1,34 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export type ToastType = "default" | "success" | "error" | "warning" | "info";
3
+ export type ToastPosition = "top-right" | "top-left" | "top-center" | "bottom-right" | "bottom-left" | "bottom-center";
4
+ export interface ToastData {
5
+ id: string;
6
+ title: string;
7
+ description?: string;
8
+ type?: ToastType;
9
+ duration?: number;
10
+ action?: {
11
+ label: string;
12
+ onClick: () => void;
13
+ };
14
+ onClose?: () => void;
15
+ }
16
+ /**
17
+ * Programmatic toast notifications. Call anywhere — no component needed.
18
+ *
19
+ * const toast = useToast();
20
+ * toast.success("Saved!", { description: "Changes saved to server." });
21
+ */
22
+ export declare function useToast(): {
23
+ show: (data: Omit<ToastData, "id">) => string;
24
+ success: (title: string, opts?: Partial<ToastData>) => string;
25
+ error: (title: string, opts?: Partial<ToastData>) => string;
26
+ warning: (title: string, opts?: Partial<ToastData>) => string;
27
+ info: (title: string, opts?: Partial<ToastData>) => string;
28
+ dismiss: (id: string) => void;
29
+ dismissAll: () => void;
30
+ setPosition: (pos: ToastPosition) => void;
31
+ };
32
+ /** Place once near your app root to render toasts. */
33
+ export declare function ToastRegion(): VNode;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Toast/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAyDpE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAC7E,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,eAAe,CAAC;AAEvH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAcD;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI;IAC1B,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC;IAC9C,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC;IAC9D,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC;IAC5D,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC;IAC9D,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC;IAC3D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C,CA+BA;AAED,sDAAsD;AACtD,wBAAgB,WAAW,IAAI,KAAK,CAuBnC"}
@@ -0,0 +1,106 @@
1
+ import { signal } from "@hyperpackai/hyperion";
2
+ import { injectCSS, cn, h } from "../../theme/index.js";
3
+ import { renderInPortal } from "../../portal.js";
4
+ const TOAST_CSS = `
5
+ .hu-toast-region {
6
+ position: fixed; z-index: var(--hu-z-toast); display: flex; flex-direction: column; gap: var(--hu-space-2);
7
+ pointer-events: none; padding: var(--hu-space-4);
8
+ max-width: min(420px, calc(100vw - 32px));
9
+ }
10
+ .hu-toast-region--top-right { top: 0; right: 0; }
11
+ .hu-toast-region--top-left { top: 0; left: 0; }
12
+ .hu-toast-region--top-center { top: 0; left: 50%; transform: translateX(-50%); }
13
+ .hu-toast-region--bottom-right { bottom: 0; right: 0; flex-direction: column-reverse; }
14
+ .hu-toast-region--bottom-left { bottom: 0; left: 0; flex-direction: column-reverse; }
15
+ .hu-toast-region--bottom-center{ bottom: 0; left: 50%; transform: translateX(-50%); flex-direction: column-reverse; }
16
+
17
+ .hu-toast {
18
+ pointer-events: all; display: flex; align-items: flex-start; gap: var(--hu-space-3);
19
+ padding: var(--hu-space-4); border-radius: var(--hu-radius-lg);
20
+ background: linear-gradient(180deg, var(--hu-bg), color-mix(in srgb, var(--hu-bg-2) 66%, var(--hu-bg)));
21
+ border: 1px solid color-mix(in srgb, var(--hu-border) 82%, transparent);
22
+ box-shadow: var(--hu-shadow-lg);
23
+ animation: hu-slide-up var(--hu-duration) var(--hu-ease-spring);
24
+ min-width: 280px;
25
+ }
26
+ .hu-toast--success { border-left: 4px solid var(--hu-success); }
27
+ .hu-toast--error { border-left: 4px solid var(--hu-error); }
28
+ .hu-toast--warning { border-left: 4px solid var(--hu-warning); }
29
+ .hu-toast--info { border-left: 4px solid var(--hu-info); }
30
+
31
+ .hu-toast-icon { flex-shrink: 0; width: 20px; height: 20px; margin-top: 1px; }
32
+ .hu-toast-icon--success { color: var(--hu-success); }
33
+ .hu-toast-icon--error { color: var(--hu-error); }
34
+ .hu-toast-icon--warning { color: var(--hu-warning); }
35
+ .hu-toast-icon--info { color: var(--hu-info); }
36
+
37
+ .hu-toast-content { flex: 1; min-width: 0; }
38
+ .hu-toast-title { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); color: var(--hu-text); }
39
+ .hu-toast-desc { font-size: var(--hu-font-size-xs); color: var(--hu-text-2); margin-top: 2px; }
40
+ .hu-toast-action { margin-top: var(--hu-space-2); }
41
+ .hu-toast-action-btn {
42
+ font-size: var(--hu-font-size-xs); color: var(--hu-primary); background: var(--hu-primary-bg);
43
+ border: 1px solid color-mix(in srgb, var(--hu-primary) 24%, transparent);
44
+ border-radius: var(--hu-radius); cursor: pointer; padding: 5px 9px; font-weight: var(--hu-font-weight-semibold);
45
+ font-family: var(--hu-font-sans);
46
+ }
47
+ .hu-toast-action-btn:hover { border-color: var(--hu-primary); }
48
+ .hu-toast-action-btn:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 2px; }
49
+ .hu-toast-close {
50
+ flex-shrink: 0; width: 24px; height: 24px; display:flex;align-items:center;justify-content:center;
51
+ border-radius: var(--hu-radius); background:transparent; border:1px solid transparent; cursor:pointer; color:var(--hu-text-3);
52
+ transition: background var(--hu-duration) var(--hu-ease), border-color var(--hu-duration) var(--hu-ease), color var(--hu-duration) var(--hu-ease); padding:0;
53
+ }
54
+ .hu-toast-close:hover { background: var(--hu-bg-3); color: var(--hu-text); border-color: var(--hu-border); }
55
+ .hu-toast-close:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 2px; }
56
+ `;
57
+ const _toasts = signal([]);
58
+ const _toastPosition = signal("top-right");
59
+ let _toastIdCounter = 0;
60
+ const TOAST_ICONS = {
61
+ default: "",
62
+ success: `<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z"/></svg>`,
63
+ error: `<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z"/></svg>`,
64
+ warning: `<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z"/></svg>`,
65
+ info: `<svg viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z"/></svg>`
66
+ };
67
+ /**
68
+ * Programmatic toast notifications. Call anywhere — no component needed.
69
+ *
70
+ * const toast = useToast();
71
+ * toast.success("Saved!", { description: "Changes saved to server." });
72
+ */
73
+ export function useToast() {
74
+ injectCSS("hu-toast", TOAST_CSS);
75
+ const show = (data) => {
76
+ const id = `toast-${++_toastIdCounter}`;
77
+ const toast = { id, duration: 5000, ...data };
78
+ _toasts.value = [..._toasts.value, toast];
79
+ if (toast.duration && toast.duration > 0) {
80
+ setTimeout(() => dismiss(id), toast.duration);
81
+ }
82
+ return id;
83
+ };
84
+ const dismiss = (id) => {
85
+ _toasts.value = _toasts.value.filter((t) => t.id !== id);
86
+ };
87
+ const shorthand = (type) => (title, opts) => show({ title, type, ...opts });
88
+ return {
89
+ show, dismiss,
90
+ success: shorthand("success"),
91
+ error: shorthand("error"),
92
+ warning: shorthand("warning"),
93
+ info: shorthand("info"),
94
+ dismissAll: () => { _toasts.value = []; },
95
+ setPosition: (pos) => { _toastPosition.value = pos; }
96
+ };
97
+ }
98
+ /** Place once near your app root to render toasts. */
99
+ export function ToastRegion() {
100
+ injectCSS("hu-toast", TOAST_CSS);
101
+ const dismiss = (id) => {
102
+ _toasts.value = _toasts.value.filter((t) => t.id !== id);
103
+ };
104
+ const closeSVG = `<svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M1 1l10 10M11 1L1 11"/></svg>`;
105
+ return (() => renderInPortal(h("div", { class: cn("hu-toast-region", `hu-toast-region--${_toastPosition.value}`), role: "region", "aria-label": "Notifications" }, ..._toasts.value.map((t) => h("div", { key: t.id, class: cn("hu-toast", t.type !== "default" && `hu-toast--${t.type}`), role: "alert" }, t.type && t.type !== "default" && h("span", { class: cn("hu-toast-icon", `hu-toast-icon--${t.type}`), innerHTML: TOAST_ICONS[t.type], "aria-hidden": "true" }), h("div", { class: "hu-toast-content" }, h("div", { class: "hu-toast-title" }, t.title), t.description && h("div", { class: "hu-toast-desc" }, t.description), t.action && h("div", { class: "hu-toast-action" }, h("button", { class: "hu-toast-action-btn", onClick: () => { t.action.onClick(); dismiss(t.id); } }, t.action.label))), h("button", { class: "hu-toast-close", onClick: () => { dismiss(t.id); t.onClose?.(); }, "aria-label": "Dismiss", innerHTML: closeSVG })))), "toast"));
106
+ }
@@ -0,0 +1,21 @@
1
+ import type { Signal } from "@hyperpackai/hyperion";
2
+ import { type VNode } from "../../theme/index.js";
3
+ export interface ToggleButtonProps {
4
+ value: string;
5
+ selected?: boolean | Signal<boolean> | (() => boolean);
6
+ disabled?: boolean;
7
+ onChange?: (value: string) => void;
8
+ class?: string;
9
+ children?: unknown;
10
+ }
11
+ export declare function ToggleButton(props: ToggleButtonProps): VNode;
12
+ export interface ToggleButtonGroupProps {
13
+ value?: string | string[] | Signal<string | string[]> | (() => string | string[]);
14
+ exclusive?: boolean;
15
+ orientation?: "horizontal" | "vertical";
16
+ onChange?: (value: string | string[]) => void;
17
+ class?: string;
18
+ children?: ToggleButtonProps[];
19
+ }
20
+ export declare function ToggleButtonGroup(props: ToggleButtonGroupProps): VNode;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ToggleButton/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAuCpE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,KAAK,CAW5D;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAClF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,KAAK,CA0BtE"}
@@ -0,0 +1,81 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const TOGGLE_BTN_CSS = `
3
+ .hu-toggle-btn {
4
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--hu-space-1);
5
+ min-height: 38px; padding: var(--hu-space-2) var(--hu-space-3); font-size: var(--hu-font-size-sm);
6
+ font-family: var(--hu-font-sans); border: 1px solid transparent;
7
+ border-radius: var(--hu-radius-md);
8
+ background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2)); color: var(--hu-text-2); cursor: pointer;
9
+ box-shadow: inset 0 0 0 1px var(--hu-border), var(--hu-shadow-xs);
10
+ transition: background var(--hu-duration) var(--hu-ease), border-color var(--hu-duration) var(--hu-ease), box-shadow var(--hu-duration) var(--hu-ease), color var(--hu-duration) var(--hu-ease), transform var(--hu-duration) var(--hu-ease);
11
+ user-select: none; white-space: nowrap;
12
+ }
13
+ .hu-toggle-btn:hover { background: var(--hu-bg-3); color: var(--hu-text); box-shadow: inset 0 0 0 1px var(--hu-border-2), var(--hu-shadow-sm); transform: translateY(-1px); }
14
+ .hu-toggle-btn:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 2px; z-index: 2; }
15
+ .hu-toggle-btn--selected {
16
+ background: linear-gradient(180deg, color-mix(in srgb, var(--hu-primary) 13%, var(--hu-bg)), color-mix(in srgb, var(--hu-primary-bg) 82%, var(--hu-bg)));
17
+ color: var(--hu-primary);
18
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--hu-primary) 58%, transparent), inset 0 -2px 0 color-mix(in srgb, var(--hu-primary) 72%, transparent), var(--hu-shadow-xs);
19
+ }
20
+ .hu-toggle-btn:disabled { opacity: .4; pointer-events: none; }
21
+ .hu-toggle-btn-group {
22
+ display: inline-flex; max-width: 100%; overflow-x: auto;
23
+ padding: 3px; gap: 3px;
24
+ border: 1px solid var(--hu-border); border-radius: var(--hu-radius-lg);
25
+ background: color-mix(in srgb, var(--hu-bg-2) 84%, var(--hu-bg));
26
+ box-shadow: var(--hu-shadow-xs);
27
+ }
28
+ .hu-toggle-btn-group .hu-toggle-btn { border-radius: var(--hu-radius-md); box-shadow: none; }
29
+ .hu-toggle-btn-group .hu-toggle-btn:not(:last-child) { border-right-width: 1px; }
30
+ .hu-toggle-btn-group .hu-toggle-btn:first-child,
31
+ .hu-toggle-btn-group .hu-toggle-btn:last-child { border-radius: var(--hu-radius-md); }
32
+ .hu-toggle-btn-group--vertical { flex-direction: column; overflow-x: visible; overflow: hidden; }
33
+ .hu-toggle-btn-group--vertical .hu-toggle-btn { border-radius: var(--hu-radius-md); border-right-width: 1px; }
34
+ .hu-toggle-btn-group--vertical .hu-toggle-btn:not(:last-child) { border-bottom-width: 1px; }
35
+ .hu-toggle-btn-group--vertical .hu-toggle-btn:first-child,
36
+ .hu-toggle-btn-group--vertical .hu-toggle-btn:last-child { border-radius: var(--hu-radius-md); }
37
+ `;
38
+ function readReactive(value) {
39
+ if (typeof value === "function")
40
+ return value();
41
+ if (typeof value === "object" && value !== null && "peek" in value)
42
+ return value.value;
43
+ return value;
44
+ }
45
+ export function ToggleButton(props) {
46
+ injectCSS("hu-toggle-btn", TOGGLE_BTN_CSS);
47
+ const { value, selected, disabled, onChange, children } = props;
48
+ const isSelected = () => selected ? readReactive(selected) : false;
49
+ return h("button", {
50
+ class: () => cn("hu-toggle-btn", isSelected() && "hu-toggle-btn--selected", props.class),
51
+ type: "button",
52
+ "aria-pressed": () => isSelected(),
53
+ disabled,
54
+ onClick: () => onChange?.(value)
55
+ }, children);
56
+ }
57
+ export function ToggleButtonGroup(props) {
58
+ injectCSS("hu-toggle-btn", TOGGLE_BTN_CSS);
59
+ const { value, exclusive = false, orientation = "horizontal", onChange, children = [] } = props;
60
+ const getValue = () => value === undefined ? undefined : readReactive(value);
61
+ const isSelected = (v) => {
62
+ const current = getValue();
63
+ return Array.isArray(current) ? current.includes(v) : current === v;
64
+ };
65
+ const handleChange = (v) => {
66
+ if (!onChange)
67
+ return;
68
+ if (exclusive) {
69
+ onChange(isSelected(v) ? "" : v);
70
+ }
71
+ else {
72
+ const current = getValue();
73
+ const arr = Array.isArray(current) ? current : (current ? [current] : []);
74
+ onChange(isSelected(v) ? arr.filter(x => x !== v) : [...arr, v]);
75
+ }
76
+ };
77
+ return h("div", {
78
+ class: cn("hu-toggle-btn-group", orientation === "vertical" && "hu-toggle-btn-group--vertical", props.class),
79
+ role: "group"
80
+ }, ...children.map(child => ToggleButton({ ...child, selected: () => isSelected(child.value), onChange: handleChange })));
81
+ }
@@ -0,0 +1,14 @@
1
+ import { type Signal } from "@hyperpackai/hyperion";
2
+ import { type VNode } from "../../theme/index.js";
3
+ export interface TooltipProps {
4
+ content: string | unknown;
5
+ side?: "top" | "bottom" | "left" | "right";
6
+ open?: boolean | Signal<boolean>;
7
+ onOpen?: () => void;
8
+ onClose?: () => void;
9
+ onOpenChange?: (open: boolean) => void;
10
+ children?: unknown;
11
+ class?: string;
12
+ }
13
+ export declare function Tooltip(props: TooltipProps): VNode;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Tooltip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAoBpE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CA8BlD"}
@@ -0,0 +1,47 @@
1
+ import { signal } from "@hyperpackai/hyperion";
2
+ import { injectCSS, cn, h } from "../../theme/index.js";
3
+ const TOOLTIP_CSS = `
4
+ .hu-tooltip-wrap { position: relative; display: inline-flex; align-items: center; }
5
+ .hu-tooltip-content {
6
+ position: absolute; z-index: var(--hu-z-tooltip); white-space: nowrap;
7
+ background: color-mix(in srgb, var(--hu-text) 94%, black); color: var(--hu-bg);
8
+ font-size: var(--hu-font-size-xs); line-height: 1.35;
9
+ font-weight: var(--hu-font-weight-medium); padding: 7px 10px; border-radius: var(--hu-radius-md);
10
+ pointer-events: none; box-shadow: var(--hu-shadow-lg);
11
+ border: 1px solid color-mix(in srgb, var(--hu-bg) 14%, transparent);
12
+ animation: hu-scale-in var(--hu-duration-fast) var(--hu-ease);
13
+ max-width: min(280px, 80vw); white-space: normal;
14
+ }
15
+ .hu-tooltip-content--top { bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%); }
16
+ .hu-tooltip-content--bottom { top: calc(100% + 6px); left: 50%; transform: translateX(-50%); }
17
+ .hu-tooltip-content--left { right: calc(100% + 6px); top: 50%; transform: translateY(-50%); }
18
+ .hu-tooltip-content--right { left: calc(100% + 6px); top: 50%; transform: translateY(-50%); }
19
+ `;
20
+ export function Tooltip(props) {
21
+ injectCSS("hu-tooltip", TOOLTIP_CSS);
22
+ const { content, side = "top", children } = props;
23
+ const tooltipNode = () => h("div", { class: cn("hu-tooltip-content", `hu-tooltip-content--${side}`), role: "tooltip" }, content);
24
+ const uncontrolledOpen = signal(false);
25
+ const getOpen = () => typeof props.open === "object" && "peek" in props.open
26
+ ? props.open.value
27
+ : props.open ?? uncontrolledOpen.value;
28
+ const overlay = typeof props.open === "boolean"
29
+ ? (props.open ? tooltipNode() : null)
30
+ : (() => getOpen() ? tooltipNode() : null);
31
+ const setOpen = (next) => {
32
+ if (props.open === undefined)
33
+ uncontrolledOpen.value = next;
34
+ props.onOpenChange?.(next);
35
+ if (next)
36
+ props.onOpen?.();
37
+ else
38
+ props.onClose?.();
39
+ };
40
+ return h("div", { class: cn("hu-tooltip-wrap", props.class) }, h("span", {
41
+ class: "hu-tooltip-trigger",
42
+ onMouseEnter: () => setOpen(true),
43
+ onMouseLeave: () => setOpen(false),
44
+ onFocus: () => setOpen(true),
45
+ onBlur: () => setOpen(false)
46
+ }, children), overlay);
47
+ }
@@ -0,0 +1,19 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface TreeViewItem {
3
+ id: string;
4
+ label: string;
5
+ icon?: unknown;
6
+ badge?: unknown;
7
+ disabled?: boolean;
8
+ children?: TreeViewItem[];
9
+ }
10
+ export interface TreeViewProps {
11
+ items: TreeViewItem[];
12
+ expanded?: string[];
13
+ selected?: string;
14
+ onToggle?: (id: string, expanded: boolean) => void;
15
+ onSelect?: (id: string) => void;
16
+ class?: string;
17
+ }
18
+ export declare function TreeView(props: TreeViewProps): VNode;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TreeView/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAuBpE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAqCpD"}
@@ -0,0 +1,50 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const TREE_VIEW_CSS = `
3
+ .hu-tree { list-style: none; margin: 0; padding: 0; font-size: var(--hu-font-size-sm); color: var(--hu-text); }
4
+ .hu-tree-group { list-style: none; margin: 0; padding: 0 0 0 var(--hu-space-5); }
5
+ [dir="rtl"] .hu-tree-group { padding: 0 var(--hu-space-5) 0 0; }
6
+ .hu-tree-item { margin: 1px 0; }
7
+ .hu-tree-row {
8
+ display: flex; align-items: center; gap: var(--hu-space-2); width: 100%;
9
+ min-height: 32px; padding: 4px var(--hu-space-2); border-radius: var(--hu-radius);
10
+ color: var(--hu-text-2); background: transparent; border: none; text-align: start;
11
+ font: inherit; cursor: pointer;
12
+ }
13
+ .hu-tree-row:hover { background: var(--hu-bg-3); color: var(--hu-text); }
14
+ .hu-tree-row[aria-selected="true"] { background: var(--hu-primary-bg); color: var(--hu-primary); font-weight: var(--hu-font-weight-medium); }
15
+ .hu-tree-row:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 1px; }
16
+ .hu-tree-toggle { width: 16px; display: inline-flex; align-items: center; justify-content: center; color: var(--hu-text-3); flex: none; }
17
+ .hu-tree-toggle--leaf { visibility: hidden; }
18
+ .hu-tree-icon { width: 18px; display: inline-flex; align-items: center; justify-content: center; flex: none; }
19
+ .hu-tree-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
20
+ .hu-tree-badge { margin-inline-start: auto; }
21
+ `;
22
+ export function TreeView(props) {
23
+ injectCSS("hu-tree", TREE_VIEW_CSS);
24
+ const expanded = new Set(props.expanded ?? []);
25
+ const renderItems = (items, level) => items.map((item) => {
26
+ const hasChildren = Boolean(item.children?.length);
27
+ const isExpanded = hasChildren && expanded.has(item.id);
28
+ const isSelected = props.selected === item.id;
29
+ return h("li", { key: item.id, class: "hu-tree-item", role: "none" }, h("button", {
30
+ class: "hu-tree-row",
31
+ role: "treeitem",
32
+ type: "button",
33
+ disabled: item.disabled,
34
+ "aria-level": level,
35
+ "aria-expanded": hasChildren ? String(isExpanded) : undefined,
36
+ "aria-selected": isSelected ? "true" : "false",
37
+ onClick: () => {
38
+ if (item.disabled)
39
+ return;
40
+ if (hasChildren)
41
+ props.onToggle?.(item.id, !isExpanded);
42
+ props.onSelect?.(item.id);
43
+ }
44
+ }, h("span", {
45
+ class: cn("hu-tree-toggle", !hasChildren && "hu-tree-toggle--leaf"),
46
+ "aria-hidden": "true"
47
+ }, isExpanded ? "▾" : "▸"), item.icon && h("span", { class: "hu-tree-icon", "aria-hidden": "true" }, item.icon), h("span", { class: "hu-tree-label" }, item.label), item.badge && h("span", { class: "hu-tree-badge" }, item.badge)), hasChildren && isExpanded && h("ul", { class: "hu-tree-group", role: "group" }, ...renderItems(item.children, level + 1)));
48
+ });
49
+ return h("ul", { class: cn("hu-tree", props.class), role: "tree" }, ...renderItems(props.items, 1));
50
+ }
@@ -0,0 +1,17 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export type TypographyVariant = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "subtitle1" | "subtitle2" | "body1" | "body2" | "caption" | "overline" | "inherit";
3
+ export type TypographyColor = "primary" | "secondary" | "error" | "warning" | "info" | "success";
4
+ export type TypographyAlign = "left" | "center" | "right" | "justify";
5
+ export interface TypographyProps {
6
+ variant?: TypographyVariant;
7
+ component?: string;
8
+ color?: TypographyColor;
9
+ align?: TypographyAlign;
10
+ gutterBottom?: boolean;
11
+ noWrap?: boolean;
12
+ paragraph?: boolean;
13
+ class?: string;
14
+ children?: unknown;
15
+ }
16
+ export declare function Typography(props: TypographyProps): VNode;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Typography/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAuCpE,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAC7J,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AACjG,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CAgBxD"}
@@ -0,0 +1,44 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const TYPOGRAPHY_CSS = `
3
+ .hu-typography { margin: 0; color: var(--hu-text); font-family: var(--hu-font-sans); }
4
+ .hu-typography--h1 { font-size: var(--hu-font-size-5xl); font-weight: var(--hu-font-weight-bold); letter-spacing: -.025em; line-height: 1.1; }
5
+ .hu-typography--h2 { font-size: var(--hu-font-size-4xl); font-weight: var(--hu-font-weight-bold); letter-spacing: -.02em; line-height: 1.15; }
6
+ .hu-typography--h3 { font-size: var(--hu-font-size-3xl); font-weight: var(--hu-font-weight-semibold); letter-spacing: -.015em; line-height: 1.2; }
7
+ .hu-typography--h4 { font-size: var(--hu-font-size-2xl); font-weight: var(--hu-font-weight-semibold); line-height: 1.25; }
8
+ .hu-typography--h5 { font-size: var(--hu-font-size-xl); font-weight: var(--hu-font-weight-semibold); line-height: 1.3; }
9
+ .hu-typography--h6 { font-size: var(--hu-font-size-md); font-weight: var(--hu-font-weight-semibold); line-height: 1.4; }
10
+ .hu-typography--subtitle1 { font-size: var(--hu-font-size-base); font-weight: var(--hu-font-weight-medium); line-height: 1.6; }
11
+ .hu-typography--subtitle2 { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-medium); line-height: 1.6; }
12
+ .hu-typography--body1 { font-size: var(--hu-font-size-base); line-height: 1.7; }
13
+ .hu-typography--body2 { font-size: var(--hu-font-size-sm); line-height: 1.65; }
14
+ .hu-typography--caption { font-size: var(--hu-font-size-xs); line-height: 1.5; color: var(--hu-text-2); }
15
+ .hu-typography--overline { font-size: 11px; font-weight: var(--hu-font-weight-semibold); letter-spacing: .1em; text-transform: uppercase; color: var(--hu-text-2); }
16
+ .hu-typography--inherit { font-size: inherit; font-weight: inherit; line-height: inherit; }
17
+ .hu-typography--gutterBottom { margin-bottom: .35em; }
18
+ .hu-typography--noWrap { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19
+ .hu-typography--paragraph { margin-bottom: var(--hu-space-4); }
20
+ .hu-typography--color-primary { color: var(--hu-primary); }
21
+ .hu-typography--color-secondary { color: var(--hu-text-2); }
22
+ .hu-typography--color-error { color: var(--hu-error); }
23
+ .hu-typography--color-warning { color: var(--hu-warning); }
24
+ .hu-typography--color-info { color: var(--hu-info); }
25
+ .hu-typography--color-success { color: var(--hu-success); }
26
+ .hu-typography--align-left { text-align: left; }
27
+ .hu-typography--align-center { text-align: center; }
28
+ .hu-typography--align-right { text-align: right; }
29
+ .hu-typography--align-justify { text-align: justify; }
30
+ `;
31
+ const VARIANT_TAGS = {
32
+ h1: "h1", h2: "h2", h3: "h3", h4: "h4", h5: "h5", h6: "h6",
33
+ subtitle1: "h6", subtitle2: "h6",
34
+ body1: "p", body2: "p",
35
+ caption: "span", overline: "span", inherit: "span"
36
+ };
37
+ export function Typography(props) {
38
+ injectCSS("hu-typography", TYPOGRAPHY_CSS);
39
+ const { variant = "body1", color, align, gutterBottom, noWrap, paragraph, children } = props;
40
+ const tag = props.component ?? (paragraph ? "p" : VARIANT_TAGS[variant] ?? "span");
41
+ return h(tag, {
42
+ class: cn("hu-typography", `hu-typography--${variant}`, color && `hu-typography--color-${color}`, align && `hu-typography--align-${align}`, gutterBottom && "hu-typography--gutterBottom", noWrap && "hu-typography--noWrap", paragraph && "hu-typography--paragraph", props.class)
43
+ }, children);
44
+ }
@@ -0,0 +1,7 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface VisuallyHiddenProps {
3
+ class?: string;
4
+ children?: unknown;
5
+ }
6
+ export declare function VisuallyHidden(props: VisuallyHiddenProps): VNode;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VisuallyHidden/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAgBpE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,CAGhE"}
@@ -0,0 +1,18 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const CSS = `
3
+ .hu-visually-hidden {
4
+ position: absolute !important;
5
+ width: 1px !important;
6
+ height: 1px !important;
7
+ padding: 0 !important;
8
+ margin: -1px !important;
9
+ overflow: hidden !important;
10
+ clip: rect(0, 0, 0, 0) !important;
11
+ white-space: nowrap !important;
12
+ border: 0 !important;
13
+ }
14
+ `;
15
+ export function VisuallyHidden(props) {
16
+ injectCSS("hu-visually-hidden", CSS);
17
+ return h("span", { class: cn("hu-visually-hidden", props.class) }, props.children);
18
+ }
@@ -0,0 +1,10 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface ZoomProps {
3
+ in: boolean;
4
+ timeout?: number;
5
+ unmountOnExit?: boolean;
6
+ class?: string;
7
+ children?: unknown;
8
+ }
9
+ export declare function Zoom(props: ZoomProps): VNode | null;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Zoom/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAQpE,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AAEzH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,IAAI,CAKnD"}