@autumnsgrove/groveengine 0.9.3 → 0.9.4

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 (77) hide show
  1. package/dist/components/admin/GutterManager.svelte +314 -35
  2. package/dist/components/admin/MarkdownEditor.svelte +105 -40
  3. package/dist/components/admin/MarkdownEditor.svelte.d.ts +2 -0
  4. package/dist/components/custom/ContentWithGutter.svelte +12 -2
  5. package/dist/components/custom/GutterItem.svelte +122 -47
  6. package/dist/components/custom/TableOfContents.svelte +36 -3
  7. package/dist/components/quota/UpgradePrompt.svelte +12 -16
  8. package/dist/config/index.d.ts +4 -3
  9. package/dist/config/index.js +4 -3
  10. package/dist/config/tiers.d.ts +134 -0
  11. package/dist/config/tiers.js +402 -0
  12. package/dist/groveauth/types.d.ts +4 -1
  13. package/dist/groveauth/types.js +9 -13
  14. package/dist/payments/shop.d.ts +3 -3
  15. package/dist/payments/shop.js +271 -95
  16. package/dist/server/billing.d.ts +29 -0
  17. package/dist/server/billing.js +80 -0
  18. package/dist/server/env-validation.d.ts +68 -0
  19. package/dist/server/env-validation.js +95 -0
  20. package/dist/server/rate-limits/config.d.ts +24 -96
  21. package/dist/server/rate-limits/config.js +35 -59
  22. package/dist/server/rate-limits/tenant.d.ts +1 -69
  23. package/dist/server/services/database.d.ts +1 -1
  24. package/dist/server/services/database.js +69 -59
  25. package/dist/server/services/storage.d.ts +2 -1
  26. package/dist/server/services/storage.js +115 -91
  27. package/dist/server/tier-features.d.ts +56 -0
  28. package/dist/server/tier-features.js +79 -0
  29. package/dist/ui/components/chrome/Footer.svelte +16 -2
  30. package/dist/ui/components/chrome/Header.svelte +15 -19
  31. package/dist/ui/components/chrome/Header.svelte.d.ts +2 -2
  32. package/dist/ui/components/chrome/ThemeToggle.svelte +86 -27
  33. package/dist/ui/components/icons/index.d.ts +3 -3
  34. package/dist/ui/components/icons/index.js +6 -6
  35. package/dist/ui/components/icons/lucide.d.ts +15 -2
  36. package/dist/ui/components/icons/lucide.js +15 -3
  37. package/dist/ui/components/nature/GroveDivider.svelte +24 -28
  38. package/dist/ui/components/nature/GroveDivider.svelte.d.ts +5 -7
  39. package/dist/ui/components/nature/{Logo.svelte.d.ts → LogoArchive.svelte.d.ts} +3 -3
  40. package/dist/ui/components/nature/creatures/Bee.svelte +2 -2
  41. package/dist/ui/components/nature/creatures/Butterfly.svelte +3 -3
  42. package/dist/ui/components/nature/creatures/Owl.svelte +2 -2
  43. package/dist/ui/components/nature/ground/FlowerWild.svelte +3 -3
  44. package/dist/ui/components/nature/index.d.ts +12 -11
  45. package/dist/ui/components/nature/index.js +14 -12
  46. package/dist/ui/components/nature/palette.d.ts +106 -10
  47. package/dist/ui/components/nature/palette.js +211 -147
  48. package/dist/ui/components/nature/sky/Sun.svelte +2 -2
  49. package/dist/ui/components/nature/structural/LatticeWithVine.svelte +2 -2
  50. package/dist/ui/components/nature/water/LilyPad.svelte +2 -2
  51. package/dist/ui/components/ui/GlassLogo.svelte +354 -300
  52. package/dist/ui/components/ui/GlassLogo.svelte.d.ts +76 -13
  53. package/dist/ui/components/ui/GlassLogoArchive.svelte +415 -0
  54. package/dist/ui/components/ui/GlassLogoArchive.svelte.d.ts +23 -0
  55. package/dist/ui/components/ui/Logo.svelte +269 -169
  56. package/dist/ui/components/ui/Logo.svelte.d.ts +93 -14
  57. package/dist/ui/components/ui/LogoArchive.svelte +220 -0
  58. package/dist/ui/components/ui/LogoArchive.svelte.d.ts +20 -0
  59. package/dist/ui/components/ui/LogoLoader.svelte +1 -1
  60. package/dist/ui/components/ui/index.d.ts +30 -28
  61. package/dist/ui/components/ui/index.js +31 -29
  62. package/dist/ui/stores/season.d.ts +12 -2
  63. package/dist/ui/stores/season.js +101 -18
  64. package/dist/ui/types/index.d.ts +6 -0
  65. package/dist/ui/types/index.js +7 -0
  66. package/dist/ui/types/season.d.ts +36 -0
  67. package/dist/ui/types/season.js +86 -0
  68. package/dist/ui/utils/color.d.ts +69 -0
  69. package/dist/ui/utils/color.js +155 -0
  70. package/dist/ui/utils/index.d.ts +2 -1
  71. package/dist/ui/utils/index.js +5 -2
  72. package/package.json +22 -20
  73. package/static/favicon.png +0 -0
  74. package/static/favicon.svg +6 -0
  75. package/static/fonts/alagard.ttf +0 -0
  76. package/LICENSE +0 -378
  77. /package/dist/ui/components/nature/{Logo.svelte → LogoArchive.svelte} +0 -0
