@hyvnt/hyvui 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/README.md +253 -0
- package/dist/components/ambient/CornerBrackets.svelte +87 -0
- package/dist/components/ambient/CornerBrackets.svelte.d.ts +11 -0
- package/dist/components/ambient/DataStream.svelte +94 -0
- package/dist/components/ambient/DataStream.svelte.d.ts +13 -0
- package/dist/components/ambient/GlyphMark.svelte +69 -0
- package/dist/components/ambient/GlyphMark.svelte.d.ts +13 -0
- package/dist/components/ambient/GridOverlay.svelte +28 -0
- package/dist/components/ambient/GridOverlay.svelte.d.ts +7 -0
- package/dist/components/ambient/ParallaxLayer.svelte +41 -0
- package/dist/components/ambient/ParallaxLayer.svelte.d.ts +12 -0
- package/dist/components/ambient/ScanBand.svelte +91 -0
- package/dist/components/ambient/ScanBand.svelte.d.ts +17 -0
- package/dist/components/ambient/SignalRing.svelte +100 -0
- package/dist/components/ambient/SignalRing.svelte.d.ts +13 -0
- package/dist/components/ambient/ThreadLine.svelte +78 -0
- package/dist/components/ambient/ThreadLine.svelte.d.ts +17 -0
- package/dist/components/ambient/Vignette.svelte +26 -0
- package/dist/components/ambient/Vignette.svelte.d.ts +7 -0
- package/dist/components/depth/DepthLayer.svelte +27 -0
- package/dist/components/depth/DepthLayer.svelte.d.ts +15 -0
- package/dist/components/depth/DepthStage.svelte +62 -0
- package/dist/components/depth/DepthStage.svelte.d.ts +19 -0
- package/dist/components/depth/FloatCard.svelte +104 -0
- package/dist/components/depth/FloatCard.svelte.d.ts +14 -0
- package/dist/components/depth/HorizonGrid.svelte +160 -0
- package/dist/components/depth/HorizonGrid.svelte.d.ts +15 -0
- package/dist/components/depth/Plinth.svelte +57 -0
- package/dist/components/depth/Plinth.svelte.d.ts +13 -0
- package/dist/components/display/Avatar.svelte +69 -0
- package/dist/components/display/Avatar.svelte.d.ts +13 -0
- package/dist/components/display/Badge.svelte +63 -0
- package/dist/components/display/Badge.svelte.d.ts +12 -0
- package/dist/components/display/Blockquote.svelte +34 -0
- package/dist/components/display/Blockquote.svelte.d.ts +10 -0
- package/dist/components/display/CodeBlock.svelte +76 -0
- package/dist/components/display/CodeBlock.svelte.d.ts +13 -0
- package/dist/components/display/MetricCard.svelte +83 -0
- package/dist/components/display/MetricCard.svelte.d.ts +15 -0
- package/dist/components/display/Table.svelte +104 -0
- package/dist/components/display/Table.svelte.d.ts +19 -0
- package/dist/components/feedback/Alert.svelte +76 -0
- package/dist/components/feedback/Alert.svelte.d.ts +14 -0
- package/dist/components/feedback/EmptyState.svelte +68 -0
- package/dist/components/feedback/EmptyState.svelte.d.ts +14 -0
- package/dist/components/feedback/ErrorState.svelte +73 -0
- package/dist/components/feedback/ErrorState.svelte.d.ts +15 -0
- package/dist/components/feedback/Skeleton.svelte +52 -0
- package/dist/components/feedback/Skeleton.svelte.d.ts +13 -0
- package/dist/components/feedback/StatusDot.svelte +54 -0
- package/dist/components/feedback/StatusDot.svelte.d.ts +13 -0
- package/dist/components/feedback/StatusLine.svelte +122 -0
- package/dist/components/feedback/StatusLine.svelte.d.ts +17 -0
- package/dist/components/feedback/Toast.svelte +136 -0
- package/dist/components/feedback/Toast.svelte.d.ts +21 -0
- package/dist/components/inputs/Button.svelte +237 -0
- package/dist/components/inputs/Button.svelte.d.ts +30 -0
- package/dist/components/inputs/Checkbox.svelte +105 -0
- package/dist/components/inputs/Checkbox.svelte.d.ts +15 -0
- package/dist/components/inputs/FileUpload.svelte +163 -0
- package/dist/components/inputs/FileUpload.svelte.d.ts +17 -0
- package/dist/components/inputs/Input.svelte +147 -0
- package/dist/components/inputs/Input.svelte.d.ts +25 -0
- package/dist/components/inputs/Select.svelte +150 -0
- package/dist/components/inputs/Select.svelte.d.ts +23 -0
- package/dist/components/inputs/Textarea.svelte +154 -0
- package/dist/components/inputs/Textarea.svelte.d.ts +25 -0
- package/dist/components/inputs/Toggle.svelte +120 -0
- package/dist/components/inputs/Toggle.svelte.d.ts +15 -0
- package/dist/components/layout/Card.svelte +76 -0
- package/dist/components/layout/Card.svelte.d.ts +16 -0
- package/dist/components/layout/Drawer.svelte +109 -0
- package/dist/components/layout/Drawer.svelte.d.ts +18 -0
- package/dist/components/layout/Grid.svelte +43 -0
- package/dist/components/layout/Grid.svelte.d.ts +16 -0
- package/dist/components/layout/Modal.svelte +159 -0
- package/dist/components/layout/Modal.svelte.d.ts +20 -0
- package/dist/components/layout/Panel.svelte +54 -0
- package/dist/components/layout/Panel.svelte.d.ts +14 -0
- package/dist/components/layout/Popover.svelte +67 -0
- package/dist/components/layout/Popover.svelte.d.ts +14 -0
- package/dist/components/layout/Stack.svelte +53 -0
- package/dist/components/layout/Stack.svelte.d.ts +22 -0
- package/dist/components/navigation/Breadcrumb.svelte +73 -0
- package/dist/components/navigation/Breadcrumb.svelte.d.ts +13 -0
- package/dist/components/navigation/DropdownMenu.svelte +124 -0
- package/dist/components/navigation/DropdownMenu.svelte.d.ts +19 -0
- package/dist/components/navigation/SidebarNav.svelte +90 -0
- package/dist/components/navigation/SidebarNav.svelte.d.ts +16 -0
- package/dist/components/navigation/Tabs.svelte +86 -0
- package/dist/components/navigation/Tabs.svelte.d.ts +17 -0
- package/dist/components/navigation/Topbar.svelte +85 -0
- package/dist/components/navigation/Topbar.svelte.d.ts +14 -0
- package/dist/components/patterns/ActionBar.svelte +76 -0
- package/dist/components/patterns/ActionBar.svelte.d.ts +14 -0
- package/dist/components/patterns/ConfirmDialog.svelte +64 -0
- package/dist/components/patterns/ConfirmDialog.svelte.d.ts +23 -0
- package/dist/components/patterns/PageHeader.svelte +114 -0
- package/dist/components/patterns/PageHeader.svelte.d.ts +16 -0
- package/dist/components/patterns/SearchBar.svelte +59 -0
- package/dist/components/patterns/SearchBar.svelte.d.ts +15 -0
- package/dist/components/patterns/TerminalBoot.svelte +104 -0
- package/dist/components/patterns/TerminalBoot.svelte.d.ts +25 -0
- package/dist/components/primitives/Divider.svelte +29 -0
- package/dist/components/primitives/Divider.svelte.d.ts +9 -0
- package/dist/components/primitives/Icon.svelte +49 -0
- package/dist/components/primitives/Icon.svelte.d.ts +14 -0
- package/dist/components/primitives/Label.svelte +44 -0
- package/dist/components/primitives/Label.svelte.d.ts +14 -0
- package/dist/components/primitives/Surface.svelte +87 -0
- package/dist/components/primitives/Surface.svelte.d.ts +16 -0
- package/dist/components/primitives/Text.svelte +98 -0
- package/dist/components/primitives/Text.svelte.d.ts +19 -0
- package/dist/components/primitives/text.d.ts +1 -0
- package/dist/components/primitives/text.js +1 -0
- package/dist/components/scenes/ArchiveScene.svelte +95 -0
- package/dist/components/scenes/ArchiveScene.svelte.d.ts +16 -0
- package/dist/components/scenes/LogScene.svelte +77 -0
- package/dist/components/scenes/LogScene.svelte.d.ts +14 -0
- package/dist/components/scenes/NarrativeScene.svelte +92 -0
- package/dist/components/scenes/NarrativeScene.svelte.d.ts +16 -0
- package/dist/components/scenes/ReadoutScene.svelte +107 -0
- package/dist/components/scenes/ReadoutScene.svelte.d.ts +16 -0
- package/dist/components/scenes/StageScene.svelte +104 -0
- package/dist/components/scenes/StageScene.svelte.d.ts +18 -0
- package/dist/examples/FieldReport.svelte +223 -0
- package/dist/examples/FieldReport.svelte.d.ts +18 -0
- package/dist/examples/ObservationDeck.svelte +317 -0
- package/dist/examples/ObservationDeck.svelte.d.ts +3 -0
- package/dist/examples/SignalLost.svelte +191 -0
- package/dist/examples/SignalLost.svelte.d.ts +3 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.js +83 -0
- package/dist/system/actions/echo.d.ts +10 -0
- package/dist/system/actions/echo.js +46 -0
- package/dist/system/actions/resolve.d.ts +23 -0
- package/dist/system/actions/resolve.js +59 -0
- package/dist/system/actions/reveal.d.ts +18 -0
- package/dist/system/actions/reveal.js +54 -0
- package/dist/system/actions/surface.d.ts +14 -0
- package/dist/system/actions/surface.js +25 -0
- package/dist/system/depth/depth.css +49 -0
- package/dist/system/depth/depth.d.ts +15 -0
- package/dist/system/depth/depth.js +24 -0
- package/dist/system/expressions.css +80 -0
- package/dist/system/override-template.css +72 -0
- package/dist/system/register.css +74 -0
- package/dist/system/register.d.ts +11 -0
- package/dist/system/register.js +16 -0
- package/dist/tokens/tokens.css +86 -0
- package/dist/tokens/tokens.d.ts +25 -0
- package/dist/tokens/tokens.js +25 -0
- package/dist/utils/cn.d.ts +2 -0
- package/dist/utils/cn.js +4 -0
- package/dist/utils/motion.d.ts +17 -0
- package/dist/utils/motion.js +11 -0
- package/package.json +60 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import Surface from '../primitives/Surface.svelte';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** TranslateY offset for staggered card grids. */
|
|
8
|
+
staggerOffset?: string;
|
|
9
|
+
/** Additional CSS classes. */
|
|
10
|
+
class?: string;
|
|
11
|
+
/** Card header slot. */
|
|
12
|
+
header?: Snippet;
|
|
13
|
+
/** Card body content. */
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
/** Card footer slot. */
|
|
16
|
+
footer?: Snippet;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
staggerOffset = '',
|
|
21
|
+
class: className = '',
|
|
22
|
+
header,
|
|
23
|
+
children,
|
|
24
|
+
footer,
|
|
25
|
+
}: Props = $props();
|
|
26
|
+
|
|
27
|
+
const style = $derived(staggerOffset ? `transform: translateY(${staggerOffset})` : '');
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<div class={cn('hyvui-card-wrap', className)} {style}>
|
|
31
|
+
<Surface variant="card" class="hyvui-card-inner">
|
|
32
|
+
{#if header}
|
|
33
|
+
<div class="hyvui-card-header">
|
|
34
|
+
{@render header()}
|
|
35
|
+
</div>
|
|
36
|
+
{/if}
|
|
37
|
+
{#if children}
|
|
38
|
+
<div class="hyvui-card-body">
|
|
39
|
+
{@render children()}
|
|
40
|
+
</div>
|
|
41
|
+
{/if}
|
|
42
|
+
{#if footer}
|
|
43
|
+
<div class="hyvui-card-footer">
|
|
44
|
+
{@render footer()}
|
|
45
|
+
</div>
|
|
46
|
+
{/if}
|
|
47
|
+
</Surface>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<style>
|
|
51
|
+
.hyvui-card-wrap {
|
|
52
|
+
display: block;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
:global(.hyvui-card-inner) {
|
|
56
|
+
padding: var(--space-card);
|
|
57
|
+
display: flex;
|
|
58
|
+
flex-direction: column;
|
|
59
|
+
gap: var(--space-lg);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.hyvui-card-header {
|
|
63
|
+
padding-bottom: var(--space-sm);
|
|
64
|
+
border-bottom: 1px solid color-mix(in srgb, var(--line) 92%, transparent);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.hyvui-card-body {
|
|
68
|
+
flex: 1;
|
|
69
|
+
min-width: 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.hyvui-card-footer {
|
|
73
|
+
padding-top: var(--space-sm);
|
|
74
|
+
border-top: 1px solid color-mix(in srgb, var(--line) 92%, transparent);
|
|
75
|
+
}
|
|
76
|
+
</style>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** TranslateY offset for staggered card grids. */
|
|
4
|
+
staggerOffset?: string;
|
|
5
|
+
/** Additional CSS classes. */
|
|
6
|
+
class?: string;
|
|
7
|
+
/** Card header slot. */
|
|
8
|
+
header?: Snippet;
|
|
9
|
+
/** Card body content. */
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
/** Card footer slot. */
|
|
12
|
+
footer?: Snippet;
|
|
13
|
+
}
|
|
14
|
+
declare const Card: import("svelte").Component<Props, {}, "">;
|
|
15
|
+
type Card = ReturnType<typeof Card>;
|
|
16
|
+
export default Card;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import Surface from '../primitives/Surface.svelte';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** Controls drawer visibility. */
|
|
8
|
+
open?: boolean;
|
|
9
|
+
/** Side the drawer slides in from. */
|
|
10
|
+
side?: 'left' | 'right';
|
|
11
|
+
/** Drawer width. */
|
|
12
|
+
width?: string;
|
|
13
|
+
/** Additional CSS classes. */
|
|
14
|
+
class?: string;
|
|
15
|
+
/** Drawer content. */
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
/** Fires when the drawer is dismissed. */
|
|
18
|
+
onclose?: () => void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let {
|
|
22
|
+
open = false,
|
|
23
|
+
side = 'right',
|
|
24
|
+
width = '320px',
|
|
25
|
+
class: className = '',
|
|
26
|
+
children,
|
|
27
|
+
onclose,
|
|
28
|
+
}: Props = $props();
|
|
29
|
+
|
|
30
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
31
|
+
if (e.key === 'Escape') {
|
|
32
|
+
onclose?.();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function handleBackdropClick() {
|
|
37
|
+
onclose?.();
|
|
38
|
+
}
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
{#if open}
|
|
42
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
43
|
+
<div class="hyvui-drawer-backdrop" onclick={handleBackdropClick} onkeydown={handleKeydown}>
|
|
44
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
45
|
+
<div
|
|
46
|
+
class={cn(
|
|
47
|
+
'hyvui-drawer',
|
|
48
|
+
side === 'left' ? 'hyvui-drawer-left' : 'hyvui-drawer-right',
|
|
49
|
+
className
|
|
50
|
+
)}
|
|
51
|
+
style:width={width}
|
|
52
|
+
onclick={(e) => e.stopPropagation()}
|
|
53
|
+
onkeydown={(e) => e.stopPropagation()}
|
|
54
|
+
>
|
|
55
|
+
<Surface variant="panel" class="hyvui-drawer-surface">
|
|
56
|
+
{#if children}{@render children()}{/if}
|
|
57
|
+
</Surface>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
{/if}
|
|
61
|
+
|
|
62
|
+
<style>
|
|
63
|
+
.hyvui-drawer-backdrop {
|
|
64
|
+
position: fixed;
|
|
65
|
+
inset: 0;
|
|
66
|
+
z-index: var(--z-modal);
|
|
67
|
+
background: rgba(0, 0, 0, 0.72);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.hyvui-drawer {
|
|
71
|
+
position: fixed;
|
|
72
|
+
top: 0;
|
|
73
|
+
bottom: 0;
|
|
74
|
+
z-index: var(--z-modal);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.hyvui-drawer-left {
|
|
78
|
+
left: 0;
|
|
79
|
+
animation: drawer-left-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.hyvui-drawer-right {
|
|
83
|
+
right: 0;
|
|
84
|
+
animation: drawer-right-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
:global(.hyvui-drawer-surface) {
|
|
88
|
+
height: 100%;
|
|
89
|
+
padding: var(--space-card);
|
|
90
|
+
overflow-y: auto;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@keyframes drawer-left-in {
|
|
94
|
+
from { transform: translateX(-100%); }
|
|
95
|
+
to { transform: translateX(0); }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@keyframes drawer-right-in {
|
|
99
|
+
from { transform: translateX(100%); }
|
|
100
|
+
to { transform: translateX(0); }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@media (prefers-reduced-motion: reduce) {
|
|
104
|
+
.hyvui-drawer-left,
|
|
105
|
+
.hyvui-drawer-right {
|
|
106
|
+
animation: none;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
</style>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Controls drawer visibility. */
|
|
4
|
+
open?: boolean;
|
|
5
|
+
/** Side the drawer slides in from. */
|
|
6
|
+
side?: 'left' | 'right';
|
|
7
|
+
/** Drawer width. */
|
|
8
|
+
width?: string;
|
|
9
|
+
/** Additional CSS classes. */
|
|
10
|
+
class?: string;
|
|
11
|
+
/** Drawer content. */
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
/** Fires when the drawer is dismissed. */
|
|
14
|
+
onclose?: () => void;
|
|
15
|
+
}
|
|
16
|
+
declare const Drawer: import("svelte").Component<Props, {}, "">;
|
|
17
|
+
type Drawer = ReturnType<typeof Drawer>;
|
|
18
|
+
export default Drawer;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
/** Number of columns or a CSS grid-template-columns value. */
|
|
7
|
+
cols?: number | string;
|
|
8
|
+
/** Gap between grid items. */
|
|
9
|
+
gap?: string;
|
|
10
|
+
/** HTML tag to render. */
|
|
11
|
+
as?: string;
|
|
12
|
+
/** Additional CSS classes. */
|
|
13
|
+
class?: string;
|
|
14
|
+
/** Grid children. */
|
|
15
|
+
children?: Snippet;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
cols = 1,
|
|
20
|
+
gap = 'var(--space-md)',
|
|
21
|
+
as = 'div',
|
|
22
|
+
class: className = '',
|
|
23
|
+
children,
|
|
24
|
+
}: Props = $props();
|
|
25
|
+
|
|
26
|
+
const gridCols = $derived(typeof cols === 'number' ? `repeat(${cols}, 1fr)` : cols);
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<svelte:element
|
|
30
|
+
this={as}
|
|
31
|
+
class={cn('hyvui-grid', className)}
|
|
32
|
+
style:grid-template-columns={gridCols}
|
|
33
|
+
style:gap={gap}
|
|
34
|
+
>
|
|
35
|
+
{#if children}{@render children()}{/if}
|
|
36
|
+
</svelte:element>
|
|
37
|
+
|
|
38
|
+
<style>
|
|
39
|
+
.hyvui-grid {
|
|
40
|
+
display: grid;
|
|
41
|
+
min-width: 0;
|
|
42
|
+
}
|
|
43
|
+
</style>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Number of columns or a CSS grid-template-columns value. */
|
|
4
|
+
cols?: number | string;
|
|
5
|
+
/** Gap between grid items. */
|
|
6
|
+
gap?: string;
|
|
7
|
+
/** HTML tag to render. */
|
|
8
|
+
as?: string;
|
|
9
|
+
/** Additional CSS classes. */
|
|
10
|
+
class?: string;
|
|
11
|
+
/** Grid children. */
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
}
|
|
14
|
+
declare const Grid: import("svelte").Component<Props, {}, "">;
|
|
15
|
+
type Grid = ReturnType<typeof Grid>;
|
|
16
|
+
export default Grid;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import Surface from '../primitives/Surface.svelte';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** Controls modal visibility. */
|
|
8
|
+
open?: boolean;
|
|
9
|
+
/** Optional modal title. */
|
|
10
|
+
title?: string;
|
|
11
|
+
/** Additional CSS classes. */
|
|
12
|
+
class?: string;
|
|
13
|
+
/** Modal header slot. */
|
|
14
|
+
header?: Snippet;
|
|
15
|
+
/** Modal body content. */
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
/** Modal footer slot. */
|
|
18
|
+
footer?: Snippet;
|
|
19
|
+
/** Fires when the modal is dismissed. */
|
|
20
|
+
onclose?: () => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let {
|
|
24
|
+
open = false,
|
|
25
|
+
title = '',
|
|
26
|
+
class: className = '',
|
|
27
|
+
header,
|
|
28
|
+
children,
|
|
29
|
+
footer,
|
|
30
|
+
onclose,
|
|
31
|
+
}: Props = $props();
|
|
32
|
+
|
|
33
|
+
let dialogEl: HTMLDialogElement | undefined = $state();
|
|
34
|
+
|
|
35
|
+
$effect(() => {
|
|
36
|
+
if (!dialogEl) return;
|
|
37
|
+
if (open) {
|
|
38
|
+
dialogEl.showModal();
|
|
39
|
+
} else {
|
|
40
|
+
dialogEl.close();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
45
|
+
if (e.key === 'Escape') {
|
|
46
|
+
onclose?.();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function handleBackdropClick(e: MouseEvent) {
|
|
51
|
+
if (e.target === dialogEl) {
|
|
52
|
+
onclose?.();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
{#if open}
|
|
58
|
+
<dialog
|
|
59
|
+
bind:this={dialogEl}
|
|
60
|
+
class={cn('hyvui-modal-backdrop', className)}
|
|
61
|
+
onkeydown={handleKeydown}
|
|
62
|
+
onclick={handleBackdropClick}
|
|
63
|
+
>
|
|
64
|
+
<Surface variant="panel" class="hyvui-modal-surface">
|
|
65
|
+
{#if header}
|
|
66
|
+
<div class="hyvui-modal-header">
|
|
67
|
+
{@render header()}
|
|
68
|
+
</div>
|
|
69
|
+
{:else if title}
|
|
70
|
+
<div class="hyvui-modal-header">
|
|
71
|
+
<h2 class="hyvui-modal-title">{title}</h2>
|
|
72
|
+
</div>
|
|
73
|
+
{/if}
|
|
74
|
+
{#if children}
|
|
75
|
+
<div class="hyvui-modal-body">
|
|
76
|
+
{@render children()}
|
|
77
|
+
</div>
|
|
78
|
+
{/if}
|
|
79
|
+
{#if footer}
|
|
80
|
+
<div class="hyvui-modal-footer">
|
|
81
|
+
{@render footer()}
|
|
82
|
+
</div>
|
|
83
|
+
{/if}
|
|
84
|
+
</Surface>
|
|
85
|
+
</dialog>
|
|
86
|
+
{/if}
|
|
87
|
+
|
|
88
|
+
<style>
|
|
89
|
+
.hyvui-modal-backdrop {
|
|
90
|
+
position: fixed;
|
|
91
|
+
inset: 0;
|
|
92
|
+
z-index: var(--z-modal);
|
|
93
|
+
background: rgba(0, 0, 0, 0.72);
|
|
94
|
+
display: flex;
|
|
95
|
+
align-items: center;
|
|
96
|
+
justify-content: center;
|
|
97
|
+
border: none;
|
|
98
|
+
padding: 1.5rem;
|
|
99
|
+
width: 100%;
|
|
100
|
+
height: 100%;
|
|
101
|
+
max-width: 100%;
|
|
102
|
+
max-height: 100%;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.hyvui-modal-backdrop::backdrop {
|
|
106
|
+
background: transparent;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
:global(.hyvui-modal-surface) {
|
|
110
|
+
padding: var(--space-card);
|
|
111
|
+
max-width: 32rem;
|
|
112
|
+
width: 100%;
|
|
113
|
+
animation: modal-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.hyvui-modal-header {
|
|
117
|
+
margin-bottom: 1rem;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.hyvui-modal-title {
|
|
121
|
+
font-family: var(--font-body);
|
|
122
|
+
font-size: 1.2rem;
|
|
123
|
+
font-weight: 400;
|
|
124
|
+
line-height: 0.93;
|
|
125
|
+
letter-spacing: -0.04em;
|
|
126
|
+
color: var(--text);
|
|
127
|
+
margin: 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.hyvui-modal-body {
|
|
131
|
+
font-family: var(--font-body);
|
|
132
|
+
color: var(--text-soft);
|
|
133
|
+
line-height: 1.6;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.hyvui-modal-footer {
|
|
137
|
+
margin-top: 1.25rem;
|
|
138
|
+
display: flex;
|
|
139
|
+
justify-content: flex-end;
|
|
140
|
+
gap: 0.75rem;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
@keyframes modal-in {
|
|
144
|
+
from {
|
|
145
|
+
opacity: 0;
|
|
146
|
+
transform: translateY(8px);
|
|
147
|
+
}
|
|
148
|
+
to {
|
|
149
|
+
opacity: 1;
|
|
150
|
+
transform: translateY(0);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@media (prefers-reduced-motion: reduce) {
|
|
155
|
+
:global(.hyvui-modal-surface) {
|
|
156
|
+
animation: none;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
</style>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Controls modal visibility. */
|
|
4
|
+
open?: boolean;
|
|
5
|
+
/** Optional modal title. */
|
|
6
|
+
title?: string;
|
|
7
|
+
/** Additional CSS classes. */
|
|
8
|
+
class?: string;
|
|
9
|
+
/** Modal header slot. */
|
|
10
|
+
header?: Snippet;
|
|
11
|
+
/** Modal body content. */
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
/** Modal footer slot. */
|
|
14
|
+
footer?: Snippet;
|
|
15
|
+
/** Fires when the modal is dismissed. */
|
|
16
|
+
onclose?: () => void;
|
|
17
|
+
}
|
|
18
|
+
declare const Modal: import("svelte").Component<Props, {}, "">;
|
|
19
|
+
type Modal = ReturnType<typeof Modal>;
|
|
20
|
+
export default Modal;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import Surface from '../primitives/Surface.svelte';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** Adds a pseudoelement teal inset border. */
|
|
8
|
+
withInset?: boolean;
|
|
9
|
+
/** Additional CSS classes. */
|
|
10
|
+
class?: string;
|
|
11
|
+
/** Panel header slot. */
|
|
12
|
+
header?: Snippet;
|
|
13
|
+
/** Panel body content. */
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
withInset = false,
|
|
19
|
+
class: className = '',
|
|
20
|
+
header,
|
|
21
|
+
children,
|
|
22
|
+
}: Props = $props();
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<Surface variant="panel" {withInset} class={cn('hyvui-panel', className)}>
|
|
26
|
+
{#if header}
|
|
27
|
+
<div class="hyvui-panel-header">
|
|
28
|
+
{@render header()}
|
|
29
|
+
</div>
|
|
30
|
+
{/if}
|
|
31
|
+
{#if children}
|
|
32
|
+
<div class="hyvui-panel-body">
|
|
33
|
+
{@render children()}
|
|
34
|
+
</div>
|
|
35
|
+
{/if}
|
|
36
|
+
</Surface>
|
|
37
|
+
|
|
38
|
+
<style>
|
|
39
|
+
:global(.hyvui-panel) {
|
|
40
|
+
padding: var(--space-card);
|
|
41
|
+
display: flex;
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
gap: var(--space-lg);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.hyvui-panel-header {
|
|
47
|
+
padding-bottom: var(--space-md);
|
|
48
|
+
border-bottom: 1px solid color-mix(in srgb, var(--line) 92%, transparent);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.hyvui-panel-body {
|
|
52
|
+
min-width: 0;
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Adds a pseudoelement teal inset border. */
|
|
4
|
+
withInset?: boolean;
|
|
5
|
+
/** Additional CSS classes. */
|
|
6
|
+
class?: string;
|
|
7
|
+
/** Panel header slot. */
|
|
8
|
+
header?: Snippet;
|
|
9
|
+
/** Panel body content. */
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
}
|
|
12
|
+
declare const Panel: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type Panel = ReturnType<typeof Panel>;
|
|
14
|
+
export default Panel;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import Surface from '../primitives/Surface.svelte';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** Controls popover visibility. */
|
|
8
|
+
open?: boolean;
|
|
9
|
+
/** Placement relative to anchor. */
|
|
10
|
+
placement?: 'top' | 'bottom' | 'left' | 'right';
|
|
11
|
+
/** Additional CSS classes. */
|
|
12
|
+
class?: string;
|
|
13
|
+
/** Popover content. */
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
open = false,
|
|
19
|
+
placement = 'bottom',
|
|
20
|
+
class: className = '',
|
|
21
|
+
children,
|
|
22
|
+
}: Props = $props();
|
|
23
|
+
|
|
24
|
+
const placementStyles: Record<string, string> = {
|
|
25
|
+
top: 'bottom: 100%; left: 50%; transform: translateX(-50%); margin-bottom: 0.5rem;',
|
|
26
|
+
bottom: 'top: 100%; left: 50%; transform: translateX(-50%); margin-top: 0.5rem;',
|
|
27
|
+
left: 'right: 100%; top: 50%; transform: translateY(-50%); margin-right: 0.5rem;',
|
|
28
|
+
right: 'left: 100%; top: 50%; transform: translateY(-50%); margin-left: 0.5rem;',
|
|
29
|
+
};
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
{#if open}
|
|
33
|
+
<div class={cn('hyvui-popover', className)} style={placementStyles[placement]}>
|
|
34
|
+
<Surface variant="card" class="hyvui-popover-surface">
|
|
35
|
+
{#if children}{@render children()}{/if}
|
|
36
|
+
</Surface>
|
|
37
|
+
</div>
|
|
38
|
+
{/if}
|
|
39
|
+
|
|
40
|
+
<style>
|
|
41
|
+
.hyvui-popover {
|
|
42
|
+
position: absolute;
|
|
43
|
+
z-index: var(--z-overlay);
|
|
44
|
+
animation: popover-in 0.2s cubic-bezier(0.22, 1, 0.36, 1);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:global(.hyvui-popover-surface) {
|
|
48
|
+
padding: 0.5rem 0.75rem;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@keyframes popover-in {
|
|
52
|
+
from {
|
|
53
|
+
opacity: 0;
|
|
54
|
+
transform: translateX(-50%) translateY(4px);
|
|
55
|
+
}
|
|
56
|
+
to {
|
|
57
|
+
opacity: 1;
|
|
58
|
+
transform: translateX(-50%) translateY(0);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@media (prefers-reduced-motion: reduce) {
|
|
63
|
+
.hyvui-popover {
|
|
64
|
+
animation: none;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Controls popover visibility. */
|
|
4
|
+
open?: boolean;
|
|
5
|
+
/** Placement relative to anchor. */
|
|
6
|
+
placement?: 'top' | 'bottom' | 'left' | 'right';
|
|
7
|
+
/** Additional CSS classes. */
|
|
8
|
+
class?: string;
|
|
9
|
+
/** Popover content. */
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
}
|
|
12
|
+
declare const Popover: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type Popover = ReturnType<typeof Popover>;
|
|
14
|
+
export default Popover;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
/** Stack direction. */
|
|
7
|
+
direction?: 'vertical' | 'horizontal';
|
|
8
|
+
/** Gap between items (CSS size string). */
|
|
9
|
+
gap?: string;
|
|
10
|
+
/** CSS align-items value. */
|
|
11
|
+
align?: string;
|
|
12
|
+
/** CSS justify-content value. */
|
|
13
|
+
justify?: string;
|
|
14
|
+
/** Enable flex-wrap. */
|
|
15
|
+
wrap?: boolean;
|
|
16
|
+
/** HTML tag to render. */
|
|
17
|
+
as?: string;
|
|
18
|
+
/** Additional CSS classes. */
|
|
19
|
+
class?: string;
|
|
20
|
+
/** Stack children. */
|
|
21
|
+
children?: Snippet;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let {
|
|
25
|
+
direction = 'vertical',
|
|
26
|
+
gap = 'var(--space-md)',
|
|
27
|
+
align = 'stretch',
|
|
28
|
+
justify = 'flex-start',
|
|
29
|
+
wrap = false,
|
|
30
|
+
as = 'div',
|
|
31
|
+
class: className = '',
|
|
32
|
+
children,
|
|
33
|
+
}: Props = $props();
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<svelte:element
|
|
37
|
+
this={as}
|
|
38
|
+
class={cn('hyvui-stack', className)}
|
|
39
|
+
style:flex-direction={direction === 'horizontal' ? 'row' : 'column'}
|
|
40
|
+
style:gap={gap}
|
|
41
|
+
style:align-items={align}
|
|
42
|
+
style:justify-content={justify}
|
|
43
|
+
style:flex-wrap={wrap ? 'wrap' : 'nowrap'}
|
|
44
|
+
>
|
|
45
|
+
{#if children}{@render children()}{/if}
|
|
46
|
+
</svelte:element>
|
|
47
|
+
|
|
48
|
+
<style>
|
|
49
|
+
.hyvui-stack {
|
|
50
|
+
display: flex;
|
|
51
|
+
min-width: 0;
|
|
52
|
+
}
|
|
53
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Stack direction. */
|
|
4
|
+
direction?: 'vertical' | 'horizontal';
|
|
5
|
+
/** Gap between items (CSS size string). */
|
|
6
|
+
gap?: string;
|
|
7
|
+
/** CSS align-items value. */
|
|
8
|
+
align?: string;
|
|
9
|
+
/** CSS justify-content value. */
|
|
10
|
+
justify?: string;
|
|
11
|
+
/** Enable flex-wrap. */
|
|
12
|
+
wrap?: boolean;
|
|
13
|
+
/** HTML tag to render. */
|
|
14
|
+
as?: string;
|
|
15
|
+
/** Additional CSS classes. */
|
|
16
|
+
class?: string;
|
|
17
|
+
/** Stack children. */
|
|
18
|
+
children?: Snippet;
|
|
19
|
+
}
|
|
20
|
+
declare const Stack: import("svelte").Component<Props, {}, "">;
|
|
21
|
+
type Stack = ReturnType<typeof Stack>;
|
|
22
|
+
export default Stack;
|