@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,68 +1,75 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import type { Snippet } from 'svelte';
4
-
5
- interface Props {
6
- /** Primary message. */
7
- title?: string;
8
- /** Secondary description text. */
9
- description?: string;
10
- /** Additional CSS classes. */
11
- class?: string;
12
- /** Optional CTA slot (e.g. a Button). */
13
- children?: Snippet;
14
- }
15
-
16
- let {
17
- title = 'nothing here yet',
18
- description = '',
19
- class: className = '',
20
- children,
21
- }: Props = $props();
22
- </script>
23
-
24
- <div class={cn('hyvui-empty', className)}>
25
- <p class="hyvui-empty-title">{title}</p>
26
- {#if description}
27
- <p class="hyvui-empty-desc">{description}</p>
28
- {/if}
29
- {#if children}
30
- <div class="hyvui-empty-action">
31
- {@render children()}
32
- </div>
33
- {/if}
34
- </div>
35
-
36
- <style>
37
- .hyvui-empty {
38
- display: flex;
39
- flex-direction: column;
40
- align-items: center;
41
- text-align: center;
42
- padding: 2rem;
43
- gap: 0.75rem;
44
- }
45
-
46
- .hyvui-empty-title {
47
- font-family: var(--font-body);
48
- font-size: 1.2rem;
49
- font-weight: 400;
50
- line-height: 0.93;
51
- letter-spacing: -0.04em;
52
- color: var(--text);
53
- margin: 0;
54
- }
55
-
56
- .hyvui-empty-desc {
57
- font-family: var(--font-body);
58
- font-size: 0.9rem;
59
- color: var(--muted);
60
- line-height: 1.5;
61
- max-width: 24rem;
62
- margin: 0;
63
- }
64
-
65
- .hyvui-empty-action {
66
- margin-top: 0.5rem;
67
- }
68
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ /**
6
+ * @example
7
+ * <EmptyState title="no records found" description="adjust your filters to see results" />
8
+ * <EmptyState title="nothing here yet">
9
+ * <Button variant="primary" onclick={create}>create one</Button>
10
+ * </EmptyState>
11
+ */
12
+ interface Props {
13
+ /** Primary message. */
14
+ title?: string;
15
+ /** Secondary description text. */
16
+ description?: string;
17
+ /** Additional CSS classes. */
18
+ class?: string;
19
+ /** Optional CTA slot (e.g. a Button). */
20
+ children?: Snippet;
21
+ }
22
+
23
+ let {
24
+ title = 'nothing here yet',
25
+ description = '',
26
+ class: className = '',
27
+ children
28
+ }: Props = $props();
29
+ </script>
30
+
31
+ <div class={cn('hyvui-empty', className)}>
32
+ <p class="hyvui-empty-title">{title}</p>
33
+ {#if description}
34
+ <p class="hyvui-empty-desc">{description}</p>
35
+ {/if}
36
+ {#if children}
37
+ <div class="hyvui-empty-action">
38
+ {@render children()}
39
+ </div>
40
+ {/if}
41
+ </div>
42
+
43
+ <style>
44
+ .hyvui-empty {
45
+ display: flex;
46
+ flex-direction: column;
47
+ align-items: center;
48
+ text-align: center;
49
+ padding: 2rem;
50
+ gap: 0.75rem;
51
+ }
52
+
53
+ .hyvui-empty-title {
54
+ font-family: var(--font-body);
55
+ font-size: 1.2rem;
56
+ font-weight: 400;
57
+ line-height: 0.93;
58
+ letter-spacing: -0.04em;
59
+ color: var(--text);
60
+ margin: 0;
61
+ }
62
+
63
+ .hyvui-empty-desc {
64
+ font-family: var(--font-body);
65
+ font-size: 0.9rem;
66
+ color: var(--muted);
67
+ line-height: 1.5;
68
+ max-width: 24rem;
69
+ margin: 0;
70
+ }
71
+
72
+ .hyvui-empty-action {
73
+ margin-top: 0.5rem;
74
+ }
75
+ </style>
@@ -1,4 +1,11 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @example
4
+ * <EmptyState title="no records found" description="adjust your filters to see results" />
5
+ * <EmptyState title="nothing here yet">
6
+ * <Button variant="primary" onclick={create}>create one</Button>
7
+ * </EmptyState>
8
+ */
2
9
  interface Props {
3
10
  /** Primary message. */
4
11
  title?: string;
@@ -1,73 +1,78 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import StatusDot from './StatusDot.svelte';
4
- import Button from '../inputs/Button.svelte';
5
-
6
- interface Props {
7
- /** Error condition title. Describes the condition, not the cause. */
8
- title?: string;
9
- /** Additional description text. */
10
- description?: string;
11
- /** Shows a retry button. */
12
- retry?: boolean;
13
- /** Additional CSS classes. */
14
- class?: string;
15
- /** Fires when the retry button is clicked. */
16
- onretry?: () => void;
17
- }
18
-
19
- let {
20
- title = 'the signal needs rest',
21
- description = '',
22
- retry = false,
23
- class: className = '',
24
- onretry,
25
- }: Props = $props();
26
- </script>
27
-
28
- <div class={cn('hyvui-error', className)}>
29
- <StatusDot status="fail" size={8} />
30
- <p class="hyvui-error-title">{title}</p>
31
- {#if description}
32
- <p class="hyvui-error-desc">{description}</p>
33
- {/if}
34
- {#if retry}
35
- <div class="hyvui-error-action">
36
- <Button variant="ghost" onclick={() => onretry?.()}>retry</Button>
37
- </div>
38
- {/if}
39
- </div>
40
-
41
- <style>
42
- .hyvui-error {
43
- display: flex;
44
- flex-direction: column;
45
- align-items: center;
46
- text-align: center;
47
- padding: 2rem;
48
- gap: 0.75rem;
49
- }
50
-
51
- .hyvui-error-title {
52
- font-family: var(--font-body);
53
- font-size: 1.2rem;
54
- font-weight: 400;
55
- line-height: 0.93;
56
- letter-spacing: -0.04em;
57
- color: var(--text);
58
- margin: 0;
59
- }
60
-
61
- .hyvui-error-desc {
62
- font-family: var(--font-body);
63
- font-size: 0.9rem;
64
- color: var(--muted);
65
- line-height: 1.5;
66
- max-width: 24rem;
67
- margin: 0;
68
- }
69
-
70
- .hyvui-error-action {
71
- margin-top: 0.5rem;
72
- }
73
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import StatusDot from './StatusDot.svelte';
4
+ import Button from '../inputs/Button.svelte';
5
+
6
+ /**
7
+ * @example
8
+ * <ErrorState title="signal lost" description="the connection dropped unexpectedly" retry onretry={reload} />
9
+ * <ErrorState title="the signal needs rest" />
10
+ */
11
+ interface Props {
12
+ /** Error condition title. Describes the condition, not the cause. */
13
+ title?: string;
14
+ /** Additional description text. */
15
+ description?: string;
16
+ /** Shows a retry button. */
17
+ retry?: boolean;
18
+ /** Additional CSS classes. */
19
+ class?: string;
20
+ /** Fires when the retry button is clicked. */
21
+ onretry?: () => void;
22
+ }
23
+
24
+ let {
25
+ title = 'the signal needs rest',
26
+ description = '',
27
+ retry = false,
28
+ class: className = '',
29
+ onretry
30
+ }: Props = $props();
31
+ </script>
32
+
33
+ <div class={cn('hyvui-error', className)}>
34
+ <StatusDot status="fail" size={8} />
35
+ <p class="hyvui-error-title">{title}</p>
36
+ {#if description}
37
+ <p class="hyvui-error-desc">{description}</p>
38
+ {/if}
39
+ {#if retry}
40
+ <div class="hyvui-error-action">
41
+ <Button variant="ghost" onclick={() => onretry?.()}>retry</Button>
42
+ </div>
43
+ {/if}
44
+ </div>
45
+
46
+ <style>
47
+ .hyvui-error {
48
+ display: flex;
49
+ flex-direction: column;
50
+ align-items: center;
51
+ text-align: center;
52
+ padding: 2rem;
53
+ gap: 0.75rem;
54
+ }
55
+
56
+ .hyvui-error-title {
57
+ font-family: var(--font-body);
58
+ font-size: 1.2rem;
59
+ font-weight: 400;
60
+ line-height: 0.93;
61
+ letter-spacing: -0.04em;
62
+ color: var(--text);
63
+ margin: 0;
64
+ }
65
+
66
+ .hyvui-error-desc {
67
+ font-family: var(--font-body);
68
+ font-size: 0.9rem;
69
+ color: var(--muted);
70
+ line-height: 1.5;
71
+ max-width: 24rem;
72
+ margin: 0;
73
+ }
74
+
75
+ .hyvui-error-action {
76
+ margin-top: 0.5rem;
77
+ }
78
+ </style>
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @example
3
+ * <ErrorState title="signal lost" description="the connection dropped unexpectedly" retry onretry={reload} />
4
+ * <ErrorState title="the signal needs rest" />
5
+ */
1
6
  interface Props {
2
7
  /** Error condition title. Describes the condition, not the cause. */
3
8
  title?: string;
@@ -1,52 +1,58 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
-
4
- interface Props {
5
- /** Width of the skeleton element. */
6
- width?: string;
7
- /** Height of the skeleton element. */
8
- height?: string;
9
- /** Shape variant. */
10
- variant?: 'text' | 'card' | 'circle' | 'custom';
11
- /** Additional CSS classes. */
12
- class?: string;
13
- }
14
-
15
- let {
16
- width = '100%',
17
- height = '1rem',
18
- variant = 'text',
19
- class: className = '',
20
- }: Props = $props();
21
- </script>
22
-
23
- <div
24
- class={cn('hyvui-skeleton', variant === 'circle' && 'hyvui-skeleton-circle', className)}
25
- style:width={width}
26
- style:height={height}
27
- aria-hidden="true"
28
- ></div>
29
-
30
- <style>
31
- .hyvui-skeleton {
32
- background: linear-gradient(
33
- 90deg,
34
- var(--bg-elev) 0%,
35
- rgba(199, 156, 87, 0.06) 50%,
36
- var(--bg-elev) 100%
37
- );
38
- background-size: 200% 100%;
39
- animation: shimmer 2s linear infinite;
40
- }
41
-
42
- .hyvui-skeleton-circle {
43
- border-radius: 50%;
44
- }
45
-
46
- @media (prefers-reduced-motion: reduce) {
47
- .hyvui-skeleton {
48
- animation: none;
49
- background: var(--bg-elev);
50
- }
51
- }
52
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ /**
5
+ * @example
6
+ * <Skeleton height="1.2rem" width="60%" />
7
+ * <Skeleton variant="circle" width="32px" height="32px" />
8
+ * <Skeleton variant="card" height="120px" />
9
+ */
10
+ interface Props {
11
+ /** Width of the skeleton element. */
12
+ width?: string;
13
+ /** Height of the skeleton element. */
14
+ height?: string;
15
+ /** Shape variant. */
16
+ variant?: 'text' | 'card' | 'circle' | 'custom';
17
+ /** Additional CSS classes. */
18
+ class?: string;
19
+ }
20
+
21
+ let {
22
+ width = '100%',
23
+ height = '1rem',
24
+ variant = 'text',
25
+ class: className = ''
26
+ }: Props = $props();
27
+ </script>
28
+
29
+ <div
30
+ class={cn('hyvui-skeleton', variant === 'circle' && 'hyvui-skeleton-circle', className)}
31
+ style:width
32
+ style:height
33
+ aria-hidden="true"
34
+ ></div>
35
+
36
+ <style>
37
+ .hyvui-skeleton {
38
+ background: linear-gradient(
39
+ 90deg,
40
+ var(--bg-elev) 0%,
41
+ rgba(199, 156, 87, 0.06) 50%,
42
+ var(--bg-elev) 100%
43
+ );
44
+ background-size: 200% 100%;
45
+ animation: shimmer 2s linear infinite;
46
+ }
47
+
48
+ .hyvui-skeleton-circle {
49
+ border-radius: 50%;
50
+ }
51
+
52
+ @media (prefers-reduced-motion: reduce) {
53
+ .hyvui-skeleton {
54
+ animation: none;
55
+ background: var(--bg-elev);
56
+ }
57
+ }
58
+ </style>
@@ -1,3 +1,9 @@
1
+ /**
2
+ * @example
3
+ * <Skeleton height="1.2rem" width="60%" />
4
+ * <Skeleton variant="circle" width="32px" height="32px" />
5
+ * <Skeleton variant="card" height="120px" />
6
+ */
1
7
  interface Props {
2
8
  /** Width of the skeleton element. */
3
9
  width?: string;
@@ -1,54 +1,84 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
-
4
- interface Props {
5
- /** Status state determining the dot color. */
6
- status?: 'ok' | 'pend' | 'warn' | 'fail';
7
- /** Enable pulse animation. */
8
- pulse?: boolean;
9
- /** Dot diameter in pixels. */
10
- size?: number;
11
- /** Additional CSS classes. */
12
- class?: string;
13
- }
14
-
15
- let {
16
- status = 'ok',
17
- pulse = true,
18
- size = 6,
19
- class: className = '',
20
- }: Props = $props();
21
-
22
- const colorMap: Record<string, string> = {
23
- ok: 'var(--status-ok)',
24
- pend: 'var(--status-pend)',
25
- warn: 'var(--status-warn)',
26
- fail: 'var(--status-fail)',
27
- };
28
- </script>
29
-
30
- <span
31
- class={cn('hyvui-status-dot', pulse && 'hyvui-status-dot-pulse', className)}
32
- style:width="{size}px"
33
- style:height="{size}px"
34
- style:background-color={colorMap[status]}
35
- aria-label="{status} status"
36
- ></span>
37
-
38
- <style>
39
- .hyvui-status-dot {
40
- display: inline-block;
41
- border-radius: 50%;
42
- flex-shrink: 0;
43
- }
44
-
45
- .hyvui-status-dot-pulse {
46
- animation: pulse-dot 2s ease-in-out infinite;
47
- }
48
-
49
- @media (prefers-reduced-motion: reduce) {
50
- .hyvui-status-dot-pulse {
51
- animation: none;
52
- }
53
- }
54
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ /**
5
+ * @example
6
+ * <StatusDot status="ok" />
7
+ * <StatusDot status="pend" pulse={false} />
8
+ * <StatusDot status="fail" size={8} />
9
+ */
10
+ interface Props {
11
+ /** Status state determining the dot color. */
12
+ status?: 'ok' | 'pend' | 'warn' | 'fail';
13
+ /** Enable pulse animation. */
14
+ pulse?: boolean;
15
+ /** Dot diameter in pixels. */
16
+ size?: number;
17
+ /** Additional CSS classes. */
18
+ class?: string;
19
+ }
20
+
21
+ let { status = 'ok', pulse = true, size = 6, class: className = '' }: Props = $props();
22
+
23
+ const colorMap: Record<string, string> = {
24
+ ok: 'var(--status-ok)',
25
+ pend: 'var(--status-pend)',
26
+ warn: 'var(--status-warn)',
27
+ fail: 'var(--status-fail)'
28
+ };
29
+ </script>
30
+
31
+ <span
32
+ class={cn('hyvui-status-dot', pulse && 'hyvui-status-dot-pulse', className)}
33
+ style:width="{size}px"
34
+ style:height="{size}px"
35
+ style:background-color={colorMap[status]}
36
+ aria-label="{status} status"
37
+ ></span>
38
+
39
+ <style>
40
+ .hyvui-status-dot {
41
+ display: inline-block;
42
+ border-radius: 50%;
43
+ flex-shrink: 0;
44
+ }
45
+
46
+ .hyvui-status-dot-pulse {
47
+ animation: pulse-dot 2s cubic-bezier(0.37, 0, 0.63, 1) infinite;
48
+ }
49
+
50
+ @media (prefers-reduced-motion: reduce) {
51
+ .hyvui-status-dot-pulse {
52
+ animation: none;
53
+ }
54
+ }
55
+
56
+ /* ── hextech: cyan ring pulse instead of scale ────────────────────── */
57
+ :global([data-register='hextech']) .hyvui-status-dot-pulse {
58
+ animation: sd-hextech-pulse 2.4s cubic-bezier(0.16, 1, 0.3, 1) infinite;
59
+ }
60
+
61
+ @keyframes sd-hextech-pulse {
62
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(93, 217, 240, 0.0); }
63
+ 50% { box-shadow: 0 0 0 4px rgba(93, 217, 240, 0.0); opacity: 1; }
64
+ 30% { box-shadow: 0 0 0 3px rgba(93, 217, 240, 0.35); opacity: 1; }
65
+ }
66
+
67
+ /* ── arcane: shimmer ripple ───────────────────────────────────────── */
68
+ :global([data-register='arcane']) .hyvui-status-dot-pulse {
69
+ animation: sd-arcane-pulse 2s cubic-bezier(0.6, 0, 0.4, 1) infinite;
70
+ }
71
+
72
+ @keyframes sd-arcane-pulse {
73
+ 0% { box-shadow: 0 0 0 0 rgba(184, 69, 201, 0.6); opacity: 1; }
74
+ 70% { box-shadow: 0 0 0 5px rgba(184, 69, 201, 0); opacity: 0.85; }
75
+ 100% { box-shadow: 0 0 0 0 rgba(184, 69, 201, 0); opacity: 1; }
76
+ }
77
+
78
+ @media (prefers-reduced-motion: reduce) {
79
+ :global([data-register='hextech']) .hyvui-status-dot-pulse,
80
+ :global([data-register='arcane']) .hyvui-status-dot-pulse {
81
+ animation: none;
82
+ }
83
+ }
84
+ </style>
@@ -1,3 +1,9 @@
1
+ /**
2
+ * @example
3
+ * <StatusDot status="ok" />
4
+ * <StatusDot status="pend" pulse={false} />
5
+ * <StatusDot status="fail" size={8} />
6
+ */
1
7
  interface Props {
2
8
  /** Status state determining the dot color. */
3
9
  status?: 'ok' | 'pend' | 'warn' | 'fail';