@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,428 @@
1
+ /**
2
+ * HyperUI Enterprise Components
3
+ * ApprovalFlow · AuditTrail · PermissionMatrix · RoleManager
4
+ */
5
+ import { injectCSS, cn, h } from "../theme/index.js";
6
+ import { Button } from "./Button/index.js";
7
+ const ENTERPRISE_CSS = `
8
+ .hu-enterprise {
9
+ display: flex; flex-direction: column; gap: var(--hu-space-3);
10
+ padding: var(--hu-space-4); border: 1px solid var(--hu-border);
11
+ border-radius: var(--hu-radius-md); background: var(--hu-bg); color: var(--hu-text);
12
+ }
13
+ .hu-enterprise__header {
14
+ display: flex; align-items: flex-start; justify-content: space-between;
15
+ gap: var(--hu-space-3); flex-wrap: wrap;
16
+ }
17
+ .hu-enterprise__title { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); color: var(--hu-text); }
18
+ .hu-enterprise__meta { font-size: var(--hu-font-size-xs); color: var(--hu-text-2); }
19
+ .hu-approval-flow__steps { display: flex; flex-direction: column; gap: var(--hu-space-3); }
20
+ .hu-approval-step {
21
+ display: grid; grid-template-columns: 32px minmax(0, 1fr) auto;
22
+ gap: var(--hu-space-3); align-items: start;
23
+ }
24
+ .hu-approval-step__marker {
25
+ display: inline-flex; align-items: center; justify-content: center;
26
+ width: 28px; height: 28px; border-radius: var(--hu-radius-full);
27
+ background: var(--hu-bg-3); color: var(--hu-text-2); font-size: var(--hu-font-size-xs);
28
+ font-weight: var(--hu-font-weight-semibold);
29
+ }
30
+ .hu-approval-step--approved .hu-approval-step__marker { background: var(--hu-success-bg); color: var(--hu-success-text); }
31
+ .hu-approval-step--rejected .hu-approval-step__marker { background: var(--hu-error-bg); color: var(--hu-error-text); }
32
+ .hu-approval-step--pending .hu-approval-step__marker { background: var(--hu-warning-bg); color: var(--hu-warning-text); }
33
+ .hu-approval-step__name { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); }
34
+ .hu-approval-step__details { font-size: var(--hu-font-size-xs); color: var(--hu-text-2); }
35
+ .hu-approval-step__actions { display: flex; gap: var(--hu-space-2); flex-wrap: wrap; justify-content: flex-end; }
36
+ .hu-audit-trail__list { display: flex; flex-direction: column; gap: var(--hu-space-2); }
37
+ .hu-audit-event {
38
+ display: grid; grid-template-columns: minmax(120px, .7fr) minmax(0, 1.3fr) minmax(0, 1fr);
39
+ gap: var(--hu-space-3); padding: var(--hu-space-3); border: 1px solid var(--hu-border);
40
+ border-radius: var(--hu-radius); background: var(--hu-bg-2);
41
+ }
42
+ .hu-audit-event__action { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); }
43
+ .hu-audit-event__actor,
44
+ .hu-audit-event__time,
45
+ .hu-audit-event__meta { font-size: var(--hu-font-size-xs); color: var(--hu-text-2); }
46
+ .hu-permission-matrix { overflow: auto; border: 1px solid var(--hu-border); border-radius: var(--hu-radius); }
47
+ .hu-permission-matrix table { width: 100%; border-collapse: collapse; table-layout: fixed; }
48
+ .hu-permission-matrix th,
49
+ .hu-permission-matrix td {
50
+ padding: var(--hu-space-2) var(--hu-space-3); border-block-end: 1px solid var(--hu-border);
51
+ border-inline-end: 1px solid var(--hu-border); font-size: var(--hu-font-size-xs); text-align: center;
52
+ }
53
+ .hu-permission-matrix th { background: var(--hu-bg-2); color: var(--hu-text-2); font-weight: var(--hu-font-weight-semibold); }
54
+ .hu-permission-matrix th:first-child { text-align: start; }
55
+ .hu-role-manager__grid {
56
+ display: grid; grid-template-columns: minmax(220px, .8fr) minmax(0, 1.2fr);
57
+ gap: var(--hu-space-3);
58
+ }
59
+ .hu-role-manager__roles,
60
+ .hu-role-manager__details { border: 1px solid var(--hu-border); border-radius: var(--hu-radius); overflow: hidden; }
61
+ .hu-role-manager__role {
62
+ width: 100%; display: flex; flex-direction: column; gap: 2px;
63
+ padding: var(--hu-space-3); border: 0; border-block-end: 1px solid var(--hu-border);
64
+ background: var(--hu-bg); color: var(--hu-text); text-align: start; cursor: pointer;
65
+ }
66
+ .hu-role-manager__role[aria-selected="true"] { background: var(--hu-primary-bg); color: var(--hu-primary); }
67
+ .hu-role-manager__details { padding: var(--hu-space-4); display: flex; flex-direction: column; gap: var(--hu-space-3); }
68
+ .hu-role-manager__permissions { display: flex; flex-wrap: wrap; gap: var(--hu-space-2); }
69
+ .hu-role-manager__permission {
70
+ display: inline-flex; padding: 4px 8px; border-radius: var(--hu-radius-full);
71
+ background: var(--hu-bg-3); color: var(--hu-text-2); font-size: var(--hu-font-size-xs);
72
+ }
73
+ .hu-feature-flags__list,
74
+ .hu-notification-center__list,
75
+ .hu-activity-feed__list { display: flex; flex-direction: column; gap: var(--hu-space-2); }
76
+ .hu-feature-flag,
77
+ .hu-notification,
78
+ .hu-activity-item {
79
+ display: grid; grid-template-columns: minmax(0, 1fr) auto;
80
+ gap: var(--hu-space-3); align-items: start;
81
+ padding: var(--hu-space-3); border: 1px solid var(--hu-border);
82
+ border-radius: var(--hu-radius); background: var(--hu-bg-2);
83
+ }
84
+ .hu-feature-flag__name,
85
+ .hu-notification__title,
86
+ .hu-activity-item__title { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); color: var(--hu-text); }
87
+ .hu-feature-flag__details,
88
+ .hu-notification__meta,
89
+ .hu-activity-item__meta { font-size: var(--hu-font-size-xs); color: var(--hu-text-2); }
90
+ .hu-feature-flag__badge,
91
+ .hu-notification__badge {
92
+ display: inline-flex; align-items: center; padding: 3px 8px; border-radius: var(--hu-radius-full);
93
+ background: var(--hu-bg-3); color: var(--hu-text-2); font-size: var(--hu-font-size-xs); font-weight: var(--hu-font-weight-semibold);
94
+ }
95
+ .hu-feature-flag__badge--enabled,
96
+ .hu-notification__badge--success { background: var(--hu-success-bg); color: var(--hu-success-text); }
97
+ .hu-feature-flag__badge--disabled,
98
+ .hu-notification__badge--error { background: var(--hu-error-bg); color: var(--hu-error-text); }
99
+ .hu-notification__badge--warning { background: var(--hu-warning-bg); color: var(--hu-warning-text); }
100
+ .hu-notification__badge--info { background: var(--hu-info-bg); color: var(--hu-info-text); }
101
+ .hu-feature-flag__actions,
102
+ .hu-notification__actions { display: flex; gap: var(--hu-space-2); align-items: center; flex-wrap: wrap; justify-content: flex-end; }
103
+ .hu-tenant-selector__control {
104
+ display: grid; grid-template-columns: minmax(0, 1fr) auto;
105
+ gap: var(--hu-space-2); align-items: end;
106
+ }
107
+ .hu-tenant-selector__select {
108
+ width: 100%; min-height: 40px; padding: 9px var(--hu-space-3);
109
+ border: 1px solid var(--hu-border); border-radius: var(--hu-radius-md);
110
+ background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2)); color: var(--hu-text); font-size: var(--hu-font-size-sm);
111
+ box-shadow: var(--hu-shadow-xs);
112
+ }
113
+ .hu-tenant-selector__summary {
114
+ display: flex; flex-wrap: wrap; gap: var(--hu-space-2);
115
+ font-size: var(--hu-font-size-xs); color: var(--hu-text-2);
116
+ }
117
+ .hu-activity-item { grid-template-columns: 32px minmax(0, 1fr) auto; }
118
+ .hu-activity-item__avatar {
119
+ display: inline-flex; align-items: center; justify-content: center;
120
+ width: 28px; height: 28px; border-radius: var(--hu-radius-full);
121
+ background: var(--hu-primary-bg); color: var(--hu-primary);
122
+ font-size: var(--hu-font-size-xs); font-weight: var(--hu-font-weight-semibold);
123
+ }
124
+ .hu-org-chart__tree,
125
+ .hu-org-chart__children { display: flex; flex-direction: column; gap: var(--hu-space-2); }
126
+ .hu-org-node {
127
+ display: grid; grid-template-columns: 32px minmax(0, 1fr) auto;
128
+ gap: var(--hu-space-3); align-items: center;
129
+ padding: var(--hu-space-3); border: 1px solid var(--hu-border);
130
+ border-radius: var(--hu-radius); background: var(--hu-bg-2);
131
+ }
132
+ .hu-org-node__avatar {
133
+ display: inline-flex; align-items: center; justify-content: center;
134
+ width: 28px; height: 28px; border-radius: var(--hu-radius-full);
135
+ background: var(--hu-primary-bg); color: var(--hu-primary);
136
+ font-size: var(--hu-font-size-xs); font-weight: var(--hu-font-weight-semibold);
137
+ }
138
+ .hu-org-node__name,
139
+ .hu-kanban-card__title { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); color: var(--hu-text); }
140
+ .hu-org-node__meta,
141
+ .hu-gantt__meta,
142
+ .hu-kanban-card__meta { font-size: var(--hu-font-size-xs); color: var(--hu-text-2); }
143
+ .hu-gantt { overflow: auto; border: 1px solid var(--hu-border); border-radius: var(--hu-radius); }
144
+ .hu-gantt table { width: 100%; border-collapse: collapse; table-layout: fixed; min-width: 680px; }
145
+ .hu-gantt th,
146
+ .hu-gantt td {
147
+ padding: var(--hu-space-2) var(--hu-space-3); border-block-end: 1px solid var(--hu-border);
148
+ border-inline-end: 1px solid var(--hu-border); font-size: var(--hu-font-size-xs);
149
+ }
150
+ .hu-gantt th { background: var(--hu-bg-2); color: var(--hu-text-2); font-weight: var(--hu-font-weight-semibold); text-align: start; }
151
+ .hu-gantt__bar-track { position: relative; height: 18px; border-radius: var(--hu-radius-full); background: var(--hu-bg-3); overflow: hidden; }
152
+ .hu-gantt__bar {
153
+ position: absolute; inset-block: 3px; border-radius: var(--hu-radius-full);
154
+ background: var(--hu-primary); min-width: 4px;
155
+ }
156
+ .hu-kanban-board__columns {
157
+ display: grid; grid-template-columns: repeat(var(--hu-kanban-columns, 3), minmax(220px, 1fr));
158
+ gap: var(--hu-space-3); overflow: auto;
159
+ }
160
+ .hu-kanban-column {
161
+ display: flex; flex-direction: column; gap: var(--hu-space-2);
162
+ min-width: 220px; padding: var(--hu-space-3); border: 1px solid var(--hu-border);
163
+ border-radius: var(--hu-radius); background: var(--hu-bg-2);
164
+ }
165
+ .hu-kanban-column__header {
166
+ display: flex; align-items: center; justify-content: space-between; gap: var(--hu-space-2);
167
+ font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold);
168
+ }
169
+ .hu-kanban-card {
170
+ display: flex; flex-direction: column; gap: var(--hu-space-2);
171
+ padding: var(--hu-space-3); border: 1px solid var(--hu-border);
172
+ border-radius: var(--hu-radius); background: var(--hu-bg);
173
+ }
174
+ .hu-kanban-card__actions { display: flex; gap: var(--hu-space-2); flex-wrap: wrap; }
175
+ .hu-workflow-designer__canvas {
176
+ position: relative; min-height: 280px; overflow: auto;
177
+ border: 1px solid var(--hu-border); border-radius: var(--hu-radius);
178
+ background: linear-gradient(var(--hu-bg-2), var(--hu-bg-2)) padding-box;
179
+ }
180
+ .hu-workflow-designer__edges {
181
+ position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none;
182
+ }
183
+ .hu-workflow-node {
184
+ position: absolute; width: 160px; min-height: 72px;
185
+ display: flex; flex-direction: column; gap: var(--hu-space-1);
186
+ padding: var(--hu-space-3); border: 1px solid var(--hu-border);
187
+ border-radius: var(--hu-radius); background: var(--hu-bg); color: var(--hu-text);
188
+ box-shadow: var(--hu-shadow-sm); text-align: start; cursor: pointer;
189
+ }
190
+ .hu-workflow-node[aria-selected="true"] { border-color: var(--hu-primary); box-shadow: 0 0 0 3px var(--hu-primary-bg); }
191
+ .hu-workflow-node__label,
192
+ .hu-document-viewer__name { font-size: var(--hu-font-size-sm); font-weight: var(--hu-font-weight-semibold); color: var(--hu-text); }
193
+ .hu-workflow-node__meta,
194
+ .hu-document-viewer__meta { font-size: var(--hu-font-size-xs); color: var(--hu-text-2); }
195
+ .hu-document-viewer__toolbar {
196
+ display: flex; align-items: center; justify-content: space-between;
197
+ gap: var(--hu-space-3); flex-wrap: wrap;
198
+ }
199
+ .hu-document-viewer__actions { display: flex; align-items: center; gap: var(--hu-space-2); flex-wrap: wrap; }
200
+ .hu-document-viewer__frame {
201
+ min-height: 260px; display: flex; flex-direction: column; align-items: center; justify-content: center;
202
+ gap: var(--hu-space-3); padding: var(--hu-space-6);
203
+ border: 1px solid var(--hu-border); border-radius: var(--hu-radius);
204
+ background: var(--hu-bg-2); text-align: center;
205
+ }
206
+ .hu-document-viewer__preview {
207
+ width: min(100%, 520px); min-height: 180px; padding: var(--hu-space-4);
208
+ border: 1px solid var(--hu-border); border-radius: var(--hu-radius);
209
+ background: var(--hu-bg); color: var(--hu-text); text-align: start;
210
+ white-space: pre-wrap; overflow-wrap: anywhere;
211
+ }
212
+ @media (max-width: 720px) {
213
+ .hu-approval-step { grid-template-columns: 32px minmax(0, 1fr); }
214
+ .hu-approval-step__actions { grid-column: 2; justify-content: flex-start; }
215
+ .hu-audit-event { grid-template-columns: minmax(0, 1fr); }
216
+ .hu-role-manager__grid { grid-template-columns: minmax(0, 1fr); }
217
+ .hu-feature-flag,
218
+ .hu-notification,
219
+ .hu-tenant-selector__control { grid-template-columns: minmax(0, 1fr); }
220
+ .hu-feature-flag__actions,
221
+ .hu-notification__actions { justify-content: flex-start; }
222
+ .hu-kanban-board__columns { grid-template-columns: minmax(220px, 1fr); }
223
+ .hu-workflow-node { position: static; width: auto; margin: var(--hu-space-3); }
224
+ .hu-workflow-designer__edges { display: none; }
225
+ }
226
+ `;
227
+ export function ApprovalFlow(props) {
228
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
229
+ const pending = props.steps.filter((step) => (step.status ?? "pending") === "pending").length;
230
+ return h("section", { class: cn("hu-enterprise hu-approval-flow", props.class), "aria-label": props.title ?? "Approval flow" }, enterpriseHeader(props.title ?? "Approval flow", props.description ?? `${pending} pending`), h("ol", { class: "hu-approval-flow__steps" }, ...props.steps.map((step, index) => {
231
+ const status = step.status ?? "pending";
232
+ return h("li", {
233
+ key: step.id,
234
+ class: cn("hu-approval-step", `hu-approval-step--${status}`),
235
+ "aria-current": status === "pending" ? "step" : undefined
236
+ }, h("span", { class: "hu-approval-step__marker", "aria-hidden": "true" }, index + 1), h("div", {}, h("div", { class: "hu-approval-step__name" }, step.label), h("div", { class: "hu-approval-step__details" }, [step.approver, status, step.timestamp].filter(Boolean).join(" · ")), step.comment && h("div", { class: "hu-approval-step__details" }, step.comment)), status === "pending" && (props.onApprove || props.onReject) && h("div", { class: "hu-approval-step__actions" }, props.onApprove && Button({ type: "button", size: "sm", children: "Approve", onClick: () => props.onApprove?.(step.id) }), props.onReject && Button({ type: "button", size: "sm", variant: "secondary", children: "Reject", onClick: () => props.onReject?.(step.id) })));
237
+ })));
238
+ }
239
+ export function AuditTrail(props) {
240
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
241
+ return h("section", { class: cn("hu-enterprise hu-audit-trail", props.class), "aria-label": props.title ?? "Audit trail" }, enterpriseHeader(props.title ?? "Audit trail", props.description ?? `${props.events.length} events`), h("div", { class: "hu-audit-trail__list", role: "list" }, ...props.events.map((event) => h("article", {
242
+ key: event.id,
243
+ class: cn("hu-audit-event", event.severity && `hu-audit-event--${event.severity}`),
244
+ role: "listitem",
245
+ tabindex: props.onEventClick ? 0 : undefined,
246
+ onClick: props.onEventClick ? () => props.onEventClick?.(event) : undefined
247
+ }, h("div", {}, h("div", { class: "hu-audit-event__action" }, event.action), h("div", { class: "hu-audit-event__time" }, event.timestamp)), h("div", {}, h("div", { class: "hu-audit-event__actor" }, event.actor), event.target && h("div", { class: "hu-audit-event__meta" }, event.target)), h("div", { class: "hu-audit-event__meta" }, formatMetadata(event.metadata))))));
248
+ }
249
+ export function PermissionMatrix(props) {
250
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
251
+ const value = props.value ?? {};
252
+ return h("section", { class: cn("hu-enterprise", props.class), "aria-label": props.title ?? "Permission matrix" }, enterpriseHeader(props.title ?? "Permission matrix", props.description ?? `${props.resources.length} resources`), h("div", { class: "hu-permission-matrix" }, h("table", { role: "grid" }, h("thead", {}, h("tr", {}, h("th", { scope: "col" }, "Resource"), ...props.actions.map((action) => h("th", { key: action.key, scope: "col" }, action.label)))), h("tbody", {}, ...props.resources.map((resource) => h("tr", { key: resource.key }, h("th", { scope: "row" }, resource.label), ...props.actions.map((action) => {
253
+ const checked = value[resource.key]?.includes(action.key) ?? false;
254
+ return h("td", { key: action.key }, h("input", {
255
+ type: "checkbox",
256
+ checked,
257
+ "aria-label": `${resource.label} ${action.label}`,
258
+ onChange: (e) => props.onChange?.(resource.key, action.key, e.target.checked)
259
+ }));
260
+ })))))));
261
+ }
262
+ export function RoleManager(props) {
263
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
264
+ const selectedRole = props.roles.find((role) => role.id === props.selectedRole) ?? props.roles[0];
265
+ return h("section", { class: cn("hu-enterprise hu-role-manager", props.class), "aria-label": props.title ?? "Role manager" }, h("div", { class: "hu-enterprise__header" }, h("div", {}, h("div", { class: "hu-enterprise__title" }, props.title ?? "Role manager"), h("div", { class: "hu-enterprise__meta" }, props.description ?? `${props.roles.length} roles`)), props.onCreateRole && Button({ type: "button", size: "sm", children: "New role", onClick: props.onCreateRole })), h("div", { class: "hu-role-manager__grid" }, h("div", { class: "hu-role-manager__roles", role: "listbox", "aria-label": "Roles" }, ...props.roles.map((role) => h("button", {
266
+ key: role.id,
267
+ type: "button",
268
+ class: "hu-role-manager__role",
269
+ role: "option",
270
+ "aria-selected": selectedRole?.id === role.id ? "true" : "false",
271
+ onClick: () => props.onRoleSelect?.(role.id)
272
+ }, h("span", {}, role.name), h("span", { class: "hu-enterprise__meta" }, `${role.users ?? 0} users`)))), h("div", { class: "hu-role-manager__details", "aria-label": "Role details" }, selectedRole
273
+ ? [
274
+ h("div", { class: "hu-enterprise__title" }, selectedRole.name),
275
+ selectedRole.description && h("div", { class: "hu-enterprise__meta" }, selectedRole.description),
276
+ h("div", { class: "hu-role-manager__permissions", "aria-label": "Role permissions" }, ...(selectedRole.permissions ?? []).map((permission) => h("span", { key: permission, class: "hu-role-manager__permission" }, permission)))
277
+ ]
278
+ : h("div", { class: "hu-enterprise__meta" }, "No role selected."))));
279
+ }
280
+ export function FeatureFlags(props) {
281
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
282
+ const enabledCount = props.flags.filter((flag) => flag.enabled).length;
283
+ return h("section", { class: cn("hu-enterprise hu-feature-flags", props.class), "aria-label": props.title ?? "Feature flags" }, enterpriseHeader(props.title ?? "Feature flags", props.description ?? `${enabledCount} enabled · ${props.flags.length} total`), h("div", { class: "hu-feature-flags__list", role: "list" }, ...props.flags.map((flag) => {
284
+ const enabled = flag.enabled ?? false;
285
+ return h("article", { key: flag.key, class: "hu-feature-flag", role: "listitem" }, h("div", {}, h("div", { class: "hu-feature-flag__name" }, flag.name), h("div", { class: "hu-feature-flag__details" }, [flag.description, flag.environment, flag.rollout !== undefined ? `${flag.rollout}% rollout` : undefined].filter(Boolean).join(" · "))), h("div", { class: "hu-feature-flag__actions" }, h("span", { class: cn("hu-feature-flag__badge", enabled ? "hu-feature-flag__badge--enabled" : "hu-feature-flag__badge--disabled") }, enabled ? "Enabled" : "Disabled"), h("input", {
286
+ type: "checkbox",
287
+ role: "switch",
288
+ checked: enabled,
289
+ "aria-label": `Toggle ${flag.name}`,
290
+ onChange: (e) => props.onToggle?.(flag.key, e.target.checked)
291
+ }), props.onEdit && Button({ type: "button", size: "sm", variant: "secondary", children: "Edit", onClick: () => props.onEdit?.(flag.key) })));
292
+ })));
293
+ }
294
+ export function TenantSelector(props) {
295
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
296
+ const selected = props.tenants.find((tenant) => tenant.id === props.value) ?? props.tenants[0];
297
+ return h("section", { class: cn("hu-enterprise hu-tenant-selector", props.class), "aria-label": props.title ?? "Tenant selector" }, enterpriseHeader(props.title ?? "Tenant selector", props.description ?? `${props.tenants.length} tenants`), h("div", { class: "hu-tenant-selector__control" }, h("label", {}, h("span", { class: "hu-enterprise__meta" }, "Tenant"), h("select", {
298
+ class: "hu-tenant-selector__select",
299
+ value: selected?.id,
300
+ onChange: (e) => props.onChange?.(e.target.value)
301
+ }, ...props.tenants.map((tenant) => h("option", { key: tenant.id, value: tenant.id }, tenant.name)))), selected && props.onManage && Button({ type: "button", size: "sm", children: "Manage", onClick: () => props.onManage?.(selected.id) })), selected && h("div", { class: "hu-tenant-selector__summary", "aria-live": "polite" }, h("span", {}, selected.plan ?? "No plan"), h("span", {}, selected.region ?? "No region"), h("span", {}, selected.status ?? "active")));
302
+ }
303
+ export function NotificationCenter(props) {
304
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
305
+ const unread = props.notifications.filter((notification) => !notification.read).length;
306
+ return h("section", { class: cn("hu-enterprise hu-notification-center", props.class), "aria-label": props.title ?? "Notification center" }, enterpriseHeader(props.title ?? "Notification center", props.description ?? `${unread} unread`), h("div", { class: "hu-notification-center__list", role: "list", "aria-live": "polite" }, ...props.notifications.map((notification) => {
307
+ const kind = notification.kind ?? "info";
308
+ return h("article", { key: notification.id, class: "hu-notification", role: "listitem" }, h("div", {}, h("div", { class: "hu-notification__title" }, notification.title), notification.message && h("div", { class: "hu-notification__meta" }, notification.message), notification.timestamp && h("div", { class: "hu-notification__meta" }, notification.timestamp)), h("div", { class: "hu-notification__actions" }, h("span", { class: cn("hu-notification__badge", `hu-notification__badge--${kind}`) }, notification.read ? "Read" : "Unread"), !notification.read && props.onMarkRead && Button({ type: "button", size: "sm", variant: "secondary", children: "Mark read", onClick: () => props.onMarkRead?.(notification.id) }), props.onDismiss && Button({ type: "button", size: "sm", variant: "ghost", children: "Dismiss", onClick: () => props.onDismiss?.(notification.id) })));
309
+ })));
310
+ }
311
+ export function ActivityFeed(props) {
312
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
313
+ return h("section", { class: cn("hu-enterprise hu-activity-feed", props.class), "aria-label": props.title ?? "Activity feed" }, enterpriseHeader(props.title ?? "Activity feed", props.description ?? `${props.items.length} activities`), h("div", { class: "hu-activity-feed__list", role: "feed" }, ...props.items.map((item) => h("article", {
314
+ key: item.id,
315
+ class: "hu-activity-item",
316
+ role: "article",
317
+ tabindex: props.onItemClick ? 0 : undefined,
318
+ onClick: props.onItemClick ? () => props.onItemClick?.(item) : undefined
319
+ }, h("span", { class: "hu-activity-item__avatar", "aria-hidden": "true" }, item.avatar ?? initials(item.actor)), h("div", {}, h("div", { class: "hu-activity-item__title" }, `${item.actor} ${item.action}`), item.target && h("div", { class: "hu-activity-item__meta" }, item.target), item.timestamp && h("time", { class: "hu-activity-item__meta" }, item.timestamp)), props.onItemClick && Button({ type: "button", size: "sm", variant: "ghost", children: "Open", onClick: () => props.onItemClick?.(item) })))));
320
+ }
321
+ export function OrgChart(props) {
322
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
323
+ const total = countOrgNodes(props.nodes);
324
+ return h("section", { class: cn("hu-enterprise hu-org-chart", props.class), "aria-label": props.title ?? "Org chart" }, enterpriseHeader(props.title ?? "Org chart", props.description ?? `${total} people`), h("div", { class: "hu-org-chart__tree", role: "tree" }, ...props.nodes.map((node) => renderOrgNode(node, props.onNodeSelect, 1))));
325
+ }
326
+ export function GanttChart(props) {
327
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
328
+ const range = getGanttRange(props.tasks);
329
+ return h("section", { class: cn("hu-enterprise", props.class), "aria-label": props.title ?? "Gantt chart" }, enterpriseHeader(props.title ?? "Gantt chart", props.description ?? `${props.tasks.length} tasks`), h("div", { class: "hu-gantt", role: "region", "aria-label": "Project timeline" }, h("table", {}, h("thead", {}, h("tr", {}, h("th", { scope: "col" }, "Task"), h("th", { scope: "col" }, "Owner"), h("th", { scope: "col" }, "Timeline"), h("th", { scope: "col" }, "Progress"))), h("tbody", {}, ...props.tasks.map((task) => {
330
+ const startOffset = range.days === 0 ? 0 : daysBetween(range.start, parseDate(task.start)) / range.days * 100;
331
+ const duration = range.days === 0 ? 100 : Math.max(1, daysBetween(parseDate(task.start), parseDate(task.end)) / range.days * 100);
332
+ return h("tr", {
333
+ key: task.id,
334
+ onClick: props.onTaskClick ? () => props.onTaskClick?.(task) : undefined
335
+ }, h("th", { scope: "row" }, task.label), h("td", {}, task.owner ?? ""), h("td", {}, h("div", { class: "hu-gantt__bar-track", "aria-label": `${task.start} to ${task.end}` }, h("span", {
336
+ class: "hu-gantt__bar",
337
+ style: `inset-inline-start:${startOffset}%;width:${Math.min(100 - startOffset, duration)}%`
338
+ }))), h("td", { class: "hu-gantt__meta" }, `${task.progress ?? 0}%`));
339
+ })))));
340
+ }
341
+ export function KanbanBoard(props) {
342
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
343
+ return h("section", {
344
+ class: cn("hu-enterprise hu-kanban-board", props.class),
345
+ style: `--hu-kanban-columns:${Math.max(1, props.columns.length)}`,
346
+ "aria-label": props.title ?? "Kanban board"
347
+ }, enterpriseHeader(props.title ?? "Kanban board", props.description ?? `${props.cards.length} cards`), h("div", { class: "hu-kanban-board__columns" }, ...props.columns.map((column) => {
348
+ const cards = props.cards.filter((card) => card.column === column.id);
349
+ return h("section", { key: column.id, class: "hu-kanban-column", "aria-label": column.title }, h("div", { class: "hu-kanban-column__header" }, h("span", {}, column.title), h("span", { class: "hu-enterprise__meta" }, `${cards.length}${column.limit ? `/${column.limit}` : ""}`)), ...cards.map((card) => h("article", { key: card.id, class: "hu-kanban-card" }, h("div", { class: "hu-kanban-card__title" }, card.title), card.description && h("div", { class: "hu-kanban-card__meta" }, card.description), h("div", { class: "hu-kanban-card__meta" }, [card.assignee, card.priority].filter(Boolean).join(" · ")), h("div", { class: "hu-kanban-card__actions" }, props.onCardSelect && Button({ type: "button", size: "sm", variant: "ghost", children: "Open", onClick: () => props.onCardSelect?.(card) }), props.onCardMove && props.columns.filter((target) => target.id !== column.id).map((target) => Button({ type: "button", size: "sm", variant: "secondary", children: `Move to ${target.title}`, onClick: () => props.onCardMove?.(card.id, target.id) }))))));
350
+ })));
351
+ }
352
+ export function WorkflowDesigner(props) {
353
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
354
+ const nodeMap = new Map(props.nodes.map((node, index) => [node.id, resolveWorkflowNodePosition(node, index)]));
355
+ return h("section", { class: cn("hu-enterprise hu-workflow-designer", props.class), "aria-label": props.title ?? "Workflow designer" }, h("div", { class: "hu-enterprise__header" }, h("div", {}, h("div", { class: "hu-enterprise__title" }, props.title ?? "Workflow designer"), h("div", { class: "hu-enterprise__meta" }, props.description ?? `${props.nodes.length} nodes · ${props.edges?.length ?? 0} edges`)), props.onAddNode && Button({ type: "button", size: "sm", children: "Add node", onClick: props.onAddNode })), h("div", { class: "hu-workflow-designer__canvas", role: "application", "aria-label": "Workflow canvas" }, h("svg", { class: "hu-workflow-designer__edges", viewBox: "0 0 760 320", "aria-hidden": "true" }, ...(props.edges ?? []).map((edge) => {
356
+ const from = nodeMap.get(edge.from);
357
+ const to = nodeMap.get(edge.to);
358
+ if (!from || !to)
359
+ return false;
360
+ return h("line", {
361
+ key: edge.id,
362
+ x1: from.x + 160,
363
+ y1: from.y + 36,
364
+ x2: to.x,
365
+ y2: to.y + 36,
366
+ stroke: "var(--hu-border-2)",
367
+ "stroke-width": 2
368
+ });
369
+ })), ...props.nodes.map((node, index) => {
370
+ const position = resolveWorkflowNodePosition(node, index);
371
+ return h("button", {
372
+ key: node.id,
373
+ type: "button",
374
+ class: "hu-workflow-node",
375
+ style: `inset-inline-start:${position.x}px;inset-block-start:${position.y}px`,
376
+ "aria-selected": props.selectedNode === node.id ? "true" : "false",
377
+ onClick: () => props.onNodeSelect?.(node)
378
+ }, h("span", { class: "hu-workflow-node__label" }, node.label), h("span", { class: "hu-workflow-node__meta" }, node.type ?? "task"), node.description && h("span", { class: "hu-workflow-node__meta" }, node.description));
379
+ })));
380
+ }
381
+ export function DocumentViewer(props) {
382
+ injectCSS("hu-enterprise", ENTERPRISE_CSS);
383
+ const page = props.page ?? 1;
384
+ const pages = Math.max(1, props.document.pages ?? 1);
385
+ return h("section", { class: cn("hu-enterprise hu-document-viewer", props.class), "aria-label": props.title ?? "Document viewer" }, h("div", { class: "hu-document-viewer__toolbar" }, h("div", {}, h("div", { class: "hu-document-viewer__name" }, props.title ?? props.document.name), h("div", { class: "hu-document-viewer__meta" }, props.description ?? [props.document.kind ?? "unknown", props.document.size, `${page} / ${pages}`].filter(Boolean).join(" · "))), h("div", { class: "hu-document-viewer__actions" }, Button({ type: "button", size: "sm", variant: "secondary", disabled: page <= 1, children: "Previous", onClick: () => props.onPageChange?.(page - 1) }), Button({ type: "button", size: "sm", variant: "secondary", disabled: page >= pages, children: "Next", onClick: () => props.onPageChange?.(page + 1) }), props.onDownload && Button({ type: "button", size: "sm", children: "Download", onClick: () => props.onDownload?.(props.document) }))), h("div", { class: "hu-document-viewer__frame", role: "document", "aria-label": props.document.name }, props.document.kind === "image" && props.document.url
386
+ ? h("img", { src: props.document.url, alt: props.document.name, loading: "lazy" })
387
+ : h("div", { class: "hu-document-viewer__preview" }, props.document.content ?? `${props.document.name}\n${props.document.kind ?? "unknown"} preview`)));
388
+ }
389
+ function enterpriseHeader(title, meta) {
390
+ return h("div", { class: "hu-enterprise__header" }, h("div", {}, h("div", { class: "hu-enterprise__title" }, title), h("div", { class: "hu-enterprise__meta" }, meta)));
391
+ }
392
+ function formatMetadata(metadata) {
393
+ if (!metadata || Object.keys(metadata).length === 0)
394
+ return "";
395
+ return Object.entries(metadata).map(([key, value]) => `${key}: ${String(value)}`).join(" · ");
396
+ }
397
+ function initials(name) {
398
+ return name.split(" ").slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("") || "?";
399
+ }
400
+ function countOrgNodes(nodes) {
401
+ return nodes.reduce((total, node) => total + 1 + countOrgNodes(node.reports ?? []), 0);
402
+ }
403
+ function renderOrgNode(node, onNodeSelect, level) {
404
+ const hasReports = (node.reports?.length ?? 0) > 0;
405
+ return h("div", { key: node.id, role: "treeitem", "aria-level": level, "aria-expanded": hasReports ? "true" : undefined }, h("article", {
406
+ class: "hu-org-node",
407
+ onClick: onNodeSelect ? () => onNodeSelect(node) : undefined
408
+ }, h("span", { class: "hu-org-node__avatar", "aria-hidden": "true" }, node.avatar ?? initials(node.name)), h("div", {}, h("div", { class: "hu-org-node__name" }, node.name), h("div", { class: "hu-org-node__meta" }, [node.title, node.department].filter(Boolean).join(" · "))), hasReports && h("span", { class: "hu-enterprise__meta" }, `${node.reports.length} reports`)), hasReports && h("div", { class: "hu-org-chart__children", role: "group" }, ...node.reports.map((report) => renderOrgNode(report, onNodeSelect, level + 1))));
409
+ }
410
+ function parseDate(value) {
411
+ return new Date(`${value}T00:00:00.000Z`);
412
+ }
413
+ function daysBetween(start, end) {
414
+ return Math.max(0, Math.round((end.getTime() - start.getTime()) / 86400000));
415
+ }
416
+ function getGanttRange(tasks) {
417
+ const starts = tasks.map((task) => parseDate(task.start).getTime());
418
+ const ends = tasks.map((task) => parseDate(task.end).getTime());
419
+ const start = new Date(starts.length ? Math.min(...starts) : Date.now());
420
+ const end = new Date(ends.length ? Math.max(...ends) : start.getTime());
421
+ return { start, end, days: Math.max(1, daysBetween(start, end)) };
422
+ }
423
+ function resolveWorkflowNodePosition(node, index) {
424
+ return {
425
+ x: node.x ?? 24 + index * 180,
426
+ y: node.y ?? 32 + index % 2 * 96
427
+ };
428
+ }
@@ -0,0 +1,132 @@
1
+ import { type VNode } from "../theme/index.js";
2
+ export type ValidationRule<TValues extends Record<string, unknown>, TKey extends keyof TValues = keyof TValues> = {
3
+ required?: boolean | string;
4
+ validate?: (value: TValues[TKey], values: TValues) => string | undefined;
5
+ };
6
+ export type ValidationSchema<TValues extends Record<string, unknown>> = {
7
+ [K in keyof TValues]?: ValidationRule<TValues, K>;
8
+ };
9
+ export interface ValidationEngine<TValues extends Record<string, unknown>> {
10
+ validate(values: TValues): Partial<Record<keyof TValues, string>>;
11
+ isValid(values: TValues): boolean;
12
+ }
13
+ export declare function createValidationEngine<TValues extends Record<string, unknown>>(schema: ValidationSchema<TValues>): ValidationEngine<TValues>;
14
+ export interface FormProps<TValues extends Record<string, unknown> = Record<string, unknown>> {
15
+ values?: TValues;
16
+ schema?: ValidationSchema<TValues>;
17
+ actions?: unknown;
18
+ class?: string;
19
+ children?: unknown;
20
+ onSubmit?: (values: TValues) => void;
21
+ }
22
+ export declare function Form<TValues extends Record<string, unknown> = Record<string, unknown>>(props: FormProps<TValues>): VNode;
23
+ export interface FormFieldProps {
24
+ id: string;
25
+ name?: string;
26
+ label?: string;
27
+ description?: string;
28
+ error?: string;
29
+ required?: boolean;
30
+ class?: string;
31
+ children?: unknown;
32
+ }
33
+ export declare function FormField(props: FormFieldProps): VNode;
34
+ export interface FormSectionProps {
35
+ title?: string;
36
+ description?: string;
37
+ class?: string;
38
+ children?: unknown;
39
+ }
40
+ export declare function FormSection(props: FormSectionProps): VNode;
41
+ export interface WizardFormStep {
42
+ id: string;
43
+ title: string;
44
+ fields?: string[];
45
+ content?: unknown;
46
+ }
47
+ export interface WizardFormProps<TValues extends Record<string, unknown> = Record<string, unknown>> {
48
+ values?: TValues;
49
+ schema?: ValidationSchema<TValues>;
50
+ steps: WizardFormStep[];
51
+ activeStep?: string;
52
+ class?: string;
53
+ onStepChange?: (stepId: string) => void;
54
+ onSubmit?: (values: TValues) => void;
55
+ }
56
+ export declare function WizardForm<TValues extends Record<string, unknown> = Record<string, unknown>>(props: WizardFormProps<TValues>): VNode;
57
+ export type DynamicFormFieldType = "text" | "email" | "password" | "number" | "select" | "switch" | "textarea";
58
+ export interface DynamicFormField {
59
+ name: string;
60
+ label: string;
61
+ type?: DynamicFormFieldType;
62
+ required?: boolean;
63
+ fullWidth?: boolean;
64
+ options?: Array<{
65
+ label: string;
66
+ value: string;
67
+ disabled?: boolean;
68
+ }>;
69
+ }
70
+ export interface DynamicFormProps<TValues extends Record<string, unknown> = Record<string, unknown>> {
71
+ values: TValues;
72
+ fields: DynamicFormField[];
73
+ schema?: ValidationSchema<TValues>;
74
+ columns?: number;
75
+ class?: string;
76
+ onChange?: (name: keyof TValues, value: unknown) => void;
77
+ }
78
+ export declare function DynamicForm<TValues extends Record<string, unknown> = Record<string, unknown>>(props: DynamicFormProps<TValues>): VNode;
79
+ export interface FileUploadFile {
80
+ name: string;
81
+ size?: number;
82
+ type?: string;
83
+ }
84
+ export interface FileUploadProps {
85
+ id?: string;
86
+ name?: string;
87
+ label?: string;
88
+ hint?: string;
89
+ accept?: string;
90
+ multiple?: boolean;
91
+ disabled?: boolean;
92
+ files?: FileUploadFile[];
93
+ class?: string;
94
+ onChange?: (files: FileList | File[]) => void;
95
+ }
96
+ export declare function FileUpload(props?: FileUploadProps): VNode;
97
+ export interface DropzoneProps extends FileUploadProps {
98
+ active?: boolean;
99
+ title?: string;
100
+ minHeight?: string | number;
101
+ onDropFiles?: (files: FileList | File[]) => void;
102
+ }
103
+ export declare function Dropzone(props?: DropzoneProps): VNode;
104
+ export interface CodeEntryProps {
105
+ label?: string;
106
+ value?: string;
107
+ length?: number;
108
+ mask?: boolean;
109
+ disabled?: boolean;
110
+ inputMode?: "numeric" | "text";
111
+ autoComplete?: string;
112
+ class?: string;
113
+ onChange?: (value: string) => void;
114
+ }
115
+ export interface OTPInputProps extends CodeEntryProps {
116
+ }
117
+ export interface PinInputProps extends CodeEntryProps {
118
+ }
119
+ export declare function OTPInput(props?: OTPInputProps): VNode;
120
+ export declare function PinInput(props?: PinInputProps): VNode;
121
+ export interface ColorPickerProps {
122
+ id?: string;
123
+ label?: string;
124
+ value?: string;
125
+ defaultValue?: string;
126
+ disabled?: boolean;
127
+ hint?: string;
128
+ class?: string;
129
+ onChange?: (value: string, event: Event) => void;
130
+ }
131
+ export declare function ColorPicker(props?: ColorPickerProps): VNode;
132
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/components/form.ts"],"names":[],"mappings":"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"}