@hyvnt/hyvui 0.3.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 (170) hide show
  1. package/README.md +37 -7
  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 +8 -0
  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 +7 -1
  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 +6 -0
  15. package/dist/components/ambient/GlyphMark.svelte.d.ts +6 -0
  16. package/dist/components/ambient/GridOverlay.svelte +8 -0
  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 +9 -1
  21. package/dist/components/ambient/ParallaxLayer.svelte.d.ts +7 -0
  22. package/dist/components/ambient/ScanBand.svelte +8 -0
  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 +7 -1
  27. package/dist/components/ambient/SignalRing.svelte.d.ts +6 -0
  28. package/dist/components/ambient/ThreadLine.svelte +7 -0
  29. package/dist/components/ambient/ThreadLine.svelte.d.ts +7 -0
  30. package/dist/components/ambient/Vignette.svelte +6 -0
  31. package/dist/components/ambient/Vignette.svelte.d.ts +6 -0
  32. package/dist/components/depth/DepthLayer.svelte +8 -0
  33. package/dist/components/depth/DepthLayer.svelte.d.ts +8 -0
  34. package/dist/components/depth/DepthStage.svelte +8 -4
  35. package/dist/components/depth/DepthStage.svelte.d.ts +8 -0
  36. package/dist/components/depth/FloatCard.svelte +17 -1
  37. package/dist/components/depth/FloatCard.svelte.d.ts +8 -0
  38. package/dist/components/depth/HorizonGrid.svelte +25 -0
  39. package/dist/components/depth/HorizonGrid.svelte.d.ts +9 -0
  40. package/dist/components/depth/Plinth.svelte +10 -0
  41. package/dist/components/depth/Plinth.svelte.d.ts +10 -0
  42. package/dist/components/display/Avatar.svelte +5 -0
  43. package/dist/components/display/Avatar.svelte.d.ts +5 -0
  44. package/dist/components/display/Badge.svelte +16 -0
  45. package/dist/components/display/Badge.svelte.d.ts +6 -0
  46. package/dist/components/display/Blockquote.svelte +4 -0
  47. package/dist/components/display/Blockquote.svelte.d.ts +4 -0
  48. package/dist/components/display/CodeBlock.svelte +5 -0
  49. package/dist/components/display/CodeBlock.svelte.d.ts +5 -0
  50. package/dist/components/display/MetricCard.svelte +23 -0
  51. package/dist/components/display/MetricCard.svelte.d.ts +6 -0
  52. package/dist/components/display/Table.svelte +7 -0
  53. package/dist/components/display/Table.svelte.d.ts +7 -0
  54. package/dist/components/feedback/Alert.svelte +24 -0
  55. package/dist/components/feedback/Alert.svelte.d.ts +6 -0
  56. package/dist/components/feedback/EmptyState.svelte +7 -0
  57. package/dist/components/feedback/EmptyState.svelte.d.ts +7 -0
  58. package/dist/components/feedback/ErrorState.svelte +5 -0
  59. package/dist/components/feedback/ErrorState.svelte.d.ts +5 -0
  60. package/dist/components/feedback/Skeleton.svelte +6 -0
  61. package/dist/components/feedback/Skeleton.svelte.d.ts +6 -0
  62. package/dist/components/feedback/StatusDot.svelte +36 -1
  63. package/dist/components/feedback/StatusDot.svelte.d.ts +6 -0
  64. package/dist/components/feedback/StatusLine.svelte +8 -2
  65. package/dist/components/feedback/StatusLine.svelte.d.ts +6 -0
  66. package/dist/components/feedback/Toast.svelte +16 -2
  67. package/dist/components/feedback/Toast.svelte.d.ts +10 -0
  68. package/dist/components/inputs/Button.svelte +74 -4
  69. package/dist/components/inputs/Button.svelte.d.ts +8 -0
  70. package/dist/components/inputs/Checkbox.svelte +5 -0
  71. package/dist/components/inputs/Checkbox.svelte.d.ts +5 -0
  72. package/dist/components/inputs/FileUpload.svelte +5 -0
  73. package/dist/components/inputs/FileUpload.svelte.d.ts +5 -0
  74. package/dist/components/inputs/Input.svelte +10 -2
  75. package/dist/components/inputs/Input.svelte.d.ts +7 -0
  76. package/dist/components/inputs/Select.svelte +8 -0
  77. package/dist/components/inputs/Select.svelte.d.ts +8 -0
  78. package/dist/components/inputs/Textarea.svelte +9 -2
  79. package/dist/components/inputs/Textarea.svelte.d.ts +6 -0
  80. package/dist/components/inputs/Toggle.svelte +6 -1
  81. package/dist/components/inputs/Toggle.svelte.d.ts +5 -0
  82. package/dist/components/layout/Card.svelte +11 -0
  83. package/dist/components/layout/Card.svelte.d.ts +11 -0
  84. package/dist/components/layout/Drawer.svelte +7 -0
  85. package/dist/components/layout/Drawer.svelte.d.ts +6 -0
  86. package/dist/components/layout/Grid.svelte +10 -0
  87. package/dist/components/layout/Grid.svelte.d.ts +10 -0
  88. package/dist/components/layout/Modal.svelte +15 -0
  89. package/dist/components/layout/Modal.svelte.d.ts +10 -0
  90. package/dist/components/layout/Panel.svelte +9 -0
  91. package/dist/components/layout/Panel.svelte.d.ts +9 -0
  92. package/dist/components/layout/Popover.svelte +10 -0
  93. package/dist/components/layout/Popover.svelte.d.ts +9 -0
  94. package/dist/components/layout/Stack.svelte +12 -0
  95. package/dist/components/layout/Stack.svelte.d.ts +12 -0
  96. package/dist/components/navigation/Breadcrumb.svelte +8 -0
  97. package/dist/components/navigation/Breadcrumb.svelte.d.ts +8 -0
  98. package/dist/components/navigation/DropdownMenu.svelte +12 -0
  99. package/dist/components/navigation/DropdownMenu.svelte.d.ts +12 -0
  100. package/dist/components/navigation/SidebarNav.svelte +10 -0
  101. package/dist/components/navigation/SidebarNav.svelte.d.ts +9 -0
  102. package/dist/components/navigation/Tabs.svelte +26 -1
  103. package/dist/components/navigation/Tabs.svelte.d.ts +8 -0
  104. package/dist/components/navigation/Topbar.svelte +9 -0
  105. package/dist/components/navigation/Topbar.svelte.d.ts +9 -0
  106. package/dist/components/patterns/ActionBar.svelte +11 -0
  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 +12 -0
  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 +8 -0
  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 +5 -0
  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 +15 -1
  127. package/dist/components/patterns/TerminalBoot.svelte.d.ts +12 -0
  128. package/dist/components/primitives/Divider.svelte +30 -0
  129. package/dist/components/primitives/Divider.svelte.d.ts +5 -0
  130. package/dist/components/primitives/Icon.svelte +9 -0
  131. package/dist/components/primitives/Icon.svelte.d.ts +9 -0
  132. package/dist/components/primitives/Label.svelte +6 -0
  133. package/dist/components/primitives/Label.svelte.d.ts +6 -0
  134. package/dist/components/primitives/Surface.svelte +67 -2
  135. package/dist/components/primitives/Surface.svelte.d.ts +7 -0
  136. package/dist/components/primitives/Text.svelte +32 -0
  137. package/dist/components/primitives/Text.svelte.d.ts +7 -0
  138. package/dist/components/scenes/ArchiveScene.svelte +10 -0
  139. package/dist/components/scenes/ArchiveScene.svelte.d.ts +10 -0
  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 +14 -0
  143. package/dist/components/scenes/LogScene.svelte.d.ts +14 -0
  144. package/dist/components/scenes/NarrativeScene.svelte +9 -0
  145. package/dist/components/scenes/NarrativeScene.svelte.d.ts +9 -0
  146. package/dist/components/scenes/ReadoutScene.svelte +11 -0
  147. package/dist/components/scenes/ReadoutScene.svelte.d.ts +11 -0
  148. package/dist/components/scenes/StageScene.svelte +14 -0
  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/HextechForge.svelte +324 -0
  155. package/dist/examples/HextechForge.svelte.d.ts +3 -0
  156. package/dist/index.d.ts +15 -1
  157. package/dist/index.js +16 -1
  158. package/dist/styles.css +2 -0
  159. package/dist/system/actions/echo.js +13 -4
  160. package/dist/system/actions/resolve.js +20 -6
  161. package/dist/system/actions/reveal.js +1 -1
  162. package/dist/system/actions/surface.js +1 -3
  163. package/dist/system/register.d.ts +1 -1
  164. package/dist/system/register.js +5 -1
  165. package/dist/tokens/arcane.css +96 -0
  166. package/dist/tokens/hextech.css +96 -0
  167. package/dist/tokens/tokens.css +6 -4
  168. package/dist/tokens/tokens.d.ts +41 -0
  169. package/dist/tokens/tokens.js +41 -0
  170. package/package.json +6 -2
