@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,69 @@
1
+ import { onCleanup, onMount } from "@hyperpackai/hyperion";
2
+ import { h } from "../../theme/index.js";
3
+ const FOCUSABLE_SELECTOR = [
4
+ "a[href]",
5
+ "button:not([disabled])",
6
+ "textarea:not([disabled])",
7
+ "input:not([disabled])",
8
+ "select:not([disabled])",
9
+ "[tabindex]:not([tabindex='-1'])"
10
+ ].join(",");
11
+ export function FocusTrap(props) {
12
+ let root = null;
13
+ const active = props.active ?? true;
14
+ const restoreFocus = props.restoreFocus ?? true;
15
+ const autoFocus = props.autoFocus ?? true;
16
+ if (typeof document !== "undefined" && active) {
17
+ const previouslyFocused = document.activeElement instanceof HTMLElement ? document.activeElement : null;
18
+ const getFocusable = () => root
19
+ ? Array.from(root.querySelectorAll(FOCUSABLE_SELECTOR))
20
+ .filter((node) => !node.hasAttribute("disabled") && node.getAttribute("aria-hidden") !== "true")
21
+ : [];
22
+ const focusFirst = () => {
23
+ const nodes = getFocusable();
24
+ (nodes[0] ?? root)?.focus();
25
+ };
26
+ const onKeyDown = (event) => {
27
+ if (!root)
28
+ return;
29
+ if (event.key === "Escape") {
30
+ props.onEscape?.();
31
+ return;
32
+ }
33
+ if (event.key !== "Tab")
34
+ return;
35
+ const nodes = getFocusable();
36
+ if (nodes.length === 0) {
37
+ event.preventDefault();
38
+ root.focus();
39
+ return;
40
+ }
41
+ const first = nodes[0];
42
+ const last = nodes[nodes.length - 1];
43
+ const current = document.activeElement;
44
+ if (event.shiftKey && current === first) {
45
+ event.preventDefault();
46
+ last.focus();
47
+ }
48
+ else if (!event.shiftKey && current === last) {
49
+ event.preventDefault();
50
+ first.focus();
51
+ }
52
+ };
53
+ onMount(() => {
54
+ root?.addEventListener("keydown", onKeyDown);
55
+ if (autoFocus)
56
+ queueMicrotask(focusFirst);
57
+ });
58
+ onCleanup(() => {
59
+ root?.removeEventListener("keydown", onKeyDown);
60
+ if (restoreFocus && previouslyFocused?.isConnected)
61
+ previouslyFocused.focus();
62
+ });
63
+ }
64
+ return h("div", {
65
+ class: props.class,
66
+ tabindex: "-1",
67
+ ref: (node) => { root = node; }
68
+ }, props.children);
69
+ }
@@ -0,0 +1,34 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface FormControlProps {
3
+ fullWidth?: boolean;
4
+ row?: boolean;
5
+ error?: boolean;
6
+ disabled?: boolean;
7
+ required?: boolean;
8
+ class?: string;
9
+ children?: unknown;
10
+ }
11
+ export declare function FormControl(props: FormControlProps): VNode;
12
+ export interface FormGroupProps {
13
+ row?: boolean;
14
+ class?: string;
15
+ children?: unknown;
16
+ }
17
+ export declare function FormGroup(props: FormGroupProps): VNode;
18
+ export interface FormLabelProps {
19
+ required?: boolean;
20
+ focused?: boolean;
21
+ error?: boolean;
22
+ for?: string;
23
+ class?: string;
24
+ children?: unknown;
25
+ }
26
+ export declare function FormLabel(props: FormLabelProps): VNode;
27
+ export interface FormHelperTextProps {
28
+ error?: boolean;
29
+ success?: boolean;
30
+ class?: string;
31
+ children?: unknown;
32
+ }
33
+ export declare function FormHelperText(props: FormHelperTextProps): VNode;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FormControl/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AA8BpE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK,CAa1D;AAED,MAAM,WAAW,cAAc;IAAG,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AACrF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CAGtD;AAED,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AAC5I,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CAMtD;AAED,MAAM,WAAW,mBAAmB;IAAG,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AAC/G,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,CAKhE"}
@@ -0,0 +1,52 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const FORM_CSS = `
3
+ .hu-form-control { display: flex; flex-direction: column; gap: 7px; min-width: 0; color: var(--hu-text); }
4
+ .hu-form-control--full { width: 100%; }
5
+ .hu-form-control--row { flex-direction: row; flex-wrap: wrap; align-items: center; gap: var(--hu-space-3); }
6
+ .hu-form-control--disabled { opacity: .62; }
7
+ .hu-form-control--error .hu-form-label { color: var(--hu-error); }
8
+ .hu-form-group {
9
+ display: flex; flex-direction: column; gap: var(--hu-space-2);
10
+ border: 1px solid color-mix(in srgb, var(--hu-border) 84%, transparent);
11
+ border-radius: var(--hu-radius-lg);
12
+ padding: var(--hu-space-4); margin: 0; min-width: 0;
13
+ background: linear-gradient(180deg, var(--hu-bg), color-mix(in srgb, var(--hu-bg-2) 72%, var(--hu-bg)));
14
+ box-shadow: var(--hu-shadow-xs);
15
+ }
16
+ .hu-form-group--row { flex-direction: row; flex-wrap: wrap; gap: var(--hu-space-4); }
17
+ .hu-form-label {
18
+ font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold);
19
+ color: var(--hu-text); display: flex; gap: var(--hu-space-1); align-items: center;
20
+ line-height: var(--hu-line-height-tight);
21
+ }
22
+ .hu-form-label--required::after { content: " *"; color: var(--hu-error); }
23
+ .hu-form-label--focused { color: var(--hu-primary); }
24
+ .hu-form-label--error { color: var(--hu-error); }
25
+ .hu-form-helper { margin: 0; font-size: var(--hu-font-size-xs); color: var(--hu-text-2); line-height: var(--hu-line-height-normal); max-width: 70ch; }
26
+ .hu-form-helper--error { color: var(--hu-error); }
27
+ .hu-form-helper--success { color: var(--hu-success); }
28
+ `;
29
+ export function FormControl(props) {
30
+ injectCSS("hu-form", FORM_CSS);
31
+ return h("div", {
32
+ class: cn("hu-form-control", props.fullWidth && "hu-form-control--full", props.row && "hu-form-control--row", props.error && "hu-form-control--error", props.disabled && "hu-form-control--disabled", props.class),
33
+ "aria-disabled": props.disabled ? "true" : undefined
34
+ }, props.children);
35
+ }
36
+ export function FormGroup(props) {
37
+ injectCSS("hu-form", FORM_CSS);
38
+ return h("fieldset", { class: cn("hu-form-group", props.row && "hu-form-group--row", props.class) }, props.children);
39
+ }
40
+ export function FormLabel(props) {
41
+ injectCSS("hu-form", FORM_CSS);
42
+ return h("label", {
43
+ class: cn("hu-form-label", props.required && "hu-form-label--required", props.focused && "hu-form-label--focused", props.error && "hu-form-label--error", props.class),
44
+ for: props.for
45
+ }, props.children);
46
+ }
47
+ export function FormHelperText(props) {
48
+ injectCSS("hu-form", FORM_CSS);
49
+ return h("p", {
50
+ class: cn("hu-form-helper", props.error && "hu-form-helper--error", props.success && "hu-form-helper--success", props.class)
51
+ }, props.children);
52
+ }
@@ -0,0 +1,23 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface GlobalSearchResult {
3
+ id: string;
4
+ title: string;
5
+ description?: string;
6
+ href?: string;
7
+ category?: string;
8
+ disabled?: boolean;
9
+ }
10
+ export interface GlobalSearchProps {
11
+ value?: string;
12
+ placeholder?: string;
13
+ results?: GlobalSearchResult[];
14
+ open?: boolean;
15
+ width?: string | number;
16
+ shortcut?: string[];
17
+ emptyText?: string;
18
+ class?: string;
19
+ onChange?: (value: string) => void;
20
+ onSelect?: (result: GlobalSearchResult) => void;
21
+ }
22
+ export declare function GlobalSearch(props?: GlobalSearchProps): VNode;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/GlobalSearch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AA4DpE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACjD;AAOD,wBAAgB,YAAY,CAAC,KAAK,GAAE,iBAAsB,GAAG,KAAK,CA4CjE"}
@@ -0,0 +1,91 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ import { Input } from "../Input/index.js";
3
+ import { Kbd } from "../Kbd/index.js";
4
+ const GLOBAL_SEARCH_CSS = `
5
+ .hu-global-search {
6
+ position: relative;
7
+ width: min(100%, var(--hu-global-search-width, 520px));
8
+ }
9
+ .hu-global-search__results {
10
+ position: absolute;
11
+ inset-inline: 0;
12
+ top: calc(100% + var(--hu-space-2));
13
+ z-index: var(--hu-z-popover);
14
+ max-height: 360px;
15
+ overflow-y: auto;
16
+ padding: var(--hu-space-2);
17
+ margin: 0;
18
+ list-style: none;
19
+ border: 1px solid var(--hu-border);
20
+ border-radius: var(--hu-radius-lg);
21
+ background: var(--hu-bg);
22
+ box-shadow: var(--hu-shadow-lg);
23
+ }
24
+ .hu-global-search__item {
25
+ display: grid;
26
+ gap: 2px;
27
+ width: 100%;
28
+ padding: var(--hu-space-3);
29
+ border: 0;
30
+ border-radius: var(--hu-radius);
31
+ background: transparent;
32
+ color: var(--hu-text);
33
+ text-align: left;
34
+ cursor: pointer;
35
+ }
36
+ .hu-global-search__item:hover,
37
+ .hu-global-search__item:focus-visible {
38
+ outline: none;
39
+ background: var(--hu-primary-bg);
40
+ }
41
+ .hu-global-search__title {
42
+ color: var(--hu-text);
43
+ font-size: var(--hu-font-size-sm);
44
+ font-weight: var(--hu-font-weight-semibold);
45
+ }
46
+ .hu-global-search__meta {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: var(--hu-space-2);
50
+ color: var(--hu-text-2);
51
+ font-size: var(--hu-font-size-xs);
52
+ }
53
+ .hu-global-search__empty {
54
+ padding: var(--hu-space-5);
55
+ color: var(--hu-text-2);
56
+ text-align: center;
57
+ }
58
+ `;
59
+ function sizeValue(value) {
60
+ if (value === undefined)
61
+ return undefined;
62
+ return typeof value === "number" ? `${value}px` : value;
63
+ }
64
+ export function GlobalSearch(props = {}) {
65
+ injectCSS("hu-global-search", GLOBAL_SEARCH_CSS);
66
+ const results = props.results ?? [];
67
+ const open = props.open ?? results.length > 0;
68
+ const width = sizeValue(props.width);
69
+ return h("div", {
70
+ class: cn("hu-global-search", props.class),
71
+ role: "search",
72
+ style: width ? `--hu-global-search-width:${width}` : undefined
73
+ }, Input({
74
+ value: props.value ?? "",
75
+ placeholder: props.placeholder ?? "Search...",
76
+ suffix: props.shortcut?.length ? Kbd({ keys: props.shortcut }) : undefined,
77
+ autoComplete: "off",
78
+ "aria-label": "Global search",
79
+ onInput: (event) => props.onChange?.(event.target.value)
80
+ }), open ? (results.length > 0
81
+ ? h("ul", { class: "hu-global-search__results", role: "listbox", "aria-label": "Search results" }, ...results.map((result) => h("li", { role: "option", "aria-disabled": result.disabled ? "true" : undefined }, h("button", {
82
+ type: "button",
83
+ class: "hu-global-search__item",
84
+ disabled: result.disabled,
85
+ onClick: () => {
86
+ if (!result.disabled)
87
+ props.onSelect?.(result);
88
+ }
89
+ }, h("span", { class: "hu-global-search__title" }, result.title), h("span", { class: "hu-global-search__meta" }, result.category ? h("span", {}, result.category) : undefined, result.description ? h("span", {}, result.description) : undefined)))))
90
+ : h("div", { class: "hu-global-search__results hu-global-search__empty", role: "status" }, props.emptyText ?? "No results found")) : undefined);
91
+ }
@@ -0,0 +1,19 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface GridProps {
3
+ container?: boolean;
4
+ item?: boolean;
5
+ columns?: number;
6
+ spacing?: number;
7
+ columnSpacing?: number;
8
+ rowSpacing?: number;
9
+ xs?: number | "auto" | true;
10
+ sm?: number | "auto" | true;
11
+ md?: number | "auto" | true;
12
+ lg?: number | "auto" | true;
13
+ xl?: number | "auto" | true;
14
+ zeroMinWidth?: boolean;
15
+ class?: string;
16
+ children?: unknown;
17
+ }
18
+ export declare function Grid(props: GridProps): VNode;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Grid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAQpE,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,CAsB5C"}
@@ -0,0 +1,30 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const GRID_CSS = `
3
+ .hu-grid { display: grid; box-sizing: border-box; }
4
+ .hu-grid--container { width: 100%; }
5
+ .hu-grid--item { box-sizing: border-box; }
6
+ `;
7
+ export function Grid(props) {
8
+ injectCSS("hu-grid", GRID_CSS);
9
+ const { container, item, columns = 12, spacing = 0, xs, sm, md, lg, xl } = props;
10
+ const styles = [];
11
+ if (container) {
12
+ styles.push(`grid-template-columns: repeat(${columns}, 1fr)`);
13
+ if (spacing)
14
+ styles.push(`gap: ${spacing * 8}px`);
15
+ if (props.columnSpacing)
16
+ styles.push(`column-gap: ${props.columnSpacing * 8}px`);
17
+ if (props.rowSpacing)
18
+ styles.push(`row-gap: ${props.rowSpacing * 8}px`);
19
+ }
20
+ if (item) {
21
+ const colSpan = (v) => v === true ? "1 / -1" : v === "auto" ? "auto" : v ? `span ${v}` : undefined;
22
+ const span = colSpan(xs) ?? colSpan(sm) ?? colSpan(md) ?? colSpan(lg) ?? colSpan(xl);
23
+ if (span)
24
+ styles.push(`grid-column: ${span}`);
25
+ }
26
+ return h("div", {
27
+ class: cn("hu-grid", container && "hu-grid--container", item && "hu-grid--item", props.class),
28
+ style: styles.join(";") || undefined
29
+ }, props.children);
30
+ }
@@ -0,0 +1,10 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface GrowProps {
3
+ in: boolean;
4
+ timeout?: number;
5
+ unmountOnExit?: boolean;
6
+ class?: string;
7
+ children?: unknown;
8
+ }
9
+ export declare function Grow(props: GrowProps): VNode | null;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Grow/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"}
@@ -0,0 +1,13 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const CSS = `
3
+ .hu-grow { transition: opacity var(--hu-duration) var(--hu-ease), transform var(--hu-duration) cubic-bezier(.34,1.56,.64,1); transform-origin: center center; }
4
+ .hu-grow--in { opacity: 1; transform: scale(1); }
5
+ .hu-grow--out { opacity: 0; transform: scale(.75); pointer-events: none; }
6
+ `;
7
+ export function Grow(props) {
8
+ injectCSS("hu-grow", CSS);
9
+ if (!props.in && props.unmountOnExit)
10
+ return null;
11
+ const style = props.timeout ? `transition-duration:${props.timeout}ms` : undefined;
12
+ return h("div", { class: cn("hu-grow", props.in ? "hu-grow--in" : "hu-grow--out", props.class), style }, props.children);
13
+ }
@@ -0,0 +1,16 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export type IconButtonColor = "default" | "primary" | "error" | "warning" | "success";
3
+ export type IconButtonSize = "sm" | "md" | "lg";
4
+ export interface IconButtonProps {
5
+ color?: IconButtonColor;
6
+ size?: IconButtonSize;
7
+ variant?: "standard" | "contained";
8
+ disabled?: boolean;
9
+ "aria-label": string;
10
+ onClick?: (e: MouseEvent) => void;
11
+ type?: "button" | "submit" | "reset";
12
+ class?: string;
13
+ children?: unknown;
14
+ }
15
+ export declare function IconButton(props: IconButtonProps): VNode;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/IconButton/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAkCpE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AACtF,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,OAAO,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,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,43 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const ICON_BUTTON_CSS = `
3
+ .hu-icon-btn {
4
+ display: inline-flex; align-items: center; justify-content: center;
5
+ border: 1px solid transparent; background: transparent; border-radius: var(--hu-radius-full); cursor: pointer;
6
+ color: var(--hu-text-2);
7
+ transition: background var(--hu-duration) var(--hu-ease), border-color var(--hu-duration) var(--hu-ease), color var(--hu-duration) var(--hu-ease), box-shadow var(--hu-duration) var(--hu-ease), transform var(--hu-duration-fast) var(--hu-ease);
8
+ padding: 0; position: relative; user-select: none;
9
+ }
10
+ .hu-icon-btn::after {
11
+ content: ""; position: absolute; inset: 0; border-radius: 50%;
12
+ background: currentColor; opacity: 0; transition: opacity var(--hu-duration) var(--hu-ease);
13
+ }
14
+ .hu-icon-btn:hover::after { opacity: .08; }
15
+ .hu-icon-btn:active::after { opacity: .16; }
16
+ .hu-icon-btn:hover { color: var(--hu-text); transform: translateY(-1px); }
17
+ .hu-icon-btn:active { transform: translateY(0); }
18
+ .hu-icon-btn:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 2px; }
19
+ .hu-icon-btn:disabled { opacity: .4; pointer-events: none; }
20
+ .hu-icon-btn--sm { width: 32px; height: 32px; font-size: 16px; }
21
+ .hu-icon-btn--md { width: 40px; height: 40px; font-size: 20px; }
22
+ .hu-icon-btn--lg { width: 48px; height: 48px; font-size: 24px; }
23
+ .hu-icon-btn--primary { color: var(--hu-primary); }
24
+ .hu-icon-btn--error { color: var(--hu-error); }
25
+ .hu-icon-btn--warning { color: var(--hu-warning); }
26
+ .hu-icon-btn--success { color: var(--hu-success); }
27
+ .hu-icon-btn--contained {
28
+ background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2));
29
+ border-color: var(--hu-border); box-shadow: var(--hu-shadow-xs);
30
+ }
31
+ .hu-icon-btn--contained:hover { border-color: var(--hu-border-2); box-shadow: var(--hu-shadow-sm); }
32
+ `;
33
+ export function IconButton(props) {
34
+ injectCSS("hu-icon-btn", ICON_BUTTON_CSS);
35
+ const { color = "default", size = "md", variant = "standard", disabled, onClick, children } = props;
36
+ return h("button", {
37
+ class: cn("hu-icon-btn", `hu-icon-btn--${size}`, color !== "default" && `hu-icon-btn--${color}`, variant === "contained" && "hu-icon-btn--contained", props.class),
38
+ type: props.type ?? "button",
39
+ disabled,
40
+ onClick,
41
+ "aria-label": props["aria-label"]
42
+ }, children);
43
+ }
@@ -0,0 +1,21 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface ImageListItemProps {
3
+ src: string;
4
+ alt?: string;
5
+ title?: string;
6
+ subtitle?: string;
7
+ titleBarPosition?: "top" | "bottom";
8
+ cols?: number;
9
+ rows?: number;
10
+ onClick?: (e: MouseEvent) => void;
11
+ }
12
+ export interface ImageListProps {
13
+ cols?: number;
14
+ rowHeight?: number | "auto";
15
+ gap?: number;
16
+ variant?: "standard" | "masonry" | "quilted";
17
+ items: ImageListItemProps[];
18
+ class?: string;
19
+ }
20
+ export declare function ImageList(props: ImageListProps): VNode;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ImageList/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAsBpE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7C,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CA2BtD"}
@@ -0,0 +1,39 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const IMAGE_LIST_CSS = `
3
+ .hu-image-list { display: grid; overflow-y: auto; list-style: none; padding: 0; margin: 0; }
4
+ .hu-image-list--standard { align-items: start; }
5
+ .hu-image-list--masonry { display: block; columns: 3; column-gap: 8px; }
6
+ .hu-image-list--quilted { }
7
+ .hu-image-list__item { overflow: hidden; position: relative; }
8
+ .hu-image-list--masonry .hu-image-list__item { break-inside: avoid; margin-bottom: 8px; }
9
+ .hu-image-list__img { width: 100%; height: 100%; object-fit: cover; display: block; }
10
+ .hu-image-list--standard .hu-image-list__img { height: inherit; }
11
+ .hu-image-list__bar {
12
+ position: absolute; bottom: 0; left: 0; right: 0;
13
+ background: linear-gradient(transparent, rgba(0,0,0,.65));
14
+ padding: var(--hu-space-3) var(--hu-space-2) var(--hu-space-2);
15
+ color: #fff;
16
+ }
17
+ .hu-image-list__bar--top { top: 0; bottom: auto; background: linear-gradient(rgba(0,0,0,.65), transparent); }
18
+ .hu-image-list__title { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-medium); }
19
+ .hu-image-list__subtitle { font-size: var(--hu-font-size-xs); opacity: .8; }
20
+ `;
21
+ export function ImageList(props) {
22
+ injectCSS("hu-image-list", IMAGE_LIST_CSS);
23
+ const { cols = 3, rowHeight = 180, gap = 8, variant = "standard", items } = props;
24
+ const styles = [
25
+ variant !== "masonry" ? `grid-template-columns: repeat(${cols}, 1fr)` : "",
26
+ variant !== "masonry" ? `grid-auto-rows: ${rowHeight === "auto" ? "auto" : `${rowHeight}px`}` : "",
27
+ `gap: ${gap}px`
28
+ ].filter(Boolean);
29
+ return h("ul", {
30
+ class: cn("hu-image-list", `hu-image-list--${variant}`, props.class),
31
+ style: styles.join(";")
32
+ }, ...items.map(item => h("li", {
33
+ class: "hu-image-list__item",
34
+ style: item.cols || item.rows
35
+ ? `grid-column: span ${item.cols ?? 1}; grid-row: span ${item.rows ?? 1};`
36
+ : undefined,
37
+ onClick: item.onClick
38
+ }, h("img", { class: "hu-image-list__img", src: item.src, alt: item.alt ?? item.title ?? "" }), item.title && h("div", { class: cn("hu-image-list__bar", item.titleBarPosition === "top" && "hu-image-list__bar--top") }, h("div", { class: "hu-image-list__title" }, item.title), item.subtitle && h("div", { class: "hu-image-list__subtitle" }, item.subtitle)))));
39
+ }
@@ -0,0 +1,33 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface InputProps {
3
+ type?: string;
4
+ value?: string;
5
+ defaultValue?: string;
6
+ placeholder?: string;
7
+ disabled?: boolean;
8
+ readOnly?: boolean;
9
+ required?: boolean;
10
+ size?: "sm" | "md" | "lg";
11
+ error?: string;
12
+ helper?: string;
13
+ label?: string;
14
+ prefix?: unknown;
15
+ suffix?: unknown;
16
+ id?: string;
17
+ name?: string;
18
+ autoComplete?: string;
19
+ maxLength?: number;
20
+ minLength?: number;
21
+ class?: string;
22
+ "aria-label"?: string;
23
+ "aria-controls"?: string;
24
+ "aria-expanded"?: string | boolean;
25
+ "aria-activedescendant"?: string;
26
+ onInput?: (e: InputEvent) => void;
27
+ onChange?: (e: Event) => void;
28
+ onBlur?: (e: FocusEvent) => void;
29
+ onFocus?: (e: FocusEvent) => void;
30
+ onKeyDown?: (e: KeyboardEvent) => void;
31
+ }
32
+ export declare function Input(props: InputProps): VNode;
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAqCpE,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,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;IACjC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CA+B9C"}
@@ -0,0 +1,45 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ import { Label } from "../Label/index.js";
3
+ const INPUT_CSS = `
4
+ .hu-input-wrap { display: flex; flex-direction: column; gap: 6px; width: 100%; }
5
+ .hu-input-field {
6
+ display: flex; align-items: center; position: relative;
7
+ }
8
+ .hu-input {
9
+ width: 100%; min-height: 40px; font-family: var(--hu-font-sans); font-size: var(--hu-font-size-sm);
10
+ color: var(--hu-text); background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2));
11
+ border: 1px solid var(--hu-border); border-radius: var(--hu-radius-md);
12
+ padding: 9px 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);
13
+ outline: none; appearance: none;
14
+ box-shadow: var(--hu-shadow-xs);
15
+ }
16
+ .hu-input::placeholder { color: var(--hu-text-3); }
17
+ .hu-input:hover:not(:disabled) { border-color: color-mix(in srgb, var(--hu-primary) 35%, var(--hu-border-2)); }
18
+ .hu-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-input:disabled { opacity: .5; cursor: not-allowed; background: var(--hu-bg-3); }
20
+ .hu-input--error { border-color: var(--hu-error) !important; }
21
+ .hu-input--error:focus { box-shadow: 0 0 0 3px color-mix(in srgb, var(--hu-error) 20%, transparent); }
22
+ .hu-input--sm { min-height: 34px; padding: 6px 10px; font-size: var(--hu-font-size-xs); border-radius: var(--hu-radius); }
23
+ .hu-input--lg { min-height: 46px; padding: 11px 14px; font-size: var(--hu-font-size-base); }
24
+ .hu-input-prefix, .hu-input-suffix {
25
+ position: absolute; top: 50%; transform: translateY(-50%);
26
+ color: var(--hu-text-3); pointer-events: none; display: flex; align-items: center;
27
+ font-size: var(--hu-font-size-sm);
28
+ }
29
+ .hu-input-prefix { left: 12px; }
30
+ .hu-input-suffix { right: 12px; }
31
+ .hu-input--has-prefix { padding-left: 36px !important; }
32
+ .hu-input--has-suffix { padding-right: 36px !important; }
33
+ .hu-input-helper { font-size: var(--hu-font-size-xs); color: var(--hu-text-2); line-height: 1.45; }
34
+ .hu-input-error-msg { font-size: var(--hu-font-size-xs); color: var(--hu-error); line-height: 1.45; }
35
+ `;
36
+ export function Input(props) {
37
+ injectCSS("hu-input", INPUT_CSS);
38
+ const { type = "text", size = "md", error, helper, label, prefix, suffix, id, ...rest } = props;
39
+ const inputEl = h("input", {
40
+ ...rest, type, id,
41
+ class: cn("hu-input", size !== "md" && `hu-input--${size}`, error && "hu-input--error", Boolean(prefix) && "hu-input--has-prefix", Boolean(suffix) && "hu-input--has-suffix", props.class)
42
+ });
43
+ const field = h("div", { class: "hu-input-field" }, prefix && h("span", { class: "hu-input-prefix" }, prefix), inputEl, suffix && h("span", { class: "hu-input-suffix" }, suffix));
44
+ return h("div", { class: "hu-input-wrap" }, label && Label({ for: id, required: props.required, children: label }), field, error && h("span", { class: "hu-input-error-msg", role: "alert" }, error), !error && helper && h("span", { class: "hu-input-helper" }, helper));
45
+ }
@@ -0,0 +1,8 @@
1
+ import { type VNode } from "../../theme/index.js";
2
+ export interface KbdProps {
3
+ keys?: string[];
4
+ class?: string;
5
+ children?: unknown;
6
+ }
7
+ export declare function Kbd(props?: KbdProps): VNode;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Kbd/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AA4BpE,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,GAAG,CAAC,KAAK,GAAE,QAAa,GAAG,KAAK,CAgB/C"}
@@ -0,0 +1,41 @@
1
+ import { injectCSS, cn, h } from "../../theme/index.js";
2
+ const KBD_CSS = `
3
+ .hu-kbd {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ gap: 4px;
7
+ min-width: 1.6em;
8
+ min-height: 1.55em;
9
+ padding: 2px 6px;
10
+ border: 1px solid var(--hu-border);
11
+ border-bottom-color: var(--hu-border-2);
12
+ border-radius: var(--hu-radius);
13
+ background: linear-gradient(180deg, var(--hu-bg-1), var(--hu-bg-3));
14
+ color: var(--hu-text);
15
+ box-shadow: inset 0 -1px 0 rgb(0 0 0/.08), var(--hu-shadow-xs);
16
+ font-family: var(--hu-font-mono);
17
+ font-size: .82em;
18
+ font-weight: var(--hu-font-weight-semibold);
19
+ line-height: 1;
20
+ white-space: nowrap;
21
+ }
22
+ .hu-kbd__separator {
23
+ color: var(--hu-text-3);
24
+ font-size: .85em;
25
+ }
26
+ `;
27
+ export function Kbd(props = {}) {
28
+ injectCSS("hu-kbd", KBD_CSS);
29
+ const keys = props.keys?.length ? props.keys : undefined;
30
+ if (!keys) {
31
+ return h("kbd", { class: cn("hu-kbd", props.class) }, props.children);
32
+ }
33
+ const children = keys.flatMap((key, index) => {
34
+ const parts = [];
35
+ if (index > 0)
36
+ parts.push(h("span", { class: "hu-kbd__separator", "aria-hidden": "true" }, "+"));
37
+ parts.push(h("span", {}, key));
38
+ return parts;
39
+ });
40
+ return h("kbd", { class: cn("hu-kbd", props.class), "aria-label": keys.join(" plus ") }, ...children);
41
+ }