@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,57 @@
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 type { Season } from '../palette';
8
+ import { greens, autumn, bark } from '../palette';
9
+
10
+ interface Props {
11
+ class?: string;
12
+ color?: string;
13
+ season?: Season;
14
+ animate?: boolean;
15
+ }
16
+
17
+ let {
18
+ class: className = 'w-8 h-8',
19
+ color,
20
+ season = 'summer',
21
+ animate = false
22
+ }: Props = $props();
23
+
24
+ // Bushes turn warm colors in autumn
25
+ const defaultColor = $derived(season === 'autumn' ? autumn.amber : greens.grove);
26
+ const foliageColor = $derived(color ?? defaultColor);
27
+ const shadowColor = $derived(season === 'autumn' ? autumn.rust : greens.deepGreen);
28
+ </script>
29
+
30
+ <!-- Round bush/shrub -->
31
+ <svg class="{className} {animate ? 'sway' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 60">
32
+ <!-- Base shadow/depth -->
33
+ <ellipse fill={shadowColor} cx="40" cy="45" rx="35" ry="15" opacity="0.5" />
34
+
35
+ <!-- Main foliage clusters -->
36
+ <ellipse fill={foliageColor} cx="40" cy="35" rx="32" ry="25" />
37
+ <ellipse fill={foliageColor} cx="22" cy="40" rx="20" ry="18" />
38
+ <ellipse fill={foliageColor} cx="58" cy="40" rx="20" ry="18" />
39
+ <ellipse fill={foliageColor} cx="40" cy="22" rx="22" ry="16" />
40
+ <ellipse fill={foliageColor} cx="28" cy="28" rx="15" ry="12" />
41
+ <ellipse fill={foliageColor} cx="52" cy="28" rx="15" ry="12" />
42
+
43
+ <!-- Ground hint -->
44
+ <ellipse fill={bark.bark} cx="40" cy="55" rx="15" ry="4" opacity="0.3" />
45
+ </svg>
46
+
47
+ <style>
48
+ @keyframes sway {
49
+ 0%, 100% { transform: rotate(0deg); }
50
+ 50% { transform: rotate(0.5deg); }
51
+ }
52
+
53
+ .sway {
54
+ transform-origin: center bottom;
55
+ animation: sway 4s ease-in-out infinite;
56
+ }
57
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { Season } from '../palette';
2
+ interface Props {
3
+ class?: string;
4
+ color?: string;
5
+ season?: Season;
6
+ animate?: boolean;
7
+ }
8
+ declare const Bush: import("svelte").Component<Props, {}, "">;
9
+ type Bush = ReturnType<typeof Bush>;
10
+ export default Bush;
@@ -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 { greens, spring } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ style?: string;
12
+ petalColor?: string;
13
+ centerColor?: string;
14
+ stemColor?: string;
15
+ variant?: 'purple' | 'yellow' | 'white';
16
+ animate?: boolean;
17
+ }
18
+
19
+ let {
20
+ class: className = 'w-4 h-6',
21
+ style,
22
+ petalColor,
23
+ centerColor,
24
+ stemColor,
25
+ variant = 'purple',
26
+ animate = true
27
+ }: Props = $props();
28
+
29
+ // Crocus color variants - early spring bloomers
30
+ const variantColors = {
31
+ purple: spring.crocus,
32
+ yellow: spring.buttercup,
33
+ white: '#fafafa'
34
+ };
35
+
36
+ const petals = $derived(petalColor ?? variantColors[variant]);
37
+ const center = $derived(centerColor ?? '#f97316'); // Orange stamen
38
+ const stem = $derived(stemColor ?? greens.deepGreen);
39
+
40
+ // Slightly different shade for depth
41
+ const petalDark = $derived(variant === 'purple' ? '#7c3aed' :
42
+ variant === 'yellow' ? '#eab308' :
43
+ '#e5e5e5');
44
+ </script>
45
+
46
+ <!-- Crocus - first flowers of spring, often peeking through snow -->
47
+ <svg class="{className} {animate ? 'emerge' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 60" style={style}>
48
+ <!-- Stem - short, crocus blooms close to ground -->
49
+ <path fill="none" stroke={stem} stroke-width="2" d="M20 60 Q19 50 20 42" />
50
+
51
+ <!-- Grass-like leaves -->
52
+ <path fill={stem} d="M20 58 Q14 50 12 55 Q16 48 20 52" />
53
+ <path fill={stem} d="M20 55 Q26 47 28 52 Q24 45 20 50" />
54
+ <path fill={stem} d="M18 52 Q10 40 8 45 Q14 38 18 45" />
55
+ <path fill={stem} d="M22 52 Q30 40 32 45 Q26 38 22 45" />
56
+
57
+ <!-- Crocus bloom - goblet-shaped with pointed petals -->
58
+ <!-- Outer petals -->
59
+ <path fill={petals} d="M10 40 Q8 28 14 15 Q20 8 20 8 Q12 20 10 40" />
60
+ <path fill={petals} d="M30 40 Q32 28 26 15 Q20 8 20 8 Q28 20 30 40" />
61
+ <path fill={petals} d="M15 42 Q10 30 18 12 Q20 8 20 8 Q15 18 15 42" />
62
+ <path fill={petals} d="M25 42 Q30 30 22 12 Q20 8 20 8 Q25 18 25 42" />
63
+
64
+ <!-- Inner petals (darker) -->
65
+ <path fill={petalDark} d="M17 38 Q15 28 19 16 Q20 12 20 12 Q18 22 17 38" opacity="0.6" />
66
+ <path fill={petalDark} d="M23 38 Q25 28 21 16 Q20 12 20 12 Q22 22 23 38" opacity="0.6" />
67
+
68
+ <!-- Center/stamen - distinctive orange -->
69
+ <ellipse fill={center} cx="20" cy="35" rx="3" ry="4" />
70
+ <path fill="#ea580c" d="M19 32 L20 25 L21 32" opacity="0.8" />
71
+ </svg>
72
+
73
+ <style>
74
+ @keyframes emerge {
75
+ 0%, 100% { transform: translateY(0) scale(1); }
76
+ 50% { transform: translateY(-1px) scale(1.02); }
77
+ }
78
+
79
+ .emerge {
80
+ transform-origin: center bottom;
81
+ animation: emerge 4s ease-in-out infinite;
82
+ }
83
+ </style>
@@ -0,0 +1,12 @@
1
+ interface Props {
2
+ class?: string;
3
+ style?: string;
4
+ petalColor?: string;
5
+ centerColor?: string;
6
+ stemColor?: string;
7
+ variant?: 'purple' | 'yellow' | 'white';
8
+ animate?: boolean;
9
+ }
10
+ declare const Crocus: import("svelte").Component<Props, {}, "">;
11
+ type Crocus = ReturnType<typeof Crocus>;
12
+ export default Crocus;
@@ -0,0 +1,75 @@
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 { greens, spring } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ style?: string;
12
+ petalColor?: string;
13
+ trumpetColor?: string;
14
+ stemColor?: string;
15
+ animate?: boolean;
16
+ }
17
+
18
+ let {
19
+ class: className = 'w-5 h-8',
20
+ style,
21
+ petalColor,
22
+ trumpetColor,
23
+ stemColor,
24
+ animate = true
25
+ }: Props = $props();
26
+
27
+ const petals = $derived(petalColor ?? spring.daffodil); // Pale yellow petals
28
+ const trumpet = $derived(trumpetColor ?? spring.buttercup); // Deeper yellow/orange trumpet
29
+ const stem = $derived(stemColor ?? greens.deepGreen);
30
+ </script>
31
+
32
+ <!-- Daffodil - classic spring herald -->
33
+ <svg class="{className} {animate ? 'nod' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 80" style={style}>
34
+ <!-- Stem - curved like real daffodils -->
35
+ <path fill="none" stroke={stem} stroke-width="2.5" d="M25 80 Q23 65 25 50 Q28 42 32 38" />
36
+
37
+ <!-- Long strap-like leaves -->
38
+ <path fill={stem} d="M25 78 Q15 65 10 70 Q18 60 25 68" />
39
+ <path fill={stem} d="M25 72 Q35 58 40 63 Q32 52 25 62" />
40
+ <path fill={stem} d="M23 65 Q10 50 5 58 Q15 45 23 55" />
41
+
42
+ <!-- Flower faces slightly to the side (characteristic daffodil pose) -->
43
+ <g transform="rotate(-15 32 28)">
44
+ <!-- Back petals (6 petals in star pattern) -->
45
+ <ellipse fill={petals} cx="32" cy="18" rx="5" ry="12" />
46
+ <ellipse fill={petals} cx="32" cy="18" rx="5" ry="12" transform="rotate(60 32 28)" />
47
+ <ellipse fill={petals} cx="32" cy="18" rx="5" ry="12" transform="rotate(120 32 28)" />
48
+ <ellipse fill={petals} cx="32" cy="38" rx="5" ry="12" />
49
+ <ellipse fill={petals} cx="32" cy="38" rx="5" ry="12" transform="rotate(60 32 28)" />
50
+ <ellipse fill={petals} cx="32" cy="38" rx="5" ry="12" transform="rotate(120 32 28)" />
51
+
52
+ <!-- Central trumpet/corona - the distinctive feature -->
53
+ <ellipse fill={trumpet} cx="32" cy="28" rx="7" ry="8" />
54
+ <!-- Trumpet rim - ruffled edge effect -->
55
+ <ellipse fill="none" stroke={trumpet} stroke-width="2" cx="32" cy="24" rx="6" ry="4" opacity="0.8" />
56
+ <!-- Inner trumpet shadow -->
57
+ <ellipse fill="#d97706" cx="32" cy="28" rx="4" ry="5" opacity="0.5" />
58
+
59
+ <!-- Stamen in center -->
60
+ <circle fill="#f97316" cx="32" cy="30" r="2" />
61
+ </g>
62
+ </svg>
63
+
64
+ <style>
65
+ @keyframes nod {
66
+ 0%, 100% { transform: rotate(0deg); }
67
+ 25% { transform: rotate(2deg); }
68
+ 75% { transform: rotate(-1deg); }
69
+ }
70
+
71
+ .nod {
72
+ transform-origin: center bottom;
73
+ animation: nod 3.5s ease-in-out infinite;
74
+ }
75
+ </style>
@@ -0,0 +1,11 @@
1
+ interface Props {
2
+ class?: string;
3
+ style?: string;
4
+ petalColor?: string;
5
+ trumpetColor?: string;
6
+ stemColor?: string;
7
+ animate?: boolean;
8
+ }
9
+ declare const Daffodil: import("svelte").Component<Props, {}, "">;
10
+ type Daffodil = ReturnType<typeof Daffodil>;
11
+ export default Daffodil;
@@ -0,0 +1,72 @@
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 type { Season } from '../palette';
8
+ import { greens, autumn } from '../palette';
9
+
10
+ interface Props {
11
+ class?: string;
12
+ color?: string;
13
+ season?: Season;
14
+ animate?: boolean;
15
+ }
16
+
17
+ let {
18
+ class: className = 'w-6 h-6',
19
+ color,
20
+ season = 'summer',
21
+ animate = true
22
+ }: Props = $props();
23
+
24
+ // Ferns turn golden/brown in autumn
25
+ const defaultColor = $derived(season === 'autumn' ? autumn.gold : greens.deepGreen);
26
+ const frondColor = $derived(color ?? defaultColor);
27
+ </script>
28
+
29
+ <!-- Curled fern frond -->
30
+ <svg class="{className} {animate ? 'sway' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 70">
31
+ <!-- Main stem -->
32
+ <path
33
+ fill="none"
34
+ stroke={frondColor}
35
+ stroke-width="2"
36
+ d="M25 70 Q24 50 26 35 Q28 20 35 8"
37
+ />
38
+
39
+ <!-- Left leaflets -->
40
+ <path fill={frondColor} d="M24 60 Q15 55 10 58 Q18 52 24 55" />
41
+ <path fill={frondColor} d="M24 50 Q12 44 6 48 Q16 40 24 45" />
42
+ <path fill={frondColor} d="M25 40 Q14 32 8 36 Q17 28 25 34" />
43
+ <path fill={frondColor} d="M27 30 Q18 22 14 26 Q21 18 27 24" />
44
+ <path fill={frondColor} d="M30 22 Q24 15 22 18 Q27 12 32 16" />
45
+
46
+ <!-- Right leaflets -->
47
+ <path fill={frondColor} d="M26 60 Q35 55 40 58 Q32 52 26 55" />
48
+ <path fill={frondColor} d="M26 50 Q38 44 44 48 Q34 40 26 45" />
49
+ <path fill={frondColor} d="M27 40 Q38 32 44 36 Q35 28 27 34" />
50
+ <path fill={frondColor} d="M29 30 Q38 22 42 26 Q35 18 29 24" />
51
+ <path fill={frondColor} d="M33 22 Q38 16 40 18 Q36 12 32 16" />
52
+
53
+ <!-- Curled tip -->
54
+ <path
55
+ fill="none"
56
+ stroke={frondColor}
57
+ stroke-width="1.5"
58
+ d="M35 8 Q42 4 44 8 Q44 12 40 12"
59
+ />
60
+ </svg>
61
+
62
+ <style>
63
+ @keyframes sway {
64
+ 0%, 100% { transform: rotate(0deg); }
65
+ 50% { transform: rotate(2deg); }
66
+ }
67
+
68
+ .sway {
69
+ transform-origin: center bottom;
70
+ animation: sway 3s ease-in-out infinite;
71
+ }
72
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { Season } from '../palette';
2
+ interface Props {
3
+ class?: string;
4
+ color?: string;
5
+ season?: Season;
6
+ animate?: boolean;
7
+ }
8
+ declare const Fern: import("svelte").Component<Props, {}, "">;
9
+ type Fern = ReturnType<typeof Fern>;
10
+ export default Fern;
@@ -0,0 +1,60 @@
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, greens } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ petalColor?: string;
12
+ centerColor?: string;
13
+ stemColor?: string;
14
+ animate?: boolean;
15
+ }
16
+
17
+ let {
18
+ class: className = 'w-4 h-6',
19
+ petalColor,
20
+ centerColor,
21
+ stemColor,
22
+ animate = true
23
+ }: Props = $props();
24
+
25
+ const petals = $derived(petalColor ?? accents.flower.purple);
26
+ const center = $derived(centerColor ?? accents.flower.yellow);
27
+ const stem = $derived(stemColor ?? greens.deepGreen);
28
+ </script>
29
+
30
+ <!-- Simple 5-petal wildflower -->
31
+ <svg class="{className} {animate ? 'sway' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 60">
32
+ <!-- Stem -->
33
+ <path fill="none" stroke={stem} stroke-width="2" d="M20 60 Q18 45 20 30" />
34
+
35
+ <!-- Leaves -->
36
+ <path fill={stem} d="M20 50 Q12 45 8 48 Q14 42 20 45" />
37
+ <path fill={stem} d="M20 42 Q28 37 32 40 Q26 34 20 38" />
38
+
39
+ <!-- Petals -->
40
+ <ellipse fill={petals} cx="20" cy="12" rx="6" ry="10" />
41
+ <ellipse fill={petals} cx="10" cy="20" rx="6" ry="10" transform="rotate(-72 10 20)" />
42
+ <ellipse fill={petals} cx="30" cy="20" rx="6" ry="10" transform="rotate(72 30 20)" />
43
+ <ellipse fill={petals} cx="13" cy="28" rx="6" ry="10" transform="rotate(-144 13 28)" />
44
+ <ellipse fill={petals} cx="27" cy="28" rx="6" ry="10" transform="rotate(144 27 28)" />
45
+
46
+ <!-- Center -->
47
+ <circle fill={center} cx="20" cy="22" r="5" />
48
+ </svg>
49
+
50
+ <style>
51
+ @keyframes sway {
52
+ 0%, 100% { transform: rotate(0deg); }
53
+ 50% { transform: rotate(3deg); }
54
+ }
55
+
56
+ .sway {
57
+ transform-origin: center bottom;
58
+ animation: sway 2.8s ease-in-out infinite;
59
+ }
60
+ </style>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ class?: string;
3
+ petalColor?: string;
4
+ centerColor?: string;
5
+ stemColor?: string;
6
+ animate?: boolean;
7
+ }
8
+ declare const FlowerWild: import("svelte").Component<Props, {}, "">;
9
+ type FlowerWild = ReturnType<typeof FlowerWild>;
10
+ export default FlowerWild;
@@ -0,0 +1,49 @@
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 type { Season } from '../palette';
8
+ import { greens, autumn } from '../palette';
9
+
10
+ interface Props {
11
+ class?: string;
12
+ color?: string;
13
+ season?: Season;
14
+ animate?: boolean;
15
+ }
16
+
17
+ let {
18
+ class: className = 'w-4 h-4',
19
+ color,
20
+ season = 'summer',
21
+ animate = true
22
+ }: Props = $props();
23
+
24
+ // Grass turns golden/straw in autumn
25
+ const defaultColor = $derived(season === 'autumn' ? autumn.straw : greens.meadow);
26
+ const grassColor = $derived(color ?? defaultColor);
27
+ </script>
28
+
29
+ <!-- Cluster of grass blades -->
30
+ <svg class="{className} {animate ? 'sway' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 50">
31
+ <!-- Grass blades - varying heights and angles -->
32
+ <path fill={grassColor} d="M20 50 L18 50 Q16 30 12 10 Q14 8 16 10 Q19 28 20 50" />
33
+ <path fill={grassColor} d="M22 50 L24 50 Q26 25 30 5 Q28 3 26 5 Q23 22 22 50" />
34
+ <path fill={grassColor} d="M18 50 L16 50 Q10 35 4 20 Q6 18 8 20 Q14 32 18 50" />
35
+ <path fill={grassColor} d="M24 50 L26 50 Q32 30 38 15 Q36 13 34 15 Q28 28 24 50" />
36
+ <path fill={grassColor} d="M20 50 L22 50 Q22 35 24 18 Q22 16 20 18 Q20 32 20 50" />
37
+ </svg>
38
+
39
+ <style>
40
+ @keyframes sway {
41
+ 0%, 100% { transform: skewX(0deg); }
42
+ 50% { transform: skewX(2deg); }
43
+ }
44
+
45
+ .sway {
46
+ transform-origin: center bottom;
47
+ animation: sway 2.5s ease-in-out infinite;
48
+ }
49
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { Season } from '../palette';
2
+ interface Props {
3
+ class?: string;
4
+ color?: string;
5
+ season?: Season;
6
+ animate?: boolean;
7
+ }
8
+ declare const GrassTuft: import("svelte").Component<Props, {}, "">;
9
+ type GrassTuft = ReturnType<typeof GrassTuft>;
10
+ export default GrassTuft;
@@ -0,0 +1,42 @@
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
+ barkColor?: string;
12
+ }
13
+
14
+ let {
15
+ class: className = 'w-12 h-4',
16
+ barkColor
17
+ }: Props = $props();
18
+
19
+ const barkFill = $derived(barkColor ?? bark.warmBark);
20
+ const innerColor = earth.sand;
21
+ const ringColor = bark.bark;
22
+ </script>
23
+
24
+ <!-- Fallen log -->
25
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 35">
26
+ <!-- Main log body -->
27
+ <path fill={barkFill} d="M15 8 L85 5 Q95 10 95 20 Q95 30 85 32 L15 30 Q5 25 5 18 Q5 12 15 8" />
28
+
29
+ <!-- Log end (cut face) -->
30
+ <ellipse fill={innerColor} cx="90" cy="18" rx="8" ry="14" />
31
+ <ellipse fill="none" stroke={ringColor} stroke-width="1" cx="90" cy="18" rx="5" ry="10" opacity="0.5" />
32
+ <ellipse fill="none" stroke={ringColor} stroke-width="0.5" cx="90" cy="18" rx="2" ry="5" opacity="0.4" />
33
+
34
+ <!-- Bark texture -->
35
+ <path fill="none" stroke={bark.darkBark} stroke-width="1" d="M20 10 Q22 18 20 28" opacity="0.3" />
36
+ <path fill="none" stroke={bark.darkBark} stroke-width="1" d="M40 8 Q42 18 40 30" opacity="0.3" />
37
+ <path fill="none" stroke={bark.darkBark} stroke-width="1" d="M60 6 Q62 17 60 31" opacity="0.3" />
38
+ <path fill="none" stroke={bark.darkBark} stroke-width="1" d="M75 6 Q77 17 75 31" opacity="0.3" />
39
+
40
+ <!-- Highlight -->
41
+ <path fill={earth.clay} d="M20 10 Q50 6 80 7 Q50 12 20 14" opacity="0.2" />
42
+ </svg>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ class?: string;
3
+ barkColor?: string;
4
+ }
5
+ declare const Log: import("svelte").Component<Props, {}, "">;
6
+ type Log = ReturnType<typeof Log>;
7
+ export default Log;
@@ -0,0 +1,48 @@
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, earth } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ capColor?: string;
12
+ stemColor?: string;
13
+ spotted?: boolean;
14
+ }
15
+
16
+ let {
17
+ class: className = 'w-6 h-6',
18
+ capColor,
19
+ stemColor,
20
+ spotted = true
21
+ }: Props = $props();
22
+
23
+ const cap = $derived(capColor ?? accents.mushroom.redCap);
24
+ const stem = $derived(stemColor ?? earth.sand);
25
+ const spots = accents.mushroom.spots;
26
+ </script>
27
+
28
+ <!-- Classic toadstool mushroom -->
29
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 70">
30
+ <!-- Stem -->
31
+ <path fill={stem} d="M22 40 Q20 55 18 70 L42 70 Q40 55 38 40 Q30 38 22 40" />
32
+
33
+ <!-- Cap -->
34
+ <ellipse fill={cap} cx="30" cy="28" rx="28" ry="20" />
35
+ <ellipse fill={cap} cx="30" cy="38" rx="20" ry="6" />
36
+
37
+ <!-- Spots -->
38
+ {#if spotted}
39
+ <circle fill={spots} cx="20" cy="22" r="4" />
40
+ <circle fill={spots} cx="38" cy="18" r="5" />
41
+ <circle fill={spots} cx="30" cy="30" r="3" />
42
+ <circle fill={spots} cx="44" cy="28" r="3" />
43
+ <circle fill={spots} cx="14" cy="32" r="2.5" />
44
+ {/if}
45
+
46
+ <!-- Cap underside hint -->
47
+ <ellipse fill={accents.mushroom.gill} cx="30" cy="40" rx="14" ry="3" opacity="0.6" />
48
+ </svg>
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ class?: string;
3
+ capColor?: string;
4
+ stemColor?: string;
5
+ spotted?: boolean;
6
+ }
7
+ declare const Mushroom: import("svelte").Component<Props, {}, "">;
8
+ type Mushroom = ReturnType<typeof Mushroom>;
9
+ export default Mushroom;
@@ -0,0 +1,41 @@
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, earth } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ capColor?: string;
12
+ stemColor?: string;
13
+ }
14
+
15
+ let {
16
+ class: className = 'w-8 h-8',
17
+ capColor,
18
+ stemColor
19
+ }: Props = $props();
20
+
21
+ const cap = $derived(capColor ?? accents.mushroom.brownCap);
22
+ const stem = $derived(stemColor ?? earth.sand);
23
+ </script>
24
+
25
+ <!-- Cluster of small mushrooms -->
26
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 60">
27
+ <!-- Large mushroom (center) -->
28
+ <path fill={stem} d="M36 32 Q34 45 33 60 L47 60 Q46 45 44 32 Q40 30 36 32" />
29
+ <ellipse fill={cap} cx="40" cy="24" rx="18" ry="14" />
30
+ <ellipse fill={cap} cx="40" cy="32" rx="12" ry="4" />
31
+
32
+ <!-- Small mushroom (left) -->
33
+ <path fill={stem} d="M12 42 Q11 50 10 60 L22 60 Q21 50 20 42 Q16 40 12 42" />
34
+ <ellipse fill={cap} cx="16" cy="36" rx="12" ry="10" />
35
+ <ellipse fill={cap} cx="16" cy="42" rx="8" ry="3" />
36
+
37
+ <!-- Tiny mushroom (right) -->
38
+ <path fill={stem} d="M60 48 Q59 54 58 60 L68 60 Q67 54 66 48 Q63 46 60 48" />
39
+ <ellipse fill={cap} cx="63" cy="43" rx="9" ry="7" />
40
+ <ellipse fill={cap} cx="63" cy="48" rx="6" ry="2" />
41
+ </svg>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ class?: string;
3
+ capColor?: string;
4
+ stemColor?: string;
5
+ }
6
+ declare const MushroomCluster: import("svelte").Component<Props, {}, "">;
7
+ type MushroomCluster = ReturnType<typeof MushroomCluster>;
8
+ export default MushroomCluster;