@port60/template-kit 0.20.4 → 1.0.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 (58) hide show
  1. package/README.md +42 -3
  2. package/bin/cli.mjs +10 -0
  3. package/package.json +4 -2
  4. package/src/commands/content.mjs +4 -3
  5. package/src/commands/create.mjs +11 -3
  6. package/src/commands/dev.mjs +9 -3
  7. package/src/commands/model.mjs +3 -3
  8. package/src/commands/packageCmd.mjs +1 -1
  9. package/src/commands/publish.mjs +1 -1
  10. package/src/commands/refresh.mjs +8 -3
  11. package/src/commands/release.mjs +22 -0
  12. package/src/commands/setupPreviews.mjs +19 -0
  13. package/src/commands/validate.mjs +1 -1
  14. package/src/lib/agentsMd.mjs +108 -155
  15. package/src/lib/designer-bridge.js +26 -0
  16. package/src/lib/designerPalette.mjs +62 -0
  17. package/src/lib/galleryPosters.mjs +105 -0
  18. package/src/lib/previewOptions.mjs +1 -1
  19. package/src/lib/releaseBundle.mjs +141 -0
  20. package/src/vendor/contract/v1/context.json +1 -1
  21. package/src/vendor/contract/v1/manifest.schema.json +6 -0
  22. package/src/vendor/contract/v2/behaviours.json +346 -0
  23. package/src/vendor/contract/v2/content-bounds.json +117 -0
  24. package/src/vendor/contract/v2/content-model.json +766 -0
  25. package/src/vendor/contract/v2/context.json +1569 -0
  26. package/src/vendor/contract/v2/dialect.json +105 -0
  27. package/src/vendor/contract/v2/fonts.json +910 -0
  28. package/src/vendor/contract/v2/imagery.json +32 -0
  29. package/src/vendor/contract/v2/islands.json +263 -0
  30. package/src/vendor/contract/v2/layout.json +28 -0
  31. package/src/vendor/contract/v2/manifest.schema.json +388 -0
  32. package/src/vendor/contract/v2/sections.json +947 -0
  33. package/src/vendor/contract/v2/site.schema.json +1353 -0
  34. package/src/vendor/contract/v2/tokens.json +101 -0
  35. package/src/vendor/contract/v2.lock.json +6931 -0
  36. package/src/vendor/engine/content-footprint.mjs +76 -1
  37. package/src/vendor/engine/majors.mjs +42 -0
  38. package/src/vendor/validator/gift-aid-logo.svg +6 -0
  39. package/src/vendor/validator/model-reference-v2.mjs +95 -0
  40. package/src/vendor/validator/platform-base.css +359 -2
  41. package/src/vendor/validator/preview-v1.mjs +691 -0
  42. package/src/vendor/validator/preview-v2.mjs +654 -0
  43. package/src/vendor/validator/preview.mjs +8 -688
  44. package/src/vendor/validator/site-context-v2.mjs +113 -0
  45. package/src/vendor/validator/validate-v1.mjs +666 -0
  46. package/src/vendor/validator/validate-v2.mjs +642 -0
  47. package/src/vendor/validator/validate.mjs +21 -621
  48. package/starter/assets/theme.css +3 -0
  49. package/starter/layout.liquid +15 -18
  50. package/starter/manifest.json +6 -4
  51. package/starter/preview/config.json +4 -0
  52. package/starter/preview/media/README.md +9 -0
  53. package/starter/sections/campaigns.liquid +5 -4
  54. package/starter/sections/cta.liquid +2 -2
  55. package/starter/sections/hero.liquid +9 -2
  56. package/starter/sections/homeHero.liquid +28 -24
  57. package/starter/sections/people.liquid +7 -6
  58. package/starter/sections/values.liquid +3 -3
