@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,83 +1,100 @@
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>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import Surface from '../primitives/Surface.svelte';
4
+
5
+ /**
6
+ * @see surface — add `use:surface` on MetricCard for an entrance animation on mount.
7
+ * @example
8
+ * <MetricCard label="active sessions" value="1,284" trend="up" trendValue="+8%" />
9
+ * <MetricCard label="error rate" value="0.02%" trend="down" trendValue="-0.01%" />
10
+ */
11
+ interface Props {
12
+ /** Metric label. */
13
+ label?: string;
14
+ /** Metric value. */
15
+ value?: string | number;
16
+ /** Trend direction. */
17
+ trend?: 'up' | 'down' | 'neutral';
18
+ /** Trend value string (e.g. "+12%"). */
19
+ trendValue?: string;
20
+ /** Additional CSS classes. */
21
+ class?: string;
22
+ }
23
+
24
+ let { label = '', value = '', trend, trendValue = '', class: className = '' }: 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
+ transition:
56
+ transform var(--transition-smooth),
57
+ border-color var(--transition-fast);
58
+ }
59
+
60
+ :global(.hyvui-metric:hover) {
61
+ transform: translateY(-1px);
62
+ }
63
+
64
+ @media (prefers-reduced-motion: reduce) {
65
+ :global(.hyvui-metric) {
66
+ transition: none;
67
+ }
68
+
69
+ :global(.hyvui-metric:hover) {
70
+ transform: none;
71
+ }
72
+ }
73
+
74
+ .hyvui-metric-label {
75
+ font-family: var(--font-mono);
76
+ font-size: 0.68rem;
77
+ font-weight: 400;
78
+ letter-spacing: 0.16em;
79
+ text-transform: uppercase;
80
+ color: var(--muted-strong);
81
+ line-height: 1.2;
82
+ }
83
+
84
+ .hyvui-metric-value {
85
+ font-family: var(--font-body);
86
+ font-size: clamp(2rem, 5vw, 3rem);
87
+ font-weight: 400;
88
+ line-height: 0.95;
89
+ letter-spacing: -0.05em;
90
+ color: var(--text);
91
+ }
92
+
93
+ .hyvui-metric-trend {
94
+ font-family: var(--font-mono);
95
+ font-size: 0.72rem;
96
+ font-weight: 400;
97
+ letter-spacing: 0.12em;
98
+ text-transform: uppercase;
99
+ }
100
+ </style>
@@ -1,3 +1,9 @@
1
+ /**
2
+ * @see surface — add `use:surface` on MetricCard for an entrance animation on mount.
3
+ * @example
4
+ * <MetricCard label="active sessions" value="1,284" trend="up" trendValue="+8%" />
5
+ * <MetricCard label="error rate" value="0.02%" trend="down" trendValue="-0.01%" />
6
+ */
1
7
  interface Props {
2
8
  /** Metric label. */
3
9
  label?: string;
@@ -1,104 +1,106 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import EmptyState from '../feedback/EmptyState.svelte';
4
- import type { Snippet } from 'svelte';
5
-
6
- interface TableColumn {
7
- key: string;
8
- label: string;
9
- align?: 'left' | 'center' | 'right';
10
- }
11
-
12
- interface Props {
13
- /** Column definitions. */
14
- columns?: TableColumn[];
15
- /** Row data objects. */
16
- rows?: Record<string, any>[];
17
- /** Additional CSS classes. */
18
- class?: string;
19
- /** Custom empty state slot. */
20
- empty?: Snippet;
21
- }
22
-
23
- let {
24
- columns = [],
25
- rows = [],
26
- class: className = '',
27
- empty,
28
- }: Props = $props();
29
- </script>
30
-
31
- {#if rows.length === 0}
32
- {#if empty}
33
- {@render empty()}
34
- {:else}
35
- <EmptyState title="no data" />
36
- {/if}
37
- {:else}
38
- <div class={cn('hyvui-table-wrap', className)}>
39
- <table class="hyvui-table">
40
- <thead>
41
- <tr>
42
- {#each columns as col}
43
- <th class="hyvui-table-th" style:text-align={col.align ?? 'left'}>{col.label}</th>
44
- {/each}
45
- </tr>
46
- </thead>
47
- <tbody>
48
- {#each rows as row}
49
- <tr class="hyvui-table-row">
50
- {#each columns as col}
51
- <td class="hyvui-table-td" style:text-align={col.align ?? 'left'}>
52
- {row[col.key] ?? ''}
53
- </td>
54
- {/each}
55
- </tr>
56
- {/each}
57
- </tbody>
58
- </table>
59
- </div>
60
- {/if}
61
-
62
- <style>
63
- .hyvui-table-wrap {
64
- overflow-x: auto;
65
- }
66
-
67
- .hyvui-table {
68
- width: 100%;
69
- border-collapse: collapse;
70
- }
71
-
72
- .hyvui-table-th {
73
- font-family: var(--font-mono);
74
- font-size: 0.68rem;
75
- font-weight: 400;
76
- letter-spacing: 0.14em;
77
- text-transform: uppercase;
78
- color: var(--muted-strong);
79
- padding: 0.625rem 0.75rem;
80
- border-bottom: 1px solid var(--line);
81
- }
82
-
83
- .hyvui-table-td {
84
- font-family: var(--font-body);
85
- font-size: 1rem;
86
- color: var(--text-soft);
87
- padding: 0.625rem 0.75rem;
88
- border-bottom: 1px solid var(--line);
89
- }
90
-
91
- .hyvui-table-row {
92
- transition: background-color var(--transition-fast);
93
- }
94
-
95
- .hyvui-table-row:hover {
96
- background-color: rgba(199, 156, 87, 0.04);
97
- }
98
-
99
- @media (prefers-reduced-motion: reduce) {
100
- .hyvui-table-row {
101
- transition: none;
102
- }
103
- }
104
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import EmptyState from '../feedback/EmptyState.svelte';
4
+ import type { Snippet } from 'svelte';
5
+
6
+ interface TableColumn {
7
+ key: string;
8
+ label: string;
9
+ align?: 'left' | 'center' | 'right';
10
+ }
11
+
12
+ /**
13
+ * @example
14
+ * <Table
15
+ * columns={[{ key: 'name', label: 'name' }, { key: 'status', label: 'status' }]}
16
+ * rows={[{ name: 'alpha', status: 'active' }, { name: 'beta', status: 'pending' }]}
17
+ * />
18
+ */
19
+ interface Props {
20
+ /** Column definitions. */
21
+ columns?: TableColumn[];
22
+ /** Row data objects. */
23
+ rows?: Record<string, any>[];
24
+ /** Additional CSS classes. */
25
+ class?: string;
26
+ /** Custom empty state slot. */
27
+ empty?: Snippet;
28
+ }
29
+
30
+ let { columns = [], rows = [], class: className = '', empty }: Props = $props();
31
+ </script>
32
+
33
+ {#if rows.length === 0}
34
+ {#if empty}
35
+ {@render empty()}
36
+ {:else}
37
+ <EmptyState title="no data" />
38
+ {/if}
39
+ {:else}
40
+ <div class={cn('hyvui-table-wrap', className)}>
41
+ <table class="hyvui-table">
42
+ <thead>
43
+ <tr>
44
+ {#each columns as col}
45
+ <th class="hyvui-table-th" style:text-align={col.align ?? 'left'}>{col.label}</th>
46
+ {/each}
47
+ </tr>
48
+ </thead>
49
+ <tbody>
50
+ {#each rows as row}
51
+ <tr class="hyvui-table-row">
52
+ {#each columns as col}
53
+ <td class="hyvui-table-td" style:text-align={col.align ?? 'left'}>
54
+ {row[col.key] ?? ''}
55
+ </td>
56
+ {/each}
57
+ </tr>
58
+ {/each}
59
+ </tbody>
60
+ </table>
61
+ </div>
62
+ {/if}
63
+
64
+ <style>
65
+ .hyvui-table-wrap {
66
+ overflow-x: auto;
67
+ }
68
+
69
+ .hyvui-table {
70
+ width: 100%;
71
+ border-collapse: collapse;
72
+ }
73
+
74
+ .hyvui-table-th {
75
+ font-family: var(--font-mono);
76
+ font-size: 0.68rem;
77
+ font-weight: 400;
78
+ letter-spacing: 0.14em;
79
+ text-transform: uppercase;
80
+ color: var(--muted-strong);
81
+ padding: 0.625rem 0.75rem;
82
+ border-bottom: 1px solid var(--line);
83
+ }
84
+
85
+ .hyvui-table-td {
86
+ font-family: var(--font-body);
87
+ font-size: 1rem;
88
+ color: var(--text-soft);
89
+ padding: 0.625rem 0.75rem;
90
+ border-bottom: 1px solid var(--line);
91
+ }
92
+
93
+ .hyvui-table-row {
94
+ transition: background-color var(--transition-fast);
95
+ }
96
+
97
+ .hyvui-table-row:hover {
98
+ background-color: rgba(199, 156, 87, 0.04);
99
+ }
100
+
101
+ @media (prefers-reduced-motion: reduce) {
102
+ .hyvui-table-row {
103
+ transition: none;
104
+ }
105
+ }
106
+ </style>
@@ -4,6 +4,13 @@ interface TableColumn {
4
4
  label: string;
5
5
  align?: 'left' | 'center' | 'right';
6
6
  }
7
+ /**
8
+ * @example
9
+ * <Table
10
+ * columns={[{ key: 'name', label: 'name' }, { key: 'status', label: 'status' }]}
11
+ * rows={[{ name: 'alpha', status: 'active' }, { name: 'beta', status: 'pending' }]}
12
+ * />
13
+ */
7
14
  interface Props {
8
15
  /** Column definitions. */
9
16
  columns?: TableColumn[];
@@ -1,76 +1,95 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import type { Snippet } from 'svelte';
4
-
5
- interface Props {
6
- /** Alert variant determining accent color. */
7
- variant?: 'info' | 'warn' | 'error' | 'ok';
8
- /** Optional title text. */
9
- title?: string;
10
- /** Additional CSS classes. */
11
- class?: string;
12
- /** Alert body content. */
13
- children?: Snippet;
14
- }
15
-
16
- let {
17
- variant = 'info',
18
- title = '',
19
- class: className = '',
20
- children,
21
- }: Props = $props();
22
-
23
- const colorMap: Record<string, string> = {
24
- info: 'var(--signal)',
25
- warn: 'var(--status-warn)',
26
- error: 'var(--status-fail)',
27
- ok: 'var(--status-ok)',
28
- };
29
-
30
- const bgMap: Record<string, string> = {
31
- info: 'rgba(121, 166, 163, 0.06)',
32
- warn: 'rgba(199, 156, 87, 0.06)',
33
- error: 'rgba(182, 106, 72, 0.06)',
34
- ok: 'rgba(121, 166, 163, 0.06)',
35
- };
36
- </script>
37
-
38
- <div
39
- class={cn('hyvui-alert', className)}
40
- style:border-left-color={colorMap[variant]}
41
- style:background-color={bgMap[variant]}
42
- role="alert"
43
- >
44
- {#if title}
45
- <div class="hyvui-alert-title">{title}</div>
46
- {/if}
47
- {#if children}
48
- <div class="hyvui-alert-body">
49
- {@render children()}
50
- </div>
51
- {/if}
52
- </div>
53
-
54
- <style>
55
- .hyvui-alert {
56
- border-left: 2px solid;
57
- padding: 0.75rem 1rem;
58
- }
59
-
60
- .hyvui-alert-title {
61
- font-family: var(--font-mono);
62
- font-size: 0.75rem;
63
- font-weight: 400;
64
- letter-spacing: 0.08em;
65
- text-transform: uppercase;
66
- color: var(--text-soft);
67
- margin-bottom: 0.375rem;
68
- }
69
-
70
- .hyvui-alert-body {
71
- font-family: var(--font-body);
72
- font-size: 0.9rem;
73
- color: var(--text-soft);
74
- line-height: 1.5;
75
- }
76
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import type { Snippet } from 'svelte';
4
+
5
+ /**
6
+ * @example
7
+ * <Alert variant="warn" title="rate limited">requests paused for 60 seconds</Alert>
8
+ * <Alert variant="error">connection refused</Alert>
9
+ * <Alert variant="ok" title="deployment complete">all services nominal</Alert>
10
+ */
11
+ interface Props {
12
+ /** Alert variant determining accent color. */
13
+ variant?: 'info' | 'warn' | 'error' | 'ok';
14
+ /** Optional title text. */
15
+ title?: string;
16
+ /** Additional CSS classes. */
17
+ class?: string;
18
+ /** Alert body content. */
19
+ children?: Snippet;
20
+ }
21
+
22
+ let { variant = 'info', title = '', class: className = '', children }: Props = $props();
23
+
24
+ const colorMap: Record<string, string> = {
25
+ info: 'var(--signal)',
26
+ warn: 'var(--status-warn)',
27
+ error: 'var(--status-fail)',
28
+ ok: 'var(--status-ok)'
29
+ };
30
+
31
+ const bgMap: Record<string, string> = {
32
+ info: 'rgba(121, 166, 163, 0.06)',
33
+ warn: 'rgba(199, 156, 87, 0.06)',
34
+ error: 'rgba(182, 106, 72, 0.06)',
35
+ ok: 'rgba(121, 166, 163, 0.06)'
36
+ };
37
+ </script>
38
+
39
+ <div
40
+ class={cn('hyvui-alert', className)}
41
+ style:border-left-color={colorMap[variant]}
42
+ style:background-color={bgMap[variant]}
43
+ role="alert"
44
+ >
45
+ {#if title}
46
+ <div class="hyvui-alert-title">{title}</div>
47
+ {/if}
48
+ {#if children}
49
+ <div class="hyvui-alert-body">
50
+ {@render children()}
51
+ </div>
52
+ {/if}
53
+ </div>
54
+
55
+ <style>
56
+ .hyvui-alert {
57
+ border-left: 2px solid;
58
+ padding: 0.75rem 1rem;
59
+ animation: alert-in 0.3s cubic-bezier(0.22, 1, 0.36, 1) both;
60
+ }
61
+
62
+ @keyframes alert-in {
63
+ from {
64
+ opacity: 0;
65
+ transform: translateX(-6px);
66
+ }
67
+ to {
68
+ opacity: 1;
69
+ transform: translateX(0);
70
+ }
71
+ }
72
+
73
+ @media (prefers-reduced-motion: reduce) {
74
+ .hyvui-alert {
75
+ animation: none;
76
+ }
77
+ }
78
+
79
+ .hyvui-alert-title {
80
+ font-family: var(--font-mono);
81
+ font-size: 0.75rem;
82
+ font-weight: 400;
83
+ letter-spacing: 0.08em;
84
+ text-transform: uppercase;
85
+ color: var(--text-soft);
86
+ margin-bottom: 0.375rem;
87
+ }
88
+
89
+ .hyvui-alert-body {
90
+ font-family: var(--font-body);
91
+ font-size: 0.9rem;
92
+ color: var(--text-soft);
93
+ line-height: 1.5;
94
+ }
95
+ </style>
@@ -1,4 +1,10 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @example
4
+ * <Alert variant="warn" title="rate limited">requests paused for 60 seconds</Alert>
5
+ * <Alert variant="error">connection refused</Alert>
6
+ * <Alert variant="ok" title="deployment complete">all services nominal</Alert>
7
+ */
2
8
  interface Props {
3
9
  /** Alert variant determining accent color. */
4
10
  variant?: 'info' | 'warn' | 'error' | 'ok';