@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.
Files changed (160) hide show
  1. package/dist/ui/components/content/RoadmapPreview.svelte +91 -0
  2. package/dist/ui/components/content/RoadmapPreview.svelte.d.ts +36 -0
  3. package/dist/ui/components/content/index.d.ts +1 -0
  4. package/dist/ui/components/content/index.js +1 -0
  5. package/dist/ui/components/nature/Logo.svelte +224 -0
  6. package/dist/ui/components/nature/Logo.svelte.d.ts +14 -0
  7. package/dist/ui/components/nature/botanical/Acorn.svelte +48 -0
  8. package/dist/ui/components/nature/botanical/Acorn.svelte.d.ts +8 -0
  9. package/dist/ui/components/nature/botanical/Berry.svelte +67 -0
  10. package/dist/ui/components/nature/botanical/Berry.svelte.d.ts +8 -0
  11. package/dist/ui/components/nature/botanical/DandelionPuff.svelte +98 -0
  12. package/dist/ui/components/nature/botanical/DandelionPuff.svelte.d.ts +8 -0
  13. package/dist/ui/components/nature/botanical/FallingLeavesLayer.svelte +170 -0
  14. package/dist/ui/components/nature/botanical/FallingLeavesLayer.svelte.d.ts +35 -0
  15. package/dist/ui/components/nature/botanical/FallingPetalsLayer.svelte +174 -0
  16. package/dist/ui/components/nature/botanical/FallingPetalsLayer.svelte.d.ts +25 -0
  17. package/dist/ui/components/nature/botanical/Leaf.svelte +77 -0
  18. package/dist/ui/components/nature/botanical/Leaf.svelte.d.ts +10 -0
  19. package/dist/ui/components/nature/botanical/LeafFalling.svelte +186 -0
  20. package/dist/ui/components/nature/botanical/LeafFalling.svelte.d.ts +22 -0
  21. package/dist/ui/components/nature/botanical/PetalFalling.svelte +266 -0
  22. package/dist/ui/components/nature/botanical/PetalFalling.svelte.d.ts +25 -0
  23. package/dist/ui/components/nature/botanical/PineCone.svelte +61 -0
  24. package/dist/ui/components/nature/botanical/PineCone.svelte.d.ts +7 -0
  25. package/dist/ui/components/nature/botanical/Vine.svelte +102 -0
  26. package/dist/ui/components/nature/botanical/Vine.svelte.d.ts +11 -0
  27. package/dist/ui/components/nature/botanical/index.d.ts +10 -0
  28. package/dist/ui/components/nature/botanical/index.js +11 -0
  29. package/dist/ui/components/nature/creatures/Bee.svelte +78 -0
  30. package/dist/ui/components/nature/creatures/Bee.svelte.d.ts +9 -0
  31. package/dist/ui/components/nature/creatures/Bird.svelte +94 -0
  32. package/dist/ui/components/nature/creatures/Bird.svelte.d.ts +11 -0
  33. package/dist/ui/components/nature/creatures/BirdFlying.svelte +83 -0
  34. package/dist/ui/components/nature/creatures/BirdFlying.svelte.d.ts +9 -0
  35. package/dist/ui/components/nature/creatures/Bluebird.svelte +95 -0
  36. package/dist/ui/components/nature/creatures/Bluebird.svelte.d.ts +12 -0
  37. package/dist/ui/components/nature/creatures/Butterfly.svelte +87 -0
  38. package/dist/ui/components/nature/creatures/Butterfly.svelte.d.ts +9 -0
  39. package/dist/ui/components/nature/creatures/Cardinal.svelte +95 -0
  40. package/dist/ui/components/nature/creatures/Cardinal.svelte.d.ts +12 -0
  41. package/dist/ui/components/nature/creatures/Chickadee.svelte +97 -0
  42. package/dist/ui/components/nature/creatures/Chickadee.svelte.d.ts +12 -0
  43. package/dist/ui/components/nature/creatures/Deer.svelte +95 -0
  44. package/dist/ui/components/nature/creatures/Deer.svelte.d.ts +9 -0
  45. package/dist/ui/components/nature/creatures/Firefly.svelte +111 -0
  46. package/dist/ui/components/nature/creatures/Firefly.svelte.d.ts +10 -0
  47. package/dist/ui/components/nature/creatures/Owl.svelte +91 -0
  48. package/dist/ui/components/nature/creatures/Owl.svelte.d.ts +9 -0
  49. package/dist/ui/components/nature/creatures/Rabbit.svelte +90 -0
  50. package/dist/ui/components/nature/creatures/Rabbit.svelte.d.ts +9 -0
  51. package/dist/ui/components/nature/creatures/Robin.svelte +98 -0
  52. package/dist/ui/components/nature/creatures/Robin.svelte.d.ts +12 -0
  53. package/dist/ui/components/nature/creatures/Squirrel.svelte +97 -0
  54. package/dist/ui/components/nature/creatures/Squirrel.svelte.d.ts +9 -0
  55. package/dist/ui/components/nature/creatures/index.d.ts +13 -0
  56. package/dist/ui/components/nature/creatures/index.js +14 -0
  57. package/dist/ui/components/nature/ground/Bush.svelte +57 -0
  58. package/dist/ui/components/nature/ground/Bush.svelte.d.ts +10 -0
  59. package/dist/ui/components/nature/ground/Crocus.svelte +83 -0
  60. package/dist/ui/components/nature/ground/Crocus.svelte.d.ts +12 -0
  61. package/dist/ui/components/nature/ground/Daffodil.svelte +75 -0
  62. package/dist/ui/components/nature/ground/Daffodil.svelte.d.ts +11 -0
  63. package/dist/ui/components/nature/ground/Fern.svelte +72 -0
  64. package/dist/ui/components/nature/ground/Fern.svelte.d.ts +10 -0
  65. package/dist/ui/components/nature/ground/FlowerWild.svelte +60 -0
  66. package/dist/ui/components/nature/ground/FlowerWild.svelte.d.ts +10 -0
  67. package/dist/ui/components/nature/ground/GrassTuft.svelte +49 -0
  68. package/dist/ui/components/nature/ground/GrassTuft.svelte.d.ts +10 -0
  69. package/dist/ui/components/nature/ground/Log.svelte +42 -0
  70. package/dist/ui/components/nature/ground/Log.svelte.d.ts +7 -0
  71. package/dist/ui/components/nature/ground/Mushroom.svelte +48 -0
  72. package/dist/ui/components/nature/ground/Mushroom.svelte.d.ts +9 -0
  73. package/dist/ui/components/nature/ground/MushroomCluster.svelte +41 -0
  74. package/dist/ui/components/nature/ground/MushroomCluster.svelte.d.ts +8 -0
  75. package/dist/ui/components/nature/ground/Rock.svelte +59 -0
  76. package/dist/ui/components/nature/ground/Rock.svelte.d.ts +8 -0
  77. package/dist/ui/components/nature/ground/Stump.svelte +44 -0
  78. package/dist/ui/components/nature/ground/Stump.svelte.d.ts +8 -0
  79. package/dist/ui/components/nature/ground/Tulip.svelte +79 -0
  80. package/dist/ui/components/nature/ground/Tulip.svelte.d.ts +11 -0
  81. package/dist/ui/components/nature/ground/index.d.ts +12 -0
  82. package/dist/ui/components/nature/ground/index.js +13 -0
  83. package/dist/ui/components/nature/index.d.ts +28 -0
  84. package/dist/ui/components/nature/index.js +38 -0
  85. package/dist/ui/components/nature/palette.d.ts +491 -0
  86. package/dist/ui/components/nature/palette.js +384 -0
  87. package/dist/ui/components/nature/sky/Cloud.svelte +122 -0
  88. package/dist/ui/components/nature/sky/Cloud.svelte.d.ts +11 -0
  89. package/dist/ui/components/nature/sky/CloudWispy.svelte +79 -0
  90. package/dist/ui/components/nature/sky/CloudWispy.svelte.d.ts +9 -0
  91. package/dist/ui/components/nature/sky/Moon.svelte +60 -0
  92. package/dist/ui/components/nature/sky/Moon.svelte.d.ts +9 -0
  93. package/dist/ui/components/nature/sky/Rainbow.svelte +101 -0
  94. package/dist/ui/components/nature/sky/Rainbow.svelte.d.ts +8 -0
  95. package/dist/ui/components/nature/sky/Star.svelte +84 -0
  96. package/dist/ui/components/nature/sky/Star.svelte.d.ts +10 -0
  97. package/dist/ui/components/nature/sky/StarCluster.svelte +85 -0
  98. package/dist/ui/components/nature/sky/StarCluster.svelte.d.ts +9 -0
  99. package/dist/ui/components/nature/sky/StarShooting.svelte +90 -0
  100. package/dist/ui/components/nature/sky/StarShooting.svelte.d.ts +9 -0
  101. package/dist/ui/components/nature/sky/Sun.svelte +70 -0
  102. package/dist/ui/components/nature/sky/Sun.svelte.d.ts +9 -0
  103. package/dist/ui/components/nature/sky/index.d.ts +8 -0
  104. package/dist/ui/components/nature/sky/index.js +9 -0
  105. package/dist/ui/components/nature/structural/Birdhouse.svelte +53 -0
  106. package/dist/ui/components/nature/structural/Birdhouse.svelte.d.ts +8 -0
  107. package/dist/ui/components/nature/structural/Bridge.svelte +65 -0
  108. package/dist/ui/components/nature/structural/Bridge.svelte.d.ts +7 -0
  109. package/dist/ui/components/nature/structural/FencePost.svelte +54 -0
  110. package/dist/ui/components/nature/structural/FencePost.svelte.d.ts +8 -0
  111. package/dist/ui/components/nature/structural/GardenGate.svelte +70 -0
  112. package/dist/ui/components/nature/structural/GardenGate.svelte.d.ts +8 -0
  113. package/dist/ui/components/nature/structural/Lantern.svelte +113 -0
  114. package/dist/ui/components/nature/structural/Lantern.svelte.d.ts +10 -0
  115. package/dist/ui/components/nature/structural/Lattice.svelte +89 -0
  116. package/dist/ui/components/nature/structural/Lattice.svelte.d.ts +8 -0
  117. package/dist/ui/components/nature/structural/LatticeWithVine.svelte +89 -0
  118. package/dist/ui/components/nature/structural/LatticeWithVine.svelte.d.ts +11 -0
  119. package/dist/ui/components/nature/structural/StonePath.svelte +48 -0
  120. package/dist/ui/components/nature/structural/StonePath.svelte.d.ts +7 -0
  121. package/dist/ui/components/nature/structural/index.d.ts +8 -0
  122. package/dist/ui/components/nature/structural/index.js +9 -0
  123. package/dist/ui/components/nature/trees/TreeAspen.svelte +163 -0
  124. package/dist/ui/components/nature/trees/TreeAspen.svelte.d.ts +11 -0
  125. package/dist/ui/components/nature/trees/TreeBirch.svelte +186 -0
  126. package/dist/ui/components/nature/trees/TreeBirch.svelte.d.ts +11 -0
  127. package/dist/ui/components/nature/trees/TreeCherry.svelte +108 -0
  128. package/dist/ui/components/nature/trees/TreeCherry.svelte.d.ts +11 -0
  129. package/dist/ui/components/nature/trees/TreePine.svelte +79 -0
  130. package/dist/ui/components/nature/trees/TreePine.svelte.d.ts +11 -0
  131. package/dist/ui/components/nature/trees/index.d.ts +4 -0
  132. package/dist/ui/components/nature/trees/index.js +5 -0
  133. package/dist/ui/components/nature/water/LilyPad.svelte +99 -0
  134. package/dist/ui/components/nature/water/LilyPad.svelte.d.ts +10 -0
  135. package/dist/ui/components/nature/water/Pond.svelte +104 -0
  136. package/dist/ui/components/nature/water/Pond.svelte.d.ts +8 -0
  137. package/dist/ui/components/nature/water/Reeds.svelte +85 -0
  138. package/dist/ui/components/nature/water/Reeds.svelte.d.ts +11 -0
  139. package/dist/ui/components/nature/water/Stream.svelte +98 -0
  140. package/dist/ui/components/nature/water/Stream.svelte.d.ts +8 -0
  141. package/dist/ui/components/nature/water/index.d.ts +4 -0
  142. package/dist/ui/components/nature/water/index.js +5 -0
  143. package/dist/ui/components/nature/weather/SnowfallLayer.svelte +175 -0
  144. package/dist/ui/components/nature/weather/SnowfallLayer.svelte.d.ts +25 -0
  145. package/dist/ui/components/nature/weather/Snowflake.svelte +99 -0
  146. package/dist/ui/components/nature/weather/Snowflake.svelte.d.ts +11 -0
  147. package/dist/ui/components/nature/weather/SnowflakeFalling.svelte +162 -0
  148. package/dist/ui/components/nature/weather/SnowflakeFalling.svelte.d.ts +23 -0
  149. package/dist/ui/components/nature/weather/index.d.ts +3 -0
  150. package/dist/ui/components/nature/weather/index.js +4 -0
  151. package/dist/ui/components/ui/GlassLogo.svelte +422 -0
  152. package/dist/ui/components/ui/GlassLogo.svelte.d.ts +23 -0
  153. package/dist/ui/components/ui/GlassNavbar.svelte +120 -0
  154. package/dist/ui/components/ui/GlassNavbar.svelte.d.ts +42 -0
  155. package/dist/ui/components/ui/Logo.svelte +47 -52
  156. package/dist/ui/components/ui/Logo.svelte.d.ts +4 -3
  157. package/dist/ui/components/ui/index.d.ts +2 -0
  158. package/dist/ui/components/ui/index.js +2 -0
  159. package/dist/ui/styles/grove.css +15 -1
  160. package/package.json +11 -1
