@autumnsgrove/groveengine 0.7.0 → 0.8.5

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 (230) hide show
  1. package/dist/components/OnboardingChecklist.svelte +2 -2
  2. package/dist/components/WispButton.svelte +83 -0
  3. package/dist/components/WispButton.svelte.d.ts +49 -0
  4. package/dist/components/WispPanel.svelte +1093 -0
  5. package/dist/components/WispPanel.svelte.d.ts +49 -0
  6. package/dist/components/custom/TableOfContents.svelte +12 -1
  7. package/dist/components/quota/UpgradePrompt.svelte +1 -0
  8. package/dist/config/wisp.d.ts +145 -0
  9. package/dist/config/wisp.js +175 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +3 -0
  12. package/dist/server/inference-client.d.ts +139 -0
  13. package/dist/server/inference-client.js +294 -0
  14. package/dist/ui/components/content/RoadmapPreview.svelte +91 -0
  15. package/dist/ui/components/content/RoadmapPreview.svelte.d.ts +36 -0
  16. package/dist/ui/components/content/index.d.ts +1 -0
  17. package/dist/ui/components/content/index.js +1 -0
  18. package/dist/ui/components/nature/Logo.svelte +260 -0
  19. package/dist/ui/components/nature/Logo.svelte.d.ts +14 -0
  20. package/dist/ui/components/nature/botanical/Acorn.svelte +48 -0
  21. package/dist/ui/components/nature/botanical/Acorn.svelte.d.ts +8 -0
  22. package/dist/ui/components/nature/botanical/Berry.svelte +67 -0
  23. package/dist/ui/components/nature/botanical/Berry.svelte.d.ts +8 -0
  24. package/dist/ui/components/nature/botanical/DandelionPuff.svelte +98 -0
  25. package/dist/ui/components/nature/botanical/DandelionPuff.svelte.d.ts +8 -0
  26. package/dist/ui/components/nature/botanical/FallingLeavesLayer.svelte +170 -0
  27. package/dist/ui/components/nature/botanical/FallingLeavesLayer.svelte.d.ts +35 -0
  28. package/dist/ui/components/nature/botanical/FallingPetalsLayer.svelte +174 -0
  29. package/dist/ui/components/nature/botanical/FallingPetalsLayer.svelte.d.ts +25 -0
  30. package/dist/ui/components/nature/botanical/Leaf.svelte +77 -0
  31. package/dist/ui/components/nature/botanical/Leaf.svelte.d.ts +10 -0
  32. package/dist/ui/components/nature/botanical/LeafFalling.svelte +186 -0
  33. package/dist/ui/components/nature/botanical/LeafFalling.svelte.d.ts +22 -0
  34. package/dist/ui/components/nature/botanical/PetalFalling.svelte +266 -0
  35. package/dist/ui/components/nature/botanical/PetalFalling.svelte.d.ts +25 -0
  36. package/dist/ui/components/nature/botanical/PineCone.svelte +61 -0
  37. package/dist/ui/components/nature/botanical/PineCone.svelte.d.ts +7 -0
  38. package/dist/ui/components/nature/botanical/Vine.svelte +102 -0
  39. package/dist/ui/components/nature/botanical/Vine.svelte.d.ts +11 -0
  40. package/dist/ui/components/nature/botanical/index.d.ts +10 -0
  41. package/dist/ui/components/nature/botanical/index.js +11 -0
  42. package/dist/ui/components/nature/creatures/Bee.svelte +78 -0
  43. package/dist/ui/components/nature/creatures/Bee.svelte.d.ts +9 -0
  44. package/dist/ui/components/nature/creatures/Bird.svelte +94 -0
  45. package/dist/ui/components/nature/creatures/Bird.svelte.d.ts +11 -0
  46. package/dist/ui/components/nature/creatures/BirdFlying.svelte +83 -0
  47. package/dist/ui/components/nature/creatures/BirdFlying.svelte.d.ts +9 -0
  48. package/dist/ui/components/nature/creatures/Bluebird.svelte +95 -0
  49. package/dist/ui/components/nature/creatures/Bluebird.svelte.d.ts +12 -0
  50. package/dist/ui/components/nature/creatures/Butterfly.svelte +87 -0
  51. package/dist/ui/components/nature/creatures/Butterfly.svelte.d.ts +9 -0
  52. package/dist/ui/components/nature/creatures/Cardinal.svelte +95 -0
  53. package/dist/ui/components/nature/creatures/Cardinal.svelte.d.ts +12 -0
  54. package/dist/ui/components/nature/creatures/Chickadee.svelte +97 -0
  55. package/dist/ui/components/nature/creatures/Chickadee.svelte.d.ts +12 -0
  56. package/dist/ui/components/nature/creatures/Deer.svelte +95 -0
  57. package/dist/ui/components/nature/creatures/Deer.svelte.d.ts +9 -0
  58. package/dist/ui/components/nature/creatures/Firefly.svelte +111 -0
  59. package/dist/ui/components/nature/creatures/Firefly.svelte.d.ts +10 -0
  60. package/dist/ui/components/nature/creatures/Owl.svelte +91 -0
  61. package/dist/ui/components/nature/creatures/Owl.svelte.d.ts +9 -0
  62. package/dist/ui/components/nature/creatures/Rabbit.svelte +90 -0
  63. package/dist/ui/components/nature/creatures/Rabbit.svelte.d.ts +9 -0
  64. package/dist/ui/components/nature/creatures/Robin.svelte +98 -0
  65. package/dist/ui/components/nature/creatures/Robin.svelte.d.ts +12 -0
  66. package/dist/ui/components/nature/creatures/Squirrel.svelte +97 -0
  67. package/dist/ui/components/nature/creatures/Squirrel.svelte.d.ts +9 -0
  68. package/dist/ui/components/nature/creatures/index.d.ts +13 -0
  69. package/dist/ui/components/nature/creatures/index.js +14 -0
  70. package/dist/ui/components/nature/ground/Bush.svelte +57 -0
  71. package/dist/ui/components/nature/ground/Bush.svelte.d.ts +10 -0
  72. package/dist/ui/components/nature/ground/Crocus.svelte +83 -0
  73. package/dist/ui/components/nature/ground/Crocus.svelte.d.ts +12 -0
  74. package/dist/ui/components/nature/ground/Daffodil.svelte +75 -0
  75. package/dist/ui/components/nature/ground/Daffodil.svelte.d.ts +11 -0
  76. package/dist/ui/components/nature/ground/Fern.svelte +72 -0
  77. package/dist/ui/components/nature/ground/Fern.svelte.d.ts +10 -0
  78. package/dist/ui/components/nature/ground/FlowerWild.svelte +60 -0
  79. package/dist/ui/components/nature/ground/FlowerWild.svelte.d.ts +10 -0
  80. package/dist/ui/components/nature/ground/GrassTuft.svelte +49 -0
  81. package/dist/ui/components/nature/ground/GrassTuft.svelte.d.ts +10 -0
  82. package/dist/ui/components/nature/ground/Log.svelte +42 -0
  83. package/dist/ui/components/nature/ground/Log.svelte.d.ts +7 -0
  84. package/dist/ui/components/nature/ground/Mushroom.svelte +48 -0
  85. package/dist/ui/components/nature/ground/Mushroom.svelte.d.ts +9 -0
  86. package/dist/ui/components/nature/ground/MushroomCluster.svelte +41 -0
  87. package/dist/ui/components/nature/ground/MushroomCluster.svelte.d.ts +8 -0
  88. package/dist/ui/components/nature/ground/Rock.svelte +59 -0
  89. package/dist/ui/components/nature/ground/Rock.svelte.d.ts +8 -0
  90. package/dist/ui/components/nature/ground/Stump.svelte +44 -0
  91. package/dist/ui/components/nature/ground/Stump.svelte.d.ts +8 -0
  92. package/dist/ui/components/nature/ground/Tulip.svelte +79 -0
  93. package/dist/ui/components/nature/ground/Tulip.svelte.d.ts +11 -0
  94. package/dist/ui/components/nature/ground/index.d.ts +12 -0
  95. package/dist/ui/components/nature/ground/index.js +13 -0
  96. package/dist/ui/components/nature/index.d.ts +28 -0
  97. package/dist/ui/components/nature/index.js +38 -0
  98. package/dist/ui/components/nature/palette.d.ts +602 -0
  99. package/dist/ui/components/nature/palette.js +472 -0
  100. package/dist/ui/components/nature/sky/Cloud.svelte +122 -0
  101. package/dist/ui/components/nature/sky/Cloud.svelte.d.ts +11 -0
  102. package/dist/ui/components/nature/sky/CloudWispy.svelte +79 -0
  103. package/dist/ui/components/nature/sky/CloudWispy.svelte.d.ts +9 -0
  104. package/dist/ui/components/nature/sky/Moon.svelte +60 -0
  105. package/dist/ui/components/nature/sky/Moon.svelte.d.ts +9 -0
  106. package/dist/ui/components/nature/sky/Rainbow.svelte +101 -0
  107. package/dist/ui/components/nature/sky/Rainbow.svelte.d.ts +8 -0
  108. package/dist/ui/components/nature/sky/Star.svelte +84 -0
  109. package/dist/ui/components/nature/sky/Star.svelte.d.ts +10 -0
  110. package/dist/ui/components/nature/sky/StarCluster.svelte +85 -0
  111. package/dist/ui/components/nature/sky/StarCluster.svelte.d.ts +9 -0
  112. package/dist/ui/components/nature/sky/StarShooting.svelte +90 -0
  113. package/dist/ui/components/nature/sky/StarShooting.svelte.d.ts +9 -0
  114. package/dist/ui/components/nature/sky/Sun.svelte +70 -0
  115. package/dist/ui/components/nature/sky/Sun.svelte.d.ts +9 -0
  116. package/dist/ui/components/nature/sky/index.d.ts +8 -0
  117. package/dist/ui/components/nature/sky/index.js +9 -0
  118. package/dist/ui/components/nature/structural/Birdhouse.svelte +53 -0
  119. package/dist/ui/components/nature/structural/Birdhouse.svelte.d.ts +8 -0
  120. package/dist/ui/components/nature/structural/Bridge.svelte +65 -0
  121. package/dist/ui/components/nature/structural/Bridge.svelte.d.ts +7 -0
  122. package/dist/ui/components/nature/structural/FencePost.svelte +54 -0
  123. package/dist/ui/components/nature/structural/FencePost.svelte.d.ts +8 -0
  124. package/dist/ui/components/nature/structural/GardenGate.svelte +70 -0
  125. package/dist/ui/components/nature/structural/GardenGate.svelte.d.ts +8 -0
  126. package/dist/ui/components/nature/structural/Lantern.svelte +113 -0
  127. package/dist/ui/components/nature/structural/Lantern.svelte.d.ts +10 -0
  128. package/dist/ui/components/nature/structural/Lattice.svelte +89 -0
  129. package/dist/ui/components/nature/structural/Lattice.svelte.d.ts +8 -0
  130. package/dist/ui/components/nature/structural/LatticeWithVine.svelte +89 -0
  131. package/dist/ui/components/nature/structural/LatticeWithVine.svelte.d.ts +11 -0
  132. package/dist/ui/components/nature/structural/StonePath.svelte +48 -0
  133. package/dist/ui/components/nature/structural/StonePath.svelte.d.ts +7 -0
  134. package/dist/ui/components/nature/structural/index.d.ts +8 -0
  135. package/dist/ui/components/nature/structural/index.js +9 -0
  136. package/dist/ui/components/nature/trees/TreeAspen.svelte +163 -0
  137. package/dist/ui/components/nature/trees/TreeAspen.svelte.d.ts +11 -0
  138. package/dist/ui/components/nature/trees/TreeBirch.svelte +186 -0
  139. package/dist/ui/components/nature/trees/TreeBirch.svelte.d.ts +11 -0
  140. package/dist/ui/components/nature/trees/TreeCherry.svelte +108 -0
  141. package/dist/ui/components/nature/trees/TreeCherry.svelte.d.ts +11 -0
  142. package/dist/ui/components/nature/trees/TreePine.svelte +79 -0
  143. package/dist/ui/components/nature/trees/TreePine.svelte.d.ts +11 -0
  144. package/dist/ui/components/nature/trees/index.d.ts +4 -0
  145. package/dist/ui/components/nature/trees/index.js +5 -0
  146. package/dist/ui/components/nature/water/LilyPad.svelte +99 -0
  147. package/dist/ui/components/nature/water/LilyPad.svelte.d.ts +10 -0
  148. package/dist/ui/components/nature/water/Pond.svelte +104 -0
  149. package/dist/ui/components/nature/water/Pond.svelte.d.ts +8 -0
  150. package/dist/ui/components/nature/water/Reeds.svelte +85 -0
  151. package/dist/ui/components/nature/water/Reeds.svelte.d.ts +11 -0
  152. package/dist/ui/components/nature/water/Stream.svelte +98 -0
  153. package/dist/ui/components/nature/water/Stream.svelte.d.ts +8 -0
  154. package/dist/ui/components/nature/water/index.d.ts +4 -0
  155. package/dist/ui/components/nature/water/index.js +5 -0
  156. package/dist/ui/components/nature/weather/SnowfallLayer.svelte +175 -0
  157. package/dist/ui/components/nature/weather/SnowfallLayer.svelte.d.ts +25 -0
  158. package/dist/ui/components/nature/weather/Snowflake.svelte +99 -0
  159. package/dist/ui/components/nature/weather/Snowflake.svelte.d.ts +11 -0
  160. package/dist/ui/components/nature/weather/SnowflakeFalling.svelte +162 -0
  161. package/dist/ui/components/nature/weather/SnowflakeFalling.svelte.d.ts +23 -0
  162. package/dist/ui/components/nature/weather/index.d.ts +3 -0
  163. package/dist/ui/components/nature/weather/index.js +4 -0
  164. package/dist/ui/components/primitives/textarea/textarea.svelte +1 -1
  165. package/dist/ui/components/typography/Alagard.svelte +17 -0
  166. package/dist/ui/components/typography/Alagard.svelte.d.ts +10 -0
  167. package/dist/ui/components/typography/Atkinson.svelte +17 -0
  168. package/dist/ui/components/typography/Atkinson.svelte.d.ts +10 -0
  169. package/dist/ui/components/typography/BodoniModa.svelte +17 -0
  170. package/dist/ui/components/typography/BodoniModa.svelte.d.ts +10 -0
  171. package/dist/ui/components/typography/Calistoga.svelte +17 -0
  172. package/dist/ui/components/typography/Calistoga.svelte.d.ts +10 -0
  173. package/dist/ui/components/typography/Caveat.svelte +17 -0
  174. package/dist/ui/components/typography/Caveat.svelte.d.ts +10 -0
  175. package/dist/ui/components/typography/Cormorant.svelte +17 -0
  176. package/dist/ui/components/typography/Cormorant.svelte.d.ts +10 -0
  177. package/dist/ui/components/typography/Cozette.svelte +17 -0
  178. package/dist/ui/components/typography/Cozette.svelte.d.ts +10 -0
  179. package/dist/ui/components/typography/EBGaramond.svelte +17 -0
  180. package/dist/ui/components/typography/EBGaramond.svelte.d.ts +10 -0
  181. package/dist/ui/components/typography/FontProvider.svelte +98 -0
  182. package/dist/ui/components/typography/FontProvider.svelte.d.ts +17 -0
  183. package/dist/ui/components/typography/Fraunces.svelte +17 -0
  184. package/dist/ui/components/typography/Fraunces.svelte.d.ts +10 -0
  185. package/dist/ui/components/typography/IBMPlexMono.svelte +17 -0
  186. package/dist/ui/components/typography/IBMPlexMono.svelte.d.ts +10 -0
  187. package/dist/ui/components/typography/InstrumentSans.svelte +17 -0
  188. package/dist/ui/components/typography/InstrumentSans.svelte.d.ts +10 -0
  189. package/dist/ui/components/typography/Lexend.svelte +17 -0
  190. package/dist/ui/components/typography/Lexend.svelte.d.ts +10 -0
  191. package/dist/ui/components/typography/Lora.svelte +17 -0
  192. package/dist/ui/components/typography/Lora.svelte.d.ts +10 -0
  193. package/dist/ui/components/typography/Luciole.svelte +17 -0
  194. package/dist/ui/components/typography/Luciole.svelte.d.ts +10 -0
  195. package/dist/ui/components/typography/Manrope.svelte +17 -0
  196. package/dist/ui/components/typography/Manrope.svelte.d.ts +10 -0
  197. package/dist/ui/components/typography/Merriweather.svelte +17 -0
  198. package/dist/ui/components/typography/Merriweather.svelte.d.ts +10 -0
  199. package/dist/ui/components/typography/Nunito.svelte +17 -0
  200. package/dist/ui/components/typography/Nunito.svelte.d.ts +10 -0
  201. package/dist/ui/components/typography/OpenDyslexic.svelte +17 -0
  202. package/dist/ui/components/typography/OpenDyslexic.svelte.d.ts +10 -0
  203. package/dist/ui/components/typography/PlusJakartaSans.svelte +17 -0
  204. package/dist/ui/components/typography/PlusJakartaSans.svelte.d.ts +10 -0
  205. package/dist/ui/components/typography/Quicksand.svelte +17 -0
  206. package/dist/ui/components/typography/Quicksand.svelte.d.ts +10 -0
  207. package/dist/ui/components/typography/README.md +153 -0
  208. package/dist/ui/components/typography/index.d.ts +23 -0
  209. package/dist/ui/components/typography/index.js +42 -0
  210. package/dist/ui/components/ui/GlassCarousel.svelte +446 -0
  211. package/dist/ui/components/ui/GlassCarousel.svelte.d.ts +57 -0
  212. package/dist/ui/components/ui/GlassConfirmDialog.svelte +2 -1
  213. package/dist/ui/components/ui/GlassLogo.svelte +423 -0
  214. package/dist/ui/components/ui/GlassLogo.svelte.d.ts +23 -0
  215. package/dist/ui/components/ui/GlassNavbar.svelte +120 -0
  216. package/dist/ui/components/ui/GlassNavbar.svelte.d.ts +42 -0
  217. package/dist/ui/components/ui/GlassOverlay.svelte +1 -1
  218. package/dist/ui/components/ui/Logo.svelte +47 -52
  219. package/dist/ui/components/ui/Logo.svelte.d.ts +4 -3
  220. package/dist/ui/components/ui/index.d.ts +3 -0
  221. package/dist/ui/components/ui/index.js +3 -0
  222. package/dist/ui/index.d.ts +1 -0
  223. package/dist/ui/index.js +2 -0
  224. package/dist/ui/styles/grove.css +15 -1
  225. package/dist/ui/vineyard/index.d.ts +9 -0
  226. package/dist/ui/vineyard/index.js +8 -0
  227. package/dist/utils/csrf.js +5 -2
  228. package/dist/utils/readability.d.ts +89 -0
  229. package/dist/utils/readability.js +204 -0
  230. package/package.json +27 -1