@@ -0,0 +1,171 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ /**
5
+ * @remarks Full editorial statement block. Text in space, not text in a box.
6
+ * Use for philosophical statements, design principles, section intros.
7
+ * @example
8
+ * <Manifesto
9
+ * statement="quiet confidence. technical depth. no ornamental sludge."
10
+ * attribution="design posture"
11
+ * accent="gold"
12
+ * />
13
+ */
14
+ interface Props {
15
+ /** The statement text. */
16
+ statement: string;
17
+ /** Optional attribution label rendered below in readout style. */
18
+ attribution?: string;
19
+ /** Side accent rule color. */
20
+ accent?: 'gold' | 'signal' | 'none';
21
+ /** Text alignment. */
22
+ align?: 'left' | 'center';
23
+ /** Additional CSS classes. */
24
+ class?: string;
25
+ }
26
+
27
+ let {
28
+ statement,
29
+ attribution,
30
+ accent = 'none',
31
+ align = 'left',
32
+ class: className = ''
33
+ }: Props = $props();
34
+ </script>
35
+
36
+ <blockquote
37
+ class={cn('hyvui-manifesto', `hyvui-manifesto--accent-${accent}`, `hyvui-manifesto--${align}`, className)}
38
+ >
39
+ <p class="hyvui-manifesto-statement">{statement}</p>
40
+ {#if attribution}
41
+ <footer class="hyvui-manifesto-attribution">
42
+ <span class="hyvui-manifesto-rule" aria-hidden="true"></span>
43
+ <cite class="hyvui-manifesto-cite">{attribution}</cite>
44
+ </footer>
45
+ {/if}
46
+ </blockquote>
47
+
48
+ <style>
49
+ .hyvui-manifesto {
50
+ margin: 0;
51
+ padding: 0;
52
+ border: none;
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: calc(1rem * var(--reg-spacing-scale, 1));
56
+ }
57
+
58
+ /* accent rule — pseudo-element so it can animate scaleY */
59
+ .hyvui-manifesto--accent-gold,
60
+ .hyvui-manifesto--accent-signal {
61
+ position: relative;
62
+ padding-left: 1.25rem;
63
+ }
64
+
65
+ .hyvui-manifesto--accent-gold::before,
66
+ .hyvui-manifesto--accent-signal::before {
67
+ content: '';
68
+ position: absolute;
69
+ left: 0;
70
+ top: 0;
71
+ width: 2px;
72
+ height: 100%;
73
+ transform-origin: top;
74
+ animation: manifesto-rule-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
75
+ }
76
+
77
+ .hyvui-manifesto--accent-gold::before {
78
+ background: rgba(199, 156, 87, 0.5);
79
+ }
80
+
81
+ .hyvui-manifesto--accent-signal::before {
82
+ background: rgba(121, 166, 163, 0.5);
83
+ }
84
+
85
+ @keyframes manifesto-rule-in {
86
+ from {
87
+ transform: scaleY(0);
88
+ }
89
+ to {
90
+ transform: scaleY(1);
91
+ }
92
+ }
93
+
94
+ .hyvui-manifesto--center {
95
+ align-items: center;
96
+ text-align: center;
97
+ padding-left: 0;
98
+ }
99
+
100
+ .hyvui-manifesto--center::before {
101
+ display: none;
102
+ }
103
+
104
+ /* statement */
105
+ .hyvui-manifesto-statement {
106
+ margin: 0;
107
+ font-family: var(--font-body);
108
+ font-style: italic;
109
+ font-size: clamp(1.1rem, 2.5vw, 1.6rem);
110
+ line-height: 1.45;
111
+ color: var(--text-soft);
112
+ max-width: 30rem;
113
+ text-wrap: pretty;
114
+ animation: manifesto-text-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) 0.1s both;
115
+ }
116
+
117
+ @keyframes manifesto-text-in {
118
+ from {
119
+ opacity: 0;
120
+ transform: translateX(4px);
121
+ }
122
+ to {
123
+ opacity: 1;
124
+ transform: translateX(0);
125
+ }
126
+ }
127
+
128
+ @media (prefers-reduced-motion: reduce) {
129
+ .hyvui-manifesto--accent-gold::before,
130
+ .hyvui-manifesto--accent-signal::before {
131
+ animation: none;
132
+ }
133
+
134
+ .hyvui-manifesto-statement {
135
+ animation: none;
136
+ }
137
+ }
138
+
139
+ .hyvui-manifesto--center .hyvui-manifesto-statement {
140
+ text-align: center;
141
+ max-width: 36rem;
142
+ }
143
+
144
+ /* attribution */
145
+ .hyvui-manifesto-attribution {
146
+ display: flex;
147
+ align-items: center;
148
+ gap: 0.6rem;
149
+ }
150
+
151
+ .hyvui-manifesto-rule {
152
+ display: block;
153
+ width: 2rem;
154
+ height: 1px;
155
+ background: var(--line);
156
+ flex-shrink: 0;
157
+ }
158
+
159
+ .hyvui-manifesto-cite {
160
+ font-style: normal;
161
+ font-family: var(--font-mono);
162
+ font-size: 0.82rem;
163
+ letter-spacing: 0.06em;
164
+ color: var(--muted);
165
+ line-height: 1.6;
166
+ }
167
+
168
+ .hyvui-manifesto--center .hyvui-manifesto-attribution {
169
+ justify-content: center;
170
+ }
171
+ </style>
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @remarks Full editorial statement block. Text in space, not text in a box.
3
+ * Use for philosophical statements, design principles, section intros.
4
+ * @example
5
+ * <Manifesto
6
+ * statement="quiet confidence. technical depth. no ornamental sludge."
7
+ * attribution="design posture"
8
+ * accent="gold"
9
+ * />
10
+ */
11
+ interface Props {
12
+ /** The statement text. */
13
+ statement: string;
14
+ /** Optional attribution label rendered below in readout style. */
15
+ attribution?: string;
16
+ /** Side accent rule color. */
17
+ accent?: 'gold' | 'signal' | 'none';
18
+ /** Text alignment. */
19
+ align?: 'left' | 'center';
20
+ /** Additional CSS classes. */
21
+ class?: string;
22
+ }
23
+ declare const Manifesto: import("svelte").Component<Props, {}, "">;
24
+ type Manifesto = ReturnType<typeof Manifesto>;
25
+ export default Manifesto;
@@ -2,6 +2,14 @@
2
2
  import { cn } from '../../utils/cn.js';
