create-goodfellow 0.0.0-stage → 0.1.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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -2
  3. package/bin/create-goodfellow.js +2 -0
  4. package/dist/cli.d.ts +1 -0
  5. package/dist/cli.js +187 -0
  6. package/dist/index.d.ts +107 -0
  7. package/dist/index.js +2 -0
  8. package/dist/scaffold-4nOF_fOJ.js +207 -0
  9. package/package.json +55 -3
  10. package/templates/next/.github/workflows/deploy.yml +51 -0
  11. package/templates/next/.gitlab-ci.yml +18 -0
  12. package/templates/next/README.md +120 -0
  13. package/templates/next/_gitignore +5 -0
  14. package/templates/next/app/(site)/[[...path]]/page.tsx +8 -0
  15. package/templates/next/app/(site)/layout.tsx +5 -0
  16. package/templates/next/app/admin/demo-content.json/route.ts +5 -0
  17. package/templates/next/app/admin/layout.tsx +8 -0
  18. package/templates/next/app/admin/page.tsx +8 -0
  19. package/templates/next/app/layout.tsx +11 -0
  20. package/templates/next/app/not-found.tsx +4 -0
  21. package/templates/next/app/robots.ts +4 -0
  22. package/templates/next/app/site.css +11 -0
  23. package/templates/next/app/sitemap.ts +4 -0
  24. package/templates/next/blocks/installed/index.ts +7 -0
  25. package/templates/next/components.json +24 -0
  26. package/templates/next/content/collections/news/_collection.json +113 -0
  27. package/templates/next/content/collections/news/open-house.json +9 -0
  28. package/templates/next/content/collections/news/welcome.json +10 -0
  29. package/templates/next/content/layout/footer.json +55 -0
  30. package/templates/next/content/layout/header.json +54 -0
  31. package/templates/next/content/menus.json +25 -0
  32. package/templates/next/content/pages/404.json +73 -0
  33. package/templates/next/content/pages/about.json +59 -0
  34. package/templates/next/content/pages/index.json +215 -0
  35. package/templates/next/content/pages/news.json +55 -0
  36. package/templates/next/content/site.json +25 -0
  37. package/templates/next/content/styles/custom.css +4 -0
  38. package/templates/next/goodfellow.config.tsx +17 -0
  39. package/templates/next/lib/site.ts +5 -0
  40. package/templates/next/next.config.ts +7 -0
  41. package/templates/next/package.json +40 -0
  42. package/templates/next/postcss.config.mjs +3 -0
  43. package/templates/next/public/media/favicon.svg +1 -0
  44. package/templates/next/public/media/logo.svg +1 -0
  45. package/templates/next/public/media/placeholder.svg +1 -0
  46. package/templates/next/tsconfig.json +27 -0
  47. package/templates/next/tsconfig.tsbuildinfo +1 -0
  48. package/templates/parish/.github/workflows/deploy.yml +49 -0
  49. package/templates/parish/.gitlab-ci.yml +18 -0
  50. package/templates/parish/README.md +121 -0
  51. package/templates/parish/_gitignore +2 -0
  52. package/templates/parish/blocks/installed/index.ts +7 -0
  53. package/templates/parish/blocks/mass-times.tsx +59 -0
  54. package/templates/parish/blocks/notice.tsx +46 -0
  55. package/templates/parish/blocks/scripture.tsx +40 -0
  56. package/templates/parish/components.json +24 -0
  57. package/templates/parish/content/collections/bulletins/2026-09-27.json +8 -0
  58. package/templates/parish/content/collections/bulletins/2026-10-04.json +8 -0
  59. package/templates/parish/content/collections/bulletins/_collection.json +113 -0
  60. package/templates/parish/content/collections/events/_collection.json +157 -0
  61. package/templates/parish/content/collections/events/advent-penance-service.json +12 -0
  62. package/templates/parish/content/collections/events/all-souls.json +12 -0
  63. package/templates/parish/content/collections/events/christmas-concert.json +12 -0
  64. package/templates/parish/content/collections/events/fall-festival.json +12 -0
  65. package/templates/parish/content/collections/news/_collection.json +113 -0
  66. package/templates/parish/content/collections/news/food-drive.json +10 -0
  67. package/templates/parish/content/collections/news/new-website.json +10 -0
  68. package/templates/parish/content/collections/news/youth-group.json +10 -0
  69. package/templates/parish/content/collections/staff/_collection.json +34 -0
  70. package/templates/parish/content/collections/staff/david-okafor.json +9 -0
  71. package/templates/parish/content/collections/staff/fr-thomas-reed.json +9 -0
  72. package/templates/parish/content/collections/staff/maria-chen.json +9 -0
  73. package/templates/parish/content/collections/staff/sarah-lindqvist.json +9 -0
  74. package/templates/parish/content/layout/footer.json +142 -0
  75. package/templates/parish/content/layout/header.json +54 -0
  76. package/templates/parish/content/menus.json +63 -0
  77. package/templates/parish/content/pages/404.json +85 -0
  78. package/templates/parish/content/pages/about.json +110 -0
  79. package/templates/parish/content/pages/bulletins.json +64 -0
  80. package/templates/parish/content/pages/contact.json +180 -0
  81. package/templates/parish/content/pages/events.json +91 -0
  82. package/templates/parish/content/pages/index.json +423 -0
  83. package/templates/parish/content/pages/mass-times.json +168 -0
  84. package/templates/parish/content/pages/news.json +55 -0
  85. package/templates/parish/content/pages/sacraments.json +259 -0
  86. package/templates/parish/content/site.json +35 -0
  87. package/templates/parish/content/styles/custom.css +4 -0
  88. package/templates/parish/goodfellow.config.tsx +24 -0
  89. package/templates/parish/package.json +36 -0
  90. package/templates/parish/public/media/bulletin-example.pdf +32 -0
  91. package/templates/parish/public/media/candles.svg +22 -0
  92. package/templates/parish/public/media/church.svg +33 -0
  93. package/templates/parish/public/media/favicon.svg +5 -0
  94. package/templates/parish/public/media/gathering.svg +18 -0
  95. package/templates/parish/public/media/logo.svg +5 -0
  96. package/templates/parish/public/media/person.svg +5 -0
  97. package/templates/parish/public/media/placeholder.svg +5 -0
  98. package/templates/parish/src/styles.css +8 -0
  99. package/templates/parish/tsconfig.json +14 -0
  100. package/templates/parish/vercel.json +7 -0
  101. package/templates/registry/accordion.json +17 -0
  102. package/templates/registry/alert.json +16 -0
  103. package/templates/registry/badge.json +17 -0
  104. package/templates/registry/button.json +17 -0
  105. package/templates/registry/card.json +16 -0
  106. package/templates/registry/carousel.json +19 -0
  107. package/templates/registry/custom-html.json +31 -0
  108. package/templates/registry/registry.json +364 -0
  109. package/templates/registry/shadcn-call-to-action.json +26 -0
  110. package/templates/registry/shadcn-cards.json +26 -0
  111. package/templates/registry/shadcn-carousel.json +29 -0
  112. package/templates/registry/shadcn-faq.json +30 -0
  113. package/templates/registry/shadcn-hero.json +25 -0
  114. package/templates/registry/shadcn-notice.json +27 -0
  115. package/templates/registry/shadcn-pricing.json +28 -0
  116. package/templates/registry/shadcn-tabs.json +30 -0
  117. package/templates/registry/shadcn-testimonials.json +25 -0
  118. package/templates/registry/tabs.json +17 -0
  119. package/templates/starter/.github/workflows/deploy.yml +49 -0
  120. package/templates/starter/.gitlab-ci.yml +18 -0
  121. package/templates/starter/README.md +101 -0
  122. package/templates/starter/_gitignore +2 -0
  123. package/templates/starter/blocks/installed/index.ts +7 -0
  124. package/templates/starter/components.json +24 -0
  125. package/templates/starter/content/collections/news/_collection.json +113 -0
  126. package/templates/starter/content/collections/news/open-house.json +9 -0
  127. package/templates/starter/content/collections/news/welcome.json +10 -0
  128. package/templates/starter/content/layout/footer.json +55 -0
  129. package/templates/starter/content/layout/header.json +54 -0
  130. package/templates/starter/content/menus.json +25 -0
  131. package/templates/starter/content/pages/404.json +73 -0
  132. package/templates/starter/content/pages/about.json +59 -0
  133. package/templates/starter/content/pages/index.json +215 -0
  134. package/templates/starter/content/pages/news.json +55 -0
  135. package/templates/starter/content/site.json +25 -0
  136. package/templates/starter/content/styles/custom.css +4 -0
  137. package/templates/starter/goodfellow.config.tsx +17 -0
  138. package/templates/starter/package.json +36 -0
  139. package/templates/starter/public/media/favicon.svg +1 -0
  140. package/templates/starter/public/media/logo.svg +1 -0
  141. package/templates/starter/public/media/placeholder.svg +1 -0
  142. package/templates/starter/src/styles.css +8 -0
  143. package/templates/starter/tsconfig.json +14 -0
  144. package/templates/starter/vercel.json +7 -0
  145. package/templates/versions.json +13 -0
