@autumnsgrove/groveengine 0.8.5 → 0.9.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.
Files changed (109) hide show
  1. package/dist/components/WispPanel.svelte +0 -1
  2. package/dist/components/admin/GutterManager.svelte +213 -101
  3. package/dist/components/admin/MarkdownEditor.svelte +6 -3
  4. package/dist/components/custom/ContentWithGutter.svelte +7 -13
  5. package/dist/components/custom/GutterItem.svelte +8 -2
  6. package/dist/components/quota/UpgradePrompt.svelte +1 -0
  7. package/dist/config/domain-blocklist.d.ts +59 -0
  8. package/dist/config/domain-blocklist.js +731 -0
  9. package/dist/config/index.d.ts +3 -1
  10. package/dist/config/index.js +2 -1
  11. package/dist/config/offensive-blocklist.d.ts +44 -0
  12. package/dist/config/offensive-blocklist.js +751 -0
  13. package/dist/config/terrarium.d.ts +109 -0
  14. package/dist/config/terrarium.js +125 -0
  15. package/dist/styles/tokens.css +90 -0
  16. package/dist/types/dom-to-image-more.d.ts +39 -0
  17. package/dist/ui/components/chrome/Footer.svelte +137 -0
  18. package/dist/ui/components/chrome/Footer.svelte.d.ts +11 -0
  19. package/dist/ui/components/chrome/FooterMinimal.svelte +75 -0
  20. package/dist/ui/components/chrome/FooterMinimal.svelte.d.ts +10 -0
  21. package/dist/ui/components/chrome/Header.svelte +113 -0
  22. package/dist/ui/components/chrome/Header.svelte.d.ts +11 -0
  23. package/dist/ui/components/chrome/HeaderMinimal.svelte +68 -0
  24. package/dist/ui/components/chrome/HeaderMinimal.svelte.d.ts +9 -0
  25. package/dist/ui/components/chrome/MobileMenu.svelte +145 -0
  26. package/dist/ui/components/chrome/MobileMenu.svelte.d.ts +9 -0
  27. package/dist/ui/components/chrome/ThemeToggle.svelte +34 -0
  28. package/dist/ui/components/chrome/ThemeToggle.svelte.d.ts +3 -0
  29. package/dist/ui/components/chrome/defaults.d.ts +6 -0
  30. package/dist/ui/components/chrome/defaults.js +65 -0
  31. package/dist/ui/components/chrome/index.d.ts +13 -0
  32. package/dist/ui/components/chrome/index.js +14 -0
  33. package/dist/ui/components/chrome/types.d.ts +19 -0
  34. package/dist/ui/components/chrome/types.js +8 -0
  35. package/dist/ui/components/content/RoadmapPreview.svelte +2 -1
  36. package/dist/ui/components/forms/ContentSearch.svelte +406 -0
  37. package/dist/ui/components/forms/ContentSearch.svelte.d.ts +71 -0
  38. package/dist/ui/components/forms/SearchInput.svelte +0 -1
  39. package/dist/ui/components/forms/filterUtils.d.ts +138 -0
  40. package/dist/ui/components/forms/filterUtils.js +240 -0
  41. package/dist/ui/components/forms/index.d.ts +2 -0
  42. package/dist/ui/components/forms/index.js +5 -1
  43. package/dist/ui/components/gallery/ImageGallery.svelte +17 -3
  44. package/dist/ui/components/gallery/Lightbox.svelte +11 -3
  45. package/dist/ui/components/gallery/ZoomableImage.svelte +13 -2
  46. package/dist/ui/components/icons/index.d.ts +2 -1
  47. package/dist/ui/components/icons/index.js +14 -3
  48. package/dist/ui/components/icons/lucide.d.ts +213 -0
  49. package/dist/ui/components/icons/lucide.js +224 -0
  50. package/dist/ui/components/terrarium/AssetPalette.svelte +207 -0
  51. package/dist/ui/components/terrarium/AssetPalette.svelte.d.ts +7 -0
  52. package/dist/ui/components/terrarium/Canvas.svelte +231 -0
  53. package/dist/ui/components/terrarium/Canvas.svelte.d.ts +14 -0
  54. package/dist/ui/components/terrarium/ExportDialog.svelte +307 -0
  55. package/dist/ui/components/terrarium/ExportDialog.svelte.d.ts +18 -0
  56. package/dist/ui/components/terrarium/PaletteItem.svelte +169 -0
  57. package/dist/ui/components/terrarium/PaletteItem.svelte.d.ts +9 -0
  58. package/dist/ui/components/terrarium/PlacedAsset.svelte +222 -0
  59. package/dist/ui/components/terrarium/PlacedAsset.svelte.d.ts +11 -0
  60. package/dist/ui/components/terrarium/Terrarium.svelte +266 -0
  61. package/dist/ui/components/terrarium/Terrarium.svelte.d.ts +3 -0
  62. package/dist/ui/components/terrarium/Toolbar.svelte +299 -0
  63. package/dist/ui/components/terrarium/Toolbar.svelte.d.ts +24 -0
  64. package/dist/ui/components/terrarium/index.d.ts +31 -0
  65. package/dist/ui/components/terrarium/index.js +33 -0
  66. package/dist/ui/components/terrarium/terrariumState.svelte.d.ts +45 -0
  67. package/dist/ui/components/terrarium/terrariumState.svelte.js +291 -0
  68. package/dist/ui/components/terrarium/types.d.ts +139 -0
  69. package/dist/ui/components/terrarium/types.js +43 -0
  70. package/dist/ui/components/terrarium/utils/export.d.ts +48 -0
  71. package/dist/ui/components/terrarium/utils/export.js +148 -0
  72. package/dist/ui/components/typography/index.d.ts +0 -10
  73. package/dist/ui/components/typography/index.js +1 -12
  74. package/dist/ui/components/ui/CollapsibleSection.svelte +12 -0
  75. package/dist/ui/components/ui/GlassConfirmDialog.svelte +9 -0
  76. package/dist/ui/components/ui/GlassOverlay.svelte +2 -1
  77. package/dist/ui/components/ui/Input.svelte +9 -1
  78. package/dist/ui/components/ui/Input.svelte.d.ts +2 -0
  79. package/dist/ui/components/ui/Textarea.svelte +9 -1
  80. package/dist/ui/components/ui/Textarea.svelte.d.ts +2 -0
  81. package/dist/ui/stores/index.d.ts +6 -0
  82. package/dist/ui/stores/index.js +6 -0
  83. package/dist/ui/stores/season.d.ts +14 -0
  84. package/dist/ui/stores/season.js +65 -0
  85. package/dist/ui/tokens/fonts.d.ts +1 -1
  86. package/dist/ui/tokens/fonts.js +0 -126
  87. package/package.json +46 -22
  88. package/static/fonts/alagard.ttf +0 -0
  89. package/LICENSE +0 -378
  90. package/dist/ui/components/typography/BodoniModa.svelte +0 -17
  91. package/dist/ui/components/typography/BodoniModa.svelte.d.ts +0 -10
  92. package/dist/ui/components/typography/Cormorant.svelte +0 -17
  93. package/dist/ui/components/typography/Cormorant.svelte.d.ts +0 -10
  94. package/dist/ui/components/typography/EBGaramond.svelte +0 -17
  95. package/dist/ui/components/typography/EBGaramond.svelte.d.ts +0 -10
  96. package/dist/ui/components/typography/Fraunces.svelte +0 -17
  97. package/dist/ui/components/typography/Fraunces.svelte.d.ts +0 -10
  98. package/dist/ui/components/typography/InstrumentSans.svelte +0 -17
  99. package/dist/ui/components/typography/InstrumentSans.svelte.d.ts +0 -10
  100. package/dist/ui/components/typography/Lora.svelte +0 -17
  101. package/dist/ui/components/typography/Lora.svelte.d.ts +0 -10
  102. package/dist/ui/components/typography/Luciole.svelte +0 -17
  103. package/dist/ui/components/typography/Luciole.svelte.d.ts +0 -10
  104. package/dist/ui/components/typography/Manrope.svelte +0 -17
  105. package/dist/ui/components/typography/Manrope.svelte.d.ts +0 -10
  106. package/dist/ui/components/typography/Merriweather.svelte +0 -17
  107. package/dist/ui/components/typography/Merriweather.svelte.d.ts +0 -10
  108. package/dist/ui/components/typography/Nunito.svelte +0 -17
  109. package/dist/ui/components/typography/Nunito.svelte.d.ts +0 -10
