@hyvnt/hyvui 0.2.0 → 0.3.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 (86) hide show
  1. package/README.md +264 -253
  2. package/dist/components/ambient/CornerBrackets.svelte +83 -87
  3. package/dist/components/ambient/DataStream.svelte +111 -94
  4. package/dist/components/ambient/GlyphMark.svelte +69 -69
  5. package/dist/components/ambient/GridOverlay.svelte +26 -28
  6. package/dist/components/ambient/ParallaxLayer.svelte +37 -41
  7. package/dist/components/ambient/ScanBand.svelte +95 -91
  8. package/dist/components/ambient/SignalRing.svelte +100 -100
  9. package/dist/components/ambient/ThreadLine.svelte +71 -78
  10. package/dist/components/ambient/Vignette.svelte +24 -26
  11. package/dist/components/depth/DepthLayer.svelte +22 -27
  12. package/dist/components/depth/DepthStage.svelte +63 -62
  13. package/dist/components/depth/FloatCard.svelte +113 -104
  14. package/dist/components/depth/HorizonGrid.svelte +216 -160
  15. package/dist/components/depth/Plinth.svelte +52 -57
  16. package/dist/components/display/Avatar.svelte +64 -69
  17. package/dist/components/display/Badge.svelte +59 -63
  18. package/dist/components/display/Blockquote.svelte +31 -34
  19. package/dist/components/display/CodeBlock.svelte +71 -76
  20. package/dist/components/display/MetricCard.svelte +77 -83
  21. package/dist/components/display/Table.svelte +99 -104
  22. package/dist/components/feedback/Alert.svelte +71 -76
  23. package/dist/components/feedback/EmptyState.svelte +68 -68
  24. package/dist/components/feedback/ErrorState.svelte +73 -73
  25. package/dist/components/feedback/Skeleton.svelte +52 -52
  26. package/dist/components/feedback/StatusDot.svelte +49 -54
  27. package/dist/components/feedback/StatusLine.svelte +122 -122
  28. package/dist/components/feedback/Toast.svelte +130 -136
  29. package/dist/components/inputs/Button.svelte +240 -237
  30. package/dist/components/inputs/Checkbox.svelte +104 -105
  31. package/dist/components/inputs/FileUpload.svelte +165 -163
  32. package/dist/components/inputs/Input.svelte +145 -147
  33. package/dist/components/inputs/Select.svelte +156 -150
  34. package/dist/components/inputs/Textarea.svelte +153 -154
  35. package/dist/components/inputs/Toggle.svelte +120 -120
  36. package/dist/components/layout/Card.svelte +70 -76
  37. package/dist/components/layout/Drawer.svelte +133 -109
  38. package/dist/components/layout/Grid.svelte +118 -43
  39. package/dist/components/layout/Grid.svelte.d.ts +8 -2
  40. package/dist/components/layout/Modal.svelte +176 -159
  41. package/dist/components/layout/Panel.svelte +49 -54
  42. package/dist/components/layout/Popover.svelte +178 -67
  43. package/dist/components/layout/Popover.svelte.d.ts +10 -1
  44. package/dist/components/layout/Stack.svelte +53 -53
  45. package/dist/components/navigation/Breadcrumb.svelte +70 -73
  46. package/dist/components/navigation/DropdownMenu.svelte +167 -124
  47. package/dist/components/navigation/DropdownMenu.svelte.d.ts +12 -2
  48. package/dist/components/navigation/SidebarNav.svelte +86 -90
  49. package/dist/components/navigation/Tabs.svelte +81 -86
  50. package/dist/components/navigation/Topbar.svelte +85 -85
  51. package/dist/components/patterns/ActionBar.svelte +71 -76
  52. package/dist/components/patterns/ConfirmDialog.svelte +63 -64
  53. package/dist/components/patterns/PageHeader.svelte +109 -114
  54. package/dist/components/patterns/SearchBar.svelte +54 -59
  55. package/dist/components/patterns/TerminalBoot.svelte +104 -104
  56. package/dist/components/primitives/Divider.svelte +26 -29
  57. package/dist/components/primitives/Icon.svelte +44 -49
  58. package/dist/components/primitives/Label.svelte +39 -44
  59. package/dist/components/primitives/Surface.svelte +89 -87
  60. package/dist/components/primitives/Text.svelte +98 -98
  61. package/dist/components/scenes/ArchiveScene.svelte +92 -95
  62. package/dist/components/scenes/ArchiveScene.svelte.d.ts +7 -1
  63. package/dist/components/scenes/LogScene.svelte +72 -77
  64. package/dist/components/scenes/NarrativeScene.svelte +91 -92
  65. package/dist/components/scenes/ReadoutScene.svelte +120 -107
  66. package/dist/components/scenes/ReadoutScene.svelte.d.ts +3 -1
  67. package/dist/components/scenes/StageScene.svelte +97 -104
  68. package/dist/examples/FieldReport.svelte +226 -223
  69. package/dist/examples/ObservationDeck.svelte +333 -317
  70. package/dist/examples/SignalLost.svelte +191 -191
  71. package/dist/styles.css +113 -0
  72. package/dist/system/actions/echo.js +9 -9
  73. package/dist/system/actions/resolve.js +9 -9
  74. package/dist/system/actions/reveal.js +1 -1
  75. package/dist/system/actions/surface.js +13 -1
  76. package/dist/system/depth/depth.css +49 -49
  77. package/dist/system/depth/depth.js +1 -1
  78. package/dist/system/expressions.css +80 -80
  79. package/dist/system/override-template.css +72 -72
  80. package/dist/system/register.css +74 -74
  81. package/dist/system/scroll-lock.d.ts +6 -0
  82. package/dist/system/scroll-lock.js +23 -0
  83. package/dist/tokens/tokens.css +100 -86
  84. package/dist/tokens/tokens.js +4 -4
  85. package/dist/utils/motion.js +1 -1
  86. package/package.json +67 -60
