@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 HyperPack contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # @hyperpackai/hyperui
2
+
3
+ > Rich, accessible, enterprise-grade UI component library for Hyperion.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ npm install @hyperpackai/hyperui
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ ```ts
14
+ import { initHyperUI, ThemeProvider, Button, Dialog, DataTable, useToast } from "@hyperpackai/hyperui";
15
+ import { applyTheme, createTheme } from "@hyperpackai/hyperui/tokens";
16
+
17
+ // Initialise with system dark mode
18
+ initHyperUI({ theme: "system" });
19
+
20
+ // Or apply a built-in theme preset
21
+ applyTheme("compact"); // "default" | "compact" | "comfortable" | "ocean" | "forest" | "sunset" | "violet" | "monochrome" | "highContrast"
22
+
23
+ // Or use the provider API with industry themes
24
+ ThemeProvider({
25
+ theme: "banking",
26
+ colorMode: "system",
27
+ direction: "ltr",
28
+ children: App()
29
+ });
30
+
31
+ // Build a custom brand theme
32
+ const myBrand = createTheme("default", { primaryColor: "#7c3aed", radius: "12px" });
33
+ applyTheme(myBrand);
34
+ ```
35
+
36
+ Industry presets: `banking`, `government`, `healthcare`, `retail`, `education`, `telecom`.
37
+
38
+ ## Components
39
+
40
+ | Category | Components |
41
+ |---|---|
42
+ | Form | Form · FormField · FormSection · WizardForm · DynamicForm · ValidationEngine · Button · Label · Input · Textarea · Checkbox · Radio · Switch · Select · TextField · Autocomplete · Slider · Rating · FormControl |
43
+ | Date & Time | Calendar · DatePicker · TimePicker · DateTimePicker · DateRangePicker |
44
+ | Overlay | Dialog · Modal · Sheet · Drawer · Backdrop · Toast · Snackbar · Tooltip · Popover · DropdownMenu · Menu |
45
+ | Layout | Box · Container · Grid · Stack · Paper · Card · PageLayout · DashboardLayout · SplitPane · ResizablePanel · Navbar · Sidebar · Breadcrumb · Pagination · List · ImageList |
46
+ | Data | DataGrid · DataTable · VirtualTable · TreeGrid · PivotGrid · AdvancedFilters · SearchBuilder · DataExporter · DataImporter |
47
+ | Charts | LineChart · BarChart · PieChart · AreaChart · RadarChart · HeatMap · GaugeChart · Sparkline · FinancialChart · CandlestickChart |
48
+ | Enterprise | ApprovalFlow · AuditTrail · PermissionMatrix · RoleManager · FeatureFlags · TenantSelector · NotificationCenter · ActivityFeed · OrgChart · GanttChart · KanbanBoard · WorkflowDesigner · DocumentViewer |
49
+ | AI | AIChat · AIForm · AIGrid · AIChart · AIDashboard · AIInsights · AIWizard · AIReport |
50
+ | Feedback | Alert · Badge · Avatar · AvatarGroup · Chip · Spinner · Skeleton · Progress |
51
+ | Navigation | Tabs · Accordion · Stepper · Timeline · TreeView |
52
+ | Typography | Typography · Link · Divider |
53
+
54
+ ## Enterprise Architecture
55
+
56
+ HyperUI's production roadmap, package split, component inventory, accessibility standards, testing standards, AI-native patterns, A2UI architecture, and release gates are defined in [ARCHITECTURE.md](./ARCHITECTURE.md).
57
+
58
+ Per-component implementation contracts are defined in [COMPONENT_BLUEPRINT.md](./COMPONENT_BLUEPRINT.md).
59
+
60
+ ## Design Token System
61
+
62
+ ```ts
63
+ import { tokens, useTokens, tokenToCSS, exportTokens } from "@hyperpackai/hyperui/tokens";
64
+
65
+ tokens.colors.indigo[500] // "#6366f1"
66
+ tokens.spacing[4] // "16px"
67
+ tokens.fontSize.xl[0] // "20px"
68
+
69
+ // Reactive theme in components
70
+ const { isDark } = useTokens();
71
+
72
+ // SSR head injection
73
+ const css = tokenToCSS(myBrand);
74
+
75
+ // Export for Figma / Style Dictionary
76
+ const json = exportTokens();
77
+ ```
78
+
79
+ ## Requirements
80
+
81
+ Node.js ≥ 20 (build) · Modern browser (runtime)
82
+ Peer dependency: `@hyperpackai/hyperion ^0.1.0`
@@ -0,0 +1,17 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface AccordionItem {
3
+ id: string;
4
+ title: string;
5
+ content: unknown;
6
+ icon?: unknown;
7
+ disabled?: boolean;
8
+ }
9
+ export interface AccordionProps {
10
+ items: AccordionItem[];
11
+ multiple?: boolean;
12
+ defaultOpen?: string[];
13
+ variant?: "default" | "ghost";
14
+ class?: string;
15
+ }
16
+ export declare function Accordion(props: AccordionProps): VNode;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAsBpE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CAqCtD"}
@@ -0,0 +1,46 @@
1
+ import { signal } from "@hyperpackai/hyperion";
2
+ import { injectCSS, cn, h } from "../../theme/index.js";
3
+ const ACCORDION_CSS = `
4
+ .hu-accordion { border: 1px solid var(--hu-border); border-radius: var(--hu-radius-md); overflow: hidden; }
5
+ .hu-accordion-item { border-bottom: 1px solid var(--hu-border); }
6
+ .hu-accordion-item:last-child { border-bottom: none; }
7
+ .hu-accordion-trigger {
8
+ display: flex; align-items: center; justify-content: space-between; width: 100%;
9
+ padding: var(--hu-space-4) var(--hu-space-5); background: transparent; border: none;
10
+ font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-medium); color: var(--hu-text);
11
+ cursor: pointer; text-align: left; transition: background var(--hu-duration) var(--hu-ease);
12
+ }
13
+ .hu-accordion-trigger:hover { background: var(--hu-bg-2); }
14
+ .hu-accordion-trigger[aria-expanded="true"] { color: var(--hu-primary); }
15
+ .hu-accordion-icon { width: 16px; height: 16px; flex-shrink: 0; color: var(--hu-text-3); transition: transform var(--hu-duration) var(--hu-ease); }
16
+ .hu-accordion-trigger[aria-expanded="true"] .hu-accordion-icon { transform: rotate(180deg); color: var(--hu-primary); }
17
+ .hu-accordion-content { padding: 0 var(--hu-space-5) var(--hu-space-4); font-size: var(--hu-font-size-sm); color: var(--hu-text-2); line-height: 1.6; animation: hu-slide-down var(--hu-duration-fast) var(--hu-ease); }
18
+ .hu-accordion--ghost { border: none; }
19
+ .hu-accordion--ghost .hu-accordion-item { border-bottom: 1px solid var(--hu-border); }
20
+ .hu-accordion--ghost .hu-accordion-item:last-child { border-bottom: none; }
21
+ `;
22
+ export function Accordion(props) {
23
+ injectCSS("hu-accordion", ACCORDION_CSS);
24
+ const { items, multiple = false, defaultOpen = [], variant = "default" } = props;
25
+ const open = signal(defaultOpen);
26
+ const toggle = (id) => {
27
+ const current = open.value;
28
+ if (multiple) {
29
+ open.value = current.includes(id) ? current.filter((i) => i !== id) : [...current, id];
30
+ }
31
+ else {
32
+ open.value = current.includes(id) ? [] : [id];
33
+ }
34
+ };
35
+ const chevronSVG = `<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M4 6l4 4 4-4"/></svg>`;
36
+ return h("div", { class: cn("hu-accordion", variant !== "default" && `hu-accordion--${variant}`, props.class) }, ...items.map((item) => {
37
+ const isOpen = () => open.value.includes(item.id);
38
+ return h("div", { key: item.id, class: "hu-accordion-item" }, h("button", {
39
+ class: "hu-accordion-trigger",
40
+ "aria-expanded": () => isOpen() ? "true" : "false",
41
+ "aria-controls": `accordion-${item.id}`,
42
+ disabled: item.disabled,
43
+ onClick: () => toggle(item.id)
44
+ }, h("span", { style: "display:flex;align-items:center;gap:8px;" }, item.icon && h("span", {}, item.icon), item.title), h("span", { class: "hu-accordion-icon", innerHTML: chevronSVG, "aria-hidden": "true" })), () => isOpen() ? h("div", { id: `accordion-${item.id}`, class: "hu-accordion-content" }, item.content) : null);
45
+ }));
46
+ }
@@ -0,0 +1,13 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface AlertProps {
3
+ type?: "info" | "success" | "warning" | "error";
4
+ title?: string;
5
+ description?: string;
6
+ icon?: unknown | false;
7
+ onClose?: () => void;
8
+ closeLabel?: string;
9
+ class?: string;
10
+ children?: unknown;
11
+ }
12
+ export declare function Alert(props: AlertProps): VNode;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Alert/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAoCpE,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAoB9C"}
@@ -0,0 +1,46 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const ALERT_CSS = `
3
+ .hu-alert {
4
+ display: flex; align-items: flex-start; gap: var(--hu-space-3);
5
+ padding: var(--hu-space-4); border-radius: var(--hu-radius-lg);
6
+ border: 1px solid; font-size: var(--hu-font-size-sm);
7
+ box-shadow: var(--hu-shadow-xs);
8
+ }
9
+ .hu-alert--info { background: var(--hu-info-bg); border-color: var(--hu-info); color: var(--hu-info-text); }
10
+ .hu-alert--success { background: var(--hu-success-bg); border-color: var(--hu-success); color: var(--hu-success-text); }
11
+ .hu-alert--warning { background: var(--hu-warning-bg); border-color: var(--hu-warning); color: var(--hu-warning-text); }
12
+ .hu-alert--error { background: var(--hu-error-bg); border-color: var(--hu-error); color: var(--hu-error-text); }
13
+ .hu-alert-icon { width: 18px; height: 18px; flex-shrink: 0; margin-top: 1px; }
14
+ .hu-alert-content { flex: 1; min-width: 0; }
15
+ .hu-alert-title { font-weight: var(--hu-font-weight-semibold); margin-bottom: 2px; }
16
+ .hu-alert-desc { opacity: .85; line-height: 1.45; }
17
+ .hu-alert-close {
18
+ display: inline-flex; align-items: center; justify-content: center;
19
+ width: 28px; height: 28px; border-radius: var(--hu-radius-md);
20
+ background: color-mix(in srgb, currentColor 6%, transparent);
21
+ border: 1px solid color-mix(in srgb, currentColor 14%, transparent);
22
+ color: currentColor; cursor: pointer; opacity: .72; padding: 0; flex-shrink: 0;
23
+ transition: background var(--hu-duration) var(--hu-ease), border-color var(--hu-duration) var(--hu-ease), opacity var(--hu-duration) var(--hu-ease), transform var(--hu-duration-fast) var(--hu-ease);
24
+ }
25
+ .hu-alert-close:hover { opacity: 1; background: color-mix(in srgb, currentColor 10%, transparent); border-color: color-mix(in srgb, currentColor 24%, transparent); transform: translateY(-1px); }
26
+ .hu-alert-close:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
27
+ `;
28
+ const ALERT_ICONS = {
29
+ 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>`,
30
+ 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>`,
31
+ 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>`,
32
+ 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>`
33
+ };
34
+ export function Alert(props) {
35
+ injectCSS("hu-alert", ALERT_CSS);
36
+ const { type = "info", title, description, icon, children } = props;
37
+ const iconContent = icon === false ? null : icon ?? h("span", { innerHTML: ALERT_ICONS[type], "aria-hidden": "true" });
38
+ const closeSVG = `<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2"><path d="M2 2l12 12M14 2L2 14"/></svg>`;
39
+ return h("div", { class: cn("hu-alert", `hu-alert--${type}`, props.class), role: "alert" }, iconContent && h("span", { class: "hu-alert-icon" }, iconContent), h("div", { class: "hu-alert-content" }, title && h("div", { class: "hu-alert-title" }, title), (description || children) && h("div", { class: "hu-alert-desc" }, description ?? children)), props.onClose && h("button", {
40
+ class: "hu-alert-close",
41
+ type: "button",
42
+ onClick: props.onClose,
43
+ "aria-label": props.closeLabel ?? "Dismiss alert",
44
+ innerHTML: closeSVG
45
+ }));
46
+ }
@@ -0,0 +1,19 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export type AppBarPosition = "fixed" | "sticky" | "static" | "absolute" | "relative";
3
+ export type AppBarColor = "primary" | "default" | "dark" | "transparent" | "inherit";
4
+ export interface AppBarProps {
5
+ position?: AppBarPosition;
6
+ color?: AppBarColor;
7
+ elevation?: 0 | 1 | 2 | 3 | 4;
8
+ class?: string;
9
+ children?: unknown;
10
+ }
11
+ export declare function AppBar(props: AppBarProps): VNode;
12
+ export interface ToolbarProps {
13
+ dense?: boolean;
14
+ class?: string;
15
+ children?: unknown;
16
+ }
17
+ export declare function Toolbar(props: ToolbarProps): VNode;
18
+ export declare function ToolbarSpacer(): VNode;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AppBar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAoCpE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AACrF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAMhD;AAED,MAAM,WAAW,YAAY;IAAG,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AACrF,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAGlD;AAED,wBAAgB,aAAa,IAAI,KAAK,CAErC"}
@@ -0,0 +1,48 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const CSS = `
3
+ .hu-appbar {
4
+ display: flex; align-items: center; width: 100%; box-sizing: border-box;
5
+ font-family: var(--hu-font-sans); z-index: 100;
6
+ transition: box-shadow var(--hu-duration) var(--hu-ease), background var(--hu-duration) var(--hu-ease);
7
+ }
8
+ .hu-appbar--fixed { position: fixed; top: 0; left: 0; right: 0; }
9
+ .hu-appbar--sticky { position: sticky; top: 0; }
10
+ .hu-appbar--static { position: static; }
11
+ .hu-appbar--absolute { position: absolute; top: 0; left: 0; right: 0; }
12
+ .hu-appbar--relative { position: relative; }
13
+
14
+ .hu-appbar--primary { background: var(--hu-primary); color: var(--hu-primary-text); }
15
+ .hu-appbar--default { background: var(--hu-bg); color: var(--hu-text); border-bottom: 1px solid var(--hu-border); }
16
+ .hu-appbar--dark { background: #111827; color: #f9fafb; }
17
+ .hu-appbar--transparent { background: transparent; box-shadow: none; }
18
+ .hu-appbar--inherit { background: inherit; color: inherit; }
19
+
20
+ .hu-appbar--elevation-0 { box-shadow: none; }
21
+ .hu-appbar--elevation-1 { box-shadow: 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.08); }
22
+ .hu-appbar--elevation-2 { box-shadow: 0 3px 6px rgba(0,0,0,.15), 0 2px 4px rgba(0,0,0,.1); }
23
+ .hu-appbar--elevation-3 { box-shadow: 0 8px 16px rgba(0,0,0,.18), 0 3px 6px rgba(0,0,0,.12); }
24
+ .hu-appbar--elevation-4 { box-shadow: 0 16px 32px rgba(0,0,0,.2), 0 6px 12px rgba(0,0,0,.14); }
25
+
26
+ .hu-toolbar {
27
+ display: flex; align-items: center; gap: var(--hu-space-2);
28
+ width: 100%; min-height: 56px;
29
+ padding-left: var(--hu-space-4); padding-right: var(--hu-space-4);
30
+ }
31
+ .hu-toolbar--dense { min-height: 48px; }
32
+ .hu-toolbar--spacer { flex: 1; }
33
+ .hu-toolbar__title { font-size: var(--hu-font-size-md); font-weight: var(--hu-font-weight-semibold); flex: 1; }
34
+ `;
35
+ export function AppBar(props) {
36
+ injectCSS("hu-appbar", CSS);
37
+ const { position = "sticky", color = "default", elevation = 1 } = props;
38
+ return h("header", {
39
+ class: cn("hu-appbar", `hu-appbar--${position}`, `hu-appbar--${color}`, `hu-appbar--elevation-${elevation}`, props.class)
40
+ }, props.children);
41
+ }
42
+ export function Toolbar(props) {
43
+ injectCSS("hu-appbar", CSS);
44
+ return h("div", { class: cn("hu-toolbar", props.dense && "hu-toolbar--dense", props.class) }, props.children);
45
+ }
46
+ export function ToolbarSpacer() {
47
+ return h("span", { class: "hu-toolbar__spacer" });
48
+ }
@@ -0,0 +1,8 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface AspectRatioProps {
3
+ ratio?: number | `${number}/${number}` | `${number} / ${number}`;
4
+ class?: string;
5
+ children?: unknown;
6
+ }
7
+ export declare function AspectRatio(props?: AspectRatioProps): VNode;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AspectRatio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAmBpE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,MAAM,MAAM,EAAE,CAAC;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD,wBAAgB,WAAW,CAAC,KAAK,GAAE,gBAAqB,GAAG,KAAK,CAQ/D"}
@@ -0,0 +1,32 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const ASPECT_RATIO_CSS = `
3
+ .hu-aspect-ratio {
4
+ position: relative;
5
+ width: 100%;
6
+ aspect-ratio: var(--hu-aspect-ratio, 16 / 9);
7
+ overflow: hidden;
8
+ }
9
+ .hu-aspect-ratio > img,
10
+ .hu-aspect-ratio > video,
11
+ .hu-aspect-ratio > iframe,
12
+ .hu-aspect-ratio > canvas {
13
+ width: 100%;
14
+ height: 100%;
15
+ object-fit: cover;
16
+ }
17
+ `;
18
+ function ratioValue(value) {
19
+ if (value === undefined)
20
+ return "16 / 9";
21
+ if (typeof value === "number")
22
+ return String(value);
23
+ return value.replace(/\s+/g, " ");
24
+ }
25
+ export function AspectRatio(props = {}) {
26
+ injectCSS("hu-aspect-ratio", ASPECT_RATIO_CSS);
27
+ const ratio = ratioValue(props.ratio);
28
+ return h("div", {
29
+ class: cn("hu-aspect-ratio", props.class),
30
+ style: `--hu-aspect-ratio:${ratio};aspect-ratio:${ratio}`
31
+ }, props.children);
32
+ }
@@ -0,0 +1,21 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface AutocompleteOption {
3
+ label: string;
4
+ value: string;
5
+ group?: string;
6
+ disabled?: boolean;
7
+ }
8
+ export interface AutocompleteProps {
9
+ options: AutocompleteOption[];
10
+ value?: string;
11
+ placeholder?: string;
12
+ label?: string;
13
+ multiple?: boolean;
14
+ clearable?: boolean;
15
+ disabled?: boolean;
16
+ noOptionsText?: string;
17
+ onChange?: (value: string | null) => void;
18
+ class?: string;
19
+ }
20
+ export declare function Autocomplete(props: AutocompleteProps): VNode;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Autocomplete/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAqDpE,MAAM,WAAW,kBAAkB;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AAExG,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,KAAK,CA+D5D"}
@@ -0,0 +1,94 @@
1
+ import { signal } from "@hyperpackai/hyperion";
2
+ import { injectCSS, cn, h } from "../../theme/index.js";
3
+ const AUTOCOMPLETE_CSS = `
4
+ .hu-autocomplete { position: relative; width: 100%; display: flex; flex-direction: column; gap: 6px; }
5
+ .hu-autocomplete__label { color: var(--hu-text); font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); line-height: 1.35; }
6
+ .hu-autocomplete__input-wrap { position: relative; }
7
+ .hu-autocomplete__input {
8
+ width: 100%; min-height: 40px; padding: 9px 42px 9px 12px;
9
+ font-size: var(--hu-font-size-sm); font-family: var(--hu-font-sans);
10
+ background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2)); color: var(--hu-text);
11
+ border: 1px solid var(--hu-border); border-radius: var(--hu-radius-md);
12
+ outline: none; box-sizing: border-box;
13
+ transition: border-color var(--hu-duration) var(--hu-ease), box-shadow var(--hu-duration) var(--hu-ease), background var(--hu-duration) var(--hu-ease);
14
+ box-shadow: var(--hu-shadow-xs);
15
+ }
16
+ .hu-autocomplete__input::placeholder { color: var(--hu-text-3); }
17
+ .hu-autocomplete__input:hover:not(:disabled) { border-color: color-mix(in srgb, var(--hu-primary) 35%, var(--hu-border-2)); }
18
+ .hu-autocomplete__input: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); }
19
+ .hu-autocomplete__input:disabled { opacity: .55; cursor: not-allowed; background: var(--hu-bg-3); }
20
+ .hu-autocomplete__arrow {
21
+ position: absolute; right: 12px; top: 50%; transform: translateY(-50%);
22
+ color: var(--hu-text-3); pointer-events: none; font-size: 12px; transition: transform var(--hu-duration);
23
+ }
24
+ .hu-autocomplete--open .hu-autocomplete__arrow { transform: translateY(-50%) rotate(180deg); }
25
+ .hu-autocomplete__clear {
26
+ position: absolute; right: 32px; top: 50%; transform: translateY(-50%);
27
+ width: 22px; height: 22px; display: inline-grid; place-items: center;
28
+ background: var(--hu-bg-3); border: 1px solid var(--hu-border); border-radius: var(--hu-radius-full);
29
+ cursor: pointer; color: var(--hu-text-2); font-size: 14px; line-height: 1; padding: 0;
30
+ }
31
+ .hu-autocomplete__clear:hover { color: var(--hu-text); border-color: var(--hu-border-2); }
32
+ .hu-autocomplete__input:has(+ .hu-autocomplete__clear) { padding-right: 68px; }
33
+ .hu-autocomplete__listbox-wrap {
34
+ position: absolute; top: calc(100% + 8px); left: 0; right: 0; z-index: var(--hu-z-popover);
35
+ padding: 4px; background: var(--hu-bg); border: 1px solid color-mix(in srgb, var(--hu-border) 82%, var(--hu-primary));
36
+ border-radius: var(--hu-radius-lg); box-shadow: var(--hu-shadow-xl);
37
+ }
38
+ .hu-autocomplete__listbox {
39
+ max-height: 260px; overflow-y: auto; padding: 0; margin: 0; list-style: none; scrollbar-width: thin;
40
+ }
41
+ .hu-autocomplete__option {
42
+ padding: 9px 10px; cursor: pointer; border-radius: var(--hu-radius);
43
+ font-size: var(--hu-font-size-sm); color: var(--hu-text); display: flex; align-items: center; gap: var(--hu-space-2);
44
+ transition: background var(--hu-duration-fast) var(--hu-ease), color var(--hu-duration-fast) var(--hu-ease);
45
+ }
46
+ .hu-autocomplete__option:hover, .hu-autocomplete__option--focused { background: var(--hu-bg-3); }
47
+ .hu-autocomplete__option--selected { background: var(--hu-primary-bg); color: var(--hu-primary); font-weight: var(--hu-font-weight-semibold); }
48
+ .hu-autocomplete__option--disabled { opacity: .5; cursor: not-allowed; }
49
+ .hu-autocomplete__check { margin-inline-start: auto; color: var(--hu-primary); font-size: 12px; }
50
+ .hu-autocomplete__no-options { padding: var(--hu-space-5); font-size: var(--hu-font-size-sm); color: var(--hu-text-2); text-align: center; }
51
+ .hu-autocomplete__group-label { padding: var(--hu-space-2) var(--hu-space-3); font-size: var(--hu-font-size-xs); font-weight: var(--hu-font-weight-semibold); color: var(--hu-text-3); text-transform: uppercase; letter-spacing: .06em; }
52
+ `;
53
+ export function Autocomplete(props) {
54
+ injectCSS("hu-autocomplete", AUTOCOMPLETE_CSS);
55
+ const { options, placeholder, label, clearable, disabled, noOptionsText = "No options", onChange } = props;
56
+ const inputVal = signal(props.value ? (options.find(o => o.value === props.value)?.label ?? "") : "");
57
+ const isOpen = signal(false);
58
+ const selected = signal(props.value ?? "");
59
+ const filtered = () => options.filter(o => !inputVal.value || o.label.toLowerCase().includes(inputVal.value.toLowerCase()));
60
+ return h("div", {
61
+ class: cn("hu-autocomplete", isOpen.value && "hu-autocomplete--open", props.class)
62
+ }, label && h("label", { class: "hu-autocomplete__label" }, label), h("div", { class: "hu-autocomplete__input-wrap" }, h("input", {
63
+ class: "hu-autocomplete__input",
64
+ value: inputVal.value, placeholder, disabled,
65
+ onFocus: () => { isOpen.value = true; },
66
+ onInput: (e) => { inputVal.value = e.target.value; isOpen.value = true; },
67
+ onBlur: () => setTimeout(() => { isOpen.value = false; }, 150)
68
+ }), clearable && selected.value && h("button", {
69
+ class: "hu-autocomplete__clear",
70
+ type: "button",
71
+ onMouseDown: (e) => {
72
+ e.preventDefault();
73
+ selected.value = "";
74
+ inputVal.value = "";
75
+ onChange?.(null);
76
+ }
77
+ }, "×"), h("span", { class: "hu-autocomplete__arrow" }, "▾")), isOpen.value && h("div", { class: "hu-autocomplete__listbox-wrap" }, h("ul", { class: "hu-autocomplete__listbox", role: "listbox" }, filtered().length === 0
78
+ ? h("li", { class: "hu-autocomplete__no-options" }, noOptionsText)
79
+ : filtered().map(opt => h("li", {
80
+ class: cn("hu-autocomplete__option", selected.value === opt.value && "hu-autocomplete__option--selected", opt.disabled && "hu-autocomplete__option--disabled"),
81
+ role: "option",
82
+ "aria-selected": selected.value === opt.value,
83
+ "aria-disabled": opt.disabled ? "true" : undefined,
84
+ onMouseDown: (e) => {
85
+ e.preventDefault();
86
+ if (opt.disabled)
87
+ return;
88
+ selected.value = opt.value;
89
+ inputVal.value = opt.label;
90
+ isOpen.value = false;
91
+ onChange?.(opt.value);
92
+ }
93
+ }, opt.label, selected.value === opt.value && h("span", { class: "hu-autocomplete__check", "aria-hidden": "true" }, "✓"))))));
94
+ }
@@ -0,0 +1,12 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface AvatarProps {
3
+ src?: string;
4
+ alt?: string;
5
+ name?: string;
6
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
7
+ shape?: "circle" | "square";
8
+ color?: string;
9
+ class?: string;
10
+ }
11
+ export declare function Avatar(props: AvatarProps): VNode;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAsBpE,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAChD,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAehD"}
@@ -0,0 +1,32 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const AVATAR_CSS = `
3
+ .hu-avatar {
4
+ display: inline-flex; align-items: center; justify-content: center;
5
+ border-radius: var(--hu-radius-full); overflow: hidden; flex-shrink: 0;
6
+ background: var(--hu-primary-bg); color: var(--hu-primary);
7
+ font-weight: var(--hu-font-weight-semibold); user-select: none;
8
+ }
9
+ .hu-avatar img { width: 100%; height: 100%; object-fit: cover; }
10
+ .hu-avatar--xs { width: 24px; height: 24px; font-size: 10px; }
11
+ .hu-avatar--sm { width: 32px; height: 32px; font-size: 12px; }
12
+ .hu-avatar--md { width: 40px; height: 40px; font-size: 14px; }
13
+ .hu-avatar--lg { width: 48px; height: 48px; font-size: 16px; }
14
+ .hu-avatar--xl { width: 64px; height: 64px; font-size: 22px; }
15
+ .hu-avatar--2xl { width: 80px; height: 80px; font-size: 28px; }
16
+ .hu-avatar--square { border-radius: var(--hu-radius-md); }
17
+ .hu-avatar-group { display: flex; }
18
+ .hu-avatar-group .hu-avatar { border: 2px solid var(--hu-bg); margin-left: -8px; }
19
+ .hu-avatar-group .hu-avatar:first-child { margin-left: 0; }
20
+ `;
21
+ export function Avatar(props) {
22
+ injectCSS("hu-avatar", AVATAR_CSS);
23
+ const { src, alt, name, size = "md", shape = "circle" } = props;
24
+ const initials = name
25
+ ? name.split(" ").slice(0, 2).map((p) => p[0]?.toUpperCase() ?? "").join("")
26
+ : "?";
27
+ return h("span", {
28
+ class: cn("hu-avatar", `hu-avatar--${size}`, shape === "square" && "hu-avatar--square", props.class),
29
+ style: props.color ? `background: ${props.color}20; color: ${props.color}` : undefined,
30
+ "aria-label": alt ?? name
31
+ }, src ? h("img", { src, alt: alt ?? name ?? "", loading: "lazy" }) : initials);
32
+ }
@@ -0,0 +1,9 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface AvatarGroupProps {
3
+ max?: number;
4
+ size?: "sm" | "md" | "lg" | "xl";
5
+ class?: string;
6
+ children?: unknown[];
7
+ }
8
+ export declare function AvatarGroup(props: AvatarGroupProps): VNode;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AvatarGroup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAcpE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK,CAa1D"}
@@ -0,0 +1,24 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const AVATAR_GROUP_CSS = `
3
+ .hu-avatar-group { display: flex; flex-direction: row-reverse; }
4
+ .hu-avatar-group .hu-avatar { margin-left: -8px; border: 2px solid var(--hu-bg); ring: none; }
5
+ .hu-avatar-group .hu-avatar:last-child { margin-left: 0; }
6
+ .hu-avatar-group__extra {
7
+ display: flex; align-items: center; justify-content: center;
8
+ border-radius: 50%; background: var(--hu-bg-3); border: 2px solid var(--hu-bg);
9
+ font-size: var(--hu-font-size-xs); font-weight: var(--hu-font-weight-semibold);
10
+ color: var(--hu-text-2); flex-shrink: 0; margin-left: -8px;
11
+ }
12
+ `;
13
+ const AVATAR_SIZES = { sm: "24px", md: "32px", lg: "40px", xl: "48px" };
14
+ export function AvatarGroup(props) {
15
+ injectCSS("hu-avatar-group", AVATAR_GROUP_CSS);
16
+ const { max = 5, size = "md", children = [] } = props;
17
+ const sz = AVATAR_SIZES[size] ?? "32px";
18
+ const visible = children.slice(0, max);
19
+ const extra = children.length - max;
20
+ return h("div", { class: cn("hu-avatar-group", props.class) }, ...visible, extra > 0 && h("div", {
21
+ class: "hu-avatar-group__extra",
22
+ style: `width:${sz};height:${sz};`
23
+ }, `+${extra}`));
24
+ }
@@ -0,0 +1,10 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface BackdropProps {
3
+ open: boolean;
4
+ invisible?: boolean;
5
+ onClick?: (e: MouseEvent) => void;
6
+ class?: string;
7
+ children?: unknown;
8
+ }
9
+ export declare function Backdrop(props: BackdropProps): VNode | null;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Backdrop/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAiBpE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,GAAG,IAAI,CAQ3D"}
@@ -0,0 +1,25 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ import { renderInPortal } from "../../portal.js";
3
+ const CSS = `
4
+ .hu-backdrop {
5
+ position: fixed; inset: 0; z-index: var(--hu-z-backdrop);
6
+ background: var(--hu-overlay);
7
+ display: flex; align-items: center; justify-content: center;
8
+ transition: opacity var(--hu-duration) var(--hu-ease);
9
+ }
10
+ .hu-backdrop--invisible { background: transparent; }
11
+ .hu-backdrop--enter { opacity: 0; animation: hu-backdrop-in var(--hu-duration) var(--hu-ease) forwards; }
12
+ .hu-backdrop--exit { animation: hu-backdrop-out var(--hu-duration) var(--hu-ease) forwards; }
13
+ @keyframes hu-backdrop-in { from { opacity: 0; } to { opacity: 1; } }
14
+ @keyframes hu-backdrop-out { from { opacity: 1; } to { opacity: 0; } }
15
+ `;
16
+ export function Backdrop(props) {
17
+ injectCSS("hu-backdrop", CSS);
18
+ if (!props.open)
19
+ return null;
20
+ return renderInPortal(h("div", {
21
+ class: cn("hu-backdrop", props.invisible && "hu-backdrop--invisible", props.class),
22
+ onClick: props.onClick,
23
+ "aria-hidden": "true"
24
+ }, props.children), "backdrop");
25
+ }
@@ -0,0 +1,10 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface BadgeProps {
3
+ variant?: "default" | "primary" | "success" | "warning" | "error" | "info" | "solid-primary" | "solid-success" | "solid-error";
4
+ size?: "xs" | "sm" | "md" | "lg";
5
+ dot?: boolean;
6
+ class?: string;
7
+ children?: unknown;
8
+ }
9
+ export declare function Badge(props: BadgeProps): VNode;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Badge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAyBpE,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,aAAa,CAAC;IAC/H,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAM9C"}