@@ -16,20 +16,9 @@ export { default as Lexend } from './Lexend.svelte';
16
16
  // Accessibility fonts
17
17
  export { default as Atkinson } from './Atkinson.svelte';
18
18
  export { default as OpenDyslexic } from './OpenDyslexic.svelte';
19
- export { default as Luciole } from './Luciole.svelte';
20
- // Modern sans-serif fonts
21
- export { default as Nunito } from './Nunito.svelte';
19
+ // Sans-serif fonts
22
20
  export { default as Quicksand } from './Quicksand.svelte';
23
- export { default as Manrope } from './Manrope.svelte';
24
- export { default as InstrumentSans } from './InstrumentSans.svelte';
25
21
  export { default as PlusJakartaSans } from './PlusJakartaSans.svelte';
26
- // Serif fonts
27
- export { default as Cormorant } from './Cormorant.svelte';
28
- export { default as BodoniModa } from './BodoniModa.svelte';
29
- export { default as Lora } from './Lora.svelte';
30
- export { default as EBGaramond } from './EBGaramond.svelte';
31
- export { default as Merriweather } from './Merriweather.svelte';
32
- export { default as Fraunces } from './Fraunces.svelte';
33
22
  // Monospace fonts
34
23
  export { default as IBMPlexMono } from './IBMPlexMono.svelte';