@@ -1,95 +1,92 @@
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
+ interface Props {
7
+ /** Optional scene title. */
8
+ title?: string;
9
+ /** Minimum card width used for responsive auto layout. */
10
+ minCardWidth?: string;
11
+ /** Maximum number of columns (auto layout). */
12
+ maxCols?: number;
13
+ /** Gap between items. */
14
+ gap?: string;
15
+ /** Deprecated alias for maxCols. */
16
+ cols?: number;
17
+ /** Additional CSS classes. */
18
+ class?: string;
19
+ /** Filter controls area above the grid. */
20
+ filter?: Snippet;
21
+ /** Grid items (Cards, images, etc.). */
22
+ children?: Snippet;
23
+ }
24
+
25
+ let {
26
+ title = '',
27
+ minCardWidth = '18rem',
28
+ maxCols,
29
+ gap = 'var(--space-inline)',
30
+ cols,
31
+ class: className = '',
32
+ filter,
33
+ children
34
+ }: Props = $props();
35
+
36
+ const effectiveMaxCols = $derived(maxCols ?? cols ?? 3);
37
+ </script>
38
+
39
+ <section class={cn('hyvui-archive', className)}>
40
+ <div class="hyvui-archive-inner">
41
+ {#if title || filter}
42
+ <div class="hyvui-archive-top">
43
+ {#if title}
44
+ <h2 class="hyvui-archive-title">{title}</h2>
45
+ {/if}
46
+ {#if filter}
47
+ <div class="hyvui-archive-filter">
48
+ {@render filter()}
49
+ </div>
50
+ {/if}
51
+ </div>
52
+ {/if}
53
+ <Grid maxCols={effectiveMaxCols} minColWidth={minCardWidth} {gap} class="hyvui-archive-grid">
54
+ {#if children}{@render children()}{/if}
55
+ </Grid>
56
+ </div>
57
+ </section>
58
+
59
+ <style>
60
+ .hyvui-archive {
61
+ position: relative;
62
+ min-height: 100dvh;
63
+ padding: var(--space-scene);
64
+ }
65
+
66
+ .hyvui-archive-inner {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: calc(1.5rem * var(--reg-spacing-scale));
70
+ }
71
+
72
+ .hyvui-archive-top {
73
+ display: flex;
74
+ align-items: flex-end;
75
+ justify-content: space-between;
76
+ gap: 1rem;
77
+ }
78
+
79
+ .hyvui-archive-title {
80
+ font-family: var(--font-body);
81
+ font-size: 1.4rem;
82
+ font-weight: 400;
83
+ line-height: var(--reg-heading-lh);
84
+ letter-spacing: var(--reg-heading-tracking);
85
+ color: var(--text);
86
+ margin: 0;
87
+ }
88
+
89
+ .hyvui-archive-filter {
90
+ flex-shrink: 0;
91
+ }
92
+ </style>
@@ -2,7 +2,13 @@ import type { Snippet } from 'svelte';
2
2
  interface Props {
3
3
  /** Optional scene title. */
4
4
  title?: string;
5
- /** Number of grid columns. */
5
+ /** Minimum card width used for responsive auto layout. */
6
+ minCardWidth?: string;
7
+ /** Maximum number of columns (auto layout). */
8
+ maxCols?: number;
9
+ /** Gap between items. */
10
+ gap?: string;
11
+ /** Deprecated alias for maxCols. */
6
12
  cols?: number;
7
13
  /** Additional CSS classes. */
8
14
  class?: string;
@@ -1,77 +1,72 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import ScanBand from '../ambient/ScanBand.svelte';
4
- import GridOverlay from '../ambient/GridOverlay.svelte';
5
- import type { Snippet } from 'svelte';
6
-
7
- interface Props {
8
- /** Additional CSS classes. */
9
- class?: string;
10
- /** Above the log area (system name, StatusDot row). */
11
- header?: Snippet;
12
- /** Log content area (TerminalBoot, StatusLine, CodeBlock). */
13
- children?: Snippet;
14
- /** Below the log area (status summary, CTA). */
15
- footer?: Snippet;
16
- }
17
-
18
- let {
19
- class: className = '',
20
- header,
21
- children,
22
- footer,
23
- }: Props = $props();
24
- </script>
25
-
26
- <section class={cn('hyvui-log', className)}>
27
- <div class="hyvui-log-ambient" aria-hidden="true">
28
- <div style:opacity="0.06">
29
- <GridOverlay />
30
- </div>
31
- <ScanBand />
32
- </div>
33
- <div class="hyvui-log-inner">
34
- {#if header}
35
- <div class="hyvui-log-header">
36
- {@render header()}
37
- </div>
38
- {/if}
39
- <div class="hyvui-log-content">
40
- {#if children}{@render children()}{/if}
41
- </div>
42
- {#if footer}
43
- <div class="hyvui-log-footer">
44
- {@render footer()}
45
- </div>
46
- {/if}
47
- </div>
48
- </section>
49
-
50
- <style>
51
- .hyvui-log {
52
- position: relative;
53
- min-height: 100dvh;
54
- padding: var(--space-scene);
55
- background-color: var(--bg);
56
- }
57
-
58
- .hyvui-log-ambient {
59
- position: absolute;
60
- inset: 0;
61
- pointer-events: none;
62
- }
63
-
64
- .hyvui-log-inner {
65
- position: relative;
66
- display: flex;
67
- flex-direction: column;
68
- gap: calc(1.5rem * var(--reg-spacing-scale));
69
- width: 100%;
70
- }
71
-
72
- .hyvui-log-content {
73
- font-family: var(--font-mono);
74
- border-left: 2px solid rgba(121, 166, 163, 0.18);
75
- padding-left: 1.5rem;
76
- }
77
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import ScanBand from '../ambient/ScanBand.svelte';
4
+ import GridOverlay from '../ambient/GridOverlay.svelte';
5
+ import type { Snippet } from 'svelte';
6
+
7
+ interface Props {
8
+ /** Additional CSS classes. */
9
+ class?: string;
10
+ /** Above the log area (system name, StatusDot row). */
11
+ header?: Snippet;
12
+ /** Log content area (TerminalBoot, StatusLine, CodeBlock). */
13
+ children?: Snippet;
14
+ /** Below the log area (status summary, CTA). */
15
+ footer?: Snippet;
16
+ }
17
+
18
+ let { class: className = '', header, children, footer }: Props = $props();
19
+ </script>
20
+
21
+ <section class={cn('hyvui-log', className)}>
22
+ <div class="hyvui-log-ambient" aria-hidden="true">
23
+ <div style:opacity="0.06">
24
+ <GridOverlay />
25
+ </div>
26
+ <ScanBand />
27
+ </div>
28
+ <div class="hyvui-log-inner">
29
+ {#if header}
30
+ <div class="hyvui-log-header">
31
+ {@render header()}
32
+ </div>
33
+ {/if}
34
+ <div class="hyvui-log-content">
35
+ {#if children}{@render children()}{/if}
36
+ </div>
37
+ {#if footer}
38
+ <div class="hyvui-log-footer">
39
+ {@render footer()}
40
+ </div>
41
+ {/if}
42
+ </div>
43
+ </section>
44
+
45
+ <style>
46
+ .hyvui-log {
47
+ position: relative;
48
+ min-height: 100dvh;
49
+ padding: var(--space-scene);
50
+ background-color: var(--bg);
51
+ }
52
+
53
+ .hyvui-log-ambient {
54
+ position: absolute;
55
+ inset: 0;
56
+ pointer-events: none;
57
+ }
58
+
59
+ .hyvui-log-inner {
60
+ position: relative;
61
+ display: flex;
62
+ flex-direction: column;
63
+ gap: calc(1.5rem * var(--reg-spacing-scale));
64
+ width: 100%;
65
+ }
66
+
67
+ .hyvui-log-content {
68
+ font-family: var(--font-mono);
69
+ border-left: 2px solid rgba(121, 166, 163, 0.18);
70
+ padding-left: 1.5rem;
71
+ }
72
+ </style>
@@ -1,92 +1,91 @@
1
- <script lang="ts">
2
- import { cn } from '../../utils/cn.js';
3
- import GridOverlay from '../ambient/GridOverlay.svelte';
4
- import type { Snippet } from 'svelte';
5
-
6
- interface Props {
7
- /** Section label rendered as a chapter expression above the heading. */
8
- chapter?: string;
9
- /** Additional CSS classes. */
10
- class?: string;
11
- /** The scene's title content. */
12
- heading?: Snippet;
13
- /** Prose content in the narrow left column. */
14
- copy?: Snippet;
15
- /** Open canvas area in the right column. */
16
- canvas?: Snippet;
17
- }
18
-
19
- let {
20
- chapter = '',
21
- class: className = '',
22
- heading,
23
- copy,
24
- canvas,
25
- }: Props = $props();
26
- </script>
27
-
28
- <section class={cn('hyvui-narrative', className)}>
29
- <div class="hyvui-narrative-grid-bg" aria-hidden="true" style:opacity="var(--reg-ornament-opacity)">
30
- <GridOverlay />
31
- </div>
32
- <div class="hyvui-narrative-grid">
33
- <div class="hyvui-narrative-copy">
34
- {#if chapter}
35
- <span class="expr-chapter">{chapter}</span>
36
- {/if}
37
- {#if heading}
38
- <div class="hyvui-narrative-heading">
39
- {@render heading()}
40
- </div>
41
- {/if}
42
- {#if copy}
43
- <div class="hyvui-narrative-prose">
44
- {@render copy()}
45
- </div>
46
- {/if}
47
- </div>
48
- {#if canvas}
49
- <div class="hyvui-narrative-canvas">
50
- {@render canvas()}
51
- </div>
52
- {/if}
53
- </div>
54
- </section>
55
-
56
- <style>
57
- .hyvui-narrative {
58
- position: relative;
59
- min-height: 100dvh;
60
- padding: var(--space-scene);
61
- display: flex;
62
- align-items: center;
63
- }
64
-
65
- .hyvui-narrative-grid-bg {
66
- position: absolute;
67
- inset: 0;
68
- pointer-events: none;
69
- }
70
-
71
- .hyvui-narrative-grid {
72
- position: relative;
73
- display: grid;
74
- grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr);
75
- gap: calc(2rem * var(--reg-spacing-scale));
76
- width: 100%;
77
- align-items: center;
78
- }
79
-
80
- .hyvui-narrative-copy {
81
- display: flex;
82
- flex-direction: column;
83
- gap: calc(1.25rem * var(--reg-spacing-scale));
84
- max-width: 30rem;
85
- }
86
-
87
- @media (max-width: 768px) {
88
- .hyvui-narrative-grid {
89
- grid-template-columns: 1fr;
90
- }
91
- }
92
- </style>
1
+ <script lang="ts">
2
+ import { cn } from '../../utils/cn.js';
3
+ import GridOverlay from '../ambient/GridOverlay.svelte';
4
+ import type { Snippet } from 'svelte';
5
+
6
+ interface Props {
7
+ /** Section label rendered as a chapter expression above the heading. */
8
+ chapter?: string;
9
+ /** Additional CSS classes. */
10
+ class?: string;
11
+ /** The scene's title content. */
12
+ heading?: Snippet;
13
+ /** Prose content in the narrow left column. */
14
+ copy?: Snippet;
15
+ /** Open canvas area in the right column. */
16
+ canvas?: Snippet;
17
+ }
18
+
19
+ let { chapter = '', class: className = '', heading, copy, canvas }: Props = $props();
20
+ </script>
21
+
22
+ <section class={cn('hyvui-narrative', className)}>
23
+ <div
24
+ class="hyvui-narrative-grid-bg"
25
+ aria-hidden="true"
26
+ style:opacity="var(--reg-ornament-opacity)"
27
+ >
28
+ <GridOverlay />
29
+ </div>
30
+ <div class="hyvui-narrative-grid">
31
+ <div class="hyvui-narrative-copy">
32
+ {#if chapter}
33
+ <span class="expr-chapter">{chapter}</span>
34
+ {/if}
35
+ {#if heading}
36
+ <div class="hyvui-narrative-heading">
37
+ {@render heading()}
38
+ </div>
39
+ {/if}
40
+ {#if copy}
41
+ <div class="hyvui-narrative-prose">
42
+ {@render copy()}
43
+ </div>
44
+ {/if}
45
+ </div>
46
+ {#if canvas}
47
+ <div class="hyvui-narrative-canvas">
48
+ {@render canvas()}
49
+ </div>
50
+ {/if}
51
+ </div>
52
+ </section>
53
+
54
+ <style>
55
+ .hyvui-narrative {
56
+ position: relative;
57
+ min-height: 100dvh;
58
+ padding: var(--space-scene);
59
+ display: flex;
60
+ align-items: center;
61
+ container-type: inline-size;
62
+ }
63
+
64
+ .hyvui-narrative-grid-bg {
65
+ position: absolute;
66
+ inset: 0;
67
+ pointer-events: none;
68
+ }
69
+
70
+ .hyvui-narrative-grid {
71
+ position: relative;
72
+ display: grid;
73
+ grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr);
74
+ gap: calc(2rem * var(--reg-spacing-scale));
75
+ width: 100%;
76
+ align-items: center;
77
+ }
78
+
79
+ .hyvui-narrative-copy {
80
+ display: flex;
81
+ flex-direction: column;
82
+ gap: calc(1.25rem * var(--reg-spacing-scale));
83
+ max-width: 30rem;
84
+ }
85
+
86
+ @container (max-width: var(--cq-md)) {
87
+ .hyvui-narrative-grid {
88
+ grid-template-columns: 1fr;
89
+ }
90
+ }
91
+ </style>