@@ -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;
@@ -0,0 +1,59 @@
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 { earth } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ color?: string;
12
+ variant?: 'round' | 'flat' | 'jagged';
13
+ }
14
+
15
+ let {
16
+ class: className = 'w-6 h-4',
17
+ color,
18
+ variant = 'round'
19
+ }: Props = $props();
20
+
21
+ const rockColor = $derived(color ?? earth.stone);
22
+ const highlightColor = earth.pebble;
23
+ const shadowColor = earth.slate;
24
+ </script>
25
+
26
+ <!-- Rock/stone - matte natural appearance -->
27
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 40">
28
+ {#if variant === 'round'}
29
+ <!-- Rounded boulder with natural matte finish -->
30
+ <ellipse fill={rockColor} cx="30" cy="26" rx="27" ry="14" />
31
+ <!-- Subtle surface variation instead of shiny highlight -->
32
+ <ellipse fill={highlightColor} cx="22" cy="22" rx="8" ry="4" opacity="0.15" />
33
+ <ellipse fill={highlightColor} cx="35" cy="20" rx="5" ry="3" opacity="0.1" />
34
+ <!-- Darker underside shadow -->
35
+ <ellipse fill={shadowColor} cx="30" cy="32" rx="20" ry="5" opacity="0.15" />
36
+ <!-- Surface texture marks -->
37
+ <path fill={shadowColor} d="M18 24 Q20 26 22 24" opacity="0.12" stroke={shadowColor} stroke-width="0.5" />
38
+ <path fill={shadowColor} d="M38 22 Q40 24 42 23" opacity="0.1" stroke={shadowColor} stroke-width="0.5" />
39
+ {:else if variant === 'flat'}
40
+ <!-- Flat stepping stone with weathered look -->
41
+ <ellipse fill={rockColor} cx="30" cy="28" rx="27" ry="11" />
42
+ <!-- Subtle worn surface -->
43
+ <ellipse fill={highlightColor} cx="24" cy="26" rx="12" ry="4" opacity="0.12" />
44
+ <ellipse fill={highlightColor} cx="38" cy="25" rx="6" ry="3" opacity="0.08" />
45
+ <!-- Surface cracks/weathering -->
46
+ <path fill="none" stroke={shadowColor} stroke-width="0.5" d="M20 28 L28 27" opacity="0.15" />
47
+ <path fill="none" stroke={shadowColor} stroke-width="0.5" d="M35 29 L40 28" opacity="0.12" />
48
+ {:else}
49
+ <!-- Jagged rock with rough texture -->
50
+ <polygon fill={rockColor} points="5,40 15,22 28,38 38,12 48,28 55,18 58,40" />
51
+ <!-- Muted face highlights -->
52
+ <polygon fill={highlightColor} points="15,22 28,38 38,12 32,20 24,32" opacity="0.12" />
53
+ <!-- Shadowed face -->
54
+ <polygon fill={shadowColor} points="38,12 48,28 55,18 58,40 48,38 44,25" opacity="0.15" />
55
+ <!-- Surface texture -->
56
+ <path fill="none" stroke={shadowColor} stroke-width="0.5" d="M22 30 L26 28" opacity="0.15" />
57
+ <path fill="none" stroke={shadowColor} stroke-width="0.5" d="M42 25 L46 28" opacity="0.12" />
58
+ {/if}
59
+ </svg>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ class?: string;
3
+ color?: string;
4
+ variant?: 'round' | 'flat' | 'jagged';
5
+ }
6
+ declare const Rock: import("svelte").Component<Props, {}, "">;
7
+ type Rock = ReturnType<typeof Rock>;
8
+ export default Rock;
@@ -0,0 +1,44 @@
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
+ ringColor?: string;
13
+ }
14
+
15
+ let {
16
+ class: className = 'w-8 h-6',
17
+ barkColor,
18
+ ringColor
19
+ }: Props = $props();
20
+
21
+ const barkFill = $derived(barkColor ?? bark.warmBark);
22
+ const ringFill = $derived(ringColor ?? earth.sand);
23
+ const centerColor = bark.lightBark;
24
+ </script>
25
+
26
+ <!-- Tree stump with visible rings -->
27
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 70 50">
28
+ <!-- Bark exterior -->
29
+ <path fill={barkFill} d="M10 20 Q8 35 5 50 L65 50 Q62 35 60 20 Q35 15 10 20" />
30
+
31
+ <!-- Top surface -->
32
+ <ellipse fill={ringFill} cx="35" cy="20" rx="28" ry="12" />
33
+
34
+ <!-- Tree rings -->
35
+ <ellipse fill="none" stroke={barkFill} stroke-width="1.5" cx="35" cy="20" rx="22" ry="9" opacity="0.6" />
36
+ <ellipse fill="none" stroke={barkFill} stroke-width="1" cx="35" cy="20" rx="16" ry="6" opacity="0.5" />
37
+ <ellipse fill="none" stroke={barkFill} stroke-width="1" cx="35" cy="20" rx="10" ry="4" opacity="0.4" />
38
+ <ellipse fill={centerColor} cx="35" cy="20" rx="4" ry="2" opacity="0.6" />
39
+
40
+ <!-- Bark texture lines -->
41
+ <path fill="none" stroke={bark.darkBark} stroke-width="1" d="M15 25 Q14 35 12 45" opacity="0.4" />
42
+ <path fill="none" stroke={bark.darkBark} stroke-width="1" d="M55 25 Q56 35 58 45" opacity="0.4" />
43
+ <path fill="none" stroke={bark.darkBark} stroke-width="1" d="M35 32 L35 48" opacity="0.3" />
44
+ </svg>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ class?: string;
3
+ barkColor?: string;
4
+ ringColor?: string;
5
+ }
6
+ declare const Stump: import("svelte").Component<Props, {}, "">;
7
+ type Stump = ReturnType<typeof Stump>;
8
+ export default Stump;
@@ -0,0 +1,79 @@
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, wildflowers } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ style?: string;
12
+ petalColor?: string;
13
+ stemColor?: string;
14
+ variant?: 'red' | 'pink' | 'yellow' | 'purple';
15
+ animate?: boolean;
16
+ }
17
+
18
+ let {
19
+ class: className = 'w-4 h-8',
20
+ style,
21
+ petalColor,
22
+ stemColor,
23
+ variant = 'red',
24
+ animate = true
25
+ }: Props = $props();
26
+
27
+ // Tulip color variants
28
+ const variantColors = {
29
+ red: wildflowers.tulipRed,
30
+ pink: wildflowers.tulipPink,
31
+ yellow: wildflowers.daffodil,
32
+ purple: wildflowers.crocus
33
+ };
34
+
35
+ const petals = $derived(petalColor ?? variantColors[variant]);
36
+ const stem = $derived(stemColor ?? greens.deepGreen);
37
+
38
+ // Slightly darker shade for inner petals
39
+ const innerPetal = $derived(variant === 'red' ? '#e11d48' :
40
+ variant === 'pink' ? '#f472b6' :
41
+ variant === 'yellow' ? '#facc15' :
42
+ '#8b5cf6');
43
+ </script>
44
+
45
+ <!-- Classic tulip - spring icon -->
46
+ <svg class="{className} {animate ? 'sway' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 80" style={style}>
47
+ <!-- Stem -->
48
+ <path fill="none" stroke={stem} stroke-width="3" d="M20 80 Q18 60 20 40" />
49
+
50
+ <!-- Leaves -->
51
+ <path fill={stem} d="M20 70 Q8 60 5 65 Q12 55 20 60" />
52
+ <path fill={stem} d="M20 60 Q32 50 35 55 Q28 45 20 52" />
53
+
54
+ <!-- Tulip bloom - cup shape with overlapping petals -->
55
+ <!-- Back petals -->
56
+ <path fill={innerPetal} d="M10 35 Q8 20 15 10 Q20 5 25 10 Q32 20 30 35 Q20 38 10 35" />
57
+
58
+ <!-- Side petals -->
59
+ <path fill={petals} d="M8 36 Q5 25 10 12 Q15 5 20 10 Q12 15 10 25 Q8 32 8 36" />
60
+ <path fill={petals} d="M32 36 Q35 25 30 12 Q25 5 20 10 Q28 15 30 25 Q32 32 32 36" />
61
+
62
+ <!-- Front petal -->
63
+ <path fill={petals} d="M12 38 Q10 30 15 18 Q20 12 25 18 Q30 30 28 38 Q20 42 12 38" />
64
+
65
+ <!-- Petal highlights -->
66
+ <path fill="white" d="M18 20 Q20 15 22 20 Q20 25 18 20" opacity="0.2" />
67
+ </svg>
68
+
69
+ <style>
70
+ @keyframes sway {
71
+ 0%, 100% { transform: rotate(0deg); }
72
+ 50% { transform: rotate(2deg); }
73
+ }
74
+
75
+ .sway {
76
+ transform-origin: center bottom;
77
+ animation: sway 3s ease-in-out infinite;
78
+ }
79
+ </style>
@@ -0,0 +1,11 @@
1
+ interface Props {
2
+ class?: string;
3
+ style?: string;
4
+ petalColor?: string;
5
+ stemColor?: string;
6
+ variant?: 'red' | 'pink' | 'yellow' | 'purple';
7
+ animate?: boolean;
8
+ }
9
+ declare const Tulip: import("svelte").Component<Props, {}, "">;
10
+ type Tulip = ReturnType<typeof Tulip>;
11
+ export default Tulip;
@@ -0,0 +1,12 @@
1
+ export { default as Bush } from './Bush.svelte';
2
+ export { default as Crocus } from './Crocus.svelte';
3
+ export { default as Daffodil } from './Daffodil.svelte';
4
+ export { default as Fern } from './Fern.svelte';
5
+ export { default as FlowerWild } from './FlowerWild.svelte';
6
+ export { default as GrassTuft } from './GrassTuft.svelte';
7
+ export { default as Log } from './Log.svelte';
8
+ export { default as Mushroom } from './Mushroom.svelte';
9
+ export { default as MushroomCluster } from './MushroomCluster.svelte';
10
+ export { default as Rock } from './Rock.svelte';
11
+ export { default as Stump } from './Stump.svelte';
12
+ export { default as Tulip } from './Tulip.svelte';
@@ -0,0 +1,13 @@
1
+ // Ground components - forest floor elements
2
+ export { default as Bush } from './Bush.svelte';
3
+ export { default as Crocus } from './Crocus.svelte';
4
+ export { default as Daffodil } from './Daffodil.svelte';
5
+ export { default as Fern } from './Fern.svelte';
6
+ export { default as FlowerWild } from './FlowerWild.svelte';
7
+ export { default as GrassTuft } from './GrassTuft.svelte';
8
+ export { default as Log } from './Log.svelte';
9
+ export { default as Mushroom } from './Mushroom.svelte';
10
+ export { default as MushroomCluster } from './MushroomCluster.svelte';
11
+ export { default as Rock } from './Rock.svelte';
12
+ export { default as Stump } from './Stump.svelte';
13
+ export { default as Tulip } from './Tulip.svelte';
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Nature Components - Grove's organic visual library
3
+ *
4
+ * A collection of SVG components for creating atmospheric forest scenes.
5
+ * These components are seasonally-aware and support Grove's four seasons.
6
+ *
7
+ * @example
8
+ * ```svelte
9
+ * <script>
10
+ * import { Logo, TreePine, Cardinal } from '@autumnsgrove/groveengine/ui/nature';
11
+ * import { autumn } from '@autumnsgrove/groveengine/ui/nature';
12
+ * </script>
13
+ *
14
+ * <Logo season="autumn" animate />
15
+ * <TreePine season="winter" />
16
+ * <Cardinal />
17
+ * ```
18
+ */
19
+ export { default as Logo } from './Logo.svelte';
20
+ export * from './palette';
21
+ export * from './trees';
22
+ export * from './botanical';
23
+ export * from './creatures';
24
+ export * from './ground';
25
+ export * from './sky';
26
+ export * from './structural';
27
+ export * from './water';
28
+ export * from './weather';
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Nature Components - Grove's organic visual library
3
+ *
4
+ * A collection of SVG components for creating atmospheric forest scenes.
5
+ * These components are seasonally-aware and support Grove's four seasons.
6
+ *
7
+ * @example
8
+ * ```svelte
9
+ * <script>
10
+ * import { Logo, TreePine, Cardinal } from '@autumnsgrove/groveengine/ui/nature';
11
+ * import { autumn } from '@autumnsgrove/groveengine/ui/nature';
12
+ * </script>
13
+ *
14
+ * <Logo season="autumn" animate />
15
+ * <TreePine season="winter" />
16
+ * <Cardinal />
17
+ * ```
18
+ */
19
+ // Logo - Grove's tree-star logo
20
+ export { default as Logo } from './Logo.svelte';
21
+ // Palette - Seasonal color system
22
+ export * from './palette';
23
+ // Trees
24
+ export * from './trees';
25
+ // Botanical elements
26
+ export * from './botanical';
27
+ // Creatures
28
+ export * from './creatures';
29
+ // Ground elements
30
+ export * from './ground';
31
+ // Sky elements
32
+ export * from './sky';
33
+ // Structural elements
34
+ export * from './structural';
35
+ // Water elements
36
+ export * from './water';
37
+ // Weather effects
38
+ export * from './weather';