35
24
  export { default as Cozette } from './Cozette.svelte';
@@ -11,15 +11,27 @@
11
11
  let {
12
12
  title,
13
13
  defaultOpen = false,
14
+ open: externalOpen,
15
+ ontoggle,
14
16
  children,
15
17
  class: className = '',
16
18
  ...restProps
17
19
  }: Props = $props();
18
20
 
21
+ // defaultOpen only sets the initial state (not reactive to prop changes)
22
+ // svelte-ignore state_referenced_locally
19
23
  let isOpen = $state(defaultOpen);
20
24
 
25
+ // Sync with external open prop if provided
26
+ $effect(() => {
27
+ if (externalOpen !== undefined) {
28
+ isOpen = externalOpen;
29
+ }
30
+ });
31
+
21
32
  function toggle() {
22
33
  isOpen = !isOpen;
34
+ ontoggle?.();
23
35
  }
24
36
  </script>
25
37
 
@@ -117,6 +117,14 @@
117
117
  handleCancel();
118
118
  }
119
119
  }
120
+
121
+ function handleBackdropKeydown(event: KeyboardEvent) {
122
+ // Handle Enter and Space to close, consistent with button behavior
123
+ if (event.key === "Enter" || event.key === " ") {
124
+ event.preventDefault();
125
+ handleCancel();
126
+ }
127
+ }
120
128
  </script>
121
129
 
122
130
  <svelte:window onkeydown={handleKeydown} />
@@ -126,6 +134,7 @@
126
134
  <div
127
135
  class="fixed inset-0 z-50 flex items-center justify-center p-4"
128
136
  onclick={handleBackdropClick}
137
+ onkeydown={handleBackdropKeydown}
129
138
  role="dialog"
130
139
  aria-modal="true"
131
140
  aria-labelledby="confirm-dialog-title"
@@ -80,10 +80,11 @@
80
80
  );
81
81
  </script>
82
82
 
83
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
83
84
  <div
84
85
  class={computedClass}
85
86
  role={interactive ? "button" : "presentation"}
86
- tabindex={interactive ? 0 : undefined}
87
+ tabindex={interactive ? 0 : -1}
87
88
  aria-label={interactive ? "Close overlay" : undefined}
88
89
  {...restProps}
