@autumnsgrove/groveengine 0.6.5 → 0.8.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/LICENSE +378 -0
- package/dist/auth/index.d.ts +1 -2
- package/dist/auth/index.js +8 -4
- package/dist/auth/session.d.ts +12 -31
- package/dist/auth/session.js +5 -103
- package/dist/components/custom/ContentWithGutter.svelte +22 -25
- package/dist/ui/components/content/RoadmapPreview.svelte +91 -0
- package/dist/ui/components/content/RoadmapPreview.svelte.d.ts +36 -0
- package/dist/ui/components/content/index.d.ts +1 -0
- package/dist/ui/components/content/index.js +1 -0
- package/dist/ui/components/nature/Logo.svelte +224 -0
- package/dist/ui/components/nature/Logo.svelte.d.ts +14 -0
- package/dist/ui/components/nature/botanical/Acorn.svelte +48 -0
- package/dist/ui/components/nature/botanical/Acorn.svelte.d.ts +8 -0
- package/dist/ui/components/nature/botanical/Berry.svelte +67 -0
- package/dist/ui/components/nature/botanical/Berry.svelte.d.ts +8 -0
- package/dist/ui/components/nature/botanical/DandelionPuff.svelte +98 -0
- package/dist/ui/components/nature/botanical/DandelionPuff.svelte.d.ts +8 -0
- package/dist/ui/components/nature/botanical/FallingLeavesLayer.svelte +170 -0
- package/dist/ui/components/nature/botanical/FallingLeavesLayer.svelte.d.ts +35 -0
- package/dist/ui/components/nature/botanical/FallingPetalsLayer.svelte +174 -0
- package/dist/ui/components/nature/botanical/FallingPetalsLayer.svelte.d.ts +25 -0
- package/dist/ui/components/nature/botanical/Leaf.svelte +77 -0
- package/dist/ui/components/nature/botanical/Leaf.svelte.d.ts +10 -0
- package/dist/ui/components/nature/botanical/LeafFalling.svelte +186 -0
- package/dist/ui/components/nature/botanical/LeafFalling.svelte.d.ts +22 -0
- package/dist/ui/components/nature/botanical/PetalFalling.svelte +266 -0
- package/dist/ui/components/nature/botanical/PetalFalling.svelte.d.ts +25 -0
- package/dist/ui/components/nature/botanical/PineCone.svelte +61 -0
- package/dist/ui/components/nature/botanical/PineCone.svelte.d.ts +7 -0
- package/dist/ui/components/nature/botanical/Vine.svelte +102 -0
- package/dist/ui/components/nature/botanical/Vine.svelte.d.ts +11 -0
- package/dist/ui/components/nature/botanical/index.d.ts +10 -0
- package/dist/ui/components/nature/botanical/index.js +11 -0
- package/dist/ui/components/nature/creatures/Bee.svelte +78 -0
- package/dist/ui/components/nature/creatures/Bee.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Bird.svelte +94 -0
- package/dist/ui/components/nature/creatures/Bird.svelte.d.ts +11 -0
- package/dist/ui/components/nature/creatures/BirdFlying.svelte +83 -0
- package/dist/ui/components/nature/creatures/BirdFlying.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Bluebird.svelte +95 -0
- package/dist/ui/components/nature/creatures/Bluebird.svelte.d.ts +12 -0
- package/dist/ui/components/nature/creatures/Butterfly.svelte +87 -0
- package/dist/ui/components/nature/creatures/Butterfly.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Cardinal.svelte +95 -0
- package/dist/ui/components/nature/creatures/Cardinal.svelte.d.ts +12 -0
- package/dist/ui/components/nature/creatures/Chickadee.svelte +97 -0
- package/dist/ui/components/nature/creatures/Chickadee.svelte.d.ts +12 -0
- package/dist/ui/components/nature/creatures/Deer.svelte +95 -0
- package/dist/ui/components/nature/creatures/Deer.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Firefly.svelte +111 -0
- package/dist/ui/components/nature/creatures/Firefly.svelte.d.ts +10 -0
- package/dist/ui/components/nature/creatures/Owl.svelte +91 -0
- package/dist/ui/components/nature/creatures/Owl.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Rabbit.svelte +90 -0
- package/dist/ui/components/nature/creatures/Rabbit.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Robin.svelte +98 -0
- package/dist/ui/components/nature/creatures/Robin.svelte.d.ts +12 -0
- package/dist/ui/components/nature/creatures/Squirrel.svelte +97 -0
- package/dist/ui/components/nature/creatures/Squirrel.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/index.d.ts +13 -0
- package/dist/ui/components/nature/creatures/index.js +14 -0
- package/dist/ui/components/nature/ground/Bush.svelte +57 -0
- package/dist/ui/components/nature/ground/Bush.svelte.d.ts +10 -0
- package/dist/ui/components/nature/ground/Crocus.svelte +83 -0
- package/dist/ui/components/nature/ground/Crocus.svelte.d.ts +12 -0
- package/dist/ui/components/nature/ground/Daffodil.svelte +75 -0
- package/dist/ui/components/nature/ground/Daffodil.svelte.d.ts +11 -0
- package/dist/ui/components/nature/ground/Fern.svelte +72 -0
- package/dist/ui/components/nature/ground/Fern.svelte.d.ts +10 -0
- package/dist/ui/components/nature/ground/FlowerWild.svelte +60 -0
- package/dist/ui/components/nature/ground/FlowerWild.svelte.d.ts +10 -0
- package/dist/ui/components/nature/ground/GrassTuft.svelte +49 -0
- package/dist/ui/components/nature/ground/GrassTuft.svelte.d.ts +10 -0
- package/dist/ui/components/nature/ground/Log.svelte +42 -0
- package/dist/ui/components/nature/ground/Log.svelte.d.ts +7 -0
- package/dist/ui/components/nature/ground/Mushroom.svelte +48 -0
- package/dist/ui/components/nature/ground/Mushroom.svelte.d.ts +9 -0
- package/dist/ui/components/nature/ground/MushroomCluster.svelte +41 -0
- package/dist/ui/components/nature/ground/MushroomCluster.svelte.d.ts +8 -0
- package/dist/ui/components/nature/ground/Rock.svelte +59 -0
- package/dist/ui/components/nature/ground/Rock.svelte.d.ts +8 -0
- package/dist/ui/components/nature/ground/Stump.svelte +44 -0
- package/dist/ui/components/nature/ground/Stump.svelte.d.ts +8 -0
- package/dist/ui/components/nature/ground/Tulip.svelte +79 -0
- package/dist/ui/components/nature/ground/Tulip.svelte.d.ts +11 -0
- package/dist/ui/components/nature/ground/index.d.ts +12 -0
- package/dist/ui/components/nature/ground/index.js +13 -0
- package/dist/ui/components/nature/index.d.ts +28 -0
- package/dist/ui/components/nature/index.js +38 -0
- package/dist/ui/components/nature/palette.d.ts +491 -0
- package/dist/ui/components/nature/palette.js +384 -0
- package/dist/ui/components/nature/sky/Cloud.svelte +122 -0
- package/dist/ui/components/nature/sky/Cloud.svelte.d.ts +11 -0
- package/dist/ui/components/nature/sky/CloudWispy.svelte +79 -0
- package/dist/ui/components/nature/sky/CloudWispy.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/Moon.svelte +60 -0
- package/dist/ui/components/nature/sky/Moon.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/Rainbow.svelte +101 -0
- package/dist/ui/components/nature/sky/Rainbow.svelte.d.ts +8 -0
- package/dist/ui/components/nature/sky/Star.svelte +84 -0
- package/dist/ui/components/nature/sky/Star.svelte.d.ts +10 -0
- package/dist/ui/components/nature/sky/StarCluster.svelte +85 -0
- package/dist/ui/components/nature/sky/StarCluster.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/StarShooting.svelte +90 -0
- package/dist/ui/components/nature/sky/StarShooting.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/Sun.svelte +70 -0
- package/dist/ui/components/nature/sky/Sun.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/index.d.ts +8 -0
- package/dist/ui/components/nature/sky/index.js +9 -0
- package/dist/ui/components/nature/structural/Birdhouse.svelte +53 -0
- package/dist/ui/components/nature/structural/Birdhouse.svelte.d.ts +8 -0
- package/dist/ui/components/nature/structural/Bridge.svelte +65 -0
- package/dist/ui/components/nature/structural/Bridge.svelte.d.ts +7 -0
- package/dist/ui/components/nature/structural/FencePost.svelte +54 -0
- package/dist/ui/components/nature/structural/FencePost.svelte.d.ts +8 -0
- package/dist/ui/components/nature/structural/GardenGate.svelte +70 -0
- package/dist/ui/components/nature/structural/GardenGate.svelte.d.ts +8 -0
- package/dist/ui/components/nature/structural/Lantern.svelte +113 -0
- package/dist/ui/components/nature/structural/Lantern.svelte.d.ts +10 -0
- package/dist/ui/components/nature/structural/Lattice.svelte +89 -0
- package/dist/ui/components/nature/structural/Lattice.svelte.d.ts +8 -0
- package/dist/ui/components/nature/structural/LatticeWithVine.svelte +89 -0
- package/dist/ui/components/nature/structural/LatticeWithVine.svelte.d.ts +11 -0
- package/dist/ui/components/nature/structural/StonePath.svelte +48 -0
- package/dist/ui/components/nature/structural/StonePath.svelte.d.ts +7 -0
- package/dist/ui/components/nature/structural/index.d.ts +8 -0
- package/dist/ui/components/nature/structural/index.js +9 -0
- package/dist/ui/components/nature/trees/TreeAspen.svelte +163 -0
- package/dist/ui/components/nature/trees/TreeAspen.svelte.d.ts +11 -0
- package/dist/ui/components/nature/trees/TreeBirch.svelte +186 -0
- package/dist/ui/components/nature/trees/TreeBirch.svelte.d.ts +11 -0
- package/dist/ui/components/nature/trees/TreeCherry.svelte +108 -0
- package/dist/ui/components/nature/trees/TreeCherry.svelte.d.ts +11 -0
- package/dist/ui/components/nature/trees/TreePine.svelte +79 -0
- package/dist/ui/components/nature/trees/TreePine.svelte.d.ts +11 -0
- package/dist/ui/components/nature/trees/index.d.ts +4 -0
- package/dist/ui/components/nature/trees/index.js +5 -0
- package/dist/ui/components/nature/water/LilyPad.svelte +99 -0
- package/dist/ui/components/nature/water/LilyPad.svelte.d.ts +10 -0
- package/dist/ui/components/nature/water/Pond.svelte +104 -0
- package/dist/ui/components/nature/water/Pond.svelte.d.ts +8 -0
- package/dist/ui/components/nature/water/Reeds.svelte +85 -0
- package/dist/ui/components/nature/water/Reeds.svelte.d.ts +11 -0
- package/dist/ui/components/nature/water/Stream.svelte +98 -0
- package/dist/ui/components/nature/water/Stream.svelte.d.ts +8 -0
- package/dist/ui/components/nature/water/index.d.ts +4 -0
- package/dist/ui/components/nature/water/index.js +5 -0
- package/dist/ui/components/nature/weather/SnowfallLayer.svelte +175 -0
- package/dist/ui/components/nature/weather/SnowfallLayer.svelte.d.ts +25 -0
- package/dist/ui/components/nature/weather/Snowflake.svelte +99 -0
- package/dist/ui/components/nature/weather/Snowflake.svelte.d.ts +11 -0
- package/dist/ui/components/nature/weather/SnowflakeFalling.svelte +162 -0
- package/dist/ui/components/nature/weather/SnowflakeFalling.svelte.d.ts +23 -0
- package/dist/ui/components/nature/weather/index.d.ts +3 -0
- package/dist/ui/components/nature/weather/index.js +4 -0
- package/dist/ui/components/ui/Glass.svelte +158 -0
- package/dist/ui/components/ui/Glass.svelte.d.ts +52 -0
- package/dist/ui/components/ui/GlassButton.svelte +157 -0
- package/dist/ui/components/ui/GlassButton.svelte.d.ts +39 -0
- package/dist/ui/components/ui/GlassCard.svelte +160 -0
- package/dist/ui/components/ui/GlassCard.svelte.d.ts +39 -0
- package/dist/ui/components/ui/GlassConfirmDialog.svelte +208 -0
- package/dist/ui/components/ui/GlassConfirmDialog.svelte.d.ts +52 -0
- package/dist/ui/components/ui/GlassLogo.svelte +422 -0
- package/dist/ui/components/ui/GlassLogo.svelte.d.ts +23 -0
- package/dist/ui/components/ui/GlassNavbar.svelte +120 -0
- package/dist/ui/components/ui/GlassNavbar.svelte.d.ts +42 -0
- package/dist/ui/components/ui/GlassOverlay.svelte +93 -0
- package/dist/ui/components/ui/GlassOverlay.svelte.d.ts +33 -0
- package/dist/ui/components/ui/Logo.svelte +47 -52
- package/dist/ui/components/ui/Logo.svelte.d.ts +4 -3
- package/dist/ui/components/ui/index.d.ts +7 -0
- package/dist/ui/components/ui/index.js +8 -0
- package/dist/ui/styles/grove.css +151 -1
- package/dist/utils/gutter.d.ts +2 -8
- package/dist/utils/markdown.d.ts +1 -0
- package/dist/utils/markdown.js +32 -11
- package/package.json +31 -22
- package/static/fonts/alagard.ttf +0 -0
- package/static/robots.txt +34 -1
- package/dist/auth/jwt.d.ts +0 -20
- package/dist/auth/jwt.js +0 -123
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
interface Props {
|
|
8
|
+
class?: string;
|
|
9
|
+
opacity?: number;
|
|
10
|
+
animate?: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
class: className = 'w-32 h-16',
|
|
15
|
+
opacity = 0.6,
|
|
16
|
+
animate = false
|
|
17
|
+
}: Props = $props();
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<!-- Rainbow arc -->
|
|
21
|
+
<svg class="{className} {animate ? 'fade-in' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 100">
|
|
22
|
+
<defs>
|
|
23
|
+
<!-- Rainbow gradient arcs -->
|
|
24
|
+
<linearGradient id="rainbow-red" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
25
|
+
<stop offset="0%" stop-color="#ef4444" stop-opacity="0" />
|
|
26
|
+
<stop offset="20%" stop-color="#ef4444" stop-opacity="1" />
|
|
27
|
+
<stop offset="80%" stop-color="#ef4444" stop-opacity="1" />
|
|
28
|
+
<stop offset="100%" stop-color="#ef4444" stop-opacity="0" />
|
|
29
|
+
</linearGradient>
|
|
30
|
+
</defs>
|
|
31
|
+
|
|
32
|
+
<g opacity={opacity}>
|
|
33
|
+
<!-- Red (outer) -->
|
|
34
|
+
<path
|
|
35
|
+
fill="none"
|
|
36
|
+
stroke="#ef4444"
|
|
37
|
+
stroke-width="8"
|
|
38
|
+
d="M10 100 Q10 20 100 20 Q190 20 190 100"
|
|
39
|
+
opacity="0.8"
|
|
40
|
+
/>
|
|
41
|
+
<!-- Orange -->
|
|
42
|
+
<path
|
|
43
|
+
fill="none"
|
|
44
|
+
stroke="#f97316"
|
|
45
|
+
stroke-width="8"
|
|
46
|
+
d="M20 100 Q20 30 100 30 Q180 30 180 100"
|
|
47
|
+
opacity="0.8"
|
|
48
|
+
/>
|
|
49
|
+
<!-- Yellow -->
|
|
50
|
+
<path
|
|
51
|
+
fill="none"
|
|
52
|
+
stroke="#eab308"
|
|
53
|
+
stroke-width="8"
|
|
54
|
+
d="M30 100 Q30 40 100 40 Q170 40 170 100"
|
|
55
|
+
opacity="0.8"
|
|
56
|
+
/>
|
|
57
|
+
<!-- Green -->
|
|
58
|
+
<path
|
|
59
|
+
fill="none"
|
|
60
|
+
stroke="#22c55e"
|
|
61
|
+
stroke-width="8"
|
|
62
|
+
d="M40 100 Q40 50 100 50 Q160 50 160 100"
|
|
63
|
+
opacity="0.8"
|
|
64
|
+
/>
|
|
65
|
+
<!-- Blue -->
|
|
66
|
+
<path
|
|
67
|
+
fill="none"
|
|
68
|
+
stroke="#3b82f6"
|
|
69
|
+
stroke-width="8"
|
|
70
|
+
d="M50 100 Q50 60 100 60 Q150 60 150 100"
|
|
71
|
+
opacity="0.8"
|
|
72
|
+
/>
|
|
73
|
+
<!-- Indigo -->
|
|
74
|
+
<path
|
|
75
|
+
fill="none"
|
|
76
|
+
stroke="#6366f1"
|
|
77
|
+
stroke-width="8"
|
|
78
|
+
d="M60 100 Q60 70 100 70 Q140 70 140 100"
|
|
79
|
+
opacity="0.8"
|
|
80
|
+
/>
|
|
81
|
+
<!-- Violet (inner) -->
|
|
82
|
+
<path
|
|
83
|
+
fill="none"
|
|
84
|
+
stroke="#a855f7"
|
|
85
|
+
stroke-width="8"
|
|
86
|
+
d="M70 100 Q70 80 100 80 Q130 80 130 100"
|
|
87
|
+
opacity="0.8"
|
|
88
|
+
/>
|
|
89
|
+
</g>
|
|
90
|
+
</svg>
|
|
91
|
+
|
|
92
|
+
<style>
|
|
93
|
+
@keyframes fade-in {
|
|
94
|
+
0% { opacity: 0; }
|
|
95
|
+
100% { opacity: 1; }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.fade-in {
|
|
99
|
+
animation: fade-in 3s ease-out forwards;
|
|
100
|
+
}
|
|
101
|
+
</style>
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import { accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
color?: string;
|
|
12
|
+
animate?: boolean;
|
|
13
|
+
variant?: 'twinkle' | 'point' | 'burst' | 'classic' | 'tiny';
|
|
14
|
+
speed?: 'slow' | 'normal' | 'fast';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
class: className = 'w-3 h-3',
|
|
19
|
+
color,
|
|
20
|
+
animate = true,
|
|
21
|
+
variant = 'twinkle',
|
|
22
|
+
speed = 'normal'
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
const starColor = $derived(color ?? accents.sky.star);
|
|
26
|
+
|
|
27
|
+
const duration = $derived(
|
|
28
|
+
{
|
|
29
|
+
slow: '4s',
|
|
30
|
+
normal: '2s',
|
|
31
|
+
fast: '1s'
|
|
32
|
+
}[speed]
|
|
33
|
+
);
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<!-- Star -->
|
|
37
|
+
<svg
|
|
38
|
+
class="{className} {animate ? 'twinkle' : ''}"
|
|
39
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
40
|
+
viewBox="0 0 20 20"
|
|
41
|
+
style="--twinkle-duration: {duration}"
|
|
42
|
+
>
|
|
43
|
+
{#if variant === 'twinkle'}
|
|
44
|
+
<!-- 4-point twinkle star -->
|
|
45
|
+
<path
|
|
46
|
+
fill={starColor}
|
|
47
|
+
d="M10 0 L11 8 L20 10 L11 12 L10 20 L9 12 L0 10 L9 8 Z"
|
|
48
|
+
/>
|
|
49
|
+
{:else if variant === 'point'}
|
|
50
|
+
<!-- Simple point -->
|
|
51
|
+
<circle fill={starColor} cx="10" cy="10" r="3" />
|
|
52
|
+
<!-- Subtle glow -->
|
|
53
|
+
<circle fill={starColor} cx="10" cy="10" r="6" opacity="0.3" />
|
|
54
|
+
{:else if variant === 'burst'}
|
|
55
|
+
<!-- Starburst (8-point) -->
|
|
56
|
+
<path
|
|
57
|
+
fill={starColor}
|
|
58
|
+
d="M10 0 L11 7 L18 4 L13 9 L20 10 L13 11 L18 16 L11 13 L10 20 L9 13 L2 16 L7 11 L0 10 L7 9 L2 4 L9 7 Z"
|
|
59
|
+
/>
|
|
60
|
+
{:else if variant === 'classic'}
|
|
61
|
+
<!-- Classic 5-point star -->
|
|
62
|
+
<polygon
|
|
63
|
+
fill={starColor}
|
|
64
|
+
points="10,0 12.5,7.5 20,7.5 14,12 16.5,20 10,15 3.5,20 6,12 0,7.5 7.5,7.5"
|
|
65
|
+
/>
|
|
66
|
+
{:else if variant === 'tiny'}
|
|
67
|
+
<!-- Tiny dot star -->
|
|
68
|
+
<circle fill={starColor} cx="10" cy="10" r="2" />
|
|
69
|
+
{/if}
|
|
70
|
+
</svg>
|
|
71
|
+
|
|
72
|
+
<style>
|
|
73
|
+
@keyframes twinkle {
|
|
74
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
75
|
+
25% { opacity: 0.7; transform: scale(0.9); }
|
|
76
|
+
50% { opacity: 0.4; transform: scale(0.75); }
|
|
77
|
+
75% { opacity: 0.8; transform: scale(0.95); }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.twinkle {
|
|
81
|
+
animation: twinkle var(--twinkle-duration, 2s) ease-in-out infinite;
|
|
82
|
+
animation-delay: var(--twinkle-delay, 0s);
|
|
83
|
+
}
|
|
84
|
+
</style>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
color?: string;
|
|
4
|
+
animate?: boolean;
|
|
5
|
+
variant?: 'twinkle' | 'point' | 'burst' | 'classic' | 'tiny';
|
|
6
|
+
speed?: 'slow' | 'normal' | 'fast';
|
|
7
|
+
}
|
|
8
|
+
declare const Star: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type Star = ReturnType<typeof Star>;
|
|
10
|
+
export default Star;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import { accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
color?: string;
|
|
12
|
+
animate?: boolean;
|
|
13
|
+
density?: 'sparse' | 'normal' | 'dense';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
class: className = 'w-16 h-16',
|
|
18
|
+
color,
|
|
19
|
+
animate = true,
|
|
20
|
+
density = 'normal'
|
|
21
|
+
}: Props = $props();
|
|
22
|
+
|
|
23
|
+
const starColor = $derived(color ?? accents.sky.star);
|
|
24
|
+
|
|
25
|
+
// Generate stars based on density
|
|
26
|
+
const starCounts = { sparse: 5, normal: 9, dense: 15 };
|
|
27
|
+
const count = $derived(starCounts[density]);
|
|
28
|
+
|
|
29
|
+
// Deterministic star positions for consistent rendering
|
|
30
|
+
const starPositions = [
|
|
31
|
+
{ x: 25, y: 20, size: 3, delay: 0 },
|
|
32
|
+
{ x: 60, y: 15, size: 2, delay: 0.5 },
|
|
33
|
+
{ x: 80, y: 35, size: 4, delay: 0.2 },
|
|
34
|
+
{ x: 15, y: 50, size: 2, delay: 0.8 },
|
|
35
|
+
{ x: 45, y: 45, size: 3, delay: 0.3 },
|
|
36
|
+
{ x: 70, y: 60, size: 2, delay: 1.1 },
|
|
37
|
+
{ x: 30, y: 75, size: 3, delay: 0.6 },
|
|
38
|
+
{ x: 55, y: 80, size: 2, delay: 0.9 },
|
|
39
|
+
{ x: 85, y: 75, size: 3, delay: 0.4 },
|
|
40
|
+
{ x: 10, y: 30, size: 2, delay: 1.3 },
|
|
41
|
+
{ x: 40, y: 10, size: 2, delay: 0.7 },
|
|
42
|
+
{ x: 90, y: 20, size: 2, delay: 1.0 },
|
|
43
|
+
{ x: 50, y: 60, size: 2, delay: 1.2 },
|
|
44
|
+
{ x: 20, y: 85, size: 2, delay: 0.1 },
|
|
45
|
+
{ x: 75, y: 90, size: 2, delay: 1.4 }
|
|
46
|
+
];
|
|
47
|
+
const stars = $derived(starPositions.slice(0, count));
|
|
48
|
+
</script>
|
|
49
|
+
|
|
50
|
+
<!-- Cluster of twinkling stars -->
|
|
51
|
+
<svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
52
|
+
{#each stars as star}
|
|
53
|
+
<g
|
|
54
|
+
class={animate ? 'twinkle' : ''}
|
|
55
|
+
style="--twinkle-delay: {star.delay}s"
|
|
56
|
+
>
|
|
57
|
+
<!-- 4-point star shape -->
|
|
58
|
+
<path
|
|
59
|
+
fill={starColor}
|
|
60
|
+
d="M{star.x} {star.y - star.size}
|
|
61
|
+
L{star.x + star.size * 0.3} {star.y - star.size * 0.3}
|
|
62
|
+
L{star.x + star.size} {star.y}
|
|
63
|
+
L{star.x + star.size * 0.3} {star.y + star.size * 0.3}
|
|
64
|
+
L{star.x} {star.y + star.size}
|
|
65
|
+
L{star.x - star.size * 0.3} {star.y + star.size * 0.3}
|
|
66
|
+
L{star.x - star.size} {star.y}
|
|
67
|
+
L{star.x - star.size * 0.3} {star.y - star.size * 0.3} Z"
|
|
68
|
+
/>
|
|
69
|
+
</g>
|
|
70
|
+
{/each}
|
|
71
|
+
</svg>
|
|
72
|
+
|
|
73
|
+
<style>
|
|
74
|
+
@keyframes twinkle {
|
|
75
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
76
|
+
25% { opacity: 0.6; transform: scale(0.85); }
|
|
77
|
+
50% { opacity: 0.3; transform: scale(0.7); }
|
|
78
|
+
75% { opacity: 0.7; transform: scale(0.9); }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.twinkle {
|
|
82
|
+
animation: twinkle 3s ease-in-out infinite;
|
|
83
|
+
animation-delay: var(--twinkle-delay, 0s);
|
|
84
|
+
}
|
|
85
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
color?: string;
|
|
4
|
+
animate?: boolean;
|
|
5
|
+
density?: 'sparse' | 'normal' | 'dense';
|
|
6
|
+
}
|
|
7
|
+
declare const StarCluster: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type StarCluster = ReturnType<typeof StarCluster>;
|
|
9
|
+
export default StarCluster;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import { accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
color?: string;
|
|
12
|
+
animate?: boolean;
|
|
13
|
+
direction?: 'left' | 'right';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
class: className = 'w-16 h-8',
|
|
18
|
+
color,
|
|
19
|
+
animate = true,
|
|
20
|
+
direction = 'right'
|
|
21
|
+
}: Props = $props();
|
|
22
|
+
|
|
23
|
+
const starColor = $derived(color ?? accents.sky.star);
|
|
24
|
+
const scaleX = $derived(direction === 'left' ? -1 : 1);
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<!-- Shooting star with trail -->
|
|
28
|
+
<svg
|
|
29
|
+
class="{className} {animate ? 'shoot' : ''}"
|
|
30
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
31
|
+
viewBox="0 0 100 40"
|
|
32
|
+
style="transform: scaleX({scaleX})"
|
|
33
|
+
>
|
|
34
|
+
<defs>
|
|
35
|
+
<linearGradient id="trail-gradient" x1="0%" y1="0%" x2="100%" y2="0%">
|
|
36
|
+
<stop offset="0%" stop-color={starColor} stop-opacity="0" />
|
|
37
|
+
<stop offset="70%" stop-color={starColor} stop-opacity="0.5" />
|
|
38
|
+
<stop offset="100%" stop-color={starColor} stop-opacity="1" />
|
|
39
|
+
</linearGradient>
|
|
40
|
+
</defs>
|
|
41
|
+
|
|
42
|
+
<!-- Trail -->
|
|
43
|
+
<path
|
|
44
|
+
fill="url(#trail-gradient)"
|
|
45
|
+
d="M0 20 Q30 15 60 18 L85 17 L85 23 L60 22 Q30 25 0 20 Z"
|
|
46
|
+
class={animate ? 'trail' : ''}
|
|
47
|
+
/>
|
|
48
|
+
|
|
49
|
+
<!-- Star head -->
|
|
50
|
+
<g class={animate ? 'star-head' : ''}>
|
|
51
|
+
<!-- Glow -->
|
|
52
|
+
<circle fill={starColor} cx="90" cy="20" r="8" opacity="0.3" />
|
|
53
|
+
<circle fill={starColor} cx="90" cy="20" r="5" opacity="0.5" />
|
|
54
|
+
<!-- Core -->
|
|
55
|
+
<circle fill={starColor} cx="90" cy="20" r="3" />
|
|
56
|
+
</g>
|
|
57
|
+
</svg>
|
|
58
|
+
|
|
59
|
+
<style>
|
|
60
|
+
@keyframes shoot {
|
|
61
|
+
0% {
|
|
62
|
+
transform: translateX(-100%) translateY(20px);
|
|
63
|
+
opacity: 0;
|
|
64
|
+
}
|
|
65
|
+
10% {
|
|
66
|
+
opacity: 1;
|
|
67
|
+
}
|
|
68
|
+
90% {
|
|
69
|
+
opacity: 1;
|
|
70
|
+
}
|
|
71
|
+
100% {
|
|
72
|
+
transform: translateX(100%) translateY(-20px);
|
|
73
|
+
opacity: 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@keyframes trail-shimmer {
|
|
78
|
+
0%, 100% { opacity: 0.8; }
|
|
79
|
+
50% { opacity: 1; }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.shoot {
|
|
83
|
+
animation: shoot 2s ease-in-out infinite;
|
|
84
|
+
animation-delay: var(--shoot-delay, 0s);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.trail {
|
|
88
|
+
animation: trail-shimmer 0.3s ease-in-out infinite;
|
|
89
|
+
}
|
|
90
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
color?: string;
|
|
4
|
+
animate?: boolean;
|
|
5
|
+
direction?: 'left' | 'right';
|
|
6
|
+
}
|
|
7
|
+
declare const StarShooting: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type StarShooting = ReturnType<typeof StarShooting>;
|
|
9
|
+
export default StarShooting;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import { accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
color?: string;
|
|
12
|
+
rays?: boolean;
|
|
13
|
+
animate?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
class: className = 'w-12 h-12',
|
|
18
|
+
color,
|
|
19
|
+
rays = true,
|
|
20
|
+
animate = true
|
|
21
|
+
}: Props = $props();
|
|
22
|
+
|
|
23
|
+
const sunColor = $derived(color ?? accents.flower.yellow);
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<!-- Sun with optional rays -->
|
|
27
|
+
<svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
|
28
|
+
{#if rays}
|
|
29
|
+
<!-- Sun rays -->
|
|
30
|
+
<g class={animate ? 'spin' : ''} opacity="0.8">
|
|
31
|
+
<line x1="50" y1="5" x2="50" y2="20" stroke={sunColor} stroke-width="3" stroke-linecap="round" />
|
|
32
|
+
<line x1="50" y1="80" x2="50" y2="95" stroke={sunColor} stroke-width="3" stroke-linecap="round" />
|
|
33
|
+
<line x1="5" y1="50" x2="20" y2="50" stroke={sunColor} stroke-width="3" stroke-linecap="round" />
|
|
34
|
+
<line x1="80" y1="50" x2="95" y2="50" stroke={sunColor} stroke-width="3" stroke-linecap="round" />
|
|
35
|
+
<!-- Diagonal rays -->
|
|
36
|
+
<line x1="18" y1="18" x2="28" y2="28" stroke={sunColor} stroke-width="2.5" stroke-linecap="round" />
|
|
37
|
+
<line x1="72" y1="28" x2="82" y2="18" stroke={sunColor} stroke-width="2.5" stroke-linecap="round" />
|
|
38
|
+
<line x1="18" y1="82" x2="28" y2="72" stroke={sunColor} stroke-width="2.5" stroke-linecap="round" />
|
|
39
|
+
<line x1="72" y1="72" x2="82" y2="82" stroke={sunColor} stroke-width="2.5" stroke-linecap="round" />
|
|
40
|
+
</g>
|
|
41
|
+
{/if}
|
|
42
|
+
|
|
43
|
+
<!-- Sun body -->
|
|
44
|
+
<circle fill={sunColor} cx="50" cy="50" r="25" class={animate ? 'pulse' : ''} />
|
|
45
|
+
|
|
46
|
+
<!-- Inner glow -->
|
|
47
|
+
<circle fill="white" cx="50" cy="50" r="15" opacity="0.3" />
|
|
48
|
+
</svg>
|
|
49
|
+
|
|
50
|
+
<style>
|
|
51
|
+
@keyframes spin {
|
|
52
|
+
0% { transform: rotate(0deg); }
|
|
53
|
+
100% { transform: rotate(360deg); }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@keyframes pulse {
|
|
57
|
+
0%, 100% { transform: scale(1); }
|
|
58
|
+
50% { transform: scale(1.02); }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.spin {
|
|
62
|
+
transform-origin: center center;
|
|
63
|
+
animation: spin 60s linear infinite;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.pulse {
|
|
67
|
+
transform-origin: center center;
|
|
68
|
+
animation: pulse 4s ease-in-out infinite;
|
|
69
|
+
}
|
|
70
|
+
</style>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as Cloud } from './Cloud.svelte';
|
|
2
|
+
export { default as CloudWispy } from './CloudWispy.svelte';
|
|
3
|
+
export { default as Moon } from './Moon.svelte';
|
|
4
|
+
export { default as Rainbow } from './Rainbow.svelte';
|
|
5
|
+
export { default as Star } from './Star.svelte';
|
|
6
|
+
export { default as StarCluster } from './StarCluster.svelte';
|
|
7
|
+
export { default as StarShooting } from './StarShooting.svelte';
|
|
8
|
+
export { default as Sun } from './Sun.svelte';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Sky components - celestial elements
|
|
2
|
+
export { default as Cloud } from './Cloud.svelte';
|
|
3
|
+
export { default as CloudWispy } from './CloudWispy.svelte';
|
|
4
|
+
export { default as Moon } from './Moon.svelte';
|
|
5
|
+
export { default as Rainbow } from './Rainbow.svelte';
|
|
6
|
+
export { default as Star } from './Star.svelte';
|
|
7
|
+
export { default as StarCluster } from './StarCluster.svelte';
|
|
8
|
+
export { default as StarShooting } from './StarShooting.svelte';
|
|
9
|
+
export { default as Sun } from './Sun.svelte';
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import { bark, earth, accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
bodyColor?: string;
|
|
12
|
+
roofColor?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
class: className = 'w-8 h-12',
|
|
17
|
+
bodyColor,
|
|
18
|
+
roofColor
|
|
19
|
+
}: Props = $props();
|
|
20
|
+
|
|
21
|
+
const body = $derived(bodyColor ?? earth.sand);
|
|
22
|
+
const roof = $derived(roofColor ?? bark.warmBark);
|
|
23
|
+
const pole = bark.bark;
|
|
24
|
+
const hole = bark.darkBark;
|
|
25
|
+
const perch = bark.lightBark;
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<!-- Birdhouse on pole -->
|
|
29
|
+
<svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 80">
|
|
30
|
+
<!-- Pole -->
|
|
31
|
+
<rect fill={pole} x="22" y="50" width="6" height="30" />
|
|
32
|
+
|
|
33
|
+
<!-- House body -->
|
|
34
|
+
<rect fill={body} x="10" y="25" width="30" height="28" rx="2" />
|
|
35
|
+
|
|
36
|
+
<!-- Roof -->
|
|
37
|
+
<polygon fill={roof} points="5,27 25,8 45,27" />
|
|
38
|
+
<!-- Roof overhang shadow -->
|
|
39
|
+
<polygon fill={bark.darkBark} points="8,27 25,12 42,27 40,27 25,14 10,27" opacity="0.3" />
|
|
40
|
+
|
|
41
|
+
<!-- Entrance hole -->
|
|
42
|
+
<circle fill={hole} cx="25" cy="38" r="6" />
|
|
43
|
+
|
|
44
|
+
<!-- Perch -->
|
|
45
|
+
<rect fill={perch} x="22" y="48" width="6" height="3" rx="1" />
|
|
46
|
+
<ellipse fill={perch} cx="25" cy="51" rx="4" ry="2" />
|
|
47
|
+
|
|
48
|
+
<!-- Roof detail lines -->
|
|
49
|
+
<line x1="25" y1="10" x2="25" y2="26" stroke={bark.darkBark} stroke-width="1" opacity="0.3" />
|
|
50
|
+
|
|
51
|
+
<!-- Body highlight -->
|
|
52
|
+
<rect fill="white" x="12" y="27" width="8" height="24" rx="1" opacity="0.1" />
|
|
53
|
+
</svg>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import { bark, earth } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
woodColor?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
class: className = 'w-20 h-12',
|
|
16
|
+
woodColor
|
|
17
|
+
}: Props = $props();
|
|
18
|
+
|
|
19
|
+
const wood = $derived(woodColor ?? bark.warmBark);
|
|
20
|
+
const railColor = $derived(bark.bark);
|
|
21
|
+
const shadow = $derived(bark.darkBark);
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<!-- Small wooden bridge -->
|
|
25
|
+
<svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 70">
|
|
26
|
+
<!-- Shadow under bridge -->
|
|
27
|
+
<ellipse fill="rgba(0,0,0,0.1)" cx="60" cy="65" rx="55" ry="8" />
|
|
28
|
+
|
|
29
|
+
<!-- Bridge deck (arched) -->
|
|
30
|
+
<path
|
|
31
|
+
fill={wood}
|
|
32
|
+
d="M5 50 Q60 30 115 50 L115 58 Q60 38 5 58 Z"
|
|
33
|
+
/>
|
|
34
|
+
|
|
35
|
+
<!-- Deck planks -->
|
|
36
|
+
<line x1="20" y1="42" x2="20" y2="54" stroke={shadow} stroke-width="1" opacity="0.3" />
|
|
37
|
+
<line x1="35" y1="38" x2="35" y2="50" stroke={shadow} stroke-width="1" opacity="0.3" />
|
|
38
|
+
<line x1="50" y1="35" x2="50" y2="47" stroke={shadow} stroke-width="1" opacity="0.3" />
|
|
39
|
+
<line x1="65" y1="34" x2="65" y2="46" stroke={shadow} stroke-width="1" opacity="0.3" />
|
|
40
|
+
<line x1="80" y1="36" x2="80" y2="48" stroke={shadow} stroke-width="1" opacity="0.3" />
|
|
41
|
+
<line x1="95" y1="40" x2="95" y2="52" stroke={shadow} stroke-width="1" opacity="0.3" />
|
|
42
|
+
|
|
43
|
+
<!-- Left railing -->
|
|
44
|
+
<rect fill={railColor} x="8" y="25" width="4" height="30" rx="1" />
|
|
45
|
+
<rect fill={railColor} x="22" y="20" width="4" height="28" rx="1" />
|
|
46
|
+
<!-- Railing top bar -->
|
|
47
|
+
<path fill="none" stroke={railColor} stroke-width="3" d="M10 25 Q30 15 40 18" />
|
|
48
|
+
|
|
49
|
+
<!-- Right railing -->
|
|
50
|
+
<rect fill={railColor} x="108" y="25" width="4" height="30" rx="1" />
|
|
51
|
+
<rect fill={railColor} x="94" y="20" width="4" height="28" rx="1" />
|
|
52
|
+
<!-- Railing top bar -->
|
|
53
|
+
<path fill="none" stroke={railColor} stroke-width="3" d="M110 25 Q90 15 80 18" />
|
|
54
|
+
|
|
55
|
+
<!-- Deck edge highlight -->
|
|
56
|
+
<path
|
|
57
|
+
fill={bark.lightBark}
|
|
58
|
+
d="M8 50 Q60 30 112 50 L112 52 Q60 32 8 52 Z"
|
|
59
|
+
opacity="0.3"
|
|
60
|
+
/>
|
|
61
|
+
|
|
62
|
+
<!-- Ground at ends -->
|
|
63
|
+
<ellipse fill={earth.mud} cx="10" cy="60" rx="12" ry="5" opacity="0.5" />
|
|
64
|
+
<ellipse fill={earth.mud} cx="110" cy="60" rx="12" ry="5" opacity="0.5" />
|
|
65
|
+
</svg>
|