@@ -0,0 +1,18 @@
1
+ # Builds the site and publishes it with GitLab Pages whenever the default
2
+ # branch changes (including every Publish in the admin panel). For nightly
3
+ # rebuilds, add a schedule under Build → Pipeline schedules. See README.md.
4
+ pages:
5
+ image: node:22
6
+ cache:
7
+ key:
8
+ files: [package-lock.json]
9
+ paths: [.npm/, .next/cache/]
10
+ script:
11
+ - npm ci --cache .npm --prefer-offline
12
+ # Pages may serve the site from a subfolder, such as https://group.gitlab.io/site/.
13
+ - export GOODFELLOW_BASE="$(node -e 'console.log(new URL(process.env.CI_PAGES_URL).pathname)')"
14
+ - npx next build
15
+ pages:
16
+ publish: out
17
+ rules:
18
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
@@ -0,0 +1,120 @@
1
+ # My site
2
+
3
+ A website built with [Goodfellow](https://github.com/chartung17/goodfellow-cms) and [Next.js](https://nextjs.org). Pages are files in `content/`, edited in the admin panel at `/admin`, and built into static files that a free host serves.
4
+
5
+ ## Working on the site
6
+
7
+ <!-- goodfellow-repository -->
8
+ > **In the Goodfellow repository**, this folder is part of a pnpm workspace, so `npm install` doesn't work here. From the repository's root, run `pnpm install` and `pnpm build` (get pnpm with `corepack enable`, or `npm install -g pnpm`), then `pnpm dev` in this folder. The `npm` commands below are for a site of your own, created with `npm create goodfellow`, which leaves this note out.
9
+ <!-- /goodfellow-repository -->
10
+
11
+ ```sh
12
+ npm install
13
+ npm run dev # site at http://localhost:4321, admin panel at http://localhost:4321/admin
14
+ npm run build # builds the site into out/
15
+ ```
16
+
17
+ On your own computer, the admin panel saves straight to the files in `content/`. To see the built site as a host would serve it, serve `out/` with any static server, such as `npx serve out`.
18
+
19
+ The News page and its stories are an example of a collection: a group of similar items that share one page design. Change it or delete it under **Collections** in the admin panel.
20
+
21
+ ## How it fits together
22
+
23
+ | File | What it does |
24
+ |---|---|
25
+ | `goodfellow.config.tsx` | The site's blocks and where it's stored, shared by its pages and the admin panel |
26
+ | `app/(site)/layout.tsx` | The site's header and footer, shown once around every page, so they stay as they are when moving between pages |
27
+ | `app/(site)/[[...path]]/page.tsx` | Every page in `content/`, rendered as Server Components. Links between pages use `next/link`, and images `next/image`. |
28
+ | `app/not-found.tsx` | The site's "Page not found" page, `content/pages/404.json` |
29
+ | `app/admin/page.tsx` | The admin panel |
30
+ | `app/admin/demo-content.json/route.ts` | For a [demo](https://github.com/chartung17/goodfellow-cms#demo-mode) (`demo: true` in the config), the copy of the content its admin panel starts from |
31
+ | `app/site.css` | The site's styles: Tailwind, the theme, and the custom CSS from the admin panel |
32
+ | `app/layout.tsx`, `app/sitemap.ts`, `app/robots.ts` | The page around everything, and files for search engines |
33
+ | `next.config.ts` | `withGoodfellow()` builds static files, serves the site from a subfolder when the host needs it, and runs the admin panel's local backend in `next dev` |
34
+
35
+ Your own Next.js pages can go beside these, in `app/`, and import from the project root as `@/`, such as `@/lib/site`.
36
+
37
+ More blocks, such as an FAQ, tabs and a pricing table, can be added on the admin panel's **Blocks** screen, which publishes their code into `blocks/installed/` and the shadcn components they use into `components/ui/`. See [Blocks from block registries](https://github.com/chartung17/goodfellow-cms#blocks-from-block-registries).
38
+
39
+ Blocks are React components in `blocks/`, added to the editor in `goodfellow.config.tsx`. For links and images, use `SiteLink` and `SiteImage` from `@goodfellow-cms/react` rather than `<a>` and `<img>`, so they follow the site's address and use `next/link` and `next/image`. Read the site's settings, menus and collections with `useSite()`.
40
+
41
+ Interactive parts of a block go in a Client Component: a file starting with `"use client"`, which can use any React hooks and runs in the browser. Pass it plain values and content such as `children`, not functions. `useSite()` works there too.
42
+
43
+ Images are served as they are. To resize them and convert them to modern formats, set a [custom image loader](https://nextjs.org/docs/app/api-reference/components/image#loader) for a service such as Cloudinary under `images` in `withGoodfellow({ ... })`.
44
+
45
+ ## Putting the site online
46
+
47
+ Setup takes four steps. It's done once, usually by whoever set up the site.
48
+
49
+ ### 1. Store the site on GitHub or GitLab
50
+
51
+ Create a repository and push this folder to it, including `package-lock.json`.
52
+
53
+ ### 2. Tell Goodfellow where the site is stored
54
+
55
+ If you gave the repository when creating the site with `npm create goodfellow`, this is already done. Otherwise, in `goodfellow.config.tsx`, uncomment one `backend` line and its `import`, and fill in your repository:
56
+
57
+ ```tsx
58
+ import { github } from "@goodfellow-cms/github";
59
+
60
+ export default defineConfig({
61
+ blocks,
62
+ categories,
63
+ backend: github({ repo: "your-name/your-site" }),
64
+ });
65
+ ```
66
+
67
+ Until a backend is set, the admin panel on the live site only says it isn't set up yet. If the live site is built from a branch other than the repository's default branch, add `branch: "name"`.
68
+
69
+ Also set the site's address under **Site settings → General → Site address**, including any subfolder (such as `https://your-name.github.io/your-site`). It's used for the sitemap and for link previews.
70
+
71
+ ### 3. Choose a host
72
+
73
+ Each host's free plan has its own rules about business use. If the site is for a business, sells anything, shows ads, or is built or looked after by someone who's paid for it, check those rules first. As of October 2026, GitHub Pages and Vercel's free plan don't allow most of these, and GitLab Pages has no rule against them that we know of. See [Commercial sites](https://github.com/chartung17/goodfellow-cms#requirements-and-limits) in Goodfellow's README.
74
+
75
+ **GitHub Pages** (free for public repositories; not for online businesses or shops)
76
+
77
+ 1. In the repository on GitHub, go to **Settings → Pages** and set **Source** to **GitHub Actions**.
78
+ 2. Push. `.github/workflows/deploy.yml` builds and publishes the site on every change and once a night. If your main branch isn't called `main`, change it in that file.
79
+
80
+ **GitLab Pages** (free, including for private projects; no rule against business sites that we know of)
81
+
82
+ 1. Push. `.gitlab-ci.yml` builds and publishes the site on every change to the default branch.
83
+ 2. For nightly rebuilds, add a schedule under **Build → Pipeline schedules**.
84
+ 3. The site's address is under **Deploy → Pages**.
85
+
86
+ **Vercel** (works with GitHub and GitLab; the free plan is for non-commercial sites only)
87
+
88
+ 1. Import the repository in Vercel, which recognizes it as a Next.js site.
89
+ 2. For nightly rebuilds, create a deploy hook under **Settings → Git → Deploy Hooks**, and call it from a scheduled GitHub Action or GitLab pipeline schedule.
90
+
91
+ Delete the setup files for the hosts you don't use.
92
+
93
+ ### 4. Set up sign-in
94
+
95
+ **GitHub:** nothing to set up. Editors sign in at `/admin` with an access token. The admin panel links to GitHub's token page with the right permissions already chosen. On that page, under **Repository access**, choose **Only select repositories** and pick the site.
96
+
97
+ - Editors who are collaborators on someone else's personal repository can't use that kind of token. They can use the "broader token" link instead. Alternatively, move the repository into a free GitHub organization and make editors members.
98
+
99
+ **GitLab:** editors can sign in with an access token straight away. For one-click **Sign in with GitLab**, register the admin panel with GitLab once:
100
+
101
+ 1. Go to your profile's **Preferences → Applications** (or the group's **Settings → Applications**) and add an application.
102
+ 2. Set:
103
+ - **Redirect URI:** the admin panel's address with a trailing slash, such as `https://your-site.example/admin/`.
104
+ - **Confidential:** leave this **off**.
105
+ - **Scopes:** `api`.
106
+ 3. Copy the **Application ID** into the config: `gitlab({ project: "your-name/your-site", clientId: "…" })`.
107
+
108
+ Every editor needs permission to change the repository: on GitHub, write access; on GitLab, the Developer role or higher.
109
+
110
+ ## Images and files
111
+
112
+ Upload images and files on the admin panel's **Media** screen, or with the **Choose image** button wherever an image goes. They're saved in `public/media/`, and large photos are made web-sized automatically.
113
+
114
+ ## Writing with AI
115
+
116
+ The admin panel's **AI** tab can draft pages, rewrite blocks and fill in news stories. Each editor picks an AI service there. Claude and some others need the editor's own API key and charge for use; there are free options, including copying the request into a chat app such as Claude.ai. To offer only some services, or to turn the assistant off, see `ai` in [Goodfellow's README](https://github.com/chartung17/goodfellow-cms#ai-services).
117
+
118
+ ## Publishing
119
+
120
+ Each **Publish** in the admin panel saves its changes as one commit to the main branch, which starts a new build. The admin panel shows when the live site has been updated, usually within a minute or two. If someone else changed the same page in the meantime, publishing stops and explains what happened, instead of overwriting their work.
@@ -0,0 +1,5 @@
1
+ node_modules/
2
+ .next/
3
+ out/
4
+ next-env.d.ts
5
+ *.tsbuildinfo
@@ -0,0 +1,8 @@
1
+ import { site } from "@/lib/site";
2
+ import "@/app/site.css";
3
+
4
+ // Builds every page in content/. Other addresses show "Page not found": a static host has no file for
5
+ // them, and in `next dev` the page isn't found. (`dynamicParams` stays on, so `next dev` shows new pages at once.)
6
+ export const generateStaticParams = site.generateStaticParams;
7
+ export const generateMetadata = site.generateMetadata;
8
+ export default site.Page;
@@ -0,0 +1,5 @@
1
+ import { site } from "@/lib/site";
2
+ import "@/app/site.css";
3
+
4
+ // The site's header and footer, shown once around every page, so they stay as they are when moving between pages.
5
+ export default site.Layout;
@@ -0,0 +1,5 @@
1
+ import { site } from "@/lib/site";
2
+
3
+ // The copy of the site's content a demo's admin panel starts from, when the config sets `demo`.
4
+ export const dynamic = "force-static";
5
+ export const GET = site.demoContent;
@@ -0,0 +1,8 @@
1
+ import type { Metadata } from "next";
2
+ import type { ReactNode } from "react";
3
+
4
+ export const metadata: Metadata = { title: "Site admin", robots: { index: false } };
5
+
6
+ export default function AdminLayout({ children }: { children: ReactNode }) {
7
+ return children;
8
+ }
@@ -0,0 +1,8 @@
1
+ "use client";
2
+
3
+ import { GoodfellowAdmin } from "@goodfellow-cms/next/admin";
4
+ import config from "@/goodfellow.config";
5
+
6
+ export default function AdminPage() {
7
+ return <GoodfellowAdmin config={config} />;
8
+ }
@@ -0,0 +1,11 @@
1
+ import { loadSite } from "@goodfellow-cms/next";
2
+ import type { ReactNode } from "react";
3
+
4
+ export default async function RootLayout({ children }: { children: ReactNode }) {
5
+ const { settings } = await loadSite();
6
+ return (
7
+ <html lang={settings.language}>
8
+ <body>{children}</body>
9
+ </html>
10
+ );
11
+ }
@@ -0,0 +1,4 @@
1
+ import { site } from "@/lib/site";
2
+ import "@/app/site.css";
3
+
4
+ export default site.NotFound;
@@ -0,0 +1,4 @@
1
+ import { site } from "@/lib/site";
2
+
3
+ export const dynamic = "force-static";
4
+ export default site.robots;
@@ -0,0 +1,11 @@
1
+ /* The site's styles, used by its pages but not the admin panel. */
2
+ @import "tailwindcss";
3
+ /* Animations for blocks installed from block registries, such as an FAQ's opening answers. */
4
+ @import "tw-animate-css";
5
+ @import "@goodfellow-cms/react/theme.css";
6
+ @import "@goodfellow-cms/blocks/styles.css";
7
+ /* Site-wide CSS written in the admin panel. */
8
+ @import "../content/styles/custom.css";
9
+
10
+ /* Lets Tailwind find class names typed into the editor. */
11
+ @source "../content";
@@ -0,0 +1,4 @@
1
+ import { site } from "@/lib/site";
2
+
3
+ export const dynamic = "force-static";
4
+ export default site.sitemap;
@@ -0,0 +1,7 @@
1
+ // Written by the admin panel when blocks are installed or removed. Don't edit it by hand.
2
+ import type { ComponentConfig, Config } from "@puckeditor/core";
3
+
4
+ // biome-ignore lint/suspicious/noExplicitAny: blocks have arbitrary props
5
+ export const installedBlocks: Record<string, ComponentConfig<any>> = {};
6
+
7
+ export const installedCategories: NonNullable<Config["categories"]> = {};
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "app/site.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "lucide",
14
+ "aliases": {
15
+ "components": "@/components",
16
+ "utils": "@/lib/utils",
17
+ "ui": "@/components/ui",
18
+ "lib": "@/lib",
19
+ "hooks": "@/hooks"
20
+ },
21
+ "registries": {
22
+ "@goodfellow": "https://cdn.jsdelivr.net/npm/@goodfellow-cms/registry@latest/r/{name}.json"
23
+ }
24
+ }
@@ -0,0 +1,113 @@
1
+ {
2
+ "version": 1,
3
+ "entryName": "News story",
4
+ "fields": [
5
+ {
6
+ "type": "text",
7
+ "label": "Title",
8
+ "name": "title",
9
+ "required": true
10
+ },
11
+ {
12
+ "type": "date",
13
+ "label": "Date",
14
+ "name": "date",
15
+ "required": true
16
+ },
17
+ {
18
+ "type": "textarea",
19
+ "hint": "One or two sentences, shown in lists of news.",
20
+ "label": "Summary",
21
+ "name": "summary"
22
+ },
23
+ {
24
+ "type": "image",
25
+ "label": "Image",
26
+ "name": "image"
27
+ },
28
+ {
29
+ "type": "richtext",
30
+ "label": "Text",
31
+ "name": "text"
32
+ }
33
+ ],
34
+ "name": "News",
35
+ "path": "/news/{slug}",
36
+ "sort": {
37
+ "field": "date",
38
+ "order": "desc"
39
+ },
40
+ "template": {
41
+ "content": [
42
+ {
43
+ "type": "Section",
44
+ "props": {
45
+ "id": "Section-news",
46
+ "background": "none",
47
+ "backgroundImage": "",
48
+ "className": "",
49
+ "content": [
50
+ {
51
+ "type": "EntryField",
52
+ "props": {
53
+ "id": "EntryField-date",
54
+ "className": "",
55
+ "field": "date",
56
+ "style": "small"
57
+ }
58
+ },
59
+ {
60
+ "type": "EntryField",
61
+ "props": {
62
+ "id": "EntryField-title",
63
+ "className": "mt-2",
64
+ "field": "title",
65
+ "style": "title"
66
+ }
67
+ },
68
+ {
69
+ "type": "EntryField",
70
+ "props": {
71
+ "id": "EntryField-image",
72
+ "className": "mt-8",
73
+ "field": "image",
74
+ "style": "text"
75
+ }
76
+ },
77
+ {
78
+ "type": "EntryField",
79
+ "props": {
80
+ "id": "EntryField-text",
81
+ "className": "mt-8",
82
+ "field": "text",
83
+ "style": "text"
84
+ }
85
+ },
86
+ {
87
+ "type": "Button",
88
+ "props": {
89
+ "id": "Button-news",
90
+ "className": "mt-10",
91
+ "href": "/news",
92
+ "label": "All news",
93
+ "newTab": false,
94
+ "size": "md",
95
+ "variant": "outline"
96
+ }
97
+ }
98
+ ],
99
+ "padding": "lg",
100
+ "width": "narrow"
101
+ }
102
+ }
103
+ ],
104
+ "root": {
105
+ "props": {
106
+ "className": "",
107
+ "description": "{summary}",
108
+ "image": "{image}",
109
+ "title": "{title}"
110
+ }
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 1,
3
+ "fields": {
4
+ "date": "2026-09-20",
5
+ "summary": "Drop in any time between 10 and 2 to meet everyone.",
6
+ "text": "<p>Everyone is welcome. Refreshments will be served.</p>",
7
+ "title": "Open house this Saturday"
8
+ }
9
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 1,
3
+ "fields": {
4
+ "date": "2026-10-01",
5
+ "image": "/media/placeholder.svg",
6
+ "summary": "Our new site is easier to keep up to date, so you'll always find the latest news here.",
7
+ "text": "<p>This is a news story. Add your own on the <strong>Collections</strong> screen of the admin panel, and they'll appear on the news page in date order.</p>",
8
+ "title": "Welcome to our new website"
9
+ }
10
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "version": 1,
3
+ "data": {
4
+ "content": [
5
+ {
6
+ "type": "Section",
7
+ "props": {
8
+ "id": "Section-footer",
9
+ "background": "muted",
10
+ "backgroundImage": "",
11
+ "className": "",
12
+ "content": [
13
+ {
14
+ "type": "Flex",
15
+ "props": {
16
+ "id": "Flex-footer",
17
+ "align": "center",
18
+ "className": "",
19
+ "direction": "row",
20
+ "gap": "md",
21
+ "items": [
22
+ {
23
+ "type": "Text",
24
+ "props": {
25
+ "id": "Text-footer",
26
+ "align": "left",
27
+ "className": "text-sm text-muted-foreground",
28
+ "content": "<p>© My site. Built with Goodfellow.</p>"
29
+ }
30
+ },
31
+ {
32
+ "type": "Menu",
33
+ "props": {
34
+ "id": "Menu-footer",
35
+ "className": "text-sm",
36
+ "menu": "footer",
37
+ "orientation": "horizontal"
38
+ }
39
+ }
40
+ ],
41
+ "justify": "between",
42
+ "wrap": true
43
+ }
44
+ }
45
+ ],
46
+ "padding": "sm",
47
+ "width": "wide"
48
+ }
49
+ }
50
+ ],
51
+ "root": {
52
+ "props": {}
53
+ }
54
+ }
55
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "version": 1,
3
+ "data": {
4
+ "content": [
5
+ {
6
+ "type": "Section",
7
+ "props": {
8
+ "id": "Section-header",
9
+ "background": "none",
10
+ "backgroundImage": "",
11
+ "className": "",
12
+ "content": [
13
+ {
14
+ "type": "Flex",
15
+ "props": {
16
+ "id": "Flex-header",
17
+ "align": "center",
18
+ "className": "",
19
+ "direction": "row",
20
+ "gap": "md",
21
+ "items": [
22
+ {
23
+ "type": "SiteBrand",
24
+ "props": {
25
+ "id": "SiteBrand-header",
26
+ "className": "",
27
+ "show": "both"
28
+ }
29
+ },
30
+ {
31
+ "type": "Menu",
32
+ "props": {
33
+ "id": "Menu-main",
34
+ "className": "",
35
+ "menu": "main",
36
+ "orientation": "horizontal"
37
+ }
38
+ }
39
+ ],
40
+ "justify": "between",
41
+ "wrap": true
42
+ }
43
+ }
44
+ ],
45
+ "padding": "sm",
46
+ "width": "wide"
47
+ }
48
+ }
49
+ ],
50
+ "root": {
51
+ "props": {}
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "version": 1,
3
+ "menus": {
4
+ "footer": [
5
+ {
6
+ "href": "/about",
7
+ "label": "About"
8
+ }
9
+ ],
10
+ "main": [
11
+ {
12
+ "href": "/",
13
+ "label": "Home"
14
+ },
15
+ {
16
+ "href": "/about",
17
+ "label": "About"
18
+ },
19
+ {
20
+ "href": "/news",
21
+ "label": "News"
22
+ }
23
+ ]
24
+ }
25
+ }
@@ -0,0 +1,73 @@
1
+ {
2
+ "version": 1,
3
+ "data": {
4
+ "content": [
5
+ {
6
+ "type": "Section",
7
+ "props": {
8
+ "id": "Section-not-found",
9
+ "background": "none",
10
+ "backgroundImage": "",
11
+ "className": "",
12
+ "content": [
13
+ {
14
+ "type": "Heading",
15
+ "props": {
16
+ "id": "Heading-not-found",
17
+ "align": "center",
18
+ "className": "",
19
+ "level": "h1",
20
+ "text": "Page not found"
21
+ }
22
+ },
23
+ {
24
+ "type": "Text",
25
+ "props": {
26
+ "id": "Text-not-found",
27
+ "align": "center",
28
+ "className": "mt-4 text-muted-foreground",
29
+ "content": "<p>The page you're looking for doesn't exist or has moved.</p>"
30
+ }
31
+ },
32
+ {
33
+ "type": "Flex",
34
+ "props": {
35
+ "id": "Flex-not-found",
36
+ "align": "center",
37
+ "className": "mt-8",
38
+ "direction": "row",
39
+ "gap": "md",
40
+ "items": [
41
+ {
42
+ "type": "Button",
43
+ "props": {
44
+ "id": "Button-home",
45
+ "className": "",
46
+ "href": "/",
47
+ "label": "Go to the home page",
48
+ "newTab": false,
49
+ "size": "md",
50
+ "variant": "primary"
51
+ }
52
+ }
53
+ ],
54
+ "justify": "center",
55
+ "wrap": true
56
+ }
57
+ }
58
+ ],
59
+ "padding": "lg",
60
+ "width": "narrow"
61
+ }
62
+ }
63
+ ],
64
+ "root": {
65
+ "props": {
66
+ "className": "",
67
+ "description": "",
68
+ "image": "",
69
+ "title": "Page not found"
70
+ }
71
+ }
72
+ }
73
+ }