@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,77 +1,86 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import ScanBand from '../ambient/ScanBand.svelte';
4
- import GridOverlay from '../ambient/GridOverlay.svelte';
5
- import type { Snippet } from 'svelte';
6
-
7
- interface Props {
8
- /** Additional CSS classes. */
9
- class?: string;
10
- /** Above the log area (system name, StatusDot row). */
11
- header?: Snippet;
12
- /** Log content area (TerminalBoot, StatusLine, CodeBlock). */
13
- children?: Snippet;
14
- /** Below the log area (status summary, CTA). */
15
- footer?: Snippet;
16
- }
17
-
18
- let {
19
- class: className = '',
20
- header,
21
- children,
22
- footer,
23
- }: Props = $props();
24
- </script>
25
-
26
- <section class={cn('hyvui-log', className)}>
27
- <div class="hyvui-log-ambient" aria-hidden="true">
28
- <div style:opacity="0.06">
29
- <GridOverlay />
30
- </div>
31
- <ScanBand />
32
- </div>
33
- <div class="hyvui-log-inner">
34
- {#if header}
35
- <div class="hyvui-log-header">
36
- {@render header()}
37
- </div>
38
- {/if}
39
- <div class="hyvui-log-content">
40
- {#if children}{@render children()}{/if}
41
- </div>
42
- {#if footer}
43
- <div class="hyvui-log-footer">
44
- {@render footer()}
45
- </div>
46
- {/if}
47
- </div>
48
- </section>
49
-
50
- <style>
51
- .hyvui-log {
52
- position: relative;
53
- min-height: 100dvh;
54
- padding: var(--space-scene);
55
- background-color: var(--bg);
56
- }
57
-
58
- .hyvui-log-ambient {
59
- position: absolute;
60
- inset: 0;
61
- pointer-events: none;
62
- }
63
-
64
- .hyvui-log-inner {
65
- position: relative;
66
- display: flex;
67
- flex-direction: column;
68
- gap: calc(1.5rem * var(--reg-spacing-scale));
69
- width: 100%;
70
- }
71
-
72
- .hyvui-log-content {
73
- font-family: var(--font-mono);
74
- border-left: 2px solid rgba(121, 166, 163, 0.18);
75
- padding-left: 1.5rem;
76
- }
77
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import ScanBand from '../ambient/ScanBand.svelte';
4
+ import GridOverlay from '../ambient/GridOverlay.svelte';
5
+ import type { Snippet } from 'svelte';
6
+
7
+ /**
8
+ * @remarks Use for process output, system boot sequences, build logs. Full-width terminal layout.
9
+ * @example
10
+ * <LogScene>
11
+ * {#snippet header()}
12
+ * <Label color="signal">deployment log</Label>
13
+ * <StatusDot status="pend" />
14
+ * {/snippet}
15
+ * <TerminalBoot lines={bootLines} oncomplete={() => deployed = true} />
16
+ * {#snippet footer()}
17
+ * {#if deployed}<Button variant="primary">view deployment</Button>{/if}
18
+ * {/snippet}
19
+ * </LogScene>
20
+ */
21
+ interface Props {
22
+ /** Additional CSS classes. */
23
+ class?: string;
24
+ /** Above the log area (system name, StatusDot row). */
25
+ header?: Snippet;
26
+ /** Log content area (TerminalBoot, StatusLine, CodeBlock). */
27
+ children?: Snippet;
28
+ /** Below the log area (status summary, CTA). */
29
+ footer?: Snippet;
30
+ }
31
+
32
+ let { class: className = '', header, children, footer }: Props = $props();
33
+ </script>
34
+
35
+ <section class={cn('hyvui-log', className)}>
36
+ <div class="hyvui-log-ambient" aria-hidden="true">
37
+ <div style:opacity="0.06">
38
+ <GridOverlay />
39
+ </div>
40
+ <ScanBand />
41
+ </div>
42
+ <div class="hyvui-log-inner">
43
+ {#if header}
44
+ <div class="hyvui-log-header">
45
+ {@render header()}
46
+ </div>
47
+ {/if}
48
+ <div class="hyvui-log-content">
49
+ {#if children}{@render children()}{/if}
50
+ </div>
51
+ {#if footer}
52
+ <div class="hyvui-log-footer">
53
+ {@render footer()}
54
+ </div>
55
+ {/if}
56
+ </div>
57
+ </section>
58
+
59
+ <style>
60
+ .hyvui-log {
61
+ position: relative;
62
+ min-height: 100dvh;
63
+ padding: var(--space-scene);
64
+ background-color: var(--bg);
65
+ }
66
+
67
+ .hyvui-log-ambient {
68
+ position: absolute;
69
+ inset: 0;
70
+ pointer-events: none;
71
+ }
72
+
73
+ .hyvui-log-inner {
74
+ position: relative;
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: calc(1.5rem * var(--reg-spacing-scale));
78
+ width: 100%;
79
+ }
80
+
81
+ .hyvui-log-content {
82
+ font-family: var(--font-mono);
83
+ border-left: 2px solid rgba(121, 166, 163, 0.18);
84
+ padding-left: 1.5rem;
85
+ }
86
+ </style>
@@ -1,4 +1,18 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @remarks Use for process output, system boot sequences, build logs. Full-width terminal layout.
4
+ * @example
5
+ * <LogScene>
6
+ * {#snippet header()}
7
+ * <Label color="signal">deployment log</Label>
8
+ * <StatusDot status="pend" />
9
+ * {/snippet}
10
+ * <TerminalBoot lines={bootLines} oncomplete={() => deployed = true} />
11
+ * {#snippet footer()}
12
+ * {#if deployed}<Button variant="primary">view deployment</Button>{/if}
13
+ * {/snippet}
14
+ * </LogScene>
15
+ */
2
16
  interface Props {
3
17
  /** Additional CSS classes. */
4
18
  class?: string;
@@ -1,92 +1,100 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import GridOverlay from '../ambient/GridOverlay.svelte';
4
- import type { Snippet } from 'svelte';
5
-
6
- interface Props {
7
- /** Section label rendered as a chapter expression above the heading. */
8
- chapter?: string;
9
- /** Additional CSS classes. */
10
- class?: string;
11
- /** The scene's title content. */
12
- heading?: Snippet;
13
- /** Prose content in the narrow left column. */
14
- copy?: Snippet;
15
- /** Open canvas area in the right column. */
16
- canvas?: Snippet;
17
- }
18
-
19
- let {
20
- chapter = '',
21
- class: className = '',
22
- heading,
23
- copy,
24
- canvas,
25
- }: Props = $props();
26
- </script>
27
-
28
- <section class={cn('hyvui-narrative', className)}>
29
- <div class="hyvui-narrative-grid-bg" aria-hidden="true" style:opacity="var(--reg-ornament-opacity)">
30
- <GridOverlay />
31
- </div>
32
- <div class="hyvui-narrative-grid">
33
- <div class="hyvui-narrative-copy">
34
- {#if chapter}
35
- <span class="expr-chapter">{chapter}</span>
36
- {/if}
37
- {#if heading}
38
- <div class="hyvui-narrative-heading">
39
- {@render heading()}
40
- </div>
41
- {/if}
42
- {#if copy}
43
- <div class="hyvui-narrative-prose">
44
- {@render copy()}
45
- </div>
46
- {/if}
47
- </div>
48
- {#if canvas}
49
- <div class="hyvui-narrative-canvas">
50
- {@render canvas()}
51
- </div>
52
- {/if}
53
- </div>
54
- </section>
55
-
56
- <style>
57
- .hyvui-narrative {
58
- position: relative;
59
- min-height: 100dvh;
60
- padding: var(--space-scene);
61
- display: flex;
62
- align-items: center;
63
- }
64
-
65
- .hyvui-narrative-grid-bg {
66
- position: absolute;
67
- inset: 0;
68
- pointer-events: none;
69
- }
70
-
71
- .hyvui-narrative-grid {
72
- position: relative;
73
- display: grid;
74
- grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr);
75
- gap: calc(2rem * var(--reg-spacing-scale));
76
- width: 100%;
77
- align-items: center;
78
- }
79
-
80
- .hyvui-narrative-copy {
81
- display: flex;
82
- flex-direction: column;
83
- gap: calc(1.25rem * var(--reg-spacing-scale));
84
- max-width: 30rem;
85
- }
86
-
87
- @media (max-width: 768px) {
88
- .hyvui-narrative-grid {
89
- grid-template-columns: 1fr;
90
- }
91
- }
92
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import GridOverlay from '../ambient/GridOverlay.svelte';
4
+ import type { Snippet } from 'svelte';
5
+
6
+ /**
7
+ * @remarks Use for about pages, portfolio storytelling, feature narratives. Asymmetric: copy left, canvas right.
8
+ * @example
9
+ * <NarrativeScene chapter="our story">
10
+ * {#snippet heading()}<Text variant="heading" as="h2">the long signal</Text>{/snippet}
11
+ * {#snippet copy()}<Text>prose content describing the narrative here.</Text>{/snippet}
12
+ * {#snippet canvas()}<FloatCard><img src="/feature.jpg" alt="" /></FloatCard>{/snippet}
13
+ * </NarrativeScene>
14
+ */
15
+ interface Props {
16
+ /** Section label rendered as a chapter expression above the heading. */
17
+ chapter?: string;
18
+ /** Additional CSS classes. */
19
+ class?: string;
20
+ /** The scene's title content. */
21
+ heading?: Snippet;
22
+ /** Prose content in the narrow left column. */
23
+ copy?: Snippet;
24
+ /** Open canvas area in the right column. */
25
+ canvas?: Snippet;
26
+ }
27
+
28
+ let { chapter = '', class: className = '', heading, copy, canvas }: Props = $props();
29
+ </script>
30
+
31
+ <section class={cn('hyvui-narrative', className)}>
32
+ <div
33
+ class="hyvui-narrative-grid-bg"
34
+ aria-hidden="true"
35
+ style:opacity="var(--reg-ornament-opacity)"
36
+ >
37
+ <GridOverlay />
38
+ </div>
39
+ <div class="hyvui-narrative-grid">
40
+ <div class="hyvui-narrative-copy">
41
+ {#if chapter}
42
+ <span class="expr-chapter">{chapter}</span>
43
+ {/if}
44
+ {#if heading}
45
+ <div class="hyvui-narrative-heading">
46
+ {@render heading()}
47
+ </div>
48
+ {/if}
49
+ {#if copy}
50
+ <div class="hyvui-narrative-prose">
51
+ {@render copy()}
52
+ </div>
53
+ {/if}
54
+ </div>
55
+ {#if canvas}
56
+ <div class="hyvui-narrative-canvas">
57
+ {@render canvas()}
58
+ </div>
59
+ {/if}
60
+ </div>
61
+ </section>
62
+
63
+ <style>
64
+ .hyvui-narrative {
65
+ position: relative;
66
+ min-height: 100dvh;
67
+ padding: var(--space-scene);
68
+ display: flex;
69
+ align-items: center;
70
+ container-type: inline-size;
71
+ }
72
+
73
+ .hyvui-narrative-grid-bg {
74
+ position: absolute;
75
+ inset: 0;
76
+ pointer-events: none;
77
+ }
78
+
79
+ .hyvui-narrative-grid {
80
+ position: relative;
81
+ display: grid;
82
+ grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr);
83
+ gap: calc(2rem * var(--reg-spacing-scale));
84
+ width: 100%;
85
+ align-items: center;
86
+ }
87
+
88
+ .hyvui-narrative-copy {
89
+ display: flex;
90
+ flex-direction: column;
91
+ gap: calc(1.25rem * var(--reg-spacing-scale));
92
+ max-width: 30rem;
93
+ }
94
+
95
+ @container (max-width: var(--cq-md)) {
96
+ .hyvui-narrative-grid {
97
+ grid-template-columns: 1fr;
98
+ }
99
+ }
100
+ </style>
@@ -1,4 +1,13 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @remarks Use for about pages, portfolio storytelling, feature narratives. Asymmetric: copy left, canvas right.
4
+ * @example
5
+ * <NarrativeScene chapter="our story">
6
+ * {#snippet heading()}<Text variant="heading" as="h2">the long signal</Text>{/snippet}
7
+ * {#snippet copy()}<Text>prose content describing the narrative here.</Text>{/snippet}
8
+ * {#snippet canvas()}<FloatCard><img src="/feature.jpg" alt="" /></FloatCard>{/snippet}
9
+ * </NarrativeScene>
10
+ */
2
11
  interface Props {
3
12
  /** Section label rendered as a chapter expression above the heading. */
4
13
  chapter?: string;
@@ -1,107 +1,131 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import ScanBand from '../ambient/ScanBand.svelte';
4
- import type { Snippet } from 'svelte';
5
-
6
- interface Props {
7
- /** Optional title rendered as a readout expression label. */
8
- title?: string;
9
- /** Additional CSS classes. */
10
- class?: string;
11
- /** Top bar area for labels and status indicators. */
12
- header?: Snippet;
13
- /** Main content area. */
14
- children?: Snippet;
15
- /** Optional right sidebar (fixed width ~260px). */
16
- sidebar?: Snippet;
17
- }
18
-
19
- let {
20
- title = '',
21
- class: className = '',
22
- header,
23
- children,
24
- sidebar,
25
- }: Props = $props();
26
- </script>
27
-
28
- <section class={cn('hyvui-readout', className)}>
29
- <div class="hyvui-readout-scan" aria-hidden="true" style:opacity="calc(0.4 * var(--reg-ornament-opacity))">
30
- <ScanBand />
31
- </div>
32
- <div class="hyvui-readout-inner">
33
- {#if header || title}
34
- <div class="hyvui-readout-header">
35
- {#if title}
36
- <span class="expr-readout">{title}</span>
37
- {/if}
38
- {#if header}
39
- {@render header()}
40
- {/if}
41
- </div>
42
- {/if}
43
- <div class={cn('hyvui-readout-body', sidebar && 'hyvui-readout-body-sidebar')}>
44
- <div class="hyvui-readout-main">
45
- {#if children}{@render children()}{/if}
46
- </div>
47
- {#if sidebar}
48
- <aside class="hyvui-readout-sidebar">
49
- {@render sidebar()}
50
- </aside>
51
- {/if}
52
- </div>
53
- </div>
54
- </section>
55
-
56
- <style>
57
- .hyvui-readout {
58
- position: relative;
59
- min-height: 100dvh;
60
- padding: var(--space-scene);
61
- background-color: var(--bg);
62
- }
63
-
64
- .hyvui-readout-scan {
65
- position: absolute;
66
- inset: 0;
67
- pointer-events: none;
68
- }
69
-
70
- .hyvui-readout-inner {
71
- position: relative;
72
- display: flex;
73
- flex-direction: column;
74
- gap: calc(1.5rem * var(--reg-spacing-scale));
75
- width: 100%;
76
- }
77
-
78
- .hyvui-readout-header {
79
- display: flex;
80
- align-items: center;
81
- gap: 1rem;
82
- }
83
-
84
- .hyvui-readout-body {
85
- width: 100%;
86
- }
87
-
88
- .hyvui-readout-body-sidebar {
89
- display: grid;
90
- grid-template-columns: 1fr 260px;
91
- gap: calc(1.5rem * var(--reg-spacing-scale));
92
- }
93
-
94
- .hyvui-readout-main {
95
- min-width: 0;
96
- }
97
-
98
- .hyvui-readout-sidebar {
99
- min-width: 0;
100
- }
101
-
102
- @media (max-width: 768px) {
103
- .hyvui-readout-body-sidebar {
104
- grid-template-columns: 1fr;
105
- }
106
- }
107
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import ScanBand from '../ambient/ScanBand.svelte';
4
+ import type { Snippet } from 'svelte';
5
+
6
+ /**
7
+ * @remarks Use for dashboards, data views, log monitors. Dense, mono-forward with optional right sidebar.
8
+ * @example
9
+ * <ReadoutScene title="mission control">
10
+ * {#snippet header()}<StatusDot status="ok" /><Label>all systems nominal</Label>{/snippet}
11
+ * <Grid minColWidth="14rem" maxCols={4}>
12
+ * <MetricCard label="uptime" value="99.9%" />
13
+ * </Grid>
14
+ * {#snippet sidebar()}<SidebarNav items={navItems} />{/snippet}
15
+ * </ReadoutScene>
16
+ */
17
+ interface Props {
18
+ /** Optional title rendered as a readout expression label. */
19
+ title?: string;
20
+ /** Additional CSS classes. */
21
+ class?: string;
22
+ /** Top bar area for labels and status indicators. */
23
+ header?: Snippet;
24
+ /** Main content area. */
25
+ children?: Snippet;
26
+ /** Optional right sidebar. */
27
+ sidebar?: Snippet;
28
+ /** Sidebar width (used when sidebar is provided). */
29
+ sidebarWidth?: string;
30
+ }
31
+
32
+ let {
33
+ title = '',
34
+ class: className = '',
35
+ header,
36
+ children,
37
+ sidebar,
38
+ sidebarWidth = '17rem'
39
+ }: Props = $props();
40
+ </script>
41
+
42
+ <section class={cn('hyvui-readout', className)}>
43
+ <div
44
+ class="hyvui-readout-scan"
45
+ aria-hidden="true"
46
+ style:opacity="calc(0.4 * var(--reg-ornament-opacity))"
47
+ >
48
+ <ScanBand />
49
+ </div>
50
+ <div class="hyvui-readout-inner">
51
+ {#if header || title}
52
+ <div class="hyvui-readout-header">
53
+ {#if title}
54
+ <span class="expr-readout">{title}</span>
55
+ {/if}
56
+ {#if header}
57
+ {@render header()}
58
+ {/if}
59
+ </div>
60
+ {/if}
61
+ <div
62
+ class={cn('hyvui-readout-body', sidebar && 'hyvui-readout-body-sidebar')}
63
+ style:--hyv-readout-sidebar-w={sidebarWidth}
64
+ >
65
+ <div class="hyvui-readout-main">
66
+ {#if children}{@render children()}{/if}
67
+ </div>
68
+ {#if sidebar}
69
+ <aside class="hyvui-readout-sidebar">
70
+ {@render sidebar()}
71
+ </aside>
72
+ {/if}
73
+ </div>
74
+ </div>
75
+ </section>
76
+
77
+ <style>
78
+ .hyvui-readout {
79
+ position: relative;
80
+ min-height: 100dvh;
81
+ padding: var(--space-scene);
82
+ background-color: var(--bg);
83
+ container-type: inline-size;
84
+ }
85
+
86
+ .hyvui-readout-scan {
87
+ position: absolute;
88
+ inset: 0;
89
+ pointer-events: none;
90
+ }
91
+
92
+ .hyvui-readout-inner {
93
+ position: relative;
94
+ display: flex;
95
+ flex-direction: column;
96
+ gap: calc(1.5rem * var(--reg-spacing-scale));
97
+ width: 100%;
98
+ }
99
+
100
+ .hyvui-readout-header {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 1rem;
104
+ flex-wrap: wrap;
105
+ min-width: 0;
106
+ }
107
+
108
+ .hyvui-readout-body {
109
+ width: 100%;
110
+ }
111
+
112
+ .hyvui-readout-body-sidebar {
113
+ display: grid;
114
+ grid-template-columns: minmax(0, 1fr) minmax(0, var(--hyv-readout-sidebar-w, 17rem));
115
+ gap: calc(1.5rem * var(--reg-spacing-scale));
116
+ }
117
+
118
+ .hyvui-readout-main {
119
+ min-width: 0;
120
+ }
121
+
122
+ .hyvui-readout-sidebar {
123
+ min-width: 0;
124
+ }
125
+
126
+ @container (max-width: var(--cq-md)) {
127
+ .hyvui-readout-body-sidebar {
128
+ grid-template-columns: 1fr;
129
+ }
130
+ }
131
+ </style>
@@ -1,4 +1,15 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @remarks Use for dashboards, data views, log monitors. Dense, mono-forward with optional right sidebar.
4
+ * @example
5
+ * <ReadoutScene title="mission control">
6
+ * {#snippet header()}<StatusDot status="ok" /><Label>all systems nominal</Label>{/snippet}
7
+ * <Grid minColWidth="14rem" maxCols={4}>
8
+ * <MetricCard label="uptime" value="99.9%" />
9
+ * </Grid>
10
+ * {#snippet sidebar()}<SidebarNav items={navItems} />{/snippet}
11
+ * </ReadoutScene>
12
+ */
2
13
  interface Props {
3
14
  /** Optional title rendered as a readout expression label. */
4
15
  title?: string;
@@ -8,8 +19,10 @@ interface Props {
8
19
  header?: Snippet;
9
20
  /** Main content area. */
10
21
  children?: Snippet;
11
- /** Optional right sidebar (fixed width ~260px). */
22
+ /** Optional right sidebar. */
12
23
  sidebar?: Snippet;
24
+ /** Sidebar width (used when sidebar is provided). */
25
+ sidebarWidth?: string;
13
26
  }
14
27
  declare const ReadoutScene: import("svelte").Component<Props, {}, "">;
15
28
  type ReadoutScene = ReturnType<typeof ReadoutScene>;