@@ -0,0 +1,1569 @@
1
+ {
2
+ "description": "Contract v2 public context. Templates receive site plus the current section authored content or explicitly documented record detail. No flat collection aliases, focus aliases, generated navigation CTA, independent locations or content.about exist.",
3
+ "variables": [
4
+ {
5
+ "path": "site",
6
+ "availableIn": [
7
+ "section",
8
+ "layout",
9
+ "page"
10
+ ],
11
+ "description": "site: see site.schema.json and content-model.json for the exact v2 shape."
12
+ },
13
+ {
14
+ "path": "site.brand",
15
+ "availableIn": [
16
+ "section",
17
+ "layout",
18
+ "page"
19
+ ],
20
+ "description": "site.brand: see site.schema.json and content-model.json for the exact v2 shape."
21
+ },
22
+ {
23
+ "path": "site.nav",
24
+ "availableIn": [
25
+ "section",
26
+ "layout",
27
+ "page"
28
+ ],
29
+ "description": "site.nav: see site.schema.json and content-model.json for the exact v2 shape."
30
+ },
31
+ {
32
+ "path": "site.socials",
33
+ "availableIn": [
34
+ "section",
35
+ "layout",
36
+ "page"
37
+ ],
38
+ "description": "site.socials: see site.schema.json and content-model.json for the exact v2 shape."
39
+ },
40
+ {
41
+ "path": "site.locale",
42
+ "availableIn": [
43
+ "section",
44
+ "layout",
45
+ "page"
46
+ ],
47
+ "description": "site.locale: see site.schema.json and content-model.json for the exact v2 shape."
48
+ },
49
+ {
50
+ "path": "site.actions",
51
+ "availableIn": [
52
+ "section",
53
+ "layout",
54
+ "page"
55
+ ],
56
+ "description": "site.actions: see site.schema.json and content-model.json for the exact v2 shape."
57
+ },
58
+ {
59
+ "path": "site.page",
60
+ "availableIn": [
61
+ "section",
62
+ "layout",
63
+ "page"
64
+ ],
65
+ "description": "Current render only: key, path and stable-keyed section composition."
66
+ },
67
+ {
68
+ "path": "site.content",
69
+ "availableIn": [
70
+ "section",
71
+ "layout",
72
+ "page"
73
+ ],
74
+ "description": "site.content: see site.schema.json and content-model.json for the exact v2 shape."
75
+ },
76
+ {
77
+ "path": "site.content.services",
78
+ "availableIn": [
79
+ "section",
80
+ "layout",
81
+ "page"
82
+ ],
83
+ "description": "site.content.services: see site.schema.json and content-model.json for the exact v2 shape."
84
+ },
85
+ {
86
+ "path": "site.content.events",
87
+ "availableIn": [
88
+ "section",
89
+ "layout",
90
+ "page"
91
+ ],
92
+ "description": "site.content.events: see site.schema.json and content-model.json for the exact v2 shape."
93
+ },
94
+ {
95
+ "path": "site.content.articles",
96
+ "availableIn": [
97
+ "section",
98
+ "layout",
99
+ "page"
100
+ ],
101
+ "description": "site.content.articles: see site.schema.json and content-model.json for the exact v2 shape."
102
+ },
103
+ {
104
+ "path": "site.content.campaigns",
105
+ "availableIn": [
106
+ "section",
107
+ "layout",
108
+ "page"
109
+ ],
110
+ "description": "site.content.campaigns: see site.schema.json and content-model.json for the exact v2 shape."
111
+ },
112
+ {
113
+ "path": "site.content.causes",
114
+ "availableIn": [
115
+ "section",
116
+ "layout",
117
+ "page"
118
+ ],
119
+ "description": "site.content.causes: see site.schema.json and content-model.json for the exact v2 shape."
120
+ },
121
+ {
122
+ "path": "site.content.courses",
123
+ "availableIn": [
124
+ "section",
125
+ "layout",
126
+ "page"
127
+ ],
128
+ "description": "site.content.courses: see site.schema.json and content-model.json for the exact v2 shape."
129
+ },
130
+ {
131
+ "path": "site.content.documents",
132
+ "availableIn": [
133
+ "section",
134
+ "layout",
135
+ "page"
136
+ ],
137
+ "description": "site.content.documents: see site.schema.json and content-model.json for the exact v2 shape."
138
+ },
139
+ {
140
+ "path": "site.content.schedules",
141
+ "availableIn": [
142
+ "section",
143
+ "layout",
144
+ "page"
145
+ ],
146
+ "description": "site.content.schedules: see site.schema.json and content-model.json for the exact v2 shape."
147
+ },
148
+ {
149
+ "path": "section",
150
+ "availableIn": [
151
+ "section"
152
+ ],
153
+ "description": "This section instance's authored content. Field markers name only these fields, never source records or generated collection labels."
154
+ },
155
+ {
156
+ "path": "article",
157
+ "availableIn": [
158
+ "page:article"
159
+ ],
160
+ "description": "The current source-authored Article detail, including sanitised bodyHtml. Render bodyHtml with the raw filter. A body may contain side by side content: a div.p60-cols.p60-cols-2 or .p60-cols-3 block of div.p60-col panes (a pane may carry .p60-col-boxed). The platform stylesheet lays the panes out as a grid and stacks them under 720px on every page, template pages included; a template may restyle the gap, the breakpoint or the boxed look. Engagement remains platform-owned."
161
+ },
162
+ {
163
+ "path": "course",
164
+ "availableIn": [
165
+ "page:course"
166
+ ],
167
+ "description": "The current source-authored Course detail, including sanitised aboutHtml. Enrolment remains platform-owned."
168
+ },
169
+ {
170
+ "path": "impactMap",
171
+ "availableIn": [
172
+ "section:impactMap"
173
+ ],
174
+ "description": "The selected map, including its own title, introduction, viewport and points. No global locations collection."
175
+ }
176
+ ],
177
+ "fixtures": {
178
+ "brand": {
179
+ "name": "The Lantern Trust",
180
+ "tagline": "Neighbours, looked after.",
181
+ "logoUrl": null,
182
+ "logoType": "full",
183
+ "footerLogoUrl": null
184
+ },
185
+ "site": {
186
+ "brand": {
187
+ "name": "The Lantern Trust",
188
+ "tagline": "Neighbours, looked after.",
189
+ "logoUrl": null,
190
+ "logoType": "full",
191
+ "footerLogoUrl": null
192
+ },
193
+ "nav": {
194
+ "header": [
195
+ {
196
+ "label": "Home",
197
+ "href": "/",
198
+ "kind": "link"
199
+ },
200
+ {
201
+ "label": "About us",
202
+ "href": "/about",
203
+ "kind": "link"
204
+ },
205
+ {
206
+ "label": "Events",
207
+ "href": "/events",
208
+ "kind": "link"
209
+ },
210
+ {
211
+ "label": "Services",
212
+ "href": "/services",
213
+ "children": [
214
+ {
215
+ "label": "Food bank",
216
+ "href": "/services?service=food-bank",
217
+ "group": "Support",
218
+ "description": "Emergency food parcels and practical advice.",
219
+ "kind": "link"
220
+ },
221
+ {
222
+ "label": "Community",
223
+ "href": null,
224
+ "group": "Get involved",
225
+ "children": [
226
+ {
227
+ "label": "Youth club",
228
+ "href": "/services?service=youth-club",
229
+ "kind": "link"
230
+ }
231
+ ],
232
+ "kind": "group"
233
+ }
234
+ ],
235
+ "kind": "link",
236
+ "megaMenu": {
237
+ "promo": {
238
+ "title": "Visit this week",
239
+ "text": "Find a programme and meet the team.",
240
+ "href": "/services",
241
+ "label": "Explore services"
242
+ }
243
+ }
244
+ }
245
+ ],
246
+ "footer": [
247
+ {
248
+ "label": "About us",
249
+ "href": "/about",
250
+ "kind": "link"
251
+ },
252
+ {
253
+ "label": "Contact",
254
+ "href": "https://example.org/contact",
255
+ "external": true,
256
+ "kind": "link"
257
+ },
258
+ {
259
+ "label": "Our work",
260
+ "href": null,
261
+ "children": [
262
+ {
263
+ "label": "Food bank",
264
+ "href": "/services?service=food-bank",
265
+ "kind": "link"
266
+ }
267
+ ],
268
+ "kind": "group"
269
+ }
270
+ ]
271
+ },
272
+ "socials": [
273
+ {
274
+ "platform": "facebook",
275
+ "url": "https://facebook.com/lanterntrust",
276
+ "iconSvg": "<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>"
277
+ },
278
+ {
279
+ "platform": "instagram",
280
+ "url": "https://instagram.com/lanterntrust",
281
+ "iconSvg": "<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\"/></svg>"
282
+ },
283
+ {
284
+ "platform": "youtube",
285
+ "url": "https://youtube.com/@lanterntrust",
286
+ "iconSvg": "<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><polygon points=\"10,8 16,12 10,16\"/></svg>"
287
+ }
288
+ ],
289
+ "locale": {
290
+ "code": "en",
291
+ "direction": "ltr",
292
+ "languages": [
293
+ {
294
+ "code": "en",
295
+ "label": "English",
296
+ "direction": "ltr"
297
+ },
298
+ {
299
+ "code": "cy",
300
+ "label": "Cymraeg",
301
+ "direction": "ltr"
302
+ },
303
+ {
304
+ "code": "ar",
305
+ "label": "العربية",
306
+ "direction": "rtl"
307
+ }
308
+ ]
309
+ },
310
+ "content": {
311
+ "services": {
312
+ "label": "Services",
313
+ "href": "/services",
314
+ "items": [
315
+ {
316
+ "id": "66666666-6666-6666-6666-666666666661",
317
+ "title": "Food Bank",
318
+ "slug": "food-bank",
319
+ "summary": "Emergency parcels, no referral needed, from the Foundry Lane depot every weekday morning.",
320
+ "imageUrl": "p60fixture:service/foodbank",
321
+ "href": "/services?service=food-bank"
322
+ },
323
+ {
324
+ "id": "66666666-6666-6666-6666-666666666662",
325
+ "title": "Youth Club",
326
+ "slug": "youth-club",
327
+ "summary": "Sports, cooking and somewhere to be for ages 10 to 16, four evenings a week.",
328
+ "imageUrl": "p60fixture:service/youthclub",
329
+ "href": "/services?service=youth-club"
330
+ },
331
+ {
332
+ "id": "66666666-6666-6666-6666-666666666663",
333
+ "title": "Money Advice",
334
+ "slug": "money-advice",
335
+ "summary": "Free, confidential help with debt, benefits and the letters that keep you up at night.",
336
+ "imageUrl": "p60fixture:service/advice",
337
+ "href": "/services?service=money-advice"
338
+ },
339
+ {
340
+ "id": "66666666-6666-6666-6666-666666666664",
341
+ "title": "Community Garden",
342
+ "slug": "community-garden",
343
+ "summary": "Twenty-two raised beds, a greenhouse and a seed library, open to every Alderford household.",
344
+ "imageUrl": "p60fixture:service/garden",
345
+ "href": "/services?service=community-garden"
346
+ },
347
+ {
348
+ "id": "66666666-6666-6666-6666-666666666665",
349
+ "title": "Warm Spaces",
350
+ "slug": "warm-spaces",
351
+ "summary": "Our hall, open and heated through winter, with tea, wifi and company.",
352
+ "imageUrl": "p60fixture:service/warmspace",
353
+ "href": "/services?service=warm-spaces"
354
+ }
355
+ ],
356
+ "pagination": null
357
+ },
358
+ "events": {
359
+ "label": "Events",
360
+ "href": "/events",
361
+ "items": [
362
+ {
363
+ "id": "22222222-2222-2222-2222-222222222222",
364
+ "name": "The Lantern Gala",
365
+ "description": "Our biggest night of the year: supper, music from the Alderford Community Choir, and the annual lantern walk along the river to close.",
366
+ "registrationMode": "TICKETED",
367
+ "startsAt": "2030-09-20T19:00:00Z",
368
+ "endsAt": null,
369
+ "venueName": "The Maltings, Alderford",
370
+ "online": false,
371
+ "imageUrl": "p60fixture:event/gala",
372
+ "onSale": true,
373
+ "soldOut": false,
374
+ "priceFrom": 25,
375
+ "currency": "GBP",
376
+ "detailHref": "/events?event=22222222-2222-2222-2222-222222222222"
377
+ },
378
+ {
379
+ "id": "44444444-4444-4444-4444-444444444444",
380
+ "name": "Riverside Harvest Supper",
381
+ "description": "A long-table supper on the Aldern meadow, cooked by our kitchen volunteers with produce from the community garden.",
382
+ "registrationMode": "TICKETED",
383
+ "startsAt": "2030-10-04T18:30:00Z",
384
+ "endsAt": "2030-10-04T22:00:00Z",
385
+ "venueName": "Aldern Meadow",
386
+ "online": false,
387
+ "imageUrl": "p60fixture:event/harvest",
388
+ "onSale": true,
389
+ "soldOut": false,
390
+ "priceFrom": 12.5,
391
+ "currency": "GBP",
392
+ "detailHref": "/events?event=44444444-4444-4444-4444-444444444444"
393
+ },
394
+ {
395
+ "id": "55555555-5555-5555-5555-555555555555",
396
+ "name": "Volunteer Welcome Evening",
397
+ "description": "Meet the team, hear where help is needed most this season, and find a role that fits the time you have.",
398
+ "registrationMode": "RSVP",
399
+ "startsAt": "2030-09-03T18:00:00Z",
400
+ "endsAt": "2030-09-03T19:30:00Z",
401
+ "venueName": "Foundry Lane Hub",
402
+ "online": false,
403
+ "imageUrl": "p60fixture:event/welcome",
404
+ "onSale": true,
405
+ "soldOut": false,
406
+ "priceFrom": null,
407
+ "currency": null,
408
+ "detailHref": "/events?event=55555555-5555-5555-5555-555555555555"
409
+ },
410
+ {
411
+ "id": "66666666-6666-6666-6666-666666666666",
412
+ "name": "Warm Space Wednesdays",
413
+ "description": "Our hall is open, warm and stocked with tea every Wednesday through the cold months. No booking, no questions, everyone welcome.",
414
+ "registrationMode": "INFO",
415
+ "startsAt": "2030-11-06T10:00:00Z",
416
+ "endsAt": "2030-11-06T15:00:00Z",
417
+ "venueName": "St Chad's Hall",
418
+ "online": false,
419
+ "imageUrl": null,
420
+ "onSale": true,
421
+ "soldOut": false,
422
+ "priceFrom": null,
423
+ "currency": null,
424
+ "detailHref": "/events?event=66666666-6666-6666-6666-666666666666"
425
+ },
426
+ {
427
+ "id": "77777777-7777-7777-7777-777777777777",
428
+ "name": "Money Advice Drop-in",
429
+ "description": "A quiet hour with our trained advisers. Bring letters you are worried about; we will work through them together.",
430
+ "registrationMode": "INFO",
431
+ "startsAt": "2030-09-12T10:00:00Z",
432
+ "endsAt": "2030-09-12T12:00:00Z",
433
+ "venueName": null,
434
+ "online": true,
435
+ "imageUrl": null,
436
+ "onSale": true,
437
+ "soldOut": false,
438
+ "priceFrom": null,
439
+ "currency": null,
440
+ "detailHref": "/events?event=77777777-7777-7777-7777-777777777777"
441
+ },
442
+ {
443
+ "id": "88888888-8888-8888-8888-888888888888",
444
+ "name": "Winter Fair",
445
+ "description": "Stalls, carols and the grand raffle in aid of the Winter Appeal. Free entry; every stall staffed by volunteers.",
446
+ "registrationMode": "TICKETED",
447
+ "startsAt": "2030-12-07T11:00:00Z",
448
+ "endsAt": "2030-12-07T16:00:00Z",
449
+ "venueName": "Alderford Market Square",
450
+ "online": false,
451
+ "imageUrl": "p60fixture:event/winterfair",
452
+ "onSale": true,
453
+ "soldOut": true,
454
+ "priceFrom": 0,
455
+ "currency": "GBP",
456
+ "detailHref": "/events?event=88888888-8888-8888-8888-888888888888"
457
+ }
458
+ ],
459
+ "pagination": null
460
+ },
461
+ "articles": {
462
+ "label": "Articles",
463
+ "href": "/articles/all",
464
+ "items": [
465
+ {
466
+ "id": "88888888-8888-8888-8888-888888888888",
467
+ "title": "The Community Garden Opens Its Gates",
468
+ "slug": "community-garden-opens",
469
+ "excerpt": "Two years of digging, fundraising and Saturday mornings in the rain: the Foundry Lane garden is finally open to everyone.",
470
+ "imageUrl": "p60fixture:article/garden",
471
+ "authorName": "Amina Khan",
472
+ "authorRole": "Community Editor",
473
+ "categories": [
474
+ "News"
475
+ ],
476
+ "publishedAt": "2030-04-12T09:00:00Z",
477
+ "readingMinutes": 5,
478
+ "href": "/articles/community-garden-opens"
479
+ },
480
+ {
481
+ "id": "99999999-9999-9999-9999-999999999999",
482
+ "title": "What a Food Parcel Actually Holds",
483
+ "slug": "what-a-food-parcel-holds",
484
+ "excerpt": "People imagine tins and pasta. The real list is longer, more personal, and put together with more care than you might think.",
485
+ "imageUrl": "p60fixture:article/parcel",
486
+ "authorName": "Derek Osei",
487
+ "authorRole": "Food Bank Lead",
488
+ "categories": [
489
+ "Stories"
490
+ ],
491
+ "publishedAt": "2030-03-28T09:00:00Z",
492
+ "readingMinutes": 6,
493
+ "href": "/articles/what-a-food-parcel-holds"
494
+ },
495
+ {
496
+ "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
497
+ "title": "Meet the Wednesday Kitchen Crew",
498
+ "slug": "wednesday-kitchen-crew",
499
+ "excerpt": "Eleven volunteers, one borrowed oven, and a hundred and forty hot meals a week. The kitchen crew tell it in their own words.",
500
+ "imageUrl": "p60fixture:people/kitchen",
501
+ "authorName": "Amina Khan",
502
+ "authorRole": "Community Editor",
503
+ "categories": [
504
+ "Stories"
505
+ ],
506
+ "publishedAt": "2030-03-02T09:00:00Z",
507
+ "readingMinutes": 7,
508
+ "href": "/articles/wednesday-kitchen-crew"
509
+ },
510
+ {
511
+ "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
512
+ "title": "Winter Appeal: Where Your Money Went",
513
+ "slug": "winter-appeal-report",
514
+ "excerpt": "You gave 18,400 pounds in eight weeks. Here is the line-by-line account of what it paid for, and what we learned.",
515
+ "imageUrl": "p60fixture:campaign/winterreport",
516
+ "authorName": "Priya Sharma",
517
+ "authorRole": "Trustee",
518
+ "categories": [
519
+ "News"
520
+ ],
521
+ "publishedAt": "2030-02-14T09:00:00Z",
522
+ "readingMinutes": 8,
523
+ "href": "/articles/winter-appeal-report"
524
+ },
525
+ {
526
+ "id": "cccccccc-cccc-cccc-cccc-cccccccccccc",
527
+ "title": "Five Things Our Money Advisers Wish You Knew",
528
+ "slug": "money-advice-five-things",
529
+ "excerpt": "The advice team see the same worries again and again. Most of them have a fix that takes less than an hour.",
530
+ "imageUrl": null,
531
+ "authorName": "Tom Bradley",
532
+ "authorRole": "Advice Service",
533
+ "categories": [
534
+ "Guides"
535
+ ],
536
+ "publishedAt": "2030-01-30T09:00:00Z",
537
+ "readingMinutes": 4,
538
+ "href": "/articles/money-advice-five-things"
539
+ },
540
+ {
541
+ "id": "dddddddd-dddd-dddd-dddd-dddddddddddd",
542
+ "title": "A Year of Warm Spaces, in Numbers",
543
+ "slug": "warm-spaces-in-numbers",
544
+ "excerpt": "Fourteen hundred visits, ninety regulars, and one chess league nobody planned. What happens when you just open the door.",
545
+ "imageUrl": "p60fixture:service/warmspace",
546
+ "authorName": "Amina Khan",
547
+ "authorRole": "Community Editor",
548
+ "categories": [
549
+ "News"
550
+ ],
551
+ "publishedAt": "2030-01-08T09:00:00Z",
552
+ "readingMinutes": 5,
553
+ "href": "/articles/warm-spaces-in-numbers"
554
+ }
555
+ ],
556
+ "pagination": null
557
+ },
558
+ "campaigns": {
559
+ "label": "Campaigns",
560
+ "href": "/campaigns",
561
+ "items": [
562
+ {
563
+ "id": "99999999-9999-9999-9999-999999999991",
564
+ "title": "Keep the 27 Bus",
565
+ "slug": "keep-the-27-bus",
566
+ "href": "/campaigns/keep-the-27-bus",
567
+ "summary": "The only bus serving the Fenwick estate is set to be cut. Add your name before the consultation closes.",
568
+ "imageUrl": "p60fixture:campaign/bus"
569
+ },
570
+ {
571
+ "id": "99999999-9999-9999-9999-999999999992",
572
+ "title": "A Defibrillator on Every Street",
573
+ "slug": "defibrillator-every-street",
574
+ "href": "/campaigns/defibrillator-every-street",
575
+ "summary": "We are raising for twelve more public defibrillators and training two hundred neighbours to use them.",
576
+ "imageUrl": "p60fixture:campaign/defib"
577
+ },
578
+ {
579
+ "id": "99999999-9999-9999-9999-999999999993",
580
+ "title": "Alderford Housing Survey",
581
+ "slug": "housing-survey",
582
+ "href": "/campaigns/housing-survey",
583
+ "summary": null,
584
+ "imageUrl": null
585
+ }
586
+ ],
587
+ "pagination": null
588
+ },
589
+ "causes": {
590
+ "label": "Causes",
591
+ "href": "/donate",
592
+ "items": [
593
+ {
594
+ "id": "55555555-5555-5555-5555-555555555550",
595
+ "title": "Flood Response Appeal",
596
+ "slug": "flood-response",
597
+ "description": "The Aldern broke its banks on Sunday. Thirty households need dry bedding, dehumidifiers and somewhere warm now.",
598
+ "imageUrl": "p60fixture:cause/flood",
599
+ "targetAmount": 50000,
600
+ "raisedAmount": 18750,
601
+ "progressPercentage": 38,
602
+ "href": "/donate/flood-response",
603
+ "paymentOptions": {
604
+ "oneOff": true,
605
+ "recurringCard": true,
606
+ "directDebit": true
607
+ }
608
+ },
609
+ {
610
+ "id": "55555555-5555-5555-5555-555555555551",
611
+ "title": "Winter Appeal",
612
+ "slug": "winter-appeal",
613
+ "description": "Heating top-ups, warm bedding and a hot meal for the households the cold hits hardest.",
614
+ "imageUrl": "p60fixture:cause/winter",
615
+ "targetAmount": 20000,
616
+ "raisedAmount": 12500,
617
+ "progressPercentage": 63,
618
+ "href": "/donate/winter-appeal",
619
+ "paymentOptions": {
620
+ "oneOff": true,
621
+ "recurringCard": true,
622
+ "directDebit": false
623
+ }
624
+ },
625
+ {
626
+ "id": "55555555-5555-5555-5555-555555555552",
627
+ "title": "Food Bank Fund",
628
+ "slug": "food-bank-fund",
629
+ "description": "Keeps the shelves stocked between donation drives. Ten pounds fills a family parcel.",
630
+ "imageUrl": "p60fixture:cause/foodbank",
631
+ "targetAmount": 15000,
632
+ "raisedAmount": 9800,
633
+ "progressPercentage": 65,
634
+ "href": "/donate/food-bank-fund",
635
+ "paymentOptions": {
636
+ "oneOff": true,
637
+ "recurringCard": true,
638
+ "directDebit": true
639
+ }
640
+ },
641
+ {
642
+ "id": "55555555-5555-5555-5555-555555555553",
643
+ "title": "Youth Club Futures",
644
+ "slug": "youth-club-futures",
645
+ "description": "Coaching, kit and trips for the seventy young people who come through our doors each week.",
646
+ "imageUrl": "p60fixture:cause/youth",
647
+ "targetAmount": 8000,
648
+ "raisedAmount": 2150,
649
+ "progressPercentage": 27,
650
+ "href": "/donate/youth-club-futures",
651
+ "paymentOptions": {
652
+ "oneOff": true,
653
+ "recurringCard": false,
654
+ "directDebit": false
655
+ }
656
+ }
657
+ ],
658
+ "pagination": null
659
+ },
660
+ "courses": {
661
+ "label": "Courses",
662
+ "href": "/courses",
663
+ "items": [
664
+ {
665
+ "id": "33333333-3333-3333-3333-333333333333",
666
+ "title": "Junior Athletics",
667
+ "description": "Weekly athletics for children aged 7 to 12, coached by qualified volunteers at the King's Park track.",
668
+ "imageUrl": "p60fixture:course/athletics",
669
+ "venue": "King's Park track",
670
+ "audience": "CHILD",
671
+ "priceFrom": 15,
672
+ "currency": "GBP",
673
+ "soldOut": false,
674
+ "href": "/courses"
675
+ }
676
+ ],
677
+ "pagination": null
678
+ },
679
+ "documents": {
680
+ "label": "Documents",
681
+ "href": null,
682
+ "items": [
683
+ {
684
+ "id": "88888888-8888-8888-8888-888888888881",
685
+ "title": "Annual report 2029.pdf",
686
+ "folder": "Reports",
687
+ "url": "/fixture/annual-report-2029.pdf",
688
+ "contentType": "application/pdf",
689
+ "bytes": 1245760,
690
+ "publishedAt": "2030-02-01T10:00:00Z"
691
+ },
692
+ {
693
+ "id": "88888888-8888-8888-8888-888888888882",
694
+ "title": "Safeguarding policy.pdf",
695
+ "folder": "Policies",
696
+ "url": "/fixture/safeguarding-policy.pdf",
697
+ "contentType": "application/pdf",
698
+ "bytes": 384000,
699
+ "publishedAt": "2029-11-12T10:00:00Z"
700
+ },
701
+ {
702
+ "id": "88888888-8888-8888-8888-888888888883",
703
+ "title": "Volunteer handbook.pdf",
704
+ "folder": "Volunteering",
705
+ "url": "/fixture/volunteer-handbook.pdf",
706
+ "contentType": "application/pdf",
707
+ "bytes": 942080,
708
+ "publishedAt": "2030-01-20T10:00:00Z"
709
+ },
710
+ {
711
+ "id": "88888888-8888-8888-8888-888888888884",
712
+ "title": "Hall hire form.pdf",
713
+ "folder": "Forms",
714
+ "url": "/fixture/hall-hire-form.pdf",
715
+ "contentType": "application/pdf",
716
+ "bytes": 128000,
717
+ "publishedAt": "2029-09-02T10:00:00Z"
718
+ }
719
+ ],
720
+ "pagination": null
721
+ },
722
+ "schedules": [
723
+ {
724
+ "type": "worship",
725
+ "content": {
726
+ "times": [
727
+ {
728
+ "name": "Fajr",
729
+ "begins": "03:20",
730
+ "congregation": "04:00"
731
+ },
732
+ {
733
+ "name": "Zuhr",
734
+ "begins": "13:11",
735
+ "congregation": "13:30"
736
+ },
737
+ {
738
+ "name": "Asr",
739
+ "begins": "18:30",
740
+ "congregation": "19:00"
741
+ },
742
+ {
743
+ "name": "Maghrib",
744
+ "begins": "21:04",
745
+ "congregation": "21:04"
746
+ },
747
+ {
748
+ "name": "Isha",
749
+ "begins": "22:12",
750
+ "congregation": "22:30"
751
+ }
752
+ ],
753
+ "beginsLabel": "Begins",
754
+ "congregationLabel": "Jama'at",
755
+ "note": "Jum'a 13:15 & 14:15",
756
+ "href": "/services?service=prayer-times",
757
+ "today": "24 July 2026",
758
+ "todayAlt": "11 Safar 1448",
759
+ "next": {
760
+ "name": "Asr",
761
+ "begins": "18:30",
762
+ "congregation": "19:00",
763
+ "target": "2030-07-24T19:00:00+01:00"
764
+ },
765
+ "jumah": [
766
+ {
767
+ "name": "Jum'a 1",
768
+ "begins": null,
769
+ "congregation": "13:15"
770
+ },
771
+ {
772
+ "name": "Jum'a 2",
773
+ "begins": null,
774
+ "congregation": "14:15"
775
+ }
776
+ ],
777
+ "hijri": {
778
+ "display": "11 Safar 1448"
779
+ },
780
+ "observances": [
781
+ {
782
+ "name": "Community iftar",
783
+ "date": "2 March 2030",
784
+ "href": "/events"
785
+ }
786
+ ]
787
+ }
788
+ }
789
+ ]
790
+ },
791
+ "actions": {
792
+ "header": {
793
+ "kind": "volunteer",
794
+ "label": "Volunteer",
795
+ "href": "/volunteer"
796
+ },
797
+ "hero": {
798
+ "kind": "donate",
799
+ "label": "Donate",
800
+ "href": "/donate"
801
+ },
802
+ "widget": "donate"
803
+ },
804
+ "page": {
805
+ "key": "home",
806
+ "path": "/",
807
+ "sections": []
808
+ }
809
+ },
810
+ "layout": {
811
+ "brand": {
812
+ "name": "The Lantern Trust",
813
+ "tagline": "Neighbours, looked after.",
814
+ "logoUrl": null,
815
+ "logoType": "full",
816
+ "footerLogoUrl": null
817
+ },
818
+ "nav": {
819
+ "header": [
820
+ {
821
+ "label": "Home",
822
+ "href": "/",
823
+ "kind": "link"
824
+ },
825
+ {
826
+ "label": "About us",
827
+ "href": "/about",
828
+ "kind": "link"
829
+ },
830
+ {
831
+ "label": "Events",
832
+ "href": "/events",
833
+ "kind": "link"
834
+ },
835
+ {
836
+ "label": "Services",
837
+ "href": "/services",
838
+ "children": [
839
+ {
840
+ "label": "Food bank",
841
+ "href": "/services?service=food-bank",
842
+ "group": "Support",
843
+ "description": "Emergency food parcels and practical advice.",
844
+ "kind": "link"
845
+ },
846
+ {
847
+ "label": "Community",
848
+ "href": null,
849
+ "group": "Get involved",
850
+ "children": [
851
+ {
852
+ "label": "Youth club",
853
+ "href": "/services?service=youth-club",
854
+ "kind": "link"
855
+ }
856
+ ],
857
+ "kind": "group"
858
+ }
859
+ ],
860
+ "kind": "link",
861
+ "megaMenu": {
862
+ "promo": {
863
+ "title": "Visit this week",
864
+ "text": "Find a programme and meet the team.",
865
+ "href": "/services",
866
+ "label": "Explore services"
867
+ }
868
+ }
869
+ }
870
+ ],
871
+ "footer": [
872
+ {
873
+ "label": "About us",
874
+ "href": "/about",
875
+ "kind": "link"
876
+ },
877
+ {
878
+ "label": "Contact",
879
+ "href": "https://example.org/contact",
880
+ "external": true,
881
+ "kind": "link"
882
+ },
883
+ {
884
+ "label": "Our work",
885
+ "href": null,
886
+ "children": [
887
+ {
888
+ "label": "Food bank",
889
+ "href": "/services?service=food-bank",
890
+ "kind": "link"
891
+ }
892
+ ],
893
+ "kind": "group"
894
+ }
895
+ ]
896
+ },
897
+ "socials": [
898
+ {
899
+ "platform": "facebook",
900
+ "url": "https://facebook.com/lanterntrust",
901
+ "iconSvg": "<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>"
902
+ },
903
+ {
904
+ "platform": "instagram",
905
+ "url": "https://instagram.com/lanterntrust",
906
+ "iconSvg": "<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\"/></svg>"
907
+ },
908
+ {
909
+ "platform": "youtube",
910
+ "url": "https://youtube.com/@lanterntrust",
911
+ "iconSvg": "<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><polygon points=\"10,8 16,12 10,16\"/></svg>"
912
+ }
913
+ ],
914
+ "locale": {
915
+ "code": "en",
916
+ "direction": "ltr",
917
+ "languages": [
918
+ {
919
+ "code": "en",
920
+ "label": "English",
921
+ "direction": "ltr"
922
+ },
923
+ {
924
+ "code": "cy",
925
+ "label": "Cymraeg",
926
+ "direction": "ltr"
927
+ },
928
+ {
929
+ "code": "ar",
930
+ "label": "العربية",
931
+ "direction": "rtl"
932
+ }
933
+ ]
934
+ },
935
+ "worship": {
936
+ "times": [
937
+ {
938
+ "name": "Fajr",
939
+ "begins": "03:20",
940
+ "congregation": "04:00"
941
+ },
942
+ {
943
+ "name": "Zuhr",
944
+ "begins": "13:11",
945
+ "congregation": "13:30"
946
+ },
947
+ {
948
+ "name": "Asr",
949
+ "begins": "18:30",
950
+ "congregation": "19:00"
951
+ },
952
+ {
953
+ "name": "Maghrib",
954
+ "begins": "21:04",
955
+ "congregation": "21:04"
956
+ },
957
+ {
958
+ "name": "Isha",
959
+ "begins": "22:12",
960
+ "congregation": "22:30"
961
+ }
962
+ ],
963
+ "beginsLabel": "Begins",
964
+ "congregationLabel": "Jama'at",
965
+ "note": "Jum'a 13:15 & 14:15",
966
+ "href": "/services?service=prayer-times",
967
+ "today": "24 July 2026",
968
+ "todayAlt": "11 Safar 1448",
969
+ "next": {
970
+ "name": "Asr",
971
+ "begins": "18:30",
972
+ "congregation": "19:00",
973
+ "target": "2030-07-24T19:00:00+01:00"
974
+ },
975
+ "jumah": [
976
+ {
977
+ "name": "Jum'a 1",
978
+ "begins": null,
979
+ "congregation": "13:15"
980
+ },
981
+ {
982
+ "name": "Jum'a 2",
983
+ "begins": null,
984
+ "congregation": "14:15"
985
+ }
986
+ ],
987
+ "hijri": {
988
+ "display": "11 Safar 1448"
989
+ },
990
+ "observances": [
991
+ {
992
+ "name": "Community iftar",
993
+ "date": "2 March 2030",
994
+ "href": "/events"
995
+ }
996
+ ]
997
+ }
998
+ },
999
+ "sections": {
1000
+ "impactMap": {
1001
+ "impactMap": {
1002
+ "slug": "our-work",
1003
+ "title": "Where the Trust works",
1004
+ "intro": "Every marker is a real place in Alderford.",
1005
+ "viewport": {
1006
+ "centerLat": 53.7995,
1007
+ "centerLng": -1.552,
1008
+ "zoom": 14
1009
+ },
1010
+ "points": [
1011
+ {
1012
+ "latitude": 53.8008,
1013
+ "longitude": -1.5491,
1014
+ "kind": "LOCATION",
1015
+ "title": "Foundry Lane Hub",
1016
+ "summary": "The front door: food bank depot, advice desk and the volunteer office.",
1017
+ "imageUrl": null,
1018
+ "href": null
1019
+ },
1020
+ {
1021
+ "latitude": 53.8014,
1022
+ "longitude": -1.5502,
1023
+ "kind": "CAUSE",
1024
+ "title": "Community Garden",
1025
+ "summary": "Twenty-two raised beds and a seed library, open to every household.",
1026
+ "imageUrl": null,
1027
+ "href": "/donate/food-bank-fund"
1028
+ },
1029
+ {
1030
+ "latitude": 53.7975,
1031
+ "longitude": -1.5562,
1032
+ "kind": "EVENT",
1033
+ "title": "Warm Space Wednesdays",
1034
+ "summary": "St Chad's Hall, open and heated all winter.",
1035
+ "imageUrl": null,
1036
+ "href": "/events?event=66666666-6666-6666-6666-666666666666"
1037
+ },
1038
+ {
1039
+ "latitude": 53.7969,
1040
+ "longitude": -1.5474,
1041
+ "kind": "CAMPAIGN",
1042
+ "title": "Keep the 27 Bus",
1043
+ "summary": "The only bus serving the Fenwick estate is set to be cut.",
1044
+ "imageUrl": null,
1045
+ "href": "/campaigns/keep-the-27-bus"
1046
+ }
1047
+ ]
1048
+ }
1049
+ }
1050
+ },
1051
+ "pages": {
1052
+ "article": {
1053
+ "article": {
1054
+ "id": "88888888-8888-8888-8888-888888888888",
1055
+ "title": "The Community Garden Opens Its Gates",
1056
+ "slug": "community-garden-opens",
1057
+ "excerpt": "Two years of digging, fundraising and Saturday mornings in the rain: the Foundry Lane garden is finally open to everyone.",
1058
+ "imageUrl": "p60fixture:article/garden",
1059
+ "authorName": "Amina Khan",
1060
+ "authorRole": "Community Editor",
1061
+ "categories": [
1062
+ "News"
1063
+ ],
1064
+ "publishedAt": "2030-04-12T09:00:00Z",
1065
+ "readingMinutes": 5,
1066
+ "viewCount": 412,
1067
+ "likeCount": 38,
1068
+ "commentCount": 9,
1069
+ "href": "/articles/community-garden-opens",
1070
+ "updatedAt": "2030-04-12T10:00:00Z",
1071
+ "bodyHtml": "<h2>A shared place to grow</h2><p>The gates opened at ten. By half past, every raised bed had a family around it, the tool shed had a queue, and somebody had already claimed the sunny corner by the wall for tomatoes.</p><p>The Foundry Lane garden has been two years in the making. It began as a patch of rubble behind the old ironworks, offered to us on a peppercorn lease after the Winter Fair of 2028, and it has been built almost entirely by volunteer weekends since: twenty-two raised beds, a wheelchair-accessible path, a rainwater store, and a greenhouse pieced together from three donated ones.</p><blockquote><p>I have lived on this street forty years and never once stood on this ground. Now my grandchildren grow beans here.</p></blockquote><h2>What happens next</h2><div class=\"p60-cols p60-cols-2\"><div class=\"p60-col\"><h3>This season</h3><p>The beds are allocated, but the garden is not finished, and it is not meant to be. The growers' committee has three priorities:</p><ul><li>A covered seating area, so the garden works in the rain it will certainly get</li><li>Weekly sessions with the youth club, growing the salads the kitchen crew cook with</li><li>A seed library in the old gatehouse, free to any Alderford household</li></ul></div><div class=\"p60-col p60-col-boxed\"><h3>Open every day</h3><p>The gate is unlocked from eight until dusk. Tools live in the shed by the greenhouse, and the kettle is always on in the gatehouse on a Saturday morning.</p></div></div><p>If you can lay a slab, mend a frame or simply keep a kettle going, the volunteer team would love to hear from you. And if you just want somewhere green to sit, the gate is open every day until dusk.</p><h3>Thank you</h3><p>To the eighty-one people who gave to the garden appeal, the six local firms who lent tools and time, and the council officers who said yes when it mattered: this one is yours as much as ours.</p>",
1072
+ "allowComments": true
1073
+ }
1074
+ },
1075
+ "course": {
1076
+ "course": {
1077
+ "id": "33333333-3333-3333-3333-333333333333",
1078
+ "title": "Junior Athletics",
1079
+ "description": "Weekly athletics for children aged 7 to 12, coached by qualified volunteers at the King's Park track.",
1080
+ "aboutHtml": "<h2>What we do</h2><p>Track and field fundamentals in a friendly, coached setting: warm-ups, drills, and a different discipline every week.</p><ul><li>Sprints, relays and middle distance</li><li>Long jump, high jump and throws</li><li>A club mini-meet at the end of every term</li></ul><h2>What to bring</h2><p>Trainers, a water bottle and a waterproof. Everything else, including spikes for the older group, is provided.</p>",
1081
+ "imageUrl": "p60fixture:course/athletics",
1082
+ "venue": "King's Park track",
1083
+ "audience": "CHILD",
1084
+ "billingMode": "ROLLING",
1085
+ "termStart": null,
1086
+ "termEnd": null,
1087
+ "currency": "GBP",
1088
+ "priceFrom": 15,
1089
+ "soldOut": false,
1090
+ "backHref": "/courses"
1091
+ }
1092
+ },
1093
+ "services": {
1094
+ "collection": {
1095
+ "label": "Services",
1096
+ "href": "/services",
1097
+ "items": [
1098
+ {
1099
+ "id": "66666666-6666-6666-6666-666666666661",
1100
+ "title": "Food Bank",
1101
+ "slug": "food-bank",
1102
+ "summary": "Emergency parcels, no referral needed, from the Foundry Lane depot every weekday morning.",
1103
+ "imageUrl": "p60fixture:service/foodbank",
1104
+ "href": "/services?service=food-bank"
1105
+ },
1106
+ {
1107
+ "id": "66666666-6666-6666-6666-666666666662",
1108
+ "title": "Youth Club",
1109
+ "slug": "youth-club",
1110
+ "summary": "Sports, cooking and somewhere to be for ages 10 to 16, four evenings a week.",
1111
+ "imageUrl": "p60fixture:service/youthclub",
1112
+ "href": "/services?service=youth-club"
1113
+ },
1114
+ {
1115
+ "id": "66666666-6666-6666-6666-666666666663",
1116
+ "title": "Money Advice",
1117
+ "slug": "money-advice",
1118
+ "summary": "Free, confidential help with debt, benefits and the letters that keep you up at night.",
1119
+ "imageUrl": "p60fixture:service/advice",
1120
+ "href": "/services?service=money-advice"
1121
+ },
1122
+ {
1123
+ "id": "66666666-6666-6666-6666-666666666664",
1124
+ "title": "Community Garden",
1125
+ "slug": "community-garden",
1126
+ "summary": "Twenty-two raised beds, a greenhouse and a seed library, open to every Alderford household.",
1127
+ "imageUrl": "p60fixture:service/garden",
1128
+ "href": "/services?service=community-garden"
1129
+ },
1130
+ {
1131
+ "id": "66666666-6666-6666-6666-666666666665",
1132
+ "title": "Warm Spaces",
1133
+ "slug": "warm-spaces",
1134
+ "summary": "Our hall, open and heated through winter, with tea, wifi and company.",
1135
+ "imageUrl": "p60fixture:service/warmspace",
1136
+ "href": "/services?service=warm-spaces"
1137
+ }
1138
+ ],
1139
+ "pagination": {
1140
+ "page": 0,
1141
+ "size": 2,
1142
+ "totalElements": 3,
1143
+ "totalPages": 2,
1144
+ "nextHref": "/services?page=1",
1145
+ "previousHref": null
1146
+ }
1147
+ }
1148
+ },
1149
+ "events": {
1150
+ "collection": {
1151
+ "label": "Events",
1152
+ "href": "/events",
1153
+ "items": [
1154
+ {
1155
+ "id": "22222222-2222-2222-2222-222222222222",
1156
+ "name": "The Lantern Gala",
1157
+ "description": "Our biggest night of the year: supper, music from the Alderford Community Choir, and the annual lantern walk along the river to close.",
1158
+ "registrationMode": "TICKETED",
1159
+ "startsAt": "2030-09-20T19:00:00Z",
1160
+ "endsAt": null,
1161
+ "venueName": "The Maltings, Alderford",
1162
+ "online": false,
1163
+ "imageUrl": "p60fixture:event/gala",
1164
+ "onSale": true,
1165
+ "soldOut": false,
1166
+ "priceFrom": 25,
1167
+ "currency": "GBP",
1168
+ "detailHref": "/events?event=22222222-2222-2222-2222-222222222222"
1169
+ },
1170
+ {
1171
+ "id": "44444444-4444-4444-4444-444444444444",
1172
+ "name": "Riverside Harvest Supper",
1173
+ "description": "A long-table supper on the Aldern meadow, cooked by our kitchen volunteers with produce from the community garden.",
1174
+ "registrationMode": "TICKETED",
1175
+ "startsAt": "2030-10-04T18:30:00Z",
1176
+ "endsAt": "2030-10-04T22:00:00Z",
1177
+ "venueName": "Aldern Meadow",
1178
+ "online": false,
1179
+ "imageUrl": "p60fixture:event/harvest",
1180
+ "onSale": true,
1181
+ "soldOut": false,
1182
+ "priceFrom": 12.5,
1183
+ "currency": "GBP",
1184
+ "detailHref": "/events?event=44444444-4444-4444-4444-444444444444"
1185
+ },
1186
+ {
1187
+ "id": "55555555-5555-5555-5555-555555555555",
1188
+ "name": "Volunteer Welcome Evening",
1189
+ "description": "Meet the team, hear where help is needed most this season, and find a role that fits the time you have.",
1190
+ "registrationMode": "RSVP",
1191
+ "startsAt": "2030-09-03T18:00:00Z",
1192
+ "endsAt": "2030-09-03T19:30:00Z",
1193
+ "venueName": "Foundry Lane Hub",
1194
+ "online": false,
1195
+ "imageUrl": "p60fixture:event/welcome",
1196
+ "onSale": true,
1197
+ "soldOut": false,
1198
+ "priceFrom": null,
1199
+ "currency": null,
1200
+ "detailHref": "/events?event=55555555-5555-5555-5555-555555555555"
1201
+ },
1202
+ {
1203
+ "id": "66666666-6666-6666-6666-666666666666",
1204
+ "name": "Warm Space Wednesdays",
1205
+ "description": "Our hall is open, warm and stocked with tea every Wednesday through the cold months. No booking, no questions, everyone welcome.",
1206
+ "registrationMode": "INFO",
1207
+ "startsAt": "2030-11-06T10:00:00Z",
1208
+ "endsAt": "2030-11-06T15:00:00Z",
1209
+ "venueName": "St Chad's Hall",
1210
+ "online": false,
1211
+ "imageUrl": null,
1212
+ "onSale": true,
1213
+ "soldOut": false,
1214
+ "priceFrom": null,
1215
+ "currency": null,
1216
+ "detailHref": "/events?event=66666666-6666-6666-6666-666666666666"
1217
+ },
1218
+ {
1219
+ "id": "77777777-7777-7777-7777-777777777777",
1220
+ "name": "Money Advice Drop-in",
1221
+ "description": "A quiet hour with our trained advisers. Bring letters you are worried about; we will work through them together.",
1222
+ "registrationMode": "INFO",
1223
+ "startsAt": "2030-09-12T10:00:00Z",
1224
+ "endsAt": "2030-09-12T12:00:00Z",
1225
+ "venueName": null,
1226
+ "online": true,
1227
+ "imageUrl": null,
1228
+ "onSale": true,
1229
+ "soldOut": false,
1230
+ "priceFrom": null,
1231
+ "currency": null,
1232
+ "detailHref": "/events?event=77777777-7777-7777-7777-777777777777"
1233
+ },
1234
+ {
1235
+ "id": "88888888-8888-8888-8888-888888888888",
1236
+ "name": "Winter Fair",
1237
+ "description": "Stalls, carols and the grand raffle in aid of the Winter Appeal. Free entry; every stall staffed by volunteers.",
1238
+ "registrationMode": "TICKETED",
1239
+ "startsAt": "2030-12-07T11:00:00Z",
1240
+ "endsAt": "2030-12-07T16:00:00Z",
1241
+ "venueName": "Alderford Market Square",
1242
+ "online": false,
1243
+ "imageUrl": "p60fixture:event/winterfair",
1244
+ "onSale": true,
1245
+ "soldOut": true,
1246
+ "priceFrom": 0,
1247
+ "currency": "GBP",
1248
+ "detailHref": "/events?event=88888888-8888-8888-8888-888888888888"
1249
+ }
1250
+ ],
1251
+ "pagination": {
1252
+ "page": 0,
1253
+ "size": 2,
1254
+ "totalElements": 3,
1255
+ "totalPages": 2,
1256
+ "nextHref": "/events?page=1",
1257
+ "previousHref": null
1258
+ }
1259
+ }
1260
+ },
1261
+ "articles": {
1262
+ "collection": {
1263
+ "label": "Articles",
1264
+ "href": "/articles/all",
1265
+ "items": [
1266
+ {
1267
+ "id": "88888888-8888-8888-8888-888888888888",
1268
+ "title": "The Community Garden Opens Its Gates",
1269
+ "slug": "community-garden-opens",
1270
+ "excerpt": "Two years of digging, fundraising and Saturday mornings in the rain: the Foundry Lane garden is finally open to everyone.",
1271
+ "imageUrl": "p60fixture:article/garden",
1272
+ "authorName": "Amina Khan",
1273
+ "authorRole": "Community Editor",
1274
+ "categories": [
1275
+ "News"
1276
+ ],
1277
+ "publishedAt": "2030-04-12T09:00:00Z",
1278
+ "readingMinutes": 5,
1279
+ "href": "/articles/community-garden-opens"
1280
+ },
1281
+ {
1282
+ "id": "99999999-9999-9999-9999-999999999999",
1283
+ "title": "What a Food Parcel Actually Holds",
1284
+ "slug": "what-a-food-parcel-holds",
1285
+ "excerpt": "People imagine tins and pasta. The real list is longer, more personal, and put together with more care than you might think.",
1286
+ "imageUrl": "p60fixture:article/parcel",
1287
+ "authorName": "Derek Osei",
1288
+ "authorRole": "Food Bank Lead",
1289
+ "categories": [
1290
+ "Stories"
1291
+ ],
1292
+ "publishedAt": "2030-03-28T09:00:00Z",
1293
+ "readingMinutes": 6,
1294
+ "href": "/articles/what-a-food-parcel-holds"
1295
+ },
1296
+ {
1297
+ "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
1298
+ "title": "Meet the Wednesday Kitchen Crew",
1299
+ "slug": "wednesday-kitchen-crew",
1300
+ "excerpt": "Eleven volunteers, one borrowed oven, and a hundred and forty hot meals a week. The kitchen crew tell it in their own words.",
1301
+ "imageUrl": "p60fixture:people/kitchen",
1302
+ "authorName": "Amina Khan",
1303
+ "authorRole": "Community Editor",
1304
+ "categories": [
1305
+ "Stories"
1306
+ ],
1307
+ "publishedAt": "2030-03-02T09:00:00Z",
1308
+ "readingMinutes": 7,
1309
+ "href": "/articles/wednesday-kitchen-crew"
1310
+ },
1311
+ {
1312
+ "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
1313
+ "title": "Winter Appeal: Where Your Money Went",
1314
+ "slug": "winter-appeal-report",
1315
+ "excerpt": "You gave 18,400 pounds in eight weeks. Here is the line-by-line account of what it paid for, and what we learned.",
1316
+ "imageUrl": "p60fixture:campaign/winterreport",
1317
+ "authorName": "Priya Sharma",
1318
+ "authorRole": "Trustee",
1319
+ "categories": [
1320
+ "News"
1321
+ ],
1322
+ "publishedAt": "2030-02-14T09:00:00Z",
1323
+ "readingMinutes": 8,
1324
+ "href": "/articles/winter-appeal-report"
1325
+ },
1326
+ {
1327
+ "id": "cccccccc-cccc-cccc-cccc-cccccccccccc",
1328
+ "title": "Five Things Our Money Advisers Wish You Knew",
1329
+ "slug": "money-advice-five-things",
1330
+ "excerpt": "The advice team see the same worries again and again. Most of them have a fix that takes less than an hour.",
1331
+ "imageUrl": null,
1332
+ "authorName": "Tom Bradley",
1333
+ "authorRole": "Advice Service",
1334
+ "categories": [
1335
+ "Guides"
1336
+ ],
1337
+ "publishedAt": "2030-01-30T09:00:00Z",
1338
+ "readingMinutes": 4,
1339
+ "href": "/articles/money-advice-five-things"
1340
+ },
1341
+ {
1342
+ "id": "dddddddd-dddd-dddd-dddd-dddddddddddd",
1343
+ "title": "A Year of Warm Spaces, in Numbers",
1344
+ "slug": "warm-spaces-in-numbers",
1345
+ "excerpt": "Fourteen hundred visits, ninety regulars, and one chess league nobody planned. What happens when you just open the door.",
1346
+ "imageUrl": "p60fixture:service/warmspace",
1347
+ "authorName": "Amina Khan",
1348
+ "authorRole": "Community Editor",
1349
+ "categories": [
1350
+ "News"
1351
+ ],
1352
+ "publishedAt": "2030-01-08T09:00:00Z",
1353
+ "readingMinutes": 5,
1354
+ "href": "/articles/warm-spaces-in-numbers"
1355
+ }
1356
+ ],
1357
+ "pagination": {
1358
+ "page": 0,
1359
+ "size": 2,
1360
+ "totalElements": 3,
1361
+ "totalPages": 2,
1362
+ "nextHref": "/articles/all?page=1",
1363
+ "previousHref": null
1364
+ }
1365
+ }
1366
+ },
1367
+ "campaigns": {
1368
+ "collection": {
1369
+ "label": "Campaigns",
1370
+ "href": "/campaigns",
1371
+ "items": [
1372
+ {
1373
+ "id": "99999999-9999-9999-9999-999999999991",
1374
+ "title": "Keep the 27 Bus",
1375
+ "slug": "keep-the-27-bus",
1376
+ "href": "/campaigns/keep-the-27-bus",
1377
+ "summary": "The only bus serving the Fenwick estate is set to be cut. Add your name before the consultation closes.",
1378
+ "imageUrl": "p60fixture:campaign/bus"
1379
+ },
1380
+ {
1381
+ "id": "99999999-9999-9999-9999-999999999992",
1382
+ "title": "A Defibrillator on Every Street",
1383
+ "slug": "defibrillator-every-street",
1384
+ "href": "/campaigns/defibrillator-every-street",
1385
+ "summary": "We are raising for twelve more public defibrillators and training two hundred neighbours to use them.",
1386
+ "imageUrl": "p60fixture:campaign/defib"
1387
+ },
1388
+ {
1389
+ "id": "99999999-9999-9999-9999-999999999993",
1390
+ "title": "Alderford Housing Survey",
1391
+ "slug": "housing-survey",
1392
+ "href": "/campaigns/housing-survey",
1393
+ "summary": null,
1394
+ "imageUrl": null
1395
+ }
1396
+ ],
1397
+ "pagination": {
1398
+ "page": 0,
1399
+ "size": 2,
1400
+ "totalElements": 3,
1401
+ "totalPages": 2,
1402
+ "nextHref": "/campaigns?page=1",
1403
+ "previousHref": null
1404
+ }
1405
+ }
1406
+ },
1407
+ "causes": {
1408
+ "collection": {
1409
+ "label": "Causes",
1410
+ "href": "/donate",
1411
+ "items": [
1412
+ {
1413
+ "id": "55555555-5555-5555-5555-555555555550",
1414
+ "title": "Flood Response Appeal",
1415
+ "slug": "flood-response",
1416
+ "description": "The Aldern broke its banks on Sunday. Thirty households need dry bedding, dehumidifiers and somewhere warm now.",
1417
+ "imageUrl": "p60fixture:cause/flood",
1418
+ "targetAmount": 50000,
1419
+ "raisedAmount": 18750,
1420
+ "progressPercentage": 38,
1421
+ "href": "/donate/flood-response",
1422
+ "paymentOptions": {
1423
+ "oneOff": true,
1424
+ "recurringCard": true,
1425
+ "directDebit": true
1426
+ }
1427
+ },
1428
+ {
1429
+ "id": "55555555-5555-5555-5555-555555555551",
1430
+ "title": "Winter Appeal",
1431
+ "slug": "winter-appeal",
1432
+ "description": "Heating top-ups, warm bedding and a hot meal for the households the cold hits hardest.",
1433
+ "imageUrl": "p60fixture:cause/winter",
1434
+ "targetAmount": 20000,
1435
+ "raisedAmount": 12500,
1436
+ "progressPercentage": 63,
1437
+ "href": "/donate/winter-appeal",
1438
+ "paymentOptions": {
1439
+ "oneOff": true,
1440
+ "recurringCard": true,
1441
+ "directDebit": false
1442
+ }
1443
+ },
1444
+ {
1445
+ "id": "55555555-5555-5555-5555-555555555552",
1446
+ "title": "Food Bank Fund",
1447
+ "slug": "food-bank-fund",
1448
+ "description": "Keeps the shelves stocked between donation drives. Ten pounds fills a family parcel.",
1449
+ "imageUrl": "p60fixture:cause/foodbank",
1450
+ "targetAmount": 15000,
1451
+ "raisedAmount": 9800,
1452
+ "progressPercentage": 65,
1453
+ "href": "/donate/food-bank-fund",
1454
+ "paymentOptions": {
1455
+ "oneOff": true,
1456
+ "recurringCard": true,
1457
+ "directDebit": true
1458
+ }
1459
+ },
1460
+ {
1461
+ "id": "55555555-5555-5555-5555-555555555553",
1462
+ "title": "Youth Club Futures",
1463
+ "slug": "youth-club-futures",
1464
+ "description": "Coaching, kit and trips for the seventy young people who come through our doors each week.",
1465
+ "imageUrl": "p60fixture:cause/youth",
1466
+ "targetAmount": 8000,
1467
+ "raisedAmount": 2150,
1468
+ "progressPercentage": 27,
1469
+ "href": "/donate/youth-club-futures",
1470
+ "paymentOptions": {
1471
+ "oneOff": true,
1472
+ "recurringCard": false,
1473
+ "directDebit": false
1474
+ }
1475
+ }
1476
+ ],
1477
+ "pagination": {
1478
+ "page": 0,
1479
+ "size": 2,
1480
+ "totalElements": 3,
1481
+ "totalPages": 2,
1482
+ "nextHref": "/donate?page=1",
1483
+ "previousHref": null
1484
+ }
1485
+ }
1486
+ },
1487
+ "courses": {
1488
+ "collection": {
1489
+ "label": "Courses",
1490
+ "href": "/courses",
1491
+ "items": [
1492
+ {
1493
+ "id": "33333333-3333-3333-3333-333333333333",
1494
+ "title": "Junior Athletics",
1495
+ "description": "Weekly athletics for children aged 7 to 12, coached by qualified volunteers at the King's Park track.",
1496
+ "imageUrl": "p60fixture:course/athletics",
1497
+ "venue": "King's Park track",
1498
+ "audience": "CHILD",
1499
+ "priceFrom": 15,
1500
+ "currency": "GBP",
1501
+ "soldOut": false,
1502
+ "href": "/courses"
1503
+ }
1504
+ ],
1505
+ "pagination": {
1506
+ "page": 0,
1507
+ "size": 2,
1508
+ "totalElements": 3,
1509
+ "totalPages": 2,
1510
+ "nextHref": "/courses?page=1",
1511
+ "previousHref": null
1512
+ }
1513
+ }
1514
+ },
1515
+ "documents": {
1516
+ "collection": {
1517
+ "label": "Documents",
1518
+ "href": null,
1519
+ "items": [
1520
+ {
1521
+ "id": "88888888-8888-8888-8888-888888888881",
1522
+ "title": "Annual report 2029.pdf",
1523
+ "folder": "Reports",
1524
+ "url": "/fixture/annual-report-2029.pdf",
1525
+ "contentType": "application/pdf",
1526
+ "bytes": 1245760,
1527
+ "publishedAt": "2030-02-01T10:00:00Z"
1528
+ },
1529
+ {
1530
+ "id": "88888888-8888-8888-8888-888888888882",
1531
+ "title": "Safeguarding policy.pdf",
1532
+ "folder": "Policies",
1533
+ "url": "/fixture/safeguarding-policy.pdf",
1534
+ "contentType": "application/pdf",
1535
+ "bytes": 384000,
1536
+ "publishedAt": "2029-11-12T10:00:00Z"
1537
+ },
1538
+ {
1539
+ "id": "88888888-8888-8888-8888-888888888883",
1540
+ "title": "Volunteer handbook.pdf",
1541
+ "folder": "Volunteering",
1542
+ "url": "/fixture/volunteer-handbook.pdf",
1543
+ "contentType": "application/pdf",
1544
+ "bytes": 942080,
1545
+ "publishedAt": "2030-01-20T10:00:00Z"
1546
+ },
1547
+ {
1548
+ "id": "88888888-8888-8888-8888-888888888884",
1549
+ "title": "Hall hire form.pdf",
1550
+ "folder": "Forms",
1551
+ "url": "/fixture/hall-hire-form.pdf",
1552
+ "contentType": "application/pdf",
1553
+ "bytes": 128000,
1554
+ "publishedAt": "2029-09-02T10:00:00Z"
1555
+ }
1556
+ ],
1557
+ "pagination": {
1558
+ "page": 0,
1559
+ "size": 2,
1560
+ "totalElements": 3,
1561
+ "totalPages": 2,
1562
+ "nextHref": "/?page=1",
1563
+ "previousHref": null
1564
+ }
1565
+ }
1566
+ }
1567
+ }
1568
+ }
1569
+ }