@hyvnt/hyvui 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/README.md +294 -253
  2. package/dist/components/ambient/ArcaneVein.svelte +151 -0
  3. package/dist/components/ambient/ArcaneVein.svelte.d.ts +31 -0
  4. package/dist/components/ambient/BrassFiligree.svelte +109 -0
  5. package/dist/components/ambient/BrassFiligree.svelte.d.ts +20 -0
  6. package/dist/components/ambient/CornerBrackets.svelte +91 -87
  7. package/dist/components/ambient/CornerBrackets.svelte.d.ts +8 -0
  8. package/dist/components/ambient/CrystalShard.svelte +151 -0
  9. package/dist/components/ambient/CrystalShard.svelte.d.ts +19 -0
  10. package/dist/components/ambient/DataStream.svelte +117 -94
  11. package/dist/components/ambient/DataStream.svelte.d.ts +6 -0
  12. package/dist/components/ambient/EnergyArc.svelte +189 -0
  13. package/dist/components/ambient/EnergyArc.svelte.d.ts +32 -0
  14. package/dist/components/ambient/GlyphMark.svelte +75 -69
  15. package/dist/components/ambient/GlyphMark.svelte.d.ts +6 -0
  16. package/dist/components/ambient/GridOverlay.svelte +34 -28
  17. package/dist/components/ambient/GridOverlay.svelte.d.ts +8 -0
  18. package/dist/components/ambient/HexGrid.svelte +119 -0
  19. package/dist/components/ambient/HexGrid.svelte.d.ts +21 -0
  20. package/dist/components/ambient/ParallaxLayer.svelte +45 -41
  21. package/dist/components/ambient/ParallaxLayer.svelte.d.ts +7 -0
  22. package/dist/components/ambient/ScanBand.svelte +103 -91
  23. package/dist/components/ambient/ScanBand.svelte.d.ts +8 -0
  24. package/dist/components/ambient/ShimmerCloud.svelte +180 -0
  25. package/dist/components/ambient/ShimmerCloud.svelte.d.ts +21 -0
  26. package/dist/components/ambient/SignalRing.svelte +106 -100
  27. package/dist/components/ambient/SignalRing.svelte.d.ts +6 -0
  28. package/dist/components/ambient/ThreadLine.svelte +78 -78
  29. package/dist/components/ambient/ThreadLine.svelte.d.ts +7 -0
  30. package/dist/components/ambient/Vignette.svelte +30 -26
  31. package/dist/components/ambient/Vignette.svelte.d.ts +6 -0
  32. package/dist/components/depth/DepthLayer.svelte +30 -27
  33. package/dist/components/depth/DepthLayer.svelte.d.ts +8 -0
  34. package/dist/components/depth/DepthStage.svelte +67 -62
  35. package/dist/components/depth/DepthStage.svelte.d.ts +8 -0
  36. package/dist/components/depth/FloatCard.svelte +129 -104
  37. package/dist/components/depth/FloatCard.svelte.d.ts +8 -0
  38. package/dist/components/depth/HorizonGrid.svelte +241 -160
  39. package/dist/components/depth/HorizonGrid.svelte.d.ts +9 -0
  40. package/dist/components/depth/Plinth.svelte +62 -57
  41. package/dist/components/depth/Plinth.svelte.d.ts +10 -0
  42. package/dist/components/display/Avatar.svelte +69 -69
  43. package/dist/components/display/Avatar.svelte.d.ts +5 -0
  44. package/dist/components/display/Badge.svelte +75 -63
  45. package/dist/components/display/Badge.svelte.d.ts +6 -0
  46. package/dist/components/display/Blockquote.svelte +35 -34
  47. package/dist/components/display/Blockquote.svelte.d.ts +4 -0
  48. package/dist/components/display/CodeBlock.svelte +76 -76
  49. package/dist/components/display/CodeBlock.svelte.d.ts +5 -0
  50. package/dist/components/display/MetricCard.svelte +100 -83
  51. package/dist/components/display/MetricCard.svelte.d.ts +6 -0
  52. package/dist/components/display/Table.svelte +106 -104
  53. package/dist/components/display/Table.svelte.d.ts +7 -0
  54. package/dist/components/feedback/Alert.svelte +95 -76
  55. package/dist/components/feedback/Alert.svelte.d.ts +6 -0
  56. package/dist/components/feedback/EmptyState.svelte +75 -68
  57. package/dist/components/feedback/EmptyState.svelte.d.ts +7 -0
  58. package/dist/components/feedback/ErrorState.svelte +78 -73
  59. package/dist/components/feedback/ErrorState.svelte.d.ts +5 -0
  60. package/dist/components/feedback/Skeleton.svelte +58 -52
  61. package/dist/components/feedback/Skeleton.svelte.d.ts +6 -0
  62. package/dist/components/feedback/StatusDot.svelte +84 -54
  63. package/dist/components/feedback/StatusDot.svelte.d.ts +6 -0
  64. package/dist/components/feedback/StatusLine.svelte +128 -122
  65. package/dist/components/feedback/StatusLine.svelte.d.ts +6 -0
  66. package/dist/components/feedback/Toast.svelte +144 -136
  67. package/dist/components/feedback/Toast.svelte.d.ts +10 -0
  68. package/dist/components/inputs/Button.svelte +310 -237
  69. package/dist/components/inputs/Button.svelte.d.ts +8 -0
  70. package/dist/components/inputs/Checkbox.svelte +109 -105
  71. package/dist/components/inputs/Checkbox.svelte.d.ts +5 -0
  72. package/dist/components/inputs/FileUpload.svelte +170 -163
  73. package/dist/components/inputs/FileUpload.svelte.d.ts +5 -0
  74. package/dist/components/inputs/Input.svelte +153 -147
  75. package/dist/components/inputs/Input.svelte.d.ts +7 -0
  76. package/dist/components/inputs/Select.svelte +164 -150
  77. package/dist/components/inputs/Select.svelte.d.ts +8 -0
  78. package/dist/components/inputs/Textarea.svelte +160 -154
  79. package/dist/components/inputs/Textarea.svelte.d.ts +6 -0
  80. package/dist/components/inputs/Toggle.svelte +125 -120
  81. package/dist/components/inputs/Toggle.svelte.d.ts +5 -0
  82. package/dist/components/layout/Card.svelte +81 -76
  83. package/dist/components/layout/Card.svelte.d.ts +11 -0
  84. package/dist/components/layout/Drawer.svelte +140 -109
  85. package/dist/components/layout/Drawer.svelte.d.ts +6 -0
  86. package/dist/components/layout/Grid.svelte +128 -43
  87. package/dist/components/layout/Grid.svelte.d.ts +18 -2
  88. package/dist/components/layout/Modal.svelte +191 -159
  89. package/dist/components/layout/Modal.svelte.d.ts +10 -0
  90. package/dist/components/layout/Panel.svelte +58 -54
  91. package/dist/components/layout/Panel.svelte.d.ts +9 -0
  92. package/dist/components/layout/Popover.svelte +188 -67
  93. package/dist/components/layout/Popover.svelte.d.ts +19 -1
  94. package/dist/components/layout/Stack.svelte +65 -53
  95. package/dist/components/layout/Stack.svelte.d.ts +12 -0
  96. package/dist/components/navigation/Breadcrumb.svelte +78 -73
  97. package/dist/components/navigation/Breadcrumb.svelte.d.ts +8 -0
  98. package/dist/components/navigation/DropdownMenu.svelte +179 -124
  99. package/dist/components/navigation/DropdownMenu.svelte.d.ts +24 -2
  100. package/dist/components/navigation/SidebarNav.svelte +96 -90
  101. package/dist/components/navigation/SidebarNav.svelte.d.ts +9 -0
  102. package/dist/components/navigation/Tabs.svelte +106 -86
  103. package/dist/components/navigation/Tabs.svelte.d.ts +8 -0
  104. package/dist/components/navigation/Topbar.svelte +94 -85
  105. package/dist/components/navigation/Topbar.svelte.d.ts +9 -0
  106. package/dist/components/patterns/ActionBar.svelte +82 -76
  107. package/dist/components/patterns/ActionBar.svelte.d.ts +10 -0
  108. package/dist/components/patterns/ChapterMark.svelte +152 -0
  109. package/dist/components/patterns/ChapterMark.svelte.d.ts +19 -0
  110. package/dist/components/patterns/ConfirmDialog.svelte +75 -64
  111. package/dist/components/patterns/ConfirmDialog.svelte.d.ts +12 -0
  112. package/dist/components/patterns/DepthPortal.svelte +123 -0
  113. package/dist/components/patterns/DepthPortal.svelte.d.ts +24 -0
  114. package/dist/components/patterns/Manifesto.svelte +171 -0
  115. package/dist/components/patterns/Manifesto.svelte.d.ts +25 -0
  116. package/dist/components/patterns/PageHeader.svelte +117 -114
  117. package/dist/components/patterns/PageHeader.svelte.d.ts +8 -0
  118. package/dist/components/patterns/PullQuote.svelte +145 -0
  119. package/dist/components/patterns/PullQuote.svelte.d.ts +23 -0
  120. package/dist/components/patterns/RegisterSwitcher.svelte +132 -0
  121. package/dist/components/patterns/RegisterSwitcher.svelte.d.ts +21 -0
  122. package/dist/components/patterns/SearchBar.svelte +59 -59
  123. package/dist/components/patterns/SearchBar.svelte.d.ts +5 -0
  124. package/dist/components/patterns/ShowcaseFrame.svelte +117 -0
  125. package/dist/components/patterns/ShowcaseFrame.svelte.d.ts +28 -0
  126. package/dist/components/patterns/TerminalBoot.svelte +118 -104
  127. package/dist/components/patterns/TerminalBoot.svelte.d.ts +12 -0
  128. package/dist/components/primitives/Divider.svelte +56 -29
  129. package/dist/components/primitives/Divider.svelte.d.ts +5 -0
  130. package/dist/components/primitives/Icon.svelte +53 -49
  131. package/dist/components/primitives/Icon.svelte.d.ts +9 -0
  132. package/dist/components/primitives/Label.svelte +45 -44
  133. package/dist/components/primitives/Label.svelte.d.ts +6 -0
  134. package/dist/components/primitives/Surface.svelte +154 -87
  135. package/dist/components/primitives/Surface.svelte.d.ts +7 -0
  136. package/dist/components/primitives/Text.svelte +130 -98
  137. package/dist/components/primitives/Text.svelte.d.ts +7 -0
  138. package/dist/components/scenes/ArchiveScene.svelte +102 -95
  139. package/dist/components/scenes/ArchiveScene.svelte.d.ts +17 -1
  140. package/dist/components/scenes/DepthScene.svelte +128 -0
  141. package/dist/components/scenes/DepthScene.svelte.d.ts +36 -0
  142. package/dist/components/scenes/LogScene.svelte +86 -77
  143. package/dist/components/scenes/LogScene.svelte.d.ts +14 -0
  144. package/dist/components/scenes/NarrativeScene.svelte +100 -92
  145. package/dist/components/scenes/NarrativeScene.svelte.d.ts +9 -0
  146. package/dist/components/scenes/ReadoutScene.svelte +131 -107
  147. package/dist/components/scenes/ReadoutScene.svelte.d.ts +14 -1
  148. package/dist/components/scenes/StageScene.svelte +111 -104
  149. package/dist/components/scenes/StageScene.svelte.d.ts +14 -0
  150. package/dist/components/system/AppShell.svelte +62 -0
  151. package/dist/components/system/AppShell.svelte.d.ts +32 -0
  152. package/dist/examples/ArcaneShard.svelte +364 -0
  153. package/dist/examples/ArcaneShard.svelte.d.ts +3 -0
  154. package/dist/examples/FieldReport.svelte +226 -223
  155. package/dist/examples/HextechForge.svelte +324 -0
  156. package/dist/examples/HextechForge.svelte.d.ts +3 -0
  157. package/dist/examples/ObservationDeck.svelte +333 -317
  158. package/dist/examples/SignalLost.svelte +191 -191
  159. package/dist/index.d.ts +15 -1
  160. package/dist/index.js +16 -1
  161. package/dist/styles.css +115 -0
  162. package/dist/system/actions/echo.js +21 -12
  163. package/dist/system/actions/resolve.js +28 -14
  164. package/dist/system/actions/reveal.js +2 -2
  165. package/dist/system/actions/surface.js +12 -2
  166. package/dist/system/depth/depth.css +49 -49
  167. package/dist/system/depth/depth.js +1 -1
  168. package/dist/system/expressions.css +80 -80
  169. package/dist/system/override-template.css +72 -72
  170. package/dist/system/register.css +74 -74
  171. package/dist/system/register.d.ts +1 -1
  172. package/dist/system/register.js +5 -1
  173. package/dist/system/scroll-lock.d.ts +6 -0
  174. package/dist/system/scroll-lock.js +23 -0
  175. package/dist/tokens/arcane.css +96 -0
  176. package/dist/tokens/hextech.css +96 -0
  177. package/dist/tokens/tokens.css +102 -86
  178. package/dist/tokens/tokens.d.ts +41 -0
  179. package/dist/tokens/tokens.js +44 -3
  180. package/dist/utils/motion.js +1 -1
  181. package/package.json +71 -60
