@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.
- package/dist/components/OnboardingChecklist.svelte +2 -2
- package/dist/components/WispButton.svelte +83 -0
- package/dist/components/WispButton.svelte.d.ts +49 -0
- package/dist/components/WispPanel.svelte +1093 -0
- package/dist/components/WispPanel.svelte.d.ts +49 -0
- package/dist/components/custom/TableOfContents.svelte +12 -1
- package/dist/components/quota/UpgradePrompt.svelte +1 -0
- package/dist/config/wisp.d.ts +145 -0
- package/dist/config/wisp.js +175 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/server/inference-client.d.ts +139 -0
- package/dist/server/inference-client.js +294 -0
- package/dist/ui/components/content/RoadmapPreview.svelte +91 -0
- package/dist/ui/components/content/RoadmapPreview.svelte.d.ts +36 -0
- package/dist/ui/components/content/index.d.ts +1 -0
- package/dist/ui/components/content/index.js +1 -0
- package/dist/ui/components/nature/Logo.svelte +260 -0
- package/dist/ui/components/nature/Logo.svelte.d.ts +14 -0
- package/dist/ui/components/nature/botanical/Acorn.svelte +48 -0
- package/dist/ui/components/nature/botanical/Acorn.svelte.d.ts +8 -0
- package/dist/ui/components/nature/botanical/Berry.svelte +67 -0
- package/dist/ui/components/nature/botanical/Berry.svelte.d.ts +8 -0
- package/dist/ui/components/nature/botanical/DandelionPuff.svelte +98 -0
- package/dist/ui/components/nature/botanical/DandelionPuff.svelte.d.ts +8 -0
- package/dist/ui/components/nature/botanical/FallingLeavesLayer.svelte +170 -0
- package/dist/ui/components/nature/botanical/FallingLeavesLayer.svelte.d.ts +35 -0
- package/dist/ui/components/nature/botanical/FallingPetalsLayer.svelte +174 -0
- package/dist/ui/components/nature/botanical/FallingPetalsLayer.svelte.d.ts +25 -0
- package/dist/ui/components/nature/botanical/Leaf.svelte +77 -0
- package/dist/ui/components/nature/botanical/Leaf.svelte.d.ts +10 -0
- package/dist/ui/components/nature/botanical/LeafFalling.svelte +186 -0
- package/dist/ui/components/nature/botanical/LeafFalling.svelte.d.ts +22 -0
- package/dist/ui/components/nature/botanical/PetalFalling.svelte +266 -0
- package/dist/ui/components/nature/botanical/PetalFalling.svelte.d.ts +25 -0
- package/dist/ui/components/nature/botanical/PineCone.svelte +61 -0
- package/dist/ui/components/nature/botanical/PineCone.svelte.d.ts +7 -0
- package/dist/ui/components/nature/botanical/Vine.svelte +102 -0
- package/dist/ui/components/nature/botanical/Vine.svelte.d.ts +11 -0
- package/dist/ui/components/nature/botanical/index.d.ts +10 -0
- package/dist/ui/components/nature/botanical/index.js +11 -0
- package/dist/ui/components/nature/creatures/Bee.svelte +78 -0
- package/dist/ui/components/nature/creatures/Bee.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Bird.svelte +94 -0
- package/dist/ui/components/nature/creatures/Bird.svelte.d.ts +11 -0
- package/dist/ui/components/nature/creatures/BirdFlying.svelte +83 -0
- package/dist/ui/components/nature/creatures/BirdFlying.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Bluebird.svelte +95 -0
- package/dist/ui/components/nature/creatures/Bluebird.svelte.d.ts +12 -0
- package/dist/ui/components/nature/creatures/Butterfly.svelte +87 -0
- package/dist/ui/components/nature/creatures/Butterfly.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Cardinal.svelte +95 -0
- package/dist/ui/components/nature/creatures/Cardinal.svelte.d.ts +12 -0
- package/dist/ui/components/nature/creatures/Chickadee.svelte +97 -0
- package/dist/ui/components/nature/creatures/Chickadee.svelte.d.ts +12 -0
- package/dist/ui/components/nature/creatures/Deer.svelte +95 -0
- package/dist/ui/components/nature/creatures/Deer.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Firefly.svelte +111 -0
- package/dist/ui/components/nature/creatures/Firefly.svelte.d.ts +10 -0
- package/dist/ui/components/nature/creatures/Owl.svelte +91 -0
- package/dist/ui/components/nature/creatures/Owl.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Rabbit.svelte +90 -0
- package/dist/ui/components/nature/creatures/Rabbit.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/Robin.svelte +98 -0
- package/dist/ui/components/nature/creatures/Robin.svelte.d.ts +12 -0
- package/dist/ui/components/nature/creatures/Squirrel.svelte +97 -0
- package/dist/ui/components/nature/creatures/Squirrel.svelte.d.ts +9 -0
- package/dist/ui/components/nature/creatures/index.d.ts +13 -0
- package/dist/ui/components/nature/creatures/index.js +14 -0
- package/dist/ui/components/nature/ground/Bush.svelte +57 -0
- package/dist/ui/components/nature/ground/Bush.svelte.d.ts +10 -0
- package/dist/ui/components/nature/ground/Crocus.svelte +83 -0
- package/dist/ui/components/nature/ground/Crocus.svelte.d.ts +12 -0
- package/dist/ui/components/nature/ground/Daffodil.svelte +75 -0
- package/dist/ui/components/nature/ground/Daffodil.svelte.d.ts +11 -0
- package/dist/ui/components/nature/ground/Fern.svelte +72 -0
- package/dist/ui/components/nature/ground/Fern.svelte.d.ts +10 -0
- package/dist/ui/components/nature/ground/FlowerWild.svelte +60 -0
- package/dist/ui/components/nature/ground/FlowerWild.svelte.d.ts +10 -0
- package/dist/ui/components/nature/ground/GrassTuft.svelte +49 -0
- package/dist/ui/components/nature/ground/GrassTuft.svelte.d.ts +10 -0
- package/dist/ui/components/nature/ground/Log.svelte +42 -0
- package/dist/ui/components/nature/ground/Log.svelte.d.ts +7 -0
- package/dist/ui/components/nature/ground/Mushroom.svelte +48 -0
- package/dist/ui/components/nature/ground/Mushroom.svelte.d.ts +9 -0
- package/dist/ui/components/nature/ground/MushroomCluster.svelte +41 -0
- package/dist/ui/components/nature/ground/MushroomCluster.svelte.d.ts +8 -0
- package/dist/ui/components/nature/ground/Rock.svelte +59 -0
- package/dist/ui/components/nature/ground/Rock.svelte.d.ts +8 -0
- package/dist/ui/components/nature/ground/Stump.svelte +44 -0
- package/dist/ui/components/nature/ground/Stump.svelte.d.ts +8 -0
- package/dist/ui/components/nature/ground/Tulip.svelte +79 -0
- package/dist/ui/components/nature/ground/Tulip.svelte.d.ts +11 -0
- package/dist/ui/components/nature/ground/index.d.ts +12 -0
- package/dist/ui/components/nature/ground/index.js +13 -0
- package/dist/ui/components/nature/index.d.ts +28 -0
- package/dist/ui/components/nature/index.js +38 -0
- package/dist/ui/components/nature/palette.d.ts +602 -0
- package/dist/ui/components/nature/palette.js +472 -0
- package/dist/ui/components/nature/sky/Cloud.svelte +122 -0
- package/dist/ui/components/nature/sky/Cloud.svelte.d.ts +11 -0
- package/dist/ui/components/nature/sky/CloudWispy.svelte +79 -0
- package/dist/ui/components/nature/sky/CloudWispy.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/Moon.svelte +60 -0
- package/dist/ui/components/nature/sky/Moon.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/Rainbow.svelte +101 -0
- package/dist/ui/components/nature/sky/Rainbow.svelte.d.ts +8 -0
- package/dist/ui/components/nature/sky/Star.svelte +84 -0
- package/dist/ui/components/nature/sky/Star.svelte.d.ts +10 -0
- package/dist/ui/components/nature/sky/StarCluster.svelte +85 -0
- package/dist/ui/components/nature/sky/StarCluster.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/StarShooting.svelte +90 -0
- package/dist/ui/components/nature/sky/StarShooting.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/Sun.svelte +70 -0
- package/dist/ui/components/nature/sky/Sun.svelte.d.ts +9 -0
- package/dist/ui/components/nature/sky/index.d.ts +8 -0
- package/dist/ui/components/nature/sky/index.js +9 -0
- package/dist/ui/components/nature/structural/Birdhouse.svelte +53 -0
- package/dist/ui/components/nature/structural/Birdhouse.svelte.d.ts +8 -0
- package/dist/ui/components/nature/structural/Bridge.svelte +65 -0
- package/dist/ui/components/nature/structural/Bridge.svelte.d.ts +7 -0
- package/dist/ui/components/nature/structural/FencePost.svelte +54 -0
- package/dist/ui/components/nature/structural/FencePost.svelte.d.ts +8 -0
- package/dist/ui/components/nature/structural/GardenGate.svelte +70 -0
- package/dist/ui/components/nature/structural/GardenGate.svelte.d.ts +8 -0
- package/dist/ui/components/nature/structural/Lantern.svelte +113 -0
- package/dist/ui/components/nature/structural/Lantern.svelte.d.ts +10 -0
- package/dist/ui/components/nature/structural/Lattice.svelte +89 -0
- package/dist/ui/components/nature/structural/Lattice.svelte.d.ts +8 -0
- package/dist/ui/components/nature/structural/LatticeWithVine.svelte +89 -0
- package/dist/ui/components/nature/structural/LatticeWithVine.svelte.d.ts +11 -0
- package/dist/ui/components/nature/structural/StonePath.svelte +48 -0
- package/dist/ui/components/nature/structural/StonePath.svelte.d.ts +7 -0
- package/dist/ui/components/nature/structural/index.d.ts +8 -0
- package/dist/ui/components/nature/structural/index.js +9 -0
- package/dist/ui/components/nature/trees/TreeAspen.svelte +163 -0
- package/dist/ui/components/nature/trees/TreeAspen.svelte.d.ts +11 -0
- package/dist/ui/components/nature/trees/TreeBirch.svelte +186 -0
- package/dist/ui/components/nature/trees/TreeBirch.svelte.d.ts +11 -0
- package/dist/ui/components/nature/trees/TreeCherry.svelte +108 -0
- package/dist/ui/components/nature/trees/TreeCherry.svelte.d.ts +11 -0
- package/dist/ui/components/nature/trees/TreePine.svelte +79 -0
- package/dist/ui/components/nature/trees/TreePine.svelte.d.ts +11 -0
- package/dist/ui/components/nature/trees/index.d.ts +4 -0
- package/dist/ui/components/nature/trees/index.js +5 -0
- package/dist/ui/components/nature/water/LilyPad.svelte +99 -0
- package/dist/ui/components/nature/water/LilyPad.svelte.d.ts +10 -0
- package/dist/ui/components/nature/water/Pond.svelte +104 -0
- package/dist/ui/components/nature/water/Pond.svelte.d.ts +8 -0
- package/dist/ui/components/nature/water/Reeds.svelte +85 -0
- package/dist/ui/components/nature/water/Reeds.svelte.d.ts +11 -0
- package/dist/ui/components/nature/water/Stream.svelte +98 -0
- package/dist/ui/components/nature/water/Stream.svelte.d.ts +8 -0
- package/dist/ui/components/nature/water/index.d.ts +4 -0
- package/dist/ui/components/nature/water/index.js +5 -0
- package/dist/ui/components/nature/weather/SnowfallLayer.svelte +175 -0
- package/dist/ui/components/nature/weather/SnowfallLayer.svelte.d.ts +25 -0
- package/dist/ui/components/nature/weather/Snowflake.svelte +99 -0
- package/dist/ui/components/nature/weather/Snowflake.svelte.d.ts +11 -0
- package/dist/ui/components/nature/weather/SnowflakeFalling.svelte +162 -0
- package/dist/ui/components/nature/weather/SnowflakeFalling.svelte.d.ts +23 -0
- package/dist/ui/components/nature/weather/index.d.ts +3 -0
- package/dist/ui/components/nature/weather/index.js +4 -0
- package/dist/ui/components/primitives/textarea/textarea.svelte +1 -1
- package/dist/ui/components/typography/Alagard.svelte +17 -0
- package/dist/ui/components/typography/Alagard.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Atkinson.svelte +17 -0
- package/dist/ui/components/typography/Atkinson.svelte.d.ts +10 -0
- package/dist/ui/components/typography/BodoniModa.svelte +17 -0
- package/dist/ui/components/typography/BodoniModa.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Calistoga.svelte +17 -0
- package/dist/ui/components/typography/Calistoga.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Caveat.svelte +17 -0
- package/dist/ui/components/typography/Caveat.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Cormorant.svelte +17 -0
- package/dist/ui/components/typography/Cormorant.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Cozette.svelte +17 -0
- package/dist/ui/components/typography/Cozette.svelte.d.ts +10 -0
- package/dist/ui/components/typography/EBGaramond.svelte +17 -0
- package/dist/ui/components/typography/EBGaramond.svelte.d.ts +10 -0
- package/dist/ui/components/typography/FontProvider.svelte +98 -0
- package/dist/ui/components/typography/FontProvider.svelte.d.ts +17 -0
- package/dist/ui/components/typography/Fraunces.svelte +17 -0
- package/dist/ui/components/typography/Fraunces.svelte.d.ts +10 -0
- package/dist/ui/components/typography/IBMPlexMono.svelte +17 -0
- package/dist/ui/components/typography/IBMPlexMono.svelte.d.ts +10 -0
- package/dist/ui/components/typography/InstrumentSans.svelte +17 -0
- package/dist/ui/components/typography/InstrumentSans.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Lexend.svelte +17 -0
- package/dist/ui/components/typography/Lexend.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Lora.svelte +17 -0
- package/dist/ui/components/typography/Lora.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Luciole.svelte +17 -0
- package/dist/ui/components/typography/Luciole.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Manrope.svelte +17 -0
- package/dist/ui/components/typography/Manrope.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Merriweather.svelte +17 -0
- package/dist/ui/components/typography/Merriweather.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Nunito.svelte +17 -0
- package/dist/ui/components/typography/Nunito.svelte.d.ts +10 -0
- package/dist/ui/components/typography/OpenDyslexic.svelte +17 -0
- package/dist/ui/components/typography/OpenDyslexic.svelte.d.ts +10 -0
- package/dist/ui/components/typography/PlusJakartaSans.svelte +17 -0
- package/dist/ui/components/typography/PlusJakartaSans.svelte.d.ts +10 -0
- package/dist/ui/components/typography/Quicksand.svelte +17 -0
- package/dist/ui/components/typography/Quicksand.svelte.d.ts +10 -0
- package/dist/ui/components/typography/README.md +153 -0
- package/dist/ui/components/typography/index.d.ts +23 -0
- package/dist/ui/components/typography/index.js +42 -0
- package/dist/ui/components/ui/GlassCarousel.svelte +446 -0
- package/dist/ui/components/ui/GlassCarousel.svelte.d.ts +57 -0
- package/dist/ui/components/ui/GlassConfirmDialog.svelte +2 -1
- package/dist/ui/components/ui/GlassLogo.svelte +423 -0
- package/dist/ui/components/ui/GlassLogo.svelte.d.ts +23 -0
- package/dist/ui/components/ui/GlassNavbar.svelte +120 -0
- package/dist/ui/components/ui/GlassNavbar.svelte.d.ts +42 -0
- package/dist/ui/components/ui/GlassOverlay.svelte +1 -1
- package/dist/ui/components/ui/Logo.svelte +47 -52
- package/dist/ui/components/ui/Logo.svelte.d.ts +4 -3
- package/dist/ui/components/ui/index.d.ts +3 -0
- package/dist/ui/components/ui/index.js +3 -0
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.js +2 -0
- package/dist/ui/styles/grove.css +15 -1
- package/dist/ui/vineyard/index.d.ts +9 -0
- package/dist/ui/vineyard/index.js +8 -0
- package/dist/utils/csrf.js +5 -2
- package/dist/utils/readability.d.ts +89 -0
- package/dist/utils/readability.js +204 -0
- package/package.json +27 -1
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Nature Palette
|
|
3
|
+
*
|
|
4
|
+
* A unified color system for all forest/nature components.
|
|
5
|
+
* All components should import from here to maintain visual cohesion.
|
|
6
|
+
*
|
|
7
|
+
* Design Philosophy:
|
|
8
|
+
* - Colors are drawn from real forest environments (Pacific Northwest inspiration)
|
|
9
|
+
* - Organized by depth: darker = further away, lighter = closer (atmospheric perspective)
|
|
10
|
+
* - Seasonal variants allow trees to change with autumn toggle
|
|
11
|
+
* - Accents are intentionally limited to 1-2 unique colors per component type
|
|
12
|
+
*/
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// CORE PALETTES
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Green foliage colors - from dark forest depths to pale spring leaves
|
|
18
|
+
* Organized dark-to-light for depth layering in forest scenes.
|
|
19
|
+
* darkForest/deepGreen: background trees (atmospheric distance)
|
|
20
|
+
* grove/meadow: mid-ground trees (Grove brand green at grove)
|
|
21
|
+
* spring/mint/pale: foreground foliage, new growth
|
|
22
|
+
*/
|
|
23
|
+
export const greens = {
|
|
24
|
+
darkForest: '#0d4a1c',
|
|
25
|
+
deepGreen: '#166534',
|
|
26
|
+
grove: '#16a34a', // Grove brand primary green
|
|
27
|
+
meadow: '#22c55e',
|
|
28
|
+
spring: '#4ade80',
|
|
29
|
+
mint: '#86efac',
|
|
30
|
+
pale: '#bbf7d0'
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Bark and wood tones
|
|
34
|
+
* Used for tree trunks, branches, fences, and structural elements.
|
|
35
|
+
* Warmer browns complement the green foliage.
|
|
36
|
+
*/
|
|
37
|
+
export const bark = {
|
|
38
|
+
darkBark: '#3d2817', // Oak, older trees
|
|
39
|
+
bark: '#5d4037', // Standard trunk color
|
|
40
|
+
warmBark: '#6B4423', // Pine, cedar tones
|
|
41
|
+
lightBark: '#8b6914' // Young trees, sun-exposed wood
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Earth and soil tones
|
|
45
|
+
* Ground elements, rocks, paths. Neutral grays for stone
|
|
46
|
+
* to contrast with warm browns of wood.
|
|
47
|
+
*/
|
|
48
|
+
export const earth = {
|
|
49
|
+
soil: '#3e2723', // Rich forest floor
|
|
50
|
+
mud: '#5d4037', // Wet earth (same as bark.bark - natural connection)
|
|
51
|
+
clay: '#8d6e63', // Exposed clay
|
|
52
|
+
sand: '#d7ccc8', // Paths, dry ground
|
|
53
|
+
stone: '#78716c', // Neutral gray rocks
|
|
54
|
+
pebble: '#a8a29e', // Lighter stones
|
|
55
|
+
slate: '#57534e' // Dark stone accents
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Cream and natural off-whites
|
|
59
|
+
* Special bark colors (aspen, birch) and neutral backgrounds.
|
|
60
|
+
* Birch has pure white bark with slight warmth.
|
|
61
|
+
* Aspen bark is cream/pale green undertone.
|
|
62
|
+
*/
|
|
63
|
+
export const natural = {
|
|
64
|
+
cream: '#fef9ef', // Warm white, backgrounds
|
|
65
|
+
aspenBark: '#e8e4d9', // Aspen tree distinctive pale bark
|
|
66
|
+
bone: '#e8e4dc', // Weathered wood, antlers
|
|
67
|
+
mushroom: '#d4c8be', // Mushroom stems, pale fungi
|
|
68
|
+
birchWhite: '#f5f5f0' // Birch tree distinctive white bark
|
|
69
|
+
};
|
|
70
|
+
// =============================================================================
|
|
71
|
+
// SEASONAL PALETTES - SPRING
|
|
72
|
+
// =============================================================================
|
|
73
|
+
/**
|
|
74
|
+
* Spring foliage - fresh yellow-green growth
|
|
75
|
+
* The distinctive bright yellow-green of new spring leaves.
|
|
76
|
+
* Organized dark-to-light for depth layering.
|
|
77
|
+
*/
|
|
78
|
+
export const springFoliage = {
|
|
79
|
+
sprout: '#65a30d', // Dark spring green - distant new growth
|
|
80
|
+
newLeaf: '#84cc16', // Classic spring lime - mid-ground
|
|
81
|
+
freshGreen: '#a3e635', // Bright yellow-green - foreground
|
|
82
|
+
budding: '#bef264', // Pale new leaf
|
|
83
|
+
tender: '#d9f99d' // Very pale spring green
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Spring sky colors
|
|
87
|
+
* Clear, bright spring atmosphere.
|
|
88
|
+
*/
|
|
89
|
+
export const springSky = {
|
|
90
|
+
clear: '#7dd3fc', // Clear spring morning sky
|
|
91
|
+
soft: '#bae6fd' // Pale spring sky
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Wildflowers - spring and general meadow flowers
|
|
95
|
+
* Unified wildflower palette for all seasons.
|
|
96
|
+
* Used for spring wildflowers and general meadow accents.
|
|
97
|
+
*/
|
|
98
|
+
export const wildflowers = {
|
|
99
|
+
// Yellows
|
|
100
|
+
buttercup: '#facc15', // Bright yellow - buttercups, dandelions
|
|
101
|
+
daffodil: '#fde047', // Pale yellow - daffodils
|
|
102
|
+
// Purples and violets
|
|
103
|
+
crocus: '#a78bfa', // Early spring crocus
|
|
104
|
+
violet: '#8b5cf6', // Wild violets
|
|
105
|
+
purple: '#a855f7', // Lupine, thistle
|
|
106
|
+
lavender: '#c4b5fd', // Distant flower masses, lilacs
|
|
107
|
+
// Pinks and reds
|
|
108
|
+
tulipPink: '#f9a8d4', // Soft tulip pink
|
|
109
|
+
tulipRed: '#fb7185', // Bright tulip red
|
|
110
|
+
// Neutrals
|
|
111
|
+
white: '#fefefe' // Daisies, trillium
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Cherry blossoms - standard summer/default
|
|
115
|
+
* Used for cherry trees during summer.
|
|
116
|
+
* Pink blooms from dense to pale.
|
|
117
|
+
*/
|
|
118
|
+
export const cherryBlossoms = {
|
|
119
|
+
deep: '#db2777', // Dense bloom centers
|
|
120
|
+
standard: '#ec4899', // Standard blossom
|
|
121
|
+
light: '#f472b6', // Light petals
|
|
122
|
+
pale: '#f9a8d4', // Pale blossoms
|
|
123
|
+
falling: '#fbcfe8' // Falling petals, distant blooms
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Cherry blossoms peak bloom - vibrant spring version
|
|
127
|
+
* Extra saturated for spring when cherry blossoms are at their most beautiful.
|
|
128
|
+
* One shade brighter than standard cherryBlossoms.
|
|
129
|
+
*/
|
|
130
|
+
export const cherryBlossomsPeak = {
|
|
131
|
+
deep: '#ec4899', // Vibrant deep pink
|
|
132
|
+
standard: '#f472b6', // Bright cherry blossom
|
|
133
|
+
light: '#f9a8d4', // Soft rose petals
|
|
134
|
+
pale: '#fbcfe8', // Pale blush
|
|
135
|
+
falling: '#fce7f3' // Very pale falling petals
|
|
136
|
+
};
|
|
137
|
+
// =============================================================================
|
|
138
|
+
// SEASONAL PALETTES - AUTUMN
|
|
139
|
+
// =============================================================================
|
|
140
|
+
/**
|
|
141
|
+
* Autumn/Fall foliage colors
|
|
142
|
+
* Replaces greens for deciduous trees during autumn season.
|
|
143
|
+
* Organized warm-to-bright for depth layering (dark rust = far, bright gold = near).
|
|
144
|
+
* Aspen and birch use gold/honey for their signature golden fall color.
|
|
145
|
+
*/
|
|
146
|
+
export const autumn = {
|
|
147
|
+
rust: '#9a3412', // Deep background foliage
|
|
148
|
+
ember: '#c2410c', // Oak-like autumn
|
|
149
|
+
pumpkin: '#ea580c', // Maple mid-tones
|
|
150
|
+
amber: '#d97706', // Classic fall amber
|
|
151
|
+
gold: '#eab308', // Aspen/birch golden yellow
|
|
152
|
+
honey: '#facc15', // Bright foreground leaves
|
|
153
|
+
straw: '#fde047' // Pale dying leaves
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* Autumn reds for cherry/maple foliage
|
|
157
|
+
* Cherry trees don't just lose pink - they turn red/crimson in fall.
|
|
158
|
+
* Also used for Japanese maple trees and other red autumn foliage.
|
|
159
|
+
*/
|
|
160
|
+
export const autumnReds = {
|
|
161
|
+
crimson: '#be123c', // Deep maple red
|
|
162
|
+
scarlet: '#e11d48', // Bright cherry leaves
|
|
163
|
+
rose: '#f43f5e', // Light autumn cherry
|
|
164
|
+
coral: '#fb7185' // Pale autumn accent
|
|
165
|
+
};
|
|
166
|
+
// =============================================================================
|
|
167
|
+
// SEASONAL PALETTES - WINTER
|
|
168
|
+
// =============================================================================
|
|
169
|
+
/**
|
|
170
|
+
* Winter colors - frost, snow, and ice
|
|
171
|
+
* Used for winter mode: snow-dusted evergreens, frozen landscape.
|
|
172
|
+
* Deciduous trees go bare, showing only branches.
|
|
173
|
+
*/
|
|
174
|
+
export const winter = {
|
|
175
|
+
// Snow and ice
|
|
176
|
+
snow: '#f8fafc', // Pure fresh snow
|
|
177
|
+
frost: '#e2e8f0', // Frosted surfaces
|
|
178
|
+
ice: '#cbd5e1', // Ice blue-gray
|
|
179
|
+
glacier: '#94a3b8', // Deep ice shadows
|
|
180
|
+
// Frosted evergreen greens (muted, cool tones)
|
|
181
|
+
frostedPine: '#2d4a3e', // Snow-dusted dark pine
|
|
182
|
+
winterGreen: '#3d5a4a', // Muted forest green
|
|
183
|
+
coldSpruce: '#4a6355', // Cool spruce color
|
|
184
|
+
// Winter sky
|
|
185
|
+
winterSky: '#e0f2fe', // Pale winter sky
|
|
186
|
+
twilight: '#bfdbfe', // Evening winter sky
|
|
187
|
+
overcast: '#cbd5e1', // Gray overcast
|
|
188
|
+
// Bare branch colors
|
|
189
|
+
bareBranch: '#78716c', // Gray-brown bare wood
|
|
190
|
+
frostedBark: '#a8a29e', // Frost-touched bark
|
|
191
|
+
coldWood: '#57534e', // Dark winter wood
|
|
192
|
+
// Winter hills (snowy ground, back to front)
|
|
193
|
+
hillDeep: '#475569', // Far hills - cool slate
|
|
194
|
+
hillMid: '#7c8ca3', // Mid hills - gray-blue
|
|
195
|
+
hillNear: '#c7d2e0', // Near hills - pale snow
|
|
196
|
+
hillFront: '#f1f5f9' // Front hills - fresh snow
|
|
197
|
+
};
|
|
198
|
+
// =============================================================================
|
|
199
|
+
// COMPONENT-SPECIFIC ACCENTS
|
|
200
|
+
// =============================================================================
|
|
201
|
+
/**
|
|
202
|
+
* Accent colors for specific components
|
|
203
|
+
* Each category gets unique colors that don't fit the main palettes.
|
|
204
|
+
* These add visual interest without breaking the natural cohesion.
|
|
205
|
+
*/
|
|
206
|
+
export const accents = {
|
|
207
|
+
/** Mushroom caps and details - fairy tale forest pops of color */
|
|
208
|
+
mushroom: {
|
|
209
|
+
redCap: '#dc2626', // Amanita-style red (toxic but iconic)
|
|
210
|
+
orangeCap: '#ea580c', // Chanterelle-inspired
|
|
211
|
+
brownCap: '#78350f', // Porcini/common mushroom
|
|
212
|
+
spots: '#fefefe', // White spots on caps
|
|
213
|
+
gill: '#fde8e8' // Pale pink gills underneath
|
|
214
|
+
},
|
|
215
|
+
/**
|
|
216
|
+
* @deprecated Use the top-level `wildflowers` export instead. Will be removed in v1.0.
|
|
217
|
+
*
|
|
218
|
+
* Historical context: Flower colors were originally split between two places:
|
|
219
|
+
* - `spring` palette had wildflower accents (crocus, lilac, tulips, buttercup, daffodil)
|
|
220
|
+
* - `accents.flower` had generic flower colors (purple, violet, yellow, white, lavender)
|
|
221
|
+
*
|
|
222
|
+
* This caused confusion and duplicate values. Now unified in the top-level `wildflowers`
|
|
223
|
+
* palette which contains all meadow flower colors in one place.
|
|
224
|
+
*/
|
|
225
|
+
flower: {
|
|
226
|
+
purple: wildflowers.purple,
|
|
227
|
+
violet: wildflowers.violet,
|
|
228
|
+
yellow: wildflowers.buttercup,
|
|
229
|
+
white: wildflowers.white,
|
|
230
|
+
lavender: wildflowers.lavender
|
|
231
|
+
},
|
|
232
|
+
/** Firefly bioluminescence - warm yellow-green glow */
|
|
233
|
+
firefly: {
|
|
234
|
+
glow: '#fef08a', // Primary glow (pale yellow)
|
|
235
|
+
warmGlow: '#fde047', // Brighter intensity
|
|
236
|
+
body: '#365314' // Dark green body
|
|
237
|
+
},
|
|
238
|
+
/** Berry colors - rich and saturated */
|
|
239
|
+
berry: {
|
|
240
|
+
ripe: '#7c2d12', // Blackberry/dark berry
|
|
241
|
+
elderberry: '#581c87', // Deep purple elderberry
|
|
242
|
+
red: '#b91c1c' // Holly berries, winterberry
|
|
243
|
+
},
|
|
244
|
+
/** Water and pond colors - cool blue spectrum */
|
|
245
|
+
water: {
|
|
246
|
+
surface: '#7dd3fc', // Reflecting sky
|
|
247
|
+
deep: '#0284c7', // Deeper water
|
|
248
|
+
shallow: '#bae6fd', // Shallow edges
|
|
249
|
+
lily: '#bbf7d0' // Lily pad green (ties to greens)
|
|
250
|
+
},
|
|
251
|
+
/** Sky elements - time of day variations */
|
|
252
|
+
sky: {
|
|
253
|
+
dayLight: '#e0f2fe', // Pale daytime sky
|
|
254
|
+
dayMid: '#7dd3fc', // Blue sky
|
|
255
|
+
sunset: '#fed7aa', // Golden hour
|
|
256
|
+
night: '#1e293b', // Night sky
|
|
257
|
+
star: '#fefce8' // Star/twinkle color
|
|
258
|
+
},
|
|
259
|
+
/** Bird colors - winter, spring, and year-round species */
|
|
260
|
+
bird: {
|
|
261
|
+
// Cardinal (winter)
|
|
262
|
+
cardinalRed: '#dc2626', // Northern Cardinal vivid red
|
|
263
|
+
cardinalMask: '#1a1a1a', // Cardinal black mask
|
|
264
|
+
cardinalBeak: '#f97316', // Orange-red cone beak
|
|
265
|
+
// Chickadee (year-round)
|
|
266
|
+
chickadeeCap: '#1a1a1a', // Black-capped Chickadee cap/bib
|
|
267
|
+
chickadeeCheek: '#fafafa', // White cheek patch
|
|
268
|
+
chickadeeBody: '#6b7280', // Gray back feathers
|
|
269
|
+
chickadeeBelly: '#fef3c7', // Buff/cream underside
|
|
270
|
+
// Robin (spring herald!)
|
|
271
|
+
robinBody: '#4a4a4a', // American Robin dark gray-brown
|
|
272
|
+
robinWing: '#3a3a3a', // Slightly darker wing
|
|
273
|
+
robinWingDark: '#2a2a2a', // Wing shadow detail
|
|
274
|
+
robinBreast: '#c2410c', // American Robin orange-red breast
|
|
275
|
+
robinBreastLight: '#dc5015', // Breast highlight
|
|
276
|
+
robinBeak: '#f59e0b', // Yellow-orange beak
|
|
277
|
+
// Bluebird (spring/summer)
|
|
278
|
+
bluebirdBody: '#3b82f6', // Eastern Bluebird vivid blue
|
|
279
|
+
bluebirdWing: '#2563eb', // Slightly darker blue wings
|
|
280
|
+
bluebirdBreast: '#ea580c' // Rusty orange breast
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
// =============================================================================
|
|
284
|
+
// MIDNIGHT BLOOM PALETTE
|
|
285
|
+
// =============================================================================
|
|
286
|
+
/**
|
|
287
|
+
* Midnight Bloom - the far vision
|
|
288
|
+
* A late-night tea café palette: deep plums, warm amber, soft golds.
|
|
289
|
+
* Used for the Midnight Bloom section of the roadmap and future theming.
|
|
290
|
+
*/
|
|
291
|
+
export const midnightBloom = {
|
|
292
|
+
deepPlum: '#581c87', // Night sky depth
|
|
293
|
+
purple: '#7c3aed', // Soft purple glow
|
|
294
|
+
violet: '#8b5cf6', // Lighter accent
|
|
295
|
+
amber: '#f59e0b', // Lantern warmth
|
|
296
|
+
warmCream: '#fef3c7', // Tea steam, page glow
|
|
297
|
+
softGold: '#fcd34d' // Fairy lights
|
|
298
|
+
};
|
|
299
|
+
/**
|
|
300
|
+
* Get appropriate foliage colors based on season
|
|
301
|
+
* Used by deciduous trees to switch from greens to seasonal palette.
|
|
302
|
+
* Spring uses bright yellow-greens of new growth.
|
|
303
|
+
* Autumn uses warm oranges and golds.
|
|
304
|
+
* In winter, returns frosted evergreen colors (for pines that keep needles).
|
|
305
|
+
* @example getSeasonalGreens('spring') // returns spring foliage mapped to greens structure
|
|
306
|
+
* @example getSeasonalGreens('autumn') // returns autumn palette
|
|
307
|
+
*/
|
|
308
|
+
export function getSeasonalGreens(season = 'summer') {
|
|
309
|
+
if (season === 'spring') {
|
|
310
|
+
// Fresh yellow-green spring foliage - mapped to match greens structure
|
|
311
|
+
return {
|
|
312
|
+
darkForest: springFoliage.sprout,
|
|
313
|
+
deepGreen: springFoliage.sprout,
|
|
314
|
+
grove: springFoliage.newLeaf,
|
|
315
|
+
meadow: springFoliage.freshGreen,
|
|
316
|
+
spring: springFoliage.budding,
|
|
317
|
+
mint: springFoliage.budding,
|
|
318
|
+
pale: springFoliage.tender
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
if (season === 'autumn') {
|
|
322
|
+
return autumn;
|
|
323
|
+
}
|
|
324
|
+
if (season === 'winter') {
|
|
325
|
+
// Frosted evergreen colors for pines/conifers
|
|
326
|
+
return {
|
|
327
|
+
darkForest: winter.frostedPine,
|
|
328
|
+
deepGreen: winter.frostedPine,
|
|
329
|
+
grove: winter.winterGreen,
|
|
330
|
+
meadow: winter.winterGreen,
|
|
331
|
+
spring: winter.coldSpruce,
|
|
332
|
+
mint: winter.coldSpruce,
|
|
333
|
+
pale: winter.coldSpruce
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
return greens;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get cherry tree colors based on season
|
|
340
|
+
* Spring: Extra vibrant pink blossoms (peak bloom!)
|
|
341
|
+
* Summer: Standard pink blossoms
|
|
342
|
+
* Autumn: Turn red/crimson like real cherry leaves
|
|
343
|
+
* Winter: Bare (no blossoms)
|
|
344
|
+
* @example getCherryColors('spring') // returns cherryBlossomsPeak (vibrant)
|
|
345
|
+
* @example getCherryColors('autumn') // returns autumnReds palette
|
|
346
|
+
*/
|
|
347
|
+
export function getCherryColors(season = 'spring') {
|
|
348
|
+
if (season === 'spring') {
|
|
349
|
+
// Peak bloom - extra vibrant pinks!
|
|
350
|
+
return cherryBlossomsPeak;
|
|
351
|
+
}
|
|
352
|
+
if (season === 'autumn') {
|
|
353
|
+
return autumnReds;
|
|
354
|
+
}
|
|
355
|
+
if (season === 'winter') {
|
|
356
|
+
// Return null to indicate bare tree (no foliage to render)
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
return cherryBlossoms;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Check if a tree should be bare (no foliage) based on season
|
|
363
|
+
* Deciduous trees lose leaves in winter.
|
|
364
|
+
*/
|
|
365
|
+
export function isTreeBare(treeType, season) {
|
|
366
|
+
if (season !== 'winter')
|
|
367
|
+
return false;
|
|
368
|
+
// Evergreen types keep their needles
|
|
369
|
+
const evergreens = ['pine', 'spruce', 'fir', 'cedar'];
|
|
370
|
+
return !evergreens.includes(treeType.toLowerCase());
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Pick a random color from a palette object
|
|
374
|
+
* Useful for adding natural variation to forests.
|
|
375
|
+
* @example pickRandom(greens) // returns random green like '#16a34a'
|
|
376
|
+
*/
|
|
377
|
+
export function pickRandom(palette) {
|
|
378
|
+
const values = Object.values(palette);
|
|
379
|
+
return values[Math.floor(Math.random() * values.length)];
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Pick a random color from a subset of palette keys
|
|
383
|
+
* More controlled randomization when you want specific options.
|
|
384
|
+
* @example pickFrom(greens, ['grove', 'meadow']) // only picks from those two
|
|
385
|
+
*/
|
|
386
|
+
export function pickFrom(palette, keys) {
|
|
387
|
+
const key = keys[Math.floor(Math.random() * keys.length)];
|
|
388
|
+
return palette[key];
|
|
389
|
+
}
|
|
390
|
+
// =============================================================================
|
|
391
|
+
// BACKWARD COMPATIBILITY ALIASES
|
|
392
|
+
// =============================================================================
|
|
393
|
+
/**
|
|
394
|
+
* @deprecated Use `cherryBlossoms` instead. Will be removed in v1.0.
|
|
395
|
+
* Alias for backward compatibility with components using 'pinks'.
|
|
396
|
+
*/
|
|
397
|
+
export const pinks = {
|
|
398
|
+
deepPink: cherryBlossoms.deep,
|
|
399
|
+
pink: cherryBlossoms.standard,
|
|
400
|
+
rose: cherryBlossoms.light,
|
|
401
|
+
blush: cherryBlossoms.pale,
|
|
402
|
+
palePink: cherryBlossoms.falling
|
|
403
|
+
};
|
|
404
|
+
/**
|
|
405
|
+
* @deprecated Use `cherryBlossomsPeak` instead. Will be removed in v1.0.
|
|
406
|
+
* Alias for backward compatibility with components using 'springBlossoms'.
|
|
407
|
+
*/
|
|
408
|
+
export const springBlossoms = {
|
|
409
|
+
deepPink: cherryBlossomsPeak.deep,
|
|
410
|
+
pink: cherryBlossomsPeak.standard,
|
|
411
|
+
rose: cherryBlossomsPeak.light,
|
|
412
|
+
blush: cherryBlossomsPeak.pale,
|
|
413
|
+
palePink: cherryBlossomsPeak.falling
|
|
414
|
+
};
|
|
415
|
+
/**
|
|
416
|
+
* @deprecated Use `springFoliage`, `wildflowers`, `springSky` instead. Will be removed in v1.0.
|
|
417
|
+
* Combined spring palette for backward compatibility.
|
|
418
|
+
* New code should import the specific palettes directly.
|
|
419
|
+
*/
|
|
420
|
+
export const spring = {
|
|
421
|
+
// Fresh growth greens (from springFoliage)
|
|
422
|
+
sprout: springFoliage.sprout,
|
|
423
|
+
newLeaf: springFoliage.newLeaf,
|
|
424
|
+
freshGreen: springFoliage.freshGreen,
|
|
425
|
+
budding: springFoliage.budding,
|
|
426
|
+
tender: springFoliage.tender,
|
|
427
|
+
// Sky and atmosphere (from springSky)
|
|
428
|
+
clearSky: springSky.clear,
|
|
429
|
+
softSky: springSky.soft,
|
|
430
|
+
// Wildflower accents (from wildflowers)
|
|
431
|
+
buttercup: wildflowers.buttercup,
|
|
432
|
+
daffodil: wildflowers.daffodil,
|
|
433
|
+
crocus: wildflowers.crocus,
|
|
434
|
+
lilac: wildflowers.lavender,
|
|
435
|
+
tulipPink: wildflowers.tulipPink,
|
|
436
|
+
tulipRed: wildflowers.tulipRed,
|
|
437
|
+
// Hills and ground (references to greens for depth layering)
|
|
438
|
+
hillDeep: greens.deepGreen,
|
|
439
|
+
hillMid: greens.meadow,
|
|
440
|
+
hillNear: greens.mint,
|
|
441
|
+
hillFront: greens.pale
|
|
442
|
+
};
|
|
443
|
+
// =============================================================================
|
|
444
|
+
// FULL PALETTE EXPORT
|
|
445
|
+
// =============================================================================
|
|
446
|
+
export const naturePalette = {
|
|
447
|
+
// Core
|
|
448
|
+
greens,
|
|
449
|
+
bark,
|
|
450
|
+
earth,
|
|
451
|
+
natural,
|
|
452
|
+
// Spring
|
|
453
|
+
springFoliage,
|
|
454
|
+
springSky,
|
|
455
|
+
wildflowers,
|
|
456
|
+
cherryBlossoms,
|
|
457
|
+
cherryBlossomsPeak,
|
|
458
|
+
// Autumn
|
|
459
|
+
autumn,
|
|
460
|
+
autumnReds,
|
|
461
|
+
// Winter
|
|
462
|
+
winter,
|
|
463
|
+
// Accents
|
|
464
|
+
accents,
|
|
465
|
+
// Special
|
|
466
|
+
midnightBloom,
|
|
467
|
+
// Deprecated aliases (for backward compat)
|
|
468
|
+
spring,
|
|
469
|
+
pinks,
|
|
470
|
+
springBlossoms
|
|
471
|
+
};
|
|
472
|
+
export default naturePalette;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
interface Props {
|
|
8
|
+
class?: string;
|
|
9
|
+
color?: string;
|
|
10
|
+
animate?: boolean;
|
|
11
|
+
speed?: 'slow' | 'normal' | 'fast';
|
|
12
|
+
variant?: 'fluffy' | 'wispy' | 'puffy' | 'scattered';
|
|
13
|
+
direction?: 'left' | 'right';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
class: className = 'w-16 h-8',
|
|
18
|
+
color = 'white',
|
|
19
|
+
animate = true,
|
|
20
|
+
speed = 'normal',
|
|
21
|
+
variant = 'fluffy',
|
|
22
|
+
direction = 'right'
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
const duration = $derived(
|
|
26
|
+
{
|
|
27
|
+
slow: '120s',
|
|
28
|
+
normal: '80s',
|
|
29
|
+
fast: '50s'
|
|
30
|
+
}[speed]
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
const animClass = $derived(animate ? `drift-${direction}` : '');
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
{#if variant === 'fluffy'}
|
|
37
|
+
<!-- Classic fluffy cumulus cloud -->
|
|
38
|
+
<svg
|
|
39
|
+
class="{className} {animClass}"
|
|
40
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
41
|
+
viewBox="0 0 100 50"
|
|
42
|
+
style="--drift-duration: {duration}"
|
|
43
|
+
>
|
|
44
|
+
<g opacity="0.9">
|
|
45
|
+
<ellipse fill={color} cx="50" cy="35" rx="35" ry="15" />
|
|
46
|
+
<ellipse fill={color} cx="30" cy="30" rx="22" ry="18" />
|
|
47
|
+
<ellipse fill={color} cx="70" cy="30" rx="22" ry="18" />
|
|
48
|
+
<ellipse fill={color} cx="50" cy="22" rx="25" ry="16" />
|
|
49
|
+
<ellipse fill={color} cx="35" cy="18" rx="18" ry="14" />
|
|
50
|
+
<ellipse fill={color} cx="65" cy="18" rx="18" ry="14" />
|
|
51
|
+
</g>
|
|
52
|
+
</svg>
|
|
53
|
+
{:else if variant === 'wispy'}
|
|
54
|
+
<!-- Thin wispy cirrus cloud -->
|
|
55
|
+
<svg
|
|
56
|
+
class="{className} {animClass}"
|
|
57
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
58
|
+
viewBox="0 0 120 40"
|
|
59
|
+
style="--drift-duration: {duration}"
|
|
60
|
+
>
|
|
61
|
+
<g opacity="0.7">
|
|
62
|
+
<ellipse fill={color} cx="30" cy="20" rx="25" ry="8" />
|
|
63
|
+
<ellipse fill={color} cx="60" cy="22" rx="30" ry="10" />
|
|
64
|
+
<ellipse fill={color} cx="90" cy="18" rx="22" ry="7" />
|
|
65
|
+
<ellipse fill={color} cx="45" cy="15" rx="18" ry="6" />
|
|
66
|
+
<ellipse fill={color} cx="75" cy="25" rx="20" ry="8" />
|
|
67
|
+
</g>
|
|
68
|
+
</svg>
|
|
69
|
+
{:else if variant === 'puffy'}
|
|
70
|
+
<!-- Rounded puffy cloud -->
|
|
71
|
+
<svg
|
|
72
|
+
class="{className} {animClass}"
|
|
73
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
74
|
+
viewBox="0 0 110 55"
|
|
75
|
+
style="--drift-duration: {duration}"
|
|
76
|
+
>
|
|
77
|
+
<g opacity="0.85">
|
|
78
|
+
<circle fill={color} cx="25" cy="35" r="20" />
|
|
79
|
+
<circle fill={color} cx="45" cy="28" r="24" />
|
|
80
|
+
<circle fill={color} cx="55" cy="35" r="22" />
|
|
81
|
+
<circle fill={color} cx="75" cy="30" r="20" />
|
|
82
|
+
<circle fill={color} cx="90" cy="38" r="18" />
|
|
83
|
+
<ellipse fill={color} cx="55" cy="40" rx="40" ry="15" />
|
|
84
|
+
</g>
|
|
85
|
+
</svg>
|
|
86
|
+
{:else if variant === 'scattered'}
|
|
87
|
+
<!-- Scattered small cloudlets -->
|
|
88
|
+
<svg
|
|
89
|
+
class="{className} {animClass}"
|
|
90
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
91
|
+
viewBox="0 0 100 45"
|
|
92
|
+
style="--drift-duration: {duration}"
|
|
93
|
+
>
|
|
94
|
+
<g opacity="0.75">
|
|
95
|
+
<ellipse fill={color} cx="20" cy="25" rx="18" ry="12" />
|
|
96
|
+
<ellipse fill={color} cx="30" cy="18" rx="12" ry="10" />
|
|
97
|
+
<ellipse fill={color} cx="55" cy="30" rx="20" ry="14" />
|
|
98
|
+
<ellipse fill={color} cx="65" cy="22" rx="14" ry="11" />
|
|
99
|
+
<ellipse fill={color} cx="80" cy="28" rx="16" ry="13" />
|
|
100
|
+
</g>
|
|
101
|
+
</svg>
|
|
102
|
+
{/if}
|
|
103
|
+
|
|
104
|
+
<style>
|
|
105
|
+
@keyframes drift-right {
|
|
106
|
+
0% { transform: translateX(-10vw); }
|
|
107
|
+
100% { transform: translateX(110vw); }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@keyframes drift-left {
|
|
111
|
+
0% { transform: translateX(110vw); }
|
|
112
|
+
100% { transform: translateX(-10vw); }
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.drift-right {
|
|
116
|
+
animation: drift-right var(--drift-duration, 80s) linear infinite;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.drift-left {
|
|
120
|
+
animation: drift-left var(--drift-duration, 80s) linear infinite;
|
|
121
|
+
}
|
|
122
|
+
</style>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
color?: string;
|
|
4
|
+
animate?: boolean;
|
|
5
|
+
speed?: 'slow' | 'normal' | 'fast';
|
|
6
|
+
variant?: 'fluffy' | 'wispy' | 'puffy' | 'scattered';
|
|
7
|
+
direction?: 'left' | 'right';
|
|
8
|
+
}
|
|
9
|
+
declare const Cloud: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type Cloud = ReturnType<typeof Cloud>;
|
|
11
|
+
export default Cloud;
|
|
@@ -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
|
+
interface Props {
|
|
8
|
+
class?: string;
|
|
9
|
+
color?: string;
|
|
10
|
+
animate?: boolean;
|
|
11
|
+
speed?: 'slow' | 'normal' | 'fast';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
class: className = 'w-20 h-6',
|
|
16
|
+
color = 'white',
|
|
17
|
+
animate = true,
|
|
18
|
+
speed = 'slow'
|
|
19
|
+
}: Props = $props();
|
|
20
|
+
|
|
21
|
+
const duration = $derived(
|
|
22
|
+
{
|
|
23
|
+
slow: '80s',
|
|
24
|
+
normal: '50s',
|
|
25
|
+
fast: '30s'
|
|
26
|
+
}[speed]
|
|
27
|
+
);
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<!-- Thin wispy cirrus cloud -->
|
|
31
|
+
<svg
|
|
32
|
+
class="{className} {animate ? 'drift' : ''}"
|
|
33
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
34
|
+
viewBox="0 0 120 30"
|
|
35
|
+
style="--drift-duration: {duration}"
|
|
36
|
+
>
|
|
37
|
+
<!-- Main wispy cloud body - soft feathery shapes -->
|
|
38
|
+
<g opacity="0.5">
|
|
39
|
+
<!-- Central wisp strand with soft cloud-like bulges -->
|
|
40
|
+
<ellipse fill={color} cx="60" cy="15" rx="50" ry="4" opacity="0.4" />
|
|
41
|
+
|
|
42
|
+
<!-- Feathery tendrils extending from main body -->
|
|
43
|
+
<ellipse fill={color} cx="25" cy="13" rx="18" ry="5" opacity="0.5" />
|
|
44
|
+
<ellipse fill={color} cx="50" cy="11" rx="15" ry="4" opacity="0.45" />
|
|
45
|
+
<ellipse fill={color} cx="75" cy="14" rx="20" ry="5" opacity="0.5" />
|
|
46
|
+
<ellipse fill={color} cx="100" cy="12" rx="15" ry="4" opacity="0.4" />
|
|
47
|
+
|
|
48
|
+
<!-- Upper wisps -->
|
|
49
|
+
<ellipse fill={color} cx="35" cy="8" rx="12" ry="3" opacity="0.35" />
|
|
50
|
+
<ellipse fill={color} cx="65" cy="7" rx="10" ry="3" opacity="0.3" />
|
|
51
|
+
<ellipse fill={color} cx="90" cy="9" rx="14" ry="3" opacity="0.35" />
|
|
52
|
+
|
|
53
|
+
<!-- Lower tendrils for depth -->
|
|
54
|
+
<ellipse fill={color} cx="40" cy="18" rx="10" ry="2.5" opacity="0.3" />
|
|
55
|
+
<ellipse fill={color} cx="70" cy="19" rx="12" ry="3" opacity="0.35" />
|
|
56
|
+
<ellipse fill={color} cx="95" cy="17" rx="8" ry="2" opacity="0.25" />
|
|
57
|
+
|
|
58
|
+
<!-- Fine wispy edges -->
|
|
59
|
+
<ellipse fill={color} cx="15" cy="14" rx="8" ry="2" opacity="0.25" />
|
|
60
|
+
<ellipse fill={color} cx="110" cy="13" rx="8" ry="2" opacity="0.25" />
|
|
61
|
+
</g>
|
|
62
|
+
|
|
63
|
+
<!-- Secondary wisp layer for more depth -->
|
|
64
|
+
<g opacity="0.35">
|
|
65
|
+
<ellipse fill={color} cx="45" cy="20" rx="25" ry="3" opacity="0.4" />
|
|
66
|
+
<ellipse fill={color} cx="80" cy="6" rx="20" ry="2.5" opacity="0.35" />
|
|
67
|
+
</g>
|
|
68
|
+
</svg>
|
|
69
|
+
|
|
70
|
+
<style>
|
|
71
|
+
@keyframes drift {
|
|
72
|
+
0% { transform: translateX(0); }
|
|
73
|
+
100% { transform: translateX(20px); }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.drift {
|
|
77
|
+
animation: drift var(--drift-duration, 80s) ease-in-out infinite alternate;
|
|
78
|
+
}
|
|
79
|
+
</style>
|