@@ -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,8 @@
1
+ interface Props {
2
+ class?: string;
3
+ opacity?: number;
4
+ animate?: boolean;
5
+ }
6
+ declare const Rainbow: import("svelte").Component<Props, {}, "">;
7
+ type Rainbow = ReturnType<typeof Rainbow>;
8
+ export default Rainbow;
@@ -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,9 @@
1
+ interface Props {
2
+ class?: string;
3
+ color?: string;
4
+ rays?: boolean;
5
+ animate?: boolean;
6
+ }
7
+ declare const Sun: import("svelte").Component<Props, {}, "">;
8
+ type Sun = ReturnType<typeof Sun>;
9
+ export default Sun;
@@ -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,8 @@
1
+ interface Props {
2
+ class?: string;
3
+ bodyColor?: string;
4
+ roofColor?: string;
5
+ }
6
+ declare const Birdhouse: import("svelte").Component<Props, {}, "">;
7
+ type Birdhouse = ReturnType<typeof Birdhouse>;
8
+ export default Birdhouse;
@@ -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>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ class?: string;
3
+ woodColor?: string;
4
+ }
5
+ declare const Bridge: import("svelte").Component<Props, {}, "">;
6
+ type Bridge = ReturnType<typeof Bridge>;
7
+ export default Bridge;