@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.
- package/README.md +294 -253
- package/dist/components/ambient/ArcaneVein.svelte +151 -0
- package/dist/components/ambient/ArcaneVein.svelte.d.ts +31 -0
- package/dist/components/ambient/BrassFiligree.svelte +109 -0
- package/dist/components/ambient/BrassFiligree.svelte.d.ts +20 -0
- package/dist/components/ambient/CornerBrackets.svelte +91 -87
- package/dist/components/ambient/CornerBrackets.svelte.d.ts +8 -0
- package/dist/components/ambient/CrystalShard.svelte +151 -0
- package/dist/components/ambient/CrystalShard.svelte.d.ts +19 -0
- package/dist/components/ambient/DataStream.svelte +117 -94
- package/dist/components/ambient/DataStream.svelte.d.ts +6 -0
- package/dist/components/ambient/EnergyArc.svelte +189 -0
- package/dist/components/ambient/EnergyArc.svelte.d.ts +32 -0
- package/dist/components/ambient/GlyphMark.svelte +75 -69
- package/dist/components/ambient/GlyphMark.svelte.d.ts +6 -0
- package/dist/components/ambient/GridOverlay.svelte +34 -28
- package/dist/components/ambient/GridOverlay.svelte.d.ts +8 -0
- package/dist/components/ambient/HexGrid.svelte +119 -0
- package/dist/components/ambient/HexGrid.svelte.d.ts +21 -0
- package/dist/components/ambient/ParallaxLayer.svelte +45 -41
- package/dist/components/ambient/ParallaxLayer.svelte.d.ts +7 -0
- package/dist/components/ambient/ScanBand.svelte +103 -91
- package/dist/components/ambient/ScanBand.svelte.d.ts +8 -0
- package/dist/components/ambient/ShimmerCloud.svelte +180 -0
- package/dist/components/ambient/ShimmerCloud.svelte.d.ts +21 -0
- package/dist/components/ambient/SignalRing.svelte +106 -100
- package/dist/components/ambient/SignalRing.svelte.d.ts +6 -0
- package/dist/components/ambient/ThreadLine.svelte +78 -78
- package/dist/components/ambient/ThreadLine.svelte.d.ts +7 -0
- package/dist/components/ambient/Vignette.svelte +30 -26
- package/dist/components/ambient/Vignette.svelte.d.ts +6 -0
- package/dist/components/depth/DepthLayer.svelte +30 -27
- package/dist/components/depth/DepthLayer.svelte.d.ts +8 -0
- package/dist/components/depth/DepthStage.svelte +67 -62
- package/dist/components/depth/DepthStage.svelte.d.ts +8 -0
- package/dist/components/depth/FloatCard.svelte +129 -104
- package/dist/components/depth/FloatCard.svelte.d.ts +8 -0
- package/dist/components/depth/HorizonGrid.svelte +241 -160
- package/dist/components/depth/HorizonGrid.svelte.d.ts +9 -0
- package/dist/components/depth/Plinth.svelte +62 -57
- package/dist/components/depth/Plinth.svelte.d.ts +10 -0
- package/dist/components/display/Avatar.svelte +69 -69
- package/dist/components/display/Avatar.svelte.d.ts +5 -0
- package/dist/components/display/Badge.svelte +75 -63
- package/dist/components/display/Badge.svelte.d.ts +6 -0
- package/dist/components/display/Blockquote.svelte +35 -34
- package/dist/components/display/Blockquote.svelte.d.ts +4 -0
- package/dist/components/display/CodeBlock.svelte +76 -76
- package/dist/components/display/CodeBlock.svelte.d.ts +5 -0
- package/dist/components/display/MetricCard.svelte +100 -83
- package/dist/components/display/MetricCard.svelte.d.ts +6 -0
- package/dist/components/display/Table.svelte +106 -104
- package/dist/components/display/Table.svelte.d.ts +7 -0
- package/dist/components/feedback/Alert.svelte +95 -76
- package/dist/components/feedback/Alert.svelte.d.ts +6 -0
- package/dist/components/feedback/EmptyState.svelte +75 -68
- package/dist/components/feedback/EmptyState.svelte.d.ts +7 -0
- package/dist/components/feedback/ErrorState.svelte +78 -73
- package/dist/components/feedback/ErrorState.svelte.d.ts +5 -0
- package/dist/components/feedback/Skeleton.svelte +58 -52
- package/dist/components/feedback/Skeleton.svelte.d.ts +6 -0
- package/dist/components/feedback/StatusDot.svelte +84 -54
- package/dist/components/feedback/StatusDot.svelte.d.ts +6 -0
- package/dist/components/feedback/StatusLine.svelte +128 -122
- package/dist/components/feedback/StatusLine.svelte.d.ts +6 -0
- package/dist/components/feedback/Toast.svelte +144 -136
- package/dist/components/feedback/Toast.svelte.d.ts +10 -0
- package/dist/components/inputs/Button.svelte +310 -237
- package/dist/components/inputs/Button.svelte.d.ts +8 -0
- package/dist/components/inputs/Checkbox.svelte +109 -105
- package/dist/components/inputs/Checkbox.svelte.d.ts +5 -0
- package/dist/components/inputs/FileUpload.svelte +170 -163
- package/dist/components/inputs/FileUpload.svelte.d.ts +5 -0
- package/dist/components/inputs/Input.svelte +153 -147
- package/dist/components/inputs/Input.svelte.d.ts +7 -0
- package/dist/components/inputs/Select.svelte +164 -150
- package/dist/components/inputs/Select.svelte.d.ts +8 -0
- package/dist/components/inputs/Textarea.svelte +160 -154
- package/dist/components/inputs/Textarea.svelte.d.ts +6 -0
- package/dist/components/inputs/Toggle.svelte +125 -120
- package/dist/components/inputs/Toggle.svelte.d.ts +5 -0
- package/dist/components/layout/Card.svelte +81 -76
- package/dist/components/layout/Card.svelte.d.ts +11 -0
- package/dist/components/layout/Drawer.svelte +140 -109
- package/dist/components/layout/Drawer.svelte.d.ts +6 -0
- package/dist/components/layout/Grid.svelte +128 -43
- package/dist/components/layout/Grid.svelte.d.ts +18 -2
- package/dist/components/layout/Modal.svelte +191 -159
- package/dist/components/layout/Modal.svelte.d.ts +10 -0
- package/dist/components/layout/Panel.svelte +58 -54
- package/dist/components/layout/Panel.svelte.d.ts +9 -0
- package/dist/components/layout/Popover.svelte +188 -67
- package/dist/components/layout/Popover.svelte.d.ts +19 -1
- package/dist/components/layout/Stack.svelte +65 -53
- package/dist/components/layout/Stack.svelte.d.ts +12 -0
- package/dist/components/navigation/Breadcrumb.svelte +78 -73
- package/dist/components/navigation/Breadcrumb.svelte.d.ts +8 -0
- package/dist/components/navigation/DropdownMenu.svelte +179 -124
- package/dist/components/navigation/DropdownMenu.svelte.d.ts +24 -2
- package/dist/components/navigation/SidebarNav.svelte +96 -90
- package/dist/components/navigation/SidebarNav.svelte.d.ts +9 -0
- package/dist/components/navigation/Tabs.svelte +106 -86
- package/dist/components/navigation/Tabs.svelte.d.ts +8 -0
- package/dist/components/navigation/Topbar.svelte +94 -85
- package/dist/components/navigation/Topbar.svelte.d.ts +9 -0
- package/dist/components/patterns/ActionBar.svelte +82 -76
- package/dist/components/patterns/ActionBar.svelte.d.ts +10 -0
- package/dist/components/patterns/ChapterMark.svelte +152 -0
- package/dist/components/patterns/ChapterMark.svelte.d.ts +19 -0
- package/dist/components/patterns/ConfirmDialog.svelte +75 -64
- package/dist/components/patterns/ConfirmDialog.svelte.d.ts +12 -0
- package/dist/components/patterns/DepthPortal.svelte +123 -0
- package/dist/components/patterns/DepthPortal.svelte.d.ts +24 -0
- package/dist/components/patterns/Manifesto.svelte +171 -0
- package/dist/components/patterns/Manifesto.svelte.d.ts +25 -0
- package/dist/components/patterns/PageHeader.svelte +117 -114
- package/dist/components/patterns/PageHeader.svelte.d.ts +8 -0
- package/dist/components/patterns/PullQuote.svelte +145 -0
- package/dist/components/patterns/PullQuote.svelte.d.ts +23 -0
- package/dist/components/patterns/RegisterSwitcher.svelte +132 -0
- package/dist/components/patterns/RegisterSwitcher.svelte.d.ts +21 -0
- package/dist/components/patterns/SearchBar.svelte +59 -59
- package/dist/components/patterns/SearchBar.svelte.d.ts +5 -0
- package/dist/components/patterns/ShowcaseFrame.svelte +117 -0
- package/dist/components/patterns/ShowcaseFrame.svelte.d.ts +28 -0
- package/dist/components/patterns/TerminalBoot.svelte +118 -104
- package/dist/components/patterns/TerminalBoot.svelte.d.ts +12 -0
- package/dist/components/primitives/Divider.svelte +56 -29
- package/dist/components/primitives/Divider.svelte.d.ts +5 -0
- package/dist/components/primitives/Icon.svelte +53 -49
- package/dist/components/primitives/Icon.svelte.d.ts +9 -0
- package/dist/components/primitives/Label.svelte +45 -44
- package/dist/components/primitives/Label.svelte.d.ts +6 -0
- package/dist/components/primitives/Surface.svelte +154 -87
- package/dist/components/primitives/Surface.svelte.d.ts +7 -0
- package/dist/components/primitives/Text.svelte +130 -98
- package/dist/components/primitives/Text.svelte.d.ts +7 -0
- package/dist/components/scenes/ArchiveScene.svelte +102 -95
- package/dist/components/scenes/ArchiveScene.svelte.d.ts +17 -1
- package/dist/components/scenes/DepthScene.svelte +128 -0
- package/dist/components/scenes/DepthScene.svelte.d.ts +36 -0
- package/dist/components/scenes/LogScene.svelte +86 -77
- package/dist/components/scenes/LogScene.svelte.d.ts +14 -0
- package/dist/components/scenes/NarrativeScene.svelte +100 -92
- package/dist/components/scenes/NarrativeScene.svelte.d.ts +9 -0
- package/dist/components/scenes/ReadoutScene.svelte +131 -107
- package/dist/components/scenes/ReadoutScene.svelte.d.ts +14 -1
- package/dist/components/scenes/StageScene.svelte +111 -104
- package/dist/components/scenes/StageScene.svelte.d.ts +14 -0
- package/dist/components/system/AppShell.svelte +62 -0
- package/dist/components/system/AppShell.svelte.d.ts +32 -0
- package/dist/examples/ArcaneShard.svelte +364 -0
- package/dist/examples/ArcaneShard.svelte.d.ts +3 -0
- package/dist/examples/FieldReport.svelte +226 -223
- package/dist/examples/HextechForge.svelte +324 -0
- package/dist/examples/HextechForge.svelte.d.ts +3 -0
- package/dist/examples/ObservationDeck.svelte +333 -317
- package/dist/examples/SignalLost.svelte +191 -191
- package/dist/index.d.ts +15 -1
- package/dist/index.js +16 -1
- package/dist/styles.css +115 -0
- package/dist/system/actions/echo.js +21 -12
- package/dist/system/actions/resolve.js +28 -14
- package/dist/system/actions/reveal.js +2 -2
- package/dist/system/actions/surface.js +12 -2
- package/dist/system/depth/depth.css +49 -49
- package/dist/system/depth/depth.js +1 -1
- package/dist/system/expressions.css +80 -80
- package/dist/system/override-template.css +72 -72
- package/dist/system/register.css +74 -74
- package/dist/system/register.d.ts +1 -1
- package/dist/system/register.js +5 -1
- package/dist/system/scroll-lock.d.ts +6 -0
- package/dist/system/scroll-lock.js +23 -0
- package/dist/tokens/arcane.css +96 -0
- package/dist/tokens/hextech.css +96 -0
- package/dist/tokens/tokens.css +102 -86
- package/dist/tokens/tokens.d.ts +41 -0
- package/dist/tokens/tokens.js +44 -3
- package/dist/utils/motion.js +1 -1
- package/package.json +71 -60
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Decorative glowing crack / energy conduit rendered as SVG.
|
|
6
|
+
* Parent must have `position: relative`. Renders `aria-hidden`.
|
|
7
|
+
*
|
|
8
|
+
* Under `hextech`: precise etched control line, traveling cyan dot.
|
|
9
|
+
* Under `arcane`: pulsing violet crack, traveling particle + glow.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* <div style="position: relative; height: 200px;">
|
|
13
|
+
* <ArcaneVein x1="10%" y1="0%" x2="90%" y2="100%" />
|
|
14
|
+
* </div>
|
|
15
|
+
*/
|
|
16
|
+
interface Props {
|
|
17
|
+
/** Start x (CSS %). */
|
|
18
|
+
x1?: string;
|
|
19
|
+
/** Start y (CSS %). */
|
|
20
|
+
y1?: string;
|
|
21
|
+
/** End x (CSS %). */
|
|
22
|
+
x2?: string;
|
|
23
|
+
/** End y (CSS %). */
|
|
24
|
+
y2?: string;
|
|
25
|
+
/** Duration of traveling particle. */
|
|
26
|
+
speed?: number;
|
|
27
|
+
/** Enable traveling particle animation. */
|
|
28
|
+
animated?: boolean;
|
|
29
|
+
/** Additional CSS classes. */
|
|
30
|
+
class?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let {
|
|
34
|
+
x1 = '0%',
|
|
35
|
+
y1 = '0%',
|
|
36
|
+
x2 = '100%',
|
|
37
|
+
y2 = '100%',
|
|
38
|
+
speed = 3,
|
|
39
|
+
animated = true,
|
|
40
|
+
class: className = ''
|
|
41
|
+
}: Props = $props();
|
|
42
|
+
|
|
43
|
+
const prefersReduced =
|
|
44
|
+
typeof window !== 'undefined'
|
|
45
|
+
? window.matchMedia('(prefers-reduced-motion: reduce)').matches
|
|
46
|
+
: false;
|
|
47
|
+
|
|
48
|
+
const dur = $derived(`${speed}s`);
|
|
49
|
+
const shouldAnimate = $derived(animated && !prefersReduced);
|
|
50
|
+
|
|
51
|
+
// Unique filter ID to avoid SVG filter collision when multiple veins are on a page.
|
|
52
|
+
const filterId = `av-glow-${Math.random().toString(36).slice(2, 8)}`;
|
|
53
|
+
</script>
|
|
54
|
+
|
|
55
|
+
<svg class={cn('hyvui-arcane-vein', className)} aria-hidden="true">
|
|
56
|
+
<defs>
|
|
57
|
+
<filter id={filterId} x="-50%" y="-50%" width="200%" height="200%">
|
|
58
|
+
<feGaussianBlur stdDeviation="2.5" result="blur" />
|
|
59
|
+
<feMerge>
|
|
60
|
+
<feMergeNode in="blur" />
|
|
61
|
+
<feMergeNode in="SourceGraphic" />
|
|
62
|
+
</feMerge>
|
|
63
|
+
</filter>
|
|
64
|
+
</defs>
|
|
65
|
+
|
|
66
|
+
<!-- glow halo (arcane only, separate pass) -->
|
|
67
|
+
<line
|
|
68
|
+
class="hyvui-av-halo"
|
|
69
|
+
{x1} {y1} {x2} {y2}
|
|
70
|
+
stroke-width="4"
|
|
71
|
+
filter="url(#{filterId})"
|
|
72
|
+
/>
|
|
73
|
+
|
|
74
|
+
<!-- main vein line -->
|
|
75
|
+
<line
|
|
76
|
+
class="hyvui-av-line"
|
|
77
|
+
{x1} {y1} {x2} {y2}
|
|
78
|
+
stroke-width="1"
|
|
79
|
+
/>
|
|
80
|
+
|
|
81
|
+
<!-- traveling particle -->
|
|
82
|
+
{#if shouldAnimate}
|
|
83
|
+
<circle class="hyvui-av-particle" r="2.5">
|
|
84
|
+
<animateMotion
|
|
85
|
+
dur={dur}
|
|
86
|
+
repeatCount="indefinite"
|
|
87
|
+
keyPoints="0;1"
|
|
88
|
+
keyTimes="0;1"
|
|
89
|
+
calcMode="linear"
|
|
90
|
+
>
|
|
91
|
+
<mpath>
|
|
92
|
+
<line {x1} {y1} {x2} {y2} />
|
|
93
|
+
</mpath>
|
|
94
|
+
</animateMotion>
|
|
95
|
+
<animate
|
|
96
|
+
attributeName="opacity"
|
|
97
|
+
values="0;0.9;0.9;0"
|
|
98
|
+
keyTimes="0;0.08;0.88;1"
|
|
99
|
+
dur={dur}
|
|
100
|
+
repeatCount="indefinite"
|
|
101
|
+
/>
|
|
102
|
+
</circle>
|
|
103
|
+
{/if}
|
|
104
|
+
</svg>
|
|
105
|
+
|
|
106
|
+
<style>
|
|
107
|
+
.hyvui-arcane-vein {
|
|
108
|
+
position: absolute;
|
|
109
|
+
inset: 0;
|
|
110
|
+
width: 100%;
|
|
111
|
+
height: 100%;
|
|
112
|
+
pointer-events: none;
|
|
113
|
+
overflow: visible;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* ── default (field-notebook) ─────────────────────────────────────── */
|
|
117
|
+
.hyvui-av-halo { stroke: transparent; }
|
|
118
|
+
.hyvui-av-line { stroke: rgba(199, 156, 87, 0.22); }
|
|
119
|
+
.hyvui-av-particle { fill: rgba(199, 156, 87, 0.7); }
|
|
120
|
+
|
|
121
|
+
/* ── hextech: etched control line, cyan particle ──────────────────── */
|
|
122
|
+
:global([data-register='hextech']) .hyvui-av-halo {
|
|
123
|
+
stroke: rgba(93, 217, 240, 0.08);
|
|
124
|
+
}
|
|
125
|
+
:global([data-register='hextech']) .hyvui-av-line {
|
|
126
|
+
stroke: rgba(93, 217, 240, 0.4);
|
|
127
|
+
stroke-dasharray: 6 3;
|
|
128
|
+
}
|
|
129
|
+
:global([data-register='hextech']) .hyvui-av-particle {
|
|
130
|
+
fill: rgba(184, 230, 242, 0.95);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* ── arcane: glowing crack, violet bleed particle ─────────────────── */
|
|
134
|
+
:global([data-register='arcane']) .hyvui-av-halo {
|
|
135
|
+
stroke: rgba(184, 69, 201, 0.28);
|
|
136
|
+
}
|
|
137
|
+
:global([data-register='arcane']) .hyvui-av-line {
|
|
138
|
+
stroke: rgba(184, 69, 201, 0.7);
|
|
139
|
+
stroke-dasharray: none;
|
|
140
|
+
}
|
|
141
|
+
:global([data-register='arcane']) .hyvui-av-particle {
|
|
142
|
+
fill: rgba(233, 76, 188, 1);
|
|
143
|
+
r: 3.5;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
@media (prefers-reduced-motion: reduce) {
|
|
147
|
+
.hyvui-av-particle {
|
|
148
|
+
display: none;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
</style>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decorative glowing crack / energy conduit rendered as SVG.
|
|
3
|
+
* Parent must have `position: relative`. Renders `aria-hidden`.
|
|
4
|
+
*
|
|
5
|
+
* Under `hextech`: precise etched control line, traveling cyan dot.
|
|
6
|
+
* Under `arcane`: pulsing violet crack, traveling particle + glow.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* <div style="position: relative; height: 200px;">
|
|
10
|
+
* <ArcaneVein x1="10%" y1="0%" x2="90%" y2="100%" />
|
|
11
|
+
* </div>
|
|
12
|
+
*/
|
|
13
|
+
interface Props {
|
|
14
|
+
/** Start x (CSS %). */
|
|
15
|
+
x1?: string;
|
|
16
|
+
/** Start y (CSS %). */
|
|
17
|
+
y1?: string;
|
|
18
|
+
/** End x (CSS %). */
|
|
19
|
+
x2?: string;
|
|
20
|
+
/** End y (CSS %). */
|
|
21
|
+
y2?: string;
|
|
22
|
+
/** Duration of traveling particle. */
|
|
23
|
+
speed?: number;
|
|
24
|
+
/** Enable traveling particle animation. */
|
|
25
|
+
animated?: boolean;
|
|
26
|
+
/** Additional CSS classes. */
|
|
27
|
+
class?: string;
|
|
28
|
+
}
|
|
29
|
+
declare const ArcaneVein: import("svelte").Component<Props, {}, "">;
|
|
30
|
+
type ArcaneVein = ReturnType<typeof ArcaneVein>;
|
|
31
|
+
export default ArcaneVein;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Decorative corner brackets with an Art Deco / Hextech filigree motif.
|
|
6
|
+
* Renders four corners as SVG ornaments. Parent must have `position: relative`.
|
|
7
|
+
* Under `hextech`: bright brass. Under `arcane`: subdued violet-tinted.
|
|
8
|
+
* Renders `aria-hidden`.
|
|
9
|
+
* @example
|
|
10
|
+
* <div style="position: relative; padding: 2rem;">
|
|
11
|
+
* <BrassFiligree size={40} />
|
|
12
|
+
* framed content
|
|
13
|
+
* </div>
|
|
14
|
+
*/
|
|
15
|
+
interface Props {
|
|
16
|
+
/** Arm length in pixels. */
|
|
17
|
+
size?: number;
|
|
18
|
+
/** Additional CSS classes. */
|
|
19
|
+
class?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let { size = 40, class: className = '' }: Props = $props();
|
|
23
|
+
|
|
24
|
+
// Filigree corner SVG path:
|
|
25
|
+
// - Two arms (top+left or equivalent) of the given length
|
|
26
|
+
// - Small interior notch at 45° angle (the "filigree" detail)
|
|
27
|
+
// - Tiny rivet dot at the corner apex
|
|
28
|
+
// All paths are for a top-left oriented corner; CSS rotation handles others.
|
|
29
|
+
const arm = $derived(size);
|
|
30
|
+
const notch = $derived(Math.round(size * 0.28));
|
|
31
|
+
const rivet = $derived(Math.round(size * 0.09));
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<div class={cn('hyvui-brass-filigree', className)} aria-hidden="true">
|
|
35
|
+
{#each ['tl', 'tr', 'bl', 'br'] as pos}
|
|
36
|
+
<svg
|
|
37
|
+
class="hyvui-bf-corner hyvui-bf-{pos}"
|
|
38
|
+
width={arm}
|
|
39
|
+
height={arm}
|
|
40
|
+
viewBox="0 0 {arm} {arm}"
|
|
41
|
+
fill="none"
|
|
42
|
+
>
|
|
43
|
+
<!-- main bracket arms -->
|
|
44
|
+
<polyline
|
|
45
|
+
class="hyvui-bf-arm"
|
|
46
|
+
points="{arm},1 1,1 1,{arm}"
|
|
47
|
+
stroke-width="1"
|
|
48
|
+
/>
|
|
49
|
+
<!-- interior notch (diagonal filigree detail) -->
|
|
50
|
+
<line
|
|
51
|
+
class="hyvui-bf-notch"
|
|
52
|
+
x1={notch}
|
|
53
|
+
y1="1"
|
|
54
|
+
x2="1"
|
|
55
|
+
y2={notch}
|
|
56
|
+
stroke-width="0.75"
|
|
57
|
+
/>
|
|
58
|
+
<!-- apex rivet dot -->
|
|
59
|
+
<circle class="hyvui-bf-rivet" cx="1" cy="1" r={rivet} />
|
|
60
|
+
</svg>
|
|
61
|
+
{/each}
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<style>
|
|
65
|
+
.hyvui-brass-filigree {
|
|
66
|
+
position: absolute;
|
|
67
|
+
inset: 0;
|
|
68
|
+
pointer-events: none;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.hyvui-bf-corner {
|
|
72
|
+
position: absolute;
|
|
73
|
+
overflow: visible;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.hyvui-bf-tl { top: 0; left: 0; }
|
|
77
|
+
.hyvui-bf-tr { top: 0; right: 0; transform: scaleX(-1); }
|
|
78
|
+
.hyvui-bf-bl { bottom: 0; left: 0; transform: scaleY(-1); }
|
|
79
|
+
.hyvui-bf-br { bottom: 0; right: 0; transform: scale(-1); }
|
|
80
|
+
|
|
81
|
+
/* ── default (field-notebook) ─────────────────────────────────────── */
|
|
82
|
+
.hyvui-bf-arm { stroke: rgba(199, 156, 87, 0.3); }
|
|
83
|
+
.hyvui-bf-notch { stroke: rgba(199, 156, 87, 0.15); }
|
|
84
|
+
.hyvui-bf-rivet { fill: rgba(199, 156, 87, 0.35); }
|
|
85
|
+
|
|
86
|
+
/* ── hextech: bright brass precision ──────────────────────────────── */
|
|
87
|
+
:global([data-register='hextech']) .hyvui-bf-arm {
|
|
88
|
+
stroke: rgba(212, 165, 116, 0.65);
|
|
89
|
+
stroke-width: 1.2px;
|
|
90
|
+
}
|
|
91
|
+
:global([data-register='hextech']) .hyvui-bf-notch {
|
|
92
|
+
stroke: rgba(93, 217, 240, 0.35);
|
|
93
|
+
}
|
|
94
|
+
:global([data-register='hextech']) .hyvui-bf-rivet {
|
|
95
|
+
fill: rgba(212, 165, 116, 0.8);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* ── arcane: dim violet-tinted, thinner ───────────────────────────── */
|
|
99
|
+
:global([data-register='arcane']) .hyvui-bf-arm {
|
|
100
|
+
stroke: rgba(184, 69, 201, 0.28);
|
|
101
|
+
stroke-width: 0.8px;
|
|
102
|
+
}
|
|
103
|
+
:global([data-register='arcane']) .hyvui-bf-notch {
|
|
104
|
+
stroke: rgba(233, 76, 188, 0.18);
|
|
105
|
+
}
|
|
106
|
+
:global([data-register='arcane']) .hyvui-bf-rivet {
|
|
107
|
+
fill: rgba(233, 76, 188, 0.3);
|
|
108
|
+
}
|
|
109
|
+
</style>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decorative corner brackets with an Art Deco / Hextech filigree motif.
|
|
3
|
+
* Renders four corners as SVG ornaments. Parent must have `position: relative`.
|
|
4
|
+
* Under `hextech`: bright brass. Under `arcane`: subdued violet-tinted.
|
|
5
|
+
* Renders `aria-hidden`.
|
|
6
|
+
* @example
|
|
7
|
+
* <div style="position: relative; padding: 2rem;">
|
|
8
|
+
* <BrassFiligree size={40} />
|
|
9
|
+
* framed content
|
|
10
|
+
* </div>
|
|
11
|
+
*/
|
|
12
|
+
interface Props {
|
|
13
|
+
/** Arm length in pixels. */
|
|
14
|
+
size?: number;
|
|
15
|
+
/** Additional CSS classes. */
|
|
16
|
+
class?: string;
|
|
17
|
+
}
|
|
18
|
+
declare const BrassFiligree: import("svelte").Component<Props, {}, "">;
|
|
19
|
+
type BrassFiligree = ReturnType<typeof BrassFiligree>;
|
|
20
|
+
export default BrassFiligree;
|
|
@@ -1,87 +1,91 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Decorative. Parent must have `position: relative`. Renders `aria-hidden`.
|
|
6
|
+
* @example
|
|
7
|
+
* <div style="position: relative; padding: 2rem;">
|
|
8
|
+
* <CornerBrackets size={24} />
|
|
9
|
+
* content framed by brackets
|
|
10
|
+
* </div>
|
|
11
|
+
*/
|
|
12
|
+
interface Props {
|
|
13
|
+
/** Bracket arm length in pixels. */
|
|
14
|
+
size?: number;
|
|
15
|
+
/** Bracket color. */
|
|
16
|
+
color?: string;
|
|
17
|
+
/** Additional CSS classes. */
|
|
18
|
+
class?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let { size = 32, color = 'rgba(199, 156, 87, 0.24)', class: className = '' }: Props = $props();
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<div class={cn('hyvui-corners', className)} aria-hidden="true">
|
|
25
|
+
<span
|
|
26
|
+
class="hyvui-corner hyvui-corner-tl"
|
|
27
|
+
style:width="{size}px"
|
|
28
|
+
style:height="{size}px"
|
|
29
|
+
style:border-color={color}
|
|
30
|
+
></span>
|
|
31
|
+
<span
|
|
32
|
+
class="hyvui-corner hyvui-corner-tr"
|
|
33
|
+
style:width="{size}px"
|
|
34
|
+
style:height="{size}px"
|
|
35
|
+
style:border-color={color}
|
|
36
|
+
></span>
|
|
37
|
+
<span
|
|
38
|
+
class="hyvui-corner hyvui-corner-bl"
|
|
39
|
+
style:width="{size}px"
|
|
40
|
+
style:height="{size}px"
|
|
41
|
+
style:border-color={color}
|
|
42
|
+
></span>
|
|
43
|
+
<span
|
|
44
|
+
class="hyvui-corner hyvui-corner-br"
|
|
45
|
+
style:width="{size}px"
|
|
46
|
+
style:height="{size}px"
|
|
47
|
+
style:border-color={color}
|
|
48
|
+
></span>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<style>
|
|
52
|
+
.hyvui-corners {
|
|
53
|
+
position: absolute;
|
|
54
|
+
inset: 0;
|
|
55
|
+
pointer-events: none;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.hyvui-corner {
|
|
59
|
+
position: absolute;
|
|
60
|
+
border-style: solid;
|
|
61
|
+
border-width: 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.hyvui-corner-tl {
|
|
65
|
+
top: 0;
|
|
66
|
+
left: 0;
|
|
67
|
+
border-top-width: 1px;
|
|
68
|
+
border-left-width: 1px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.hyvui-corner-tr {
|
|
72
|
+
top: 0;
|
|
73
|
+
right: 0;
|
|
74
|
+
border-top-width: 1px;
|
|
75
|
+
border-right-width: 1px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.hyvui-corner-bl {
|
|
79
|
+
bottom: 0;
|
|
80
|
+
left: 0;
|
|
81
|
+
border-bottom-width: 1px;
|
|
82
|
+
border-left-width: 1px;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.hyvui-corner-br {
|
|
86
|
+
bottom: 0;
|
|
87
|
+
right: 0;
|
|
88
|
+
border-bottom-width: 1px;
|
|
89
|
+
border-right-width: 1px;
|
|
90
|
+
}
|
|
91
|
+
</style>
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decorative. Parent must have `position: relative`. Renders `aria-hidden`.
|
|
3
|
+
* @example
|
|
4
|
+
* <div style="position: relative; padding: 2rem;">
|
|
5
|
+
* <CornerBrackets size={24} />
|
|
6
|
+
* content framed by brackets
|
|
7
|
+
* </div>
|
|
8
|
+
*/
|
|
1
9
|
interface Props {
|
|
2
10
|
/** Bracket arm length in pixels. */
|
|
3
11
|
size?: number;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../utils/cn.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Decorative faceted crystal accent. Adapts per register:
|
|
6
|
+
* hextech → flat cyan prism; arcane → jagged violet shard with glow.
|
|
7
|
+
* Renders `aria-hidden`.
|
|
8
|
+
* @example
|
|
9
|
+
* <CrystalShard size={48} />
|
|
10
|
+
* <CrystalShard size={32} animated={false} />
|
|
11
|
+
*/
|
|
12
|
+
interface Props {
|
|
13
|
+
/** Bounding size in pixels (width = size, height ~= size * 1.4). */
|
|
14
|
+
size?: number;
|
|
15
|
+
/** Enable breathing pulse. */
|
|
16
|
+
animated?: boolean;
|
|
17
|
+
/** Additional CSS classes. */
|
|
18
|
+
class?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let { size = 48, animated = true, class: className = '' }: Props = $props();
|
|
22
|
+
|
|
23
|
+
const prefersReduced =
|
|
24
|
+
typeof window !== 'undefined'
|
|
25
|
+
? window.matchMedia('(prefers-reduced-motion: reduce)').matches
|
|
26
|
+
: false;
|
|
27
|
+
|
|
28
|
+
const shouldAnimate = $derived(animated && !prefersReduced);
|
|
29
|
+
|
|
30
|
+
// Pointy-top crystal: two overlapping polygons for faceted look.
|
|
31
|
+
// Outer shard — tall diamond with offset peak
|
|
32
|
+
// Inner face — smaller highlight face giving depth
|
|
33
|
+
const w = $derived(size);
|
|
34
|
+
const h = $derived(Math.round(size * 1.4));
|
|
35
|
+
const cx = $derived(Math.round(w / 2));
|
|
36
|
+
|
|
37
|
+
// Outer polygon: asymmetric diamond (peak offset left for natural shard look)
|
|
38
|
+
const outerPoints = $derived(
|
|
39
|
+
`${Math.round(cx * 0.7)},2 ${w - 4},${Math.round(h * 0.32)} ${w - 8},${h - 4} ${Math.round(cx * 0.4)},${h - 2} 4,${Math.round(h * 0.72)}`
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
// Inner face: smaller, offset for "facet" depth
|
|
43
|
+
const innerPoints = $derived(
|
|
44
|
+
`${Math.round(cx * 0.7)},2 ${w - 4},${Math.round(h * 0.32)} ${Math.round(w * 0.6)},${Math.round(h * 0.55)}`
|
|
45
|
+
);
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<svg
|
|
49
|
+
class={cn(
|
|
50
|
+
'hyvui-crystal-shard',
|
|
51
|
+
shouldAnimate && 'hyvui-crystal-shard--animated',
|
|
52
|
+
className
|
|
53
|
+
)}
|
|
54
|
+
width={w}
|
|
55
|
+
height={h}
|
|
56
|
+
viewBox="0 0 {w} {h}"
|
|
57
|
+
fill="none"
|
|
58
|
+
aria-hidden="true"
|
|
59
|
+
>
|
|
60
|
+
<defs>
|
|
61
|
+
<filter id="cs-glow" x="-40%" y="-40%" width="180%" height="180%">
|
|
62
|
+
<feGaussianBlur stdDeviation="3" result="blur" />
|
|
63
|
+
<feMerge>
|
|
64
|
+
<feMergeNode in="blur" />
|
|
65
|
+
<feMergeNode in="SourceGraphic" />
|
|
66
|
+
</feMerge>
|
|
67
|
+
</filter>
|
|
68
|
+
</defs>
|
|
69
|
+
|
|
70
|
+
<!-- outer shard body -->
|
|
71
|
+
<polygon class="hyvui-cs-body" points={outerPoints} />
|
|
72
|
+
<!-- inner facet face -->
|
|
73
|
+
<polygon class="hyvui-cs-face" points={innerPoints} />
|
|
74
|
+
<!-- edge highlight line -->
|
|
75
|
+
<polyline
|
|
76
|
+
class="hyvui-cs-edge"
|
|
77
|
+
points="{Math.round(cx * 0.7)},2 {w - 4},{Math.round(h * 0.32)}"
|
|
78
|
+
/>
|
|
79
|
+
</svg>
|
|
80
|
+
|
|
81
|
+
<style>
|
|
82
|
+
.hyvui-crystal-shard {
|
|
83
|
+
display: block;
|
|
84
|
+
pointer-events: none;
|
|
85
|
+
overflow: visible;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* ── default (field-notebook) ─────────────────────────────────────── */
|
|
89
|
+
.hyvui-cs-body {
|
|
90
|
+
fill: rgba(199, 156, 87, 0.06);
|
|
91
|
+
stroke: rgba(199, 156, 87, 0.3);
|
|
92
|
+
stroke-width: 1;
|
|
93
|
+
}
|
|
94
|
+
.hyvui-cs-face {
|
|
95
|
+
fill: rgba(199, 156, 87, 0.12);
|
|
96
|
+
stroke: none;
|
|
97
|
+
}
|
|
98
|
+
.hyvui-cs-edge {
|
|
99
|
+
stroke: rgba(199, 156, 87, 0.5);
|
|
100
|
+
stroke-width: 0.75;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* ── hextech: flat cyan prism, clean geometry ─────────────────────── */
|
|
104
|
+
:global([data-register='hextech']) .hyvui-cs-body {
|
|
105
|
+
fill: rgba(93, 217, 240, 0.08);
|
|
106
|
+
stroke: rgba(93, 217, 240, 0.55);
|
|
107
|
+
stroke-width: 1;
|
|
108
|
+
}
|
|
109
|
+
:global([data-register='hextech']) .hyvui-cs-face {
|
|
110
|
+
fill: rgba(93, 217, 240, 0.18);
|
|
111
|
+
}
|
|
112
|
+
:global([data-register='hextech']) .hyvui-cs-edge {
|
|
113
|
+
stroke: rgba(184, 230, 242, 0.8);
|
|
114
|
+
stroke-width: 1;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* ── arcane: violet shard with glow filter ────────────────────────── */
|
|
118
|
+
:global([data-register='arcane']) .hyvui-cs-body {
|
|
119
|
+
fill: rgba(184, 69, 201, 0.12);
|
|
120
|
+
stroke: rgba(184, 69, 201, 0.65);
|
|
121
|
+
stroke-width: 1;
|
|
122
|
+
filter: url(#cs-glow);
|
|
123
|
+
}
|
|
124
|
+
:global([data-register='arcane']) .hyvui-cs-face {
|
|
125
|
+
fill: rgba(233, 76, 188, 0.22);
|
|
126
|
+
}
|
|
127
|
+
:global([data-register='arcane']) .hyvui-cs-edge {
|
|
128
|
+
stroke: rgba(233, 76, 188, 0.9);
|
|
129
|
+
stroke-width: 1.2;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* ── pulse animation ─────────────────────────────────────────────── */
|
|
133
|
+
.hyvui-crystal-shard--animated .hyvui-cs-body {
|
|
134
|
+
animation: cs-breathe var(--orn-shimmer-rate, 4s) var(--orn-pulse-rhythm, ease-in-out) infinite;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
:global([data-register='arcane']) .hyvui-crystal-shard--animated .hyvui-cs-body {
|
|
138
|
+
animation: cs-breathe var(--orn-shimmer-rate, 2.4s) var(--orn-pulse-rhythm, ease-in-out) infinite;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@keyframes cs-breathe {
|
|
142
|
+
0%, 100% { opacity: 1; }
|
|
143
|
+
50% { opacity: 0.55; }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
@media (prefers-reduced-motion: reduce) {
|
|
147
|
+
.hyvui-crystal-shard--animated .hyvui-cs-body {
|
|
148
|
+
animation: none;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
</style>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decorative faceted crystal accent. Adapts per register:
|
|
3
|
+
* hextech → flat cyan prism; arcane → jagged violet shard with glow.
|
|
4
|
+
* Renders `aria-hidden`.
|
|
5
|
+
* @example
|
|
6
|
+
* <CrystalShard size={48} />
|
|
7
|
+
* <CrystalShard size={32} animated={false} />
|
|
8
|
+
*/
|
|
9
|
+
interface Props {
|
|
10
|
+
/** Bounding size in pixels (width = size, height ~= size * 1.4). */
|
|
11
|
+
size?: number;
|
|
12
|
+
/** Enable breathing pulse. */
|
|
13
|
+
animated?: boolean;
|
|
14
|
+
/** Additional CSS classes. */
|
|
15
|
+
class?: string;
|
|
16
|
+
}
|
|
17
|
+
declare const CrystalShard: import("svelte").Component<Props, {}, "">;
|
|
18
|
+
type CrystalShard = ReturnType<typeof CrystalShard>;
|
|
19
|
+
export default CrystalShard;
|