3
3
  import type { Snippet } from 'svelte';
4
4
 
5
+ /**
6
+ * @remarks Use at the top of any content page: dashboards, settings, detail views.
7
+ * @see surface — add `use:surface` for an entrance animation on mount.
8
+ * @example
9
+ * <PageHeader title="field reports" subtitle="recent observations from the network">
10
+ * {#snippet actions()}<Button variant="primary">new report</Button>{/snippet}
11
+ * </PageHeader>
12
+ */
5
13
  interface Props {
6
14
  /** Page title. */
7
15
  title?: string;
@@ -1,4 +1,12 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @remarks Use at the top of any content page: dashboards, settings, detail views.
4
+ * @see surface — add `use:surface` for an entrance animation on mount.
5
+ * @example
6
+ * <PageHeader title="field reports" subtitle="recent observations from the network">
7
+ * {#snippet actions()}<Button variant="primary">new report</Button>{/snippet}
8
+ * </PageHeader>
9
+ */
2
10
  interface Props {
3
11
  /** Page title. */
4
12
  title?: string;
@@ -0,0 +1,145 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ /**
5
+ * @remarks Breakout quotation — larger than Blockquote, a page-level element.
6
+ * Use for testimonials, design maxims, and editorial pull-quotes.
7
+ * @example
8
+ * <PullQuote
9
+ * quote="every detail should look placed, not merely present."
10
+ * attribution="design constraints"
11
+ * source="hyvui"
12
+ * />
13
+ */
14
+ interface Props {
15
+ /** The quotation text. */
16
+ quote: string;
17
+ /** Who said it. */
18
+ attribution?: string;
19
+ /** Where it came from. */
20
+ source?: string;
21
+ /** Additional CSS classes. */
22
+ class?: string;
23
+ }
24
+
25
+ let { quote, attribution, source, class: className = '' }: Props = $props();
26
+ </script>
27
+
28
+ <figure class={cn('hyvui-pull-quote', className)}>
29
+ <div class="hyvui-pull-quote-bracket" aria-hidden="true">[</div>
30
+ <blockquote class="hyvui-pull-quote-body">
31
+ <p class="hyvui-pull-quote-text">{quote}</p>
32
+ </blockquote>
33
+ {#if attribution || source}
34
+ <figcaption class="hyvui-pull-quote-caption">
35
+ {#if attribution}
36
+ <cite class="hyvui-pull-quote-attribution">{attribution}</cite>
37
+ {/if}
38
+ {#if attribution && source}
39
+ <span class="hyvui-pull-quote-sep" aria-hidden="true">·</span>
40
+ {/if}
41
+ {#if source}
42
+ <span class="hyvui-pull-quote-source">{source}</span>
43
+ {/if}
44
+ </figcaption>
45
+ {/if}
46
+ </figure>
47
+
48
+ <style>
49
+ .hyvui-pull-quote {
50
+ margin: 0;
51
+ padding: 0;
52
+ position: relative;
53
+ display: grid;
54
+ grid-template-columns: auto 1fr;
55
+ gap: 1rem;
56
+ padding-left: 1.5rem;
57
+ }
58
+
59
+ .hyvui-pull-quote::before {
60
+ content: '';
61
+ position: absolute;
62
+ left: 0;
63
+ top: 0;
64
+ width: 2px;
65
+ height: 100%;
66
+ background: rgba(199, 156, 87, 0.45);
67
+ transform-origin: top;
68
+ animation: pullquote-border-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
69
+ }
70
+
71
+ @keyframes pullquote-border-in {
72
+ from {
73
+ transform: scaleY(0);
74
+ }
75
+ to {
76
+ transform: scaleY(1);
77
+ }
78
+ }
79
+
80
+ @media (prefers-reduced-motion: reduce) {
81
+ .hyvui-pull-quote::before {
82
+ animation: none;
83
+ }
84
+ }
85
+
86
+ .hyvui-pull-quote-bracket {
87
+ font-family: var(--font-body);
88
+ font-size: clamp(1.1rem, 2.5vw, 1.6rem);
89
+ line-height: 1.45;
90
+ color: rgba(199, 156, 87, 0.4);
91
+ pointer-events: none;
92
+ user-select: none;
93
+ align-self: start;
94
+ margin-top: 0.05em;
95
+ }
96
+
97
+ .hyvui-pull-quote-body {
98
+ margin: 0;
99
+ padding: 0;
100
+ border: none;
101
+ display: flex;
102
+ flex-direction: column;
103
+ gap: calc(0.9rem * var(--reg-spacing-scale, 1));
104
+ }
105
+
106
+ .hyvui-pull-quote-text {
107
+ margin: 0;
108
+ font-family: var(--font-body);
109
+ font-style: italic;
110
+ font-size: clamp(1.1rem, 2.5vw, 1.6rem);
111
+ line-height: 1.45;
112
+ color: var(--text-soft);
113
+ text-wrap: pretty;
114
+ }
115
+
116
+ .hyvui-pull-quote-caption {
117
+ display: flex;
118
+ align-items: center;
119
+ gap: 0.5rem;
120
+ flex-wrap: wrap;
121
+ }
122
+
123
+ .hyvui-pull-quote-attribution {
124
+ font-style: italic;
125
+ font-family: var(--font-body);
126
+ font-size: 0.88rem;
127
+ color: var(--muted-strong);
128
+ line-height: 1.5;
129
+ }
130
+
131
+ .hyvui-pull-quote-sep {
132
+ color: var(--muted);
133
+ opacity: 0.75;
134
+ font-family: var(--font-mono);
135
+ font-size: 0.75rem;
136
+ }
137
+
138
+ .hyvui-pull-quote-source {
139
+ font-family: var(--font-mono);
140
+ font-size: 0.82rem;
141
+ letter-spacing: 0.06em;
142
+ color: var(--muted);
143
+ line-height: 1.6;
144
+ }
145
+ </style>
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @remarks Breakout quotation — larger than Blockquote, a page-level element.
3
+ * Use for testimonials, design maxims, and editorial pull-quotes.
4
+ * @example
5
+ * <PullQuote
6
+ * quote="every detail should look placed, not merely present."
7
+ * attribution="design constraints"
8
+ * source="hyvui"
9
+ * />
10
+ */
11
+ interface Props {
12
+ /** The quotation text. */
13
+ quote: string;
14
+ /** Who said it. */
15
+ attribution?: string;
16
+ /** Where it came from. */
17
+ source?: string;
18
+ /** Additional CSS classes. */
19
+ class?: string;
20
+ }
21
+ declare const PullQuote: import("svelte").Component<Props, {}, "">;
22
+ type PullQuote = ReturnType<typeof PullQuote>;
23
+ export default PullQuote;
@@ -0,0 +1,132 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import { applyRegister, registers } from '../../system/register.js';
4
+ import type { Register } from '../../system/register.js';
5
+
6
+ /**
7
+ * A compact three-state toggle for switching between aesthetic registers.
8
+ * Persists choice to localStorage. Mounts invisibly until hovered.
9
+ *
10
+ * @example
11
+ * <RegisterSwitcher />
12
+ * <RegisterSwitcher defaultRegister="hextech" />
13
+ * <RegisterSwitcher choices={['field-notebook', 'hextech', 'arcane']} />
14
+ */
15
+ interface Props {
16
+ /** Which register to apply on first load (if no localStorage entry). */
17
+ defaultRegister?: Register;
18
+ /** Subset of registers to expose. Defaults to field-notebook, hextech, arcane. */
19
+ choices?: Register[];
20
+ /** Additional CSS classes. */
21
+ class?: string;
22
+ }
23
+
24
+ let {
25
+ defaultRegister = 'field-notebook',
26
+ choices = ['field-notebook', 'hextech', 'arcane'],
27
+ class: className = ''
28
+ }: Props = $props();
29
+
30
+ const STORAGE_KEY = 'hyvui-register';
31
+
32
+ const labels: Record<Register, string> = {
33
+ 'field-notebook': 'FN',
34
+ 'mission-control': 'MC',
35
+ archive: 'AV',
36
+ hextech: 'HX',
37
+ arcane: 'ARC'
38
+ };
39
+
40
+ const titles: Record<Register, string> = {
41
+ 'field-notebook': 'Field Notebook',
42
+ 'mission-control': 'Mission Control',
43
+ archive: 'Archive',
44
+ hextech: 'Hextech',
45
+ arcane: 'Arcane'
46
+ };
47
+
48
+ let current: Register = $state(defaultRegister);
49
+
50
+ function init() {
51
+ if (typeof localStorage === 'undefined') return;
52
+ const saved = localStorage.getItem(STORAGE_KEY) as Register | null;
53
+ if (saved && (registers as string[]).includes(saved)) {
54
+ current = saved;
55
+ }
56
+ applyRegister(current);
57
+ }
58
+
59
+ function select(reg: Register) {
60
+ current = reg;
61
+ applyRegister(reg);
62
+ if (typeof localStorage !== 'undefined') {
63
+ localStorage.setItem(STORAGE_KEY, reg);
64
+ }
65
+ }
66
+
67
+ $effect(() => {
68
+ init();
69
+ });
70
+ </script>
71
+
72
+ <div class={cn('hyvui-reg-switcher', className)} role="group" aria-label="Theme register">
73
+ {#each choices as reg}
74
+ <button
75
+ class={cn('hyvui-reg-btn', current === reg && 'hyvui-reg-btn--active')}
76
+ onclick={() => select(reg)}
77
+ title={titles[reg]}
78
+ aria-pressed={current === reg}
79
+ >
80
+ {labels[reg]}
81
+ </button>
82
+ {/each}
83
+ </div>
84
+
85
+ <style>
86
+ .hyvui-reg-switcher {
87
+ display: inline-flex;
88
+ gap: 1px;
89
+ background: rgba(255, 255, 255, 0.04);
90
+ border: 1px solid var(--line);
91
+ padding: 2px;
92
+ opacity: 0.4;
93
+ transition: opacity var(--transition-smooth);
94
+ }
95
+
96
+ .hyvui-reg-switcher:hover,
97
+ .hyvui-reg-switcher:focus-within {
98
+ opacity: 1;
99
+ }
100
+
101
+ .hyvui-reg-btn {
102
+ font-family: var(--font-mono);
103
+ font-size: 0.58rem;
104
+ letter-spacing: 0.1em;
105
+ text-transform: uppercase;
106
+ color: var(--muted);
107
+ background: transparent;
108
+ border: none;
109
+ padding: 0.25rem 0.4rem;
110
+ cursor: pointer;
111
+ transition:
112
+ color var(--transition-fast),
113
+ background var(--transition-fast);
114
+ line-height: 1;
115
+ }
116
+
117
+ .hyvui-reg-btn:hover {
118
+ color: var(--text-soft);
119
+ background: rgba(255, 255, 255, 0.06);
120
+ }
121
+
122
+ .hyvui-reg-btn--active {
123
+ color: var(--accent);
124
+ background: rgba(255, 255, 255, 0.05);
125
+ }
126
+
127
+ /* switcher itself stays visually neutral — never adopts register ornaments */
128
+ .hyvui-reg-btn:focus-visible {
129
+ outline: none;
130
+ box-shadow: var(--focus-ring);
131
+ }
132
+ </style>
@@ -0,0 +1,21 @@
1
+ import type { Register } from '../../system/register.js';
2
+ /**
3
+ * A compact three-state toggle for switching between aesthetic registers.
4
+ * Persists choice to localStorage. Mounts invisibly until hovered.
5
+ *
6
+ * @example
7
+ * <RegisterSwitcher />
8
+ * <RegisterSwitcher defaultRegister="hextech" />
9
+ * <RegisterSwitcher choices={['field-notebook', 'hextech', 'arcane']} />
10
+ */
11
+ interface Props {
12
+ /** Which register to apply on first load (if no localStorage entry). */
13
+ defaultRegister?: Register;
14
+ /** Subset of registers to expose. Defaults to field-notebook, hextech, arcane. */
15
+ choices?: Register[];
16
+ /** Additional CSS classes. */
17
+ class?: string;
18
+ }
19
+ declare const RegisterSwitcher: import("svelte").Component<Props, {}, "">;
20
+ type RegisterSwitcher = ReturnType<typeof RegisterSwitcher>;
21
+ export default RegisterSwitcher;
@@ -3,6 +3,11 @@
3
3
  import Input from '../inputs/Input.svelte';
4
4
  import StatusDot from '../feedback/StatusDot.svelte';
5
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
+ */
6
11
  interface Props {
7
12
  /** Current search value (bindable). */
8
13
  value?: string;
@@ -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>