@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,59 +1,59 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import Input from '../inputs/Input.svelte';
4
- import StatusDot from '../feedback/StatusDot.svelte';
5
-
6
- interface Props {
7
- /** Current search value (bindable). */
8
- value?: string;
9
- /** Placeholder text. */
10
- placeholder?: string;
11
- /** Shows a loading indicator. */
12
- loading?: boolean;
13
- /** Additional CSS classes. */
14
- class?: string;
15
- /** Fires on input with the current value. */
16
- onsearch?: (value: string) => void;
17
- }
18
-
19
- let {
20
- value = $bindable(''),
21
- placeholder = 'search',
22
- loading = false,
23
- class: className = '',
24
- onsearch,
25
- }: Props = $props();
26
-
27
- function handleInput() {
28
- onsearch?.(value);
29
- }
30
- </script>
31
-
32
- <div class={cn('hyvui-search-bar', className)}>
33
- <Input
34
- type="search"
35
- bind:value
36
- {placeholder}
37
- oninput={handleInput}
38
- />
39
- {#if loading}
40
- <div class="hyvui-search-loading">
41
- <StatusDot status="pend" size={6} />
42
- </div>
43
- {/if}
44
- </div>
45
-
46
- <style>
47
- .hyvui-search-bar {
48
- position: relative;
49
- width: 100%;
50
- }
51
-
52
- .hyvui-search-loading {
53
- position: absolute;
54
- right: 0.9rem;
55
- top: 50%;
56
- transform: translateY(-50%);
57
- pointer-events: none;
58
- }
59
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import Input from '../inputs/Input.svelte';
4
+ import StatusDot from '../feedback/StatusDot.svelte';
5
+
6
+ /**
7
+ * @remarks Use in PageHeader actions slot or ArchiveScene filter slot.
8
+ * @example
9
+ * <SearchBar bind:value={query} onsearch={handleSearch} loading={isSearching} />
10
+ */
11
+ interface Props {
12
+ /** Current search value (bindable). */
13
+ value?: string;
14
+ /** Placeholder text. */
15
+ placeholder?: string;
16
+ /** Shows a loading indicator. */
17
+ loading?: boolean;
18
+ /** Additional CSS classes. */
19
+ class?: string;
20
+ /** Fires on input with the current value. */
21
+ onsearch?: (value: string) => void;
22
+ }
23
+
24
+ let {
25
+ value = $bindable(''),
26
+ placeholder = 'search',
27
+ loading = false,
28
+ class: className = '',
29
+ onsearch
30
+ }: Props = $props();
31
+
32
+ function handleInput() {
33
+ onsearch?.(value);
34
+ }
35
+ </script>
36
+
37
+ <div class={cn('hyvui-search-bar', className)}>
38
+ <Input type="search" bind:value {placeholder} oninput={handleInput} />
39
+ {#if loading}
40
+ <div class="hyvui-search-loading">
41
+ <StatusDot status="pend" size={6} />
42
+ </div>
43
+ {/if}
44
+ </div>
45
+
46
+ <style>
47
+ .hyvui-search-bar {
48
+ position: relative;
49
+ width: 100%;
50
+ }
51
+
52
+ .hyvui-search-loading {
53
+ position: absolute;
54
+ right: 0.9rem;
55
+ top: 50%;
56
+ transform: translateY(-50%);
57
+ pointer-events: none;
58
+ }
59
+ </style>
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @remarks Use in PageHeader actions slot or ArchiveScene filter slot.
3
+ * @example
4
+ * <SearchBar bind:value={query} onsearch={handleSearch} loading={isSearching} />
5
+ */
1
6
  interface Props {
2
7
  /** Current search value (bindable). */
3
8
  value?: string;
@@ -0,0 +1,117 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import CornerBrackets from '../ambient/CornerBrackets.svelte';
4
+ import DepthStage from '../depth/DepthStage.svelte';
5
+ import DepthLayer from '../depth/DepthLayer.svelte';
6
+ import HorizonGrid from '../depth/HorizonGrid.svelte';
7
+ import type { PerspectivePreset } from '../../system/depth/depth.js';
8
+ import type { Snippet } from 'svelte';
9
+
10
+ /**
11
+ * @remarks Composed spatial stage: HorizonGrid backdrop + DepthStage + CornerBrackets in one component.
12
+ * The missing entry point into the depth system for showcasing content.
13
+ * @example
14
+ * <ShowcaseFrame perspective="mid" animated>
15
+ * {#snippet label()}<span>artifact / 001</span>{/snippet}
16
+ * <FloatCard>your content</FloatCard>
17
+ * </ShowcaseFrame>
18
+ */
19
+ interface Props {
20
+ /** Perspective distance preset. */
21
+ perspective?: PerspectivePreset;
22
+ /** Animate the HorizonGrid lines. */
23
+ animated?: boolean;
24
+ /** Label rendered in readout style at the bottom-left. */
25
+ label?: Snippet;
26
+ /** Minimum height of the frame. */
27
+ minHeight?: string;
28
+ /** Additional CSS classes. */
29
+ class?: string;
30
+ /** Content rendered at raised depth level. */
31
+ children?: Snippet;
32
+ }
33
+
34
+ let {
35
+ perspective = 'mid',
36
+ animated = false,
37
+ label,
38
+ minHeight = '28rem',
39
+ class: className = '',
40
+ children
41
+ }: Props = $props();
42
+ </script>
43
+
44
+ <div class={cn('hyvui-showcase-frame', className)} style:min-height={minHeight}>
45
+ <HorizonGrid class="hyvui-showcase-frame-grid" {animated} vanishY={0.36} rows={14} cols={10} />
46
+
47
+ <div class="hyvui-showcase-frame-brackets" aria-hidden="true" style:opacity="var(--reg-ornament-opacity)">
48
+ <CornerBrackets size={18} />
49
+ </div>
50
+
51
+ <DepthStage {perspective} class="hyvui-showcase-frame-stage">
52
+ <DepthLayer level="raised" class="hyvui-showcase-frame-layer">
53
+ {#if children}{@render children()}{/if}
54
+ </DepthLayer>
55
+ </DepthStage>
56
+
57
+ {#if label}
58
+ <div class="hyvui-showcase-frame-label" aria-hidden="true">
59
+ {@render label()}
60
+ </div>
61
+ {/if}
62
+ </div>
63
+
64
+ <style>
65
+ .hyvui-showcase-frame {
66
+ position: relative;
67
+ overflow: hidden;
68
+ border: 1px solid var(--line);
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ }
73
+
74
+ :global(.hyvui-showcase-frame-grid) {
75
+ position: absolute;
76
+ inset: 0;
77
+ }
78
+
79
+ .hyvui-showcase-frame-brackets {
80
+ position: absolute;
81
+ inset: 1rem;
82
+ pointer-events: none;
83
+ }
84
+
85
+ :global(.hyvui-showcase-frame-stage) {
86
+ position: relative;
87
+ width: 100%;
88
+ height: 100%;
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: center;
92
+ }
93
+
94
+ :global(.hyvui-showcase-frame-layer) {
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: center;
98
+ }
99
+
100
+ .hyvui-showcase-frame-label {
101
+ position: absolute;
102
+ bottom: calc(0.75rem * var(--reg-spacing-scale, 1));
103
+ left: calc(0.9rem * var(--reg-spacing-scale, 1));
104
+ font-family: var(--font-mono);
105
+ font-size: 0.82rem;
106
+ letter-spacing: 0.06em;
107
+ color: var(--muted);
108
+ line-height: 1.6;
109
+ pointer-events: none;
110
+ }
111
+
112
+ @media (prefers-reduced-motion: reduce) {
113
+ :global(.hyvui-showcase-frame-grid canvas) {
114
+ display: none;
115
+ }
116
+ }
117
+ </style>
@@ -0,0 +1,28 @@
1
+ import type { PerspectivePreset } from '../../system/depth/depth.js';
2
+ import type { Snippet } from 'svelte';
3
+ /**
4
+ * @remarks Composed spatial stage: HorizonGrid backdrop + DepthStage + CornerBrackets in one component.
5
+ * The missing entry point into the depth system for showcasing content.
6
+ * @example
7
+ * <ShowcaseFrame perspective="mid" animated>
8
+ * {#snippet label()}<span>artifact / 001</span>{/snippet}
9
+ * <FloatCard>your content</FloatCard>
10
+ * </ShowcaseFrame>
11
+ */
12
+ interface Props {
13
+ /** Perspective distance preset. */
14
+ perspective?: PerspectivePreset;
15
+ /** Animate the HorizonGrid lines. */
16
+ animated?: boolean;
17
+ /** Label rendered in readout style at the bottom-left. */
18
+ label?: Snippet;
19
+ /** Minimum height of the frame. */
20
+ minHeight?: string;
21
+ /** Additional CSS classes. */
22
+ class?: string;
23
+ /** Content rendered at raised depth level. */
24
+ children?: Snippet;
25
+ }
26
+ declare const ShowcaseFrame: import("svelte").Component<Props, {}, "">;
27
+ type ShowcaseFrame = ReturnType<typeof ShowcaseFrame>;
28
+ export default ShowcaseFrame;
@@ -1,104 +1,118 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import StatusLine from '../feedback/StatusLine.svelte';
4
- import { onMount } from 'svelte';
5
-
6
- interface BootLine {
7
- status: 'ok' | 'pend' | 'warn' | 'fail';
8
- message: string;
9
- }
10
-
11
- interface Props {
12
- /** Lines to display in sequence. */
13
- lines?: BootLine[];
14
- /** Initial delay before the first line appears (ms). */
15
- delay?: number;
16
- /** Interval between each line appearing (ms). */
17
- interval?: number;
18
- /** When true, shows all lines immediately. */
19
- instant?: boolean;
20
- /** Passes cursor visibility to visible lines. */
21
- showCursor?: boolean;
22
- /** Status line tone mode. */
23
- tone?: 'split' | 'line';
24
- /** Additional CSS classes. */
25
- class?: string;
26
- /** Fires when all lines have appeared. */
27
- oncomplete?: () => void;
28
- }
29
-
30
- let {
31
- lines = [],
32
- delay = 600,
33
- interval = 700,
34
- instant = false,
35
- showCursor = false,
36
- tone = 'split',
37
- class: className = '',
38
- oncomplete,
39
- }: Props = $props();
40
-
41
- let visibleCount = $state(0);
42
-
43
- onMount(() => {
44
- if (lines.length === 0) {
45
- oncomplete?.();
46
- return;
47
- }
48
-
49
- if (instant) {
50
- visibleCount = lines.length;
51
- oncomplete?.();
52
- return;
53
- }
54
-
55
- const timers: number[] = [];
56
- timers.push(
57
- window.setTimeout(() => {
58
- visibleCount = 1;
59
-
60
- if (lines.length === 1) {
61
- oncomplete?.();
62
- return;
63
- }
64
-
65
- const stepTimer = window.setInterval(() => {
66
- visibleCount += 1;
67
- if (visibleCount >= lines.length) {
68
- window.clearInterval(stepTimer);
69
- oncomplete?.();
70
- }
71
- }, interval);
72
-
73
- timers.push(stepTimer);
74
- }, delay)
75
- );
76
-
77
- return () => {
78
- for (const timer of timers) {
79
- window.clearTimeout(timer);
80
- window.clearInterval(timer);
81
- }
82
- };
83
- });
84
- </script>
85
-
86
- <div class={cn('hyvui-terminal-boot', className)}>
87
- {#each lines as line, i}
88
- <StatusLine
89
- status={line.status}
90
- message={line.message}
91
- visible={i < visibleCount}
92
- tone={tone}
93
- cursor={showCursor && i < visibleCount}
94
- />
95
- {/each}
96
- </div>
97
-
98
- <style>
99
- .hyvui-terminal-boot {
100
- display: flex;
101
- flex-direction: column;
102
- gap: 0.375rem;
103
- }
104
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import StatusLine from '../feedback/StatusLine.svelte';
4
+ import { onMount } from 'svelte';
5
+
6
+ interface BootLine {
7
+ status: 'ok' | 'pend' | 'warn' | 'fail';
8
+ message: string;
9
+ }
10
+
11
+ /**
12
+ * @remarks Use in LogScene or as a standalone loading sequence for system init screens.
13
+ * @example
14
+ * <TerminalBoot
15
+ * lines={[
16
+ * { status: 'ok', message: 'database connected' },
17
+ * { status: 'pend', message: 'loading modules...' },
18
+ * { status: 'ok', message: 'system ready' }
19
+ * ]}
20
+ * oncomplete={() => ready = true}
21
+ * />
22
+ */
23
+ interface Props {
24
+ /** Lines to display in sequence. */
25
+ lines?: BootLine[];
26
+ /** Initial delay before the first line appears (ms). */
27
+ delay?: number;
28
+ /** Interval between each line appearing (ms). */
29
+ interval?: number;
30
+ /** When true, shows all lines immediately. */
31
+ instant?: boolean;
32
+ /** Passes cursor visibility to visible lines. */
33
+ showCursor?: boolean;
34
+ /** Status line tone mode. */
35
+ tone?: 'split' | 'line';
36
+ /** Additional CSS classes. */
37
+ class?: string;
38
+ /** Fires when all lines have appeared. */
39
+ oncomplete?: () => void;
40
+ }
41
+
42
+ let {
43
+ lines = [],
44
+ delay = 600,
45
+ interval = 700,
46
+ instant = false,
47
+ showCursor = false,
48
+ tone = 'split',
49
+ class: className = '',
50
+ oncomplete
51
+ }: Props = $props();
52
+
53
+ let visibleCount = $state(0);
54
+
55
+ onMount(() => {
56
+ if (lines.length === 0) {
57
+ oncomplete?.();
58
+ return;
59
+ }
60
+
61
+ const prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
62
+
63
+ if (instant || prefersReduced) {
64
+ visibleCount = lines.length;
65
+ oncomplete?.();
66
+ return;
67
+ }
68
+
69
+ const timers: number[] = [];
70
+ timers.push(
71
+ window.setTimeout(() => {
72
+ visibleCount = 1;
73
+
74
+ if (lines.length === 1) {
75
+ oncomplete?.();
76
+ return;
77
+ }
78
+
79
+ const stepTimer = window.setInterval(() => {
80
+ visibleCount += 1;
81
+ if (visibleCount >= lines.length) {
82
+ window.clearInterval(stepTimer);
83
+ oncomplete?.();
84
+ }
85
+ }, interval);
86
+
87
+ timers.push(stepTimer);
88
+ }, delay)
89
+ );
90
+
91
+ return () => {
92
+ for (const timer of timers) {
93
+ window.clearTimeout(timer);
94
+ window.clearInterval(timer);
95
+ }
96
+ };
97
+ });
98
+ </script>
99
+
100
+ <div class={cn('hyvui-terminal-boot', className)}>
101
+ {#each lines as line, i}
102
+ <StatusLine
103
+ status={line.status}
104
+ message={line.message}
105
+ visible={i < visibleCount}
106
+ {tone}
107
+ cursor={showCursor && i < visibleCount}
108
+ />
109
+ {/each}
110
+ </div>
111
+
112
+ <style>
113
+ .hyvui-terminal-boot {
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: 0.375rem;
117
+ }
118
+ </style>
@@ -2,6 +2,18 @@ interface BootLine {
2
2
  status: 'ok' | 'pend' | 'warn' | 'fail';
3
3
  message: string;
4
4
  }
5
+ /**
6
+ * @remarks Use in LogScene or as a standalone loading sequence for system init screens.
7
+ * @example
8
+ * <TerminalBoot
9
+ * lines={[
10
+ * { status: 'ok', message: 'database connected' },
11
+ * { status: 'pend', message: 'loading modules...' },
12
+ * { status: 'ok', message: 'system ready' }
13
+ * ]}
14
+ * oncomplete={() => ready = true}
15
+ * />
16
+ */
5
17
  interface Props {
6
18
  /** Lines to display in sequence. */
7
19
  lines?: BootLine[];
@@ -1,29 +1,56 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
-
4
- interface Props {
5
- /** Line visibility strength. */
6
- strength?: 'default' | 'strong';
7
- /** Additional CSS classes. */
8
- class?: string;
9
- }
10
-
11
- let {
12
- strength = 'default',
13
- class: className = '',
14
- }: Props = $props();
15
- </script>
16
-
17
- <hr
18
- class={cn('hyvui-divider', className)}
19
- style:border-color={strength === 'strong' ? 'var(--line-strong)' : 'var(--line)'}
20
- />
21
-
22
- <style>
23
- .hyvui-divider {
24
- border: none;
25
- border-top: 1px solid;
26
- margin: 0;
27
- width: 100%;
28
- }
29
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ /**
5
+ * @example
6
+ * <Divider />
7
+ * <Divider strength="strong" />
8
+ */
9
+ interface Props {
10
+ /** Line visibility strength. */
11
+ strength?: 'default' | 'strong';
12
+ /** Additional CSS classes. */
13
+ class?: string;
14
+ }
15
+
16
+ let { strength = 'default', class: className = '' }: Props = $props();
17
+ </script>
18
+
19
+ <hr
20
+ class={cn('hyvui-divider', className)}
21
+ style:border-color={strength === 'strong' ? 'var(--line-strong)' : 'var(--line)'}
22
+ />
23
+
24
+ <style>
25
+ .hyvui-divider {
26
+ border: none;
27
+ border-top: 1px solid;
28
+ margin: 0;
29
+ width: 100%;
30
+ }
31
+
32
+ /* ── hextech: fade to brass at edges ──────────────────────────────── */
33
+ :global([data-register='hextech']) .hyvui-divider {
34
+ border-image: linear-gradient(
35
+ to right,
36
+ transparent,
37
+ rgba(184, 115, 51, 0.5) 20%,
38
+ rgba(93, 217, 240, 0.35) 50%,
39
+ rgba(184, 115, 51, 0.5) 80%,
40
+ transparent
41
+ ) 1;
42
+ }
43
+
44
+ /* ── arcane: violet glow, center-bright ───────────────────────────── */
45
+ :global([data-register='arcane']) .hyvui-divider {
46
+ border-image: linear-gradient(
47
+ to right,
48
+ transparent,
49
+ rgba(184, 69, 201, 0.55) 25%,
50
+ rgba(233, 76, 188, 0.65) 50%,
51
+ rgba(184, 69, 201, 0.55) 75%,
52
+ transparent
53
+ ) 1;
54
+ filter: drop-shadow(0 0 3px rgba(184, 69, 201, 0.3));
55
+ }
56
+ </style>
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @example
3
+ * <Divider />
4
+ * <Divider strength="strong" />
5
+ */
1
6
  interface Props {
2
7
  /** Line visibility strength. */
3
8
  strength?: 'default' | 'strong';