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,259 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"data": {
|
|
4
|
+
"content": [
|
|
5
|
+
{
|
|
6
|
+
"type": "Section",
|
|
7
|
+
"props": {
|
|
8
|
+
"id": "Section-sacraments",
|
|
9
|
+
"background": "none",
|
|
10
|
+
"backgroundImage": "",
|
|
11
|
+
"className": "",
|
|
12
|
+
"content": [
|
|
13
|
+
{
|
|
14
|
+
"type": "Heading",
|
|
15
|
+
"props": {
|
|
16
|
+
"id": "Heading-sacraments",
|
|
17
|
+
"align": "left",
|
|
18
|
+
"className": "",
|
|
19
|
+
"level": "h1",
|
|
20
|
+
"text": "Sacraments"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"type": "Text",
|
|
25
|
+
"props": {
|
|
26
|
+
"id": "Text-sacraments",
|
|
27
|
+
"align": "left",
|
|
28
|
+
"className": "mt-4 max-w-2xl text-lg text-muted-foreground",
|
|
29
|
+
"content": "<p>The sacraments mark the most important moments of our lives in faith. Here's how to arrange each one at St. Joseph.</p>"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "Grid",
|
|
34
|
+
"props": {
|
|
35
|
+
"id": "Grid-sacraments",
|
|
36
|
+
"className": "mt-10",
|
|
37
|
+
"columns": "2",
|
|
38
|
+
"gap": "md",
|
|
39
|
+
"items": [
|
|
40
|
+
{
|
|
41
|
+
"type": "Section",
|
|
42
|
+
"props": {
|
|
43
|
+
"id": "Section-baptism",
|
|
44
|
+
"background": "none",
|
|
45
|
+
"backgroundImage": "",
|
|
46
|
+
"className": "rounded-lg border px-2 py-6",
|
|
47
|
+
"content": [
|
|
48
|
+
{
|
|
49
|
+
"type": "Heading",
|
|
50
|
+
"props": {
|
|
51
|
+
"id": "Heading-baptism",
|
|
52
|
+
"align": "left",
|
|
53
|
+
"className": "",
|
|
54
|
+
"level": "h3",
|
|
55
|
+
"text": "Baptism"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"type": "Text",
|
|
60
|
+
"props": {
|
|
61
|
+
"id": "Text-baptism",
|
|
62
|
+
"align": "left",
|
|
63
|
+
"className": "mt-2 text-muted-foreground",
|
|
64
|
+
"content": "<p>We celebrate baptisms on Sunday afternoons. Parents and godparents come to one short preparation evening first. Contact the parish office at least two months ahead.</p>"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"padding": "none",
|
|
69
|
+
"width": "full"
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"type": "Section",
|
|
74
|
+
"props": {
|
|
75
|
+
"id": "Section-first-communion",
|
|
76
|
+
"background": "none",
|
|
77
|
+
"backgroundImage": "",
|
|
78
|
+
"className": "rounded-lg border px-2 py-6",
|
|
79
|
+
"content": [
|
|
80
|
+
{
|
|
81
|
+
"type": "Heading",
|
|
82
|
+
"props": {
|
|
83
|
+
"id": "Heading-first-communion",
|
|
84
|
+
"align": "left",
|
|
85
|
+
"className": "",
|
|
86
|
+
"level": "h3",
|
|
87
|
+
"text": "First Communion"
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"type": "Text",
|
|
92
|
+
"props": {
|
|
93
|
+
"id": "Text-first-communion",
|
|
94
|
+
"align": "left",
|
|
95
|
+
"className": "mt-2 text-muted-foreground",
|
|
96
|
+
"content": "<p>Children usually receive First Communion in second grade, after a year of preparation in our religious education program or the parish school.</p>"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"padding": "none",
|
|
101
|
+
"width": "full"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"type": "Section",
|
|
106
|
+
"props": {
|
|
107
|
+
"id": "Section-confirmation",
|
|
108
|
+
"background": "none",
|
|
109
|
+
"backgroundImage": "",
|
|
110
|
+
"className": "rounded-lg border px-2 py-6",
|
|
111
|
+
"content": [
|
|
112
|
+
{
|
|
113
|
+
"type": "Heading",
|
|
114
|
+
"props": {
|
|
115
|
+
"id": "Heading-confirmation",
|
|
116
|
+
"align": "left",
|
|
117
|
+
"className": "",
|
|
118
|
+
"level": "h3",
|
|
119
|
+
"text": "Confirmation"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"type": "Text",
|
|
124
|
+
"props": {
|
|
125
|
+
"id": "Text-confirmation",
|
|
126
|
+
"align": "left",
|
|
127
|
+
"className": "mt-2 text-muted-foreground",
|
|
128
|
+
"content": "<p>Young people prepare for Confirmation over two years, starting in eighth grade. Adults who want to be confirmed are welcome to join our adult program.</p>"
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
],
|
|
132
|
+
"padding": "none",
|
|
133
|
+
"width": "full"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"type": "Section",
|
|
138
|
+
"props": {
|
|
139
|
+
"id": "Section-marriage",
|
|
140
|
+
"background": "none",
|
|
141
|
+
"backgroundImage": "",
|
|
142
|
+
"className": "rounded-lg border px-2 py-6",
|
|
143
|
+
"content": [
|
|
144
|
+
{
|
|
145
|
+
"type": "Heading",
|
|
146
|
+
"props": {
|
|
147
|
+
"id": "Heading-marriage",
|
|
148
|
+
"align": "left",
|
|
149
|
+
"className": "",
|
|
150
|
+
"level": "h3",
|
|
151
|
+
"text": "Marriage"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"type": "Text",
|
|
156
|
+
"props": {
|
|
157
|
+
"id": "Text-marriage",
|
|
158
|
+
"align": "left",
|
|
159
|
+
"className": "mt-2 text-muted-foreground",
|
|
160
|
+
"content": "<p>Congratulations! Please contact the parish office at least six months before your wedding date, before booking a reception.</p>"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
"padding": "none",
|
|
165
|
+
"width": "full"
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"type": "Section",
|
|
170
|
+
"props": {
|
|
171
|
+
"id": "Section-reconciliation",
|
|
172
|
+
"background": "none",
|
|
173
|
+
"backgroundImage": "",
|
|
174
|
+
"className": "rounded-lg border px-2 py-6",
|
|
175
|
+
"content": [
|
|
176
|
+
{
|
|
177
|
+
"type": "Heading",
|
|
178
|
+
"props": {
|
|
179
|
+
"id": "Heading-reconciliation",
|
|
180
|
+
"align": "left",
|
|
181
|
+
"className": "",
|
|
182
|
+
"level": "h3",
|
|
183
|
+
"text": "Reconciliation"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"type": "Text",
|
|
188
|
+
"props": {
|
|
189
|
+
"id": "Text-reconciliation",
|
|
190
|
+
"align": "left",
|
|
191
|
+
"className": "mt-2 text-muted-foreground",
|
|
192
|
+
"content": "<p>Confession is offered every week, or by appointment. See the <a href=\"/mass-times\">Mass times</a> page.</p>"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
"padding": "none",
|
|
197
|
+
"width": "full"
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"type": "Section",
|
|
202
|
+
"props": {
|
|
203
|
+
"id": "Section-anointing",
|
|
204
|
+
"background": "none",
|
|
205
|
+
"backgroundImage": "",
|
|
206
|
+
"className": "rounded-lg border px-2 py-6",
|
|
207
|
+
"content": [
|
|
208
|
+
{
|
|
209
|
+
"type": "Heading",
|
|
210
|
+
"props": {
|
|
211
|
+
"id": "Heading-anointing",
|
|
212
|
+
"align": "left",
|
|
213
|
+
"className": "",
|
|
214
|
+
"level": "h3",
|
|
215
|
+
"text": "Anointing of the sick"
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"type": "Text",
|
|
220
|
+
"props": {
|
|
221
|
+
"id": "Text-anointing",
|
|
222
|
+
"align": "left",
|
|
223
|
+
"className": "mt-2 text-muted-foreground",
|
|
224
|
+
"content": "<p>If someone is seriously ill, in hospital or about to have surgery, call the parish office, at any hour in an emergency.</p>"
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
],
|
|
228
|
+
"padding": "none",
|
|
229
|
+
"width": "full"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
]
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"type": "Text",
|
|
237
|
+
"props": {
|
|
238
|
+
"id": "Text-becoming-catholic",
|
|
239
|
+
"align": "left",
|
|
240
|
+
"className": "mt-12",
|
|
241
|
+
"content": "<h2>Becoming Catholic</h2><p>Adults who would like to learn about the Catholic faith, or to be baptized or received into the Church, are warmly invited to our weekly sessions from September to Easter. <a href=\"/contact\">Get in touch</a> to find out more.</p>"
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
],
|
|
245
|
+
"padding": "lg",
|
|
246
|
+
"width": "normal"
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
],
|
|
250
|
+
"root": {
|
|
251
|
+
"props": {
|
|
252
|
+
"className": "",
|
|
253
|
+
"description": "How to arrange baptisms, weddings, First Communion and the other sacraments.",
|
|
254
|
+
"image": "",
|
|
255
|
+
"title": "Sacraments"
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"contact": {
|
|
4
|
+
"address": "100 Church Street\nAnytown, ST 00000",
|
|
5
|
+
"email": "office@example.org",
|
|
6
|
+
"phone": "(555) 010-0100"
|
|
7
|
+
},
|
|
8
|
+
"description": "An example parish website made with Goodfellow. St. Joseph Parish, its people and its details are made up.",
|
|
9
|
+
"favicon": "/media/favicon.svg",
|
|
10
|
+
"language": "en",
|
|
11
|
+
"logo": {
|
|
12
|
+
"alt": "St. Joseph Parish",
|
|
13
|
+
"src": "/media/logo.svg"
|
|
14
|
+
},
|
|
15
|
+
"theme": {
|
|
16
|
+
"colors": {
|
|
17
|
+
"accent": "#f3ecda",
|
|
18
|
+
"accentForeground": "#1f3a5f",
|
|
19
|
+
"border": "#e6dfcf",
|
|
20
|
+
"muted": "#f7f4ec",
|
|
21
|
+
"mutedForeground": "#655f52",
|
|
22
|
+
"primary": "#1f3a5f",
|
|
23
|
+
"primaryForeground": "#ffffff",
|
|
24
|
+
"secondary": "#c9a227",
|
|
25
|
+
"secondaryForeground": "#1f2933"
|
|
26
|
+
},
|
|
27
|
+
"fonts": {
|
|
28
|
+
"body": "Source Sans 3",
|
|
29
|
+
"heading": "Cormorant Garamond"
|
|
30
|
+
},
|
|
31
|
+
"radius": "0.5rem"
|
|
32
|
+
},
|
|
33
|
+
"timeZone": "America/New_York",
|
|
34
|
+
"title": "St. Joseph Parish",
|
|
35
|
+
"titleTemplate": "%s | St. Joseph Parish"
|
|
36
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { blocks, categories } from "@goodfellow-cms/blocks";
|
|
2
|
+
import { defineConfig } from "@goodfellow-cms/core";
|
|
3
|
+
// import { github } from "@goodfellow-cms/github";
|
|
4
|
+
// import { gitlab } from "@goodfellow-cms/gitlab";
|
|
5
|
+
import { installedBlocks, installedCategories } from "./blocks/installed";
|
|
6
|
+
import { MassTimes } from "./blocks/mass-times";
|
|
7
|
+
import { Notice } from "./blocks/notice";
|
|
8
|
+
import { Scripture } from "./blocks/scripture";
|
|
9
|
+
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
// The built-in blocks, those installed from the admin panel's Blocks screen, and this site's own.
|
|
12
|
+
// Never rename a key: pages refer to blocks by it.
|
|
13
|
+
blocks: { ...blocks, ...installedBlocks, MassTimes, Scripture, Notice },
|
|
14
|
+
categories: {
|
|
15
|
+
...categories,
|
|
16
|
+
...installedCategories,
|
|
17
|
+
parish: { title: "Parish", components: ["MassTimes", "Scripture", "Notice"] },
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
// Where the site is stored. Once this is set, builds include the admin panel at /admin.
|
|
21
|
+
// See README.md for how to set up sign-in.
|
|
22
|
+
// backend: github({ repo: "your-name/your-site" }),
|
|
23
|
+
// backend: gitlab({ project: "your-name/your-site", clientId: "your-application-id" }),
|
|
24
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@goodfellow-cms/example-parish",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "goodfellow dev",
|
|
8
|
+
"build": "goodfellow build",
|
|
9
|
+
"preview": "goodfellow preview",
|
|
10
|
+
"typecheck": "tsc -p tsconfig.json"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@goodfellow-cms/admin": "workspace:*",
|
|
14
|
+
"@goodfellow-cms/blocks": "workspace:*",
|
|
15
|
+
"@goodfellow-cms/core": "workspace:*",
|
|
16
|
+
"@goodfellow-cms/github": "workspace:*",
|
|
17
|
+
"@goodfellow-cms/gitlab": "workspace:*",
|
|
18
|
+
"@goodfellow-cms/react": "workspace:*",
|
|
19
|
+
"@puckeditor/core": "0.23.0",
|
|
20
|
+
"class-variance-authority": "0.7.1",
|
|
21
|
+
"clsx": "2.1.1",
|
|
22
|
+
"cn": "0.4.0",
|
|
23
|
+
"embla-carousel-react": "8.6.0",
|
|
24
|
+
"lucide-react": "1.52.0",
|
|
25
|
+
"radix-ui": "1.7.0",
|
|
26
|
+
"react": "19.3.0",
|
|
27
|
+
"react-dom": "19.3.0",
|
|
28
|
+
"tailwind-merge": "3.7.0",
|
|
29
|
+
"tailwindcss": "4.3.3",
|
|
30
|
+
"tw-animate-css": "1.4.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"goodfellow": "workspace:*",
|
|
34
|
+
"@types/react": "^19.2.0"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
%PDF-1.4
|
|
2
|
+
1 0 obj
|
|
3
|
+
<< /Type /Catalog /Pages 2 0 R >>
|
|
4
|
+
endobj
|
|
5
|
+
2 0 obj
|
|
6
|
+
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
|
|
7
|
+
endobj
|
|
8
|
+
3 0 obj
|
|
9
|
+
<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Resources << /Font << /F1 5 0 R >> >> /Contents 4 0 R >>
|
|
10
|
+
endobj
|
|
11
|
+
4 0 obj
|
|
12
|
+
<< /Length 145 >>
|
|
13
|
+
stream
|
|
14
|
+
BT /F1 28 Tf 72 720 Td (St. Joseph Parish) Tj /F1 16 Tf 0 -40 Td (Example bulletin) Tj 0 -28 Td (Replace this file with your own bulletin.) Tj ET
|
|
15
|
+
endstream
|
|
16
|
+
endobj
|
|
17
|
+
5 0 obj
|
|
18
|
+
<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>
|
|
19
|
+
endobj
|
|
20
|
+
xref
|
|
21
|
+
0 6
|
|
22
|
+
0000000000 65535 f
|
|
23
|
+
0000000009 00000 n
|
|
24
|
+
0000000058 00000 n
|
|
25
|
+
0000000115 00000 n
|
|
26
|
+
0000000241 00000 n
|
|
27
|
+
0000000437 00000 n
|
|
28
|
+
trailer
|
|
29
|
+
<< /Size 6 /Root 1 0 R >>
|
|
30
|
+
startxref
|
|
31
|
+
507
|
|
32
|
+
%%EOF
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 675" preserveAspectRatio="xMidYMid slice">
|
|
2
|
+
<defs>
|
|
3
|
+
<radialGradient id="glow" cx="0.5" cy="0.45" r="0.6">
|
|
4
|
+
<stop offset="0" stop-color="#5a3d1e"/>
|
|
5
|
+
<stop offset="1" stop-color="#140d07"/>
|
|
6
|
+
</radialGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="1200" height="675" fill="url(#glow)"/>
|
|
9
|
+
<rect y="540" width="1200" height="135" fill="#2a1a0c"/>
|
|
10
|
+
<g fill="#f3ead7">
|
|
11
|
+
<rect x="380" y="330" width="60" height="215" rx="6"/>
|
|
12
|
+
<rect x="500" y="260" width="70" height="285" rx="6"/>
|
|
13
|
+
<rect x="630" y="300" width="64" height="245" rx="6"/>
|
|
14
|
+
<rect x="750" y="370" width="56" height="175" rx="6"/>
|
|
15
|
+
</g>
|
|
16
|
+
<g fill="#ffd36b">
|
|
17
|
+
<path d="M410 325 q-14 -26 0 -56 q14 30 0 56z"/>
|
|
18
|
+
<path d="M535 255 q-16 -30 0 -64 q16 34 0 64z"/>
|
|
19
|
+
<path d="M662 295 q-15 -28 0 -60 q15 32 0 60z"/>
|
|
20
|
+
<path d="M778 365 q-13 -24 0 -52 q13 28 0 52z"/>
|
|
21
|
+
</g>
|
|
22
|
+
</svg>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 900" preserveAspectRatio="xMidYMid slice">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
|
|
4
|
+
<stop offset="0" stop-color="#14263f"/>
|
|
5
|
+
<stop offset="0.6" stop-color="#2c4a72"/>
|
|
6
|
+
<stop offset="1" stop-color="#7a6a8a"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
</defs>
|
|
9
|
+
<rect width="1600" height="900" fill="url(#sky)"/>
|
|
10
|
+
<g fill="#f4e7c1" opacity="0.7">
|
|
11
|
+
<circle cx="180" cy="120" r="2"/><circle cx="420" cy="80" r="1.5"/><circle cx="640" cy="160" r="2"/>
|
|
12
|
+
<circle cx="900" cy="70" r="1.5"/><circle cx="1180" cy="130" r="2"/><circle cx="1450" cy="90" r="1.5"/>
|
|
13
|
+
<circle cx="300" cy="260" r="1.5"/><circle cx="1320" cy="240" r="1.5"/>
|
|
14
|
+
</g>
|
|
15
|
+
<circle cx="1380" cy="190" r="46" fill="#f4e7c1" opacity="0.85"/>
|
|
16
|
+
<path d="M0 720 Q400 640 800 700 T1600 680 V900 H0z" fill="#1b2f4b"/>
|
|
17
|
+
<g fill="#0f1d30">
|
|
18
|
+
<path d="M1010 420 l70 -90 l70 90 v360 h-140z"/>
|
|
19
|
+
<rect x="1074" y="250" width="12" height="90"/>
|
|
20
|
+
<rect x="1056" y="268" width="48" height="12"/>
|
|
21
|
+
<path d="M1150 520 l160 -120 l160 120 v260 h-320z"/>
|
|
22
|
+
</g>
|
|
23
|
+
<g fill="#e9b949">
|
|
24
|
+
<path d="M1066 470 a14 14 0 0 1 28 0 v50 h-28z"/>
|
|
25
|
+
<path d="M1066 580 a14 14 0 0 1 28 0 v50 h-28z"/>
|
|
26
|
+
<path d="M1200 600 a16 16 0 0 1 32 0 v60 h-32z"/>
|
|
27
|
+
<path d="M1294 600 a16 16 0 0 1 32 0 v60 h-32z"/>
|
|
28
|
+
<path d="M1388 600 a16 16 0 0 1 32 0 v60 h-32z"/>
|
|
29
|
+
<circle cx="1310" cy="500" r="24"/>
|
|
30
|
+
</g>
|
|
31
|
+
<path d="M1280 780 v-70 a30 30 0 0 1 60 0 v70z" fill="#c98f2a"/>
|
|
32
|
+
<path d="M0 800 Q500 740 1000 790 T1600 780 V900 H0z" fill="#0b1626"/>
|
|
33
|
+
</svg>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="St. Joseph Parish">
|
|
2
|
+
<circle cx="32" cy="32" r="30" fill="#1f3a5f"/>
|
|
3
|
+
<circle cx="32" cy="32" r="25" fill="none" stroke="#c9a227" stroke-width="2"/>
|
|
4
|
+
<path d="M29 14h6v10h9v6h-9v20h-6V30h-9v-6h9z" fill="#c9a227"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 675" preserveAspectRatio="xMidYMid slice">
|
|
2
|
+
<rect width="1200" height="675" fill="#f6efe0"/>
|
|
3
|
+
<path d="M0 120 Q300 200 600 120 T1200 120" fill="none" stroke="#8a7a5a" stroke-width="3"/>
|
|
4
|
+
<g fill="#e9b949">
|
|
5
|
+
<circle cx="100" cy="150" r="12"/><circle cx="250" cy="175" r="12"/><circle cx="400" cy="160" r="12"/>
|
|
6
|
+
<circle cx="550" cy="128" r="12"/><circle cx="700" cy="130" r="12"/><circle cx="850" cy="165" r="12"/>
|
|
7
|
+
<circle cx="1000" cy="170" r="12"/><circle cx="1130" cy="135" r="12"/>
|
|
8
|
+
</g>
|
|
9
|
+
<rect y="520" width="1200" height="155" fill="#d9c9a3"/>
|
|
10
|
+
<g>
|
|
11
|
+
<circle cx="230" cy="330" r="48" fill="#b5835a"/><rect x="170" y="390" width="120" height="180" rx="50" fill="#1f3a5f"/>
|
|
12
|
+
<circle cx="420" cy="350" r="44" fill="#e0b48a"/><rect x="365" y="405" width="110" height="165" rx="48" fill="#c9a227"/>
|
|
13
|
+
<circle cx="600" cy="320" r="50" fill="#8c5a3c"/><rect x="537" y="382" width="126" height="190" rx="52" fill="#7a3b3b"/>
|
|
14
|
+
<circle cx="780" cy="360" r="40" fill="#f0c9a0"/><rect x="730" y="410" width="100" height="160" rx="44" fill="#3f6b5a"/>
|
|
15
|
+
<circle cx="960" cy="335" r="46" fill="#a86f4c"/><rect x="902" y="393" width="116" height="180" rx="50" fill="#2c4a72"/>
|
|
16
|
+
<circle cx="690" cy="470" r="26" fill="#e0b48a"/><rect x="660" y="500" width="60" height="80" rx="26" fill="#e9b949"/>
|
|
17
|
+
</g>
|
|
18
|
+
</svg>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="St. Joseph Parish">
|
|
2
|
+
<circle cx="32" cy="32" r="30" fill="#1f3a5f"/>
|
|
3
|
+
<circle cx="32" cy="32" r="25" fill="none" stroke="#c9a227" stroke-width="2"/>
|
|
4
|
+
<path d="M29 14h6v10h9v6h-9v20h-6V30h-9v-6h9z" fill="#c9a227"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
/* Animations for blocks installed from block registries, such as an FAQ's opening answers. */
|
|
3
|
+
@import "tw-animate-css";
|
|
4
|
+
@import "@goodfellow-cms/react/theme.css";
|
|
5
|
+
@import "@goodfellow-cms/blocks/styles.css";
|
|
6
|
+
|
|
7
|
+
/* Lets Tailwind find class names typed into the editor. */
|
|
8
|
+
@source "../content";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"jsx": "react-jsx",
|
|
7
|
+
"strict": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"noEmit": true,
|
|
10
|
+
// As in shadcn/ui projects: blocks installed from block registries import from "@/components/ui/…".
|
|
11
|
+
"paths": { "@/*": ["./*"] }
|
|
12
|
+
},
|
|
13
|
+
"include": ["goodfellow.config.tsx", "blocks", "components", "lib", "hooks"]
|
|
14
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Vercel's settings for this site, which Vercel reads when it builds the site.
|
|
2
|
+
//
|
|
3
|
+
// Vercel also sends the redirects from Site Settings → Redirects (content/redirects.json) itself,
|
|
4
|
+
// so visitors go straight to the new address. Like the pages the build writes at old addresses
|
|
5
|
+
// for other hosts, a redirect from an address a page has is left out: pages always win.
|
|
6
|
+
// This file uses only Node's own modules, since Vercel may read it before installing packages.
|
|
7
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
|
|
10
|
+
export const config = {
|
|
11
|
+
framework: null,
|
|
12
|
+
installCommand: "npm ci",
|
|
13
|
+
buildCommand: "npx goodfellow build",
|
|
14
|
+
outputDirectory: "dist",
|
|
15
|
+
redirects: redirects(),
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
interface Redirect {
|
|
19
|
+
from: string;
|
|
20
|
+
to: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function readJson(file: string): Record<string, unknown> | undefined {
|
|
24
|
+
return existsSync(file) ? JSON.parse(readFileSync(file, "utf8")) : undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Every file in a folder and its folders, as paths inside it. */
|
|
28
|
+
function filesIn(dir: string): string[] {
|
|
29
|
+
if (!existsSync(dir)) return [];
|
|
30
|
+
return readdirSync(dir, { recursive: true, encoding: "utf8" }).map((file) => file.split("\\").join("/"));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The addresses that have pages: `content/pages/about.json` is /about, and each collection item has its own. */
|
|
34
|
+
function pageAddresses(): Set<string> {
|
|
35
|
+
const addresses = new Set<string>();
|
|
36
|
+
for (const file of filesIn("content/pages")) {
|
|
37
|
+
if (file.endsWith(".json")) addresses.add(`/${file.slice(0, -".json".length)}`.replace(/\/?index$/, "") || "/");
|
|
38
|
+
}
|
|
39
|
+
for (const id of filesIn("content/collections").filter((file) => file.endsWith("/_collection.json"))) {
|
|
40
|
+
const folder = id.slice(0, -"/_collection.json".length);
|
|
41
|
+
const pattern = readJson(join("content/collections", id))?.path;
|
|
42
|
+
if (typeof pattern !== "string") continue;
|
|
43
|
+
for (const file of readdirSync(join("content/collections", folder))) {
|
|
44
|
+
const slug = /^(.+)\.(json|md)$/.exec(file)?.[1];
|
|
45
|
+
if (slug && file !== "_collection.json") addresses.add(pattern.replace("{slug}", slug).replace(/\/+$/, ""));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return addresses;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** An address as Vercel matches it, with the characters its patterns use escaped. */
|
|
52
|
+
function source(path: string): string {
|
|
53
|
+
return encodeURI(path).replace(/[()[\]{}+*?:!]/g, "\\$&");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function redirects() {
|
|
57
|
+
const list = (readJson("content/redirects.json")?.redirects ?? []) as Redirect[];
|
|
58
|
+
const pages = pageAddresses();
|
|
59
|
+
return list.flatMap(({ from, to }) => {
|
|
60
|
+
const path = from.replace(/\/+$/, "");
|
|
61
|
+
if (pages.has(path)) return [];
|
|
62
|
+
// With and without a trailing slash, as the other hosts serve the page there.
|
|
63
|
+
return [path, `${path}/`].map((address) => ({ source: source(address), destination: to, permanent: true }));
|
|
64
|
+
});
|
|
65
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
+
"name": "accordion",
|
|
4
|
+
"type": "registry:ui",
|
|
5
|
+
"dependencies": [
|
|
6
|
+
"cn",
|
|
7
|
+
"radix-ui"
|
|
8
|
+
],
|
|
9
|
+
"registryDependencies": [],
|
|
10
|
+
"files": [
|
|
11
|
+
{
|
|
12
|
+
"path": "components/ui/accordion.tsx",
|
|
13
|
+
"type": "registry:ui",
|
|
14
|
+
"content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"cn\"\nimport { ChevronDownIcon } from \"lucide-react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\n\nfunction Accordion({\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pointer-events-none size-4 shrink-0 translate-y-0.5 text-muted-foreground transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pt-0 pb-4\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
+
"name": "alert",
|
|
4
|
+
"type": "registry:ui",
|
|
5
|
+
"dependencies": [
|
|
6
|
+
"cn"
|
|
7
|
+
],
|
|
8
|
+
"registryDependencies": [],
|
|
9
|
+
"files": [
|
|
10
|
+
{
|
|
11
|
+
"path": "components/ui/alert.tsx",
|
|
12
|
+
"type": "registry:ui",
|
|
13
|
+
"content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nconst alertVariants = cva(\n \"relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|