@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,104 +1,111 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import CornerBrackets from '../ambient/CornerBrackets.svelte';
4
- import type { Snippet } from 'svelte';
5
-
6
- interface Props {
7
- /** Additional CSS classes. */
8
- class?: string;
9
- /** Above heading (Label or chapter expression). */
10
- label?: Snippet;
11
- /** Primary statement. */
12
- heading?: Snippet;
13
- /** Secondary line. */
14
- subheading?: Snippet;
15
- /** CTA area. */
16
- actions?: Snippet;
17
- /** Behind everything (GridOverlay, ParallaxLayer, etc.). */
18
- ambient?: Snippet;
19
- }
20
-
21
- let {
22
- class: className = '',
23
- label,
24
- heading,
25
- subheading,
26
- actions,
27
- ambient,
28
- }: Props = $props();
29
- </script>
30
-
31
- <section class={cn('hyvui-stage', className)}>
32
- {#if ambient}
33
- <div class="hyvui-stage-ambient" aria-hidden="true">
34
- {@render ambient()}
35
- </div>
36
- {/if}
37
- <div class="hyvui-stage-brackets" aria-hidden="true" style:opacity="var(--reg-ornament-opacity)">
38
- <CornerBrackets />
39
- </div>
40
- <div class="hyvui-stage-content">
41
- {#if label}
42
- <div class="hyvui-stage-label">
43
- {@render label()}
44
- </div>
45
- {/if}
46
- {#if heading}
47
- <div class="hyvui-stage-heading">
48
- {@render heading()}
49
- </div>
50
- {/if}
51
- {#if subheading}
52
- <div class="hyvui-stage-subheading">
53
- {@render subheading()}
54
- </div>
55
- {/if}
56
- {#if actions}
57
- <div class="hyvui-stage-actions">
58
- {@render actions()}
59
- </div>
60
- {/if}
61
- </div>
62
- </section>
63
-
64
- <style>
65
- .hyvui-stage {
66
- position: relative;
67
- min-height: 100dvh;
68
- padding: var(--space-scene);
69
- display: flex;
70
- align-items: center;
71
- justify-content: center;
72
- }
73
-
74
- .hyvui-stage-ambient {
75
- position: absolute;
76
- inset: 0;
77
- pointer-events: none;
78
- }
79
-
80
- .hyvui-stage-brackets {
81
- position: absolute;
82
- inset: var(--space-scene);
83
- pointer-events: none;
84
- }
85
-
86
- .hyvui-stage-content {
87
- position: relative;
88
- display: flex;
89
- flex-direction: column;
90
- align-items: center;
91
- text-align: center;
92
- gap: calc(2rem * var(--reg-spacing-scale));
93
- }
94
-
95
- .hyvui-stage-subheading {
96
- max-width: 32rem;
97
- }
98
-
99
- .hyvui-stage-actions {
100
- display: flex;
101
- gap: 0.75rem;
102
- margin-top: calc(-1rem * var(--reg-spacing-scale));
103
- }
104
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import CornerBrackets from '../ambient/CornerBrackets.svelte';
4
+ import type { Snippet } from 'svelte';
5
+
6
+ /**
7
+ * @remarks Use for hero, landing, or feature reveal pages. Centered, theatrical, full-viewport.
8
+ * @example
9
+ * <StageScene>
10
+ * {#snippet label()}<Label color="signal">v2.0 released</Label>{/snippet}
11
+ * {#snippet heading()}<Text expression="title-card" as="h1">deep signal</Text>{/snippet}
12
+ * {#snippet subheading()}<Text expression="manifesto">a quiet tool for deliberate work.</Text>{/snippet}
13
+ * {#snippet actions()}
14
+ * <Button variant="primary">get started</Button>
15
+ * <Button variant="ghost">learn more</Button>
16
+ * {/snippet}
17
+ * {#snippet ambient()}<GridOverlay />{/snippet}
18
+ * </StageScene>
19
+ */
20
+ interface Props {
21
+ /** Additional CSS classes. */
22
+ class?: string;
23
+ /** Above heading (Label or chapter expression). */
24
+ label?: Snippet;
25
+ /** Primary statement. */
26
+ heading?: Snippet;
27
+ /** Secondary line. */
28
+ subheading?: Snippet;
29
+ /** CTA area. */
30
+ actions?: Snippet;
31
+ /** Behind everything (GridOverlay, ParallaxLayer, etc.). */
32
+ ambient?: Snippet;
33
+ }
34
+
35
+ let { class: className = '', label, heading, subheading, actions, ambient }: Props = $props();
36
+ </script>
37
+
38
+ <section class={cn('hyvui-stage', className)}>
39
+ {#if ambient}
40
+ <div class="hyvui-stage-ambient" aria-hidden="true">
41
+ {@render ambient()}
42
+ </div>
43
+ {/if}
44
+ <div class="hyvui-stage-brackets" aria-hidden="true" style:opacity="var(--reg-ornament-opacity)">
45
+ <CornerBrackets />
46
+ </div>
47
+ <div class="hyvui-stage-content">
48
+ {#if label}
49
+ <div class="hyvui-stage-label">
50
+ {@render label()}
51
+ </div>
52
+ {/if}
53
+ {#if heading}
54
+ <div class="hyvui-stage-heading">
55
+ {@render heading()}
56
+ </div>
57
+ {/if}
58
+ {#if subheading}
59
+ <div class="hyvui-stage-subheading">
60
+ {@render subheading()}
61
+ </div>
62
+ {/if}
63
+ {#if actions}
64
+ <div class="hyvui-stage-actions">
65
+ {@render actions()}
66
+ </div>
67
+ {/if}
68
+ </div>
69
+ </section>
70
+
71
+ <style>
72
+ .hyvui-stage {
73
+ position: relative;
74
+ min-height: 100dvh;
75
+ padding: var(--space-scene);
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ }
80
+
81
+ .hyvui-stage-ambient {
82
+ position: absolute;
83
+ inset: 0;
84
+ pointer-events: none;
85
+ }
86
+
87
+ .hyvui-stage-brackets {
88
+ position: absolute;
89
+ inset: var(--space-scene);
90
+ pointer-events: none;
91
+ }
92
+
93
+ .hyvui-stage-content {
94
+ position: relative;
95
+ display: flex;
96
+ flex-direction: column;
97
+ align-items: center;
98
+ text-align: center;
99
+ gap: calc(2rem * var(--reg-spacing-scale));
100
+ }
101
+
102
+ .hyvui-stage-subheading {
103
+ max-width: 32rem;
104
+ }
105
+
106
+ .hyvui-stage-actions {
107
+ display: flex;
108
+ gap: 0.75rem;
109
+ margin-top: calc(-1rem * var(--reg-spacing-scale));
110
+ }
111
+ </style>
@@ -1,4 +1,18 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @remarks Use for hero, landing, or feature reveal pages. Centered, theatrical, full-viewport.
4
+ * @example
5
+ * <StageScene>
6
+ * {#snippet label()}<Label color="signal">v2.0 released</Label>{/snippet}
7
+ * {#snippet heading()}<Text expression="title-card" as="h1">deep signal</Text>{/snippet}
8
+ * {#snippet subheading()}<Text expression="manifesto">a quiet tool for deliberate work.</Text>{/snippet}
9
+ * {#snippet actions()}
10
+ * <Button variant="primary">get started</Button>
11
+ * <Button variant="ghost">learn more</Button>
12
+ * {/snippet}
13
+ * {#snippet ambient()}<GridOverlay />{/snippet}
14
+ * </StageScene>
15
+ */
2
16
  interface Props {
3
17
  /** Additional CSS classes. */
4
18
  class?: string;
@@ -0,0 +1,62 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { applyRegister, clearRegister } from '../../system/register.js';
4
+ import type { Register } from '../../system/register.js';
5
+ import Vignette from '../ambient/Vignette.svelte';
6
+
7
+ /**
8
+ * Zero-config app wrapper. Handles IBM Plex Mono font injection, register application
9
+ * to `<body>`, and the global Vignette overlay.
10
+ *
11
+ * Import `@hyvnt/hyvui/styles.css` separately in your app entry point.
12
+ *
13
+ * @example
14
+ * <AppShell register="mission-control">
15
+ * <Topbar />
16
+ * <StageScene>...</StageScene>
17
+ * </AppShell>
18
+ *
19
+ * @example
20
+ * <!-- opt out of automatic font + vignette -->
21
+ * <AppShell loadFonts={false} vignette={false}>
22
+ * <slot />
23
+ * </AppShell>
24
+ */
25
+ interface Props {
26
+ /** Design register applied to `<body>`. Controls font weighting and surface density. Omit for base styles. */
27
+ register?: Register | null;
28
+ /** Inject IBM Plex Mono (400) from Google Fonts via `<head>`. Default: true. */
29
+ loadFonts?: boolean;
30
+ /** Render the global Vignette overlay. Default: true. */
31
+ vignette?: boolean;
32
+ children?: Snippet;
33
+ }
34
+
35
+ let { register = null, loadFonts = true, vignette = true, children }: Props = $props();
36
+
37
+ $effect(() => {
38
+ if (register) {
39
+ applyRegister(register);
40
+ } else {
41
+ clearRegister();
42
+ }
43
+ return () => clearRegister();
44
+ });
45
+ </script>
46
+
47
+ <svelte:head>
48
+ {#if loadFonts}
49
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
50
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous" />
51
+ <link
52
+ href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400&display=swap"
53
+ rel="stylesheet"
54
+ />
55
+ {/if}
56
+ </svelte:head>
57
+
58
+ {#if vignette}
59
+ <Vignette />
60
+ {/if}
61
+
62
+ {@render children?.()}
@@ -0,0 +1,32 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { Register } from '../../system/register.js';
3
+ /**
4
+ * Zero-config app wrapper. Handles IBM Plex Mono font injection, register application
5
+ * to `<body>`, and the global Vignette overlay.
6
+ *
7
+ * Import `@hyvnt/hyvui/styles.css` separately in your app entry point.
8
+ *
9
+ * @example
10
+ * <AppShell register="mission-control">
11
+ * <Topbar />
12
+ * <StageScene>...</StageScene>
13
+ * </AppShell>
14
+ *
15
+ * @example
16
+ * <!-- opt out of automatic font + vignette -->
17
+ * <AppShell loadFonts={false} vignette={false}>
18
+ * <slot />
19
+ * </AppShell>
20
+ */
21
+ interface Props {
22
+ /** Design register applied to `<body>`. Controls font weighting and surface density. Omit for base styles. */
23
+ register?: Register | null;
24
+ /** Inject IBM Plex Mono (400) from Google Fonts via `<head>`. Default: true. */
25
+ loadFonts?: boolean;
26
+ /** Render the global Vignette overlay. Default: true. */
27
+ vignette?: boolean;
28
+ children?: Snippet;
29
+ }
30
+ declare const AppShell: import("svelte").Component<Props, {}, "">;
31
+ type AppShell = ReturnType<typeof AppShell>;
32
+ export default AppShell;
@@ -0,0 +1,364 @@
1
+ <!--
2
+ EXAMPLE: Arcane Shard
3
+ REGISTER: arcane
4
+ CONCEPT: a zaun research log — unstable readings, shimmer contamination, barely contained data
5
+ DEMONSTRATES: CrystalShard, ArcaneVein, ShimmerCloud, SignalRing, NarrativeScene, Panel, Text expressions, applyRegister
6
+ INSPIRED BY: a contaminated field report from beneath the undercity
7
+ -->
8
+ <script lang="ts">
9
+ import {
10
+ Text,
11
+ Label,
12
+ Badge,
13
+ Divider,
14
+ Stack,
15
+ Panel,
16
+ Card,
17
+ StatusDot,
18
+ StatusLine,
19
+ SignalRing,
20
+ NarrativeScene,
21
+ CrystalShard,
22
+ ArcaneVein,
23
+ ShimmerCloud,
24
+ surface,
25
+ applyRegister
26
+ } from '../index.js';
27
+ import { onMount } from 'svelte';
28
+
29
+ const readings = [
30
+ { ts: '04:12:08', signal: '0.003', status: 'baseline' },
31
+ { ts: '04:14:33', signal: '0.047', status: 'elevated' },
32
+ { ts: '04:18:51', signal: '0.214', status: 'elevated' },
33
+ { ts: '04:22:19', signal: '1.880', status: 'breach' },
34
+ { ts: '04:23:44', signal: '—', status: 'sensor lost' },
35
+ { ts: '04:31:02', signal: '0.009', status: 'resuming' }
36
+ ];
37
+
38
+ let glitchPhase = $state(false);
39
+ let intervalId: ReturnType<typeof setInterval> | undefined;
40
+
41
+ onMount(() => {
42
+ applyRegister('arcane');
43
+
44
+ intervalId = setInterval(() => {
45
+ glitchPhase = !glitchPhase;
46
+ }, 3800);
47
+
48
+ return () => {
49
+ clearInterval(intervalId);
50
+ applyRegister('field-notebook');
51
+ };
52
+ });
53
+ </script>
54
+
55
+ <svelte:head>
56
+ <title>arcane shard // hyvui</title>
57
+ </svelte:head>
58
+
59
+ <div class="shard-wrap">
60
+ <div class="shard-shimmer-host" aria-hidden="true">
61
+ <ShimmerCloud count={40} />
62
+ </div>
63
+
64
+ <div class="shard-shell">
65
+ <!-- Masthead -->
66
+ <header class="shard-header" use:surface>
67
+ <div class="shard-header-top">
68
+ <Text expression="readout">RESEARCH LOG // UNDERCITY SECTOR 7 // CLASSIFIED</Text>
69
+ <a href="/" class="shard-back">← library</a>
70
+ </div>
71
+ <div class="shard-header-status">
72
+ <StatusDot status="warn" size={7} />
73
+ <Label color="muted">shimmer contamination detected</Label>
74
+ <span class="shard-sep" aria-hidden="true">//</span>
75
+ <Label color="muted">data integrity uncertain</Label>
76
+ </div>
77
+ </header>
78
+
79
+ <ArcaneVein x1="0%" y1="0%" x2="100%" y2="0%" class="shard-divider-vein" />
80
+
81
+ <!-- Main body -->
82
+ <div class="shard-body">
83
+ <!-- Left: narrative -->
84
+ <div class="shard-narrative" use:surface={{ delay: 0 }}>
85
+ <div class="shard-lede">
86
+ <Text expression="title-card" class={glitchPhase ? 'shard-glitch' : ''}>
87
+ something leaked through
88
+ </Text>
89
+ </div>
90
+ <Text expression="manifesto">
91
+ the shimmer doesn't ask. it rewrites what it touches. six instruments failed before
92
+ we understood what we were measuring. the seventh survived — barely.
93
+ </Text>
94
+
95
+ <Divider />
96
+
97
+ <Stack gap="var(--space-md)">
98
+ <div use:surface={{ delay: 80 }}>
99
+ <Label color="accent">anomaly log / 2025.11.22 / 04:12–04:31</Label>
100
+ <div class="shard-log">
101
+ {#each readings as r}
102
+ <div class="shard-log-row" class:shard-log-row--breach={r.status === 'breach'} class:shard-log-row--lost={r.status === 'sensor lost'}>
103
+ <span class="shard-log-ts">{r.ts}</span>
104
+ <span class="shard-log-signal">{r.signal}</span>
105
+ <span class="shard-log-status">{r.status}</span>
106
+ </div>
107
+ {/each}
108
+ </div>
109
+ </div>
110
+
111
+ <div use:surface={{ delay: 160 }}>
112
+ <Text expression="whisper">
113
+ instruments 1 through 5 showed the same thing. instrument 6 showed nothing.
114
+ instrument 7 showed too much.
115
+ </Text>
116
+ </div>
117
+ </Stack>
118
+ </div>
119
+
120
+ <!-- Right: visual artifacts -->
121
+ <div class="shard-artifacts">
122
+ <div class="shard-shard-cluster" use:surface={{ delay: 40 }}>
123
+ <div class="shard-cluster-inner">
124
+ <SignalRing size={160} color="var(--arc-magenta, #b845c9)" class="shard-ring" />
125
+ <div class="shard-shards">
126
+ <CrystalShard size={90} class="shard-crystal shard-crystal--main" />
127
+ <CrystalShard size={42} class="shard-crystal shard-crystal--sm1" />
128
+ <CrystalShard size={28} class="shard-crystal shard-crystal--sm2" />
129
+ </div>
130
+ </div>
131
+ <Label color="muted">shimmer crystal fragment // specimen 7-C</Label>
132
+ </div>
133
+
134
+ <div class="shard-conduit" use:surface={{ delay: 120 }}>
135
+ <Label color="muted">vein trace // wall segment B</Label>
136
+ <div class="shard-conduit-canvas">
137
+ <ArcaneVein x1="10%" y1="90%" x2="90%" y2="10%" />
138
+ <ArcaneVein x1="5%" y1="60%" x2="65%" y2="20%" />
139
+ </div>
140
+ </div>
141
+
142
+ <div class="shard-status-panel" use:surface={{ delay: 200 }}>
143
+ <StatusLine status="warn" message="contamination level / elevated" visible={true} />
144
+ <StatusLine status="ok" message="instrument 7 / operational" visible={true} />
145
+ <StatusLine status="fail" message="containment / breached" visible={true} />
146
+ <StatusLine status="pend" message="recovery status / in progress" visible={true} />
147
+ </div>
148
+ </div>
149
+ </div>
150
+
151
+ <ArcaneVein x1="0%" y1="100%" x2="100%" y2="100%" class="shard-divider-vein" />
152
+
153
+ <footer class="shard-footer">
154
+ <Text expression="readout">END OF LOG // further entries pending instrument recovery</Text>
155
+ </footer>
156
+ </div>
157
+ </div>
158
+
159
+ <style>
160
+ .shard-wrap {
161
+ position: relative;
162
+ min-height: 100dvh;
163
+ background: var(--bg);
164
+ overflow: hidden;
165
+ }
166
+
167
+ .shard-shimmer-host {
168
+ position: fixed;
169
+ inset: 0;
170
+ z-index: 0;
171
+ pointer-events: none;
172
+ }
173
+
174
+ .shard-shell {
175
+ position: relative;
176
+ z-index: 1;
177
+ max-width: 72rem;
178
+ margin: 0 auto;
179
+ padding: var(--space-xl) var(--space-lg);
180
+ display: flex;
181
+ flex-direction: column;
182
+ gap: var(--space-lg);
183
+ }
184
+
185
+ .shard-header {
186
+ padding: var(--space-md) var(--space-lg);
187
+ border: 1px solid var(--line);
188
+ background: var(--surface-panel);
189
+ display: flex;
190
+ flex-direction: column;
191
+ gap: var(--space-xs);
192
+ }
193
+
194
+ .shard-header-top {
195
+ display: flex;
196
+ align-items: center;
197
+ justify-content: space-between;
198
+ }
199
+
200
+ .shard-header-status {
201
+ display: flex;
202
+ align-items: center;
203
+ gap: var(--space-sm);
204
+ }
205
+
206
+ .shard-sep {
207
+ font-family: var(--font-mono);
208
+ color: var(--muted);
209
+ font-size: 0.72rem;
210
+ }
211
+
212
+ .shard-back {
213
+ font-family: var(--font-mono);
214
+ font-size: 0.72rem;
215
+ letter-spacing: 0.1em;
216
+ color: var(--muted);
217
+ text-decoration: none;
218
+ transition: color var(--transition-fast);
219
+ }
220
+
221
+ .shard-back:hover {
222
+ color: var(--text);
223
+ }
224
+
225
+ :global(.shard-divider-vein) {
226
+ height: 2px;
227
+ position: relative;
228
+ }
229
+
230
+ .shard-body {
231
+ display: grid;
232
+ grid-template-columns: 1.2fr 1fr;
233
+ gap: var(--space-xl);
234
+ align-items: start;
235
+ }
236
+
237
+ .shard-narrative {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: var(--space-lg);
241
+ }
242
+
243
+ .shard-lede {
244
+ position: relative;
245
+ }
246
+
247
+ :global(.shard-glitch) {
248
+ animation: shard-glitch 0.18s steps(2) both;
249
+ }
250
+
251
+ @keyframes shard-glitch {
252
+ 0% { transform: translate(0); filter: none; }
253
+ 25% { transform: translate(-2px, 1px); filter: hue-rotate(40deg); }
254
+ 50% { transform: translate(2px, -1px); filter: hue-rotate(-40deg); }
255
+ 75% { transform: translate(-1px, 0); filter: none; }
256
+ 100% { transform: translate(0); }
257
+ }
258
+
259
+ .shard-log {
260
+ display: flex;
261
+ flex-direction: column;
262
+ margin-top: var(--space-sm);
263
+ font-family: var(--font-mono);
264
+ font-size: 0.78rem;
265
+ }
266
+
267
+ .shard-log-row {
268
+ display: grid;
269
+ grid-template-columns: 6ch 6ch 1fr;
270
+ gap: var(--space-sm);
271
+ padding: 0.35em 0;
272
+ border-bottom: 1px solid var(--line);
273
+ color: var(--muted);
274
+ }
275
+
276
+ .shard-log-row--breach {
277
+ color: var(--arc-shimmer, #e94cbc);
278
+ }
279
+
280
+ .shard-log-row--lost {
281
+ opacity: 0.45;
282
+ font-style: italic;
283
+ }
284
+
285
+ .shard-log-ts { color: var(--muted-strong); }
286
+ .shard-log-signal { color: var(--text); }
287
+
288
+ .shard-artifacts {
289
+ display: flex;
290
+ flex-direction: column;
291
+ gap: var(--space-lg);
292
+ }
293
+
294
+ .shard-shard-cluster {
295
+ display: flex;
296
+ flex-direction: column;
297
+ gap: var(--space-sm);
298
+ padding: var(--space-lg);
299
+ border: 1px solid var(--line);
300
+ background: var(--surface-panel);
301
+ }
302
+
303
+ .shard-cluster-inner {
304
+ position: relative;
305
+ height: 200px;
306
+ display: flex;
307
+ align-items: center;
308
+ justify-content: center;
309
+ }
310
+
311
+ :global(.shard-ring) {
312
+ position: absolute;
313
+ top: 50%;
314
+ left: 50%;
315
+ transform: translate(-50%, -50%);
316
+ opacity: 0.4;
317
+ }
318
+
319
+ .shard-shards {
320
+ position: relative;
321
+ display: flex;
322
+ align-items: flex-end;
323
+ gap: var(--space-xs);
324
+ }
325
+
326
+ .shard-conduit {
327
+ display: flex;
328
+ flex-direction: column;
329
+ gap: var(--space-sm);
330
+ padding: var(--space-md);
331
+ border: 1px solid var(--line);
332
+ background: var(--surface-panel);
333
+ }
334
+
335
+ .shard-conduit-canvas {
336
+ position: relative;
337
+ height: 100px;
338
+ }
339
+
340
+ .shard-status-panel {
341
+ display: flex;
342
+ flex-direction: column;
343
+ gap: var(--space-xs);
344
+ padding: var(--space-md);
345
+ border: 1px solid var(--line);
346
+ background: var(--surface-panel);
347
+ }
348
+
349
+ .shard-footer {
350
+ text-align: center;
351
+ padding: var(--space-md) 0;
352
+ opacity: 0.55;
353
+ }
354
+
355
+ @media (max-width: 768px) {
356
+ .shard-body {
357
+ grid-template-columns: 1fr;
358
+ }
359
+
360
+ .shard-shell {
361
+ padding: var(--space-lg) var(--space-md);
362
+ }
363
+ }
364
+ </style>