@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,69 +1,69 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
-
4
- interface Props {
5
- /** Image source URL. */
6
- src?: string;
7
- /** Name for initials fallback. */
8
- name?: string;
9
- /** Avatar diameter in pixels. */
10
- size?: number;
11
- /** Additional CSS classes. */
12
- class?: string;
13
- }
14
-
15
- let {
16
- src = '',
17
- name = '',
18
- size = 32,
19
- class: className = '',
20
- }: Props = $props();
21
-
22
- const initials = $derived(
23
- name
24
- .split(' ')
25
- .map((w) => w[0])
26
- .join('')
27
- .slice(0, 2)
28
- .toUpperCase()
29
- );
30
- </script>
31
-
32
- <span
33
- class={cn('hyvui-avatar', className)}
34
- style:width="{size}px"
35
- style:height="{size}px"
36
- style:font-size="{size * 0.38}px"
37
- >
38
- {#if src}
39
- <img {src} alt={name} class="hyvui-avatar-img" />
40
- {:else}
41
- <span class="hyvui-avatar-initials">{initials}</span>
42
- {/if}
43
- </span>
44
-
45
- <style>
46
- .hyvui-avatar {
47
- display: inline-flex;
48
- align-items: center;
49
- justify-content: center;
50
- border-radius: 50%;
51
- background-color: var(--bg-elev);
52
- border: 1px solid var(--line);
53
- overflow: hidden;
54
- flex-shrink: 0;
55
- }
56
-
57
- .hyvui-avatar-img {
58
- width: 100%;
59
- height: 100%;
60
- object-fit: cover;
61
- }
62
-
63
- .hyvui-avatar-initials {
64
- font-family: var(--font-mono);
65
- font-weight: 400;
66
- color: var(--muted);
67
- letter-spacing: 0.04em;
68
- }
69
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ /**
5
+ * @example
6
+ * <Avatar name="Jane Doe" size={40} />
7
+ * <Avatar src="/avatars/user.jpg" name="Jane Doe" size={32} />
8
+ */
9
+ interface Props {
10
+ /** Image source URL. */
11
+ src?: string;
12
+ /** Name for initials fallback. */
13
+ name?: string;
14
+ /** Avatar diameter in pixels. */
15
+ size?: number;
16
+ /** Additional CSS classes. */
17
+ class?: string;
18
+ }
19
+
20
+ let { src = '', name = '', size = 32, class: className = '' }: Props = $props();
21
+
22
+ const initials = $derived(
23
+ name
24
+ .split(' ')
25
+ .map((w) => w[0])
26
+ .join('')
27
+ .slice(0, 2)
28
+ .toUpperCase()
29
+ );
30
+ </script>
31
+
32
+ <span
33
+ class={cn('hyvui-avatar', className)}
34
+ style:width="{size}px"
35
+ style:height="{size}px"
36
+ style:font-size="{size * 0.38}px"
37
+ >
38
+ {#if src}
39
+ <img {src} alt={name} class="hyvui-avatar-img" />
40
+ {:else}
41
+ <span class="hyvui-avatar-initials">{initials}</span>
42
+ {/if}
43
+ </span>
44
+
45
+ <style>
46
+ .hyvui-avatar {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ border-radius: 50%;
51
+ background-color: var(--bg-elev);
52
+ border: 1px solid var(--line);
53
+ overflow: hidden;
54
+ flex-shrink: 0;
55
+ }
56
+
57
+ .hyvui-avatar-img {
58
+ width: 100%;
59
+ height: 100%;
60
+ object-fit: cover;
61
+ }
62
+
63
+ .hyvui-avatar-initials {
64
+ font-family: var(--font-mono);
65
+ font-weight: 400;
66
+ color: var(--muted);
67
+ letter-spacing: 0.04em;
68
+ }
69
+ </style>
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @example
3
+ * <Avatar name="Jane Doe" size={40} />
4
+ * <Avatar src="/avatars/user.jpg" name="Jane Doe" size={32} />
5
+ */
1
6
  interface Props {
2
7
  /** Image source URL. */
3
8
  src?: string;
@@ -1,63 +1,75 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import type { Snippet } from 'svelte';
4
-
5
- interface Props {
6
- /** Badge color variant. */
7
- variant?: 'default' | 'accent' | 'signal' | 'ok' | 'warn' | 'fail';
8
- /** Additional CSS classes. */
9
- class?: string;
10
- /** Badge text. */
11
- children?: Snippet;
12
- }
13
-
14
- let {
15
- variant = 'default',
16
- class: className = '',
17
- children,
18
- }: Props = $props();
19
-
20
- const colorMap: Record<string, string> = {
21
- default: 'var(--muted)',
22
- accent: 'var(--accent)',
23
- signal: 'var(--signal)',
24
- ok: 'var(--status-ok)',
25
- warn: 'var(--status-warn)',
26
- fail: 'var(--status-fail)',
27
- };
28
-
29
- const bgMap: Record<string, string> = {
30
- default: 'rgba(167, 157, 139, 0.08)',
31
- accent: 'rgba(199, 156, 87, 0.08)',
32
- signal: 'rgba(121, 166, 163, 0.08)',
33
- ok: 'rgba(121, 166, 163, 0.08)',
34
- warn: 'rgba(199, 156, 87, 0.08)',
35
- fail: 'rgba(182, 106, 72, 0.08)',
36
- };
37
- </script>
38
-
39
- <span
40
- class={cn('hyvui-badge', className)}
41
- style:color={colorMap[variant]}
42
- style:background-color={bgMap[variant]}
43
- style:border-color={colorMap[variant]}
44
- >
45
- {#if children}{@render children()}{/if}
46
- </span>
47
-
48
- <style>
49
- .hyvui-badge {
50
- display: inline-flex;
51
- align-items: center;
52
- font-family: var(--font-mono);
53
- font-size: 0.62rem;
54
- font-weight: 400;
55
- letter-spacing: 0.12em;
56
- text-transform: uppercase;
57
- line-height: 1;
58
- padding: 0.25rem 0.5rem;
59
- border: 1px solid;
60
- border-color: currentColor;
61
- opacity: 0.8;
62
- }
63
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ /**
6
+ * @example
7
+ * <Badge variant="ok">online</Badge>
8
+ * <Badge variant="warn">degraded</Badge>
9
+ * <Badge variant="accent">new</Badge>
10
+ */
11
+ interface Props {
12
+ /** Badge color variant. */
13
+ variant?: 'default' | 'accent' | 'signal' | 'ok' | 'warn' | 'fail';
14
+ /** Additional CSS classes. */
15
+ class?: string;
16
+ /** Badge text. */
17
+ children?: Snippet;
18
+ }
19
+
20
+ let { variant = 'default', class: className = '', children }: Props = $props();
21
+
22
+ const colorMap: Record<string, string> = {
23
+ default: 'var(--muted)',
24
+ accent: 'var(--accent)',
25
+ signal: 'var(--signal)',
26
+ ok: 'var(--status-ok)',
27
+ warn: 'var(--status-warn)',
28
+ fail: 'var(--status-fail)'
29
+ };
30
+
31
+ const bgMap: Record<string, string> = {
32
+ default: 'rgba(167, 157, 139, 0.08)',
33
+ accent: 'rgba(199, 156, 87, 0.08)',
34
+ signal: 'rgba(121, 166, 163, 0.08)',
35
+ ok: 'rgba(121, 166, 163, 0.08)',
36
+ warn: 'rgba(199, 156, 87, 0.08)',
37
+ fail: 'rgba(182, 106, 72, 0.08)'
38
+ };
39
+ </script>
40
+
41
+ <span
42
+ class={cn('hyvui-badge', className)}
43
+ style:color={colorMap[variant]}
44
+ style:background-color={bgMap[variant]}
45
+ style:border-color={colorMap[variant]}
46
+ >
47
+ {#if children}{@render children()}{/if}
48
+ </span>
49
+
50
+ <style>
51
+ .hyvui-badge {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ font-family: var(--font-mono);
55
+ font-size: 0.62rem;
56
+ font-weight: 400;
57
+ letter-spacing: 0.12em;
58
+ text-transform: uppercase;
59
+ line-height: 1;
60
+ padding: 0.25rem 0.5rem;
61
+ border: 1px solid;
62
+ border-color: currentColor;
63
+ opacity: 0.8;
64
+ }
65
+
66
+ /* ── hextech: clipped top-left corner (hex gem cut) ───────────────── */
67
+ :global([data-register='hextech']) .hyvui-badge {
68
+ clip-path: polygon(6px 0%, 100% 0%, 100% 100%, 0% 100%, 0% 6px);
69
+ }
70
+
71
+ /* ── arcane: diagonal parallelogram cut ───────────────────────────── */
72
+ :global([data-register='arcane']) .hyvui-badge {
73
+ clip-path: polygon(5px 0%, 100% 0%, calc(100% - 5px) 100%, 0% 100%);
74
+ }
75
+ </style>
@@ -1,4 +1,10 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @example
4
+ * <Badge variant="ok">online</Badge>
5
+ * <Badge variant="warn">degraded</Badge>
6
+ * <Badge variant="accent">new</Badge>
7
+ */
2
8
  interface Props {
3
9
  /** Badge color variant. */
4
10
  variant?: 'default' | 'accent' | 'signal' | 'ok' | 'warn' | 'fail';
@@ -1,34 +1,35 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import type { Snippet } from 'svelte';
4
-
5
- interface Props {
6
- /** Additional CSS classes. */
7
- class?: string;
8
- /** Quote content. */
9
- children?: Snippet;
10
- }
11
-
12
- let {
13
- class: className = '',
14
- children,
15
- }: Props = $props();
16
- </script>
17
-
18
- <blockquote class={cn('hyvui-blockquote', className)}>
19
- {#if children}{@render children()}{/if}
20
- </blockquote>
21
-
22
- <style>
23
- .hyvui-blockquote {
24
- font-family: var(--font-body);
25
- font-style: italic;
26
- font-weight: 400;
27
- color: var(--text-soft);
28
- line-height: 1.6;
29
- margin: 0;
30
- padding: 1rem 1.25rem;
31
- border-left: 2px solid var(--line-strong);
32
- background: linear-gradient(135deg, rgba(199, 156, 87, 0.06), transparent 60%);
33
- }
34
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ /**
6
+ * @example
7
+ * <Blockquote>the signal arrives before the message.</Blockquote>
8
+ */
9
+ interface Props {
10
+ /** Additional CSS classes. */
11
+ class?: string;
12
+ /** Quote content. */
13
+ children?: Snippet;
14
+ }
15
+
16
+ let { class: className = '', children }: Props = $props();
17
+ </script>
18
+
19
+ <blockquote class={cn('hyvui-blockquote', className)}>
20
+ {#if children}{@render children()}{/if}
21
+ </blockquote>
22
+
23
+ <style>
24
+ .hyvui-blockquote {
25
+ font-family: var(--font-body);
26
+ font-style: italic;
27
+ font-weight: 400;
28
+ color: var(--text-soft);
29
+ line-height: 1.6;
30
+ margin: 0;
31
+ padding: 1rem 1.25rem;
32
+ border-left: 2px solid var(--line-strong);
33
+ background: linear-gradient(135deg, rgba(199, 156, 87, 0.06), transparent 60%);
34
+ }
35
+ </style>
@@ -1,4 +1,8 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @example
4
+ * <Blockquote>the signal arrives before the message.</Blockquote>
5
+ */
2
6
  interface Props {
3
7
  /** Additional CSS classes. */
4
8
  class?: string;
@@ -1,76 +1,76 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import Button from '../inputs/Button.svelte';
4
-
5
- interface Props {
6
- /** Code string to display. */
7
- code?: string;
8
- /** Language label (informational only, no syntax highlighting built-in). */
9
- language?: string;
10
- /** Show copy-to-clipboard button. */
11
- copyable?: boolean;
12
- /** Additional CSS classes. */
13
- class?: string;
14
- }
15
-
16
- let {
17
- code = '',
18
- language = '',
19
- copyable = true,
20
- class: className = '',
21
- }: Props = $props();
22
-
23
- let copied = $state(false);
24
-
25
- async function copyCode() {
26
- try {
27
- await navigator.clipboard.writeText(code);
28
- copied = true;
29
- setTimeout(() => {
30
- copied = false;
31
- }, 2000);
32
- } catch {
33
- // clipboard access denied
34
- }
35
- }
36
- </script>
37
-
38
- <div class={cn('hyvui-codeblock', className)}>
39
- {#if copyable}
40
- <div class="hyvui-codeblock-actions">
41
- <Button variant="ghost" size="sm" onclick={copyCode}>
42
- {copied ? 'copied' : 'copy'}
43
- </Button>
44
- </div>
45
- {/if}
46
- <pre class="hyvui-codeblock-pre"><code class="hyvui-codeblock-code">{code}</code></pre>
47
- </div>
48
-
49
- <style>
50
- .hyvui-codeblock {
51
- position: relative;
52
- background-color: var(--bg-elev);
53
- border: 1px solid var(--line);
54
- overflow: hidden;
55
- }
56
-
57
- .hyvui-codeblock-actions {
58
- position: absolute;
59
- top: 0.375rem;
60
- right: 0.375rem;
61
- z-index: 1;
62
- }
63
-
64
- .hyvui-codeblock-pre {
65
- margin: 0;
66
- padding: 1rem;
67
- overflow-x: auto;
68
- }
69
-
70
- .hyvui-codeblock-code {
71
- font-family: var(--font-mono);
72
- font-size: 0.82rem;
73
- color: var(--text-soft);
74
- line-height: 1.6;
75
- }
76
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import Button from '../inputs/Button.svelte';
4
+
5
+ /**
6
+ * @example
7
+ * <CodeBlock code="npm install @hyvnt/hyvui" language="bash" />
8
+ * <CodeBlock code={snippetString} language="typescript" copyable={false} />
9
+ */
10
+ interface Props {
11
+ /** Code string to display. */
12
+ code?: string;
13
+ /** Language label (informational only, no syntax highlighting built-in). */
14
+ language?: string;
15
+ /** Show copy-to-clipboard button. */
16
+ copyable?: boolean;
17
+ /** Additional CSS classes. */
18
+ class?: string;
19
+ }
20
+
21
+ let { code = '', language = '', copyable = true, class: className = '' }: Props = $props();
22
+
23
+ let copied = $state(false);
24
+
25
+ async function copyCode() {
26
+ try {
27
+ await navigator.clipboard.writeText(code);
28
+ copied = true;
29
+ setTimeout(() => {
30
+ copied = false;
31
+ }, 2000);
32
+ } catch {
33
+ // clipboard access denied
34
+ }
35
+ }
36
+ </script>
37
+
38
+ <div class={cn('hyvui-codeblock', className)}>
39
+ {#if copyable}
40
+ <div class="hyvui-codeblock-actions">
41
+ <Button variant="ghost" size="sm" onclick={copyCode}>
42
+ {copied ? 'copied' : 'copy'}
43
+ </Button>
44
+ </div>
45
+ {/if}
46
+ <pre class="hyvui-codeblock-pre"><code class="hyvui-codeblock-code">{code}</code></pre>
47
+ </div>
48
+
49
+ <style>
50
+ .hyvui-codeblock {
51
+ position: relative;
52
+ background-color: var(--bg-elev);
53
+ border: 1px solid var(--line);
54
+ overflow: hidden;
55
+ }
56
+
57
+ .hyvui-codeblock-actions {
58
+ position: absolute;
59
+ top: 0.375rem;
60
+ right: 0.375rem;
61
+ z-index: 1;
62
+ }
63
+
64
+ .hyvui-codeblock-pre {
65
+ margin: 0;
66
+ padding: 1rem;
67
+ overflow-x: auto;
68
+ }
69
+
70
+ .hyvui-codeblock-code {
71
+ font-family: var(--font-mono);
72
+ font-size: 0.82rem;
73
+ color: var(--text-soft);
74
+ line-height: 1.6;
75
+ }
76
+ </style>
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @example
3
+ * <CodeBlock code="npm install @hyvnt/hyvui" language="bash" />
4
+ * <CodeBlock code={snippetString} language="typescript" copyable={false} />
5
+ */
1
6
  interface Props {
2
7
  /** Code string to display. */
3
8
  code?: string;