@@ -1,62 +1,67 @@
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>
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
+ /**
7
+ * Establishes CSS 3D perspective context. Wrap any 3D composition in this.
8
+ * @example
9
+ * <DepthStage perspective="mid">
10
+ * <DepthLayer level="ground"><HorizonGrid /></DepthLayer>
11
+ * <DepthLayer level="raised"><FloatCard>content</FloatCard></DepthLayer>
12
+ * </DepthStage>
13
+ */
14
+ interface Props {
15
+ /** Perspective distance preset. */
16
+ perspective?: PerspectivePreset;
17
+ /** CSS percentage for horizontal perspective origin. */
18
+ originX?: string;
19
+ /** CSS percentage for vertical perspective origin. */
20
+ originY?: string;
21
+ /** HTML tag to render. */
22
+ as?: string;
23
+ /** Additional CSS classes. */
24
+ class?: string;
25
+ /** Stage content. */
26
+ children?: Snippet;
27
+ }
28
+
29
+ let {
30
+ perspective = 'mid',
31
+ originX = '50%',
32
+ originY = '40%',
33
+ as = 'div',
34
+ class: className = '',
35
+ children
36
+ }: Props = $props();
37
+
38
+ const perspectiveMap: Record<PerspectivePreset, string> = {
39
+ near: 'var(--perspective-near)',
40
+ mid: 'var(--perspective-mid)',
41
+ far: 'var(--perspective-far)'
42
+ };
43
+ </script>
44
+
45
+ <svelte:element
46
+ this={as}
47
+ class={cn('hyvui-depth-stage', className)}
48
+ style:perspective={perspectiveMap[perspective]}
49
+ style:perspective-origin="{originX}
50
+ {originY}"
51
+ >
52
+ {#if children}{@render children()}{/if}
53
+ </svelte:element>
54
+
55
+ <style>
56
+ .hyvui-depth-stage {
57
+ transform-style: preserve-3d;
58
+ position: relative;
59
+ }
60
+
61
+ @media (prefers-reduced-motion: reduce) {
62
+ .hyvui-depth-stage {
63
+ perspective: none !important;
64
+ transform-style: flat;
65
+ }
66
+ }
67
+ </style>
@@ -1,5 +1,13 @@
1
1
  import type { PerspectivePreset } from '../../system/depth/depth.js';
2
2
  import type { Snippet } from 'svelte';
3
+ /**
4
+ * Establishes CSS 3D perspective context. Wrap any 3D composition in this.
5
+ * @example
6
+ * <DepthStage perspective="mid">
7
+ * <DepthLayer level="ground"><HorizonGrid /></DepthLayer>
8
+ * <DepthLayer level="raised"><FloatCard>content</FloatCard></DepthLayer>
9
+ * </DepthStage>
10
+ */
3
11
  interface Props {
4
12
  /** Perspective distance preset. */
5
13
  perspective?: PerspectivePreset;
@@ -1,104 +1,129 @@
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>
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
+ import { onMount } from 'svelte';
7
+
8
+ /**
9
+ * Self-contained pointer-tilt card. Works standalone or inside a DepthStage.
10
+ * @example
11
+ * <FloatCard tiltMax={6}>
12
+ * <Text variant="heading">floating content</Text>
13
+ * <Text>card body</Text>
14
+ * </FloatCard>
15
+ */
16
+ interface Props {
17
+ /** Maximum tilt angle in degrees. */
18
+ tiltMax?: number;
19
+ /** Z-elevation on hover. */
20
+ elevation?: 'raised' | 'foreground';
21
+ /** Additional CSS classes. */
22
+ class?: string;
23
+ /** Card content. */
24
+ children?: Snippet;
25
+ }
26
+
27
+ let { tiltMax = 8, elevation = 'raised', class: className = '', children }: Props = $props();
28
+
29
+ let innerEl: HTMLDivElement | undefined = $state();
30
+ let tiltEnabled = $state(false);
31
+ let frame = 0;
32
+ let lastX = 0;
33
+ let lastY = 0;
34
+
35
+ const elevationMap: Record<string, string> = {
36
+ raised: 'var(--depth-raised)',
37
+ foreground: 'var(--depth-foreground)'
38
+ };
39
+
40
+ onMount(() => {
41
+ const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
42
+ const finePointer = window.matchMedia('(hover: hover) and (pointer: fine)').matches;
43
+ tiltEnabled = !reduced && finePointer;
44
+ });
45
+
46
+ function handlePointerMove(e: PointerEvent) {
47
+ if (!tiltEnabled || !innerEl) return;
48
+ const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();
49
+ lastX = (e.clientX - rect.left) / rect.width;
50
+ lastY = (e.clientY - rect.top) / rect.height;
51
+
52
+ if (!innerEl.style.willChange) innerEl.style.willChange = 'transform';
53
+ innerEl.classList.remove('hyvui-float-card-leaving');
54
+ if (frame) return;
55
+ frame = requestAnimationFrame(() => {
56
+ frame = 0;
57
+ if (!innerEl) return;
58
+ const tilt = tiltTransform(lastX, lastY, tiltMax);
59
+ innerEl.style.transform = `${tilt} translateZ(${elevationMap[elevation]})`;
60
+ });
61
+ }
62
+
63
+ function handlePointerLeave() {
64
+ if (!innerEl) return;
65
+ if (frame) cancelAnimationFrame(frame);
66
+ frame = 0;
67
+ innerEl.classList.add('hyvui-float-card-leaving');
68
+ innerEl.style.transform = 'rotateX(0deg) rotateY(0deg) translateZ(0px)';
69
+ innerEl.addEventListener(
70
+ 'transitionend',
71
+ () => {
72
+ if (innerEl) innerEl.style.willChange = '';
73
+ },
74
+ { once: true }
75
+ );
76
+ }
77
+ </script>
78
+
79
+ <div
80
+ class={cn('hyvui-float-card', className)}
81
+ role="presentation"
82
+ onpointermove={handlePointerMove}
83
+ onpointerleave={handlePointerLeave}
84
+ >
85
+ <div
86
+ class="hyvui-float-card-inner hyvui-float-card-leaving"
87
+ bind:this={innerEl}
88
+ style:transform="rotateX(0deg) rotateY(0deg) translateZ(0px)"
89
+ >
90
+ <Surface variant="card" class="hyvui-float-card-surface">
91
+ {#if children}{@render children()}{/if}
92
+ </Surface>
93
+ </div>
94
+ </div>
95
+
96
+ <style>
97
+ .hyvui-float-card {
98
+ perspective: var(--perspective-mid);
99
+ perspective-origin: 50% 50%;
100
+ }
101
+
102
+ .hyvui-float-card-inner {
103
+ transform-style: preserve-3d;
104
+ backface-visibility: hidden;
105
+ }
106
+
107
+ .hyvui-float-card-leaving {
108
+ transition: transform var(--depth-transition);
109
+ }
110
+
111
+ :global(.hyvui-float-card-surface) {
112
+ padding: var(--space-card);
113
+ }
114
+
115
+ @media (prefers-reduced-motion: reduce) {
116
+ .hyvui-float-card {
117
+ perspective: none;
118
+ }
119
+
120
+ .hyvui-float-card-inner {
121
+ transform: none !important;
122
+ transform-style: flat;
123
+ }
124
+
125
+ .hyvui-float-card-leaving {
126
+ transition: none;
127
+ }
128
+ }
129
+ </style>
@@ -1,4 +1,12 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * Self-contained pointer-tilt card. Works standalone or inside a DepthStage.
4
+ * @example
5
+ * <FloatCard tiltMax={6}>
6
+ * <Text variant="heading">floating content</Text>
7
+ * <Text>card body</Text>
8
+ * </FloatCard>
9
+ */
2
10
  interface Props {
3
11
  /** Maximum tilt angle in degrees. */
4
12
  tiltMax?: number;