@hyvnt/hyvui 0.1.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 (157) hide show
  1. package/README.md +253 -0
  2. package/dist/components/ambient/CornerBrackets.svelte +87 -0
  3. package/dist/components/ambient/CornerBrackets.svelte.d.ts +11 -0
  4. package/dist/components/ambient/DataStream.svelte +94 -0
  5. package/dist/components/ambient/DataStream.svelte.d.ts +13 -0
  6. package/dist/components/ambient/GlyphMark.svelte +69 -0
  7. package/dist/components/ambient/GlyphMark.svelte.d.ts +13 -0
  8. package/dist/components/ambient/GridOverlay.svelte +28 -0
  9. package/dist/components/ambient/GridOverlay.svelte.d.ts +7 -0
  10. package/dist/components/ambient/ParallaxLayer.svelte +41 -0
  11. package/dist/components/ambient/ParallaxLayer.svelte.d.ts +12 -0
  12. package/dist/components/ambient/ScanBand.svelte +91 -0
  13. package/dist/components/ambient/ScanBand.svelte.d.ts +17 -0
  14. package/dist/components/ambient/SignalRing.svelte +100 -0
  15. package/dist/components/ambient/SignalRing.svelte.d.ts +13 -0
  16. package/dist/components/ambient/ThreadLine.svelte +78 -0
  17. package/dist/components/ambient/ThreadLine.svelte.d.ts +17 -0
  18. package/dist/components/ambient/Vignette.svelte +26 -0
  19. package/dist/components/ambient/Vignette.svelte.d.ts +7 -0
  20. package/dist/components/depth/DepthLayer.svelte +27 -0
  21. package/dist/components/depth/DepthLayer.svelte.d.ts +15 -0
  22. package/dist/components/depth/DepthStage.svelte +62 -0
  23. package/dist/components/depth/DepthStage.svelte.d.ts +19 -0
  24. package/dist/components/depth/FloatCard.svelte +104 -0
  25. package/dist/components/depth/FloatCard.svelte.d.ts +14 -0
  26. package/dist/components/depth/HorizonGrid.svelte +160 -0
  27. package/dist/components/depth/HorizonGrid.svelte.d.ts +15 -0
  28. package/dist/components/depth/Plinth.svelte +57 -0
  29. package/dist/components/depth/Plinth.svelte.d.ts +13 -0
  30. package/dist/components/display/Avatar.svelte +69 -0
  31. package/dist/components/display/Avatar.svelte.d.ts +13 -0
  32. package/dist/components/display/Badge.svelte +63 -0
  33. package/dist/components/display/Badge.svelte.d.ts +12 -0
  34. package/dist/components/display/Blockquote.svelte +34 -0
  35. package/dist/components/display/Blockquote.svelte.d.ts +10 -0
  36. package/dist/components/display/CodeBlock.svelte +76 -0
  37. package/dist/components/display/CodeBlock.svelte.d.ts +13 -0
  38. package/dist/components/display/MetricCard.svelte +83 -0
  39. package/dist/components/display/MetricCard.svelte.d.ts +15 -0
  40. package/dist/components/display/Table.svelte +104 -0
  41. package/dist/components/display/Table.svelte.d.ts +19 -0
  42. package/dist/components/feedback/Alert.svelte +76 -0
  43. package/dist/components/feedback/Alert.svelte.d.ts +14 -0
  44. package/dist/components/feedback/EmptyState.svelte +68 -0
  45. package/dist/components/feedback/EmptyState.svelte.d.ts +14 -0
  46. package/dist/components/feedback/ErrorState.svelte +73 -0
  47. package/dist/components/feedback/ErrorState.svelte.d.ts +15 -0
  48. package/dist/components/feedback/Skeleton.svelte +52 -0
  49. package/dist/components/feedback/Skeleton.svelte.d.ts +13 -0
  50. package/dist/components/feedback/StatusDot.svelte +54 -0
  51. package/dist/components/feedback/StatusDot.svelte.d.ts +13 -0
  52. package/dist/components/feedback/StatusLine.svelte +122 -0
  53. package/dist/components/feedback/StatusLine.svelte.d.ts +17 -0
  54. package/dist/components/feedback/Toast.svelte +136 -0
  55. package/dist/components/feedback/Toast.svelte.d.ts +21 -0
  56. package/dist/components/inputs/Button.svelte +237 -0
  57. package/dist/components/inputs/Button.svelte.d.ts +30 -0
  58. package/dist/components/inputs/Checkbox.svelte +105 -0
  59. package/dist/components/inputs/Checkbox.svelte.d.ts +15 -0
  60. package/dist/components/inputs/FileUpload.svelte +163 -0
  61. package/dist/components/inputs/FileUpload.svelte.d.ts +17 -0
  62. package/dist/components/inputs/Input.svelte +147 -0
  63. package/dist/components/inputs/Input.svelte.d.ts +25 -0
  64. package/dist/components/inputs/Select.svelte +150 -0
  65. package/dist/components/inputs/Select.svelte.d.ts +23 -0
  66. package/dist/components/inputs/Textarea.svelte +154 -0
  67. package/dist/components/inputs/Textarea.svelte.d.ts +25 -0
  68. package/dist/components/inputs/Toggle.svelte +120 -0
  69. package/dist/components/inputs/Toggle.svelte.d.ts +15 -0
  70. package/dist/components/layout/Card.svelte +76 -0
  71. package/dist/components/layout/Card.svelte.d.ts +16 -0
  72. package/dist/components/layout/Drawer.svelte +109 -0
  73. package/dist/components/layout/Drawer.svelte.d.ts +18 -0
  74. package/dist/components/layout/Grid.svelte +43 -0
  75. package/dist/components/layout/Grid.svelte.d.ts +16 -0
  76. package/dist/components/layout/Modal.svelte +159 -0
  77. package/dist/components/layout/Modal.svelte.d.ts +20 -0
  78. package/dist/components/layout/Panel.svelte +54 -0
  79. package/dist/components/layout/Panel.svelte.d.ts +14 -0
  80. package/dist/components/layout/Popover.svelte +67 -0
  81. package/dist/components/layout/Popover.svelte.d.ts +14 -0
  82. package/dist/components/layout/Stack.svelte +53 -0
  83. package/dist/components/layout/Stack.svelte.d.ts +22 -0
  84. package/dist/components/navigation/Breadcrumb.svelte +73 -0
  85. package/dist/components/navigation/Breadcrumb.svelte.d.ts +13 -0
  86. package/dist/components/navigation/DropdownMenu.svelte +124 -0
  87. package/dist/components/navigation/DropdownMenu.svelte.d.ts +19 -0
  88. package/dist/components/navigation/SidebarNav.svelte +90 -0
  89. package/dist/components/navigation/SidebarNav.svelte.d.ts +16 -0
  90. package/dist/components/navigation/Tabs.svelte +86 -0
  91. package/dist/components/navigation/Tabs.svelte.d.ts +17 -0
  92. package/dist/components/navigation/Topbar.svelte +85 -0
  93. package/dist/components/navigation/Topbar.svelte.d.ts +14 -0
  94. package/dist/components/patterns/ActionBar.svelte +76 -0
  95. package/dist/components/patterns/ActionBar.svelte.d.ts +14 -0
  96. package/dist/components/patterns/ConfirmDialog.svelte +64 -0
  97. package/dist/components/patterns/ConfirmDialog.svelte.d.ts +23 -0
  98. package/dist/components/patterns/PageHeader.svelte +114 -0
  99. package/dist/components/patterns/PageHeader.svelte.d.ts +16 -0
  100. package/dist/components/patterns/SearchBar.svelte +59 -0
  101. package/dist/components/patterns/SearchBar.svelte.d.ts +15 -0
  102. package/dist/components/patterns/TerminalBoot.svelte +104 -0
  103. package/dist/components/patterns/TerminalBoot.svelte.d.ts +25 -0
  104. package/dist/components/primitives/Divider.svelte +29 -0
  105. package/dist/components/primitives/Divider.svelte.d.ts +9 -0
  106. package/dist/components/primitives/Icon.svelte +49 -0
  107. package/dist/components/primitives/Icon.svelte.d.ts +14 -0
  108. package/dist/components/primitives/Label.svelte +44 -0
  109. package/dist/components/primitives/Label.svelte.d.ts +14 -0
  110. package/dist/components/primitives/Surface.svelte +87 -0
  111. package/dist/components/primitives/Surface.svelte.d.ts +16 -0
  112. package/dist/components/primitives/Text.svelte +98 -0
  113. package/dist/components/primitives/Text.svelte.d.ts +19 -0
  114. package/dist/components/primitives/text.d.ts +1 -0
  115. package/dist/components/primitives/text.js +1 -0
  116. package/dist/components/scenes/ArchiveScene.svelte +95 -0
  117. package/dist/components/scenes/ArchiveScene.svelte.d.ts +16 -0
  118. package/dist/components/scenes/LogScene.svelte +77 -0
  119. package/dist/components/scenes/LogScene.svelte.d.ts +14 -0
  120. package/dist/components/scenes/NarrativeScene.svelte +92 -0
  121. package/dist/components/scenes/NarrativeScene.svelte.d.ts +16 -0
  122. package/dist/components/scenes/ReadoutScene.svelte +107 -0
  123. package/dist/components/scenes/ReadoutScene.svelte.d.ts +16 -0
  124. package/dist/components/scenes/StageScene.svelte +104 -0
  125. package/dist/components/scenes/StageScene.svelte.d.ts +18 -0
  126. package/dist/examples/FieldReport.svelte +223 -0
  127. package/dist/examples/FieldReport.svelte.d.ts +18 -0
  128. package/dist/examples/ObservationDeck.svelte +317 -0
  129. package/dist/examples/ObservationDeck.svelte.d.ts +3 -0
  130. package/dist/examples/SignalLost.svelte +191 -0
  131. package/dist/examples/SignalLost.svelte.d.ts +3 -0
  132. package/dist/index.d.ts +73 -0
  133. package/dist/index.js +83 -0
  134. package/dist/system/actions/echo.d.ts +10 -0
  135. package/dist/system/actions/echo.js +46 -0
  136. package/dist/system/actions/resolve.d.ts +23 -0
  137. package/dist/system/actions/resolve.js +59 -0
  138. package/dist/system/actions/reveal.d.ts +18 -0
  139. package/dist/system/actions/reveal.js +54 -0
  140. package/dist/system/actions/surface.d.ts +14 -0
  141. package/dist/system/actions/surface.js +25 -0
  142. package/dist/system/depth/depth.css +49 -0
  143. package/dist/system/depth/depth.d.ts +15 -0
  144. package/dist/system/depth/depth.js +24 -0
  145. package/dist/system/expressions.css +80 -0
  146. package/dist/system/override-template.css +72 -0
  147. package/dist/system/register.css +74 -0
  148. package/dist/system/register.d.ts +11 -0
  149. package/dist/system/register.js +16 -0
  150. package/dist/tokens/tokens.css +86 -0
  151. package/dist/tokens/tokens.d.ts +25 -0
  152. package/dist/tokens/tokens.js +25 -0
  153. package/dist/utils/cn.d.ts +2 -0
  154. package/dist/utils/cn.js +4 -0
  155. package/dist/utils/motion.d.ts +17 -0
  156. package/dist/utils/motion.js +11 -0
  157. package/package.json +60 -0
