@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,159 +1,191 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import Surface from '../primitives/Surface.svelte';
4
- import type { Snippet } from 'svelte';
5
-
6
- interface Props {
7
- /** Controls modal visibility. */
8
- open?: boolean;
9
- /** Optional modal title. */
10
- title?: string;
11
- /** Additional CSS classes. */
12
- class?: string;
13
- /** Modal header slot. */
14
- header?: Snippet;
15
- /** Modal body content. */
16
- children?: Snippet;
17
- /** Modal footer slot. */
18
- footer?: Snippet;
19
- /** Fires when the modal is dismissed. */
20
- onclose?: () => void;
21
- }
22
-
23
- let {
24
- open = false,
25
- title = '',
26
- class: className = '',
27
- header,
28
- children,
29
- footer,
30
- onclose,
31
- }: Props = $props();
32
-
33
- let dialogEl: HTMLDialogElement | undefined = $state();
34
-
35
- $effect(() => {
36
- if (!dialogEl) return;
37
- if (open) {
38
- dialogEl.showModal();
39
- } else {
40
- dialogEl.close();
41
- }
42
- });
43
-
44
- function handleKeydown(e: KeyboardEvent) {
45
- if (e.key === 'Escape') {
46
- onclose?.();
47
- }
48
- }
49
-
50
- function handleBackdropClick(e: MouseEvent) {
51
- if (e.target === dialogEl) {
52
- onclose?.();
53
- }
54
- }
55
- </script>
56
-
57
- {#if open}
58
- <dialog
59
- bind:this={dialogEl}
60
- class={cn('hyvui-modal-backdrop', className)}
61
- onkeydown={handleKeydown}
62
- onclick={handleBackdropClick}
63
- >
64
- <Surface variant="panel" class="hyvui-modal-surface">
65
- {#if header}
66
- <div class="hyvui-modal-header">
67
- {@render header()}
68
- </div>
69
- {:else if title}
70
- <div class="hyvui-modal-header">
71
- <h2 class="hyvui-modal-title">{title}</h2>
72
- </div>
73
- {/if}
74
- {#if children}
75
- <div class="hyvui-modal-body">
76
- {@render children()}
77
- </div>
78
- {/if}
79
- {#if footer}
80
- <div class="hyvui-modal-footer">
81
- {@render footer()}
82
- </div>
83
- {/if}
84
- </Surface>
85
- </dialog>
86
- {/if}
87
-
88
- <style>
89
- .hyvui-modal-backdrop {
90
- position: fixed;
91
- inset: 0;
92
- z-index: var(--z-modal);
93
- background: rgba(0, 0, 0, 0.72);
94
- display: flex;
95
- align-items: center;
96
- justify-content: center;
97
- border: none;
98
- padding: 1.5rem;
99
- width: 100%;
100
- height: 100%;
101
- max-width: 100%;
102
- max-height: 100%;
103
- }
104
-
105
- .hyvui-modal-backdrop::backdrop {
106
- background: transparent;
107
- }
108
-
109
- :global(.hyvui-modal-surface) {
110
- padding: var(--space-card);
111
- max-width: 32rem;
112
- width: 100%;
113
- animation: modal-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);
114
- }
115
-
116
- .hyvui-modal-header {
117
- margin-bottom: 1rem;
118
- }
119
-
120
- .hyvui-modal-title {
121
- font-family: var(--font-body);
122
- font-size: 1.2rem;
123
- font-weight: 400;
124
- line-height: 0.93;
125
- letter-spacing: -0.04em;
126
- color: var(--text);
127
- margin: 0;
128
- }
129
-
130
- .hyvui-modal-body {
131
- font-family: var(--font-body);
132
- color: var(--text-soft);
133
- line-height: 1.6;
134
- }
135
-
136
- .hyvui-modal-footer {
137
- margin-top: 1.25rem;
138
- display: flex;
139
- justify-content: flex-end;
140
- gap: 0.75rem;
141
- }
142
-
143
- @keyframes modal-in {
144
- from {
145
- opacity: 0;
146
- transform: translateY(8px);
147
- }
148
- to {
149
- opacity: 1;
150
- transform: translateY(0);
151
- }
152
- }
153
-
154
- @media (prefers-reduced-motion: reduce) {
155
- :global(.hyvui-modal-surface) {
156
- animation: none;
157
- }
158
- }
159
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import { lockScroll } from '../../system/scroll-lock.js';
4
+ import Surface from '../primitives/Surface.svelte';
5
+ import type { Snippet } from 'svelte';
6
+
7
+ /**
8
+ * @example
9
+ * <Modal open={showModal} title="confirm action" onclose={() => showModal = false}>
10
+ * <Text>are you sure you want to proceed?</Text>
11
+ * {#snippet footer()}
12
+ * <Button variant="primary" onclick={confirm}>proceed</Button>
13
+ * <Button variant="ghost" onclick={() => showModal = false}>cancel</Button>
14
+ * {/snippet}
15
+ * </Modal>
16
+ */
17
+ interface Props {
18
+ /** Controls modal visibility. */
19
+ open?: boolean;
20
+ /** Optional modal title. */
21
+ title?: string;
22
+ /** Additional CSS classes. */
23
+ class?: string;
24
+ /** Modal header slot. */
25
+ header?: Snippet;
26
+ /** Modal body content. */
27
+ children?: Snippet;
28
+ /** Modal footer slot. */
29
+ footer?: Snippet;
30
+ /** Fires when the modal is dismissed. */
31
+ onclose?: () => void;
32
+ }
33
+
34
+ let {
35
+ open = false,
36
+ title = '',
37
+ class: className = '',
38
+ header,
39
+ children,
40
+ footer,
41
+ onclose
42
+ }: Props = $props();
43
+
44
+ let dialogEl: HTMLDialogElement | undefined = $state();
45
+ let previousFocus: Element | null = null;
46
+
47
+ $effect(() => {
48
+ if (!dialogEl) return;
49
+ if (open) {
50
+ previousFocus = document.activeElement;
51
+ if (!dialogEl.open) dialogEl.showModal();
52
+ } else {
53
+ if (dialogEl.open) dialogEl.close();
54
+ if (previousFocus instanceof HTMLElement) previousFocus.focus();
55
+ previousFocus = null;
56
+ }
57
+ });
58
+
59
+ $effect(() => {
60
+ if (!open) return;
61
+ return lockScroll();
62
+ });
63
+
64
+ function handleBackdropClick(e: MouseEvent) {
65
+ if (e.target === dialogEl) {
66
+ onclose?.();
67
+ }
68
+ }
69
+ </script>
70
+
71
+ {#if open}
72
+ <dialog
73
+ bind:this={dialogEl}
74
+ class={cn('hyvui-modal-backdrop', className)}
75
+ onclick={handleBackdropClick}
76
+ oncancel={(e) => {
77
+ e.preventDefault();
78
+ onclose?.();
79
+ }}
80
+ >
81
+ <Surface variant="panel" class="hyvui-modal-surface">
82
+ {#if header}
83
+ <div class="hyvui-modal-header">
84
+ {@render header()}
85
+ </div>
86
+ {:else if title}
87
+ <div class="hyvui-modal-header">
88
+ <h2 class="hyvui-modal-title">{title}</h2>
89
+ </div>
90
+ {/if}
91
+ {#if children}
92
+ <div class="hyvui-modal-body">
93
+ {@render children()}
94
+ </div>
95
+ {/if}
96
+ {#if footer}
97
+ <div class="hyvui-modal-footer">
98
+ {@render footer()}
99
+ </div>
100
+ {/if}
101
+ </Surface>
102
+ </dialog>
103
+ {/if}
104
+
105
+ <style>
106
+ .hyvui-modal-backdrop {
107
+ --hyvui-modal-pad: 1.5rem;
108
+ position: fixed;
109
+ inset: 0;
110
+ z-index: var(--z-modal);
111
+ background: rgba(0, 0, 0, 0.72);
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ border: none;
116
+ padding: calc(var(--hyvui-modal-pad) + var(--safe-top))
117
+ calc(var(--hyvui-modal-pad) + var(--safe-right))
118
+ calc(var(--hyvui-modal-pad) + var(--safe-bottom))
119
+ calc(var(--hyvui-modal-pad) + var(--safe-left));
120
+ width: 100%;
121
+ height: 100%;
122
+ max-width: 100%;
123
+ max-height: 100%;
124
+ }
125
+
126
+ .hyvui-modal-backdrop::backdrop {
127
+ background: transparent;
128
+ }
129
+
130
+ :global(.hyvui-modal-surface) {
131
+ padding: var(--space-card);
132
+ max-width: 32rem;
133
+ width: 100%;
134
+ max-height: calc(100dvh - (2 * var(--hyvui-modal-pad)) - var(--safe-top) - var(--safe-bottom));
135
+ display: flex;
136
+ flex-direction: column;
137
+ min-height: 0;
138
+ backface-visibility: hidden;
139
+ animation: modal-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);
140
+ }
141
+
142
+ .hyvui-modal-header {
143
+ flex-shrink: 0;
144
+ margin-bottom: 1rem;
145
+ }
146
+
147
+ .hyvui-modal-title {
148
+ font-family: var(--font-body);
149
+ font-size: 1.2rem;
150
+ font-weight: 400;
151
+ line-height: 0.93;
152
+ letter-spacing: -0.04em;
153
+ color: var(--text);
154
+ margin: 0;
155
+ }
156
+
157
+ .hyvui-modal-body {
158
+ font-family: var(--font-body);
159
+ color: var(--text-soft);
160
+ line-height: 1.6;
161
+ flex: 1;
162
+ min-height: 0;
163
+ overflow: auto;
164
+ overscroll-behavior: contain;
165
+ }
166
+
167
+ .hyvui-modal-footer {
168
+ flex-shrink: 0;
169
+ margin-top: 1.25rem;
170
+ display: flex;
171
+ justify-content: flex-end;
172
+ gap: 0.75rem;
173
+ }
174
+
175
+ @keyframes modal-in {
176
+ from {
177
+ opacity: 0;
178
+ transform: translateY(8px);
179
+ }
180
+ to {
181
+ opacity: 1;
182
+ transform: translateY(0);
183
+ }
184
+ }
185
+
186
+ @media (prefers-reduced-motion: reduce) {
187
+ :global(.hyvui-modal-surface) {
188
+ animation: none;
189
+ }
190
+ }
191
+ </style>
@@ -1,4 +1,14 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @example
4
+ * <Modal open={showModal} title="confirm action" onclose={() => showModal = false}>
5
+ * <Text>are you sure you want to proceed?</Text>
6
+ * {#snippet footer()}
7
+ * <Button variant="primary" onclick={confirm}>proceed</Button>
8
+ * <Button variant="ghost" onclick={() => showModal = false}>cancel</Button>
9
+ * {/snippet}
10
+ * </Modal>
11
+ */
2
12
  interface Props {
3
13
  /** Controls modal visibility. */
4
14
  open?: boolean;
@@ -1,54 +1,58 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import Surface from '../primitives/Surface.svelte';
4
- import type { Snippet } from 'svelte';
5
-
6
- interface Props {
7
- /** Adds a pseudoelement teal inset border. */
8
- withInset?: boolean;
9
- /** Additional CSS classes. */
10
- class?: string;
11
- /** Panel header slot. */
12
- header?: Snippet;
13
- /** Panel body content. */
14
- children?: Snippet;
15
- }
16
-
17
- let {
18
- withInset = false,
19
- class: className = '',
20
- header,
21
- children,
22
- }: Props = $props();
23
- </script>
24
-
25
- <Surface variant="panel" {withInset} class={cn('hyvui-panel', className)}>
26
- {#if header}
27
- <div class="hyvui-panel-header">
28
- {@render header()}
29
- </div>
30
- {/if}
31
- {#if children}
32
- <div class="hyvui-panel-body">
33
- {@render children()}
34
- </div>
35
- {/if}
36
- </Surface>
37
-
38
- <style>
39
- :global(.hyvui-panel) {
40
- padding: var(--space-card);
41
- display: flex;
42
- flex-direction: column;
43
- gap: var(--space-lg);
44
- }
45
-
46
- .hyvui-panel-header {
47
- padding-bottom: var(--space-md);
48
- border-bottom: 1px solid color-mix(in srgb, var(--line) 92%, transparent);
49
- }
50
-
51
- .hyvui-panel-body {
52
- min-width: 0;
53
- }
54
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import Surface from '../primitives/Surface.svelte';
4
+ import type { Snippet } from 'svelte';
5
+
6
+ /**
7
+ * @see surface add `use:surface` on Panel for an entrance animation on mount.
8
+ * @example
9
+ * <Panel>
10
+ * {#snippet header()}<Label color="accent">system status</Label>{/snippet}
11
+ * <StatusDot status="ok" />
12
+ * </Panel>
13
+ * <Panel withInset>panel with teal inset border</Panel>
14
+ */
15
+ interface Props {
16
+ /** Adds a pseudoelement teal inset border. */
17
+ withInset?: boolean;
18
+ /** Additional CSS classes. */
19
+ class?: string;
20
+ /** Panel header slot. */
21
+ header?: Snippet;
22
+ /** Panel body content. */
23
+ children?: Snippet;
24
+ }
25
+
26
+ let { withInset = false, class: className = '', header, children }: Props = $props();
27
+ </script>
28
+
29
+ <Surface variant="panel" {withInset} class={cn('hyvui-panel', className)}>
30
+ {#if header}
31
+ <div class="hyvui-panel-header">
32
+ {@render header()}
33
+ </div>
34
+ {/if}
35
+ {#if children}
36
+ <div class="hyvui-panel-body">
37
+ {@render children()}
38
+ </div>
39
+ {/if}
40
+ </Surface>
41
+
42
+ <style>
43
+ :global(.hyvui-panel) {
44
+ padding: var(--space-card);
45
+ display: flex;
46
+ flex-direction: column;
47
+ gap: var(--space-lg);
48
+ }
49
+
50
+ .hyvui-panel-header {
51
+ padding-bottom: var(--space-md);
52
+ border-bottom: 1px solid color-mix(in srgb, var(--line) 92%, transparent);
53
+ }
54
+
55
+ .hyvui-panel-body {
56
+ min-width: 0;
57
+ }
58
+ </style>
@@ -1,4 +1,13 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @see surface — add `use:surface` on Panel for an entrance animation on mount.
4
+ * @example
5
+ * <Panel>
6
+ * {#snippet header()}<Label color="accent">system status</Label>{/snippet}
7
+ * <StatusDot status="ok" />
8
+ * </Panel>
9
+ * <Panel withInset>panel with teal inset border</Panel>
10
+ */
2
11
  interface Props {
3
12
  /** Adds a pseudoelement teal inset border. */
4
13
  withInset?: boolean;