89
90
  >
@@ -14,6 +14,7 @@
14
14
  * @prop {boolean} [required=false] - Whether input is required (shows asterisk)
15
15
  * @prop {boolean} [disabled=false] - Whether input is disabled
16
16
  * @prop {string} [class] - Additional CSS classes to apply
17
+ * @prop {string} [id] - Input ID for label association (auto-generated if not provided)
17
18
  * @prop {HTMLInputElement} [ref] - Reference to the underlying input element (bindable)
18
19
  *
19
20
  * @example
@@ -34,6 +35,7 @@
34
35
  required?: boolean;
35
36
  disabled?: boolean;
36
37
  class?: string;
38
+ id?: string;
37
39
  ref?: HTMLInputElement | null;
38
40
  }
39
41
 
@@ -46,10 +48,15 @@
46
48
  required = false,
47
49
  disabled = false,
48
50
  class: className,
51
+ id,
49
52
  ref = $bindable(null),
50
53
  ...restProps
51
54
  }: Props = $props();
52
55
 
56
+ // Generate unique ID for label association if not provided
57
+ // svelte-ignore state_referenced_locally - id is intentionally captured at initialization for stable IDs
58
+ const inputId = id ?? `input-${crypto.randomUUID()}`;
59
+
53
60
  const inputClass = $derived(
54
61
  cn(
55
62
  error && "border-destructive focus-visible:ring-destructive/20",
@@ -60,7 +67,7 @@
60
67
 
61
68
  <div class="flex flex-col gap-1.5">
62
69
  {#if label}
63
- <label class="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
70
+ <label for={inputId} class="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
64
71
  {label}
65
72
  {#if required}
66
73
  <span class="text-destructive">*</span>
@@ -69,6 +76,7 @@
69
76
  {/if}
70
77
 
71
78
  <ShadcnInput
79
+ id={inputId}
72
80
  bind:ref={ref}
73
81
  bind:value
74
82
  {type}
@@ -10,6 +10,7 @@ import type { HTMLInputAttributes } from "svelte/elements";
10
10
  * @prop {boolean} [required=false] - Whether input is required (shows asterisk)
11
11
  * @prop {boolean} [disabled=false] - Whether input is disabled
12
12
  * @prop {string} [class] - Additional CSS classes to apply
13
+ * @prop {string} [id] - Input ID for label association (auto-generated if not provided)
13
14
  * @prop {HTMLInputElement} [ref] - Reference to the underlying input element (bindable)
14
15
  *
15
16
  * @example
@@ -30,6 +31,7 @@ interface Props extends Omit<HTMLInputAttributes, "class"> {
30
31
  required?: boolean;
31
32
  disabled?: boolean;
32
33
  class?: string;
34
+ id?: string;
33
35
  ref?: HTMLInputElement | null;
34
36
  }
35
37
  declare const Input: import("svelte").Component<Props, {}, "ref" | "value">;
@@ -14,6 +14,7 @@
14
14
  * @prop {boolean} [required=false] - Whether textarea is required (shows asterisk)
15
15
  * @prop {boolean} [disabled=false] - Whether textarea is disabled
16
16
  * @prop {string} [class] - Additional CSS classes to apply
17
+ * @prop {string} [id] - Textarea ID for label association (auto-generated if not provided)
17
18
  *
18
19
  * @example
19
20
  * <Textarea label="Description" bind:value={description} required />
@@ -33,6 +34,7 @@
33
34
  required?: boolean;
34
35
  disabled?: boolean;
35
36
  class?: string;
37
+ id?: string;
36
38
  }
37
39
 
38
40
  let {
@@ -44,9 +46,14 @@
44
46
  required = false,
45
47
  disabled = false,
46
48
  class: className,
49
+ id,
47
50
  ...restProps
48
51
  }: Props = $props();
49
52
 
53
+ // Generate unique ID for label association if not provided
54
+ // svelte-ignore state_referenced_locally - id is intentionally captured at initialization for stable IDs
55
+ const textareaId = id ?? `textarea-${crypto.randomUUID()}`;
56
+
50
57
  const textareaClass = $derived(
51
58
  cn(
52
59
  error && "border-destructive focus-visible:ring-destructive/20",
@@ -57,7 +64,7 @@
57
64
 
58
65
  <div class="flex flex-col gap-1.5">
59
66
  {#if label}
60
- <label class="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
67
+ <label for={textareaId} class="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
61
68
  {label}
62
69
  {#if required}
63
70
  <span class="text-destructive">*</span>
@@ -66,6 +73,7 @@
66
73
  {/if}
67
74
 
68
75
  <ShadcnTextarea
76
+ id={textareaId}
69
77
  bind:value
70
78
  {placeholder}
71
79
  {rows}
@@ -10,6 +10,7 @@ import type { HTMLTextareaAttributes } from "svelte/elements";
10
10
  * @prop {boolean} [required=false] - Whether textarea is required (shows asterisk)
11
11
  * @prop {boolean} [disabled=false] - Whether textarea is disabled
12
12
  * @prop {string} [class] - Additional CSS classes to apply
13
+ * @prop {string} [id] - Textarea ID for label association (auto-generated if not provided)
13
14
  *
14
15
  * @example
15
16
  * <Textarea label="Description" bind:value={description} required />
@@ -29,6 +30,7 @@ interface Props extends Omit<HTMLTextareaAttributes, "class"> {
29
30
  required?: boolean;
30
31
  disabled?: boolean;
31
32
  class?: string;
33
+ id?: string;
32
34
  }
33
35
  declare const Textarea: import("svelte").Component<Props, {}, "value">;
34
36
  type Textarea = ReturnType<typeof Textarea>;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * UI Stores Index
3
+ * Re-exports all shared UI stores from the engine package
4
+ */
5
+ export { seasonStore } from "./season";
6
+ export { themeStore } from "./theme";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * UI Stores Index
3
+ * Re-exports all shared UI stores from the engine package
4
+ */
5
+ export { seasonStore } from "./season";
6
+ export { themeStore } from "./theme";
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Season Store for Grove Engine
3
+ * Manages seasonal theme preferences (spring, summer, autumn, winter)
4
+ * Defaults to autumn on first visit, remembers user choice thereafter
5
+ *
6
+ * The logo and other nature components react to season changes.
7
+ */
8
+ import type { Season } from "../components/nature/palette";
9
+ export declare const seasonStore: {
10
+ subscribe: (this: void, run: import("svelte/store").Subscriber<Season>, invalidate?: () => void) => import("svelte/store").Unsubscriber;
11
+ cycle: () => void;
12
+ setSeason: (newSeason: Season) => void;
13
+ getCurrent: () => Season;
14
+ };
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Season Store for Grove Engine
3
+ * Manages seasonal theme preferences (spring, summer, autumn, winter)
4
+ * Defaults to autumn on first visit, remembers user choice thereafter
5
+ *
6
+ * The logo and other nature components react to season changes.
7
+ */
8
+ import { writable, get } from "svelte/store";
9
+ import { browser } from "$app/environment";
10
+ const STORAGE_KEY = "grove-season";
11
+ // Season cycle order
12
+ const SEASONS = ["spring", "summer", "autumn", "winter"];
13
+ function getInitialSeason() {
14
+ if (!browser)
15
+ return "autumn";
16
+ // Check if user has a stored preference
17
+ const stored = localStorage.getItem(STORAGE_KEY);
18
+ if (stored && SEASONS.includes(stored)) {
19
+ return stored;
20
+ }
21
+ // Clean up invalid stored value if present
22
+ if (stored) {
23
+ localStorage.removeItem(STORAGE_KEY);
24
+ }
25
+ // First visit (or invalid value): default to autumn (Grove's signature season)
26
+ return "autumn";
27
+ }
28
+ function createSeasonStore() {
29
+ const season = writable(getInitialSeason());
30
+ // Persist to localStorage on change
31
+ if (browser) {
32
+ season.subscribe((s) => {
33
+ localStorage.setItem(STORAGE_KEY, s);
34
+ });
35
+ }
36
+ /**
37
+ * Cycle to the next season: spring → summer → autumn → winter → spring
38
+ */
39
+ function cycle() {
40
+ season.update((current) => {
41
+ const currentIndex = SEASONS.indexOf(current);
42
+ const nextIndex = (currentIndex + 1) % SEASONS.length;
43
+ return SEASONS[nextIndex];
44
+ });
45
+ }
46
+ /**
47
+ * Set a specific season
48
+ */
49
+ function setSeason(newSeason) {
50
+ season.set(newSeason);
51
+ }
52
+ /**
53
+ * Get current season value (for non-reactive contexts)
54
+ */
55
+ function getCurrent() {
56
+ return get(season);
57
+ }
58
+ return {
59
+ subscribe: season.subscribe,
60
+ cycle,
61
+ setSeason,
62
+ getCurrent,
63
+ };
64
+ }
65
+ export const seasonStore = createSeasonStore();
@@ -7,7 +7,7 @@
7
7
  /** CDN base URL for all font assets */
8
8
  export declare const FONT_CDN_BASE = "https://cdn.grove.place/fonts";
9
9
  /** Font category for organizing fonts */
10
- export type FontCategory = "default" | "accessibility" | "sans-serif" | "serif" | "monospace" | "display";
10
+ export type FontCategory = "default" | "accessibility" | "sans-serif" | "monospace" | "display";
11
11
  /** Font format for @font-face src declarations */
12
12
  export type FontFormat = "truetype" | "opentype";
13
13
  /** Complete font definition with metadata */
@@ -61,39 +61,7 @@ export const fonts = [
61
61
  "sans-serif",
62
62
  ],
63
63
  },
64
- {
65
- id: "luciole",
66
- name: "Luciole",
67
- file: "Luciole-Regular.ttf",
68
- format: "truetype",
69
- fontFamily: "Luciole",
70
- category: "accessibility",
71
- description: "French accessibility font designed for visually impaired readers.",
72
- fallback: [
73
- "-apple-system",
74
- "BlinkMacSystemFont",
75
- "Segoe UI",
76
- "Roboto",
77
- "sans-serif",
78
- ],
79
- },
80
64
  // Modern sans-serif fonts
81
- {
82
- id: "nunito",
83
- name: "Nunito",
84
- file: "Nunito-Regular.ttf",
85
- format: "truetype",
86
- fontFamily: "Nunito",
87
- category: "sans-serif",
88
- description: "Friendly rounded sans-serif. Warm and approachable.",
89
- fallback: [
90
- "-apple-system",
91
- "BlinkMacSystemFont",
92
- "Segoe UI",
93
- "Roboto",
94
- "sans-serif",
95
- ],
96
- },
97
65
  {
98
66
  id: "quicksand",
99
67
  name: "Quicksand",
@@ -110,38 +78,6 @@ export const fonts = [
110
78
  "sans-serif",
111
79
  ],
112
80
  },
113
- {
114
- id: "manrope",
115
- name: "Manrope",
116
- file: "Manrope-Regular.ttf",
117
- format: "truetype",
118
- fontFamily: "Manrope",
119
- category: "sans-serif",
120
- description: "Professional geometric sans. Clean and contemporary.",
121
- fallback: [
122
- "-apple-system",
123
- "BlinkMacSystemFont",
124
- "Segoe UI",
125
- "Roboto",
126
- "sans-serif",
127
- ],
128
- },
129
- {
130
- id: "instrument-sans",
131
- name: "Instrument Sans",
132
- file: "InstrumentSans-Regular.ttf",
133
- format: "truetype",
134
- fontFamily: "Instrument Sans",
135
- category: "sans-serif",
136
- description: "Low contrast sans with humanist touches. Elegant simplicity.",
137
- fallback: [
138
- "-apple-system",
139
- "BlinkMacSystemFont",
140
- "Segoe UI",
141
- "Roboto",
142
- "sans-serif",
143
- ],
144
- },
145
81
  {
146
82
  id: "plus-jakarta-sans",
147
83
  name: "Plus Jakarta Sans",
@@ -158,67 +94,6 @@ export const fonts = [
158
94
  "sans-serif",
159
95
  ],
160
96
  },
161
- // Serif fonts
162
- {
163
- id: "cormorant",
164
- name: "Cormorant",
165
- file: "Cormorant-Regular.ttf",
166
- format: "truetype",
167
- fontFamily: "Cormorant",
168
- category: "serif",
169
- description: "Elegant display serif inspired by Garamond. Refined and classic.",
170
- fallback: ["Georgia", "Times New Roman", "serif"],
171
- },
172
- {
173
- id: "bodoni-moda",
174
- name: "Bodoni Moda",
175
- file: "BodoniModa-Regular.ttf",
176
- format: "truetype",
177
- fontFamily: "Bodoni Moda",
178
- category: "serif",
179
- description: "High contrast modern serif. Bold and sophisticated.",
180
- fallback: ["Georgia", "Times New Roman", "serif"],
181
- },
182
- {
183
- id: "lora",
184
- name: "Lora",
185
- file: "Lora-Regular.ttf",
186
- format: "truetype",
187
- fontFamily: "Lora",
188
- category: "serif",
189
- description: "Well-balanced contemporary serif. Excellent for body text.",
190
- fallback: ["Georgia", "Times New Roman", "serif"],
191
- },
192
- {
193
- id: "eb-garamond",
194
- name: "EB Garamond",
195
- file: "EBGaramond-Regular.ttf",
196
- format: "truetype",
197
- fontFamily: "EB Garamond",
198
- category: "serif",
199
- description: "Revival of classic Garamond. Timeless book typography.",
200
- fallback: ["Georgia", "Times New Roman", "serif"],
201
- },
202
- {
203
- id: "merriweather",
204
- name: "Merriweather",
205
- file: "Merriweather-Regular.ttf",
206
- format: "truetype",
207
- fontFamily: "Merriweather",
208
- category: "serif",
209
- description: "Designed for screen reading. Excellent legibility.",
210
- fallback: ["Georgia", "Times New Roman", "serif"],
211
- },
212
- {
213
- id: "fraunces",
214
- name: "Fraunces",
215
- file: "Fraunces-Regular.ttf",
216
- format: "truetype",
217
- fontFamily: "Fraunces",
218
- category: "serif",
219
- description: 'Soft serif with "wonky" optical axes. Warm personality.',
220
- fallback: ["Georgia", "Times New Roman", "serif"],
221
- },
222
97
  // Monospace fonts
223
98
  {
224
99
  id: "ibm-plex-mono",
@@ -335,7 +210,6 @@ export const fontCategoryLabels = {
335
210
  default: "Default",
336
211
  accessibility: "Accessibility",
337
212
  "sans-serif": "Sans-Serif",
338
- serif: "Serif",
339
213
  monospace: "Monospace",
340
214
  display: "Display & Special",
341
215
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autumnsgrove/groveengine",
3
- "version": "0.8.5",
3
+ "version": "0.9.0",
4
4
  "description": "Multi-tenant blog engine for Grove Platform. Features gutter annotations, markdown editing, magic code auth, and Cloudflare Workers deployment.",
5
5
  "author": "AutumnsGrove",
6
6
  "license": "AGPL-3.0-only",
@@ -9,6 +9,10 @@
9
9
  "url": "https://github.com/AutumnsGrove/GroveEngine.git",
10
10
  "directory": "packages/engine"
11
11
  },
12
+ "publishConfig": {
13
+ "registry": "https://registry.npmjs.org",
14
+ "access": "public"
15
+ },
12
16
  "keywords": [
13
17
  "blog",
14
18
  "cms",
@@ -38,6 +42,16 @@
38
42
  "svelte": "./dist/ui/index.js",
39
43
  "default": "./dist/ui/index.js"
40
44
  },
45
+ "./ui/chrome": {
46
+ "types": "./dist/ui/components/chrome/index.d.ts",
47
+ "svelte": "./dist/ui/components/chrome/index.js",
48
+ "default": "./dist/ui/components/chrome/index.js"
49
+ },
50
+ "./ui/stores": {
51
+ "types": "./dist/ui/stores/index.d.ts",
52
+ "svelte": "./dist/ui/stores/index.js",
53
+ "default": "./dist/ui/stores/index.js"
54
+ },
41
55
  "./ui/gallery": {
42
56
  "types": "./dist/ui/components/gallery/index.d.ts",
43
57
  "svelte": "./dist/ui/components/gallery/index.js",
@@ -151,6 +165,15 @@
151
165
  "types": "./dist/ui/vineyard/index.d.ts",
152
166
  "svelte": "./dist/ui/vineyard/index.js",
153
167
  "default": "./dist/ui/vineyard/index.js"
168
+ },
169
+ "./ui/terrarium": {
170
+ "types": "./dist/ui/components/terrarium/index.d.ts",
171
+ "svelte": "./dist/ui/components/terrarium/index.js",
172
+ "default": "./dist/ui/components/terrarium/index.js"
173
+ },
174
+ "./config/terrarium": {
175
+ "types": "./dist/config/terrarium.d.ts",
176
+ "default": "./dist/config/terrarium.js"
154
177
  }
155
178
  },
156
179
  "files": [
@@ -158,6 +181,26 @@
158
181
  "static",
159
182
  "!dist/**/*.test.*"
160
183
  ],
184
+ "scripts": {
185
+ "dev": "vite dev",
186
+ "dev:wrangler": "wrangler pages dev -- vite dev",
187
+ "build": "vite build",
188
+ "build:package": "svelte-kit sync && svelte-package -o dist",
189
+ "package": "svelte-kit sync && svelte-package -o dist",
190
+ "prepublishOnly": "pnpm run package",
191
+ "preview": "vite preview",
192
+ "deploy": "wrangler pages deploy .svelte-kit/cloudflare --project-name groveengine",
193
+ "audit": "pnpm audit --audit-level=moderate",
194
+ "audit:fix": "pnpm audit --fix",
195
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
196
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
197
+ "test": "vitest",
198
+ "test:ui": "vitest --ui",
199
+ "test:run": "vitest run",
200
+ "test:security": "vitest run tests/security",
201
+ "test:coverage": "vitest run --coverage",
202
+ "test:watch": "vitest watch"
203
+ },
161
204
  "peerDependencies": {
162
205
  "@sveltejs/kit": "^2.0.0",
163
206
  "svelte": "^5.0.0",
@@ -194,7 +237,6 @@
194
237
  "vitest": "^4.0.14"
195
238
  },
196
239
  "dependencies": {
197
- "@autumnsgrove/vineyard": "link:../../../Vineyard",
198
240
  "chart.js": "^4.5.1",
199
241
  "clsx": "^2.1.1",
200
242
  "dompurify": "^3.3.0",
@@ -203,25 +245,7 @@
203
245
  "lucide-svelte": "^0.554.0",
204
246
  "marked": "^17.0.1",
205
247
  "svelte-sonner": "^1.0.7",
206
- "tailwind-merge": "^3.4.0"
207
- },
208
- "scripts": {
209
- "dev": "vite dev",
210
- "dev:wrangler": "wrangler pages dev -- vite dev",
211
- "build": "vite build",
212
- "build:package": "svelte-kit sync && svelte-package -o dist",
213
- "package": "svelte-kit sync && svelte-package -o dist",
214
- "preview": "vite preview",
215
- "deploy": "wrangler pages deploy .svelte-kit/cloudflare --project-name groveengine",
216
- "audit": "pnpm audit --audit-level=moderate",
217
- "audit:fix": "pnpm audit --fix",
218
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
219
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
220
- "test": "vitest",
221
- "test:ui": "vitest --ui",
222
- "test:run": "vitest run",
223
- "test:security": "vitest run tests/security",
224
- "test:coverage": "vitest run --coverage",
225
- "test:watch": "vitest watch"
248
+ "tailwind-merge": "^3.4.0",
249
+ "dom-to-image-more": "^3.5.0"
226
250
  }
227
251
  }
File without changes