@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.
- package/LICENSE +21 -0
- package/README.md +82 -0
- package/dist/components/Accordion/index.d.ts +17 -0
- package/dist/components/Accordion/index.d.ts.map +1 -0
- package/dist/components/Accordion/index.js +46 -0
- package/dist/components/Alert/index.d.ts +13 -0
- package/dist/components/Alert/index.d.ts.map +1 -0
- package/dist/components/Alert/index.js +46 -0
- package/dist/components/AppBar/index.d.ts +19 -0
- package/dist/components/AppBar/index.d.ts.map +1 -0
- package/dist/components/AppBar/index.js +48 -0
- package/dist/components/AspectRatio/index.d.ts +8 -0
- package/dist/components/AspectRatio/index.d.ts.map +1 -0
- package/dist/components/AspectRatio/index.js +32 -0
- package/dist/components/Autocomplete/index.d.ts +21 -0
- package/dist/components/Autocomplete/index.d.ts.map +1 -0
- package/dist/components/Autocomplete/index.js +94 -0
- package/dist/components/Avatar/index.d.ts +12 -0
- package/dist/components/Avatar/index.d.ts.map +1 -0
- package/dist/components/Avatar/index.js +32 -0
- package/dist/components/AvatarGroup/index.d.ts +9 -0
- package/dist/components/AvatarGroup/index.d.ts.map +1 -0
- package/dist/components/AvatarGroup/index.js +24 -0
- package/dist/components/Backdrop/index.d.ts +10 -0
- package/dist/components/Backdrop/index.d.ts.map +1 -0
- package/dist/components/Backdrop/index.js +25 -0
- package/dist/components/Badge/index.d.ts +10 -0
- package/dist/components/Badge/index.d.ts.map +1 -0
- package/dist/components/Badge/index.js +30 -0
- package/dist/components/BottomNavigation/index.d.ts +16 -0
- package/dist/components/BottomNavigation/index.d.ts.map +1 -0
- package/dist/components/BottomNavigation/index.js +43 -0
- package/dist/components/Box/index.d.ts +21 -0
- package/dist/components/Box/index.d.ts.map +1 -0
- package/dist/components/Box/index.js +30 -0
- package/dist/components/Breadcrumb/index.d.ts +13 -0
- package/dist/components/Breadcrumb/index.d.ts.map +1 -0
- package/dist/components/Breadcrumb/index.js +19 -0
- package/dist/components/Button/index.d.ts +22 -0
- package/dist/components/Button/index.d.ts.map +1 -0
- package/dist/components/Button/index.js +93 -0
- package/dist/components/ButtonGroup/index.d.ts +9 -0
- package/dist/components/ButtonGroup/index.d.ts.map +1 -0
- package/dist/components/ButtonGroup/index.js +27 -0
- package/dist/components/Card/index.d.ts +14 -0
- package/dist/components/Card/index.d.ts.map +1 -0
- package/dist/components/Card/index.js +33 -0
- package/dist/components/Checkbox/index.d.ts +17 -0
- package/dist/components/Checkbox/index.d.ts.map +1 -0
- package/dist/components/Checkbox/index.js +42 -0
- package/dist/components/Chip/index.d.ts +18 -0
- package/dist/components/Chip/index.d.ts.map +1 -0
- package/dist/components/Chip/index.js +60 -0
- package/dist/components/CircularProgress/index.d.ts +14 -0
- package/dist/components/CircularProgress/index.d.ts.map +1 -0
- package/dist/components/CircularProgress/index.js +58 -0
- package/dist/components/ClickAwayListener/index.d.ts +11 -0
- package/dist/components/ClickAwayListener/index.d.ts.map +1 -0
- package/dist/components/ClickAwayListener/index.js +31 -0
- package/dist/components/Code/index.d.ts +9 -0
- package/dist/components/Code/index.d.ts.map +1 -0
- package/dist/components/Code/index.js +50 -0
- package/dist/components/Collapse/index.d.ts +11 -0
- package/dist/components/Collapse/index.d.ts.map +1 -0
- package/dist/components/Collapse/index.js +30 -0
- package/dist/components/CommandPalette/index.d.ts +26 -0
- package/dist/components/CommandPalette/index.d.ts.map +1 -0
- package/dist/components/CommandPalette/index.js +141 -0
- package/dist/components/Container/index.d.ts +11 -0
- package/dist/components/Container/index.d.ts.map +1 -0
- package/dist/components/Container/index.js +18 -0
- package/dist/components/DashboardLayout/index.d.ts +15 -0
- package/dist/components/DashboardLayout/index.d.ts.map +1 -0
- package/dist/components/DashboardLayout/index.js +67 -0
- package/dist/components/DataTable/index.d.ts +27 -0
- package/dist/components/DataTable/index.d.ts.map +1 -0
- package/dist/components/DataTable/index.js +59 -0
- package/dist/components/Dialog/index.d.ts +19 -0
- package/dist/components/Dialog/index.d.ts.map +1 -0
- package/dist/components/Dialog/index.js +96 -0
- package/dist/components/Divider/index.d.ts +13 -0
- package/dist/components/Divider/index.d.ts.map +1 -0
- package/dist/components/Divider/index.js +40 -0
- package/dist/components/Drawer/index.d.ts +17 -0
- package/dist/components/Drawer/index.d.ts.map +1 -0
- package/dist/components/Drawer/index.js +77 -0
- package/dist/components/DropdownMenu/index.d.ts +25 -0
- package/dist/components/DropdownMenu/index.d.ts.map +1 -0
- package/dist/components/DropdownMenu/index.js +67 -0
- package/dist/components/EmptyState/index.d.ts +11 -0
- package/dist/components/EmptyState/index.d.ts.map +1 -0
- package/dist/components/EmptyState/index.js +53 -0
- package/dist/components/ErrorState/index.d.ts +12 -0
- package/dist/components/ErrorState/index.d.ts.map +1 -0
- package/dist/components/ErrorState/index.js +54 -0
- package/dist/components/Fab/index.d.ts +16 -0
- package/dist/components/Fab/index.d.ts.map +1 -0
- package/dist/components/Fab/index.js +39 -0
- package/dist/components/Fade/index.d.ts +10 -0
- package/dist/components/Fade/index.d.ts.map +1 -0
- package/dist/components/Fade/index.js +13 -0
- package/dist/components/FocusTrap/index.d.ts +11 -0
- package/dist/components/FocusTrap/index.d.ts.map +1 -0
- package/dist/components/FocusTrap/index.js +69 -0
- package/dist/components/FormControl/index.d.ts +34 -0
- package/dist/components/FormControl/index.d.ts.map +1 -0
- package/dist/components/FormControl/index.js +52 -0
- package/dist/components/GlobalSearch/index.d.ts +23 -0
- package/dist/components/GlobalSearch/index.d.ts.map +1 -0
- package/dist/components/GlobalSearch/index.js +91 -0
- package/dist/components/Grid/index.d.ts +19 -0
- package/dist/components/Grid/index.d.ts.map +1 -0
- package/dist/components/Grid/index.js +30 -0
- package/dist/components/Grow/index.d.ts +10 -0
- package/dist/components/Grow/index.d.ts.map +1 -0
- package/dist/components/Grow/index.js +13 -0
- package/dist/components/IconButton/index.d.ts +16 -0
- package/dist/components/IconButton/index.d.ts.map +1 -0
- package/dist/components/IconButton/index.js +43 -0
- package/dist/components/ImageList/index.d.ts +21 -0
- package/dist/components/ImageList/index.d.ts.map +1 -0
- package/dist/components/ImageList/index.js +39 -0
- package/dist/components/Input/index.d.ts +33 -0
- package/dist/components/Input/index.d.ts.map +1 -0
- package/dist/components/Input/index.js +45 -0
- package/dist/components/Kbd/index.d.ts +8 -0
- package/dist/components/Kbd/index.d.ts.map +1 -0
- package/dist/components/Kbd/index.js +41 -0
- package/dist/components/KeyboardShortcut/index.d.ts +20 -0
- package/dist/components/KeyboardShortcut/index.d.ts.map +1 -0
- package/dist/components/KeyboardShortcut/index.js +63 -0
- package/dist/components/Label/index.d.ts +10 -0
- package/dist/components/Label/index.d.ts.map +1 -0
- package/dist/components/Label/index.js +17 -0
- package/dist/components/LinearProgress/index.d.ts +13 -0
- package/dist/components/LinearProgress/index.d.ts.map +1 -0
- package/dist/components/LinearProgress/index.js +69 -0
- package/dist/components/Link/index.d.ts +16 -0
- package/dist/components/Link/index.d.ts.map +1 -0
- package/dist/components/Link/index.js +25 -0
- package/dist/components/List/index.d.ts +40 -0
- package/dist/components/List/index.d.ts.map +1 -0
- package/dist/components/List/index.js +70 -0
- package/dist/components/LoadingState/index.d.ts +11 -0
- package/dist/components/LoadingState/index.d.ts.map +1 -0
- package/dist/components/LoadingState/index.js +66 -0
- package/dist/components/Menu/index.d.ts +40 -0
- package/dist/components/Menu/index.d.ts.map +1 -0
- package/dist/components/Menu/index.js +103 -0
- package/dist/components/MobileStepper/index.d.ts +16 -0
- package/dist/components/MobileStepper/index.d.ts.map +1 -0
- package/dist/components/MobileStepper/index.js +67 -0
- package/dist/components/Modal/index.d.ts +14 -0
- package/dist/components/Modal/index.d.ts.map +1 -0
- package/dist/components/Modal/index.js +51 -0
- package/dist/components/Navbar/index.d.ts +14 -0
- package/dist/components/Navbar/index.d.ts.map +1 -0
- package/dist/components/Navbar/index.js +27 -0
- package/dist/components/NoSSR/index.d.ts +7 -0
- package/dist/components/NoSSR/index.d.ts.map +1 -0
- package/dist/components/NoSSR/index.js +9 -0
- package/dist/components/PageLayout/index.d.ts +13 -0
- package/dist/components/PageLayout/index.d.ts.map +1 -0
- package/dist/components/PageLayout/index.js +41 -0
- package/dist/components/Pagination/index.d.ts +11 -0
- package/dist/components/Pagination/index.d.ts.map +1 -0
- package/dist/components/Pagination/index.js +56 -0
- package/dist/components/Paper/index.d.ts +12 -0
- package/dist/components/Paper/index.d.ts.map +1 -0
- package/dist/components/Paper/index.js +24 -0
- package/dist/components/Popover/index.d.ts +13 -0
- package/dist/components/Popover/index.d.ts.map +1 -0
- package/dist/components/Popover/index.js +34 -0
- package/dist/components/Progress/index.d.ts +13 -0
- package/dist/components/Progress/index.d.ts.map +1 -0
- package/dist/components/Progress/index.js +40 -0
- package/dist/components/Radio/index.d.ts +7 -0
- package/dist/components/Radio/index.d.ts.map +1 -0
- package/dist/components/Radio/index.js +28 -0
- package/dist/components/Rating/index.d.ts +15 -0
- package/dist/components/Rating/index.d.ts.map +1 -0
- package/dist/components/Rating/index.js +41 -0
- package/dist/components/ResizablePanel/index.d.ts +16 -0
- package/dist/components/ResizablePanel/index.d.ts.map +1 -0
- package/dist/components/ResizablePanel/index.js +41 -0
- package/dist/components/ScrollArea/index.d.ts +12 -0
- package/dist/components/ScrollArea/index.d.ts.map +1 -0
- package/dist/components/ScrollArea/index.js +50 -0
- package/dist/components/Select/index.d.ts +23 -0
- package/dist/components/Select/index.d.ts.map +1 -0
- package/dist/components/Select/index.js +52 -0
- package/dist/components/Sheet/index.d.ts +15 -0
- package/dist/components/Sheet/index.d.ts.map +1 -0
- package/dist/components/Sheet/index.js +61 -0
- package/dist/components/Sidebar/index.d.ts +23 -0
- package/dist/components/Sidebar/index.d.ts.map +1 -0
- package/dist/components/Sidebar/index.js +37 -0
- package/dist/components/Skeleton/index.d.ts +9 -0
- package/dist/components/Skeleton/index.d.ts.map +1 -0
- package/dist/components/Skeleton/index.js +22 -0
- package/dist/components/Slide/index.d.ts +12 -0
- package/dist/components/Slide/index.d.ts.map +1 -0
- package/dist/components/Slide/index.js +21 -0
- package/dist/components/Slider/index.d.ts +19 -0
- package/dist/components/Slider/index.d.ts.map +1 -0
- package/dist/components/Slider/index.js +49 -0
- package/dist/components/Snackbar/index.d.ts +28 -0
- package/dist/components/Snackbar/index.d.ts.map +1 -0
- package/dist/components/Snackbar/index.js +71 -0
- package/dist/components/SpeedDial/index.d.ts +18 -0
- package/dist/components/SpeedDial/index.d.ts.map +1 -0
- package/dist/components/SpeedDial/index.js +71 -0
- package/dist/components/Spinner/index.d.ts +10 -0
- package/dist/components/Spinner/index.d.ts.map +1 -0
- package/dist/components/Spinner/index.js +67 -0
- package/dist/components/SplitPane/index.d.ts +11 -0
- package/dist/components/SplitPane/index.d.ts.map +1 -0
- package/dist/components/SplitPane/index.js +46 -0
- package/dist/components/Stack/index.d.ts +17 -0
- package/dist/components/Stack/index.d.ts.map +1 -0
- package/dist/components/Stack/index.js +30 -0
- package/dist/components/Stepper/index.d.ts +20 -0
- package/dist/components/Stepper/index.d.ts.map +1 -0
- package/dist/components/Stepper/index.js +66 -0
- package/dist/components/Switch/index.d.ts +13 -0
- package/dist/components/Switch/index.d.ts.map +1 -0
- package/dist/components/Switch/index.js +38 -0
- package/dist/components/Tabs/index.d.ts +20 -0
- package/dist/components/Tabs/index.d.ts.map +1 -0
- package/dist/components/Tabs/index.js +62 -0
- package/dist/components/TextField/index.d.ts +35 -0
- package/dist/components/TextField/index.d.ts.map +1 -0
- package/dist/components/TextField/index.js +69 -0
- package/dist/components/Textarea/index.d.ts +22 -0
- package/dist/components/Textarea/index.d.ts.map +1 -0
- package/dist/components/Textarea/index.js +27 -0
- package/dist/components/Timeline/index.d.ts +16 -0
- package/dist/components/Timeline/index.d.ts.map +1 -0
- package/dist/components/Timeline/index.js +30 -0
- package/dist/components/Toast/index.d.ts +34 -0
- package/dist/components/Toast/index.d.ts.map +1 -0
- package/dist/components/Toast/index.js +106 -0
- package/dist/components/ToggleButton/index.d.ts +21 -0
- package/dist/components/ToggleButton/index.d.ts.map +1 -0
- package/dist/components/ToggleButton/index.js +81 -0
- package/dist/components/Tooltip/index.d.ts +14 -0
- package/dist/components/Tooltip/index.d.ts.map +1 -0
- package/dist/components/Tooltip/index.js +47 -0
- package/dist/components/TreeView/index.d.ts +19 -0
- package/dist/components/TreeView/index.d.ts.map +1 -0
- package/dist/components/TreeView/index.js +50 -0
- package/dist/components/Typography/index.d.ts +17 -0
- package/dist/components/Typography/index.d.ts.map +1 -0
- package/dist/components/Typography/index.js +44 -0
- package/dist/components/VisuallyHidden/index.d.ts +7 -0
- package/dist/components/VisuallyHidden/index.d.ts.map +1 -0
- package/dist/components/VisuallyHidden/index.js +18 -0
- package/dist/components/Zoom/index.d.ts +10 -0
- package/dist/components/Zoom/index.d.ts.map +1 -0
- package/dist/components/Zoom/index.js +13 -0
- package/dist/components/ai.d.ts +133 -0
- package/dist/components/ai.d.ts.map +1 -0
- package/dist/components/ai.js +184 -0
- package/dist/components/charts.d.ts +143 -0
- package/dist/components/charts.d.ts.map +1 -0
- package/dist/components/charts.js +435 -0
- package/dist/components/data.d.ts +192 -0
- package/dist/components/data.d.ts.map +1 -0
- package/dist/components/data.js +581 -0
- package/dist/components/date.d.ts +73 -0
- package/dist/components/date.d.ts.map +1 -0
- package/dist/components/date.js +199 -0
- package/dist/components/enterprise.d.ts +246 -0
- package/dist/components/enterprise.d.ts.map +1 -0
- package/dist/components/enterprise.js +428 -0
- package/dist/components/form.d.ts +132 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.js +380 -0
- package/dist/components/index.d.ts +173 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +107 -0
- package/dist/components/inputs.d.ts +169 -0
- package/dist/components/inputs.d.ts.map +1 -0
- package/dist/components/inputs.js +437 -0
- package/dist/components/layout.d.ts +224 -0
- package/dist/components/layout.d.ts.map +1 -0
- package/dist/components/layout.js +644 -0
- package/dist/components/overlay.d.ts +102 -0
- package/dist/components/overlay.d.ts.map +1 -0
- package/dist/components/overlay.js +318 -0
- package/dist/components/surfaces.d.ts +180 -0
- package/dist/components/surfaces.d.ts.map +1 -0
- package/dist/components/surfaces.js +423 -0
- package/dist/components/typography.d.ts +69 -0
- package/dist/components/typography.d.ts.map +1 -0
- package/dist/components/typography.js +206 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/portal.d.ts +3 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +17 -0
- package/dist/theme/index.d.ts +31 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +258 -0
- package/dist/tokens/component.d.ts +124 -0
- package/dist/tokens/component.d.ts.map +1 -0
- package/dist/tokens/component.js +113 -0
- package/dist/tokens/index.d.ts +494 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +345 -0
- package/dist/tokens/primitives.d.ts +675 -0
- package/dist/tokens/primitives.d.ts.map +1 -0
- package/dist/tokens/primitives.js +356 -0
- package/dist/tokens/semantic.d.ts +252 -0
- package/dist/tokens/semantic.d.ts.map +1 -0
- package/dist/tokens/semantic.js +242 -0
- package/dist/tokens/themes.d.ts +18 -0
- package/dist/tokens/themes.d.ts.map +1 -0
- package/dist/tokens/themes.js +316 -0
- 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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"}
|