@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,67 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
const CSS = `
|
|
3
|
+
.hu-mobile-stepper {
|
|
4
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
5
|
+
padding: var(--hu-space-2) var(--hu-space-2);
|
|
6
|
+
background: var(--hu-bg); border-top: 1px solid var(--hu-border);
|
|
7
|
+
}
|
|
8
|
+
.hu-mobile-stepper--bottom { position: fixed; bottom: 0; left: 0; right: 0; z-index: 50; }
|
|
9
|
+
.hu-mobile-stepper--static { position: static; }
|
|
10
|
+
|
|
11
|
+
.hu-mobile-stepper__dots { display: flex; align-items: center; gap: 6px; }
|
|
12
|
+
.hu-mobile-stepper__dot {
|
|
13
|
+
width: 8px; height: 8px; border-radius: 50%;
|
|
14
|
+
background: var(--hu-border-2);
|
|
15
|
+
transition: width var(--hu-duration) var(--hu-ease), background var(--hu-duration) var(--hu-ease), border-radius var(--hu-duration) var(--hu-ease);
|
|
16
|
+
}
|
|
17
|
+
.hu-mobile-stepper__dot--active { background: var(--hu-primary); width: 20px; border-radius: 4px; }
|
|
18
|
+
|
|
19
|
+
.hu-mobile-stepper__progress {
|
|
20
|
+
flex: 1; margin: 0 var(--hu-space-3); height: 4px;
|
|
21
|
+
background: var(--hu-border-2); border-radius: 2px; overflow: hidden;
|
|
22
|
+
}
|
|
23
|
+
.hu-mobile-stepper__progress-bar {
|
|
24
|
+
height: 100%; background: var(--hu-primary); border-radius: inherit;
|
|
25
|
+
transition: width 300ms cubic-bezier(.4,0,.2,1);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.hu-mobile-stepper__text {
|
|
29
|
+
font-size: var(--hu-font-size-sm); color: var(--hu-text-2);
|
|
30
|
+
font-weight: var(--hu-font-weight-medium);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.hu-mobile-stepper__btn {
|
|
34
|
+
background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2)); border: 1px solid var(--hu-border); color: var(--hu-text);
|
|
35
|
+
min-height: 36px; padding: var(--hu-space-2) var(--hu-space-3); border-radius: var(--hu-radius-md);
|
|
36
|
+
cursor: pointer; font-size: var(--hu-font-size-sm); font-family: var(--hu-font-sans);
|
|
37
|
+
font-weight: var(--hu-font-weight-medium);
|
|
38
|
+
transition: background var(--hu-duration) var(--hu-ease), border-color var(--hu-duration) var(--hu-ease), color var(--hu-duration) var(--hu-ease), box-shadow var(--hu-duration) var(--hu-ease);
|
|
39
|
+
display: flex; align-items: center; gap: var(--hu-space-1);
|
|
40
|
+
}
|
|
41
|
+
.hu-mobile-stepper__btn:hover { background: var(--hu-bg-3); border-color: var(--hu-border-2); }
|
|
42
|
+
.hu-mobile-stepper__btn:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 2px; }
|
|
43
|
+
.hu-mobile-stepper__btn:disabled { opacity: .4; pointer-events: none; }
|
|
44
|
+
`;
|
|
45
|
+
export function MobileStepper(props) {
|
|
46
|
+
injectCSS("hu-mobile-stepper", CSS);
|
|
47
|
+
const { steps, activeStep, variant = "dots", position = "static" } = props;
|
|
48
|
+
const progress = (activeStep / (steps - 1)) * 100;
|
|
49
|
+
const center = variant === "dots"
|
|
50
|
+
? h("div", { class: "hu-mobile-stepper__dots" }, ...Array.from({ length: steps }, (_, i) => h("span", { class: cn("hu-mobile-stepper__dot", i === activeStep && "hu-mobile-stepper__dot--active") })))
|
|
51
|
+
: variant === "progress"
|
|
52
|
+
? h("div", { class: "hu-mobile-stepper__progress" }, h("div", { class: "hu-mobile-stepper__progress-bar", style: `width:${progress}%` }))
|
|
53
|
+
: h("span", { class: "hu-mobile-stepper__text" }, `${activeStep + 1} / ${steps}`);
|
|
54
|
+
const back = props.backButton ?? h("button", {
|
|
55
|
+
class: "hu-mobile-stepper__btn",
|
|
56
|
+
onClick: props.onBack,
|
|
57
|
+
disabled: activeStep === 0
|
|
58
|
+
}, "← Back");
|
|
59
|
+
const next = props.nextButton ?? h("button", {
|
|
60
|
+
class: "hu-mobile-stepper__btn",
|
|
61
|
+
onClick: props.onNext,
|
|
62
|
+
disabled: activeStep === steps - 1
|
|
63
|
+
}, "Next →");
|
|
64
|
+
return h("div", {
|
|
65
|
+
class: cn("hu-mobile-stepper", `hu-mobile-stepper--${position}`, props.class)
|
|
66
|
+
}, back, center, next);
|
|
67
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
export interface ModalProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onClose?: (reason?: "backdrop" | "escape") => void;
|
|
5
|
+
onOpenChange?: (open: boolean, reason?: "backdrop" | "escape") => void;
|
|
6
|
+
align?: "center" | "top" | "bottom";
|
|
7
|
+
disableBackdropClick?: boolean;
|
|
8
|
+
disableEscapeKey?: boolean;
|
|
9
|
+
keepMounted?: boolean;
|
|
10
|
+
class?: string;
|
|
11
|
+
children?: unknown;
|
|
12
|
+
}
|
|
13
|
+
export declare function Modal(props: ModalProps): VNode | null;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Modal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAyBpE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAC;IACnD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAC;IACvE,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,GAAG,IAAI,CA6BrD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
import { renderInPortal } from "../../portal.js";
|
|
3
|
+
import { FocusTrap } from "../FocusTrap/index.js";
|
|
4
|
+
const CSS = `
|
|
5
|
+
.hu-modal {
|
|
6
|
+
position: fixed; inset: 0; z-index: var(--hu-z-modal);
|
|
7
|
+
display: flex; align-items: center; justify-content: center;
|
|
8
|
+
padding: var(--hu-space-4);
|
|
9
|
+
}
|
|
10
|
+
.hu-modal__backdrop {
|
|
11
|
+
position: absolute; inset: 0; background: var(--hu-overlay);
|
|
12
|
+
animation: hu-modal-bg-in 180ms ease forwards;
|
|
13
|
+
}
|
|
14
|
+
.hu-modal__content {
|
|
15
|
+
position: relative; z-index: 1; max-height: 90vh; overflow-y: auto;
|
|
16
|
+
outline: none;
|
|
17
|
+
animation: hu-modal-in 200ms cubic-bezier(.34,1.56,.64,1) forwards;
|
|
18
|
+
}
|
|
19
|
+
@keyframes hu-modal-bg-in { from { opacity: 0; } to { opacity: 1; } }
|
|
20
|
+
@keyframes hu-modal-in { from { opacity: 0; transform: scale(.94); } to { opacity: 1; transform: scale(1); } }
|
|
21
|
+
.hu-modal--align-top { align-items: flex-start; padding-top: var(--hu-space-8); }
|
|
22
|
+
.hu-modal--align-bottom { align-items: flex-end; padding-bottom: var(--hu-space-8); }
|
|
23
|
+
`;
|
|
24
|
+
export function Modal(props) {
|
|
25
|
+
injectCSS("hu-modal", CSS);
|
|
26
|
+
const { open, onClose, onOpenChange, align = "center", disableBackdropClick } = props;
|
|
27
|
+
const close = (reason) => {
|
|
28
|
+
onOpenChange?.(false, reason);
|
|
29
|
+
onClose?.(reason);
|
|
30
|
+
};
|
|
31
|
+
if (!open && !props.keepMounted)
|
|
32
|
+
return null;
|
|
33
|
+
if (!open)
|
|
34
|
+
return h("div", { style: "display:none", "aria-hidden": "true" }, props.children);
|
|
35
|
+
return renderInPortal(h("div", {
|
|
36
|
+
class: cn("hu-modal", align !== "center" && `hu-modal--align-${align}`, props.class),
|
|
37
|
+
role: "dialog",
|
|
38
|
+
"aria-modal": "true",
|
|
39
|
+
onKeydown: !props.disableEscapeKey && onClose ? (e) => { if (e.key === "Escape")
|
|
40
|
+
close("escape"); } : undefined
|
|
41
|
+
}, h("div", {
|
|
42
|
+
class: "hu-modal__backdrop",
|
|
43
|
+
onClick: !disableBackdropClick && onClose ? () => close("backdrop") : undefined
|
|
44
|
+
}), FocusTrap({
|
|
45
|
+
active: true,
|
|
46
|
+
restoreFocus: true,
|
|
47
|
+
autoFocus: true,
|
|
48
|
+
onEscape: !props.disableEscapeKey && onClose ? () => close("escape") : undefined,
|
|
49
|
+
children: h("div", { class: "hu-modal__content", tabindex: "-1" }, props.children)
|
|
50
|
+
})), "modal");
|
|
51
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
export interface NavLink {
|
|
3
|
+
label: string;
|
|
4
|
+
href: string;
|
|
5
|
+
active?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface NavbarProps {
|
|
8
|
+
brand?: unknown;
|
|
9
|
+
links?: NavLink[];
|
|
10
|
+
actions?: unknown;
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function Navbar(props: NavbarProps): VNode;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Navbar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAwBpE,MAAM,WAAW,OAAO;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAAE;AAE3E,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAWhD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
const NAVBAR_CSS = `
|
|
3
|
+
.hu-navbar {
|
|
4
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
5
|
+
gap: var(--hu-space-4); padding: 0 var(--hu-space-6); min-height: 60px;
|
|
6
|
+
border-bottom: 1px solid color-mix(in srgb, var(--hu-border) 82%, transparent);
|
|
7
|
+
position: sticky; top: 0; z-index: var(--hu-z-sticky);
|
|
8
|
+
backdrop-filter: blur(12px); background: color-mix(in srgb, var(--hu-bg) 88%, transparent);
|
|
9
|
+
box-shadow: var(--hu-shadow-xs);
|
|
10
|
+
}
|
|
11
|
+
.hu-navbar-brand { display: flex; align-items: center; gap: var(--hu-space-3); min-width: max-content; text-decoration: none; color: var(--hu-text); font-weight: var(--hu-font-weight-bold); font-size: var(--hu-font-size-md); }
|
|
12
|
+
.hu-navbar-nav { display: flex; align-items: center; gap: var(--hu-space-1); min-width: 0; overflow-x: auto; }
|
|
13
|
+
.hu-navbar-link {
|
|
14
|
+
padding: 7px 12px; border-radius: var(--hu-radius-md); font-size: var(--hu-font-size-sm); color: var(--hu-text-2);
|
|
15
|
+
text-decoration: none; font-weight: var(--hu-font-weight-medium); white-space: nowrap;
|
|
16
|
+
transition: background var(--hu-duration) var(--hu-ease), color var(--hu-duration) var(--hu-ease), box-shadow var(--hu-duration) var(--hu-ease);
|
|
17
|
+
}
|
|
18
|
+
.hu-navbar-link:hover { color: var(--hu-text); background: var(--hu-bg-3); }
|
|
19
|
+
.hu-navbar-link:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 2px; }
|
|
20
|
+
.hu-navbar-link--active { color: var(--hu-primary); background: var(--hu-primary-bg); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--hu-primary) 20%, transparent); }
|
|
21
|
+
.hu-navbar-actions { display: flex; align-items: center; gap: var(--hu-space-2); min-width: max-content; }
|
|
22
|
+
`;
|
|
23
|
+
export function Navbar(props) {
|
|
24
|
+
injectCSS("hu-navbar", NAVBAR_CSS);
|
|
25
|
+
const { brand, links = [], actions } = props;
|
|
26
|
+
return h("header", { class: cn("hu-navbar", props.class) }, brand && h("a", { class: "hu-navbar-brand", href: "/" }, brand), links.length > 0 && h("nav", { class: "hu-navbar-nav", "aria-label": "Main navigation" }, ...links.map((l) => h("a", { key: l.href, href: l.href, class: cn("hu-navbar-link", l.active && "hu-navbar-link--active") }, l.label))), actions && h("div", { class: "hu-navbar-actions" }, actions));
|
|
27
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/NoSSR/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAK,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAO9C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { signal, onMount } from "@hyperpackai/hyperion";
|
|
2
|
+
import { h } from "../../theme/index.js";
|
|
3
|
+
export function NoSSR(props) {
|
|
4
|
+
const mounted = signal(false);
|
|
5
|
+
onMount(() => { mounted.value = true; });
|
|
6
|
+
return (() => mounted.value
|
|
7
|
+
? h("span", { "data-hu-nosr": "mounted" }, props.children)
|
|
8
|
+
: h("span", { "data-hu-nosr": "fallback" }, props.fallback ?? null));
|
|
9
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
export interface PageLayoutProps {
|
|
3
|
+
header?: unknown;
|
|
4
|
+
footer?: unknown;
|
|
5
|
+
contained?: boolean;
|
|
6
|
+
stickyHeader?: boolean;
|
|
7
|
+
maxWidth?: string | number;
|
|
8
|
+
padding?: string | number;
|
|
9
|
+
class?: string;
|
|
10
|
+
children?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export declare function PageLayout(props: PageLayoutProps): VNode;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/PageLayout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AA8BpE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CAgBxD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
const ENTERPRISE_LAYOUT_CSS = `
|
|
3
|
+
.hu-page-layout {
|
|
4
|
+
min-height: 100dvh; display: grid; grid-template-rows: auto 1fr auto;
|
|
5
|
+
background: var(--hu-bg-2); color: var(--hu-text);
|
|
6
|
+
}
|
|
7
|
+
.hu-page-layout--contained .hu-page-layout__main {
|
|
8
|
+
width: 100%; max-width: var(--hu-page-max, 1200px); margin-inline: auto;
|
|
9
|
+
}
|
|
10
|
+
.hu-page-layout__header {
|
|
11
|
+
position: relative; z-index: var(--hu-z-sticky); background: var(--hu-bg);
|
|
12
|
+
border-block-end: 1px solid var(--hu-border);
|
|
13
|
+
}
|
|
14
|
+
.hu-page-layout__header--sticky { position: sticky; inset-block-start: 0; }
|
|
15
|
+
.hu-page-layout__main {
|
|
16
|
+
min-width: 0; padding: var(--hu-page-padding, var(--hu-space-6));
|
|
17
|
+
}
|
|
18
|
+
.hu-page-layout__footer {
|
|
19
|
+
background: var(--hu-bg); border-block-start: 1px solid var(--hu-border);
|
|
20
|
+
}
|
|
21
|
+
@media (max-width: 768px) {
|
|
22
|
+
.hu-page-layout__main { padding: var(--hu-space-4); }
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
function toCssUnit(value) {
|
|
26
|
+
return typeof value === "number" ? `${value}px` : value;
|
|
27
|
+
}
|
|
28
|
+
export function PageLayout(props) {
|
|
29
|
+
injectCSS("hu-page-layout", ENTERPRISE_LAYOUT_CSS);
|
|
30
|
+
const styles = [];
|
|
31
|
+
if (props.maxWidth !== undefined)
|
|
32
|
+
styles.push(`--hu-page-max:${toCssUnit(props.maxWidth)}`);
|
|
33
|
+
if (props.padding !== undefined)
|
|
34
|
+
styles.push(`--hu-page-padding:${toCssUnit(props.padding)}`);
|
|
35
|
+
return h("div", {
|
|
36
|
+
class: cn("hu-page-layout", props.contained && "hu-page-layout--contained", props.class),
|
|
37
|
+
style: styles.join(";") || undefined
|
|
38
|
+
}, props.header && h("header", {
|
|
39
|
+
class: cn("hu-page-layout__header", props.stickyHeader && "hu-page-layout__header--sticky")
|
|
40
|
+
}, props.header), h("main", { class: "hu-page-layout__main" }, props.children), props.footer && h("footer", { class: "hu-page-layout__footer" }, props.footer));
|
|
41
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
export interface PaginationProps {
|
|
3
|
+
page: number;
|
|
4
|
+
totalPages: number;
|
|
5
|
+
siblingCount?: number;
|
|
6
|
+
onChange: (page: number) => void;
|
|
7
|
+
showFirstLast?: boolean;
|
|
8
|
+
class?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function Pagination(props: PaginationProps): VNode;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Pagination/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAuBpE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,KAAK,CA0CxD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
const PAGINATION_CSS = `
|
|
3
|
+
.hu-pagination { display: flex; align-items: center; gap: var(--hu-space-1); max-width: 100%; overflow-x: auto; padding: 2px; }
|
|
4
|
+
.hu-pagination-btn {
|
|
5
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
6
|
+
min-width: 36px; height: 36px; padding: 0 var(--hu-space-2);
|
|
7
|
+
border: 1px solid var(--hu-border); border-radius: var(--hu-radius-md);
|
|
8
|
+
background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2)); font-size: var(--hu-font-size-sm); color: var(--hu-text-2);
|
|
9
|
+
cursor: pointer; flex-shrink: 0; box-shadow: var(--hu-shadow-xs);
|
|
10
|
+
transition: background var(--hu-duration) var(--hu-ease), border-color var(--hu-duration) var(--hu-ease), color var(--hu-duration) var(--hu-ease), box-shadow var(--hu-duration) var(--hu-ease), transform var(--hu-duration-fast) var(--hu-ease);
|
|
11
|
+
}
|
|
12
|
+
.hu-pagination-btn:hover:not(:disabled) { background: var(--hu-bg-3); color: var(--hu-text); border-color: var(--hu-border-2); transform: translateY(-1px); }
|
|
13
|
+
.hu-pagination-btn:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 2px; }
|
|
14
|
+
.hu-pagination-btn--active {
|
|
15
|
+
background: linear-gradient(180deg, color-mix(in srgb, var(--hu-primary) 86%, white), var(--hu-primary));
|
|
16
|
+
border-color: var(--hu-primary); color: white; font-weight: var(--hu-font-weight-semibold);
|
|
17
|
+
}
|
|
18
|
+
.hu-pagination-btn--active:hover { background: var(--hu-primary); }
|
|
19
|
+
.hu-pagination-btn:disabled { opacity: .4; cursor: not-allowed; }
|
|
20
|
+
.hu-pagination-ellipsis { display: inline-flex; align-items: center; justify-content: center; min-width: 36px; height: 36px; color: var(--hu-text-3); font-size: var(--hu-font-size-sm); flex-shrink: 0; }
|
|
21
|
+
`;
|
|
22
|
+
export function Pagination(props) {
|
|
23
|
+
injectCSS("hu-pagination", PAGINATION_CSS);
|
|
24
|
+
const { page, totalPages, siblingCount = 1, onChange, showFirstLast = true } = props;
|
|
25
|
+
const pages = [];
|
|
26
|
+
const delta = siblingCount;
|
|
27
|
+
const left = page - delta;
|
|
28
|
+
const right = page + delta + 1;
|
|
29
|
+
const range = [];
|
|
30
|
+
const rangeWithDots = [];
|
|
31
|
+
for (let i = 1; i <= totalPages; i++) {
|
|
32
|
+
if (i === 1 || i === totalPages || (i >= left && i < right))
|
|
33
|
+
range.push(i);
|
|
34
|
+
}
|
|
35
|
+
let prev;
|
|
36
|
+
for (const i of range) {
|
|
37
|
+
if (prev !== undefined) {
|
|
38
|
+
if (i - prev === 2)
|
|
39
|
+
rangeWithDots.push(prev + 1);
|
|
40
|
+
else if (i - prev > 2)
|
|
41
|
+
rangeWithDots.push("...");
|
|
42
|
+
}
|
|
43
|
+
rangeWithDots.push(i);
|
|
44
|
+
prev = i;
|
|
45
|
+
}
|
|
46
|
+
const prevSVG = `<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M10 4L6 8l4 4"/></svg>`;
|
|
47
|
+
const nextSVG = `<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M6 4l4 4-4 4"/></svg>`;
|
|
48
|
+
return h("nav", { class: cn("hu-pagination", props.class), "aria-label": "Pagination" }, h("button", { class: "hu-pagination-btn", onClick: () => onChange(page - 1), disabled: page <= 1, "aria-label": "Previous page", innerHTML: prevSVG }), ...rangeWithDots.map((p, i) => p === "..."
|
|
49
|
+
? h("span", { key: `ellipsis-${i}`, class: "hu-pagination-ellipsis" }, "…")
|
|
50
|
+
: h("button", {
|
|
51
|
+
key: p,
|
|
52
|
+
class: cn("hu-pagination-btn", p === page && "hu-pagination-btn--active"),
|
|
53
|
+
onClick: () => onChange(p),
|
|
54
|
+
"aria-label": `Page ${p}`, "aria-current": p === page ? "page" : undefined
|
|
55
|
+
}, p)), h("button", { class: "hu-pagination-btn", onClick: () => onChange(page + 1), disabled: page >= totalPages, "aria-label": "Next page", innerHTML: nextSVG }));
|
|
56
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
export type PaperElevation = 0 | 1 | 2 | 3 | 4 | 5;
|
|
3
|
+
export interface PaperProps {
|
|
4
|
+
elevation?: PaperElevation;
|
|
5
|
+
variant?: "elevation" | "outlined";
|
|
6
|
+
square?: boolean;
|
|
7
|
+
component?: string;
|
|
8
|
+
class?: string;
|
|
9
|
+
children?: unknown;
|
|
10
|
+
}
|
|
11
|
+
export declare function Paper(props: PaperProps): VNode;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Paper/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAmBpE,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAW9C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
const PAPER_CSS = `
|
|
3
|
+
.hu-paper {
|
|
4
|
+
background: linear-gradient(180deg, var(--hu-bg), color-mix(in srgb, var(--hu-bg-2) 56%, var(--hu-bg)));
|
|
5
|
+
border: 1px solid color-mix(in srgb, var(--hu-border) 68%, transparent);
|
|
6
|
+
border-radius: var(--hu-radius-md);
|
|
7
|
+
transition: box-shadow var(--hu-duration) var(--hu-ease), border-color var(--hu-duration) var(--hu-ease);
|
|
8
|
+
}
|
|
9
|
+
.hu-paper--elevation-0 { box-shadow: none; }
|
|
10
|
+
.hu-paper--elevation-1 { box-shadow: var(--hu-shadow-xs); }
|
|
11
|
+
.hu-paper--elevation-2 { box-shadow: var(--hu-shadow-sm); }
|
|
12
|
+
.hu-paper--elevation-3 { box-shadow: var(--hu-shadow-md); }
|
|
13
|
+
.hu-paper--elevation-4 { box-shadow: var(--hu-shadow-lg); }
|
|
14
|
+
.hu-paper--elevation-5 { box-shadow: var(--hu-shadow-xl); }
|
|
15
|
+
.hu-paper--outlined { border: 1px solid var(--hu-border); box-shadow: none; }
|
|
16
|
+
.hu-paper--square { border-radius: 0; }
|
|
17
|
+
`;
|
|
18
|
+
export function Paper(props) {
|
|
19
|
+
injectCSS("hu-paper", PAPER_CSS);
|
|
20
|
+
const { elevation = 1, variant = "elevation", square, component = "div" } = props;
|
|
21
|
+
return h(component, {
|
|
22
|
+
class: cn("hu-paper", variant === "elevation" ? `hu-paper--elevation-${elevation}` : "hu-paper--outlined", square && "hu-paper--square", props.class)
|
|
23
|
+
}, props.children);
|
|
24
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Signal } from "@hyperpackai/hyperion";
|
|
2
|
+
import { type VNode } from "../../theme/index.js";
|
|
3
|
+
export interface PopoverProps {
|
|
4
|
+
open: boolean | Signal<boolean>;
|
|
5
|
+
side?: "top" | "bottom" | "left" | "right";
|
|
6
|
+
trigger?: unknown;
|
|
7
|
+
onClose?: () => void;
|
|
8
|
+
onOpenChange?: (open: boolean) => void;
|
|
9
|
+
children?: unknown;
|
|
10
|
+
class?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function Popover(props: PopoverProps): VNode;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Popover/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAgBpE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAuBlD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
const POPOVER_CSS = `
|
|
3
|
+
.hu-popover-wrap { position: relative; display: inline-flex; }
|
|
4
|
+
.hu-popover-content {
|
|
5
|
+
position: absolute; z-index: var(--hu-z-popover); min-width: 200px;
|
|
6
|
+
background: var(--hu-bg); border: 1px solid var(--hu-border);
|
|
7
|
+
border-radius: var(--hu-radius-md); box-shadow: var(--hu-shadow-lg); padding: var(--hu-space-4);
|
|
8
|
+
animation: hu-scale-in var(--hu-duration-fast) var(--hu-ease);
|
|
9
|
+
}
|
|
10
|
+
.hu-popover-content--top { bottom: calc(100% + 6px); left: 0; }
|
|
11
|
+
.hu-popover-content--bottom { top: calc(100% + 6px); left: 0; }
|
|
12
|
+
.hu-popover-content--left { right: calc(100% + 6px); top: 0; }
|
|
13
|
+
.hu-popover-content--right { left: calc(100% + 6px); top: 0; }
|
|
14
|
+
`;
|
|
15
|
+
export function Popover(props) {
|
|
16
|
+
injectCSS("hu-popover", POPOVER_CSS);
|
|
17
|
+
const { side = "bottom", trigger, children } = props;
|
|
18
|
+
const isSignalOpen = typeof props.open === "object" && "peek" in props.open;
|
|
19
|
+
const isOpen = () => isSignalOpen
|
|
20
|
+
? props.open.value
|
|
21
|
+
: props.open;
|
|
22
|
+
const overlay = () => isOpen()
|
|
23
|
+
? h("div", {
|
|
24
|
+
class: cn("hu-popover-content", `hu-popover-content--${side}`),
|
|
25
|
+
onKeyDown: (e) => {
|
|
26
|
+
if (e.key === "Escape") {
|
|
27
|
+
props.onOpenChange?.(false);
|
|
28
|
+
props.onClose?.();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}, children)
|
|
32
|
+
: null;
|
|
33
|
+
return h("div", { class: cn("hu-popover-wrap", props.class) }, trigger, typeof props.open === "boolean" ? overlay() : overlay);
|
|
34
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
export interface ProgressProps {
|
|
3
|
+
value?: number;
|
|
4
|
+
max?: number;
|
|
5
|
+
label?: string;
|
|
6
|
+
showValue?: boolean;
|
|
7
|
+
size?: "sm" | "md" | "lg";
|
|
8
|
+
color?: "primary" | "success" | "error" | "warning";
|
|
9
|
+
indeterminate?: boolean;
|
|
10
|
+
class?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function Progress(props: ProgressProps): VNode;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Progress/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AA6BpE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACpD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAqBpD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
const PROGRESS_CSS = `
|
|
3
|
+
.hu-progress-wrap { display: flex; flex-direction: column; gap: var(--hu-space-1); }
|
|
4
|
+
.hu-progress-header { display: flex; justify-content: space-between; align-items: center; font-size: var(--hu-font-size-xs); color: var(--hu-text-2); }
|
|
5
|
+
.hu-progress-label { font-weight: var(--hu-font-weight-medium); }
|
|
6
|
+
.hu-progress-track {
|
|
7
|
+
width: 100%; background: var(--hu-bg-3); border-radius: var(--hu-radius-full);
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
}
|
|
10
|
+
.hu-progress-track--sm { height: 4px; }
|
|
11
|
+
.hu-progress-track--md { height: 8px; }
|
|
12
|
+
.hu-progress-track--lg { height: 12px; }
|
|
13
|
+
.hu-progress-bar {
|
|
14
|
+
height: 100%; background: var(--hu-primary); border-radius: var(--hu-radius-full);
|
|
15
|
+
transition: width .4s var(--hu-ease-out);
|
|
16
|
+
}
|
|
17
|
+
.hu-progress-bar--success { background: var(--hu-success); }
|
|
18
|
+
.hu-progress-bar--error { background: var(--hu-error); }
|
|
19
|
+
.hu-progress-bar--warning { background: var(--hu-warning); }
|
|
20
|
+
.hu-progress-bar--indeterminate {
|
|
21
|
+
width: 40% !important; animation: hu-progress-indeterminate 1.5s infinite;
|
|
22
|
+
}
|
|
23
|
+
@keyframes hu-progress-indeterminate {
|
|
24
|
+
0% { transform: translateX(-100%); }
|
|
25
|
+
100%{ transform: translateX(350%); }
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
export function Progress(props) {
|
|
29
|
+
injectCSS("hu-progress", PROGRESS_CSS);
|
|
30
|
+
const { value = 0, max = 100, label, showValue = false, size = "md", color = "primary", indeterminate = false } = props;
|
|
31
|
+
const pct = Math.min(100, Math.max(0, (value / max) * 100));
|
|
32
|
+
return h("div", { class: cn("hu-progress-wrap", props.class) }, (label || showValue) && h("div", { class: "hu-progress-header" }, label && h("span", { class: "hu-progress-label" }, label), showValue && h("span", {}, `${Math.round(pct)}%`)), h("div", {
|
|
33
|
+
class: cn("hu-progress-track", `hu-progress-track--${size}`),
|
|
34
|
+
role: "progressbar", "aria-valuenow": indeterminate ? undefined : value,
|
|
35
|
+
"aria-valuemin": 0, "aria-valuemax": max, "aria-label": label
|
|
36
|
+
}, h("div", {
|
|
37
|
+
class: cn("hu-progress-bar", color !== "primary" && `hu-progress-bar--${color}`, indeterminate && "hu-progress-bar--indeterminate"),
|
|
38
|
+
style: !indeterminate ? `width:${pct}%` : undefined
|
|
39
|
+
})));
|
|
40
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
import type { CheckboxProps } from "../Checkbox/index.js";
|
|
3
|
+
export interface RadioProps extends Omit<CheckboxProps, "indeterminate" | "defaultChecked"> {
|
|
4
|
+
value: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function Radio(props: RadioProps): VNode;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Radio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAyB1D,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,aAAa,EAAE,eAAe,GAAG,gBAAgB,CAAC;IACzF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAW9C"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
2
|
+
const RADIO_CSS = `
|
|
3
|
+
.hu-radio-wrap { display: inline-flex; align-items: center; gap: var(--hu-space-2); cursor: pointer; min-height: 28px; max-width: 100%; }
|
|
4
|
+
.hu-radio-wrap--disabled { opacity: .5; cursor: not-allowed; }
|
|
5
|
+
.hu-radio {
|
|
6
|
+
appearance: none; width: 18px; height: 18px; min-width: 18px;
|
|
7
|
+
border: 1.5px solid var(--hu-border-2); border-radius: var(--hu-radius-full);
|
|
8
|
+
background: linear-gradient(180deg, var(--hu-bg), var(--hu-bg-2)); cursor: pointer; position: relative;
|
|
9
|
+
box-shadow: var(--hu-shadow-xs);
|
|
10
|
+
transition: background var(--hu-duration) var(--hu-ease), border-color var(--hu-duration) var(--hu-ease), box-shadow var(--hu-duration) var(--hu-ease);
|
|
11
|
+
margin: 0;
|
|
12
|
+
}
|
|
13
|
+
.hu-radio:hover { border-color: var(--hu-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--hu-primary) 10%, transparent); }
|
|
14
|
+
.hu-radio:checked { background: var(--hu-bg); border-color: var(--hu-primary); border-width: 2px; }
|
|
15
|
+
.hu-radio:checked::after {
|
|
16
|
+
content: ""; position: absolute; inset: 3px;
|
|
17
|
+
background: linear-gradient(180deg, color-mix(in srgb, var(--hu-primary) 88%, white), var(--hu-primary));
|
|
18
|
+
border-radius: var(--hu-radius-full);
|
|
19
|
+
}
|
|
20
|
+
.hu-radio:focus-visible { outline: 2px solid var(--hu-primary); outline-offset: 2px; }
|
|
21
|
+
.hu-radio-group { display: flex; flex-direction: column; gap: var(--hu-space-2); }
|
|
22
|
+
.hu-radio-group--horizontal { flex-direction: row; flex-wrap: wrap; }
|
|
23
|
+
`;
|
|
24
|
+
export function Radio(props) {
|
|
25
|
+
injectCSS("hu-radio", RADIO_CSS);
|
|
26
|
+
const { label, description, disabled, id, ...rest } = props;
|
|
27
|
+
return h("label", { class: cn("hu-radio-wrap", disabled && "hu-radio-wrap--disabled", props.class) }, h("input", { ...rest, type: "radio", id, disabled, class: "hu-radio" }), (label || description) && h("span", { class: "hu-checkbox-text" }, label && h("span", { class: "hu-checkbox-label" }, label), description && h("span", { class: "hu-checkbox-desc" }, description)));
|
|
28
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
export type RatingSize = "sm" | "md" | "lg";
|
|
3
|
+
export interface RatingProps {
|
|
4
|
+
value?: number;
|
|
5
|
+
defaultValue?: number;
|
|
6
|
+
max?: number;
|
|
7
|
+
precision?: number;
|
|
8
|
+
size?: RatingSize;
|
|
9
|
+
readOnly?: boolean;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
onChange?: (value: number) => void;
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function Rating(props: RatingProps): VNode;
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Rating/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAsBpE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAqBhD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { signal } from "@hyperpackai/hyperion";
|
|
2
|
+
import { injectCSS, cn, h } from "../../theme/index.js";
|
|
3
|
+
const RATING_CSS = `
|
|
4
|
+
.hu-rating { display: inline-flex; gap: 2px; user-select: none; }
|
|
5
|
+
.hu-rating__star {
|
|
6
|
+
font-size: 24px; cursor: pointer; color: var(--hu-border-2);
|
|
7
|
+
transition: color var(--hu-duration) var(--hu-ease), transform 80ms;
|
|
8
|
+
line-height: 1;
|
|
9
|
+
}
|
|
10
|
+
.hu-rating__star--filled { color: #f59e0b; }
|
|
11
|
+
.hu-rating__star--half { position: relative; color: var(--hu-border-2); }
|
|
12
|
+
.hu-rating__star--half::after {
|
|
13
|
+
content: "★"; position: absolute; left: 0; top: 0; width: 50%; overflow: hidden; color: #f59e0b;
|
|
14
|
+
}
|
|
15
|
+
.hu-rating__star:hover { transform: scale(1.15); }
|
|
16
|
+
.hu-rating--sm .hu-rating__star { font-size: 18px; }
|
|
17
|
+
.hu-rating--lg .hu-rating__star { font-size: 30px; }
|
|
18
|
+
.hu-rating--readonly .hu-rating__star { cursor: default; }
|
|
19
|
+
.hu-rating--readonly .hu-rating__star:hover { transform: none; }
|
|
20
|
+
.hu-rating--disabled { opacity: .5; pointer-events: none; }
|
|
21
|
+
`;
|
|
22
|
+
export function Rating(props) {
|
|
23
|
+
injectCSS("hu-rating", RATING_CSS);
|
|
24
|
+
const { max = 5, precision = 1, size = "md", readOnly, disabled, onChange } = props;
|
|
25
|
+
const val = signal(props.value ?? props.defaultValue ?? 0);
|
|
26
|
+
const stars = Array.from({ length: max }, (_, i) => {
|
|
27
|
+
const starVal = i + 1;
|
|
28
|
+
const filled = val.value >= starVal;
|
|
29
|
+
const half = !filled && precision === 0.5 && val.value >= starVal - 0.5;
|
|
30
|
+
return h("span", {
|
|
31
|
+
class: cn("hu-rating__star", filled && "hu-rating__star--filled", half && "hu-rating__star--half"),
|
|
32
|
+
onClick: !readOnly && !disabled ? () => { val.value = starVal; onChange?.(starVal); } : undefined,
|
|
33
|
+
"aria-label": `${starVal} star${starVal > 1 ? "s" : ""}`
|
|
34
|
+
}, "★");
|
|
35
|
+
});
|
|
36
|
+
return h("div", {
|
|
37
|
+
class: cn("hu-rating", `hu-rating--${size}`, readOnly && "hu-rating--readonly", disabled && "hu-rating--disabled", props.class),
|
|
38
|
+
role: "radiogroup",
|
|
39
|
+
"aria-label": "rating"
|
|
40
|
+
}, ...stars);
|
|
41
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type VNode } from "../../theme/index.js";
|
|
2
|
+
export interface ResizablePanelProps {
|
|
3
|
+
title?: unknown;
|
|
4
|
+
actions?: unknown;
|
|
5
|
+
width?: string | number;
|
|
6
|
+
height?: string | number;
|
|
7
|
+
minWidth?: string | number;
|
|
8
|
+
maxWidth?: string | number;
|
|
9
|
+
minHeight?: string | number;
|
|
10
|
+
maxHeight?: string | number;
|
|
11
|
+
resize?: "none" | "both" | "horizontal" | "vertical";
|
|
12
|
+
class?: string;
|
|
13
|
+
children?: unknown;
|
|
14
|
+
}
|
|
15
|
+
export declare function ResizablePanel(props: ResizablePanelProps): VNode;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ResizablePanel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAuBpE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,KAAK,CAqBhE"}
|