@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,98 +1,130 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import type { Snippet } from 'svelte';
4
- import type { Expression } from './text.js';
5
-
6
- interface Props {
7
- /** HTML tag to render. */
8
- as?: string;
9
- /** Typographic style variant. */
10
- variant?: 'heading' | 'body' | 'caption' | 'italic';
11
- /** Text color token. */
12
- color?: 'primary' | 'soft' | 'muted' | 'muted-strong' | 'accent' | 'signal';
13
- /** Compositional intent expression. Applied alongside the variant. */
14
- expression?: Expression;
15
- /** Additional CSS classes. */
16
- class?: string;
17
- /** Text content. */
18
- children?: Snippet;
19
- }
20
-
21
- let {
22
- as = 'p',
23
- variant = 'body',
24
- color = variant === 'heading' ? 'primary' : 'soft',
25
- expression,
26
- class: className = '',
27
- children,
28
- }: Props = $props();
29
-
30
- const colorMap: Record<string, string> = {
31
- primary: 'var(--text)',
32
- soft: 'var(--text-soft)',
33
- muted: 'var(--muted)',
34
- 'muted-strong': 'var(--muted-strong)',
35
- accent: 'var(--accent)',
36
- signal: 'var(--signal)',
37
- };
38
-
39
- const variantClass = $derived(
40
- cn(
41
- variant === 'heading' && 'hyvui-text-heading',
42
- variant === 'body' && 'hyvui-text-body',
43
- variant === 'caption' && 'hyvui-text-caption',
44
- variant === 'italic' && 'hyvui-text-italic',
45
- expression && `expr-${expression}`,
46
- className
47
- )
48
- );
49
- </script>
50
-
51
- <svelte:element this={as} class={variantClass} style:color={colorMap[color]}>
52
- {#if children}{@render children()}{/if}
53
- </svelte:element>
54
-
55
- <style>
56
- .hyvui-text-heading,
57
- .hyvui-text-body,
58
- .hyvui-text-caption,
59
- .hyvui-text-italic {
60
- margin: 0;
61
- }
62
-
63
- .hyvui-text-heading {
64
- font-family: var(--font-body);
65
- font-size: clamp(1.75rem, 4vw, 3.25rem);
66
- font-weight: 400;
67
- line-height: 0.95;
68
- letter-spacing: -0.045em;
69
- text-wrap: balance;
70
- }
71
-
72
- .hyvui-text-body {
73
- font-family: var(--font-body);
74
- font-size: 1.03rem;
75
- font-weight: 400;
76
- line-height: 1.62;
77
- max-width: 32rem;
78
- text-wrap: pretty;
79
- }
80
-
81
- .hyvui-text-caption {
82
- font-family: var(--font-mono);
83
- font-size: 0.7rem;
84
- font-weight: 400;
85
- letter-spacing: 0.16em;
86
- text-transform: uppercase;
87
- line-height: 1.2;
88
- }
89
-
90
- .hyvui-text-italic {
91
- font-family: var(--font-body);
92
- font-size: 1.02rem;
93
- font-style: italic;
94
- font-weight: 400;
95
- line-height: 1.64;
96
- text-wrap: pretty;
97
- }
98
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import type { Snippet } from 'svelte';
4
+ import type { Expression } from './text.js';
5
+
6
+ /**
7
+ * @example
8
+ * <Text variant="heading" as="h1">signal acquired</Text>
9
+ * <Text variant="body" color="muted">supporting prose here.</Text>
10
+ * <Text expression="title-card" as="h1">deep signal</Text>
11
+ * <Text expression="readout">sys.uptime: 99.9%</Text>
12
+ */
13
+ interface Props {
14
+ /** HTML tag to render. */
15
+ as?: string;
16
+ /** Typographic style variant. */
17
+ variant?: 'heading' | 'body' | 'caption' | 'italic';
18
+ /** Text color token. */
19
+ color?: 'primary' | 'soft' | 'muted' | 'muted-strong' | 'accent' | 'signal';
20
+ /** Compositional intent expression. Applied alongside the variant. */
21
+ expression?: Expression;
22
+ /** Additional CSS classes. */
23
+ class?: string;
24
+ /** Text content. */
25
+ children?: Snippet;
26
+ }
27
+
28
+ let {
29
+ as = 'p',
30
+ variant = 'body',
31
+ color = variant === 'heading' ? 'primary' : 'soft',
32
+ expression,
33
+ class: className = '',
34
+ children
35
+ }: Props = $props();
36
+
37
+ const colorMap: Record<string, string> = {
38
+ primary: 'var(--text)',
39
+ soft: 'var(--text-soft)',
40
+ muted: 'var(--muted)',
41
+ 'muted-strong': 'var(--muted-strong)',
42
+ accent: 'var(--accent)',
43
+ signal: 'var(--signal)'
44
+ };
45
+
46
+ const variantClass = $derived(
47
+ cn(
48
+ variant === 'heading' && 'hyvui-text-heading',
49
+ variant === 'body' && 'hyvui-text-body',
50
+ variant === 'caption' && 'hyvui-text-caption',
51
+ variant === 'italic' && 'hyvui-text-italic',
52
+ expression && `expr-${expression}`,
53
+ className
54
+ )
55
+ );
56
+ </script>
57
+
58
+ <svelte:element this={as} class={variantClass} style:color={colorMap[color]}>
59
+ {#if children}{@render children()}{/if}
60
+ </svelte:element>
61
+
62
+ <style>
63
+ .hyvui-text-heading,
64
+ .hyvui-text-body,
65
+ .hyvui-text-caption,
66
+ .hyvui-text-italic {
67
+ margin: 0;
68
+ }
69
+
70
+ .hyvui-text-heading {
71
+ font-family: var(--font-body);
72
+ font-size: clamp(1.75rem, 4vw, 3.25rem);
73
+ font-weight: 400;
74
+ line-height: 0.95;
75
+ letter-spacing: -0.045em;
76
+ text-wrap: balance;
77
+ }
78
+
79
+ .hyvui-text-body {
80
+ font-family: var(--font-body);
81
+ font-size: 1.03rem;
82
+ font-weight: 400;
83
+ line-height: 1.62;
84
+ max-width: 32rem;
85
+ text-wrap: pretty;
86
+ }
87
+
88
+ .hyvui-text-caption {
89
+ font-family: var(--font-mono);
90
+ font-size: 0.7rem;
91
+ font-weight: 400;
92
+ letter-spacing: 0.16em;
93
+ text-transform: uppercase;
94
+ line-height: 1.2;
95
+ }
96
+
97
+ .hyvui-text-italic {
98
+ font-family: var(--font-body);
99
+ font-size: 1.02rem;
100
+ font-style: italic;
101
+ font-weight: 400;
102
+ line-height: 1.64;
103
+ text-wrap: pretty;
104
+ }
105
+
106
+ /* ── hextech: `command` expression gets cyan underline glow ───────── */
107
+ :global([data-register='hextech']) .expr-command {
108
+ text-decoration: underline;
109
+ text-decoration-color: rgba(93, 217, 240, 0.45);
110
+ text-underline-offset: 3px;
111
+ text-decoration-thickness: 1px;
112
+ }
113
+
114
+ /* ── arcane: `command` expression gets violet text-shadow shimmer ─── */
115
+ :global([data-register='arcane']) .expr-command {
116
+ text-shadow: 0 0 12px rgba(184, 69, 201, 0.55);
117
+ animation: text-shimmer 3s var(--orn-pulse-rhythm, ease-in-out) infinite;
118
+ }
119
+
120
+ @keyframes text-shimmer {
121
+ 0%, 100% { text-shadow: 0 0 12px rgba(184, 69, 201, 0.55); }
122
+ 50% { text-shadow: 0 0 20px rgba(233, 76, 188, 0.7), 0 0 8px rgba(184, 69, 201, 0.35); }
123
+ }
124
+
125
+ @media (prefers-reduced-motion: reduce) {
126
+ :global([data-register='arcane']) .expr-command {
127
+ animation: none;
128
+ }
129
+ }
130
+ </style>
@@ -1,5 +1,12 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { Expression } from './text.js';
3
+ /**
4
+ * @example
5
+ * <Text variant="heading" as="h1">signal acquired</Text>
6
+ * <Text variant="body" color="muted">supporting prose here.</Text>
7
+ * <Text expression="title-card" as="h1">deep signal</Text>
8
+ * <Text expression="readout">sys.uptime: 99.9%</Text>
9
+ */
3
10
  interface Props {
4
11
  /** HTML tag to render. */
5
12
  as?: string;
@@ -1,95 +1,102 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import type { Snippet } from 'svelte';
4
-
5
- interface Props {
6
- /** Optional scene title. */
7
- title?: string;
8
- /** Number of grid columns. */
9
- cols?: number;
10
- /** Additional CSS classes. */
11
- class?: string;
12
- /** Filter controls area above the grid. */
13
- filter?: Snippet;
14
- /** Grid items (Cards, images, etc.). */
15
- children?: Snippet;
16
- }
17
-
18
- let {
19
- title = '',
20
- cols = 3,
21
- class: className = '',
22
- filter,
23
- children,
24
- }: Props = $props();
25
- </script>
26
-
27
- <section class={cn('hyvui-archive', className)}>
28
- <div class="hyvui-archive-inner">
29
- {#if title || filter}
30
- <div class="hyvui-archive-top">
31
- {#if title}
32
- <h2 class="hyvui-archive-title">{title}</h2>
33
- {/if}
34
- {#if filter}
35
- <div class="hyvui-archive-filter">
36
- {@render filter()}
37
- </div>
38
- {/if}
39
- </div>
40
- {/if}
41
- <div
42
- class="hyvui-archive-grid"
43
- style:grid-template-columns="repeat({cols}, 1fr)"
44
- >
45
- {#if children}{@render children()}{/if}
46
- </div>
47
- </div>
48
- </section>
49
-
50
- <style>
51
- .hyvui-archive {
52
- position: relative;
53
- min-height: 100dvh;
54
- padding: var(--space-scene);
55
- }
56
-
57
- .hyvui-archive-inner {
58
- display: flex;
59
- flex-direction: column;
60
- gap: calc(1.5rem * var(--reg-spacing-scale));
61
- }
62
-
63
- .hyvui-archive-top {
64
- display: flex;
65
- align-items: flex-end;
66
- justify-content: space-between;
67
- gap: 1rem;
68
- }
69
-
70
- .hyvui-archive-title {
71
- font-family: var(--font-body);
72
- font-size: 1.4rem;
73
- font-weight: 400;
74
- line-height: var(--reg-heading-lh);
75
- letter-spacing: var(--reg-heading-tracking);
76
- color: var(--text);
77
- margin: 0;
78
- }
79
-
80
- .hyvui-archive-filter {
81
- flex-shrink: 0;
82
- }
83
-
84
- .hyvui-archive-grid {
85
- display: grid;
86
- gap: var(--space-inline);
87
- /* no stagger offsets. uniformity is the aesthetic intent. */
88
- }
89
-
90
- @media (max-width: 768px) {
91
- .hyvui-archive-grid {
92
- grid-template-columns: 1fr !important;
93
- }
94
- }
95
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import Grid from '../layout/Grid.svelte';
4
+ import type { Snippet } from 'svelte';
5
+
6
+ /**
7
+ * @remarks Use for galleries, catalogs, index pages. Responsive card grid with optional filter controls.
8
+ * @example
9
+ * <ArchiveScene title="all projects" minCardWidth="22rem" maxCols={3}>
10
+ * {#snippet filter()}<SearchBar bind:value={query} />{/snippet}
11
+ * {#each filtered as item}
12
+ * <Card><Text variant="heading">{item.name}</Text></Card>
13
+ * {/each}
14
+ * </ArchiveScene>
15
+ */
16
+ interface Props {
17
+ /** Optional scene title. */
18
+ title?: string;
19
+ /** Minimum card width used for responsive auto layout. */
20
+ minCardWidth?: string;
21
+ /** Maximum number of columns (auto layout). */
22
+ maxCols?: number;
23
+ /** Gap between items. */
24
+ gap?: string;
25
+ /** Deprecated alias for maxCols. */
26
+ cols?: number;
27
+ /** Additional CSS classes. */
28
+ class?: string;
29
+ /** Filter controls area above the grid. */
30
+ filter?: Snippet;
31
+ /** Grid items (Cards, images, etc.). */
32
+ children?: Snippet;
33
+ }
34
+
35
+ let {
36
+ title = '',
37
+ minCardWidth = '18rem',
38
+ maxCols,
39
+ gap = 'var(--space-inline)',
40
+ cols,
41
+ class: className = '',
42
+ filter,
43
+ children
44
+ }: Props = $props();
45
+
46
+ const effectiveMaxCols = $derived(maxCols ?? cols ?? 3);
47
+ </script>
48
+
49
+ <section class={cn('hyvui-archive', className)}>
50
+ <div class="hyvui-archive-inner">
51
+ {#if title || filter}
52
+ <div class="hyvui-archive-top">
53
+ {#if title}
54
+ <h2 class="hyvui-archive-title">{title}</h2>
55
+ {/if}
56
+ {#if filter}
57
+ <div class="hyvui-archive-filter">
58
+ {@render filter()}
59
+ </div>
60
+ {/if}
61
+ </div>
62
+ {/if}
63
+ <Grid maxCols={effectiveMaxCols} minColWidth={minCardWidth} {gap} class="hyvui-archive-grid">
64
+ {#if children}{@render children()}{/if}
65
+ </Grid>
66
+ </div>
67
+ </section>
68
+
69
+ <style>
70
+ .hyvui-archive {
71
+ position: relative;
72
+ min-height: 100dvh;
73
+ padding: var(--space-scene);
74
+ }
75
+
76
+ .hyvui-archive-inner {
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: calc(1.5rem * var(--reg-spacing-scale));
80
+ }
81
+
82
+ .hyvui-archive-top {
83
+ display: flex;
84
+ align-items: flex-end;
85
+ justify-content: space-between;
86
+ gap: 1rem;
87
+ }
88
+
89
+ .hyvui-archive-title {
90
+ font-family: var(--font-body);
91
+ font-size: 1.4rem;
92
+ font-weight: 400;
93
+ line-height: var(--reg-heading-lh);
94
+ letter-spacing: var(--reg-heading-tracking);
95
+ color: var(--text);
96
+ margin: 0;
97
+ }
98
+
99
+ .hyvui-archive-filter {
100
+ flex-shrink: 0;
101
+ }
102
+ </style>
@@ -1,8 +1,24 @@
1
1
  import type { Snippet } from 'svelte';
2
+ /**
3
+ * @remarks Use for galleries, catalogs, index pages. Responsive card grid with optional filter controls.
4
+ * @example
5
+ * <ArchiveScene title="all projects" minCardWidth="22rem" maxCols={3}>
6
+ * {#snippet filter()}<SearchBar bind:value={query} />{/snippet}
7
+ * {#each filtered as item}
8
+ * <Card><Text variant="heading">{item.name}</Text></Card>
9
+ * {/each}
10
+ * </ArchiveScene>
11
+ */
2
12
  interface Props {
3
13
  /** Optional scene title. */
4
14
  title?: string;
5
- /** Number of grid columns. */
15
+ /** Minimum card width used for responsive auto layout. */
16
+ minCardWidth?: string;
17
+ /** Maximum number of columns (auto layout). */
18
+ maxCols?: number;
19
+ /** Gap between items. */
20
+ gap?: string;
21
+ /** Deprecated alias for maxCols. */
6
22
  cols?: number;
7
23
  /** Additional CSS classes. */
8
24
  class?: string;
@@ -0,0 +1,128 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import DepthStage from '../depth/DepthStage.svelte';
4
+ import DepthLayer from '../depth/DepthLayer.svelte';
5
+ import type { PerspectivePreset } from '../../system/depth/depth.js';
6
+ import type { Snippet } from 'svelte';
7
+
8
+ /**
9
+ * @remarks Full-page scene where depth is the primary design language.
10
+ * Unlike StageScene (flat, centered), DepthScene is spatial from edge to edge.
11
+ * @example
12
+ * <DepthScene perspective="far">
13
+ * {#snippet ambient()}<GridOverlay /><Vignette />{/snippet}
14
+ * {#snippet ground()}<HorizonGrid animated rows={20} />{/snippet}
15
+ * {#snippet stage()}
16
+ * <FloatCard tiltMax={5}>
17
+ * <Text expression="title-card" as="h1">deep signal</Text>
18
+ * </FloatCard>
19
+ * {/snippet}
20
+ * {#snippet foreground()}
21
+ * <Label color="muted">system / v4</Label>
22
+ * {/snippet}
23
+ * </DepthScene>
24
+ */
25
+ interface Props {
26
+ /** Perspective depth preset. */
27
+ perspective?: PerspectivePreset;
28
+ /** Background decorations: GridOverlay, ScanBand, Vignette. */
29
+ ambient?: Snippet;
30
+ /** Ground plane — HorizonGrid belongs here. */
31
+ ground?: Snippet;
32
+ /** Main content at mid-depth. */
33
+ stage?: Snippet;
34
+ /** Foreground labels and overlays closest to viewer. Pointer-events none. */
35
+ foreground?: Snippet;
36
+ /** Additional CSS classes. */
37
+ class?: string;
38
+ }
39
+
40
+ let {
41
+ perspective = 'far',
42
+ ambient,
43
+ ground,
44
+ stage,
45
+ foreground,
46
+ class: className = ''
47
+ }: Props = $props();
48
+ </script>
49
+
50
+ <section class={cn('hyvui-depth-scene', className)}>
51
+ <DepthStage {perspective} as="div" class="hyvui-depth-scene-stage">
52
+ {#if ambient}
53
+ <div class="hyvui-depth-scene-ambient" aria-hidden="true">
54
+ {@render ambient()}
55
+ </div>
56
+ {/if}
57
+
58
+ {#if ground}
59
+ <DepthLayer level="ground" class="hyvui-depth-scene-ground">
60
+ <div aria-hidden="true" style="display:contents">
61
+ {@render ground()}
62
+ </div>
63
+ </DepthLayer>
64
+ {/if}
65
+
66
+ {#if stage}
67
+ <DepthLayer level="raised" class="hyvui-depth-scene-content">
68
+ {@render stage()}
69
+ </DepthLayer>
70
+ {/if}
71
+
72
+ {#if foreground}
73
+ <DepthLayer level="foreground" class="hyvui-depth-scene-foreground">
74
+ {@render foreground()}
75
+ </DepthLayer>
76
+ {/if}
77
+ </DepthStage>
78
+ </section>
79
+
80
+ <style>
81
+ .hyvui-depth-scene {
82
+ position: relative;
83
+ min-height: 100dvh;
84
+ overflow: hidden;
85
+ }
86
+
87
+ :global(.hyvui-depth-scene-stage) {
88
+ position: relative;
89
+ width: 100%;
90
+ min-height: 100dvh;
91
+ }
92
+
93
+ .hyvui-depth-scene-ambient {
94
+ position: absolute;
95
+ inset: 0;
96
+ pointer-events: none;
97
+ }
98
+
99
+ :global(.hyvui-depth-scene-ground) {
100
+ position: absolute;
101
+ inset: 0;
102
+ pointer-events: none;
103
+ }
104
+
105
+ :global(.hyvui-depth-scene-content) {
106
+ position: relative;
107
+ display: flex;
108
+ align-items: center;
109
+ justify-content: center;
110
+ min-height: 100dvh;
111
+ padding: var(--space-scene);
112
+ }
113
+
114
+ :global(.hyvui-depth-scene-foreground) {
115
+ position: absolute;
116
+ inset: var(--space-lg, 1.5rem);
117
+ pointer-events: none;
118
+ display: flex;
119
+ flex-direction: column;
120
+ justify-content: flex-end;
121
+ }
122
+
123
+ @media (prefers-reduced-motion: reduce) {
124
+ .hyvui-depth-scene {
125
+ overflow: visible;
126
+ }
127
+ }
128
+ </style>
@@ -0,0 +1,36 @@
1
+ import type { PerspectivePreset } from '../../system/depth/depth.js';
2
+ import type { Snippet } from 'svelte';
3
+ /**
4
+ * @remarks Full-page scene where depth is the primary design language.
5
+ * Unlike StageScene (flat, centered), DepthScene is spatial from edge to edge.
6
+ * @example
7
+ * <DepthScene perspective="far">
8
+ * {#snippet ambient()}<GridOverlay /><Vignette />{/snippet}
9
+ * {#snippet ground()}<HorizonGrid animated rows={20} />{/snippet}
10
+ * {#snippet stage()}
11
+ * <FloatCard tiltMax={5}>
12
+ * <Text expression="title-card" as="h1">deep signal</Text>
13
+ * </FloatCard>
14
+ * {/snippet}
15
+ * {#snippet foreground()}
16
+ * <Label color="muted">system / v4</Label>
17
+ * {/snippet}
18
+ * </DepthScene>
19
+ */
20
+ interface Props {
21
+ /** Perspective depth preset. */
22
+ perspective?: PerspectivePreset;
23
+ /** Background decorations: GridOverlay, ScanBand, Vignette. */
24
+ ambient?: Snippet;
25
+ /** Ground plane — HorizonGrid belongs here. */
26
+ ground?: Snippet;
27
+ /** Main content at mid-depth. */
28
+ stage?: Snippet;
29
+ /** Foreground labels and overlays closest to viewer. Pointer-events none. */
30
+ foreground?: Snippet;
31
+ /** Additional CSS classes. */
32
+ class?: string;
33
+ }
34
+ declare const DepthScene: import("svelte").Component<Props, {}, "">;
35
+ type DepthScene = ReturnType<typeof DepthScene>;
36
+ export default DepthScene;