@autumnsgrove/groveengine 0.6.5 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +378 -0
- package/dist/auth/index.d.ts +1 -2
- package/dist/auth/index.js +8 -4
- package/dist/auth/session.d.ts +12 -31
- package/dist/auth/session.js +5 -103
- package/dist/components/custom/ContentWithGutter.svelte +22 -25
- 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 +224 -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 +491 -0
- package/dist/ui/components/nature/palette.js +384 -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/ui/Glass.svelte +158 -0
- package/dist/ui/components/ui/Glass.svelte.d.ts +52 -0
- package/dist/ui/components/ui/GlassButton.svelte +157 -0
- package/dist/ui/components/ui/GlassButton.svelte.d.ts +39 -0
- package/dist/ui/components/ui/GlassCard.svelte +160 -0
- package/dist/ui/components/ui/GlassCard.svelte.d.ts +39 -0
- package/dist/ui/components/ui/GlassConfirmDialog.svelte +208 -0
- package/dist/ui/components/ui/GlassConfirmDialog.svelte.d.ts +52 -0
- package/dist/ui/components/ui/GlassLogo.svelte +422 -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 +93 -0
- package/dist/ui/components/ui/GlassOverlay.svelte.d.ts +33 -0
- 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 +7 -0
- package/dist/ui/components/ui/index.js +8 -0
- package/dist/ui/styles/grove.css +151 -1
- package/dist/utils/gutter.d.ts +2 -8
- package/dist/utils/markdown.d.ts +1 -0
- package/dist/utils/markdown.js +32 -11
- package/package.json +31 -22
- package/static/fonts/alagard.ttf +0 -0
- package/static/robots.txt +34 -1
- package/dist/auth/jwt.d.ts +0 -20
- package/dist/auth/jwt.js +0 -123
|
@@ -0,0 +1,384 @@
|
|
|
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
|
|
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
|
|
72
|
+
// =============================================================================
|
|
73
|
+
/**
|
|
74
|
+
* Spring colors - fresh growth and renewal
|
|
75
|
+
* Bright yellow-greens of new leaves, soft pastels of early blooms.
|
|
76
|
+
* Organized dark-to-light for depth layering (darker = far, brighter = near).
|
|
77
|
+
* Spring feels lighter and more pastel than the saturated summer greens.
|
|
78
|
+
*/
|
|
79
|
+
export const spring = {
|
|
80
|
+
// Fresh growth greens (yellow-green tint of new leaves)
|
|
81
|
+
sprout: '#65a30d', // Dark spring green - distant new growth
|
|
82
|
+
newLeaf: '#84cc16', // Classic spring lime - mid-ground
|
|
83
|
+
freshGreen: '#a3e635', // Bright yellow-green - foreground
|
|
84
|
+
budding: '#bef264', // Pale new leaf
|
|
85
|
+
tender: '#d9f99d', // Very pale spring green
|
|
86
|
+
// Sky and atmosphere
|
|
87
|
+
clearSky: '#7dd3fc', // Clear spring morning sky
|
|
88
|
+
softSky: '#bae6fd', // Pale spring sky
|
|
89
|
+
// Wildflower accents
|
|
90
|
+
buttercup: '#facc15', // Bright yellow wildflower
|
|
91
|
+
daffodil: '#fde047', // Pale yellow daffodil
|
|
92
|
+
crocus: '#a78bfa', // Early spring crocus purple
|
|
93
|
+
lilac: '#c4b5fd', // Soft lilac blooms
|
|
94
|
+
tulipPink: '#f9a8d4', // Soft tulip pink
|
|
95
|
+
tulipRed: '#fb7185', // Bright tulip red
|
|
96
|
+
// Hills and ground
|
|
97
|
+
hillDeep: '#166534', // Far spring hills - rich green
|
|
98
|
+
hillMid: '#22c55e', // Mid hills - meadow green
|
|
99
|
+
hillNear: '#86efac', // Near hills - fresh mint
|
|
100
|
+
hillFront: '#bbf7d0' // Front hills - pale spring green
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Autumn/Fall colors
|
|
104
|
+
* Replaces greens for deciduous trees during autumn season.
|
|
105
|
+
* Organized warm-to-bright for depth layering (dark rust = far, bright gold = near).
|
|
106
|
+
* Aspen and birch use gold/honey for their signature golden fall color.
|
|
107
|
+
*/
|
|
108
|
+
export const autumn = {
|
|
109
|
+
rust: '#9a3412', // Deep background foliage
|
|
110
|
+
ember: '#c2410c', // Oak-like autumn
|
|
111
|
+
pumpkin: '#ea580c', // Maple mid-tones
|
|
112
|
+
amber: '#d97706', // Classic fall amber
|
|
113
|
+
gold: '#eab308', // Aspen/birch golden yellow
|
|
114
|
+
honey: '#facc15', // Bright foreground leaves
|
|
115
|
+
straw: '#fde047' // Pale dying leaves
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Cherry blossom pinks (spring/summer)
|
|
119
|
+
* Used for cherry trees during spring bloom.
|
|
120
|
+
* In autumn, cherry trees switch to autumnReds to mimic real cherry leaf color change.
|
|
121
|
+
*/
|
|
122
|
+
export const pinks = {
|
|
123
|
+
deepPink: '#db2777', // Dense bloom centers
|
|
124
|
+
pink: '#ec4899', // Standard blossom
|
|
125
|
+
rose: '#f472b6', // Light petals
|
|
126
|
+
blush: '#f9a8d4', // Pale blossoms
|
|
127
|
+
palePink: '#fbcfe8' // Falling petals, distant blooms
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Autumn reds for cherry/maple foliage
|
|
131
|
+
* Cherry trees don't just lose pink - they turn red/crimson in fall.
|
|
132
|
+
* Also used for Japanese maple trees and other red autumn foliage.
|
|
133
|
+
*/
|
|
134
|
+
export const autumnReds = {
|
|
135
|
+
crimson: '#be123c', // Deep maple red
|
|
136
|
+
scarlet: '#e11d48', // Bright cherry leaves
|
|
137
|
+
rose: '#f43f5e', // Light autumn cherry
|
|
138
|
+
coral: '#fb7185' // Pale autumn accent
|
|
139
|
+
};
|
|
140
|
+
// =============================================================================
|
|
141
|
+
// WINTER PALETTE
|
|
142
|
+
// =============================================================================
|
|
143
|
+
/**
|
|
144
|
+
* Winter colors - frost, snow, and ice
|
|
145
|
+
* Used for winter mode: snow-dusted evergreens, frozen landscape.
|
|
146
|
+
* Deciduous trees go bare, showing only branches.
|
|
147
|
+
*/
|
|
148
|
+
export const winter = {
|
|
149
|
+
// Snow and ice
|
|
150
|
+
snow: '#f8fafc', // Pure fresh snow
|
|
151
|
+
frost: '#e2e8f0', // Frosted surfaces
|
|
152
|
+
ice: '#cbd5e1', // Ice blue-gray
|
|
153
|
+
glacier: '#94a3b8', // Deep ice shadows
|
|
154
|
+
// Frosted evergreen greens (muted, cool tones)
|
|
155
|
+
frostedPine: '#2d4a3e', // Snow-dusted dark pine
|
|
156
|
+
winterGreen: '#3d5a4a', // Muted forest green
|
|
157
|
+
coldSpruce: '#4a6355', // Cool spruce color
|
|
158
|
+
// Winter sky
|
|
159
|
+
winterSky: '#e0f2fe', // Pale winter sky
|
|
160
|
+
twilight: '#bfdbfe', // Evening winter sky
|
|
161
|
+
overcast: '#cbd5e1', // Gray overcast
|
|
162
|
+
// Bare branch colors
|
|
163
|
+
bareBranch: '#78716c', // Gray-brown bare wood
|
|
164
|
+
frostedBark: '#a8a29e', // Frost-touched bark
|
|
165
|
+
coldWood: '#57534e', // Dark winter wood
|
|
166
|
+
// Winter hills (snowy ground, back to front)
|
|
167
|
+
hillDeep: '#475569', // Far hills - cool slate
|
|
168
|
+
hillMid: '#7c8ca3', // Mid hills - gray-blue
|
|
169
|
+
hillNear: '#c7d2e0', // Near hills - pale snow
|
|
170
|
+
hillFront: '#f1f5f9' // Front hills - fresh snow
|
|
171
|
+
};
|
|
172
|
+
// =============================================================================
|
|
173
|
+
// COMPONENT-SPECIFIC ACCENTS
|
|
174
|
+
// =============================================================================
|
|
175
|
+
/**
|
|
176
|
+
* Accent colors for specific components
|
|
177
|
+
* Each category gets 1-2 unique colors that don't fit the main palettes.
|
|
178
|
+
* These add visual interest without breaking the natural cohesion.
|
|
179
|
+
*/
|
|
180
|
+
export const accents = {
|
|
181
|
+
/** Mushroom caps and details - fairy tale forest pops of color */
|
|
182
|
+
mushroom: {
|
|
183
|
+
redCap: '#dc2626', // Amanita-style red (toxic but iconic)
|
|
184
|
+
orangeCap: '#ea580c', // Chanterelle-inspired
|
|
185
|
+
brownCap: '#78350f', // Porcini/common mushroom
|
|
186
|
+
spots: '#fefefe', // White spots on caps
|
|
187
|
+
gill: '#fde8e8' // Pale pink gills underneath
|
|
188
|
+
},
|
|
189
|
+
/** Wildflower accents - purple/violet break from green monotony */
|
|
190
|
+
flower: {
|
|
191
|
+
purple: '#a855f7', // Lupine, thistle
|
|
192
|
+
violet: '#8b5cf6', // Wild violets
|
|
193
|
+
yellow: '#fbbf24', // Buttercup, dandelion
|
|
194
|
+
white: '#fefefe', // Daisies, trillium
|
|
195
|
+
lavender: '#c4b5fd' // Distant flower masses
|
|
196
|
+
},
|
|
197
|
+
/** Firefly bioluminescence - warm yellow-green glow */
|
|
198
|
+
firefly: {
|
|
199
|
+
glow: '#fef08a', // Primary glow (pale yellow)
|
|
200
|
+
warmGlow: '#fde047', // Brighter intensity
|
|
201
|
+
body: '#365314' // Dark green body
|
|
202
|
+
},
|
|
203
|
+
/** Berry colors - rich and saturated */
|
|
204
|
+
berry: {
|
|
205
|
+
ripe: '#7c2d12', // Blackberry/dark berry
|
|
206
|
+
elderberry: '#581c87', // Deep purple elderberry
|
|
207
|
+
red: '#b91c1c' // Holly berries, winterberry
|
|
208
|
+
},
|
|
209
|
+
/** Water and pond colors - cool blue spectrum */
|
|
210
|
+
water: {
|
|
211
|
+
surface: '#7dd3fc', // Reflecting sky
|
|
212
|
+
deep: '#0284c7', // Deeper water
|
|
213
|
+
shallow: '#bae6fd', // Shallow edges
|
|
214
|
+
lily: '#bbf7d0' // Lily pad green (ties to greens)
|
|
215
|
+
},
|
|
216
|
+
/** Sky elements - time of day variations */
|
|
217
|
+
sky: {
|
|
218
|
+
dayLight: '#e0f2fe', // Pale daytime sky
|
|
219
|
+
dayMid: '#7dd3fc', // Blue sky
|
|
220
|
+
sunset: '#fed7aa', // Golden hour
|
|
221
|
+
night: '#1e293b', // Night sky
|
|
222
|
+
star: '#fefce8' // Star/twinkle color
|
|
223
|
+
},
|
|
224
|
+
/** Bird colors - winter, spring, and year-round species */
|
|
225
|
+
bird: {
|
|
226
|
+
// Cardinal (winter)
|
|
227
|
+
cardinalRed: '#dc2626', // Northern Cardinal vivid red
|
|
228
|
+
cardinalMask: '#1a1a1a', // Cardinal black mask
|
|
229
|
+
cardinalBeak: '#f97316', // Orange-red cone beak
|
|
230
|
+
// Chickadee (year-round)
|
|
231
|
+
chickadeeCap: '#1a1a1a', // Black-capped Chickadee cap/bib
|
|
232
|
+
chickadeeCheek: '#fafafa', // White cheek patch
|
|
233
|
+
chickadeeBody: '#6b7280', // Gray back feathers
|
|
234
|
+
chickadeeBelly: '#fef3c7', // Buff/cream underside
|
|
235
|
+
// Robin (spring herald!)
|
|
236
|
+
robinBody: '#4a4a4a', // American Robin dark gray-brown
|
|
237
|
+
robinWing: '#3a3a3a', // Slightly darker wing
|
|
238
|
+
robinWingDark: '#2a2a2a', // Wing shadow detail
|
|
239
|
+
robinBreast: '#c2410c', // American Robin orange-red breast
|
|
240
|
+
robinBreastLight: '#dc5015', // Breast highlight
|
|
241
|
+
robinBeak: '#f59e0b', // Yellow-orange beak
|
|
242
|
+
// Bluebird (spring/summer)
|
|
243
|
+
bluebirdBody: '#3b82f6', // Eastern Bluebird vivid blue
|
|
244
|
+
bluebirdWing: '#2563eb', // Slightly darker blue wings
|
|
245
|
+
bluebirdBreast: '#ea580c' // Rusty orange breast
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
/**
|
|
249
|
+
* Get appropriate foliage colors based on season
|
|
250
|
+
* Used by deciduous trees to switch from greens to seasonal palette.
|
|
251
|
+
* Spring uses bright yellow-greens of new growth.
|
|
252
|
+
* Autumn uses warm oranges and golds.
|
|
253
|
+
* In winter, returns frosted evergreen colors (for pines that keep needles).
|
|
254
|
+
* @example getSeasonalGreens('spring') // returns spring palette greens
|
|
255
|
+
* @example getSeasonalGreens('autumn') // returns autumn palette
|
|
256
|
+
*/
|
|
257
|
+
export function getSeasonalGreens(season = 'summer') {
|
|
258
|
+
if (season === 'spring') {
|
|
259
|
+
// Fresh yellow-green spring foliage - mapped to match greens structure
|
|
260
|
+
return {
|
|
261
|
+
darkForest: spring.sprout,
|
|
262
|
+
deepGreen: spring.sprout,
|
|
263
|
+
grove: spring.newLeaf,
|
|
264
|
+
meadow: spring.freshGreen,
|
|
265
|
+
spring: spring.budding,
|
|
266
|
+
mint: spring.budding,
|
|
267
|
+
pale: spring.tender
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
if (season === 'autumn') {
|
|
271
|
+
return autumn;
|
|
272
|
+
}
|
|
273
|
+
if (season === 'winter') {
|
|
274
|
+
// Frosted evergreen colors for pines/conifers
|
|
275
|
+
return {
|
|
276
|
+
darkForest: winter.frostedPine,
|
|
277
|
+
deepGreen: winter.frostedPine,
|
|
278
|
+
grove: winter.winterGreen,
|
|
279
|
+
meadow: winter.winterGreen,
|
|
280
|
+
spring: winter.coldSpruce,
|
|
281
|
+
mint: winter.coldSpruce,
|
|
282
|
+
pale: winter.coldSpruce
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
return greens;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Spring cherry blossom colors - extra vibrant for peak bloom
|
|
289
|
+
* Spring is when cherry blossoms are at their most beautiful.
|
|
290
|
+
* Slightly brighter and more saturated than the standard pinks.
|
|
291
|
+
*/
|
|
292
|
+
export const springBlossoms = {
|
|
293
|
+
deepPink: '#ec4899', // Vibrant deep pink
|
|
294
|
+
pink: '#f472b6', // Bright cherry blossom
|
|
295
|
+
rose: '#f9a8d4', // Soft rose petals
|
|
296
|
+
blush: '#fbcfe8', // Pale blush
|
|
297
|
+
palePink: '#fce7f3' // Very pale falling petals
|
|
298
|
+
};
|
|
299
|
+
/**
|
|
300
|
+
* Get cherry tree colors based on season
|
|
301
|
+
* Spring: Extra vibrant pink blossoms (peak bloom!)
|
|
302
|
+
* Summer: Standard pink blossoms
|
|
303
|
+
* Autumn: Turn red/crimson like real cherry leaves
|
|
304
|
+
* Winter: Bare (no blossoms)
|
|
305
|
+
* @example getCherryColors('spring') // returns springBlossoms (vibrant)
|
|
306
|
+
* @example getCherryColors('autumn') // returns autumnReds palette
|
|
307
|
+
*/
|
|
308
|
+
export function getCherryColors(season = 'spring') {
|
|
309
|
+
if (season === 'spring') {
|
|
310
|
+
// Peak bloom - extra vibrant pinks!
|
|
311
|
+
return springBlossoms;
|
|
312
|
+
}
|
|
313
|
+
if (season === 'autumn') {
|
|
314
|
+
return autumnReds;
|
|
315
|
+
}
|
|
316
|
+
if (season === 'winter') {
|
|
317
|
+
// Return null to indicate bare tree (no foliage to render)
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
return pinks;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Check if a tree should be bare (no foliage) based on season
|
|
324
|
+
* Deciduous trees lose leaves in winter.
|
|
325
|
+
*/
|
|
326
|
+
export function isTreeBare(treeType, season) {
|
|
327
|
+
if (season !== 'winter')
|
|
328
|
+
return false;
|
|
329
|
+
// Evergreen types keep their needles
|
|
330
|
+
const evergreens = ['pine', 'spruce', 'fir', 'cedar'];
|
|
331
|
+
return !evergreens.includes(treeType.toLowerCase());
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Pick a random color from a palette object
|
|
335
|
+
* Useful for adding natural variation to forests.
|
|
336
|
+
* @example pickRandom(greens) // returns random green like '#16a34a'
|
|
337
|
+
*/
|
|
338
|
+
export function pickRandom(palette) {
|
|
339
|
+
const values = Object.values(palette);
|
|
340
|
+
return values[Math.floor(Math.random() * values.length)];
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Pick a random color from a subset of palette keys
|
|
344
|
+
* More controlled randomization when you want specific options.
|
|
345
|
+
* @example pickFrom(greens, ['grove', 'meadow']) // only picks from those two
|
|
346
|
+
*/
|
|
347
|
+
export function pickFrom(palette, keys) {
|
|
348
|
+
const key = keys[Math.floor(Math.random() * keys.length)];
|
|
349
|
+
return palette[key];
|
|
350
|
+
}
|
|
351
|
+
// =============================================================================
|
|
352
|
+
// MIDNIGHT BLOOM PALETTE
|
|
353
|
+
// =============================================================================
|
|
354
|
+
/**
|
|
355
|
+
* Midnight Bloom - the far vision
|
|
356
|
+
* A late-night tea café palette: deep plums, warm amber, soft golds.
|
|
357
|
+
* Used for the Midnight Bloom section of the roadmap and future theming.
|
|
358
|
+
*/
|
|
359
|
+
export const midnightBloom = {
|
|
360
|
+
deepPlum: '#581c87', // Night sky depth
|
|
361
|
+
purple: '#7c3aed', // Soft purple glow
|
|
362
|
+
violet: '#8b5cf6', // Lighter accent
|
|
363
|
+
amber: '#f59e0b', // Lantern warmth
|
|
364
|
+
warmCream: '#fef3c7', // Tea steam, page glow
|
|
365
|
+
softGold: '#fcd34d' // Fairy lights
|
|
366
|
+
};
|
|
367
|
+
// =============================================================================
|
|
368
|
+
// FULL PALETTE EXPORT
|
|
369
|
+
// =============================================================================
|
|
370
|
+
export const naturePalette = {
|
|
371
|
+
greens,
|
|
372
|
+
bark,
|
|
373
|
+
earth,
|
|
374
|
+
natural,
|
|
375
|
+
spring,
|
|
376
|
+
springBlossoms,
|
|
377
|
+
autumn,
|
|
378
|
+
pinks,
|
|
379
|
+
autumnReds,
|
|
380
|
+
winter,
|
|
381
|
+
accents,
|
|
382
|
+
midnightBloom
|
|
383
|
+
};
|
|
384
|
+
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>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
class?: string;
|
|
3
|
+
color?: string;
|
|
4
|
+
animate?: boolean;
|
|
5
|
+
speed?: 'slow' | 'normal' | 'fast';
|
|
6
|
+
}
|
|
7
|
+
declare const CloudWispy: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type CloudWispy = ReturnType<typeof CloudWispy>;
|
|
9
|
+
export default CloudWispy;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Grove — A place to Be
|
|
3
|
+
Copyright (c) 2025 Autumn Brown
|
|
4
|
+
Licensed under AGPL-3.0
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
interface Props {
|
|
8
|
+
class?: string;
|
|
9
|
+
color?: string;
|
|
10
|
+
phase?: 'full' | 'waning' | 'crescent' | 'new';
|
|
11
|
+
animate?: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
class: className = 'w-10 h-10',
|
|
16
|
+
color = '#fef9c3',
|
|
17
|
+
phase = 'crescent',
|
|
18
|
+
animate = true
|
|
19
|
+
}: Props = $props();
|
|
20
|
+
|
|
21
|
+
const glowColor = '#fef9c3';
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<!-- Moon with phase options -->
|
|
25
|
+
<svg class="{className} {animate ? 'glow' : ''}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50">
|
|
26
|
+
<!-- Outer glow -->
|
|
27
|
+
<circle fill={glowColor} cx="25" cy="25" r="24" opacity="0.15" />
|
|
28
|
+
|
|
29
|
+
{#if phase === 'full'}
|
|
30
|
+
<!-- Full moon -->
|
|
31
|
+
<circle fill={color} cx="25" cy="25" r="20" />
|
|
32
|
+
<!-- Craters -->
|
|
33
|
+
<circle fill="#e5e5dc" cx="18" cy="20" r="4" opacity="0.3" />
|
|
34
|
+
<circle fill="#e5e5dc" cx="30" cy="28" r="5" opacity="0.25" />
|
|
35
|
+
<circle fill="#e5e5dc" cx="22" cy="32" r="3" opacity="0.2" />
|
|
36
|
+
{:else if phase === 'waning'}
|
|
37
|
+
<!-- Waning gibbous -->
|
|
38
|
+
<circle fill={color} cx="25" cy="25" r="20" />
|
|
39
|
+
<circle fill="#1e293b" cx="35" cy="25" r="15" />
|
|
40
|
+
{:else if phase === 'crescent'}
|
|
41
|
+
<!-- Crescent moon -->
|
|
42
|
+
<circle fill={color} cx="25" cy="25" r="20" />
|
|
43
|
+
<circle fill="#1e293b" cx="32" cy="25" r="17" />
|
|
44
|
+
{:else}
|
|
45
|
+
<!-- New moon (barely visible) -->
|
|
46
|
+
<circle fill={color} cx="25" cy="25" r="20" opacity="0.1" />
|
|
47
|
+
<circle fill={color} cx="22" cy="25" r="18" opacity="0.05" />
|
|
48
|
+
{/if}
|
|
49
|
+
</svg>
|
|
50
|
+
|
|
51
|
+
<style>
|
|
52
|
+
@keyframes glow {
|
|
53
|
+
0%, 100% { filter: brightness(1) drop-shadow(0 0 5px rgba(254, 249, 195, 0.3)); }
|
|
54
|
+
50% { filter: brightness(1.1) drop-shadow(0 0 10px rgba(254, 249, 195, 0.5)); }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.glow {
|
|
58
|
+
animation: glow 4s ease-in-out infinite;
|
|
59
|
+
}
|
|
60
|
+
</style>
|