@@ -1,11 +1,13 @@
1
1
  <script lang="ts">
2
2
  import { page } from '$app/stores';
3
- import { Logo } from '../nature';
3
+ import { Logo } from '../ui';
4
4
  import ThemeToggle from './ThemeToggle.svelte';
5
5
  import MobileMenu from './MobileMenu.svelte';
6
6
  import { seasonStore } from '../../stores/season';
7
+ import { themeStore } from '../../stores/theme';
7
8
  import { Menu } from 'lucide-svelte';
8
- import type { NavItem, MaxWidth, Season } from './types';
9
+ import type { NavItem, MaxWidth } from './types';
10
+ import type { Season } from '../../types/season';
9
11
  import { isActivePath } from './types';
10
12
  import { DEFAULT_NAV_ITEMS } from './defaults';
11
13
 
@@ -17,15 +19,13 @@
17
19
  maxWidth?: MaxWidth;
18
20
  brandTitle?: string;
19
21
  season?: Season;
20
- onSeasonChange?: () => void;
21
22
  }
22
23
 
23
24
  let {
24
25
  navItems,
25
26
  maxWidth = 'default',
26
27
  brandTitle,
27
- season,
28
- onSeasonChange
28
+ season
29
29
  }: Props = $props();
30
30
 
31
31
  const maxWidthClass = {
@@ -37,13 +37,9 @@
37
37
  // Mobile menu state
38
38
  let mobileMenuOpen = $state(false);
39
39
 
40
- // Toggle season on logo click
40
+ // Toggle dark/light mode on logo click
41
41
  function handleLogoClick() {
42
- if (onSeasonChange) {
43
- onSeasonChange();
44
- } else {
45
- seasonStore.cycle();
46
- }
42
+ themeStore.toggle();
47
43
  }
48
44
 
49
45
  const items = navItems || DEFAULT_NAV_ITEMS;
@@ -53,15 +49,15 @@
53
49
  <div class="{maxWidthClass[maxWidth]} mx-auto flex items-center justify-between">
54
50
  <!-- Logo area -->
55
51
  <div class="flex items-center gap-2">
56
- <!-- Logo icon - clickable to toggle season -->
57
- <button
52
+ <!-- Logo icon - clickable to toggle dark/light mode -->
53
+ <Logo
54
+ class="w-6 h-6"
55
+ season={season || $seasonStore}
56
+ interactive
58
57
  onclick={handleLogoClick}
59
- class="flex-shrink-0 transition-transform hover:scale-110 active:scale-95"
60
- aria-label="Toggle season theme"
61
- title="Click to change season"
62
- >
63
- <Logo class="w-6 h-6" season={season || $seasonStore} />
64
- </button>
58
+ title="Toggle dark/light mode"
59
+ ariaLabel="Toggle dark or light theme"
60
+ />
65
61
 
66
62
  <!-- Brand title or "Grove" text - home link, hidden on mobile -->
67
63
  {#if brandTitle}
@@ -1,10 +1,10 @@
1
- import type { NavItem, MaxWidth, Season } from './types';
1
+ import type { NavItem, MaxWidth } from './types';
2
+ import type { Season } from '../../types/season';
2
3
  interface Props {
3
4
  navItems?: NavItem[];
4
5
  maxWidth?: MaxWidth;
5
6
  brandTitle?: string;
6
7
  season?: Season;
7
- onSeasonChange?: () => void;
8
8
  }
9
9
  declare const Header: import("svelte").Component<Props, {}, "">;
10
10
  type Header = ReturnType<typeof Header>;
@@ -1,34 +1,93 @@
1
1
  <script lang="ts">
2
- import { themeStore } from '../../stores/theme';
2
+ /**
3
+ * Season Indicator — Footer Easter Egg
4
+ *
5
+ * Displays the current season and acts as the gateway to Midnight mode.
6
+ * - Shows current season icon + label
7
+ * - Tap to activate Midnight (the queer fifth season)
8
+ * - In midnight mode, tap again to return to previous season
9
+ *
10
+ * The header logo cycles through 4 regular seasons.
11
+ * This indicator is the only way to enter midnight mode.
12
+ */
3
13
 
4
- // Extract the resolvedTheme store and toggle function
5
- const { resolvedTheme, toggle } = themeStore;
6
- let isDark = $derived($resolvedTheme === 'dark');
14
+ import { seasonStore } from "../../stores/season";
15
+ import { SEASON_LABELS, type Season } from "../../types/season";
16
+ import { seasonIcons } from "../icons/lucide";
17
+
18
+ // Current season from store
19
+ let currentSeason: Season = $derived($seasonStore);
20
+ let isMidnight = $derived(currentSeason === "midnight");
21
+
22
+ // Get display info for current season
23
+ let label = $derived(SEASON_LABELS[currentSeason]);
24
+ let IconComponent = $derived(seasonIcons[currentSeason]);
25
+
26
+ // Handle click - toggle midnight mode (easter egg!)
27
+ function handleClick() {
28
+ seasonStore.toggleMidnight();
29
+ }
7
30
  </script>
8
31
 
9
32
  <button
10
- onclick={() => toggle()}
11
- class="p-2 rounded-lg text-foreground-subtle hover:text-accent-muted hover:bg-surface transition-colors"
12
- aria-label={isDark ? 'Switch to light mode' : 'Switch to dark mode'}
13
- title={isDark ? 'Switch to light mode' : 'Switch to dark mode'}
33
+ onclick={handleClick}
34
+ class="relative group flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg transition-all duration-300
35
+ {isMidnight
36
+ ? 'text-purple-300 bg-purple-950/60 hover:bg-purple-900/60 ring-1 ring-purple-500/40 shadow-lg shadow-purple-500/20'
37
+ : 'text-foreground-subtle hover:text-foreground hover:bg-surface/80'}"
38
+ aria-label={isMidnight
39
+ ? "Exit midnight mode"
40
+ : `Current season: ${label}. Tap for midnight mode.`}
41
+ title={isMidnight ? "Return to daylight" : `${label} — tap for something special`}
14
42
  >
15
- {#if isDark}
16
- <!-- Sun icon - shown in dark mode -->
17
- <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
18
- <circle cx="12" cy="12" r="5" />
19
- <line x1="12" y1="1" x2="12" y2="3" />
20
- <line x1="12" y1="21" x2="12" y2="23" />
21
- <line x1="4.22" y1="4.22" x2="5.64" y2="5.64" />
22
- <line x1="18.36" y1="18.36" x2="19.78" y2="19.78" />
23
- <line x1="1" y1="12" x2="3" y2="12" />
24
- <line x1="21" y1="12" x2="23" y2="12" />
25
- <line x1="4.22" y1="19.78" x2="5.64" y2="18.36" />
26
- <line x1="18.36" y1="5.64" x2="19.78" y2="4.22" />
27
- </svg>
28
- {:else}
29
- <!-- Moon icon - shown in light mode -->
30
- <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
31
- <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" />
32
- </svg>
43
+ <!-- Season icon with bloom animation on midnight -->
44
+ <span
45
+ class="transition-transform duration-500 ease-out
46
+ {isMidnight ? 'scale-110' : 'group-hover:scale-110'}"
47
+ >
48
+ <svelte:component
49
+ this={IconComponent}
50
+ class="w-4 h-4 {isMidnight ? 'animate-pulse' : ''}"
51
+ strokeWidth={2}
52
+ />
53
+ </span>
54
+
55
+ <!-- Season label - compact display -->
56
+ <span
57
+ class="text-xs font-medium tracking-wide transition-colors duration-300
58
+ {isMidnight
59
+ ? 'text-purple-200'
60
+ : 'text-foreground-muted group-hover:text-foreground-subtle'}"
61
+ >
62
+ {label}
63
+ </span>
64
+
65
+ <!-- Subtle glow ring when in midnight (easter egg active indicator) -->
66
+ {#if isMidnight}
67
+ <span
68
+ class="absolute inset-0 rounded-lg ring-2 ring-purple-400/20 animate-pulse pointer-events-none"
69
+ ></span>
33
70
  {/if}
34
- </button>
71
+ </button>
72
+
73
+ <style>
74
+ /* Bloom animation for entering midnight */
75
+ @keyframes bloom {
76
+ 0% {
77
+ transform: scale(1);
78
+ filter: brightness(1);
79
+ }
80
+ 50% {
81
+ transform: scale(1.15);
82
+ filter: brightness(1.2);
83
+ }
84
+ 100% {
85
+ transform: scale(1.1);
86
+ filter: brightness(1);
87
+ }
88
+ }
89
+
90
+ button:active span:first-child {
91
+ animation: bloom 0.3s ease-out;
92
+ }
93
+ </style>
@@ -1,4 +1,4 @@
1
- export { default as Icons } from './Icons.svelte';
2
- export { default as IconLegend } from './IconLegend.svelte';
3
- export { navIcons, stateIcons, pricingIcons, featureIcons, growthIcons, phaseIcons, actionIcons, metricsIcons, allIcons, type IconKey, getIcon, getIconFromAll, Check, CheckCircle, X, ArrowRight, ArrowLeft, MapPin, Sprout, Trees, TreeDeciduous, Crown, Flower2, Leaf, Heart, Home, Menu, Settings, ExternalLink, ChevronDown, LogIn, Github, Mail, HardDrive, Palette, Shield, Download, Rss, Eye, MessageCircle, Loader2, AlertTriangle, HelpCircle, Lock, Sparkles, Clock, TrendingUp, Users, Activity, Plus, Copy, Trash2, RefreshCw, Fingerprint, Key, Link2, authIcons, } from './lucide';
1
+ export { default as Icons } from "./Icons.svelte";
2
+ export { default as IconLegend } from "./IconLegend.svelte";
3
+ export { navIcons, stateIcons, pricingIcons, featureIcons, growthIcons, phaseIcons, seasonIcons, actionIcons, metricsIcons, allIcons, type IconKey, getIcon, getIconFromAll, Check, CheckCircle, X, ArrowRight, ArrowLeft, MapPin, Sprout, Trees, TreeDeciduous, Crown, Flower2, Leaf, Heart, Home, Menu, Settings, ExternalLink, ChevronDown, LogIn, Github, Mail, HardDrive, Palette, Shield, Download, Rss, Eye, MessageCircle, Loader2, AlertTriangle, HelpCircle, Lock, Sparkles, Moon, Sun, Snowflake, Clock, TrendingUp, Users, Activity, Plus, Copy, Trash2, RefreshCw, Fingerprint, Key, Link2, authIcons, } from "./lucide";
4
4
  export declare const ICONS_VERSION = "0.3.0";
@@ -7,20 +7,20 @@
7
7
  // import { Icons, IconLegend } from '@autumnsgrove/groveengine/ui/icons';
8
8
  // import { stateIcons, pricingIcons, Check } from '@autumnsgrove/groveengine/ui/icons';
9
9
  // Custom SVG components
10
- export { default as Icons } from './Icons.svelte';
11
- export { default as IconLegend } from './IconLegend.svelte';
10
+ export { default as Icons } from "./Icons.svelte";
11
+ export { default as IconLegend } from "./IconLegend.svelte";
12
12
  // Lucide icon registries and utilities
13
13
  export {
14
14
  // Icon maps (semantic groupings)
15
- navIcons, stateIcons, pricingIcons, featureIcons, growthIcons, phaseIcons, actionIcons, metricsIcons, allIcons,
15
+ navIcons, stateIcons, pricingIcons, featureIcons, growthIcons, phaseIcons, seasonIcons, actionIcons, metricsIcons, allIcons,
16
16
  // Utilities
17
17
  getIcon, getIconFromAll,
18
18
  // Direct icon exports (commonly used)
19
- Check, CheckCircle, X, ArrowRight, ArrowLeft, MapPin, Sprout, Trees, TreeDeciduous, Crown, Flower2, Leaf, Heart, Home, Menu, Settings, ExternalLink, ChevronDown, LogIn, Github, Mail, HardDrive, Palette, Shield, Download, Rss, Eye, MessageCircle, Loader2, AlertTriangle, HelpCircle, Lock, Sparkles, Clock, TrendingUp, Users, Activity,
19
+ Check, CheckCircle, X, ArrowRight, ArrowLeft, MapPin, Sprout, Trees, TreeDeciduous, Crown, Flower2, Leaf, Heart, Home, Menu, Settings, ExternalLink, ChevronDown, LogIn, Github, Mail, HardDrive, Palette, Shield, Download, Rss, Eye, MessageCircle, Loader2, AlertTriangle, HelpCircle, Lock, Sparkles, Moon, Sun, Snowflake, Clock, TrendingUp, Users, Activity,
20
20
  // Actions
21
21
  Plus, Copy, Trash2, RefreshCw,
22
22
  // Authentication
23
23
  Fingerprint, Key, Link2,
24
24
  // Also export the authIcons map
25
- authIcons, } from './lucide';
26
- export const ICONS_VERSION = '0.3.0';
25
+ authIcons, } from "./lucide";
26
+ export const ICONS_VERSION = "0.3.0";
@@ -12,7 +12,7 @@
12
12
  * <svelte:component this={stateIcons.check} class="w-5 h-5" />
13
13
  * ```
14
14
  */
15
- import { Home, Info, Telescope, MapPin, HandCoins, BookOpen, Trees, PenLine, ArrowRight, ArrowLeft, ChevronRight, ChevronLeft, ChevronDown, ExternalLink, LogIn, Mail, HardDrive, Palette, ShieldCheck, Shield, Cloud, SearchCode, Archive, Upload, MessagesSquare, MessageCircle, FileText, Tag, Rss, Eye, Github, Layers, Sprout, Heart, Leaf, Flower2, TreeDeciduous, Crown, Check, CheckCircle, X, Loader2, AlertTriangle, HelpCircle, Circle, Lock, Gem, Sparkles, Star, Moon, Sun, Compass, Megaphone, Lightbulb, Download, Settings, Menu, Plus, Copy, Trash2, RefreshCw, Clock, TrendingUp, TrendingDown, Activity, Users, ShieldUser, BarChart3, Globe, CalendarDays, LifeBuoy, Fingerprint, Key, Link2 } from "lucide-svelte";
15
+ import { Home, Info, Telescope, MapPin, HandCoins, BookOpen, Trees, PenLine, ArrowRight, ArrowLeft, ChevronRight, ChevronLeft, ChevronDown, ExternalLink, LogIn, Mail, HardDrive, Palette, ShieldCheck, Shield, Cloud, SearchCode, Archive, Upload, MessagesSquare, MessageCircle, FileText, Tag, Rss, Eye, Github, Layers, Sprout, Heart, Leaf, Flower2, TreeDeciduous, Crown, Check, CheckCircle, X, Loader2, AlertTriangle, HelpCircle, Circle, Lock, Gem, Sparkles, Star, Moon, Sun, Snowflake, Compass, Megaphone, Lightbulb, Download, Settings, Menu, Plus, Copy, Trash2, RefreshCw, Clock, TrendingUp, TrendingDown, Activity, Users, ShieldUser, BarChart3, Globe, CalendarDays, LifeBuoy, Fingerprint, Key, Link2 } from "lucide-svelte";
16
16
  /** Icons for main navigation items */
17
17
  export declare const navIcons: {
18
18
  readonly home: typeof Home;
@@ -102,6 +102,14 @@ export declare const phaseIcons: {
102
102
  readonly sun: typeof Sun;
103
103
  readonly sprout: typeof Sprout;
104
104
  };
105
+ /** Icons for Grove's seasonal theming system */
106
+ export declare const seasonIcons: {
107
+ readonly spring: typeof Flower2;
108
+ readonly summer: typeof Sun;
109
+ readonly autumn: typeof Leaf;
110
+ readonly winter: typeof Snowflake;
111
+ readonly midnight: typeof Moon;
112
+ };
105
113
  /** Icons for user actions and processes */
106
114
  export declare const actionIcons: {
107
115
  readonly compass: typeof Compass;
@@ -167,6 +175,11 @@ export declare const allIcons: {
167
175
  readonly copy: typeof Copy;
168
176
  readonly trash: typeof Trash2;
169
177
  readonly refresh: typeof RefreshCw;
178
+ readonly spring: typeof Flower2;
179
+ readonly summer: typeof Sun;
180
+ readonly autumn: typeof Leaf;
181
+ readonly winter: typeof Snowflake;
182
+ readonly midnight: typeof Moon;
170
183
  readonly gem: typeof Gem;
171
184
  readonly sparkles: typeof Sparkles;
172
185
  readonly star: typeof Star;
@@ -232,4 +245,4 @@ export declare function getIcon<T extends Record<string, any>>(map: T, key: keyo
232
245
  * ```
233
246
  */
234
247
  export declare function getIconFromAll(key: string): any;
235
- export { Check, CheckCircle, X, ArrowRight, ArrowLeft, MapPin, Sprout, Trees, TreeDeciduous, Crown, Flower2, Leaf, Heart, Home, Menu, Settings, ExternalLink, ChevronDown, LogIn, Github, Mail, HardDrive, Palette, Shield, Download, Rss, Eye, MessageCircle, Layers, Loader2, AlertTriangle, HelpCircle, Lock, Sparkles, Clock, TrendingUp, Users, Activity, Plus, Copy, Trash2, RefreshCw, Fingerprint, Key, Link2, };
248
+ export { Check, CheckCircle, X, ArrowRight, ArrowLeft, MapPin, Sprout, Trees, TreeDeciduous, Crown, Flower2, Leaf, Heart, Home, Menu, Settings, ExternalLink, ChevronDown, LogIn, Github, Mail, HardDrive, Palette, Shield, Download, Rss, Eye, MessageCircle, Layers, Loader2, AlertTriangle, HelpCircle, Lock, Sparkles, Moon, Sun, Snowflake, Clock, TrendingUp, Users, Activity, Plus, Copy, Trash2, RefreshCw, Fingerprint, Key, Link2, };
@@ -22,7 +22,7 @@ Sprout, Heart, Leaf, Flower2, TreeDeciduous, Crown,
22
22
  // States & Feedback
23
23
  Check, CheckCircle, X, Loader2, AlertTriangle, HelpCircle, Info as InfoIcon, Circle, Lock,
24
24
  // Phases & Special
25
- Gem, Sparkles, Star, Moon, Sun,
25
+ Gem, Sparkles, Star, Moon, Sun, Snowflake,
26
26
  // Actions
27
27
  Compass, Megaphone, Lightbulb, Download, Settings, Menu, Plus, Copy, Trash2, RefreshCw,
28
28
  // Metrics
@@ -142,6 +142,17 @@ export const phaseIcons = {
142
142
  sprout: Sprout,
143
143
  };
144
144
  // ============================================================================
145
+ // SEASON ICONS
146
+ // ============================================================================
147
+ /** Icons for Grove's seasonal theming system */
148
+ export const seasonIcons = {
149
+ spring: Flower2,
150
+ summer: Sun,
151
+ autumn: Leaf,
152
+ winter: Snowflake,
153
+ midnight: Moon,
154
+ };
155
+ // ============================================================================
145
156
  // ACTION ICONS
146
157
  // ============================================================================
147
158
  /** Icons for user actions and processes */
@@ -197,6 +208,7 @@ export const allIcons = {
197
208
  ...featureIcons,
198
209
  ...growthIcons,
199
210
  ...phaseIcons,
211
+ ...seasonIcons,
200
212
  ...actionIcons,
201
213
  ...authIcons,
202
214
  ...metricsIcons,
@@ -239,8 +251,8 @@ Home, Menu, Settings, ExternalLink, ChevronDown, LogIn, Github,
239
251
  Mail, HardDrive, Palette, Shield, Download, Rss, Eye, MessageCircle, Layers,
240
252
  // States
241
253
  Loader2, AlertTriangle, HelpCircle, Lock,
242
- // Phase/Special
243
- Sparkles,
254
+ // Phase/Special & Seasons
255
+ Sparkles, Moon, Sun, Snowflake,
244
256
  // Metrics
245
257
  Clock, TrendingUp, Users, Activity,
246
258
  // Actions
@@ -6,25 +6,24 @@
6
6
  GroveDivider - A decorative divider featuring alternating Grove logos
7
7
 
8
8
  Props:
9
- count - Number of logos (default: 7)
10
- size - 'xs' | 'sm' | 'md' | 'lg' (default: 'sm')
11
- glass - Use GlassLogo instead of regular Logo
12
- variant - Glass variant: 'default' | 'accent' | 'frosted' | 'dark' | 'ethereal'
13
- vertical - Display vertically instead of horizontally
14
- breathing - Enable breathing animation
15
- monochrome - Trunk matches foliage color
16
- color - Custom color override (regular Logo only)
17
- season - Override season (uses seasonStore by default)
18
- gap - Tailwind gap class (default: 'gap-1.5')
19
- spacing - Gap in pixels or rem (overrides gap if provided)
20
- rotation - Logo rotation mode: 'default' | 'left-right' | 'up-down' (default: auto based on orientation)
21
- class - Additional CSS classes
9
+ count - Number of logos (default: 7)
10
+ size - 'xs' | 'sm' | 'md' | 'lg' (default: 'sm')
11
+ glass - Use GlassLogo instead of regular Logo
12
+ variant - Glass variant: 'default' | 'accent' | 'frosted' | 'dark' | 'ethereal'
13
+ vertical - Display vertically instead of horizontally
14
+ monochromeTrunk - Trunk matches foliage color
15
+ monochromeColor - Custom color override (applies to all tiers)
16
+ season - Override season (uses seasonStore by default)
17
+ gap - Tailwind gap class (default: 'gap-1.5')
18
+ spacing - Gap in pixels or rem (overrides gap if provided)
19
+ rotation - Logo rotation mode: 'default' | 'left-right' | 'up-down' (default: auto based on orientation)
20
+ class - Additional CSS classes
22
21
  -->
23
22
  <script lang="ts">
24
- import Logo from './Logo.svelte';
23
+ import Logo from '../ui/Logo.svelte';
25
24
  import GlassLogo from '../ui/GlassLogo.svelte';
26
25
  import type { GlassVariant } from '../ui/types';
27
- import type { Season } from './palette';
26
+ import type { Season } from '../../types/season';
28
27
  import { seasonStore } from '../../stores/season';
29
28
 
30
29
  type RotationMode = 'default' | 'left-right' | 'up-down';
@@ -48,12 +47,10 @@
48
47
  glass?: boolean;
49
48
  /** Glass variant (only applies when glass=true) */
50
49
  variant?: GlassVariant;
51
- /** Add breathing animation to logos */
52
- breathing?: boolean;
53
- /** Monochrome mode - trunk matches foliage color */
54
- monochrome?: boolean;
55
- /** Custom color override (for regular Logo) */
56
- color?: string;
50
+ /** Make trunk match foliage colors */
51
+ monochromeTrunk?: boolean;
52
+ /** Custom color override (applies to all tiers) */
53
+ monochromeColor?: string;
57
54
  /** Display vertically instead of horizontally */
58
55
  vertical?: boolean;
59
56
  }
@@ -68,9 +65,8 @@
68
65
  rotation = 'default',
69
66
  glass = false,
70
67
  variant = 'default',
71
- breathing = false,
72
- monochrome = false,
73
- color,
68
+ monochromeTrunk = false,
69
+ monochromeColor,
74
70
  vertical = false
75
71
  }: Props = $props();
76
72
 
@@ -121,15 +117,15 @@
121
117
  class={sizeClasses[size]}
122
118
  season={activeSeason}
123
119
  {variant}
124
- {breathing}
125
- {monochrome}
120
+ accentColor={monochromeColor}
121
+ {monochromeTrunk}
126
122
  />
127
123
  {:else}
128
124
  <Logo
129
125
  class={sizeClasses[size]}
130
126
  season={activeSeason}
131
- {color}
132
- breathing={breathing}
127
+ {monochromeColor}
128
+ {monochromeTrunk}
133
129
  />
134
130
  {/if}
135
131
  </div>
@@ -1,5 +1,5 @@
1
1
  import type { GlassVariant } from '../ui/types';
2
- import type { Season } from './palette';
2
+ import type { Season } from '../../types/season';
3
3
  type RotationMode = 'default' | 'left-right' | 'up-down';
4
4
  interface Props {
5
5
  /** Number of logos to display (default: 7) */
@@ -20,12 +20,10 @@ interface Props {
20
20
  glass?: boolean;
21
21
  /** Glass variant (only applies when glass=true) */
22
22
  variant?: GlassVariant;
23
- /** Add breathing animation to logos */
24
- breathing?: boolean;
25
- /** Monochrome mode - trunk matches foliage color */
26
- monochrome?: boolean;
27
- /** Custom color override (for regular Logo) */
28
- color?: string;
23
+ /** Make trunk match foliage colors */
24
+ monochromeTrunk?: boolean;
25
+ /** Custom color override (applies to all tiers) */
26
+ monochromeColor?: string;
29
27
  /** Display vertically instead of horizontally */
30
28
  vertical?: boolean;
31
29
  }
@@ -9,6 +9,6 @@ interface Props {
9
9
  /** Add breathing animation (subtle pulse for loading states) */
10
10
  breathing?: boolean;
11
11
  }
12
- declare const Logo: import("svelte").Component<Props, {}, "">;
13
- type Logo = ReturnType<typeof Logo>;
14
- export default Logo;
12
+ declare const LogoArchive: import("svelte").Component<Props, {}, "">;
13
+ type LogoArchive = ReturnType<typeof LogoArchive>;
14
+ export default LogoArchive;
@@ -4,7 +4,7 @@
4
4
  Licensed under AGPL-3.0
5
5
  -->
6
6
  <script lang="ts">
7
- import { accents, bark } from '../palette';
7
+ import { flowers, bark } from '../palette';
8
8
 
9
9
  interface Props {
10
10
  class?: string;
@@ -20,7 +20,7 @@
20
20
  animate = true
21
21
  }: Props = $props();
22
22
 
23
- const body = $derived(bodyColor ?? accents.flower.yellow);
23
+ const body = $derived(bodyColor ?? flowers.wildflower.buttercup);
24
24
  const stripes = $derived(stripeColor ?? bark.darkBark);
25
25
  const wingColor = $derived('#e0f2fe'); // Light blue-ish transparent
26
26
  </script>
@@ -4,7 +4,7 @@
4
4
  Licensed under AGPL-3.0
5
5
  -->
6
6
  <script lang="ts">
7
- import { accents, bark } from '../palette';
7
+ import { flowers, bark } from '../palette';
8
8
 
9
9
  interface Props {
10
10
  class?: string;
@@ -20,8 +20,8 @@
20
20
  animate = true
21
21
  }: Props = $props();
22
22
 
23
- const wing = $derived(wingColor ?? accents.flower.purple);
24
- const accent = $derived(accentColor ?? accents.flower.yellow);
23
+ const wing = $derived(wingColor ?? flowers.wildflower.purple);
24
+ const accent = $derived(accentColor ?? flowers.wildflower.buttercup);
25
25
  const bodyColor = $derived(bark.darkBark);
26
26
  </script>
27
27
 
@@ -4,7 +4,7 @@
4
4
  Licensed under AGPL-3.0
5
5
  -->
6
6
  <script lang="ts">
7
- import { bark, earth, accents } from '../palette';
7
+ import { bark, earth, flowers } from '../palette';
8
8
 
9
9
  interface Props {
10
10
  class?: string;
@@ -22,7 +22,7 @@
22
22
 
23
23
  const feathers = $derived(featherColor ?? bark.bark);
24
24
  const lightFeathers = $derived(earth.clay);
25
- const eyeColor = $derived(accents.flower.yellow);
25
+ const eyeColor = $derived(flowers.wildflower.buttercup);
26
26
  const scaleX = $derived(facing === 'left' ? -1 : 1);
27
27
  </script>
28
28
 
@@ -4,7 +4,7 @@
4
4
  Licensed under AGPL-3.0
5
5
  -->
6
6
  <script lang="ts">
7
- import { accents, greens } from '../palette';
7
+ import { flowers, greens } from '../palette';
8
8
 
9
9
  interface Props {
10
10
  class?: string;
@@ -22,8 +22,8 @@
22
22
  animate = true
23
23
  }: Props = $props();
24
24
 
25
- const petals = $derived(petalColor ?? accents.flower.purple);
26
- const center = $derived(centerColor ?? accents.flower.yellow);
25
+ const petals = $derived(petalColor ?? flowers.wildflower.purple);
26
+ const center = $derived(centerColor ?? flowers.wildflower.buttercup);
27
27
  const stem = $derived(stemColor ?? greens.deepGreen);
28
28
  </script>
29
29
 
@@ -16,14 +16,15 @@
16
16
  * <Cardinal />
17
17
  * ```
18
18
  */
19
- export { default as Logo } from './Logo.svelte';
20
- export { default as GroveDivider } from './GroveDivider.svelte';
21
- export * from './palette';
22
- export * from './trees';
23
- export * from './botanical';
24
- export * from './creatures';
25
- export * from './ground';
26
- export * from './sky';
27
- export * from './structural';
28
- export * from './water';
29
- export * from './weather';
19
+ export { Logo } from "../ui";
20
+ export { default as LogoArchive } from "./LogoArchive.svelte";
21
+ export { default as GroveDivider } from "./GroveDivider.svelte";
22
+ export * from "./palette";
23
+ export * from "./trees";
24
+ export * from "./botanical";
25
+ export * from "./creatures";
26
+ export * from "./ground";
27
+ export * from "./sky";
28
+ export * from "./structural";
29
+ export * from "./water";
30
+ export * from "./weather";
@@ -16,25 +16,27 @@
16
16
  * <Cardinal />
17
17
  * ```
18
18
  */
19
- // Logo - Grove's tree-star logo
20
- export { default as Logo } from './Logo.svelte';
19
+ // Logo - Re-export from ui module (new tree design)
20
+ export { Logo } from "../ui";
21
+ // LogoArchive - Original asterisk logo with nature animations (deprecated)
22
+ export { default as LogoArchive } from "./LogoArchive.svelte";
21
23
  // GroveDivider - Decorative divider with alternating logos
22
- export { default as GroveDivider } from './GroveDivider.svelte';
24
+ export { default as GroveDivider } from "./GroveDivider.svelte";
23
25
  // Palette - Seasonal color system
24
- export * from './palette';
26
+ export * from "./palette";
25
27
  // Trees
26
- export * from './trees';
28
+ export * from "./trees";
27
29
  // Botanical elements
28
- export * from './botanical';
30
+ export * from "./botanical";
29
31
  // Creatures
30
- export * from './creatures';
32
+ export * from "./creatures";
31
33
  // Ground elements
32
- export * from './ground';
34
+ export * from "./ground";
33
35
  // Sky elements
34
- export * from './sky';
36
+ export * from "./sky";
35
37
  // Structural elements
36
- export * from './structural';
38
+ export * from "./structural";
37
39
  // Water elements
38
- export * from './water';
40
+ export * from "./water";
39
41
  // Weather effects
40
- export * from './weather';
42
+ export * from "./weather";