@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,91 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/** Enable the scan animation. */
|
|
6
|
+
active?: boolean;
|
|
7
|
+
/** Animation axis. */
|
|
8
|
+
axis?: 'x' | 'y';
|
|
9
|
+
/** Thickness/width of the band. */
|
|
10
|
+
size?: string;
|
|
11
|
+
/** Animation duration. */
|
|
12
|
+
duration?: string;
|
|
13
|
+
/** Gradient used for the band. */
|
|
14
|
+
gradient?: string;
|
|
15
|
+
/** Additional CSS classes. */
|
|
16
|
+
class?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
active = true,
|
|
21
|
+
axis = 'y',
|
|
22
|
+
size = '1px',
|
|
23
|
+
duration = '8s',
|
|
24
|
+
gradient = 'linear-gradient(90deg, transparent, rgba(199, 156, 87, 0.18), transparent)',
|
|
25
|
+
class: className = '',
|
|
26
|
+
}: Props = $props();
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
{#if active}
|
|
30
|
+
<div
|
|
31
|
+
class={cn('hyvui-scan-band', axis === 'x' ? 'hyvui-scan-band-x' : 'hyvui-scan-band-y', className)}
|
|
32
|
+
style:--scan-size={size}
|
|
33
|
+
style:--scan-duration={duration}
|
|
34
|
+
style:--scan-gradient={gradient}
|
|
35
|
+
aria-hidden="true"
|
|
36
|
+
></div>
|
|
37
|
+
{/if}
|
|
38
|
+
|
|
39
|
+
<style>
|
|
40
|
+
.hyvui-scan-band {
|
|
41
|
+
position: absolute;
|
|
42
|
+
inset: 0;
|
|
43
|
+
pointer-events: none;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.hyvui-scan-band::after {
|
|
48
|
+
content: '';
|
|
49
|
+
position: absolute;
|
|
50
|
+
background: var(--scan-gradient);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.hyvui-scan-band-y::after {
|
|
54
|
+
left: 0;
|
|
55
|
+
right: 0;
|
|
56
|
+
height: var(--scan-size);
|
|
57
|
+
animation: scan-band-y var(--scan-duration) linear infinite;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.hyvui-scan-band-x::after {
|
|
61
|
+
top: 0;
|
|
62
|
+
bottom: 0;
|
|
63
|
+
width: var(--scan-size);
|
|
64
|
+
animation: scan-band-x var(--scan-duration) linear infinite;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@keyframes scan-band-y {
|
|
68
|
+
0% {
|
|
69
|
+
transform: translateY(-100%);
|
|
70
|
+
}
|
|
71
|
+
100% {
|
|
72
|
+
transform: translateY(100vh);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@keyframes scan-band-x {
|
|
77
|
+
0% {
|
|
78
|
+
transform: translateX(-120%);
|
|
79
|
+
}
|
|
80
|
+
100% {
|
|
81
|
+
transform: translateX(520%);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@media (prefers-reduced-motion: reduce) {
|
|
86
|
+
.hyvui-scan-band::after {
|
|
87
|
+
animation: none;
|
|
88
|
+
display: none;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/** Enable the scan animation. */
|
|
3
|
+
active?: boolean;
|
|
4
|
+
/** Animation axis. */
|
|
5
|
+
axis?: 'x' | 'y';
|
|
6
|
+
/** Thickness/width of the band. */
|
|
7
|
+
size?: string;
|
|
8
|
+
/** Animation duration. */
|
|
9
|
+
duration?: string;
|
|
10
|
+
/** Gradient used for the band. */
|
|
11
|
+
gradient?: string;
|
|
12
|
+
/** Additional CSS classes. */
|
|
13
|
+
class?: string;
|
|
14
|
+
}
|
|
15
|
+
declare const ScanBand: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type ScanBand = ReturnType<typeof ScanBand>;
|
|
17
|
+
export default ScanBand;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/** Enable the pulsing animation. */
|
|
6
|
+
active?: boolean;
|
|
7
|
+
/** Ring diameter in pixels. */
|
|
8
|
+
size?: number;
|
|
9
|
+
/** Ring color (CSS color value). */
|
|
10
|
+
color?: string;
|
|
11
|
+
/** Additional CSS classes. */
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
active = true,
|
|
17
|
+
size = 200,
|
|
18
|
+
color = 'var(--accent)',
|
|
19
|
+
class: className = '',
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<div
|
|
24
|
+
class={cn('hyvui-signal-ring', className)}
|
|
25
|
+
style:width="{size}px"
|
|
26
|
+
style:height="{size}px"
|
|
27
|
+
aria-hidden="true"
|
|
28
|
+
>
|
|
29
|
+
{#if active}
|
|
30
|
+
<span class="hyvui-signal-ring-pulse hyvui-signal-ring-1" style:border-color={color}></span>
|
|
31
|
+
<span class="hyvui-signal-ring-pulse hyvui-signal-ring-2" style:border-color={color}></span>
|
|
32
|
+
<span class="hyvui-signal-ring-pulse hyvui-signal-ring-3" style:border-color={color}></span>
|
|
33
|
+
{/if}
|
|
34
|
+
<span class="hyvui-signal-ring-core" style:background-color={color}></span>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<style>
|
|
38
|
+
.hyvui-signal-ring {
|
|
39
|
+
position: relative;
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
justify-content: center;
|
|
43
|
+
pointer-events: none;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.hyvui-signal-ring-core {
|
|
47
|
+
width: 4px;
|
|
48
|
+
height: 4px;
|
|
49
|
+
border-radius: 50%;
|
|
50
|
+
opacity: 0.6;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.hyvui-signal-ring-pulse {
|
|
54
|
+
position: absolute;
|
|
55
|
+
inset: 0;
|
|
56
|
+
border-radius: 50%;
|
|
57
|
+
border: 1px solid;
|
|
58
|
+
opacity: 0;
|
|
59
|
+
animation: signal-ring-expand 3.6s ease-out infinite;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.hyvui-signal-ring-1 {
|
|
63
|
+
animation-delay: 0s;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.hyvui-signal-ring-2 {
|
|
67
|
+
animation-delay: 1.2s;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.hyvui-signal-ring-3 {
|
|
71
|
+
animation-delay: 2.4s;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@keyframes signal-ring-expand {
|
|
75
|
+
0% {
|
|
76
|
+
transform: scale(0.1);
|
|
77
|
+
opacity: 0.4;
|
|
78
|
+
}
|
|
79
|
+
100% {
|
|
80
|
+
transform: scale(1);
|
|
81
|
+
opacity: 0;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@media (prefers-reduced-motion: reduce) {
|
|
86
|
+
.hyvui-signal-ring-pulse {
|
|
87
|
+
animation: none;
|
|
88
|
+
opacity: 0.08;
|
|
89
|
+
transform: scale(0.6);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.hyvui-signal-ring-2 {
|
|
93
|
+
transform: scale(0.8);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.hyvui-signal-ring-3 {
|
|
97
|
+
transform: scale(1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
</style>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/** Enable the pulsing animation. */
|
|
3
|
+
active?: boolean;
|
|
4
|
+
/** Ring diameter in pixels. */
|
|
5
|
+
size?: number;
|
|
6
|
+
/** Ring color (CSS color value). */
|
|
7
|
+
color?: string;
|
|
8
|
+
/** Additional CSS classes. */
|
|
9
|
+
class?: string;
|
|
10
|
+
}
|
|
11
|
+
declare const SignalRing: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type SignalRing = ReturnType<typeof SignalRing>;
|
|
13
|
+
export default SignalRing;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/** Start x position (CSS value). */
|
|
6
|
+
x1?: string;
|
|
7
|
+
/** Start y position (CSS value). */
|
|
8
|
+
y1?: string;
|
|
9
|
+
/** End x position (CSS value). */
|
|
10
|
+
x2?: string;
|
|
11
|
+
/** End y position (CSS value). */
|
|
12
|
+
y2?: string;
|
|
13
|
+
/** Enable the traveling dot animation. */
|
|
14
|
+
animated?: boolean;
|
|
15
|
+
/** Additional CSS classes. */
|
|
16
|
+
class?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
x1 = '0%',
|
|
21
|
+
y1 = '0%',
|
|
22
|
+
x2 = '100%',
|
|
23
|
+
y2 = '100%',
|
|
24
|
+
animated = true,
|
|
25
|
+
class: className = '',
|
|
26
|
+
}: Props = $props();
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<svg
|
|
30
|
+
class={cn('hyvui-thread-line', className)}
|
|
31
|
+
aria-hidden="true"
|
|
32
|
+
>
|
|
33
|
+
<line
|
|
34
|
+
{x1} {y1} {x2} {y2}
|
|
35
|
+
stroke="var(--line)"
|
|
36
|
+
stroke-width="1"
|
|
37
|
+
/>
|
|
38
|
+
{#if animated}
|
|
39
|
+
<circle r="2" fill="var(--accent)">
|
|
40
|
+
<animateMotion
|
|
41
|
+
dur="3s"
|
|
42
|
+
repeatCount="indefinite"
|
|
43
|
+
path="M 0,0 L 1,0"
|
|
44
|
+
keyPoints="0;1"
|
|
45
|
+
keyTimes="0;1"
|
|
46
|
+
calcMode="linear"
|
|
47
|
+
>
|
|
48
|
+
<mpath>
|
|
49
|
+
<line {x1} {y1} {x2} {y2} />
|
|
50
|
+
</mpath>
|
|
51
|
+
</animateMotion>
|
|
52
|
+
<animate
|
|
53
|
+
attributeName="opacity"
|
|
54
|
+
values="0;0.8;0.8;0"
|
|
55
|
+
keyTimes="0;0.1;0.85;1"
|
|
56
|
+
dur="3s"
|
|
57
|
+
repeatCount="indefinite"
|
|
58
|
+
/>
|
|
59
|
+
</circle>
|
|
60
|
+
{/if}
|
|
61
|
+
</svg>
|
|
62
|
+
|
|
63
|
+
<style>
|
|
64
|
+
.hyvui-thread-line {
|
|
65
|
+
position: absolute;
|
|
66
|
+
inset: 0;
|
|
67
|
+
width: 100%;
|
|
68
|
+
height: 100%;
|
|
69
|
+
pointer-events: none;
|
|
70
|
+
overflow: visible;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@media (prefers-reduced-motion: reduce) {
|
|
74
|
+
.hyvui-thread-line circle {
|
|
75
|
+
display: none;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/** Start x position (CSS value). */
|
|
3
|
+
x1?: string;
|
|
4
|
+
/** Start y position (CSS value). */
|
|
5
|
+
y1?: string;
|
|
6
|
+
/** End x position (CSS value). */
|
|
7
|
+
x2?: string;
|
|
8
|
+
/** End y position (CSS value). */
|
|
9
|
+
y2?: string;
|
|
10
|
+
/** Enable the traveling dot animation. */
|
|
11
|
+
animated?: boolean;
|
|
12
|
+
/** Additional CSS classes. */
|
|
13
|
+
class?: string;
|
|
14
|
+
}
|
|
15
|
+
declare const ThreadLine: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type ThreadLine = ReturnType<typeof ThreadLine>;
|
|
17
|
+
export default ThreadLine;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/** Additional CSS classes. */
|
|
6
|
+
class?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
class: className = '',
|
|
11
|
+
}: Props = $props();
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<div class={cn('hyvui-vignette', className)} aria-hidden="true"></div>
|
|
15
|
+
|
|
16
|
+
<style>
|
|
17
|
+
.hyvui-vignette {
|
|
18
|
+
position: fixed;
|
|
19
|
+
inset: 0;
|
|
20
|
+
pointer-events: none;
|
|
21
|
+
z-index: var(--z-overlay);
|
|
22
|
+
background:
|
|
23
|
+
radial-gradient(ellipse at 50% 0%, transparent 60%, rgba(0, 0, 0, 0.4)),
|
|
24
|
+
radial-gradient(ellipse at 50% 100%, transparent 60%, rgba(0, 0, 0, 0.5));
|
|
25
|
+
}
|
|
26
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import type { DepthLevel } from '../../system/depth/depth.js';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** Z-level within a parent DepthStage. */
|
|
8
|
+
level?: DepthLevel;
|
|
9
|
+
/** HTML tag to render. */
|
|
10
|
+
as?: string;
|
|
11
|
+
/** Additional CSS classes. */
|
|
12
|
+
class?: string;
|
|
13
|
+
/** Layer content. */
|
|
14
|
+
children?: Snippet;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
level = 'ground',
|
|
19
|
+
as = 'div',
|
|
20
|
+
class: className = '',
|
|
21
|
+
children,
|
|
22
|
+
}: Props = $props();
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<svelte:element this={as} class={cn(`depth-${level}`, className)}>
|
|
26
|
+
{#if children}{@render children()}{/if}
|
|
27
|
+
</svelte:element>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DepthLevel } from '../../system/depth/depth.js';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
interface Props {
|
|
4
|
+
/** Z-level within a parent DepthStage. */
|
|
5
|
+
level?: DepthLevel;
|
|
6
|
+
/** HTML tag to render. */
|
|
7
|
+
as?: string;
|
|
8
|
+
/** Additional CSS classes. */
|
|
9
|
+
class?: string;
|
|
10
|
+
/** Layer content. */
|
|
11
|
+
children?: Snippet;
|
|
12
|
+
}
|
|
13
|
+
declare const DepthLayer: import("svelte").Component<Props, {}, "">;
|
|
14
|
+
type DepthLayer = ReturnType<typeof DepthLayer>;
|
|
15
|
+
export default DepthLayer;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import type { PerspectivePreset } from '../../system/depth/depth.js';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
/** Perspective distance preset. */
|
|
8
|
+
perspective?: PerspectivePreset;
|
|
9
|
+
/** CSS percentage for horizontal perspective origin. */
|
|
10
|
+
originX?: string;
|
|
11
|
+
/** CSS percentage for vertical perspective origin. */
|
|
12
|
+
originY?: string;
|
|
13
|
+
/** HTML tag to render. */
|
|
14
|
+
as?: string;
|
|
15
|
+
/** Additional CSS classes. */
|
|
16
|
+
class?: string;
|
|
17
|
+
/** Stage content. */
|
|
18
|
+
children?: Snippet;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let {
|
|
22
|
+
perspective = 'mid',
|
|
23
|
+
originX = '50%',
|
|
24
|
+
originY = '40%',
|
|
25
|
+
as = 'div',
|
|
26
|
+
class: className = '',
|
|
27
|
+
children,
|
|
28
|
+
}: Props = $props();
|
|
29
|
+
|
|
30
|
+
const perspectiveMap: Record<PerspectivePreset, string> = {
|
|
31
|
+
near: 'var(--perspective-near)',
|
|
32
|
+
mid: 'var(--perspective-mid)',
|
|
33
|
+
far: 'var(--perspective-far)',
|
|
34
|
+
};
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<svelte:element
|
|
38
|
+
this={as}
|
|
39
|
+
class={cn('hyvui-depth-stage', className)}
|
|
40
|
+
style:perspective={perspectiveMap[perspective]}
|
|
41
|
+
style:perspective-origin="{originX} {originY}"
|
|
42
|
+
>
|
|
43
|
+
{#if children}{@render children()}{/if}
|
|
44
|
+
</svelte:element>
|
|
45
|
+
|
|
46
|
+
<style>
|
|
47
|
+
.hyvui-depth-stage {
|
|
48
|
+
transform-style: preserve-3d;
|
|
49
|
+
position: relative;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.hyvui-depth-stage > :global(*) {
|
|
53
|
+
transform-style: preserve-3d;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@media (prefers-reduced-motion: reduce) {
|
|
57
|
+
.hyvui-depth-stage {
|
|
58
|
+
perspective: none !important;
|
|
59
|
+
transform-style: flat;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
</style>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PerspectivePreset } from '../../system/depth/depth.js';
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
interface Props {
|
|
4
|
+
/** Perspective distance preset. */
|
|
5
|
+
perspective?: PerspectivePreset;
|
|
6
|
+
/** CSS percentage for horizontal perspective origin. */
|
|
7
|
+
originX?: string;
|
|
8
|
+
/** CSS percentage for vertical perspective origin. */
|
|
9
|
+
originY?: string;
|
|
10
|
+
/** HTML tag to render. */
|
|
11
|
+
as?: string;
|
|
12
|
+
/** Additional CSS classes. */
|
|
13
|
+
class?: string;
|
|
14
|
+
/** Stage content. */
|
|
15
|
+
children?: Snippet;
|
|
16
|
+
}
|
|
17
|
+
declare const DepthStage: import("svelte").Component<Props, {}, "">;
|
|
18
|
+
type DepthStage = ReturnType<typeof DepthStage>;
|
|
19
|
+
export default DepthStage;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
import { tiltTransform } from '../../system/depth/depth.js';
|
|
4
|
+
import Surface from '../primitives/Surface.svelte';
|
|
5
|
+
import type { Snippet } from 'svelte';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
/** Maximum tilt angle in degrees. */
|
|
9
|
+
tiltMax?: number;
|
|
10
|
+
/** Z-elevation on hover. */
|
|
11
|
+
elevation?: 'raised' | 'foreground';
|
|
12
|
+
/** Additional CSS classes. */
|
|
13
|
+
class?: string;
|
|
14
|
+
/** Card content. */
|
|
15
|
+
children?: Snippet;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
tiltMax = 8,
|
|
20
|
+
elevation = 'raised',
|
|
21
|
+
class: className = '',
|
|
22
|
+
children,
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
let innerTransform = $state('rotateX(0deg) rotateY(0deg) translateZ(0px)');
|
|
26
|
+
let isHovering = $state(false);
|
|
27
|
+
|
|
28
|
+
const prefersReduced =
|
|
29
|
+
typeof window !== 'undefined'
|
|
30
|
+
? window.matchMedia('(prefers-reduced-motion: reduce)').matches
|
|
31
|
+
: false;
|
|
32
|
+
|
|
33
|
+
const elevationMap: Record<string, string> = {
|
|
34
|
+
raised: 'var(--depth-raised)',
|
|
35
|
+
foreground: 'var(--depth-foreground)',
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function handlePointerMove(e: PointerEvent) {
|
|
39
|
+
if (prefersReduced) return;
|
|
40
|
+
const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
|
|
41
|
+
const x = (e.clientX - rect.left) / rect.width;
|
|
42
|
+
const y = (e.clientY - rect.top) / rect.height;
|
|
43
|
+
const tilt = tiltTransform(x, y, tiltMax);
|
|
44
|
+
innerTransform = `${tilt} translateZ(${elevationMap[elevation]})`;
|
|
45
|
+
isHovering = true;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function handlePointerLeave() {
|
|
49
|
+
isHovering = false;
|
|
50
|
+
innerTransform = 'rotateX(0deg) rotateY(0deg) translateZ(0px)';
|
|
51
|
+
}
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
<div
|
|
55
|
+
class={cn('hyvui-float-card', className)}
|
|
56
|
+
role="presentation"
|
|
57
|
+
onpointermove={handlePointerMove}
|
|
58
|
+
onpointerleave={handlePointerLeave}
|
|
59
|
+
>
|
|
60
|
+
<div
|
|
61
|
+
class="hyvui-float-card-inner"
|
|
62
|
+
class:hyvui-float-card-leaving={!isHovering}
|
|
63
|
+
style:transform={innerTransform}
|
|
64
|
+
>
|
|
65
|
+
<Surface variant="card" class="hyvui-float-card-surface">
|
|
66
|
+
{#if children}{@render children()}{/if}
|
|
67
|
+
</Surface>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<style>
|
|
72
|
+
.hyvui-float-card {
|
|
73
|
+
perspective: var(--perspective-mid);
|
|
74
|
+
perspective-origin: 50% 50%;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.hyvui-float-card-inner {
|
|
78
|
+
transform-style: preserve-3d;
|
|
79
|
+
will-change: transform;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.hyvui-float-card-leaving {
|
|
83
|
+
transition: transform var(--depth-transition);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
:global(.hyvui-float-card-surface) {
|
|
87
|
+
padding: var(--space-card);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@media (prefers-reduced-motion: reduce) {
|
|
91
|
+
.hyvui-float-card {
|
|
92
|
+
perspective: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.hyvui-float-card-inner {
|
|
96
|
+
transform: none !important;
|
|
97
|
+
transform-style: flat;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.hyvui-float-card-leaving {
|
|
101
|
+
transition: none;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** Maximum tilt angle in degrees. */
|
|
4
|
+
tiltMax?: number;
|
|
5
|
+
/** Z-elevation on hover. */
|
|
6
|
+
elevation?: 'raised' | 'foreground';
|
|
7
|
+
/** Additional CSS classes. */
|
|
8
|
+
class?: string;
|
|
9
|
+
/** Card content. */
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
}
|
|
12
|
+
declare const FloatCard: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type FloatCard = ReturnType<typeof FloatCard>;
|
|
14
|
+
export default FloatCard;
|