@autumnsgrove/groveengine 0.7.0 → 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/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/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/Logo.svelte +47 -52
- package/dist/ui/components/ui/Logo.svelte.d.ts +4 -3
- package/dist/ui/components/ui/index.d.ts +2 -0
- package/dist/ui/components/ui/index.js +2 -0
- package/dist/ui/styles/grove.css +15 -1
- package/package.json +11 -1
|
@@ -0,0 +1,94 @@
|
|
|
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, accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
bodyColor?: string;
|
|
12
|
+
breastColor?: string;
|
|
13
|
+
beakColor?: string;
|
|
14
|
+
animate?: boolean;
|
|
15
|
+
facing?: 'left' | 'right';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
class: className = 'w-6 h-6',
|
|
20
|
+
bodyColor,
|
|
21
|
+
breastColor,
|
|
22
|
+
beakColor,
|
|
23
|
+
animate = true,
|
|
24
|
+
facing = 'right'
|
|
25
|
+
}: Props = $props();
|
|
26
|
+
|
|
27
|
+
// American Robin colors - from palette
|
|
28
|
+
const body = $derived(bodyColor ?? accents.bird.robinBody);
|
|
29
|
+
const breast = $derived(breastColor ?? accents.bird.robinBreast);
|
|
30
|
+
const beak = $derived(beakColor ?? accents.bird.robinBeak);
|
|
31
|
+
const legColor = $derived(bark.darkBark);
|
|
32
|
+
|
|
33
|
+
const scaleX = $derived(facing === 'left' ? -1 : 1);
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<!-- American Robin - perched -->
|
|
37
|
+
<svg
|
|
38
|
+
class="{className} {animate ? 'bob' : ''}"
|
|
39
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
40
|
+
viewBox="0 0 50 55"
|
|
41
|
+
style="transform: scaleX({scaleX})"
|
|
42
|
+
>
|
|
43
|
+
<!-- Tail feathers - dark -->
|
|
44
|
+
<path fill={body} d="M2 30 Q0 34 3 40 Q10 38 14 32 Q8 30 2 30" />
|
|
45
|
+
|
|
46
|
+
<!-- Body - dark gray back -->
|
|
47
|
+
<ellipse fill={body} cx="22" cy="30" rx="14" ry="11" />
|
|
48
|
+
|
|
49
|
+
<!-- Wing detail - slightly darker -->
|
|
50
|
+
<path fill="#3a3a3a" d="M12 26 Q8 32 11 38 Q18 36 22 30 Q17 25 12 26" opacity="0.8" />
|
|
51
|
+
|
|
52
|
+
<!-- Orange-red breast - signature robin color -->
|
|
53
|
+
<ellipse fill={breast} cx="30" cy="33" rx="9" ry="10" />
|
|
54
|
+
<!-- Breast highlight -->
|
|
55
|
+
<ellipse fill={breast} cx="31" cy="31" rx="6" ry="6" opacity="0.9" />
|
|
56
|
+
|
|
57
|
+
<!-- White lower belly -->
|
|
58
|
+
<ellipse fill="#f5f5f5" cx="30" cy="42" rx="5" ry="3" opacity="0.8" />
|
|
59
|
+
|
|
60
|
+
<!-- Head - dark gray -->
|
|
61
|
+
<circle fill={body} cx="36" cy="20" r="10" />
|
|
62
|
+
|
|
63
|
+
<!-- White eye-ring (robin signature) -->
|
|
64
|
+
<circle fill="white" cx="40" cy="18" r="3.5" />
|
|
65
|
+
<!-- Eye -->
|
|
66
|
+
<circle fill="#1a1a1a" cx="40" cy="18" r="2" />
|
|
67
|
+
<!-- Eye highlight -->
|
|
68
|
+
<circle fill="white" cx="41" cy="17" r="0.7" />
|
|
69
|
+
|
|
70
|
+
<!-- White crescent below eye -->
|
|
71
|
+
<path fill="white" d="M38 22 Q40 23 42 22 Q41 24 39 24 Q38 23 38 22" opacity="0.6" />
|
|
72
|
+
|
|
73
|
+
<!-- Beak - yellow-orange -->
|
|
74
|
+
<path fill={beak} d="M45 20 L52 22 L45 24 Z" />
|
|
75
|
+
<!-- Beak detail line -->
|
|
76
|
+
<line x1="45" y1="22" x2="50" y2="22" stroke="#b45309" stroke-width="0.5" />
|
|
77
|
+
|
|
78
|
+
<!-- Legs - dark -->
|
|
79
|
+
<g fill="none" stroke={legColor} stroke-width="1.5">
|
|
80
|
+
<path d="M22 41 L22 50 M20 48 L24 48" />
|
|
81
|
+
<path d="M28 41 L28 50 M26 48 L30 48" />
|
|
82
|
+
</g>
|
|
83
|
+
</svg>
|
|
84
|
+
|
|
85
|
+
<style>
|
|
86
|
+
@keyframes bob {
|
|
87
|
+
0%, 100% { transform: translateY(0); }
|
|
88
|
+
50% { transform: translateY(-1.5px); }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.bob {
|
|
92
|
+
animation: bob 2s ease-in-out infinite;
|
|
93
|
+
}
|
|
94
|
+
</style>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
bodyColor?: string;
|
|
4
|
+
breastColor?: string;
|
|
5
|
+
beakColor?: string;
|
|
6
|
+
animate?: boolean;
|
|
7
|
+
facing?: 'left' | 'right';
|
|
8
|
+
}
|
|
9
|
+
declare const Bird: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type Bird = ReturnType<typeof Bird>;
|
|
11
|
+
export default Bird;
|
|
@@ -0,0 +1,83 @@
|
|
|
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 } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
color?: string;
|
|
12
|
+
animate?: boolean;
|
|
13
|
+
facing?: 'left' | 'right';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
class: className = 'w-6 h-4',
|
|
18
|
+
color,
|
|
19
|
+
animate = true,
|
|
20
|
+
facing = 'right'
|
|
21
|
+
}: Props = $props();
|
|
22
|
+
|
|
23
|
+
const birdColor = $derived(color ?? bark.bark);
|
|
24
|
+
const scaleX = $derived(facing === 'left' ? -1 : 1);
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<!-- Bird in flight - simple silhouette -->
|
|
28
|
+
<svg
|
|
29
|
+
class={className}
|
|
30
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
31
|
+
viewBox="0 0 60 30"
|
|
32
|
+
style="transform: scaleX({scaleX})"
|
|
33
|
+
>
|
|
34
|
+
<!-- Wings and body as single flowing shape -->
|
|
35
|
+
<g class={animate ? 'fly' : ''}>
|
|
36
|
+
<!-- Left wing -->
|
|
37
|
+
<path
|
|
38
|
+
fill={birdColor}
|
|
39
|
+
d="M30 15 Q20 5 5 8 Q15 12 25 15"
|
|
40
|
+
class={animate ? 'wing-up' : ''}
|
|
41
|
+
/>
|
|
42
|
+
|
|
43
|
+
<!-- Right wing -->
|
|
44
|
+
<path
|
|
45
|
+
fill={birdColor}
|
|
46
|
+
d="M30 15 Q40 5 55 8 Q45 12 35 15"
|
|
47
|
+
class={animate ? 'wing-up' : ''}
|
|
48
|
+
/>
|
|
49
|
+
|
|
50
|
+
<!-- Body -->
|
|
51
|
+
<ellipse fill={birdColor} cx="30" cy="15" rx="8" ry="5" />
|
|
52
|
+
|
|
53
|
+
<!-- Head -->
|
|
54
|
+
<circle fill={birdColor} cx="40" cy="14" r="4" />
|
|
55
|
+
|
|
56
|
+
<!-- Beak -->
|
|
57
|
+
<path fill={birdColor} d="M44 14 L50 15 L44 16 Z" />
|
|
58
|
+
|
|
59
|
+
<!-- Tail -->
|
|
60
|
+
<path fill={birdColor} d="M22 15 Q15 12 10 15 Q15 18 22 15" />
|
|
61
|
+
</g>
|
|
62
|
+
</svg>
|
|
63
|
+
|
|
64
|
+
<style>
|
|
65
|
+
@keyframes fly {
|
|
66
|
+
0%, 100% { transform: translateY(0); }
|
|
67
|
+
50% { transform: translateY(-3px); }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@keyframes flap {
|
|
71
|
+
0%, 100% { transform: rotate(0deg) scaleY(1); }
|
|
72
|
+
50% { transform: rotate(-10deg) scaleY(0.8); }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.fly {
|
|
76
|
+
animation: fly 0.8s ease-in-out infinite;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.wing-up {
|
|
80
|
+
transform-origin: center bottom;
|
|
81
|
+
animation: flap 0.3s ease-in-out infinite;
|
|
82
|
+
}
|
|
83
|
+
</style>
|
|
@@ -0,0 +1,95 @@
|
|
|
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, accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
style?: string;
|
|
12
|
+
bodyColor?: string;
|
|
13
|
+
breastColor?: string;
|
|
14
|
+
beakColor?: string;
|
|
15
|
+
animate?: boolean;
|
|
16
|
+
facing?: 'left' | 'right';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
class: className = 'w-6 h-6',
|
|
21
|
+
style,
|
|
22
|
+
bodyColor,
|
|
23
|
+
breastColor,
|
|
24
|
+
beakColor,
|
|
25
|
+
animate = true,
|
|
26
|
+
facing = 'right'
|
|
27
|
+
}: Props = $props();
|
|
28
|
+
|
|
29
|
+
// Eastern Bluebird colors - from palette
|
|
30
|
+
const body = $derived(bodyColor ?? accents.bird.bluebirdBody);
|
|
31
|
+
const wing = $derived(accents.bird.bluebirdWing);
|
|
32
|
+
const breast = $derived(breastColor ?? accents.bird.bluebirdBreast);
|
|
33
|
+
const belly = $derived(accents.bird.chickadeeBelly); // Cream/white (shared with chickadee)
|
|
34
|
+
const beak = $derived(beakColor ?? '#1a1a1a');
|
|
35
|
+
const legColor = $derived(bark.darkBark);
|
|
36
|
+
|
|
37
|
+
const scaleX = $derived(facing === 'left' ? -1 : 1);
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<!-- Eastern Bluebird - symbol of happiness and spring! -->
|
|
41
|
+
<svg
|
|
42
|
+
class="{className} {animate ? 'flutter' : ''}"
|
|
43
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
44
|
+
viewBox="0 0 50 55"
|
|
45
|
+
style="transform: scaleX({scaleX}); {style ?? ''}"
|
|
46
|
+
>
|
|
47
|
+
<!-- Tail feathers - bright blue -->
|
|
48
|
+
<path fill={body} d="M6 30 Q3 36 5 44 Q11 42 15 36 Q16 32 12 29 Q8 28 6 30" />
|
|
49
|
+
<path fill={wing} d="M7 32 Q5 38 6 42 Q10 40 12 36" opacity="0.6" />
|
|
50
|
+
|
|
51
|
+
<!-- Body - blue upper -->
|
|
52
|
+
<ellipse fill={body} cx="22" cy="28" rx="13" ry="10" />
|
|
53
|
+
|
|
54
|
+
<!-- Wing - darker blue with detail -->
|
|
55
|
+
<path fill={wing} d="M10 24 Q6 30 9 38 Q16 36 19 30 Q17 23 10 24" />
|
|
56
|
+
<path fill="#1d4ed8" d="M12 28 Q10 32 12 36 Q15 34 16 31 Q14 28 12 28" opacity="0.5" />
|
|
57
|
+
|
|
58
|
+
<!-- Breast - rusty orange -->
|
|
59
|
+
<ellipse fill={breast} cx="28" cy="30" rx="7" ry="8" />
|
|
60
|
+
<!-- Breast highlight -->
|
|
61
|
+
<ellipse fill="#f97316" cx="30" cy="28" rx="4" ry="5" opacity="0.4" />
|
|
62
|
+
|
|
63
|
+
<!-- Belly - cream/white -->
|
|
64
|
+
<ellipse fill={belly} cx="28" cy="38" rx="5" ry="4" />
|
|
65
|
+
|
|
66
|
+
<!-- Head - bright blue -->
|
|
67
|
+
<circle fill={body} cx="35" cy="16" r="8" />
|
|
68
|
+
|
|
69
|
+
<!-- Eye -->
|
|
70
|
+
<circle fill="#1a1a1a" cx="38" cy="15" r="2" />
|
|
71
|
+
<!-- Eye highlight -->
|
|
72
|
+
<circle fill="white" cx="39" cy="14" r="0.6" />
|
|
73
|
+
|
|
74
|
+
<!-- Beak - small and dark -->
|
|
75
|
+
<path fill={beak} d="M42 16 L48 17 L42 19 Q41 17.5 42 16" />
|
|
76
|
+
|
|
77
|
+
<!-- Legs -->
|
|
78
|
+
<g fill="none" stroke={legColor} stroke-width="1.2">
|
|
79
|
+
<path d="M22 38 L22 48 M20 46 L24 46" />
|
|
80
|
+
<path d="M27 38 L27 48 M25 46 L29 46" />
|
|
81
|
+
</g>
|
|
82
|
+
</svg>
|
|
83
|
+
|
|
84
|
+
<style>
|
|
85
|
+
@keyframes flutter {
|
|
86
|
+
0%, 100% { transform: translateY(0) rotate(0deg); }
|
|
87
|
+
25% { transform: translateY(-2px) rotate(1deg); }
|
|
88
|
+
50% { transform: translateY(0) rotate(0deg); }
|
|
89
|
+
75% { transform: translateY(-1px) rotate(-1deg); }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.flutter {
|
|
93
|
+
animation: flutter 2s ease-in-out infinite;
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
style?: string;
|
|
4
|
+
bodyColor?: string;
|
|
5
|
+
breastColor?: string;
|
|
6
|
+
beakColor?: string;
|
|
7
|
+
animate?: boolean;
|
|
8
|
+
facing?: 'left' | 'right';
|
|
9
|
+
}
|
|
10
|
+
declare const Bluebird: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type Bluebird = ReturnType<typeof Bluebird>;
|
|
12
|
+
export default Bluebird;
|
|
@@ -0,0 +1,87 @@
|
|
|
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, bark } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
wingColor?: string;
|
|
12
|
+
accentColor?: string;
|
|
13
|
+
animate?: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
class: className = 'w-6 h-6',
|
|
18
|
+
wingColor,
|
|
19
|
+
accentColor,
|
|
20
|
+
animate = true
|
|
21
|
+
}: Props = $props();
|
|
22
|
+
|
|
23
|
+
const wing = $derived(wingColor ?? accents.flower.purple);
|
|
24
|
+
const accent = $derived(accentColor ?? accents.flower.yellow);
|
|
25
|
+
const bodyColor = $derived(bark.darkBark);
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<!-- Butterfly with flapping wings -->
|
|
29
|
+
<svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 40">
|
|
30
|
+
<!-- Left wings -->
|
|
31
|
+
<g class={animate ? 'wing-left' : ''}>
|
|
32
|
+
<!-- Upper wing -->
|
|
33
|
+
<ellipse fill={wing} cx="12" cy="15" rx="12" ry="10" />
|
|
34
|
+
<circle fill={accent} cx="10" cy="13" r="3" opacity="0.7" />
|
|
35
|
+
<circle fill={accent} cx="16" cy="17" r="2" opacity="0.5" />
|
|
36
|
+
|
|
37
|
+
<!-- Lower wing -->
|
|
38
|
+
<ellipse fill={wing} cx="14" cy="30" rx="10" ry="8" />
|
|
39
|
+
<circle fill={accent} cx="12" cy="28" r="2" opacity="0.6" />
|
|
40
|
+
</g>
|
|
41
|
+
|
|
42
|
+
<!-- Right wings -->
|
|
43
|
+
<g class={animate ? 'wing-right' : ''}>
|
|
44
|
+
<!-- Upper wing -->
|
|
45
|
+
<ellipse fill={wing} cx="38" cy="15" rx="12" ry="10" />
|
|
46
|
+
<circle fill={accent} cx="40" cy="13" r="3" opacity="0.7" />
|
|
47
|
+
<circle fill={accent} cx="34" cy="17" r="2" opacity="0.5" />
|
|
48
|
+
|
|
49
|
+
<!-- Lower wing -->
|
|
50
|
+
<ellipse fill={wing} cx="36" cy="30" rx="10" ry="8" />
|
|
51
|
+
<circle fill={accent} cx="38" cy="28" r="2" opacity="0.6" />
|
|
52
|
+
</g>
|
|
53
|
+
|
|
54
|
+
<!-- Body -->
|
|
55
|
+
<ellipse fill={bodyColor} cx="25" cy="20" rx="3" ry="12" />
|
|
56
|
+
|
|
57
|
+
<!-- Head -->
|
|
58
|
+
<circle fill={bodyColor} cx="25" cy="6" r="3" />
|
|
59
|
+
|
|
60
|
+
<!-- Antennae -->
|
|
61
|
+
<path fill="none" stroke={bodyColor} stroke-width="1" d="M23 4 Q20 0 18 2" />
|
|
62
|
+
<path fill="none" stroke={bodyColor} stroke-width="1" d="M27 4 Q30 0 32 2" />
|
|
63
|
+
<circle fill={bodyColor} cx="18" cy="2" r="1" />
|
|
64
|
+
<circle fill={bodyColor} cx="32" cy="2" r="1" />
|
|
65
|
+
</svg>
|
|
66
|
+
|
|
67
|
+
<style>
|
|
68
|
+
@keyframes flutter-left {
|
|
69
|
+
0%, 100% { transform: scaleX(1) rotate(0deg); }
|
|
70
|
+
50% { transform: scaleX(0.7) rotate(-5deg); }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@keyframes flutter-right {
|
|
74
|
+
0%, 100% { transform: scaleX(1) rotate(0deg); }
|
|
75
|
+
50% { transform: scaleX(0.7) rotate(5deg); }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.wing-left {
|
|
79
|
+
transform-origin: right center;
|
|
80
|
+
animation: flutter-left 0.3s ease-in-out infinite;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.wing-right {
|
|
84
|
+
transform-origin: left center;
|
|
85
|
+
animation: flutter-right 0.3s ease-in-out infinite;
|
|
86
|
+
}
|
|
87
|
+
</style>
|
|
@@ -0,0 +1,95 @@
|
|
|
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, accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
style?: string;
|
|
12
|
+
bodyColor?: string;
|
|
13
|
+
maskColor?: string;
|
|
14
|
+
beakColor?: string;
|
|
15
|
+
animate?: boolean;
|
|
16
|
+
facing?: 'left' | 'right';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
class: className = 'w-6 h-6',
|
|
21
|
+
style,
|
|
22
|
+
bodyColor,
|
|
23
|
+
maskColor,
|
|
24
|
+
beakColor,
|
|
25
|
+
animate = true,
|
|
26
|
+
facing = 'right'
|
|
27
|
+
}: Props = $props();
|
|
28
|
+
|
|
29
|
+
// Northern Cardinal colors (male) - from palette
|
|
30
|
+
const body = $derived(bodyColor ?? accents.bird.cardinalRed);
|
|
31
|
+
const mask = $derived(maskColor ?? accents.bird.cardinalMask);
|
|
32
|
+
const beak = $derived(beakColor ?? accents.bird.cardinalBeak);
|
|
33
|
+
const legColor = $derived(bark.darkBark);
|
|
34
|
+
|
|
35
|
+
const scaleX = $derived(facing === 'left' ? -1 : 1);
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<!-- Northern Cardinal - perched, with distinctive crest -->
|
|
39
|
+
<svg
|
|
40
|
+
class="{className} {animate ? 'bob' : ''}"
|
|
41
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
42
|
+
viewBox="0 0 50 60"
|
|
43
|
+
style="transform: scaleX({scaleX}); {style ?? ''}"
|
|
44
|
+
>
|
|
45
|
+
<!-- Tail feathers - long and red -->
|
|
46
|
+
<path fill={body} d="M5 35 Q0 40 2 50 Q8 48 12 42 Q14 38 10 34 Q7 33 5 35" />
|
|
47
|
+
<path fill="#b91c1c" d="M6 36 Q3 42 4 48 Q8 46 10 42" opacity="0.6" />
|
|
48
|
+
|
|
49
|
+
<!-- Body - bright red -->
|
|
50
|
+
<ellipse fill={body} cx="22" cy="32" rx="14" ry="12" />
|
|
51
|
+
|
|
52
|
+
<!-- Wing - slightly darker red with feather details -->
|
|
53
|
+
<path fill="#b91c1c" d="M10 28 Q6 34 9 42 Q16 40 20 34 Q18 27 10 28" />
|
|
54
|
+
<path fill="#991b1b" d="M12 32 Q10 36 12 40 Q15 38 16 35 Q14 32 12 32" opacity="0.5" />
|
|
55
|
+
|
|
56
|
+
<!-- Breast - lighter red highlight -->
|
|
57
|
+
<ellipse fill="#ef4444" cx="30" cy="35" rx="8" ry="9" opacity="0.7" />
|
|
58
|
+
|
|
59
|
+
<!-- Head - red with crest -->
|
|
60
|
+
<circle fill={body} cx="36" cy="20" r="10" />
|
|
61
|
+
|
|
62
|
+
<!-- Distinctive crest (pointed tuft) -->
|
|
63
|
+
<path fill={body} d="M32 12 Q36 5 38 8 Q40 10 38 14 Q35 13 32 12" />
|
|
64
|
+
<path fill="#ef4444" d="M34 10 Q36 6 37 9" opacity="0.5" />
|
|
65
|
+
|
|
66
|
+
<!-- Black mask - surrounds eye and covers throat -->
|
|
67
|
+
<path fill={mask} d="M38 16 Q44 14 46 18 Q46 22 44 24 Q40 26 36 26 Q32 24 32 20 Q34 16 38 16" />
|
|
68
|
+
|
|
69
|
+
<!-- Eye - visible within mask -->
|
|
70
|
+
<circle fill="#1a1a1a" cx="40" cy="19" r="2.5" />
|
|
71
|
+
<!-- Eye highlight -->
|
|
72
|
+
<circle fill="white" cx="41" cy="18" r="0.8" />
|
|
73
|
+
|
|
74
|
+
<!-- Beak - thick orange-red cone shape (cardinal signature) -->
|
|
75
|
+
<path fill={beak} d="M44 20 L52 21 L44 24 Q43 22 44 20" />
|
|
76
|
+
<!-- Beak curve detail -->
|
|
77
|
+
<path fill="#ea580c" d="M45 21 Q48 21 50 21.5" stroke="#c2410c" stroke-width="0.3" />
|
|
78
|
+
|
|
79
|
+
<!-- Legs - dark -->
|
|
80
|
+
<g fill="none" stroke={legColor} stroke-width="1.5">
|
|
81
|
+
<path d="M20 44 L20 54 M18 52 L22 52" />
|
|
82
|
+
<path d="M26 44 L26 54 M24 52 L28 52" />
|
|
83
|
+
</g>
|
|
84
|
+
</svg>
|
|
85
|
+
|
|
86
|
+
<style>
|
|
87
|
+
@keyframes bob {
|
|
88
|
+
0%, 100% { transform: translateY(0); }
|
|
89
|
+
50% { transform: translateY(-1.5px); }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.bob {
|
|
93
|
+
animation: bob 2.5s ease-in-out infinite;
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
style?: string;
|
|
4
|
+
bodyColor?: string;
|
|
5
|
+
maskColor?: string;
|
|
6
|
+
beakColor?: string;
|
|
7
|
+
animate?: boolean;
|
|
8
|
+
facing?: 'left' | 'right';
|
|
9
|
+
}
|
|
10
|
+
declare const Cardinal: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type Cardinal = ReturnType<typeof Cardinal>;
|
|
12
|
+
export default Cardinal;
|
|
@@ -0,0 +1,97 @@
|
|
|
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, accents } from '../palette';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
class?: string;
|
|
11
|
+
style?: string;
|
|
12
|
+
capColor?: string;
|
|
13
|
+
cheekColor?: string;
|
|
14
|
+
bodyColor?: string;
|
|
15
|
+
animate?: boolean;
|
|
16
|
+
facing?: 'left' | 'right';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
class: className = 'w-6 h-6',
|
|
21
|
+
style,
|
|
22
|
+
capColor,
|
|
23
|
+
cheekColor,
|
|
24
|
+
bodyColor,
|
|
25
|
+
animate = true,
|
|
26
|
+
facing = 'right'
|
|
27
|
+
}: Props = $props();
|
|
28
|
+
|
|
29
|
+
// Black-capped Chickadee colors - from palette
|
|
30
|
+
const cap = $derived(capColor ?? accents.bird.chickadeeCap);
|
|
31
|
+
const cheek = $derived(cheekColor ?? accents.bird.chickadeeCheek);
|
|
32
|
+
const body = $derived(bodyColor ?? accents.bird.chickadeeBody);
|
|
33
|
+
const belly = $derived(accents.bird.chickadeeBelly);
|
|
34
|
+
const beak = $derived(accents.bird.chickadeeCap); // Same black as cap
|
|
35
|
+
const legColor = $derived(bark.darkBark);
|
|
36
|
+
|
|
37
|
+
const scaleX = $derived(facing === 'left' ? -1 : 1);
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<!-- Black-capped Chickadee - small, round, perched -->
|
|
41
|
+
<svg
|
|
42
|
+
class="{className} {animate ? 'bob' : ''}"
|
|
43
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
44
|
+
viewBox="0 0 45 50"
|
|
45
|
+
style="transform: scaleX({scaleX}); {style ?? ''}"
|
|
46
|
+
>
|
|
47
|
+
<!-- Tail - short gray -->
|
|
48
|
+
<path fill={body} d="M5 28 Q2 32 4 38 Q10 36 12 30 Q9 27 5 28" />
|
|
49
|
+
|
|
50
|
+
<!-- Body - round gray back -->
|
|
51
|
+
<ellipse fill={body} cx="20" cy="28" rx="12" ry="10" />
|
|
52
|
+
|
|
53
|
+
<!-- Wing detail -->
|
|
54
|
+
<path fill="#4b5563" d="M10 25 Q7 30 10 35 Q15 33 17 28 Q14 24 10 25" opacity="0.8" />
|
|
55
|
+
<!-- Wing bars (subtle white edges) -->
|
|
56
|
+
<path fill="white" d="M9 30 Q12 29 14 30" opacity="0.4" stroke="white" stroke-width="0.5" />
|
|
57
|
+
|
|
58
|
+
<!-- Buff belly -->
|
|
59
|
+
<ellipse fill={belly} cx="26" cy="32" rx="7" ry="8" />
|
|
60
|
+
|
|
61
|
+
<!-- Head - round -->
|
|
62
|
+
<circle fill={body} cx="30" cy="18" r="9" />
|
|
63
|
+
|
|
64
|
+
<!-- Black cap (covers top of head) -->
|
|
65
|
+
<path fill={cap} d="M22 14 Q26 8 34 10 Q38 12 38 16 Q36 14 30 14 Q24 14 22 14" />
|
|
66
|
+
|
|
67
|
+
<!-- White cheek patch (signature chickadee feature) -->
|
|
68
|
+
<ellipse fill={cheek} cx="32" cy="18" rx="5" ry="4" />
|
|
69
|
+
|
|
70
|
+
<!-- Black bib under beak -->
|
|
71
|
+
<path fill={cap} d="M28 22 Q32 21 35 22 Q34 26 31 27 Q28 26 28 22" />
|
|
72
|
+
|
|
73
|
+
<!-- Eye - small and dark -->
|
|
74
|
+
<circle fill="#1a1a1a" cx="33" cy="16" r="1.5" />
|
|
75
|
+
<!-- Eye highlight -->
|
|
76
|
+
<circle fill="white" cx="33.5" cy="15.5" r="0.5" />
|
|
77
|
+
|
|
78
|
+
<!-- Beak - tiny and black -->
|
|
79
|
+
<path fill={beak} d="M38 17 L42 18 L38 19 Z" />
|
|
80
|
+
|
|
81
|
+
<!-- Legs - thin and dark -->
|
|
82
|
+
<g fill="none" stroke={legColor} stroke-width="1.2">
|
|
83
|
+
<path d="M17 38 L17 46 M15 44 L19 44" />
|
|
84
|
+
<path d="M23 38 L23 46 M21 44 L25 44" />
|
|
85
|
+
</g>
|
|
86
|
+
</svg>
|
|
87
|
+
|
|
88
|
+
<style>
|
|
89
|
+
@keyframes bob {
|
|
90
|
+
0%, 100% { transform: translateY(0); }
|
|
91
|
+
50% { transform: translateY(-1px); }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.bob {
|
|
95
|
+
animation: bob 1.8s ease-in-out infinite;
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
style?: string;
|
|
4
|
+
capColor?: string;
|
|
5
|
+
cheekColor?: string;
|
|
6
|
+
bodyColor?: string;
|
|
7
|
+
animate?: boolean;
|
|
8
|
+
facing?: 'left' | 'right';
|
|
9
|
+
}
|
|
10
|
+
declare const Chickadee: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type Chickadee = ReturnType<typeof Chickadee>;
|
|
12
|
+
export default Chickadee;
|