@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,73 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ interface BreadcrumbItem {
5
+ label: string;
6
+ href?: string;
7
+ }
8
+
9
+ interface Props {
10
+ /** Breadcrumb trail items. */
11
+ items?: BreadcrumbItem[];
12
+ /** Additional CSS classes. */
13
+ class?: string;
14
+ }
15
+
16
+ let {
17
+ items = [],
18
+ class: className = '',
19
+ }: Props = $props();
20
+ </script>
21
+
22
+ <nav class={cn('hyvui-breadcrumb', className)} aria-label="breadcrumb">
23
+ {#each items as item, i}
24
+ {#if i > 0}
25
+ <span class="hyvui-breadcrumb-sep">/</span>
26
+ {/if}
27
+ {#if item.href && i < items.length - 1}
28
+ <a href={item.href} class="hyvui-breadcrumb-link">{item.label}</a>
29
+ {:else}
30
+ <span class="hyvui-breadcrumb-current">{item.label}</span>
31
+ {/if}
32
+ {/each}
33
+ </nav>
34
+
35
+ <style>
36
+ .hyvui-breadcrumb {
37
+ display: flex;
38
+ align-items: center;
39
+ flex-wrap: wrap;
40
+ gap: var(--space-xs);
41
+ font-family: var(--font-mono);
42
+ font-size: 0.68rem;
43
+ letter-spacing: 0.16em;
44
+ text-transform: uppercase;
45
+ min-width: 0;
46
+ }
47
+
48
+ .hyvui-breadcrumb-sep {
49
+ color: var(--muted-strong);
50
+ opacity: 0.7;
51
+ }
52
+
53
+ .hyvui-breadcrumb-link {
54
+ color: var(--muted);
55
+ text-decoration: none;
56
+ transition: color var(--transition-fast);
57
+ }
58
+
59
+ .hyvui-breadcrumb-link:hover {
60
+ color: var(--accent);
61
+ }
62
+
63
+ .hyvui-breadcrumb-current {
64
+ color: var(--text-soft);
65
+ white-space: nowrap;
66
+ }
67
+
68
+ @media (prefers-reduced-motion: reduce) {
69
+ .hyvui-breadcrumb-link {
70
+ transition: none;
71
+ }
72
+ }
73
+ </style>
@@ -0,0 +1,13 @@
1
+ interface BreadcrumbItem {
2
+ label: string;
3
+ href?: string;
4
+ }
5
+ interface Props {
6
+ /** Breadcrumb trail items. */
7
+ items?: BreadcrumbItem[];
8
+ /** Additional CSS classes. */
9
+ class?: string;
10
+ }
11
+ declare const Breadcrumb: import("svelte").Component<Props, {}, "">;
12
+ type Breadcrumb = ReturnType<typeof Breadcrumb>;
13
+ export default Breadcrumb;
@@ -0,0 +1,124 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import Surface from '../primitives/Surface.svelte';
4
+
5
+ interface MenuItem {
6
+ label: string;
7
+ value: string;
8
+ disabled?: boolean;
9
+ destructive?: boolean;
10
+ }
11
+
12
+ interface Props {
13
+ /** Controls menu visibility. */
14
+ open?: boolean;
15
+ /** Menu items. */
16
+ items?: MenuItem[];
17
+ /** Additional CSS classes. */
18
+ class?: string;
19
+ /** Fires when an item is selected with its value. */
20
+ onselect?: (value: string) => void;
21
+ }
22
+
23
+ let {
24
+ open = false,
25
+ items = [],
26
+ class: className = '',
27
+ onselect,
28
+ }: Props = $props();
29
+ </script>
30
+
31
+ {#if open}
32
+ <div class={cn('hyvui-dropdown', className)}>
33
+ <Surface variant="card" class="hyvui-dropdown-surface">
34
+ {#each items as item}
35
+ <button
36
+ type="button"
37
+ class={cn(
38
+ 'hyvui-dropdown-item',
39
+ item.disabled && 'hyvui-dropdown-item-disabled',
40
+ item.destructive && 'hyvui-dropdown-item-destructive'
41
+ )}
42
+ disabled={item.disabled}
43
+ onclick={() => onselect?.(item.value)}
44
+ >
45
+ {item.label}
46
+ </button>
47
+ {/each}
48
+ </Surface>
49
+ </div>
50
+ {/if}
51
+
52
+ <style>
53
+ .hyvui-dropdown {
54
+ position: absolute;
55
+ z-index: var(--z-overlay);
56
+ min-width: 13rem;
57
+ animation: dropdown-in 0.2s cubic-bezier(0.22, 1, 0.36, 1);
58
+ }
59
+
60
+ :global(.hyvui-dropdown-surface) {
61
+ padding: var(--space-xs);
62
+ }
63
+
64
+ .hyvui-dropdown-item {
65
+ display: block;
66
+ width: 100%;
67
+ text-align: left;
68
+ font-family: var(--font-mono);
69
+ font-size: 0.74rem;
70
+ font-weight: 400;
71
+ letter-spacing: 0.14em;
72
+ text-transform: uppercase;
73
+ color: var(--text-soft);
74
+ background: none;
75
+ border: none;
76
+ border-radius: var(--radius-sm);
77
+ padding: 0.75rem 0.85rem;
78
+ cursor: pointer;
79
+ transition:
80
+ transform var(--transition-fast),
81
+ color var(--transition-fast),
82
+ background var(--transition-fast);
83
+ }
84
+
85
+ .hyvui-dropdown-item:hover:not(:disabled) {
86
+ transform: translateX(4px);
87
+ background: linear-gradient(90deg, rgba(199, 156, 87, 0.12), transparent 72%);
88
+ color: var(--text);
89
+ }
90
+
91
+ .hyvui-dropdown-item-disabled {
92
+ opacity: 0.4;
93
+ cursor: not-allowed;
94
+ }
95
+
96
+ .hyvui-dropdown-item-destructive {
97
+ color: var(--status-fail);
98
+ }
99
+
100
+ @keyframes dropdown-in {
101
+ from {
102
+ opacity: 0;
103
+ transform: translateY(4px);
104
+ }
105
+ to {
106
+ opacity: 1;
107
+ transform: translateY(0);
108
+ }
109
+ }
110
+
111
+ @media (prefers-reduced-motion: reduce) {
112
+ .hyvui-dropdown {
113
+ animation: none;
114
+ }
115
+
116
+ .hyvui-dropdown-item {
117
+ transition: none;
118
+ }
119
+
120
+ .hyvui-dropdown-item:hover:not(:disabled) {
121
+ transform: none;
122
+ }
123
+ }
124
+ </style>
@@ -0,0 +1,19 @@
1
+ interface MenuItem {
2
+ label: string;
3
+ value: string;
4
+ disabled?: boolean;
5
+ destructive?: boolean;
6
+ }
7
+ interface Props {
8
+ /** Controls menu visibility. */
9
+ open?: boolean;
10
+ /** Menu items. */
11
+ items?: MenuItem[];
12
+ /** Additional CSS classes. */
13
+ class?: string;
14
+ /** Fires when an item is selected with its value. */
15
+ onselect?: (value: string) => void;
16
+ }
17
+ declare const DropdownMenu: import("svelte").Component<Props, {}, "">;
18
+ type DropdownMenu = ReturnType<typeof DropdownMenu>;
19
+ export default DropdownMenu;
@@ -0,0 +1,90 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ interface NavItem {
5
+ label: string;
6
+ href: string;
7
+ active?: boolean;
8
+ }
9
+
10
+ interface Props {
11
+ /** Navigation items. */
12
+ items?: NavItem[];
13
+ /** Additional CSS classes. */
14
+ class?: string;
15
+ /** Fires when a nav item is clicked. */
16
+ onnavigate?: (item: NavItem) => void;
17
+ }
18
+
19
+ let {
20
+ items = [],
21
+ class: className = '',
22
+ onnavigate,
23
+ }: Props = $props();
24
+ </script>
25
+
26
+ <nav class={cn('hyvui-sidebar-nav', className)}>
27
+ {#each items as item}
28
+ <a
29
+ href={item.href}
30
+ class={cn('hyvui-sidebar-link', item.active && 'hyvui-sidebar-link-active')}
31
+ onclick={(e) => {
32
+ if (onnavigate) {
33
+ e.preventDefault();
34
+ onnavigate(item);
35
+ }
36
+ }}
37
+ >
38
+ {item.label}
39
+ </a>
40
+ {/each}
41
+ </nav>
42
+
43
+ <style>
44
+ .hyvui-sidebar-nav {
45
+ display: flex;
46
+ flex-direction: column;
47
+ gap: var(--space-2xs);
48
+ }
49
+
50
+ .hyvui-sidebar-link {
51
+ position: relative;
52
+ font-family: var(--font-mono);
53
+ font-size: 0.7rem;
54
+ font-weight: 400;
55
+ letter-spacing: 0.16em;
56
+ text-transform: uppercase;
57
+ color: var(--muted);
58
+ text-decoration: none;
59
+ padding: 0.55rem 0.9rem;
60
+ border-left: 1px solid transparent;
61
+ min-width: 0;
62
+ transition:
63
+ color var(--transition-fast),
64
+ transform var(--transition-fast),
65
+ background var(--transition-fast),
66
+ border-color var(--transition-fast);
67
+ }
68
+
69
+ .hyvui-sidebar-link:hover {
70
+ color: var(--text-soft);
71
+ background: linear-gradient(90deg, rgba(199, 156, 87, 0.08), transparent 76%);
72
+ }
73
+
74
+ .hyvui-sidebar-link-active {
75
+ color: var(--accent);
76
+ border-left-color: var(--line-strong);
77
+ background: linear-gradient(90deg, rgba(199, 156, 87, 0.14), transparent 72%);
78
+ transform: translateX(4px);
79
+ }
80
+
81
+ @media (prefers-reduced-motion: reduce) {
82
+ .hyvui-sidebar-link {
83
+ transition: none;
84
+ }
85
+
86
+ .hyvui-sidebar-link-active {
87
+ transform: none;
88
+ }
89
+ }
90
+ </style>
@@ -0,0 +1,16 @@
1
+ interface NavItem {
2
+ label: string;
3
+ href: string;
4
+ active?: boolean;
5
+ }
6
+ interface Props {
7
+ /** Navigation items. */
8
+ items?: NavItem[];
9
+ /** Additional CSS classes. */
10
+ class?: string;
11
+ /** Fires when a nav item is clicked. */
12
+ onnavigate?: (item: NavItem) => void;
13
+ }
14
+ declare const SidebarNav: import("svelte").Component<Props, {}, "">;
15
+ type SidebarNav = ReturnType<typeof SidebarNav>;
16
+ export default SidebarNav;
@@ -0,0 +1,86 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+
4
+ interface TabItem {
5
+ id: string;
6
+ label: string;
7
+ }
8
+
9
+ interface Props {
10
+ /** Available tabs. */
11
+ tabs?: TabItem[];
12
+ /** Currently active tab id. */
13
+ active?: string;
14
+ /** Additional CSS classes. */
15
+ class?: string;
16
+ /** Fires when a tab is selected with the new tab id. */
17
+ onchange?: (id: string) => void;
18
+ }
19
+
20
+ let {
21
+ tabs = [],
22
+ active = '',
23
+ class: className = '',
24
+ onchange,
25
+ }: Props = $props();
26
+ </script>
27
+
28
+ <div class={cn('hyvui-tabs', className)} role="tablist">
29
+ {#each tabs as tab}
30
+ <button
31
+ type="button"
32
+ role="tab"
33
+ aria-selected={tab.id === active}
34
+ class={cn('hyvui-tab', tab.id === active && 'hyvui-tab-active')}
35
+ onclick={() => onchange?.(tab.id)}
36
+ >
37
+ {tab.label}
38
+ </button>
39
+ {/each}
40
+ </div>
41
+
42
+ <style>
43
+ .hyvui-tabs {
44
+ display: flex;
45
+ flex-wrap: wrap;
46
+ gap: var(--space-xs);
47
+ border-bottom: 1px solid var(--line);
48
+ padding-bottom: var(--space-xs);
49
+ }
50
+
51
+ .hyvui-tab {
52
+ position: relative;
53
+ font-family: var(--font-mono);
54
+ font-size: 0.7rem;
55
+ font-weight: 400;
56
+ letter-spacing: 0.16em;
57
+ text-transform: uppercase;
58
+ color: var(--muted);
59
+ background: transparent;
60
+ border: 1px solid transparent;
61
+ border-radius: var(--radius-md);
62
+ padding: 0.65rem 0.85rem;
63
+ cursor: pointer;
64
+ transition:
65
+ color var(--transition-fast),
66
+ border-color var(--transition-fast),
67
+ background var(--transition-fast);
68
+ }
69
+
70
+ .hyvui-tab:hover {
71
+ color: var(--text-soft);
72
+ background: linear-gradient(180deg, rgba(199, 156, 87, 0.08), transparent 76%);
73
+ }
74
+
75
+ .hyvui-tab-active {
76
+ color: var(--accent);
77
+ border-color: color-mix(in srgb, var(--accent) 34%, transparent);
78
+ background: linear-gradient(180deg, rgba(199, 156, 87, 0.12), transparent 76%);
79
+ }
80
+
81
+ @media (prefers-reduced-motion: reduce) {
82
+ .hyvui-tab {
83
+ transition: none;
84
+ }
85
+ }
86
+ </style>
@@ -0,0 +1,17 @@
1
+ interface TabItem {
2
+ id: string;
3
+ label: string;
4
+ }
5
+ interface Props {
6
+ /** Available tabs. */
7
+ tabs?: TabItem[];
8
+ /** Currently active tab id. */
9
+ active?: string;
10
+ /** Additional CSS classes. */
11
+ class?: string;
12
+ /** Fires when a tab is selected with the new tab id. */
13
+ onchange?: (id: string) => void;
14
+ }
15
+ declare const Tabs: import("svelte").Component<Props, {}, "">;
16
+ type Tabs = ReturnType<typeof Tabs>;
17
+ export default Tabs;
@@ -0,0 +1,85 @@
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
+ /** Left slot content. */
9
+ left?: Snippet;
10
+ /** Center slot content. */
11
+ center?: Snippet;
12
+ /** Right slot content. */
13
+ right?: Snippet;
14
+ }
15
+
16
+ let {
17
+ class: className = '',
18
+ left,
19
+ center,
20
+ right,
21
+ }: Props = $props();
22
+ </script>
23
+
24
+ <header class={cn('hyvui-topbar', className)}>
25
+ <div class="hyvui-topbar-left">
26
+ {#if left}{@render left()}{/if}
27
+ </div>
28
+ <div class="hyvui-topbar-center">
29
+ {#if center}{@render center()}{/if}
30
+ </div>
31
+ <div class="hyvui-topbar-right">
32
+ {#if right}{@render right()}{/if}
33
+ </div>
34
+ </header>
35
+
36
+ <style>
37
+ .hyvui-topbar {
38
+ display: grid;
39
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
40
+ align-items: center;
41
+ gap: var(--space-md);
42
+ min-height: 4.5rem;
43
+ padding: var(--space-sm) var(--shell-pad);
44
+ background:
45
+ linear-gradient(180deg, rgba(121, 166, 163, 0.06), transparent 68%),
46
+ rgba(8, 9, 11, 0.86);
47
+ border-bottom: 1px solid var(--line);
48
+ backdrop-filter: blur(10px);
49
+ }
50
+
51
+ .hyvui-topbar-left {
52
+ display: flex;
53
+ align-items: center;
54
+ gap: var(--space-sm);
55
+ min-width: 0;
56
+ }
57
+
58
+ .hyvui-topbar-center {
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ gap: var(--space-sm);
63
+ min-width: 0;
64
+ }
65
+
66
+ .hyvui-topbar-right {
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: flex-end;
70
+ gap: var(--space-sm);
71
+ min-width: 0;
72
+ }
73
+
74
+ @media (max-width: 720px) {
75
+ .hyvui-topbar {
76
+ grid-template-columns: 1fr;
77
+ justify-items: stretch;
78
+ }
79
+
80
+ .hyvui-topbar-center,
81
+ .hyvui-topbar-right {
82
+ justify-content: flex-start;
83
+ }
84
+ }
85
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Additional CSS classes. */
4
+ class?: string;
5
+ /** Left slot content. */
6
+ left?: Snippet;
7
+ /** Center slot content. */
8
+ center?: Snippet;
9
+ /** Right slot content. */
10
+ right?: Snippet;
11
+ }
12
+ declare const Topbar: import("svelte").Component<Props, {}, "">;
13
+ type Topbar = ReturnType<typeof Topbar>;
14
+ export default Topbar;
@@ -0,0 +1,76 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import Button from '../inputs/Button.svelte';
4
+ import Label from '../primitives/Label.svelte';
5
+ import type { Snippet } from 'svelte';
6
+
7
+ interface Props {
8
+ /** Number of selected items. Bar is visible when count > 0. */
9
+ count?: number;
10
+ /** Additional CSS classes. */
11
+ class?: string;
12
+ /** Bulk action buttons slot. */
13
+ actions?: Snippet;
14
+ /** Fires when clear selection is clicked. */
15
+ onclear?: () => void;
16
+ }
17
+
18
+ let {
19
+ count = 0,
20
+ class: className = '',
21
+ actions,
22
+ onclear,
23
+ }: Props = $props();
24
+ </script>
25
+
26
+ {#if count > 0}
27
+ <div class={cn('hyvui-action-bar', className)}>
28
+ <Label color="accent">{count} selected</Label>
29
+ {#if actions}
30
+ <div class="hyvui-action-bar-actions">
31
+ {@render actions()}
32
+ </div>
33
+ {/if}
34
+ <Button variant="ghost" size="sm" onclick={() => onclear?.()}>clear selection</Button>
35
+ </div>
36
+ {/if}
37
+
38
+ <style>
39
+ .hyvui-action-bar {
40
+ position: fixed;
41
+ bottom: 1.5rem;
42
+ left: 50%;
43
+ transform: translateX(-50%);
44
+ z-index: var(--z-overlay);
45
+ display: flex;
46
+ align-items: center;
47
+ gap: 1rem;
48
+ background: var(--surface-card);
49
+ border: 1px solid rgba(255, 255, 255, 0.05);
50
+ box-shadow: var(--shadow-veil);
51
+ padding: 0.625rem 1.25rem;
52
+ animation: actionbar-in 0.35s cubic-bezier(0.22, 1, 0.36, 1);
53
+ }
54
+
55
+ .hyvui-action-bar-actions {
56
+ display: flex;
57
+ gap: 0.5rem;
58
+ }
59
+
60
+ @keyframes actionbar-in {
61
+ from {
62
+ opacity: 0;
63
+ transform: translateX(-50%) translateY(12px);
64
+ }
65
+ to {
66
+ opacity: 1;
67
+ transform: translateX(-50%) translateY(0);
68
+ }
69
+ }
70
+
71
+ @media (prefers-reduced-motion: reduce) {
72
+ .hyvui-action-bar {
73
+ animation: none;
74
+ }
75
+ }
76
+ </style>
@@ -0,0 +1,14 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Number of selected items. Bar is visible when count > 0. */
4
+ count?: number;
5
+ /** Additional CSS classes. */
6
+ class?: string;
7
+ /** Bulk action buttons slot. */
8
+ actions?: Snippet;
9
+ /** Fires when clear selection is clicked. */
10
+ onclear?: () => void;
11
+ }
12
+ declare const ActionBar: import("svelte").Component<Props, {}, "">;
13
+ type ActionBar = ReturnType<typeof ActionBar>;
14
+ export default ActionBar;
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ import Modal from '../layout/Modal.svelte';
3
+ import Button from '../inputs/Button.svelte';
4
+ import Stack from '../layout/Stack.svelte';
5
+ import type { Snippet } from 'svelte';
6
+
7
+ interface Props {
8
+ /** Controls dialog visibility. */
9
+ open?: boolean;
10
+ /** Action title. Names the action, never asks "are you sure?". */
11
+ title?: string;
12
+ /** Additional description. */
13
+ description?: string;
14
+ /** Confirm button label. */
15
+ confirmLabel?: string;
16
+ /** Cancel button label. */
17
+ cancelLabel?: string;
18
+ /** Makes the confirm button use the destructive variant. */
19
+ destructive?: boolean;
20
+ /** Additional CSS classes. */
21
+ class?: string;
22
+ /** Fires when the confirm button is clicked. */
23
+ onconfirm?: () => void;
24
+ /** Fires when the cancel button is clicked or dialog is dismissed. */
25
+ oncancel?: () => void;
26
+ }
27
+
28
+ let {
29
+ open = false,
30
+ title = '',
31
+ description = '',
32
+ confirmLabel = 'confirm',
33
+ cancelLabel = 'cancel',
34
+ destructive = false,
35
+ class: className = '',
36
+ onconfirm,
37
+ oncancel,
38
+ }: Props = $props();
39
+ </script>
40
+
41
+ <Modal {open} {title} class={className} onclose={oncancel}>
42
+ {#if description}
43
+ <p class="hyvui-confirm-desc">{description}</p>
44
+ {/if}
45
+ {#snippet footer()}
46
+ <Stack direction="horizontal" gap="0.75rem" justify="flex-end">
47
+ <Button variant="ghost" onclick={() => oncancel?.()}>{cancelLabel}</Button>
48
+ <Button
49
+ variant={destructive ? 'destructive' : 'primary'}
50
+ onclick={() => onconfirm?.()}
51
+ >{confirmLabel}</Button>
52
+ </Stack>
53
+ {/snippet}
54
+ </Modal>
55
+
56
+ <style>
57
+ .hyvui-confirm-desc {
58
+ font-family: var(--font-body);
59
+ font-size: 0.9rem;
60
+ color: var(--text-soft);
61
+ line-height: 1.6;
62
+ margin: 0;
63
+ }
64
+ </style>