@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.
- package/dist/components/WispPanel.svelte +0 -1
- package/dist/components/admin/GutterManager.svelte +213 -101
- package/dist/components/admin/MarkdownEditor.svelte +6 -3
- package/dist/components/custom/ContentWithGutter.svelte +7 -13
- package/dist/components/custom/GutterItem.svelte +8 -2
- package/dist/components/quota/UpgradePrompt.svelte +1 -0
- package/dist/config/domain-blocklist.d.ts +59 -0
- package/dist/config/domain-blocklist.js +731 -0
- package/dist/config/index.d.ts +3 -1
- package/dist/config/index.js +2 -1
- package/dist/config/offensive-blocklist.d.ts +44 -0
- package/dist/config/offensive-blocklist.js +751 -0
- package/dist/config/terrarium.d.ts +109 -0
- package/dist/config/terrarium.js +125 -0
- package/dist/styles/tokens.css +90 -0
- package/dist/types/dom-to-image-more.d.ts +39 -0
- package/dist/ui/components/chrome/Footer.svelte +137 -0
- package/dist/ui/components/chrome/Footer.svelte.d.ts +11 -0
- package/dist/ui/components/chrome/FooterMinimal.svelte +75 -0
- package/dist/ui/components/chrome/FooterMinimal.svelte.d.ts +10 -0
- package/dist/ui/components/chrome/Header.svelte +113 -0
- package/dist/ui/components/chrome/Header.svelte.d.ts +11 -0
- package/dist/ui/components/chrome/HeaderMinimal.svelte +68 -0
- package/dist/ui/components/chrome/HeaderMinimal.svelte.d.ts +9 -0
- package/dist/ui/components/chrome/MobileMenu.svelte +145 -0
- package/dist/ui/components/chrome/MobileMenu.svelte.d.ts +9 -0
- package/dist/ui/components/chrome/ThemeToggle.svelte +34 -0
- package/dist/ui/components/chrome/ThemeToggle.svelte.d.ts +3 -0
- package/dist/ui/components/chrome/defaults.d.ts +6 -0
- package/dist/ui/components/chrome/defaults.js +65 -0
- package/dist/ui/components/chrome/index.d.ts +13 -0
- package/dist/ui/components/chrome/index.js +14 -0
- package/dist/ui/components/chrome/types.d.ts +19 -0
- package/dist/ui/components/chrome/types.js +8 -0
- package/dist/ui/components/content/RoadmapPreview.svelte +2 -1
- package/dist/ui/components/forms/ContentSearch.svelte +406 -0
- package/dist/ui/components/forms/ContentSearch.svelte.d.ts +71 -0
- package/dist/ui/components/forms/SearchInput.svelte +0 -1
- package/dist/ui/components/forms/filterUtils.d.ts +138 -0
- package/dist/ui/components/forms/filterUtils.js +240 -0
- package/dist/ui/components/forms/index.d.ts +2 -0
- package/dist/ui/components/forms/index.js +5 -1
- package/dist/ui/components/gallery/ImageGallery.svelte +17 -3
- package/dist/ui/components/gallery/Lightbox.svelte +11 -3
- package/dist/ui/components/gallery/ZoomableImage.svelte +13 -2
- package/dist/ui/components/icons/index.d.ts +2 -1
- package/dist/ui/components/icons/index.js +14 -3
- package/dist/ui/components/icons/lucide.d.ts +213 -0
- package/dist/ui/components/icons/lucide.js +224 -0
- package/dist/ui/components/terrarium/AssetPalette.svelte +207 -0
- package/dist/ui/components/terrarium/AssetPalette.svelte.d.ts +7 -0
- package/dist/ui/components/terrarium/Canvas.svelte +231 -0
- package/dist/ui/components/terrarium/Canvas.svelte.d.ts +14 -0
- package/dist/ui/components/terrarium/ExportDialog.svelte +307 -0
- package/dist/ui/components/terrarium/ExportDialog.svelte.d.ts +18 -0
- package/dist/ui/components/terrarium/PaletteItem.svelte +169 -0
- package/dist/ui/components/terrarium/PaletteItem.svelte.d.ts +9 -0
- package/dist/ui/components/terrarium/PlacedAsset.svelte +222 -0
- package/dist/ui/components/terrarium/PlacedAsset.svelte.d.ts +11 -0
- package/dist/ui/components/terrarium/Terrarium.svelte +266 -0
- package/dist/ui/components/terrarium/Terrarium.svelte.d.ts +3 -0
- package/dist/ui/components/terrarium/Toolbar.svelte +299 -0
- package/dist/ui/components/terrarium/Toolbar.svelte.d.ts +24 -0
- package/dist/ui/components/terrarium/index.d.ts +31 -0
- package/dist/ui/components/terrarium/index.js +33 -0
- package/dist/ui/components/terrarium/terrariumState.svelte.d.ts +45 -0
- package/dist/ui/components/terrarium/terrariumState.svelte.js +291 -0
- package/dist/ui/components/terrarium/types.d.ts +139 -0
- package/dist/ui/components/terrarium/types.js +43 -0
- package/dist/ui/components/terrarium/utils/export.d.ts +48 -0
- package/dist/ui/components/terrarium/utils/export.js +148 -0
- package/dist/ui/components/typography/index.d.ts +0 -10
- package/dist/ui/components/typography/index.js +1 -12
- package/dist/ui/components/ui/CollapsibleSection.svelte +12 -0
- package/dist/ui/components/ui/GlassConfirmDialog.svelte +9 -0
- package/dist/ui/components/ui/GlassOverlay.svelte +2 -1
- package/dist/ui/components/ui/Input.svelte +9 -1
- package/dist/ui/components/ui/Input.svelte.d.ts +2 -0
- package/dist/ui/components/ui/Textarea.svelte +9 -1
- package/dist/ui/components/ui/Textarea.svelte.d.ts +2 -0
- package/dist/ui/stores/index.d.ts +6 -0
- package/dist/ui/stores/index.js +6 -0
- package/dist/ui/stores/season.d.ts +14 -0
- package/dist/ui/stores/season.js +65 -0
- package/dist/ui/tokens/fonts.d.ts +1 -1
- package/dist/ui/tokens/fonts.js +0 -126
- package/package.json +46 -22
- package/static/fonts/alagard.ttf +0 -0
- package/LICENSE +0 -378
- package/dist/ui/components/typography/BodoniModa.svelte +0 -17
- package/dist/ui/components/typography/BodoniModa.svelte.d.ts +0 -10
- package/dist/ui/components/typography/Cormorant.svelte +0 -17
- package/dist/ui/components/typography/Cormorant.svelte.d.ts +0 -10
- package/dist/ui/components/typography/EBGaramond.svelte +0 -17
- package/dist/ui/components/typography/EBGaramond.svelte.d.ts +0 -10
- package/dist/ui/components/typography/Fraunces.svelte +0 -17
- package/dist/ui/components/typography/Fraunces.svelte.d.ts +0 -10
- package/dist/ui/components/typography/InstrumentSans.svelte +0 -17
- package/dist/ui/components/typography/InstrumentSans.svelte.d.ts +0 -10
- package/dist/ui/components/typography/Lora.svelte +0 -17
- package/dist/ui/components/typography/Lora.svelte.d.ts +0 -10
- package/dist/ui/components/typography/Luciole.svelte +0 -17
- package/dist/ui/components/typography/Luciole.svelte.d.ts +0 -10
- package/dist/ui/components/typography/Manrope.svelte +0 -17
- package/dist/ui/components/typography/Manrope.svelte.d.ts +0 -10
- package/dist/ui/components/typography/Merriweather.svelte +0 -17
- package/dist/ui/components/typography/Merriweather.svelte.d.ts +0 -10
- package/dist/ui/components/typography/Nunito.svelte +0 -17
- 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
|
-
|
|
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 :
|
|
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,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" | "
|
|
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 */
|
package/dist/ui/tokens/fonts.js
CHANGED
|
@@ -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.
|
|
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
|
}
|
package/static/fonts/alagard.ttf
CHANGED
|
File without changes
|