@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,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;
@@ -0,0 +1,54 @@
1
+ <!--
2
+ Grove — A place to Be
3
+ Copyright (c) 2025 Autumn Brown
4
+ Licensed under AGPL-3.0
5
+ -->
6
+ <script lang="ts">
7
+ import { bark } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ color?: string;
12
+ variant?: 'pointed' | 'flat' | 'round';
13
+ }
14
+
15
+ let {
16
+ class: className = 'w-4 h-12',
17
+ color,
18
+ variant = 'pointed'
19
+ }: Props = $props();
20
+
21
+ const postColor = $derived(color ?? bark.warmBark);
22
+ const shadowColor = $derived(bark.darkBark);
23
+ </script>
24
+
25
+ <!-- Fence post -->
26
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 70">
27
+ {#if variant === 'pointed'}
28
+ <!-- Pointed top post -->
29
+ <polygon fill={postColor} points="5,15 12.5,0 20,15" />
30
+ <rect fill={postColor} x="5" y="15" width="15" height="55" />
31
+ <!-- Shadow -->
32
+ <rect fill={shadowColor} x="17" y="15" width="3" height="55" opacity="0.2" />
33
+ <polygon fill={shadowColor} points="12.5,0 20,15 17,15 12.5,5" opacity="0.2" />
34
+ {:else if variant === 'flat'}
35
+ <!-- Flat top post -->
36
+ <rect fill={postColor} x="5" y="5" width="15" height="65" rx="1" />
37
+ <!-- Cap -->
38
+ <rect fill={postColor} x="3" y="5" width="19" height="4" rx="1" />
39
+ <!-- Shadow -->
40
+ <rect fill={shadowColor} x="17" y="9" width="3" height="61" opacity="0.2" />
41
+ {:else}
42
+ <!-- Round top post -->
43
+ <rect fill={postColor} x="5" y="12" width="15" height="58" />
44
+ <ellipse fill={postColor} cx="12.5" cy="12" rx="7.5" ry="5" />
45
+ <!-- Highlight on round top -->
46
+ <ellipse fill="white" cx="10" cy="10" rx="3" ry="2" opacity="0.15" />
47
+ <!-- Shadow -->
48
+ <rect fill={shadowColor} x="17" y="12" width="3" height="58" opacity="0.2" />
49
+ {/if}
50
+
51
+ <!-- Wood grain lines -->
52
+ <line x1="8" y1="20" x2="8" y2="65" stroke={shadowColor} stroke-width="0.5" opacity="0.3" />
53
+ <line x1="17" y1="25" x2="17" y2="60" stroke={shadowColor} stroke-width="0.5" opacity="0.2" />
54
+ </svg>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ class?: string;
3
+ color?: string;
4
+ variant?: 'pointed' | 'flat' | 'round';
5
+ }
6
+ declare const FencePost: import("svelte").Component<Props, {}, "">;
7
+ type FencePost = ReturnType<typeof FencePost>;
8
+ export default FencePost;
@@ -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 { bark, earth } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ color?: string;
12
+ open?: boolean;
13
+ }
14
+
15
+ let {
16
+ class: className = 'w-16 h-16',
17
+ color,
18
+ open = false
19
+ }: Props = $props();
20
+
21
+ const gateColor = $derived(color ?? bark.warmBark);
22
+ const postColor = $derived(bark.bark);
23
+ const hingeColor = $derived(earth.stone);
24
+ </script>
25
+
26
+ <!-- Garden gate with posts -->
27
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
28
+ <!-- Left post -->
29
+ <rect fill={postColor} x="5" y="10" width="10" height="90" />
30
+ <rect fill={bark.darkBark} x="5" y="10" width="10" height="5" />
31
+ <!-- Post cap -->
32
+ <polygon fill={postColor} points="0,15 10,5 20,15" />
33
+
34
+ <!-- Right post -->
35
+ <rect fill={postColor} x="85" y="10" width="10" height="90" />
36
+ <rect fill={bark.darkBark} x="85" y="10" width="10" height="5" />
37
+ <!-- Post cap -->
38
+ <polygon fill={postColor} points="80,15 90,5 100,15" />
39
+
40
+ <!-- Gate -->
41
+ <g transform={open ? 'rotate(-30 15 50)' : ''}>
42
+ <!-- Gate frame -->
43
+ <rect fill={gateColor} x="15" y="25" width="70" height="70" rx="2" />
44
+ <!-- Inner cutout (transparent) -->
45
+ <rect fill="#e0f2fe" x="20" y="30" width="60" height="60" rx="1" opacity="0.3" />
46
+
47
+ <!-- Lattice pattern on gate -->
48
+ <line x1="20" y1="30" x2="80" y2="90" stroke={gateColor} stroke-width="3" />
49
+ <line x1="80" y1="30" x2="20" y2="90" stroke={gateColor} stroke-width="3" />
50
+ <line x1="50" y1="30" x2="50" y2="90" stroke={gateColor} stroke-width="2" />
51
+ <line x1="20" y1="60" x2="80" y2="60" stroke={gateColor} stroke-width="2" />
52
+
53
+ <!-- Gate arch top -->
54
+ <path
55
+ fill={gateColor}
56
+ d="M15 25 L15 20 Q50 5 85 20 L85 25 Q50 12 15 25"
57
+ />
58
+
59
+ <!-- Hinges -->
60
+ <rect fill={hingeColor} x="13" y="35" width="8" height="6" rx="1" />
61
+ <rect fill={hingeColor} x="13" y="75" width="8" height="6" rx="1" />
62
+
63
+ <!-- Handle -->
64
+ <circle fill={hingeColor} cx="75" cy="60" r="4" />
65
+ <circle fill={bark.darkBark} cx="75" cy="60" r="2" />
66
+ </g>
67
+
68
+ <!-- Ground line -->
69
+ <line x1="0" y1="100" x2="100" y2="100" stroke={earth.mud} stroke-width="2" />
70
+ </svg>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ class?: string;
3
+ color?: string;
4
+ open?: boolean;
5
+ }
6
+ declare const GardenGate: import("svelte").Component<Props, {}, "">;
7
+ type GardenGate = ReturnType<typeof GardenGate>;
8
+ export default GardenGate;
@@ -0,0 +1,113 @@
1
+ <!--
2
+ Grove — A place to Be
3
+ Copyright (c) 2025 Autumn Brown
4
+ Licensed under AGPL-3.0
5
+ -->
6
+ <script lang="ts">
7
+ import { bark, accents } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ frameColor?: string;
12
+ lit?: boolean;
13
+ animate?: boolean;
14
+ variant?: 'hanging' | 'standing' | 'post';
15
+ }
16
+
17
+ let {
18
+ class: className = 'w-6 h-10',
19
+ frameColor,
20
+ lit = true,
21
+ animate = true,
22
+ variant = 'hanging'
23
+ }: Props = $props();
24
+
25
+ const frame = $derived(frameColor ?? bark.darkBark);
26
+ const glowColor = $derived(accents.firefly.glow);
27
+ </script>
28
+
29
+ <!-- Lantern -->
30
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 60">
31
+ {#if variant === 'hanging'}
32
+ <!-- Top finial (attachment point) -->
33
+ <circle fill={frame} cx="20" cy="3" r="2.5" />
34
+
35
+ <!-- Hanging arms connecting finial to lantern roof -->
36
+ <path fill="none" stroke={frame} stroke-width="2" d="M17.5 3.5 Q12 7 12 12" />
37
+ <path fill="none" stroke={frame} stroke-width="2" d="M22.5 3.5 Q28 7 28 12" />
38
+
39
+ <!-- Lantern top cap -->
40
+ <polygon fill={frame} points="10,12 20,6 30,12" />
41
+
42
+ <!-- Small decorative cap finial connecting to arms -->
43
+ <circle fill={frame} cx="20" cy="6" r="1.5" />
44
+ {:else if variant === 'post'}
45
+ <!-- Post -->
46
+ <rect fill={frame} x="17" y="40" width="6" height="20" />
47
+ <!-- Top finial -->
48
+ <circle fill={frame} cx="20" cy="9" r="2" />
49
+ <!-- Lantern top -->
50
+ <polygon fill={frame} points="10,18 20,11 30,18" />
51
+ {:else}
52
+ <!-- Standing base -->
53
+ <rect fill={frame} x="12" y="52" width="16" height="4" rx="1" />
54
+ <rect fill={frame} x="17" y="48" width="6" height="6" />
55
+ <!-- Top finial -->
56
+ <circle fill={frame} cx="20" cy="9" r="2" />
57
+ <!-- Lantern top -->
58
+ <polygon fill={frame} points="10,18 20,11 30,18" />
59
+ {/if}
60
+
61
+ <!-- Lantern body frame -->
62
+ <rect fill={frame} x="10" y="18" width="20" height="30" rx="1" />
63
+
64
+ <!-- Glass panels (with glow if lit) -->
65
+ {#if lit}
66
+ <!-- Glow effect -->
67
+ <rect fill={glowColor} x="12" y="20" width="16" height="26" opacity="0.3" class={animate ? 'flicker' : ''} />
68
+ <rect fill={glowColor} x="14" y="22" width="12" height="22" opacity="0.5" class={animate ? 'flicker-inner' : ''} />
69
+ <!-- Outer glow -->
70
+ <ellipse fill={glowColor} cx="20" cy="33" rx="18" ry="20" opacity="0.15" class={animate ? 'flicker-outer' : ''} />
71
+ {:else}
72
+ <rect fill="#cbd5e1" x="12" y="20" width="16" height="26" opacity="0.3" />
73
+ {/if}
74
+
75
+ <!-- Frame details -->
76
+ <rect fill={frame} x="10" y="32" width="20" height="2" />
77
+ <rect fill={frame} x="19" y="20" width="2" height="26" />
78
+
79
+ <!-- Bottom cap -->
80
+ <rect fill={frame} x="8" y="48" width="24" height="3" rx="1" />
81
+ </svg>
82
+
83
+ <style>
84
+ @keyframes flicker {
85
+ 0%, 100% { opacity: 0.5; }
86
+ 50% { opacity: 0.6; }
87
+ 75% { opacity: 0.45; }
88
+ }
89
+
90
+ @keyframes flicker-inner {
91
+ 0%, 100% { opacity: 0.7; }
92
+ 30% { opacity: 0.75; }
93
+ 60% { opacity: 0.65; }
94
+ }
95
+
96
+ @keyframes flicker-outer {
97
+ 0%, 100% { opacity: 0.15; }
98
+ 50% { opacity: 0.2; }
99
+ }
100
+
101
+ .flicker {
102
+ animation: flicker 2s ease-in-out infinite;
103
+ }
104
+
105
+ .flicker-inner {
106
+ animation: flicker-inner 1.5s ease-in-out infinite;
107
+ animation-delay: 0.2s;
108
+ }
109
+
110
+ .flicker-outer {
111
+ animation: flicker-outer 3s ease-in-out infinite;
112
+ }
113
+ </style>
@@ -0,0 +1,10 @@
1
+ interface Props {
2
+ class?: string;
3
+ frameColor?: string;
4
+ lit?: boolean;
5
+ animate?: boolean;
6
+ variant?: 'hanging' | 'standing' | 'post';
7
+ }
8
+ declare const Lantern: import("svelte").Component<Props, {}, "">;
9
+ type Lantern = ReturnType<typeof Lantern>;
10
+ export default Lantern;
@@ -0,0 +1,89 @@
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, natural } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ color?: string;
12
+ variant?: 'trellis' | 'fence' | 'archway';
13
+ }
14
+
15
+ let {
16
+ class: className = 'w-12 h-16',
17
+ color,
18
+ variant = 'trellis'
19
+ }: Props = $props();
20
+
21
+ const woodColor = $derived(color ?? bark.warmBark);
22
+ const shadowColor = $derived(bark.darkBark);
23
+ </script>
24
+
25
+ <!-- Lattice/Trellis structure - ties into "Lattice" brand name -->
26
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 100">
27
+ {#if variant === 'trellis'}
28
+ <!-- Classic garden trellis -->
29
+ <!-- Vertical posts -->
30
+ <rect fill={woodColor} x="5" y="0" width="6" height="100" rx="1" />
31
+ <rect fill={woodColor} x="69" y="0" width="6" height="100" rx="1" />
32
+
33
+ <!-- Horizontal bars -->
34
+ <rect fill={woodColor} x="5" y="5" width="70" height="4" rx="1" />
35
+ <rect fill={woodColor} x="5" y="95" width="70" height="4" rx="1" />
36
+
37
+ <!-- Diagonal lattice pattern -->
38
+ <g opacity="0.9">
39
+ <!-- Left-leaning diagonals -->
40
+ <line x1="11" y1="9" x2="69" y2="50" stroke={woodColor} stroke-width="3" />
41
+ <line x1="11" y1="30" x2="69" y2="71" stroke={woodColor} stroke-width="3" />
42
+ <line x1="11" y1="51" x2="69" y2="92" stroke={woodColor} stroke-width="3" />
43
+ <line x1="11" y1="72" x2="48" y2="95" stroke={woodColor} stroke-width="3" />
44
+ <line x1="32" y1="9" x2="69" y2="30" stroke={woodColor} stroke-width="3" />
45
+
46
+ <!-- Right-leaning diagonals -->
47
+ <line x1="69" y1="9" x2="11" y2="50" stroke={woodColor} stroke-width="3" />
48
+ <line x1="69" y1="30" x2="11" y2="71" stroke={woodColor} stroke-width="3" />
49
+ <line x1="69" y1="51" x2="11" y2="92" stroke={woodColor} stroke-width="3" />
50
+ <line x1="69" y1="72" x2="32" y2="95" stroke={woodColor} stroke-width="3" />
51
+ <line x1="48" y1="9" x2="11" y2="30" stroke={woodColor} stroke-width="3" />
52
+ </g>
53
+
54
+ <!-- Post shadows -->
55
+ <rect fill={shadowColor} x="9" y="0" width="2" height="100" opacity="0.2" />
56
+ <rect fill={shadowColor} x="73" y="0" width="2" height="100" opacity="0.2" />
57
+ {:else if variant === 'fence'}
58
+ <!-- Fence section -->
59
+ <rect fill={woodColor} x="5" y="20" width="70" height="6" rx="1" />
60
+ <rect fill={woodColor} x="5" y="70" width="70" height="6" rx="1" />
61
+
62
+ <!-- Vertical slats -->
63
+ <rect fill={woodColor} x="8" y="10" width="8" height="90" rx="1" />
64
+ <rect fill={woodColor} x="24" y="10" width="8" height="90" rx="1" />
65
+ <rect fill={woodColor} x="40" y="5" width="8" height="95" rx="1" />
66
+ <rect fill={woodColor} x="56" y="10" width="8" height="90" rx="1" />
67
+ <rect fill={woodColor} x="72" y="10" width="6" height="90" rx="1" />
68
+
69
+ <!-- Pointed tops -->
70
+ <polygon fill={woodColor} points="8,10 12,0 16,10" />
71
+ <polygon fill={woodColor} points="24,10 28,0 32,10" />
72
+ <polygon fill={woodColor} points="40,5 44,-5 48,5" />
73
+ <polygon fill={woodColor} points="56,10 60,0 64,10" />
74
+ {:else}
75
+ <!-- Archway trellis -->
76
+ <path
77
+ fill="none"
78
+ stroke={woodColor}
79
+ stroke-width="6"
80
+ d="M10 100 L10 40 Q10 10 40 10 Q70 10 70 40 L70 100"
81
+ />
82
+ <!-- Cross beams on arch -->
83
+ <line x1="10" y1="60" x2="70" y2="60" stroke={woodColor} stroke-width="4" />
84
+ <line x1="10" y1="80" x2="70" y2="80" stroke={woodColor} stroke-width="4" />
85
+ <!-- Arch lattice -->
86
+ <path fill="none" stroke={woodColor} stroke-width="2" d="M15 100 L15 45 Q15 20 40 20 Q65 20 65 45 L65 100" />
87
+ <path fill="none" stroke={woodColor} stroke-width="2" d="M20 100 L20 48 Q20 28 40 28 Q60 28 60 48 L60 100" />
88
+ {/if}
89
+ </svg>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ class?: string;
3
+ color?: string;
4
+ variant?: 'trellis' | 'fence' | 'archway';
5
+ }
6
+ declare const Lattice: import("svelte").Component<Props, {}, "">;
7
+ type Lattice = ReturnType<typeof Lattice>;
8
+ export default Lattice;
@@ -0,0 +1,89 @@
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 { bark, greens, autumn, accents } from '../palette';
9
+
10
+ interface Props {
11
+ class?: string;
12
+ woodColor?: string;
13
+ vineColor?: string;
14
+ season?: Season;
15
+ hasFlowers?: boolean;
16
+ }
17
+
18
+ let {
19
+ class: className = 'w-12 h-16',
20
+ woodColor,
21
+ vineColor,
22
+ season = 'summer',
23
+ hasFlowers = true
24
+ }: Props = $props();
25
+
26
+ const wood = $derived(woodColor ?? bark.warmBark);
27
+ const defaultVineColor = $derived(season === 'autumn' ? autumn.rust : greens.grove);
28
+ const vine = $derived(vineColor ?? defaultVineColor);
29
+ const leafColor = $derived(season === 'autumn' ? autumn.amber : greens.meadow);
30
+ const flowerColor = $derived(accents.flower.purple);
31
+ </script>
32
+
33
+ <!-- Lattice with climbing vine -->
34
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 100">
35
+ <!-- Trellis structure (behind vine) -->
36
+ <rect fill={wood} x="5" y="0" width="5" height="100" rx="1" />
37
+ <rect fill={wood} x="70" y="0" width="5" height="100" rx="1" />
38
+ <rect fill={wood} x="5" y="5" width="70" height="3" rx="1" />
39
+ <rect fill={wood} x="5" y="92" width="70" height="3" rx="1" />
40
+
41
+ <!-- Lattice pattern -->
42
+ <g opacity="0.8">
43
+ <line x1="10" y1="8" x2="70" y2="50" stroke={wood} stroke-width="2.5" />
44
+ <line x1="10" y1="35" x2="70" y2="77" stroke={wood} stroke-width="2.5" />
45
+ <line x1="10" y1="62" x2="55" y2="92" stroke={wood} stroke-width="2.5" />
46
+ <line x1="70" y1="8" x2="10" y2="50" stroke={wood} stroke-width="2.5" />
47
+ <line x1="70" y1="35" x2="10" y2="77" stroke={wood} stroke-width="2.5" />
48
+ <line x1="70" y1="62" x2="25" y2="92" stroke={wood} stroke-width="2.5" />
49
+ </g>
50
+
51
+ <!-- Climbing vine -->
52
+ <path
53
+ fill="none"
54
+ stroke={vine}
55
+ stroke-width="3"
56
+ d="M40 100 Q35 85 42 75 Q50 65 38 55 Q25 45 40 35 Q55 25 45 15 Q35 5 50 0"
57
+ stroke-linecap="round"
58
+ />
59
+
60
+ <!-- Secondary vine -->
61
+ <path
62
+ fill="none"
63
+ stroke={vine}
64
+ stroke-width="2"
65
+ d="M38 80 Q25 70 30 60 Q35 50 20 45"
66
+ stroke-linecap="round"
67
+ opacity="0.8"
68
+ />
69
+
70
+ <!-- Leaves along vine -->
71
+ <ellipse fill={leafColor} cx="35" cy="78" rx="6" ry="4" transform="rotate(-25 35 78)" />
72
+ <ellipse fill={leafColor} cx="48" cy="62" rx="6" ry="4" transform="rotate(20 48 62)" />
73
+ <ellipse fill={leafColor} cx="30" cy="48" rx="5" ry="3" transform="rotate(-30 30 48)" />
74
+ <ellipse fill={leafColor} cx="52" cy="32" rx="5" ry="3" transform="rotate(25 52 32)" />
75
+ <ellipse fill={leafColor} cx="38" cy="20" rx="5" ry="3" transform="rotate(-15 38 20)" />
76
+ <ellipse fill={leafColor} cx="22" cy="58" rx="4" ry="3" transform="rotate(-20 22 58)" />
77
+
78
+ {#if hasFlowers && season !== 'autumn'}
79
+ <!-- Small flowers -->
80
+ <circle fill={flowerColor} cx="42" cy="70" r="4" />
81
+ <circle fill="#fbbf24" cx="42" cy="70" r="1.5" />
82
+
83
+ <circle fill={flowerColor} cx="35" cy="42" r="3.5" />
84
+ <circle fill="#fbbf24" cx="35" cy="42" r="1.2" />
85
+
86
+ <circle fill={flowerColor} cx="48" cy="25" r="3" />
87
+ <circle fill="#fbbf24" cx="48" cy="25" r="1" />
88
+ {/if}
89
+ </svg>
@@ -0,0 +1,11 @@
1
+ import type { Season } from '../palette';
2
+ interface Props {
3
+ class?: string;
4
+ woodColor?: string;
5
+ vineColor?: string;
6
+ season?: Season;
7
+ hasFlowers?: boolean;
8
+ }
9
+ declare const LatticeWithVine: import("svelte").Component<Props, {}, "">;
10
+ type LatticeWithVine = ReturnType<typeof LatticeWithVine>;
11
+ export default LatticeWithVine;
@@ -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 { earth } from '../palette';
8
+
9
+ interface Props {
10
+ class?: string;
11
+ stoneColor?: string;
12
+ }
13
+
14
+ let {
15
+ class: className = 'w-16 h-8',
16
+ stoneColor
17
+ }: Props = $props();
18
+
19
+ const stone = $derived(stoneColor ?? earth.stone);
20
+ const highlight = $derived(earth.pebble);
21
+ const shadow = $derived(earth.slate);
22
+ </script>
23
+
24
+ <!-- Stepping stones path -->
25
+ <svg class={className} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 40">
26
+ <!-- Stone 1 (left) -->
27
+ <ellipse fill={stone} cx="18" cy="22" rx="16" ry="10" />
28
+ <ellipse fill={highlight} cx="14" cy="19" rx="6" ry="4" opacity="0.2" />
29
+ <ellipse fill={shadow} cx="22" cy="26" rx="8" ry="4" opacity="0.15" />
30
+
31
+ <!-- Stone 2 (center-left) -->
32
+ <ellipse fill={stone} cx="42" cy="18" rx="14" ry="9" />
33
+ <ellipse fill={highlight} cx="38" cy="15" rx="5" ry="3" opacity="0.2" />
34
+
35
+ <!-- Stone 3 (center) -->
36
+ <ellipse fill={stone} cx="62" cy="24" rx="13" ry="8" />
37
+ <ellipse fill={highlight} cx="58" cy="21" rx="5" ry="3" opacity="0.2" />
38
+ <ellipse fill={shadow} cx="66" cy="27" rx="6" ry="3" opacity="0.15" />
39
+
40
+ <!-- Stone 4 (right) -->
41
+ <ellipse fill={stone} cx="85" cy="20" rx="12" ry="9" />
42
+ <ellipse fill={highlight} cx="82" cy="17" rx="4" ry="3" opacity="0.2" />
43
+
44
+ <!-- Small pebbles between -->
45
+ <circle fill={earth.pebble} cx="30" cy="28" r="3" opacity="0.6" />
46
+ <circle fill={earth.pebble} cx="52" cy="32" r="2" opacity="0.5" />
47
+ <circle fill={earth.pebble} cx="74" cy="30" r="2.5" opacity="0.5" />
48
+ </svg>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ class?: string;
3
+ stoneColor?: string;
4
+ }
5
+ declare const StonePath: import("svelte").Component<Props, {}, "">;
6
+ type StonePath = ReturnType<typeof StonePath>;
7
+ export default StonePath;
@@ -0,0 +1,8 @@
1
+ export { default as Birdhouse } from './Birdhouse.svelte';
2
+ export { default as Bridge } from './Bridge.svelte';
3
+ export { default as FencePost } from './FencePost.svelte';
4
+ export { default as GardenGate } from './GardenGate.svelte';
5
+ export { default as Lantern } from './Lantern.svelte';
6
+ export { default as Lattice } from './Lattice.svelte';
7
+ export { default as LatticeWithVine } from './LatticeWithVine.svelte';
8
+ export { default as StonePath } from './StonePath.svelte';
@@ -0,0 +1,9 @@
1
+ // Structural components - garden structures and paths
2
+ export { default as Birdhouse } from './Birdhouse.svelte';
3
+ export { default as Bridge } from './Bridge.svelte';
4
+ export { default as FencePost } from './FencePost.svelte';
5
+ export { default as GardenGate } from './GardenGate.svelte';
6
+ export { default as Lantern } from './Lantern.svelte';
7
+ export { default as Lattice } from './Lattice.svelte';
8
+ export { default as LatticeWithVine } from './LatticeWithVine.svelte';
9
+ export { default as StonePath } from './StonePath.svelte';