@@ -0,0 +1,160 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import { onMount } from 'svelte';
4
+
5
+ interface Props {
6
+ /** Number of horizontal lines receding toward the vanishing point. */
7
+ rows?: number;
8
+ /** Number of vertical convergence lines. */
9
+ cols?: number;
10
+ /** Normalized Y position of vanishing point (0-1). */
11
+ vanishY?: number;
12
+ /** If true, lines slowly drift toward the viewer. */
13
+ animated?: boolean;
14
+ /** Additional CSS classes. */
15
+ class?: string;
16
+ }
17
+
18
+ let {
19
+ rows = 16,
20
+ cols = 12,
21
+ vanishY = 0.38,
22
+ animated = false,
23
+ class: className = '',
24
+ }: Props = $props();
25
+
26
+ let canvasEl: HTMLCanvasElement | undefined = $state();
27
+ let animFrame = 0;
28
+ let offset = $state(0);
29
+
30
+ const prefersReduced =
31
+ typeof window !== 'undefined'
32
+ ? window.matchMedia('(prefers-reduced-motion: reduce)').matches
33
+ : false;
34
+
35
+ function draw(canvas: HTMLCanvasElement, t: number) {
36
+ const ctx = canvas.getContext('2d');
37
+ if (!ctx) return;
38
+
39
+ const w = canvas.width;
40
+ const h = canvas.height;
41
+ const vpX = w / 2;
42
+ const vpY = h * vanishY;
43
+
44
+ ctx.clearRect(0, 0, w, h);
45
+
46
+ // horizontal lines receding toward vanishing point
47
+ for (let i = 0; i < rows; i++) {
48
+ const progress = (i + t) / rows;
49
+ if (progress > 1) continue;
50
+ const y = vpY + (h - vpY) * Math.pow(progress, 1.6);
51
+ const nearness = Math.pow(progress, 0.8);
52
+
53
+ // color: gold near, teal far
54
+ const r = Math.round(199 * (1 - nearness) + 121 * nearness);
55
+ const g = Math.round(156 * (1 - nearness) + 166 * nearness);
56
+ const b = Math.round(87 * (1 - nearness) + 163 * nearness);
57
+ const alpha = 0.18 * (1 - nearness) + 0.06 * nearness;
58
+
59
+ // fade at vanishing point
60
+ const fadeNear = Math.min(1, progress * 4);
61
+ const finalAlpha = alpha * fadeNear;
62
+
63
+ ctx.beginPath();
64
+ ctx.moveTo(0, y);
65
+ ctx.lineTo(w, y);
66
+ ctx.strokeStyle = `rgba(${r}, ${g}, ${b}, ${finalAlpha})`;
67
+ ctx.lineWidth = 1;
68
+ ctx.stroke();
69
+ }
70
+
71
+ // vertical convergence lines
72
+ for (let i = 0; i < cols; i++) {
73
+ const xBottom = (i / (cols - 1)) * w;
74
+ const progress = Math.abs(i / (cols - 1) - 0.5) * 2; // 0 at center, 1 at edges
75
+
76
+ // fade at edges
77
+ const edgeFade = 1 - Math.pow(progress, 2) * 0.7;
78
+ const alpha = 0.1 * edgeFade;
79
+
80
+ ctx.beginPath();
81
+ ctx.moveTo(vpX, vpY);
82
+ ctx.lineTo(xBottom, h);
83
+ ctx.strokeStyle = `rgba(199, 156, 87, ${alpha})`;
84
+ ctx.lineWidth = 1;
85
+ ctx.stroke();
86
+ }
87
+ }
88
+
89
+ function animate() {
90
+ if (!canvasEl) return;
91
+ if (animated && !prefersReduced) {
92
+ offset = (offset + 0.003) % 1;
93
+ }
94
+ draw(canvasEl, offset);
95
+ if (animated && !prefersReduced) {
96
+ animFrame = requestAnimationFrame(animate);
97
+ }
98
+ }
99
+
100
+ onMount(() => {
101
+ if (!canvasEl) return;
102
+
103
+ const container = canvasEl.parentElement;
104
+ if (!container) return;
105
+
106
+ const ro = new ResizeObserver((entries) => {
107
+ for (const entry of entries) {
108
+ const { width, height } = entry.contentRect;
109
+ const dpr = window.devicePixelRatio || 1;
110
+ canvasEl!.width = width * dpr;
111
+ canvasEl!.height = height * dpr;
112
+ canvasEl!.style.width = `${width}px`;
113
+ canvasEl!.style.height = `${height}px`;
114
+ const ctx = canvasEl!.getContext('2d');
115
+ if (ctx) ctx.scale(dpr, dpr);
116
+ // set logical dimensions for draw
117
+ canvasEl!.dataset.logicalW = String(width);
118
+ canvasEl!.dataset.logicalH = String(height);
119
+ draw(canvasEl!, offset);
120
+ }
121
+ });
122
+
123
+ ro.observe(container);
124
+
125
+ if (animated && !prefersReduced) {
126
+ animFrame = requestAnimationFrame(animate);
127
+ }
128
+
129
+ return () => {
130
+ ro.disconnect();
131
+ if (animFrame) cancelAnimationFrame(animFrame);
132
+ };
133
+ });
134
+
135
+ // redraw on offset changes when animated
136
+ $effect(() => {
137
+ if (canvasEl && animated && !prefersReduced) {
138
+ draw(canvasEl, offset);
139
+ }
140
+ });
141
+ </script>
142
+
143
+ <div class={cn('hyvui-horizon-grid', className)} aria-hidden="true">
144
+ <canvas bind:this={canvasEl}></canvas>
145
+ </div>
146
+
147
+ <style>
148
+ .hyvui-horizon-grid {
149
+ position: absolute;
150
+ inset: 0;
151
+ pointer-events: none;
152
+ overflow: hidden;
153
+ }
154
+
155
+ .hyvui-horizon-grid canvas {
156
+ display: block;
157
+ width: 100%;
158
+ height: 100%;
159
+ }
160
+ </style>
@@ -0,0 +1,15 @@
1
+ interface Props {
2
+ /** Number of horizontal lines receding toward the vanishing point. */
3
+ rows?: number;
4
+ /** Number of vertical convergence lines. */
5
+ cols?: number;
6
+ /** Normalized Y position of vanishing point (0-1). */
7
+ vanishY?: number;
8
+ /** If true, lines slowly drift toward the viewer. */
9
+ animated?: boolean;
10
+ /** Additional CSS classes. */
11
+ class?: string;
12
+ }
13
+ declare const HorizonGrid: import("svelte").Component<Props, {}, "">;
14
+ type HorizonGrid = ReturnType<typeof HorizonGrid>;
15
+ export default HorizonGrid;
@@ -0,0 +1,57 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ interface Props {
5
+ /** Width of the plinth surface. */
6
+ width?: string;
7
+ /** How far the plinth recedes (visual depth). */
8
+ depth?: string;
9
+ /** Surface tint color. */
10
+ color?: string;
11
+ /** Additional CSS classes. */
12
+ class?: string;
13
+ }
14
+
15
+ let {
16
+ width = '100%',
17
+ depth = '40px',
18
+ color = 'rgba(199, 156, 87, 0.03)',
19
+ class: className = '',
20
+ }: Props = $props();
21
+ </script>
22
+
23
+ <div class={cn('hyvui-plinth-wrap', className)}>
24
+ <div
25
+ class="hyvui-plinth"
26
+ style:width={width}
27
+ style:height={depth}
28
+ style:background-color={color}
29
+ ></div>
30
+ </div>
31
+
32
+ <style>
33
+ .hyvui-plinth-wrap {
34
+ perspective: var(--perspective-mid);
35
+ perspective-origin: 50% 0%;
36
+ display: flex;
37
+ justify-content: center;
38
+ pointer-events: none;
39
+ }
40
+
41
+ .hyvui-plinth {
42
+ transform: rotateX(70deg) translateZ(-20px);
43
+ border-top: 1px solid rgba(199, 156, 87, 0.08);
44
+ opacity: 0.6;
45
+ }
46
+
47
+ @media (prefers-reduced-motion: reduce) {
48
+ .hyvui-plinth-wrap {
49
+ perspective: none;
50
+ }
51
+
52
+ .hyvui-plinth {
53
+ transform: none;
54
+ opacity: 0.3;
55
+ }
56
+ }
57
+ </style>
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ /** Width of the plinth surface. */
3
+ width?: string;
4
+ /** How far the plinth recedes (visual depth). */
5
+ depth?: string;
6
+ /** Surface tint color. */
7
+ color?: string;
8
+ /** Additional CSS classes. */
9
+ class?: string;
10
+ }
11
+ declare const Plinth: import("svelte").Component<Props, {}, "">;
12
+ type Plinth = ReturnType<typeof Plinth>;
13
+ export default Plinth;
@@ -0,0 +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>
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ /** Image source URL. */
3
+ src?: string;
4
+ /** Name for initials fallback. */
5
+ name?: string;
6
+ /** Avatar diameter in pixels. */
7
+ size?: number;
8
+ /** Additional CSS classes. */
9
+ class?: string;
10
+ }
11
+ declare const Avatar: import("svelte").Component<Props, {}, "">;
12
+ type Avatar = ReturnType<typeof Avatar>;
13
+ export default Avatar;
@@ -0,0 +1,63 @@
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>
@@ -0,0 +1,12 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Badge color variant. */
4
+ variant?: 'default' | 'accent' | 'signal' | 'ok' | 'warn' | 'fail';
5
+ /** Additional CSS classes. */
6
+ class?: string;
7
+ /** Badge text. */
8
+ children?: Snippet;
9
+ }
10
+ declare const Badge: import("svelte").Component<Props, {}, "">;
11
+ type Badge = ReturnType<typeof Badge>;
12
+ export default Badge;
@@ -0,0 +1,34 @@
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>
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Additional CSS classes. */
4
+ class?: string;
5
+ /** Quote content. */
6
+ children?: Snippet;
7
+ }
8
+ declare const Blockquote: import("svelte").Component<Props, {}, "">;
9
+ type Blockquote = ReturnType<typeof Blockquote>;
10
+ export default Blockquote;
@@ -0,0 +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>
@@ -0,0 +1,13 @@
1
+ interface Props {
2
+ /** Code string to display. */
3
+ code?: string;
4
+ /** Language label (informational only, no syntax highlighting built-in). */
5
+ language?: string;
6
+ /** Show copy-to-clipboard button. */
7
+ copyable?: boolean;
8
+ /** Additional CSS classes. */
9
+ class?: string;
10
+ }
11
+ declare const CodeBlock: import("svelte").Component<Props, {}, "">;
12
+ type CodeBlock = ReturnType<typeof CodeBlock>;
13
+ export default CodeBlock;
@@ -0,0 +1,83 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import Surface from '../primitives/Surface.svelte';
4
+
5
+ interface Props {
6
+ /** Metric label. */
7
+ label?: string;
8
+ /** Metric value. */
9
+ value?: string | number;
10
+ /** Trend direction. */
11
+ trend?: 'up' | 'down' | 'neutral';
12
+ /** Trend value string (e.g. "+12%"). */
13
+ trendValue?: string;
14
+ /** Additional CSS classes. */
15
+ class?: string;
16
+ }
17
+
18
+ let {
19
+ label = '',
20
+ value = '',
21
+ trend,
22
+ trendValue = '',
23
+ class: className = '',
24
+ }: Props = $props();
25
+
26
+ const trendArrow: Record<string, string> = {
27
+ up: '\u2191',
28
+ down: '\u2193',
29
+ neutral: '\u2014',
30
+ };
31
+
32
+ const trendColor: Record<string, string> = {
33
+ up: 'var(--status-ok)',
34
+ down: 'var(--status-fail)',
35
+ neutral: 'var(--muted)',
36
+ };
37
+ </script>
38
+
39
+ <Surface variant="card" class={cn('hyvui-metric', className)}>
40
+ <span class="hyvui-metric-label">{label}</span>
41
+ <span class="hyvui-metric-value">{value}</span>
42
+ {#if trend}
43
+ <span class="hyvui-metric-trend" style:color={trendColor[trend]}>
44
+ {trendArrow[trend]}{#if trendValue}{' '}{trendValue}{/if}
45
+ </span>
46
+ {/if}
47
+ </Surface>
48
+
49
+ <style>
50
+ :global(.hyvui-metric) {
51
+ padding: var(--space-card);
52
+ display: flex;
53
+ flex-direction: column;
54
+ gap: var(--space-sm);
55
+ }
56
+
57
+ .hyvui-metric-label {
58
+ font-family: var(--font-mono);
59
+ font-size: 0.68rem;
60
+ font-weight: 400;
61
+ letter-spacing: 0.16em;
62
+ text-transform: uppercase;
63
+ color: var(--muted-strong);
64
+ line-height: 1.2;
65
+ }
66
+
67
+ .hyvui-metric-value {
68
+ font-family: var(--font-body);
69
+ font-size: clamp(2rem, 5vw, 3rem);
70
+ font-weight: 400;
71
+ line-height: 0.95;
72
+ letter-spacing: -0.05em;
73
+ color: var(--text);
74
+ }
75
+
76
+ .hyvui-metric-trend {
77
+ font-family: var(--font-mono);
78
+ font-size: 0.72rem;
79
+ font-weight: 400;
80
+ letter-spacing: 0.12em;
81
+ text-transform: uppercase;
82
+ }
83
+ </style>
@@ -0,0 +1,15 @@
1
+ interface Props {
2
+ /** Metric label. */
3
+ label?: string;
4
+ /** Metric value. */
5
+ value?: string | number;
6
+ /** Trend direction. */
7
+ trend?: 'up' | 'down' | 'neutral';
8
+ /** Trend value string (e.g. "+12%"). */
9
+ trendValue?: string;
10
+ /** Additional CSS classes. */
11
+ class?: string;
12
+ }
13
+ declare const MetricCard: import("svelte").Component<Props, {}, "">;
14
+ type MetricCard = ReturnType<typeof MetricCard>;
15
+ export default MetricCard;