create-goodfellow 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +15 -2
- package/bin/create-goodfellow.js +2 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +220 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +2 -0
- package/dist/scaffold-BGxzPdN1.js +150 -0
- package/package.json +55 -3
- package/templates/next/.github/workflows/deploy.yml +86 -0
- package/templates/next/.gitlab-ci.yml +28 -0
- package/templates/next/README.md +127 -0
- package/templates/next/_gitignore +5 -0
- package/templates/next/app/(site)/[[...path]]/page.tsx +8 -0
- package/templates/next/app/(site)/layout.tsx +5 -0
- package/templates/next/app/admin/demo-content.json/route.ts +5 -0
- package/templates/next/app/admin/layout.tsx +8 -0
- package/templates/next/app/admin/page.tsx +8 -0
- package/templates/next/app/layout.tsx +11 -0
- package/templates/next/app/not-found.tsx +4 -0
- package/templates/next/app/robots.ts +4 -0
- package/templates/next/app/site.css +11 -0
- package/templates/next/app/sitemap.ts +4 -0
- package/templates/next/blocks/installed/index.ts +7 -0
- package/templates/next/components.json +24 -0
- package/templates/next/content/collections/news/_collection.json +113 -0
- package/templates/next/content/collections/news/open-house.json +9 -0
- package/templates/next/content/collections/news/welcome.json +10 -0
- package/templates/next/content/layout/footer.json +55 -0
- package/templates/next/content/layout/header.json +54 -0
- package/templates/next/content/menus.json +25 -0
- package/templates/next/content/pages/404.json +73 -0
- package/templates/next/content/pages/about.json +59 -0
- package/templates/next/content/pages/index.json +215 -0
- package/templates/next/content/pages/news.json +55 -0
- package/templates/next/content/site.json +25 -0
- package/templates/next/content/styles/custom.css +4 -0
- package/templates/next/goodfellow.config.tsx +17 -0
- package/templates/next/lib/site.ts +5 -0
- package/templates/next/next.config.ts +7 -0
- package/templates/next/package.json +40 -0
- package/templates/next/postcss.config.mjs +3 -0
- package/templates/next/public/media/favicon.svg +1 -0
- package/templates/next/public/media/logo.svg +1 -0
- package/templates/next/public/media/placeholder.svg +1 -0
- package/templates/next/tsconfig.json +27 -0
- package/templates/parish/.github/workflows/deploy.yml +84 -0
- package/templates/parish/.gitlab-ci.yml +28 -0
- package/templates/parish/README.md +128 -0
- package/templates/parish/_gitignore +2 -0
- package/templates/parish/blocks/installed/index.ts +7 -0
- package/templates/parish/blocks/mass-times.tsx +59 -0
- package/templates/parish/blocks/notice.tsx +46 -0
- package/templates/parish/blocks/scripture.tsx +40 -0
- package/templates/parish/components.json +24 -0
- package/templates/parish/content/collections/bulletins/2026-09-27.json +8 -0
- package/templates/parish/content/collections/bulletins/2026-10-04.json +8 -0
- package/templates/parish/content/collections/bulletins/_collection.json +113 -0
- package/templates/parish/content/collections/events/_collection.json +156 -0
- package/templates/parish/content/collections/events/advent-penance-service.json +14 -0
- package/templates/parish/content/collections/events/all-souls.json +14 -0
- package/templates/parish/content/collections/events/christmas-concert.json +14 -0
- package/templates/parish/content/collections/events/fall-festival.json +14 -0
- package/templates/parish/content/collections/events/youth-group.json +23 -0
- package/templates/parish/content/collections/news/_collection.json +137 -0
- package/templates/parish/content/collections/news/bell-tower-repairs.json +13 -0
- package/templates/parish/content/collections/news/choir-new-voices.json +14 -0
- package/templates/parish/content/collections/news/food-drive.json +13 -0
- package/templates/parish/content/collections/news/new-website.json +13 -0
- package/templates/parish/content/collections/news/winter-coats.json +13 -0
- package/templates/parish/content/collections/news/youth-group.json +13 -0
- package/templates/parish/content/collections/news/youth-service-day.json +14 -0
- package/templates/parish/content/collections/staff/_collection.json +34 -0
- package/templates/parish/content/collections/staff/david-okafor.json +9 -0
- package/templates/parish/content/collections/staff/fr-thomas-reed.json +9 -0
- package/templates/parish/content/collections/staff/maria-chen.json +9 -0
- package/templates/parish/content/collections/staff/sarah-lindqvist.json +9 -0
- package/templates/parish/content/layout/footer.json +142 -0
- package/templates/parish/content/layout/header.json +54 -0
- package/templates/parish/content/menus.json +67 -0
- package/templates/parish/content/pages/404.json +85 -0
- package/templates/parish/content/pages/about.json +153 -0
- package/templates/parish/content/pages/bulletins.json +64 -0
- package/templates/parish/content/pages/calendar.json +59 -0
- package/templates/parish/content/pages/contact.json +180 -0
- package/templates/parish/content/pages/events.json +107 -0
- package/templates/parish/content/pages/index.json +390 -0
- package/templates/parish/content/pages/mass-times.json +168 -0
- package/templates/parish/content/pages/news.json +68 -0
- package/templates/parish/content/pages/sacraments.json +259 -0
- package/templates/parish/content/site.json +36 -0
- package/templates/parish/content/styles/custom.css +4 -0
- package/templates/parish/goodfellow.config.tsx +24 -0
- package/templates/parish/package.json +36 -0
- package/templates/parish/public/media/bulletin-example.pdf +32 -0
- package/templates/parish/public/media/candles.svg +22 -0
- package/templates/parish/public/media/church.svg +33 -0
- package/templates/parish/public/media/favicon.svg +5 -0
- package/templates/parish/public/media/gathering.svg +18 -0
- package/templates/parish/public/media/logo.svg +5 -0
- package/templates/parish/public/media/person.svg +5 -0
- package/templates/parish/public/media/placeholder.svg +5 -0
- package/templates/parish/src/styles.css +8 -0
- package/templates/parish/tsconfig.json +14 -0
- package/templates/parish/vercel.ts +65 -0
- package/templates/registry/accordion.json +17 -0
- package/templates/registry/alert.json +16 -0
- package/templates/registry/badge.json +17 -0
- package/templates/registry/button.json +17 -0
- package/templates/registry/card.json +16 -0
- package/templates/registry/carousel.json +19 -0
- package/templates/registry/custom-html.json +31 -0
- package/templates/registry/registry.json +364 -0
- package/templates/registry/shadcn-call-to-action.json +26 -0
- package/templates/registry/shadcn-cards.json +26 -0
- package/templates/registry/shadcn-carousel.json +29 -0
- package/templates/registry/shadcn-faq.json +30 -0
- package/templates/registry/shadcn-hero.json +25 -0
- package/templates/registry/shadcn-notice.json +27 -0
- package/templates/registry/shadcn-pricing.json +28 -0
- package/templates/registry/shadcn-tabs.json +30 -0
- package/templates/registry/shadcn-testimonials.json +25 -0
- package/templates/registry/tabs.json +17 -0
- package/templates/starter/.github/workflows/deploy.yml +84 -0
- package/templates/starter/.gitlab-ci.yml +28 -0
- package/templates/starter/README.md +108 -0
- package/templates/starter/_gitignore +2 -0
- package/templates/starter/blocks/installed/index.ts +7 -0
- package/templates/starter/components.json +24 -0
- package/templates/starter/content/collections/news/_collection.json +113 -0
- package/templates/starter/content/collections/news/open-house.json +9 -0
- package/templates/starter/content/collections/news/welcome.json +10 -0
- package/templates/starter/content/layout/footer.json +55 -0
- package/templates/starter/content/layout/header.json +54 -0
- package/templates/starter/content/menus.json +25 -0
- package/templates/starter/content/pages/404.json +73 -0
- package/templates/starter/content/pages/about.json +59 -0
- package/templates/starter/content/pages/index.json +215 -0
- package/templates/starter/content/pages/news.json +55 -0
- package/templates/starter/content/site.json +25 -0
- package/templates/starter/content/styles/custom.css +4 -0
- package/templates/starter/goodfellow.config.tsx +17 -0
- package/templates/starter/package.json +36 -0
- package/templates/starter/public/media/favicon.svg +1 -0
- package/templates/starter/public/media/logo.svg +1 -0
- package/templates/starter/public/media/placeholder.svg +1 -0
- package/templates/starter/src/styles.css +8 -0
- package/templates/starter/tsconfig.json +14 -0
- package/templates/starter/vercel.ts +65 -0
- package/templates/versions.json +13 -0
|
@@ -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,59 @@
|
|
|
1
|
+
import { classNameField, cx } from "@goodfellow-cms/react";
|
|
2
|
+
import type { ComponentConfig } from "@puckeditor/core";
|
|
3
|
+
|
|
4
|
+
export interface MassTime {
|
|
5
|
+
day: string;
|
|
6
|
+
time: string;
|
|
7
|
+
note: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface MassTimesProps {
|
|
11
|
+
title: string;
|
|
12
|
+
times: MassTime[];
|
|
13
|
+
className: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** A list of Mass (or confession) times, each with a day, a time and an optional note. */
|
|
17
|
+
export const MassTimes: ComponentConfig<MassTimesProps> = {
|
|
18
|
+
label: "Mass times",
|
|
19
|
+
fields: {
|
|
20
|
+
title: { type: "text", label: "Heading", contentEditable: true },
|
|
21
|
+
times: {
|
|
22
|
+
type: "array",
|
|
23
|
+
label: "Times",
|
|
24
|
+
arrayFields: {
|
|
25
|
+
day: { type: "text", label: "Day", placeholder: "Sunday" },
|
|
26
|
+
time: { type: "text", label: "Time", placeholder: "10:30 am" },
|
|
27
|
+
note: { type: "text", label: "Note (optional)", placeholder: "Spanish, livestreamed…" },
|
|
28
|
+
},
|
|
29
|
+
defaultItemProps: { day: "Sunday", time: "10:30 am", note: "" },
|
|
30
|
+
getItemSummary: (item) => [item.day, item.time].filter(Boolean).join(", ") || "New time",
|
|
31
|
+
},
|
|
32
|
+
className: classNameField,
|
|
33
|
+
},
|
|
34
|
+
defaultProps: {
|
|
35
|
+
title: "Sunday Masses",
|
|
36
|
+
times: [
|
|
37
|
+
{ day: "Saturday", time: "5:00 pm", note: "Vigil" },
|
|
38
|
+
{ day: "Sunday", time: "10:30 am", note: "" },
|
|
39
|
+
],
|
|
40
|
+
className: "",
|
|
41
|
+
},
|
|
42
|
+
render: ({ title, times, className }) => (
|
|
43
|
+
<div className={cx("rounded-lg border border-border bg-background p-6 text-foreground", className)}>
|
|
44
|
+
{title && <h3 className="font-heading text-2xl font-semibold">{title}</h3>}
|
|
45
|
+
<dl className="mt-4 divide-y divide-border">
|
|
46
|
+
{times.map((item, index) => (
|
|
47
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: times have no ids, and can repeat
|
|
48
|
+
<div key={index} className="flex flex-wrap items-baseline justify-between gap-x-4 py-2">
|
|
49
|
+
<dt className="font-medium">{item.day}</dt>
|
|
50
|
+
<dd className="text-right">
|
|
51
|
+
{item.time}
|
|
52
|
+
{item.note && <span className="block text-sm text-muted-foreground">{item.note}</span>}
|
|
53
|
+
</dd>
|
|
54
|
+
</div>
|
|
55
|
+
))}
|
|
56
|
+
</dl>
|
|
57
|
+
</div>
|
|
58
|
+
),
|
|
59
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { classNameField, cx } from "@goodfellow-cms/react";
|
|
2
|
+
import type { ComponentConfig, RichText } from "@puckeditor/core";
|
|
3
|
+
|
|
4
|
+
type Tone = "subtle" | "highlight";
|
|
5
|
+
|
|
6
|
+
export interface NoticeProps {
|
|
7
|
+
title: string;
|
|
8
|
+
text: RichText;
|
|
9
|
+
tone: Tone;
|
|
10
|
+
className: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const toneClasses: Record<Tone, string> = {
|
|
14
|
+
subtle: "border-primary bg-muted text-foreground",
|
|
15
|
+
highlight: "border-secondary bg-accent text-accent-foreground",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/** A short announcement that stands out from the text around it, such as a change to the Mass schedule. */
|
|
19
|
+
export const Notice: ComponentConfig<NoticeProps> = {
|
|
20
|
+
label: "Notice",
|
|
21
|
+
fields: {
|
|
22
|
+
title: { type: "text", label: "Heading", contentEditable: true },
|
|
23
|
+
text: {
|
|
24
|
+
type: "richtext",
|
|
25
|
+
label: "Text",
|
|
26
|
+
contentEditable: true,
|
|
27
|
+
options: { link: { HTMLAttributes: { target: null, rel: null } } },
|
|
28
|
+
},
|
|
29
|
+
tone: {
|
|
30
|
+
type: "radio",
|
|
31
|
+
label: "Style",
|
|
32
|
+
options: [
|
|
33
|
+
{ value: "subtle", label: "Subtle" },
|
|
34
|
+
{ value: "highlight", label: "Highlighted" },
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
className: classNameField,
|
|
38
|
+
},
|
|
39
|
+
defaultProps: { title: "Please note", text: "<p>Write the announcement here.</p>", tone: "subtle", className: "" },
|
|
40
|
+
render: ({ title, text, tone, className }) => (
|
|
41
|
+
<aside className={cx("rounded-lg border-l-4 p-5", toneClasses[tone], className)}>
|
|
42
|
+
{title && <p className="font-heading text-lg font-semibold">{title}</p>}
|
|
43
|
+
<div className="gf-prose mt-1">{text}</div>
|
|
44
|
+
</aside>
|
|
45
|
+
),
|
|
46
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { classNameField, cx } from "@goodfellow-cms/react";
|
|
2
|
+
import type { ComponentConfig } from "@puckeditor/core";
|
|
3
|
+
|
|
4
|
+
export interface ScriptureProps {
|
|
5
|
+
text: string;
|
|
6
|
+
reference: string;
|
|
7
|
+
align: "left" | "center";
|
|
8
|
+
className: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const alignClasses: Record<ScriptureProps["align"], string> = { left: "text-left", center: "text-center mx-auto" };
|
|
12
|
+
|
|
13
|
+
/** A short passage of scripture, or any quotation, with where it's from. */
|
|
14
|
+
export const Scripture: ComponentConfig<ScriptureProps> = {
|
|
15
|
+
label: "Scripture quote",
|
|
16
|
+
fields: {
|
|
17
|
+
text: { type: "textarea", label: "Quotation" },
|
|
18
|
+
reference: { type: "text", label: "Where it's from", placeholder: "Matthew 11:28" },
|
|
19
|
+
align: {
|
|
20
|
+
type: "radio",
|
|
21
|
+
label: "Alignment",
|
|
22
|
+
options: [
|
|
23
|
+
{ value: "left", label: "Left" },
|
|
24
|
+
{ value: "center", label: "Center" },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
className: classNameField,
|
|
28
|
+
},
|
|
29
|
+
defaultProps: { text: "Write the quotation here.", reference: "", align: "center", className: "" },
|
|
30
|
+
render: ({ text, reference, align, className }) => (
|
|
31
|
+
<figure className={cx("max-w-3xl", alignClasses[align], className)}>
|
|
32
|
+
<blockquote className="font-heading text-2xl leading-snug text-balance italic md:text-3xl">{text}</blockquote>
|
|
33
|
+
{reference && (
|
|
34
|
+
<figcaption className="mt-4 text-sm font-semibold tracking-widest text-muted-foreground uppercase">
|
|
35
|
+
{reference}
|
|
36
|
+
</figcaption>
|
|
37
|
+
)}
|
|
38
|
+
</figure>
|
|
39
|
+
),
|
|
40
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "new-york",
|
|
4
|
+
"rsc": false,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "",
|
|
8
|
+
"css": "src/styles.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": "Bulletin",
|
|
4
|
+
"fields": [
|
|
5
|
+
{
|
|
6
|
+
"type": "text",
|
|
7
|
+
"hint": "Such as the Sunday's name.",
|
|
8
|
+
"label": "Title",
|
|
9
|
+
"name": "title",
|
|
10
|
+
"required": true
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"type": "date",
|
|
14
|
+
"label": "Date",
|
|
15
|
+
"name": "date",
|
|
16
|
+
"required": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"type": "link",
|
|
20
|
+
"hint": "Choose the bulletin's PDF, or upload it.",
|
|
21
|
+
"label": "Bulletin file",
|
|
22
|
+
"name": "file",
|
|
23
|
+
"required": true
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"name": "Bulletins",
|
|
27
|
+
"path": "/bulletins/{slug}",
|
|
28
|
+
"sort": {
|
|
29
|
+
"field": "date",
|
|
30
|
+
"order": "desc"
|
|
31
|
+
},
|
|
32
|
+
"template": {
|
|
33
|
+
"content": [
|
|
34
|
+
{
|
|
35
|
+
"type": "Section",
|
|
36
|
+
"props": {
|
|
37
|
+
"id": "Section-bulletin",
|
|
38
|
+
"background": "none",
|
|
39
|
+
"backgroundImage": "",
|
|
40
|
+
"className": "",
|
|
41
|
+
"content": [
|
|
42
|
+
{
|
|
43
|
+
"type": "EntryField",
|
|
44
|
+
"props": {
|
|
45
|
+
"id": "EntryField-date",
|
|
46
|
+
"className": "",
|
|
47
|
+
"field": "date",
|
|
48
|
+
"style": "small"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"type": "EntryField",
|
|
53
|
+
"props": {
|
|
54
|
+
"id": "EntryField-title",
|
|
55
|
+
"className": "mt-2",
|
|
56
|
+
"field": "title",
|
|
57
|
+
"style": "title"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"type": "Flex",
|
|
62
|
+
"props": {
|
|
63
|
+
"id": "Flex-bulletin",
|
|
64
|
+
"align": "center",
|
|
65
|
+
"className": "mt-8",
|
|
66
|
+
"direction": "row",
|
|
67
|
+
"gap": "md",
|
|
68
|
+
"items": [
|
|
69
|
+
{
|
|
70
|
+
"type": "Button",
|
|
71
|
+
"props": {
|
|
72
|
+
"id": "Button-download",
|
|
73
|
+
"className": "",
|
|
74
|
+
"href": "{file}",
|
|
75
|
+
"label": "Open the bulletin (PDF)",
|
|
76
|
+
"newTab": false,
|
|
77
|
+
"size": "md",
|
|
78
|
+
"variant": "primary"
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"type": "Button",
|
|
83
|
+
"props": {
|
|
84
|
+
"id": "Button-bulletins",
|
|
85
|
+
"className": "",
|
|
86
|
+
"href": "/bulletins",
|
|
87
|
+
"label": "All bulletins",
|
|
88
|
+
"newTab": false,
|
|
89
|
+
"size": "md",
|
|
90
|
+
"variant": "outline"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"justify": "start",
|
|
95
|
+
"wrap": true
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"padding": "lg",
|
|
100
|
+
"width": "narrow"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
"root": {
|
|
105
|
+
"props": {
|
|
106
|
+
"className": "",
|
|
107
|
+
"description": "The parish bulletin for {title}.",
|
|
108
|
+
"image": "",
|
|
109
|
+
"title": "{title}"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"calendar": {
|
|
4
|
+
"place": "place",
|
|
5
|
+
"summary": "summary",
|
|
6
|
+
"when": "when"
|
|
7
|
+
},
|
|
8
|
+
"entryName": "Event",
|
|
9
|
+
"fields": [
|
|
10
|
+
{
|
|
11
|
+
"type": "text",
|
|
12
|
+
"label": "Title",
|
|
13
|
+
"name": "title",
|
|
14
|
+
"required": true
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"type": "event",
|
|
18
|
+
"label": "Date and time",
|
|
19
|
+
"name": "when",
|
|
20
|
+
"required": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"type": "text",
|
|
24
|
+
"hint": "Such as the church or the parish hall.",
|
|
25
|
+
"label": "Place",
|
|
26
|
+
"name": "place"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"type": "textarea",
|
|
30
|
+
"hint": "One or two sentences, shown in lists of events.",
|
|
31
|
+
"label": "Summary",
|
|
32
|
+
"name": "summary"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"type": "image",
|
|
36
|
+
"label": "Picture",
|
|
37
|
+
"name": "image"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"type": "richtext",
|
|
41
|
+
"label": "Details",
|
|
42
|
+
"name": "text"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"name": "Events",
|
|
46
|
+
"path": "/events/{slug}",
|
|
47
|
+
"sort": {
|
|
48
|
+
"field": "when",
|
|
49
|
+
"order": "asc"
|
|
50
|
+
},
|
|
51
|
+
"template": {
|
|
52
|
+
"content": [
|
|
53
|
+
{
|
|
54
|
+
"type": "Section",
|
|
55
|
+
"props": {
|
|
56
|
+
"id": "Section-event",
|
|
57
|
+
"background": "none",
|
|
58
|
+
"backgroundImage": "",
|
|
59
|
+
"className": "",
|
|
60
|
+
"content": [
|
|
61
|
+
{
|
|
62
|
+
"type": "EntryField",
|
|
63
|
+
"props": {
|
|
64
|
+
"id": "EntryField-date",
|
|
65
|
+
"className": "",
|
|
66
|
+
"field": "when",
|
|
67
|
+
"style": "small"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"type": "EntryField",
|
|
72
|
+
"props": {
|
|
73
|
+
"id": "EntryField-title",
|
|
74
|
+
"className": "mt-2",
|
|
75
|
+
"field": "title",
|
|
76
|
+
"style": "title"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"type": "Flex",
|
|
81
|
+
"props": {
|
|
82
|
+
"id": "Flex-event-when",
|
|
83
|
+
"align": "center",
|
|
84
|
+
"className": "mt-4 text-lg",
|
|
85
|
+
"direction": "row",
|
|
86
|
+
"gap": "lg",
|
|
87
|
+
"items": [
|
|
88
|
+
{
|
|
89
|
+
"type": "EntryField",
|
|
90
|
+
"props": {
|
|
91
|
+
"id": "EntryField-place",
|
|
92
|
+
"className": "",
|
|
93
|
+
"field": "place",
|
|
94
|
+
"style": "text"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"justify": "start",
|
|
99
|
+
"wrap": true
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"type": "AddToCalendar",
|
|
104
|
+
"props": {
|
|
105
|
+
"id": "AddToCalendar-event",
|
|
106
|
+
"addLabel": "Add to calendar",
|
|
107
|
+
"className": "mt-4",
|
|
108
|
+
"otherCalendarsLabel": "Apple Calendar and others"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"type": "EntryField",
|
|
113
|
+
"props": {
|
|
114
|
+
"id": "EntryField-image",
|
|
115
|
+
"className": "mt-8",
|
|
116
|
+
"field": "image",
|
|
117
|
+
"style": "text"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"type": "EntryField",
|
|
122
|
+
"props": {
|
|
123
|
+
"id": "EntryField-text",
|
|
124
|
+
"className": "mt-8",
|
|
125
|
+
"field": "text",
|
|
126
|
+
"style": "text"
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"type": "Button",
|
|
131
|
+
"props": {
|
|
132
|
+
"id": "Button-events",
|
|
133
|
+
"className": "mt-10",
|
|
134
|
+
"href": "/events",
|
|
135
|
+
"label": "All events",
|
|
136
|
+
"newTab": false,
|
|
137
|
+
"size": "md",
|
|
138
|
+
"variant": "outline"
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
],
|
|
142
|
+
"padding": "lg",
|
|
143
|
+
"width": "narrow"
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
],
|
|
147
|
+
"root": {
|
|
148
|
+
"props": {
|
|
149
|
+
"className": "",
|
|
150
|
+
"description": "{summary}",
|
|
151
|
+
"image": "{image}",
|
|
152
|
+
"title": "{title}"
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"fields": {
|
|
4
|
+
"image": "/media/candles.svg",
|
|
5
|
+
"place": "Church",
|
|
6
|
+
"summary": "Prepare for Christmas with a short service and individual confession, with several priests available.",
|
|
7
|
+
"text": "<p>The service begins with readings and an examination of conscience, followed by the chance to go to confession. It usually ends by 8:30 pm.</p>",
|
|
8
|
+
"title": "Advent penance service",
|
|
9
|
+
"when": {
|
|
10
|
+
"end": "2026-12-09T20:30",
|
|
11
|
+
"start": "2026-12-09T19:00"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"fields": {
|
|
4
|
+
"image": "/media/candles.svg",
|
|
5
|
+
"place": "Church",
|
|
6
|
+
"summary": "On All Souls' Day, we pray for parishioners and loved ones who have died this year.",
|
|
7
|
+
"text": "<p>Families of those whose funerals were held at St. Joseph this year are invited to light a candle in their memory. Anyone may add a name to the Book of Remembrance at the back of the church.</p>",
|
|
8
|
+
"title": "Mass of Remembrance",
|
|
9
|
+
"when": {
|
|
10
|
+
"end": "2026-11-02T20:00",
|
|
11
|
+
"start": "2026-11-02T19:00"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"fields": {
|
|
4
|
+
"image": "/media/gathering.svg",
|
|
5
|
+
"place": "Church",
|
|
6
|
+
"summary": "The parish choir and children's choir sing carols old and new. Free, with a collection for the food pantry.",
|
|
7
|
+
"text": "<p>Bring family and friends for an afternoon of carols, followed by hot chocolate in the parish hall.</p>",
|
|
8
|
+
"title": "Christmas concert",
|
|
9
|
+
"when": {
|
|
10
|
+
"end": "2026-12-13T16:30",
|
|
11
|
+
"start": "2026-12-13T15:00"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"fields": {
|
|
4
|
+
"image": "/media/gathering.svg",
|
|
5
|
+
"place": "Church grounds",
|
|
6
|
+
"summary": "Food, games, music and a bake sale for the whole family.",
|
|
7
|
+
"text": "<p>Our biggest day of the year! There's a barbecue lunch, games and face painting for children, live music in the afternoon and the famous bake sale.</p><p>Volunteers are always welcome: sign up after any weekend Mass.</p>",
|
|
8
|
+
"title": "Fall festival",
|
|
9
|
+
"when": {
|
|
10
|
+
"end": "2026-10-17T17:00",
|
|
11
|
+
"start": "2026-10-17T11:00"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"fields": {
|
|
4
|
+
"image": "/media/gathering.svg",
|
|
5
|
+
"place": "Parish hall",
|
|
6
|
+
"summary": "Games, food and conversation for high school students, every Wednesday during the school year.",
|
|
7
|
+
"text": "<p>All high school students are welcome, whether or not they're parishioners. There's no youth group the day before Thanksgiving or over the Christmas break.</p>",
|
|
8
|
+
"title": "Youth group",
|
|
9
|
+
"when": {
|
|
10
|
+
"end": "2026-09-09T20:30",
|
|
11
|
+
"repeat": {
|
|
12
|
+
"every": "week",
|
|
13
|
+
"skip": [
|
|
14
|
+
"2026-11-25",
|
|
15
|
+
"2026-12-23",
|
|
16
|
+
"2026-12-30"
|
|
17
|
+
],
|
|
18
|
+
"until": "2027-06-09"
|
|
19
|
+
},
|
|
20
|
+
"start": "2026-09-09T19:00"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|