@cogenta/starters 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blueprints/assets/photos/association/coat-bank.jpg +0 -0
- package/dist/blueprints/assets/photos/association/food-bank.jpg +0 -0
- package/dist/blueprints/assets/photos/association/garden-corner.jpg +0 -0
- package/dist/blueprints/assets/photos/association/garden-planting.jpg +0 -0
- package/dist/blueprints/assets/photos/association/hall.jpg +0 -0
- package/dist/blueprints/assets/photos/association/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/association/homework-club.jpg +0 -0
- package/dist/blueprints/assets/photos/association/orientation.jpg +0 -0
- package/dist/blueprints/assets/photos/association/partner-fr-college.png +0 -0
- package/dist/blueprints/assets/photos/association/partner-fr-delcourt.png +0 -0
- package/dist/blueprints/assets/photos/association/partner-fr-fondation.png +0 -0
- package/dist/blueprints/assets/photos/association/partner-fr-habitat.png +0 -0
- package/dist/blueprints/assets/photos/association/partner-fr-mairie.png +0 -0
- package/dist/blueprints/assets/photos/association/partner-fr-pharmacie.png +0 -0
- package/dist/blueprints/assets/photos/association/supper.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/desk-setup.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/library.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/notebook-and-coffee.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/notebooks.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/platform.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/pour-over.jpg +0 -0
- package/dist/blueprints/assets/photos/blog/typing.jpg +0 -0
- package/dist/blueprints/assets/photos/documentation/delivery-flow-en.png +0 -0
- package/dist/blueprints/assets/photos/documentation/delivery-flow-fr.png +0 -0
- package/dist/blueprints/assets/photos/magazine/allotments.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/archive-stacks.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/baguettes.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/dining-room.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/empty-tram-stop.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/gallery.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/office-block-dusk.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/reading-room.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/reception-hall.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/theatre.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/town-hall.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/tram-stop.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/coast-boats.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/coast-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/coast-ridge.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/coast-water.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/forest-beech.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/forest-birch.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/forest-branches.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/forest-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/glacier-cave.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/glacier-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/glacier-melt.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/glacier-tongue.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/lagoon-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/lagoon-egret.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/lagoon-shore.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/lagoon-storm.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/port-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/port-dusk.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/port-marina.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/port-quay.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/towers-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/towers-green.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/towers-single.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/towers-valley.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/vines-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/vines-grapes.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/vines-shed.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/vines-tree.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/beetroot-carpaccio.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/chocolate-tart.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/cod-vin-jaune.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/duck-confit.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/grilled-octopus.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/market-stall.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/mushroom-risotto.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/pike-quenelle.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/poached-pear.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/praline-cake.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/pumpkin-soup.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/street-burdeau.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/api-webhooks-en.png +0 -0
- package/dist/blueprints/assets/photos/saas/api-webhooks-fr.png +0 -0
- package/dist/blueprints/assets/photos/saas/approvals-queue-en.png +0 -0
- package/dist/blueprints/assets/photos/saas/approvals-queue-fr.png +0 -0
- package/dist/blueprints/assets/photos/saas/audit-log-en.png +0 -0
- package/dist/blueprints/assets/photos/saas/audit-log-fr.png +0 -0
- package/dist/blueprints/assets/photos/saas/erp-sync-en.png +0 -0
- package/dist/blueprints/assets/photos/saas/erp-sync-fr.png +0 -0
- package/dist/blueprints/assets/photos/saas/logo-castellan-alimentaire.png +0 -0
- package/dist/blueprints/assets/photos/saas/logo-cliniques-du-vivier.png +0 -0
- package/dist/blueprints/assets/photos/saas/logo-marenne-logistique.png +0 -0
- package/dist/blueprints/assets/photos/saas/logo-nordgate-habitat.png +0 -0
- package/dist/blueprints/assets/photos/saas/logo-tessaly-energies.png +0 -0
- package/dist/blueprints/assets/photos/saas/office-london.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/office-montreal.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/office-paris.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/office-toronto.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/policy-editor-en.png +0 -0
- package/dist/blueprints/assets/photos/saas/policy-editor-fr.png +0 -0
- package/dist/blueprints/assets/photos/saas/security-racks.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/spend-reporting-en.png +0 -0
- package/dist/blueprints/assets/photos/saas/spend-reporting-fr.png +0 -0
- package/dist/blueprints/assets/photos/saas/sso-scim-en.png +0 -0
- package/dist/blueprints/assets/photos/saas/sso-scim-fr.png +0 -0
- package/dist/blueprints/assets/photos/store/aleppo-soap.jpg +0 -0
- package/dist/blueprints/assets/photos/store/copper-pan.jpg +0 -0
- package/dist/blueprints/assets/photos/store/crochet-throw.jpg +0 -0
- package/dist/blueprints/assets/photos/store/enamel-mug.jpg +0 -0
- package/dist/blueprints/assets/photos/store/hero.jpg +0 -0
- package/dist/blueprints/assets/photos/store/knit-sweater.jpg +0 -0
- package/dist/blueprints/assets/photos/store/leather-boots.jpg +0 -0
- package/dist/blueprints/assets/photos/store/leather-duffel.jpg +0 -0
- package/dist/blueprints/assets/photos/store/leather-wallet.jpg +0 -0
- package/dist/blueprints/assets/photos/store/moka-pot.jpg +0 -0
- package/dist/blueprints/assets/photos/store/skillet.jpg +0 -0
- package/dist/blueprints/assets/photos/store/stoneware-bottles.jpg +0 -0
- package/dist/blueprints/assets/photos/store/story.jpg +0 -0
- package/dist/blueprints/assets/photos/store/turned-bowl.jpg +0 -0
- package/dist/blueprints/association-copy-en.d.ts +3 -0
- package/dist/blueprints/association-copy-en.d.ts.map +1 -0
- package/dist/blueprints/association-copy-en.js +834 -0
- package/dist/blueprints/association-copy-en.js.map +1 -0
- package/dist/blueprints/association-copy-fr.d.ts +3 -0
- package/dist/blueprints/association-copy-fr.d.ts.map +1 -0
- package/dist/blueprints/association-copy-fr.js +841 -0
- package/dist/blueprints/association-copy-fr.js.map +1 -0
- package/dist/blueprints/association-copy.d.ts +301 -0
- package/dist/blueprints/association-copy.d.ts.map +1 -0
- package/dist/blueprints/association-copy.js +17 -0
- package/dist/blueprints/association-copy.js.map +1 -0
- package/dist/blueprints/association-credits.d.ts +16 -0
- package/dist/blueprints/association-credits.d.ts.map +1 -0
- package/dist/blueprints/association-credits.js +80 -0
- package/dist/blueprints/association-credits.js.map +1 -0
- package/dist/blueprints/association-typography.d.ts +23 -0
- package/dist/blueprints/association-typography.d.ts.map +1 -0
- package/dist/blueprints/association-typography.js +55 -0
- package/dist/blueprints/association-typography.js.map +1 -0
- package/dist/blueprints/association.d.ts +86 -287
- package/dist/blueprints/association.d.ts.map +1 -1
- package/dist/blueprints/association.js +503 -1078
- package/dist/blueprints/association.js.map +1 -1
- package/dist/blueprints/blog-copy-en.d.ts +4 -0
- package/dist/blueprints/blog-copy-en.d.ts.map +1 -0
- package/dist/blueprints/blog-copy-en.js +701 -0
- package/dist/blueprints/blog-copy-en.js.map +1 -0
- package/dist/blueprints/blog-copy-fr.d.ts +12 -0
- package/dist/blueprints/blog-copy-fr.d.ts.map +1 -0
- package/dist/blueprints/blog-copy-fr.js +722 -0
- package/dist/blueprints/blog-copy-fr.js.map +1 -0
- package/dist/blueprints/blog-copy.d.ts +157 -0
- package/dist/blueprints/blog-copy.d.ts.map +1 -0
- package/dist/blueprints/blog-copy.js +2 -0
- package/dist/blueprints/blog-copy.js.map +1 -0
- package/dist/blueprints/blog-credits.d.ts +28 -0
- package/dist/blueprints/blog-credits.d.ts.map +1 -0
- package/dist/blueprints/blog-credits.js +73 -0
- package/dist/blueprints/blog-credits.js.map +1 -0
- package/dist/blueprints/blog-rich.d.ts +19 -0
- package/dist/blueprints/blog-rich.d.ts.map +1 -0
- package/dist/blueprints/blog-rich.js +51 -0
- package/dist/blueprints/blog-rich.js.map +1 -0
- package/dist/blueprints/blog.d.ts +51 -176
- package/dist/blueprints/blog.d.ts.map +1 -1
- package/dist/blueprints/blog.js +358 -947
- package/dist/blueprints/blog.js.map +1 -1
- package/dist/blueprints/content-pack.d.ts.map +1 -1
- package/dist/blueprints/content-pack.js +11 -16
- package/dist/blueprints/content-pack.js.map +1 -1
- package/dist/blueprints/content-packs.d.ts +2 -4
- package/dist/blueprints/content-packs.d.ts.map +1 -1
- package/dist/blueprints/content-packs.js +27 -15
- package/dist/blueprints/content-packs.js.map +1 -1
- package/dist/blueprints/documentation-copy-en.d.ts +3 -0
- package/dist/blueprints/documentation-copy-en.d.ts.map +1 -0
- package/dist/blueprints/documentation-copy-en.js +883 -0
- package/dist/blueprints/documentation-copy-en.js.map +1 -0
- package/dist/blueprints/documentation-copy-fr.d.ts +3 -0
- package/dist/blueprints/documentation-copy-fr.d.ts.map +1 -0
- package/dist/blueprints/documentation-copy-fr.js +939 -0
- package/dist/blueprints/documentation-copy-fr.js.map +1 -0
- package/dist/blueprints/documentation-copy.d.ts +52 -0
- package/dist/blueprints/documentation-copy.d.ts.map +1 -0
- package/dist/blueprints/documentation-copy.js +2 -0
- package/dist/blueprints/documentation-copy.js.map +1 -0
- package/dist/blueprints/documentation-writer.d.ts +67 -0
- package/dist/blueprints/documentation-writer.d.ts.map +1 -0
- package/dist/blueprints/documentation-writer.js +190 -0
- package/dist/blueprints/documentation-writer.js.map +1 -0
- package/dist/blueprints/documentation.d.ts +26 -29
- package/dist/blueprints/documentation.d.ts.map +1 -1
- package/dist/blueprints/documentation.js +106 -1064
- package/dist/blueprints/documentation.js.map +1 -1
- package/dist/blueprints/magazine-copy-en.d.ts +13 -0
- package/dist/blueprints/magazine-copy-en.d.ts.map +1 -0
- package/dist/blueprints/magazine-copy-en.js +553 -0
- package/dist/blueprints/magazine-copy-en.js.map +1 -0
- package/dist/blueprints/magazine-copy-fr.d.ts +14 -0
- package/dist/blueprints/magazine-copy-fr.d.ts.map +1 -0
- package/dist/blueprints/magazine-copy-fr.js +568 -0
- package/dist/blueprints/magazine-copy-fr.js.map +1 -0
- package/dist/blueprints/magazine-copy.d.ts +166 -0
- package/dist/blueprints/magazine-copy.d.ts.map +1 -0
- package/dist/blueprints/magazine-copy.js +58 -0
- package/dist/blueprints/magazine-copy.js.map +1 -0
- package/dist/blueprints/magazine-credits.d.ts +19 -0
- package/dist/blueprints/magazine-credits.d.ts.map +1 -0
- package/dist/blueprints/magazine-credits.js +109 -0
- package/dist/blueprints/magazine-credits.js.map +1 -0
- package/dist/blueprints/magazine.d.ts +30 -78
- package/dist/blueprints/magazine.d.ts.map +1 -1
- package/dist/blueprints/magazine.js +269 -690
- package/dist/blueprints/magazine.js.map +1 -1
- package/dist/blueprints/portfolio-copy-en.d.ts +4 -0
- package/dist/blueprints/portfolio-copy-en.d.ts.map +1 -0
- package/dist/blueprints/portfolio-copy-en.js +745 -0
- package/dist/blueprints/portfolio-copy-en.js.map +1 -0
- package/dist/blueprints/portfolio-copy-fr.d.ts +9 -0
- package/dist/blueprints/portfolio-copy-fr.d.ts.map +1 -0
- package/dist/blueprints/portfolio-copy-fr.js +737 -0
- package/dist/blueprints/portfolio-copy-fr.js.map +1 -0
- package/dist/blueprints/portfolio-copy.d.ts +204 -0
- package/dist/blueprints/portfolio-copy.d.ts.map +1 -0
- package/dist/blueprints/portfolio-copy.js +15 -0
- package/dist/blueprints/portfolio-copy.js.map +1 -0
- package/dist/blueprints/portfolio-credits.d.ts +18 -0
- package/dist/blueprints/portfolio-credits.d.ts.map +1 -0
- package/dist/blueprints/portfolio-credits.js +239 -0
- package/dist/blueprints/portfolio-credits.js.map +1 -0
- package/dist/blueprints/portfolio-typography.d.ts +19 -0
- package/dist/blueprints/portfolio-typography.d.ts.map +1 -0
- package/dist/blueprints/portfolio-typography.js +41 -0
- package/dist/blueprints/portfolio-typography.js.map +1 -0
- package/dist/blueprints/portfolio.d.ts +68 -157
- package/dist/blueprints/portfolio.d.ts.map +1 -1
- package/dist/blueprints/portfolio.js +475 -727
- package/dist/blueprints/portfolio.js.map +1 -1
- package/dist/blueprints/restaurant-copy-en.d.ts +3 -0
- package/dist/blueprints/restaurant-copy-en.d.ts.map +1 -0
- package/dist/blueprints/restaurant-copy-en.js +641 -0
- package/dist/blueprints/restaurant-copy-en.js.map +1 -0
- package/dist/blueprints/restaurant-copy-fr.d.ts +3 -0
- package/dist/blueprints/restaurant-copy-fr.d.ts.map +1 -0
- package/dist/blueprints/restaurant-copy-fr.js +665 -0
- package/dist/blueprints/restaurant-copy-fr.js.map +1 -0
- package/dist/blueprints/restaurant-copy.d.ts +234 -0
- package/dist/blueprints/restaurant-copy.d.ts.map +1 -0
- package/dist/blueprints/restaurant-copy.js +15 -0
- package/dist/blueprints/restaurant-copy.js.map +1 -0
- package/dist/blueprints/restaurant-credits.d.ts +18 -0
- package/dist/blueprints/restaurant-credits.d.ts.map +1 -0
- package/dist/blueprints/restaurant-credits.js +121 -0
- package/dist/blueprints/restaurant-credits.js.map +1 -0
- package/dist/blueprints/restaurant.d.ts +55 -128
- package/dist/blueprints/restaurant.d.ts.map +1 -1
- package/dist/blueprints/restaurant.js +425 -770
- package/dist/blueprints/restaurant.js.map +1 -1
- package/dist/blueprints/saas-copy-en.d.ts +3 -0
- package/dist/blueprints/saas-copy-en.d.ts.map +1 -0
- package/dist/blueprints/saas-copy-en.js +901 -0
- package/dist/blueprints/saas-copy-en.js.map +1 -0
- package/dist/blueprints/saas-copy-fr.d.ts +3 -0
- package/dist/blueprints/saas-copy-fr.d.ts.map +1 -0
- package/dist/blueprints/saas-copy-fr.js +912 -0
- package/dist/blueprints/saas-copy-fr.js.map +1 -0
- package/dist/blueprints/saas-copy.d.ts +266 -0
- package/dist/blueprints/saas-copy.d.ts.map +1 -0
- package/dist/blueprints/saas-copy.js +18 -0
- package/dist/blueprints/saas-copy.js.map +1 -0
- package/dist/blueprints/saas-credits.d.ts +22 -0
- package/dist/blueprints/saas-credits.d.ts.map +1 -0
- package/dist/blueprints/saas-credits.js +44 -0
- package/dist/blueprints/saas-credits.js.map +1 -0
- package/dist/blueprints/saas.d.ts +59 -203
- package/dist/blueprints/saas.d.ts.map +1 -1
- package/dist/blueprints/saas.js +505 -1108
- package/dist/blueprints/saas.js.map +1 -1
- package/dist/blueprints/store-copy-en.d.ts +4 -0
- package/dist/blueprints/store-copy-en.d.ts.map +1 -0
- package/dist/blueprints/store-copy-en.js +521 -0
- package/dist/blueprints/store-copy-en.js.map +1 -0
- package/dist/blueprints/store-copy-fr.d.ts +4 -0
- package/dist/blueprints/store-copy-fr.d.ts.map +1 -0
- package/dist/blueprints/store-copy-fr.js +521 -0
- package/dist/blueprints/store-copy-fr.js.map +1 -0
- package/dist/blueprints/store-copy.d.ts +219 -0
- package/dist/blueprints/store-copy.d.ts.map +1 -0
- package/dist/blueprints/store-copy.js +16 -0
- package/dist/blueprints/store-copy.js.map +1 -0
- package/dist/blueprints/store-credits.d.ts +3 -0
- package/dist/blueprints/store-credits.d.ts.map +1 -0
- package/dist/blueprints/store-credits.js +117 -0
- package/dist/blueprints/store-credits.js.map +1 -0
- package/dist/blueprints/store.d.ts +43 -231
- package/dist/blueprints/store.d.ts.map +1 -1
- package/dist/blueprints/store.js +466 -789
- package/dist/blueprints/store.js.map +1 -1
- package/dist/blueprints/vitrine-copy-en.d.ts.map +1 -1
- package/dist/blueprints/vitrine-copy-en.js +1 -0
- package/dist/blueprints/vitrine-copy-en.js.map +1 -1
- package/dist/blueprints/vitrine-copy-fr.d.ts.map +1 -1
- package/dist/blueprints/vitrine-copy-fr.js +1 -0
- package/dist/blueprints/vitrine-copy-fr.js.map +1 -1
- package/dist/blueprints/vitrine-copy.d.ts +1 -0
- package/dist/blueprints/vitrine-copy.d.ts.map +1 -1
- package/dist/blueprints/vitrine.d.ts +1 -0
- package/dist/blueprints/vitrine.d.ts.map +1 -1
- package/dist/blueprints/vitrine.js +24 -3
- package/dist/blueprints/vitrine.js.map +1 -1
- package/package.json +10 -10
- package/dist/blueprints/assets/photos/association/fundraising-dinner.jpg +0 -0
- package/dist/blueprints/assets/photos/association/volunteer-orientation.jpg +0 -0
- package/dist/blueprints/assets/photos/association/volunteer-portrait.jpg +0 -0
- package/dist/blueprints/assets/photos/association/winter-coat-collection.jpg +0 -0
- package/dist/blueprints/assets/photos/documentation/delivery-flow.png +0 -0
- package/dist/blueprints/assets/photos/magazine/archive-room.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/banquet-hall.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/city-hall.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/downtown-towers.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/gallery-opening.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/garden-volunteers.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/station-platform.jpg +0 -0
- package/dist/blueprints/assets/photos/magazine/theater-stage.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/fenmore-branch.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/fenmore-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/fenmore-stationery.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/gannet-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/gannet-sardines.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/gannet-shelf.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/hollis-crane-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/hollis-crane-grid.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/hollis-crane-salt-year.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/hollis-crane-spines.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/rookery-hall-brochure.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/rookery-hall-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/rookery-hall-poster-carnival.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/rookery-hall-poster-sibelius.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/rookery-hall-series.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/saltmarsh-quay-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/saltmarsh-quay-gate.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/saltmarsh-quay-pictograms.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/saltmarsh-quay-totem.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/tidewater-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/tidewater-data.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/tidewater-report-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/warp-and-weft-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/warp-and-weft-room.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/westmoor-rail-components.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/westmoor-rail-cover.jpg +0 -0
- package/dist/blueprints/assets/photos/portfolio/westmoor-rail-departures.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/beetroot-goats-curd.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/ceps-risotto.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/duck-leg-red-cabbage.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/hake-green-peppercorns.jpg +0 -0
- package/dist/blueprints/assets/photos/restaurant/vegetable-broth.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/adrian-tan.jpg +0 -0
- package/dist/blueprints/assets/photos/saas/api-webhooks.png +0 -0
- package/dist/blueprints/assets/photos/saas/approvals-queue.png +0 -0
- package/dist/blueprints/assets/photos/saas/audit-log.png +0 -0
- package/dist/blueprints/assets/photos/saas/erp-sync.png +0 -0
- package/dist/blueprints/assets/photos/saas/policy-editor.png +0 -0
- package/dist/blueprints/assets/photos/saas/spend-reporting.png +0 -0
- package/dist/blueprints/assets/photos/saas/sso-scim.png +0 -0
- package/dist/blueprints/assets/photos/store/brushed-cotton-overshirt.jpg +0 -0
- package/dist/blueprints/assets/photos/store/cable-knit-beanie.jpg +0 -0
- package/dist/blueprints/assets/photos/store/canvas-shoulder-bag.jpg +0 -0
- package/dist/blueprints/assets/photos/store/canvas-tote.jpg +0 -0
- package/dist/blueprints/assets/photos/store/cast-iron-skillet.jpg +0 -0
- package/dist/blueprints/assets/photos/store/field-jacket.jpg +0 -0
- package/dist/blueprints/assets/photos/store/heavyweight-t-shirt.jpg +0 -0
- package/dist/blueprints/assets/photos/store/leather-card-holder.jpg +0 -0
- package/dist/blueprints/assets/photos/store/linen-table-runner.jpg +0 -0
- package/dist/blueprints/assets/photos/store/porcelain-pour-over-set.jpg +0 -0
- package/dist/blueprints/assets/photos/store/striped-wool-blanket.jpg +0 -0
|
@@ -1,144 +1,166 @@
|
|
|
1
1
|
import { CogentaError } from '@cogenta/core';
|
|
2
2
|
import { createContentStore, createMenuStore, createSiteSettingsStore, defineCollection, ensureMenuTables, ensureSiteSettingsTables, f, SITE_SETTINGS_SITE_SCOPE, siteSettingByKey, validateCollectionSet, } from '@cogenta/schema';
|
|
3
3
|
import { coverArt, heroArt, logoArt } from '../demo-art/compositions.js';
|
|
4
|
+
import { ASSOCIATION_COPY_EN } from './association-copy-en.js';
|
|
5
|
+
import { ASSOCIATION_COPY_FR } from './association-copy-fr.js';
|
|
6
|
+
import { ASSOCIATION_PHOTO_CREDITS } from './association-credits.js';
|
|
7
|
+
import { typesetFrench } from './association-typography.js';
|
|
4
8
|
import { definePageCollection, SEO_FIELDS, toBlockZoneEntry, } from './content-pack.js';
|
|
5
9
|
import { STARTING_SKINS } from './starting-skins.js';
|
|
6
10
|
/**
|
|
7
11
|
* The `association` blueprint (L27, `@cogenta/theme-association`): a
|
|
8
|
-
* neighbourhood charity
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* neighbourhood charity run from an old library. It keeps a Thursday food
|
|
13
|
+
* bank, a homework club, a community garden and a winter clothing bank going
|
|
14
|
+
* with three hundred volunteers and two part-time staff, and its site has the
|
|
15
|
+
* pages such a charity actually needs: what it does, a calendar of dated events
|
|
16
|
+
* with a page each, how to volunteer, how to give, where the money goes, its
|
|
17
|
+
* story and trustees, how to reach it, and its privacy notice.
|
|
18
|
+
*
|
|
19
|
+
* Written in French and in English, not translated at render time: the
|
|
20
|
+
* installer picks the copy for the site's default locale, and with it the
|
|
21
|
+
* addresses (`/nos-actions/…` in French, `/what-we-do/…` in English), the
|
|
22
|
+
* collection names the administration shows and every word of demo content.
|
|
23
|
+
* The French site is a French "association loi 1901" (membership, general
|
|
24
|
+
* assembly, tax receipts at 66 %); the English one an English charity (Gift
|
|
25
|
+
* Aid, trustees, a charity number).
|
|
15
26
|
*
|
|
16
27
|
* **No payment system, and nothing that pretends to be one.** A blueprint
|
|
17
28
|
* writes content; contract B has no payment block and nothing in a page can
|
|
18
|
-
* take a card. So every "Donate" leads to a
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* online with a plausible account number on it would send real money to a
|
|
29
|
+
* take a card. So every "Donate" leads to a page that says how to give for
|
|
30
|
+
* real: a standing order set up with the donor's own bank from details the
|
|
31
|
+
* treasurer sends on request, a cheque by post, cash at the hall, with an email
|
|
32
|
+
* and a telephone number that work on any device. The bank account number is
|
|
33
|
+
* sent by the treasurer rather than printed on a page: a demonstration site
|
|
34
|
+
* left online with a plausible account number on it would send real money to a
|
|
25
35
|
* stranger.
|
|
26
36
|
*
|
|
27
|
-
* The
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* `DEFAULT_ASSOCIATION_NAME`. The town, the street and the people are
|
|
34
|
-
* invented. The telephone number is in Ofcom's range reserved for drama
|
|
35
|
-
* (01632 960xxx), so it can never ring anyone.
|
|
37
|
+
* The organisation is the site: its name comes from `SeedContext.siteName`, in
|
|
38
|
+
* the copy, the testimonial and the email addresses, and falls back to the
|
|
39
|
+
* copy's `defaultName`. The town, the street and the people are invented, and
|
|
40
|
+
* so are the partners: their wordmarks were drawn for this blueprint. Every
|
|
41
|
+
* photograph is a real one under an open licence, credited on its own page;
|
|
42
|
+
* none shows a person presented as a volunteer or a beneficiary.
|
|
36
43
|
*/
|
|
37
|
-
export const DEFAULT_ASSOCIATION_NAME =
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
export const CHARITY_NUMBER = '1299418';
|
|
44
|
+
export const DEFAULT_ASSOCIATION_NAME = ASSOCIATION_COPY_EN.defaultName;
|
|
45
|
+
/** The copy for a site's default locale: French for any `fr*` locale, English otherwise. */
|
|
46
|
+
export function associationCopyFor(locale) {
|
|
47
|
+
return locale.toLowerCase().startsWith('fr') ? FRENCH_COPY : ASSOCIATION_COPY_EN;
|
|
48
|
+
}
|
|
49
|
+
const FRENCH_COPY = typesetFrench(ASSOCIATION_COPY_FR);
|
|
44
50
|
const PERMISSIONS = {
|
|
45
51
|
read: ['public'],
|
|
46
52
|
create: ['editor', 'admin'],
|
|
47
53
|
update: ['editor', 'admin'],
|
|
48
54
|
delete: ['admin'],
|
|
55
|
+
// An undeclared action grants nobody, admin included: without this line
|
|
56
|
+
// nothing on this site could ever leave draft.
|
|
57
|
+
publish: ['admin'],
|
|
49
58
|
};
|
|
50
59
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
60
|
+
* The content model, named and routed in the copy's language.
|
|
61
|
+
*
|
|
62
|
+
* An event has a date and time (`date`, with `endsAt` when it has an end), a
|
|
63
|
+
* place and its street address, what it costs and whether to book. The theme
|
|
64
|
+
* reads these by name, lists events as a dated calendar and opens each event's
|
|
65
|
+
* own page on its date. A programme is something the charity runs every week
|
|
66
|
+
* or every season.
|
|
55
67
|
*/
|
|
56
|
-
export
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
max:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
68
|
+
export function associationSchema(copy) {
|
|
69
|
+
const { schema } = copy;
|
|
70
|
+
const event = defineCollection({
|
|
71
|
+
name: 'event',
|
|
72
|
+
versioning: { drafts: true, history: true },
|
|
73
|
+
labels: schema.labels.event,
|
|
74
|
+
routing: { pattern: schema.routes.event },
|
|
75
|
+
fields: {
|
|
76
|
+
title: f.text({ required: true, max: 200 }),
|
|
77
|
+
slug: f.slug({ from: 'title', unique: true }),
|
|
78
|
+
date: f.datetime({ required: true, admin: { label: schema.fields.starts } }),
|
|
79
|
+
endsAt: f.datetime({ admin: { label: schema.fields.ends } }),
|
|
80
|
+
location: f.text({
|
|
81
|
+
max: 120,
|
|
82
|
+
admin: { label: schema.fields.place, help: schema.help.place },
|
|
83
|
+
}),
|
|
84
|
+
address: f.text({ max: 160, admin: { label: schema.fields.address } }),
|
|
85
|
+
cost: f.text({ max: 120, admin: { help: schema.help.cost } }),
|
|
86
|
+
booking: f.text({ max: 160, admin: { help: schema.help.booking } }),
|
|
87
|
+
description: f.text({
|
|
88
|
+
max: 300,
|
|
89
|
+
multiline: true,
|
|
90
|
+
admin: { label: schema.fields.summary, help: schema.help.summary },
|
|
91
|
+
}),
|
|
92
|
+
coverImage: f.media({ accept: ['image'] }),
|
|
93
|
+
blocks: f.blocks(),
|
|
94
|
+
...SEO_FIELDS,
|
|
95
|
+
},
|
|
96
|
+
indexes: [['slug'], ['date']],
|
|
97
|
+
permissions: PERMISSIONS,
|
|
98
|
+
});
|
|
99
|
+
const programme = defineCollection({
|
|
100
|
+
name: 'programme',
|
|
101
|
+
versioning: { drafts: true, history: true },
|
|
102
|
+
labels: schema.labels.programme,
|
|
103
|
+
routing: { pattern: schema.routes.programme },
|
|
104
|
+
fields: {
|
|
105
|
+
title: f.text({ required: true, max: 120 }),
|
|
106
|
+
slug: f.slug({ from: 'title', unique: true }),
|
|
107
|
+
summary: f.text({ max: 300, multiline: true }),
|
|
108
|
+
schedule: f.text({
|
|
109
|
+
max: 120,
|
|
110
|
+
admin: { label: schema.fields.when, help: schema.help.when },
|
|
111
|
+
}),
|
|
112
|
+
location: f.text({ max: 120, admin: { label: schema.fields.place } }),
|
|
113
|
+
address: f.text({ max: 160, admin: { label: schema.fields.address } }),
|
|
114
|
+
audience: f.text({ max: 160, admin: { label: schema.fields.audience } }),
|
|
115
|
+
cost: f.text({ max: 120 }),
|
|
116
|
+
contact: f.text({ max: 120, admin: { help: schema.help.contact } }),
|
|
117
|
+
coverImage: f.media({ accept: ['image'] }),
|
|
118
|
+
blocks: f.blocks(),
|
|
119
|
+
...SEO_FIELDS,
|
|
120
|
+
},
|
|
121
|
+
indexes: [['slug']],
|
|
122
|
+
permissions: PERMISSIONS,
|
|
123
|
+
});
|
|
124
|
+
const page = definePageCollection('/:slug');
|
|
125
|
+
const collections = [event, programme, page];
|
|
126
|
+
validateCollectionSet(collections);
|
|
127
|
+
return { event, programme, page, collections };
|
|
128
|
+
}
|
|
112
129
|
const BLOCK_VERSION = '1.0.0';
|
|
113
130
|
// ---------------------------------------------------------------------------
|
|
114
131
|
// The organisation's name and addresses
|
|
115
132
|
// ---------------------------------------------------------------------------
|
|
116
|
-
export function nameOf(siteName) {
|
|
133
|
+
export function nameOf(siteName, copy) {
|
|
117
134
|
const trimmed = siteName?.trim();
|
|
118
|
-
return trimmed === undefined || trimmed === '' ?
|
|
135
|
+
return trimmed === undefined || trimmed === '' ? copy.defaultName : trimmed;
|
|
119
136
|
}
|
|
120
137
|
/** `volunteer@commonground.org.uk` for "Common Ground": the organisation's own name, as a mailbox. */
|
|
121
|
-
export function associationEmail(siteName, mailbox
|
|
122
|
-
const domain = nameOf(siteName)
|
|
138
|
+
export function associationEmail(siteName, mailbox, copy) {
|
|
139
|
+
const domain = nameOf(siteName, copy)
|
|
123
140
|
.normalize('NFKD')
|
|
124
141
|
.replace(/[̀-ͯ]/g, '')
|
|
125
142
|
.toLowerCase()
|
|
126
143
|
.replace(/&/g, 'and')
|
|
127
144
|
.replace(/[^a-z0-9]+/g, '');
|
|
128
|
-
return `${mailbox}@${domain === '' ?
|
|
145
|
+
return `${mailbox}@${domain === '' ? copy.identity.emailFallback : domain}.${copy.identity.emailSuffix}`;
|
|
129
146
|
}
|
|
130
|
-
function
|
|
131
|
-
|
|
147
|
+
function contextFor(copy, siteName) {
|
|
148
|
+
const email = (mailbox = 'hello') => associationEmail(siteName, mailbox, copy);
|
|
149
|
+
return {
|
|
150
|
+
name: nameOf(siteName, copy),
|
|
151
|
+
email,
|
|
152
|
+
mailto: (mailbox, subject) => `mailto:${email(mailbox)}?subject=${encodeURIComponent(subject)}`,
|
|
153
|
+
};
|
|
132
154
|
}
|
|
133
155
|
/**
|
|
134
156
|
* A paragraph where `[words](href)` becomes a link. Nothing else is
|
|
135
157
|
* interpreted: the copy stays plain text a person can read in this file.
|
|
136
158
|
*/
|
|
137
159
|
function textBlock(key, style, text, listItem) {
|
|
138
|
-
const parts = text.split(/(\[[^\]]+\]\(
|
|
160
|
+
const parts = text.split(/(\[[^\]]+\]\(\S+?\)(?=\s|$))/).filter((part) => part !== '');
|
|
139
161
|
const markDefs = [];
|
|
140
162
|
const children = parts.map((part, index) => {
|
|
141
|
-
const link = /^\[([^\]]+)\]\((
|
|
163
|
+
const link = /^\[([^\]]+)\]\((\S+?)\)$/.exec(part);
|
|
142
164
|
if (link === null) {
|
|
143
165
|
return { _key: `${key}-s${index}`, _type: 'span', text: part, marks: [] };
|
|
144
166
|
}
|
|
@@ -177,10 +199,10 @@ function prose(key, lines) {
|
|
|
177
199
|
};
|
|
178
200
|
}
|
|
179
201
|
function answers(key, items) {
|
|
180
|
-
return items.map((
|
|
202
|
+
return items.map((item, index) => ({
|
|
181
203
|
_key: `${key}-${index}`,
|
|
182
|
-
question,
|
|
183
|
-
answer: [textBlock(`${key}-${index}-a`, 'normal',
|
|
204
|
+
question: item.question,
|
|
205
|
+
answer: [textBlock(`${key}-${index}-a`, 'normal', item.answer)],
|
|
184
206
|
}));
|
|
185
207
|
}
|
|
186
208
|
function list(key, collection, options) {
|
|
@@ -217,343 +239,125 @@ function mediaFigure(key, media, name, caption, ratio = 'original') {
|
|
|
217
239
|
},
|
|
218
240
|
];
|
|
219
241
|
}
|
|
220
|
-
|
|
221
|
-
{
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
],
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
slug: 'homework-club',
|
|
244
|
-
title: 'Homework club',
|
|
245
|
-
summary: 'Two quiet afternoons a week in the reading room for children aged 10 to 14, with volunteer tutors, laptops, a printer and something to eat.',
|
|
246
|
-
schedule: 'Tuesdays and Thursdays, 3.30pm to 5.30pm, in term time',
|
|
247
|
-
location: `${HALL}, upstairs reading room`,
|
|
248
|
-
audience: 'Children aged 10 to 14 from any school in Ashworth',
|
|
249
|
-
cost: 'Free',
|
|
250
|
-
mailbox: 'homework',
|
|
251
|
-
photo: 'programme-homework-club',
|
|
252
|
-
body: [
|
|
253
|
-
'The homework club started in 2009, when a parent noticed that the reading room above the hall sat empty on weekday afternoons while her children had nowhere quiet to work. Today 46 children from nine schools come at least once a week.',
|
|
254
|
-
'## An afternoon at the club',
|
|
255
|
-
'Children arrive from school, sign in and have toast or fruit first. Then they work at their own pace on whatever they have been set, with one tutor for every four children. Most of the tutors are sixth-form students from Ashworth College and two retired teachers who run the sessions.',
|
|
256
|
-
'We have twelve laptops, a printer, a shelf of revision guides for every GCSE subject we could find, and a rule that phones stay in bags until five.',
|
|
257
|
-
'## Joining',
|
|
258
|
-
'A parent or carer fills in a one-page form at the hall or by email, with an emergency contact and anything we should know about health or learning. There is no waiting list at the moment for Tuesday; Thursday has four places left.',
|
|
259
|
-
'Every tutor has an enhanced DBS check, arranged and paid for by us, and completes our safeguarding session before their first afternoon.',
|
|
260
|
-
],
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
slug: 'community-garden',
|
|
264
|
-
title: 'Community garden',
|
|
265
|
-
summary: 'Twelve raised beds behind the hall, planted and picked by anyone who wants to help. Last year they grew 1.4 tonnes of vegetables for the food bank.',
|
|
266
|
-
schedule: 'Saturdays, 9.30am to 12.30pm, April to October',
|
|
267
|
-
location: 'Elm Street garden, behind the hall',
|
|
268
|
-
audience: 'Everyone, including children with an adult',
|
|
269
|
-
cost: 'Free',
|
|
270
|
-
mailbox: 'garden',
|
|
271
|
-
photo: 'programme-garden',
|
|
272
|
-
body: [
|
|
273
|
-
'The garden began as three raised beds on the edge of the car park in 2012. It now runs the length of the plot behind the hall: twelve beds, a polytunnel given by Kestrel Homes, two water butts and a shed of tools anyone can borrow on a Saturday.',
|
|
274
|
-
'## What grows',
|
|
275
|
-
'We grow what the food bank hands out fastest: potatoes, onions, carrots, courgettes, beans, salad leaves and herbs. Everything picked on a Saturday morning is weighed, washed and on the food bank tables the following Thursday.',
|
|
276
|
-
'## Coming along',
|
|
277
|
-
'Turn up on any Saturday from April to October. Gloves, tools and tea are provided, and one of the regular gardeners shows anyone new what needs doing. Nobody needs to know anything about plants; most of the jobs are digging, weeding and watering.',
|
|
278
|
-
'The raised beds are waist height at one end, so the garden works for anyone who cannot kneel.',
|
|
279
|
-
],
|
|
280
|
-
},
|
|
281
|
-
{
|
|
282
|
-
slug: 'winter-coat-bank',
|
|
283
|
-
title: 'Winter coat bank',
|
|
284
|
-
summary: 'Warm coats, boots and school uniform jumpers, given by neighbours and sorted by size, free to any family who needs them from October to February.',
|
|
285
|
-
schedule: 'Mondays, 10am to 1pm, October to February',
|
|
286
|
-
location: `${HALL}, main hall`,
|
|
287
|
-
audience: 'Adults and children in Ashworth',
|
|
288
|
-
cost: 'Free',
|
|
289
|
-
mailbox: 'coats',
|
|
290
|
-
photo: 'programme-coat-bank',
|
|
291
|
-
body: [
|
|
292
|
-
'Last winter the coat bank gave out 820 coats, 310 pairs of boots and 190 school jumpers. Every one of them was given by someone in the town, checked for zips and buttons, washed if it needed it and hung by size.',
|
|
293
|
-
'## Choosing a coat',
|
|
294
|
-
'Come to the hall on a Monday morning between October and February and choose what fits. There is a changing screen, a mirror and a volunteer to help find a size. Families can take a coat for each person at home.',
|
|
295
|
-
'## Giving a coat',
|
|
296
|
-
'We take clean coats, boots and jumpers in good condition at the hall on weekdays from September. We are always short of children’s coats in ages 8 to 13 and of men’s boots in large sizes.',
|
|
297
|
-
'## Where the coats go',
|
|
298
|
-
'Anything we cannot use, because it is torn or the wrong season, goes to a textile recycler in Ashworth, who pays us by the kilo. Last winter that paid for the coat rails and the hangers.',
|
|
299
|
-
],
|
|
300
|
-
},
|
|
301
|
-
];
|
|
302
|
-
export function associationProgrammeBlocks(item, siteName) {
|
|
303
|
-
const name = nameOf(siteName);
|
|
242
|
+
function iconItems(items, keyPrefix) {
|
|
243
|
+
return items.map((item, index) => ({
|
|
244
|
+
_key: `${keyPrefix}-${index}`,
|
|
245
|
+
...(item.icon === undefined ? {} : { icon: item.icon }),
|
|
246
|
+
title: item.title,
|
|
247
|
+
text: item.text,
|
|
248
|
+
...(item.href === undefined ? {} : { link: { href: item.href } }),
|
|
249
|
+
}));
|
|
250
|
+
}
|
|
251
|
+
function actions(items) {
|
|
252
|
+
return items.map((item) => ({
|
|
253
|
+
label: item.label,
|
|
254
|
+
target: { href: item.href },
|
|
255
|
+
...(item.primary === true ? { emphasis: 'primary' } : {}),
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
// Programmes and events
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
export function associationProgrammeBlocks(copy, item) {
|
|
304
262
|
return [
|
|
305
|
-
prose(`programme-${item.slug}-body`, item.body
|
|
263
|
+
prose(`programme-${item.slug}-body`, item.body),
|
|
306
264
|
list(`programme-${item.slug}-others`, 'programme', {
|
|
307
|
-
title:
|
|
265
|
+
title: copy.programmeBlocks.othersTitle,
|
|
308
266
|
layout: 'grid',
|
|
309
267
|
limit: 4,
|
|
310
268
|
}),
|
|
311
269
|
];
|
|
312
270
|
}
|
|
313
|
-
|
|
314
|
-
* Six dates, one to six weeks out. The copy never names a weekday, because
|
|
315
|
-
* the day of the week depends on when the site is created.
|
|
316
|
-
*/
|
|
317
|
-
export const ASSOCIATION_DEMO_EVENTS = [
|
|
318
|
-
{
|
|
319
|
-
title: 'Volunteer orientation evening',
|
|
320
|
-
slug: 'volunteer-orientation-evening',
|
|
321
|
-
daysFromNow: 6,
|
|
322
|
-
start: [18, 0],
|
|
323
|
-
end: [19, 30],
|
|
324
|
-
location: `${HALL}, upstairs reading room`,
|
|
325
|
-
address: HALL_ADDRESS,
|
|
326
|
-
cost: 'Free',
|
|
327
|
-
booking: 'No need to book, but tell us you are coming',
|
|
328
|
-
description: 'An hour and a half for anyone thinking of volunteering: what each role involves, who runs it, and which shifts need people now.',
|
|
329
|
-
photo: 'event-orientation',
|
|
330
|
-
body: [
|
|
331
|
-
'Most of our 312 volunteers started at one of these evenings. The volunteer coordinator and the people who lead the food bank, the homework club, the garden and the coat bank each talk for ten minutes about what a shift is really like, then stay to answer questions over tea.',
|
|
332
|
-
'## What happens next',
|
|
333
|
-
'Nobody signs up for anything on the night. If a role suits you, the coordinator arranges a first shift alongside an experienced volunteer. For the homework club we start the DBS check that week, which usually takes three to four weeks.',
|
|
334
|
-
'The reading room is up one flight of stairs. If stairs are difficult, tell us and we will meet in the main hall instead.',
|
|
335
|
-
],
|
|
336
|
-
},
|
|
337
|
-
{
|
|
338
|
-
title: 'Food collection at Brindle & Sons',
|
|
339
|
-
slug: 'food-collection-brindle-and-sons',
|
|
340
|
-
daysFromNow: 11,
|
|
341
|
-
start: [10, 0],
|
|
342
|
-
end: [14, 0],
|
|
343
|
-
location: 'Brindle & Sons car park',
|
|
344
|
-
address: '14 Market Row, Ashworth AW4 1BS',
|
|
345
|
-
cost: 'Free',
|
|
346
|
-
booking: 'No booking needed',
|
|
347
|
-
description: 'Our biggest collection of the year. Bring tins and dry food to the market car park, or give two hours to sort what arrives.',
|
|
348
|
-
photo: 'programme-food-bank',
|
|
349
|
-
body: [
|
|
350
|
-
'The last time we held this collection, one day brought in 2.1 tonnes of food, enough to fill the food bank shelves for eight weeks. Brindle & Sons lend us their car park and a van, and match every tenth tin with one of their own.',
|
|
351
|
-
'## What to bring',
|
|
352
|
-
'Tinned fish and meat, tinned vegetables, UHT milk, rice, pasta sauce, tea, coffee, and toiletries. Please nothing opened, homemade or past its date.',
|
|
353
|
-
'## Helping on the day',
|
|
354
|
-
'We need about 30 people across the day, in two-hour slots, to take donations at the tables and to sort them into crates inside the shop’s storeroom. Come for one slot or stay for all of it.',
|
|
355
|
-
],
|
|
356
|
-
},
|
|
357
|
-
{
|
|
358
|
-
title: 'Planting morning in the garden',
|
|
359
|
-
slug: 'planting-morning-in-the-garden',
|
|
360
|
-
daysFromNow: 17,
|
|
361
|
-
start: [9, 30],
|
|
362
|
-
end: [12, 30],
|
|
363
|
-
location: 'Elm Street garden, behind the hall',
|
|
364
|
-
address: HALL_ADDRESS,
|
|
365
|
-
cost: 'Free',
|
|
366
|
-
booking: 'No booking needed',
|
|
367
|
-
description: 'A morning of planting and clearing the raised beds and the polytunnel. Tools, gloves and tea provided, children welcome with an adult.',
|
|
368
|
-
photo: 'programme-garden',
|
|
369
|
-
body: [
|
|
370
|
-
'Six times a year the garden needs more hands than a regular session brings. We plant whatever the time of year allows in the open beds, sow salad leaves and herbs under the polytunnel, clear what has finished, and give the empty beds a fresh layer of compost.',
|
|
371
|
-
'## Bring',
|
|
372
|
-
'Clothes that can get muddy and boots if you have them. We have gloves in every size, tools for about forty people and a kettle in the shed. There is a bed kept for children, with fast-growing radishes and sunflowers.',
|
|
373
|
-
],
|
|
374
|
-
},
|
|
375
|
-
{
|
|
376
|
-
title: 'Coat and boot collection',
|
|
377
|
-
slug: 'coat-and-boot-collection',
|
|
378
|
-
daysFromNow: 24,
|
|
379
|
-
start: [10, 0],
|
|
380
|
-
end: [15, 0],
|
|
381
|
-
location: `${HALL}, main hall`,
|
|
382
|
-
address: HALL_ADDRESS,
|
|
383
|
-
cost: 'Free',
|
|
384
|
-
booking: 'Drop in any time',
|
|
385
|
-
description: 'Bring clean coats, boots and school jumpers you no longer need. Everything is checked, sorted by size and kept for the coat bank.',
|
|
386
|
-
photo: 'programme-coat-bank',
|
|
387
|
-
body: [
|
|
388
|
-
'The coat bank is stocked by collections through the year, so there is a rail ready for every family when it opens. Bring what you can carry to the main hall between 10am and 3pm; a volunteer checks each coat with you at the door, so nothing needs to be sorted beforehand.',
|
|
389
|
-
'## What we need most',
|
|
390
|
-
'Children’s coats for ages 8 to 13, men’s coats and boots in large sizes, and grey or black school jumpers in any size. We cannot take coats that are torn, stained or missing a zip.',
|
|
391
|
-
],
|
|
392
|
-
},
|
|
393
|
-
{
|
|
394
|
-
title: 'Annual general meeting',
|
|
395
|
-
slug: 'annual-general-meeting',
|
|
396
|
-
daysFromNow: 31,
|
|
397
|
-
start: [19, 0],
|
|
398
|
-
end: [20, 30],
|
|
399
|
-
location: `${HALL}, main hall`,
|
|
400
|
-
address: HALL_ADDRESS,
|
|
401
|
-
cost: 'Free',
|
|
402
|
-
booking: 'Open to everyone; members vote',
|
|
403
|
-
description: 'The trustees present the year’s accounts and annual report, two trustees stand for election, and anyone can ask a question.',
|
|
404
|
-
body: [
|
|
405
|
-
'Once a year the trustees account for every pound we received and spent, and for what the four programmes achieved. The treasurer presents the accounts for the year to 31 March, independently examined, and the chair presents the annual report.',
|
|
406
|
-
'## On the agenda',
|
|
407
|
-
'- The annual report and accounts',
|
|
408
|
-
'- The election of two trustees, one of them a volunteer at the food bank',
|
|
409
|
-
'- The reserves policy, which the trustees propose to keep at three months of spending',
|
|
410
|
-
'- Questions from the floor',
|
|
411
|
-
'Anyone may attend and ask a question. Members, meaning anyone who has volunteered or given in the past year and asked to join, may vote. Printed copies of the accounts are at the hall from two weeks before.',
|
|
412
|
-
],
|
|
413
|
-
},
|
|
414
|
-
{
|
|
415
|
-
title: 'Community supper',
|
|
416
|
-
slug: 'community-supper',
|
|
417
|
-
daysFromNow: 38,
|
|
418
|
-
start: [18, 30],
|
|
419
|
-
end: [22, 0],
|
|
420
|
-
location: 'Ashworth Town Hall, Wardle Room',
|
|
421
|
-
address: 'Market Square, Ashworth AW4 1AA',
|
|
422
|
-
cost: '£25, or £12 for under-16s',
|
|
423
|
-
booking: 'Tickets from the hall or by email; 180 places',
|
|
424
|
-
description: 'Three courses cooked by volunteers, a raffle, and a short word from the food bank team. Every ticket pays for four food parcels.',
|
|
425
|
-
photo: 'event-supper',
|
|
426
|
-
body: [
|
|
427
|
-
'Our one fundraising dinner of the year. Last year 170 people came and the evening raised £9,400, which paid for the fresh food at Thursday’s food bank for three months.',
|
|
428
|
-
'## The evening',
|
|
429
|
-
'Doors open at 6.30pm, dinner is at 7pm, and the raffle is drawn between the main course and pudding. The menu is soup, a vegetable and bean casserole or roast chicken, and a fruit crumble, with a vegetarian or vegan option at every course if you tell us when you book.',
|
|
430
|
-
'The Wardle Room is step-free with an accessible toilet. The Market Square car park is free in the evening.',
|
|
431
|
-
],
|
|
432
|
-
},
|
|
433
|
-
];
|
|
434
|
-
/** ISO 8601, computed from "now" at scaffold time: never a fixed calendar date that ages into the past. */
|
|
435
|
-
function futureIso(daysFromNow, [hour, minute]) {
|
|
436
|
-
const date = new Date();
|
|
437
|
-
date.setUTCDate(date.getUTCDate() + daysFromNow);
|
|
438
|
-
date.setUTCHours(hour, minute, 0, 0);
|
|
439
|
-
return date.toISOString();
|
|
440
|
-
}
|
|
441
|
-
export function associationEventBlocks(item) {
|
|
271
|
+
export function associationEventBlocks(copy, item) {
|
|
442
272
|
return [
|
|
443
273
|
prose(`event-${item.slug}-body`, item.body),
|
|
444
274
|
list(`event-${item.slug}-more`, 'event', {
|
|
445
|
-
title:
|
|
275
|
+
title: copy.programmeBlocks.eventOthersTitle,
|
|
446
276
|
layout: 'list',
|
|
447
277
|
limit: 4,
|
|
448
278
|
}),
|
|
449
279
|
];
|
|
450
280
|
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
function
|
|
460
|
-
|
|
281
|
+
/** ISO 8601, computed from "now" at scaffold time: never a fixed calendar date that ages into the past. */
|
|
282
|
+
function futureIso(daysFromNow, [hour, minute]) {
|
|
283
|
+
const date = new Date();
|
|
284
|
+
date.setUTCDate(date.getUTCDate() + daysFromNow);
|
|
285
|
+
date.setUTCHours(hour, minute, 0, 0);
|
|
286
|
+
return date.toISOString();
|
|
287
|
+
}
|
|
288
|
+
/** The path of an entry of a routed collection: `/nos-actions/jardin-partage`. */
|
|
289
|
+
export function associationEntryPath(pattern, slug) {
|
|
290
|
+
return pattern.replace(':slug', slug);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Every page, in the order the charity would present them. A function of
|
|
294
|
+
* `media` (`SeedContext.media`) and of the site's name: several blocks need ids
|
|
295
|
+
* `seedDemoMedia` only knows at scaffold time, and the copy names the
|
|
296
|
+
* organisation the site belongs to. With no media, every picture block is left
|
|
297
|
+
* out rather than emitted empty.
|
|
298
|
+
*/
|
|
299
|
+
export function buildAssociationDemoPages(copy, media, siteName) {
|
|
300
|
+
const context = contextFor(copy, siteName);
|
|
301
|
+
const words = copy.pages(context);
|
|
302
|
+
const slug = copy.pageSlugs;
|
|
303
|
+
const path = (key) => `/${slug[key]}`;
|
|
304
|
+
const partners = copy.partners.flatMap((partner) => {
|
|
461
305
|
const id = media[partner.key];
|
|
462
|
-
return id === undefined ? [] : [{
|
|
306
|
+
return id === undefined ? [] : [{ partner, id }];
|
|
463
307
|
});
|
|
464
|
-
|
|
308
|
+
const home = [
|
|
465
309
|
{
|
|
466
310
|
_key: 'home-hero',
|
|
467
311
|
_type: 'hero',
|
|
468
312
|
_version: BLOCK_VERSION,
|
|
469
|
-
eyebrow:
|
|
470
|
-
title:
|
|
471
|
-
subtitle:
|
|
313
|
+
eyebrow: words.home.heroEyebrow,
|
|
314
|
+
title: words.home.heroTitle,
|
|
315
|
+
subtitle: words.home.heroSubtitle,
|
|
472
316
|
...(media.hero === undefined ? {} : { media: media.hero }),
|
|
473
|
-
actions: [
|
|
474
|
-
{ label:
|
|
475
|
-
{ label:
|
|
476
|
-
],
|
|
317
|
+
actions: actions([
|
|
318
|
+
{ label: words.home.heroPrimary, href: path('donate'), primary: true },
|
|
319
|
+
{ label: words.home.heroSecondary, href: path('volunteer') },
|
|
320
|
+
]),
|
|
477
321
|
},
|
|
478
322
|
{
|
|
479
323
|
_key: 'home-impact',
|
|
480
324
|
_type: 'stats',
|
|
481
325
|
_version: BLOCK_VERSION,
|
|
482
|
-
title:
|
|
483
|
-
items:
|
|
484
|
-
{
|
|
485
|
-
_key: 'parcels',
|
|
486
|
-
value: '7,280',
|
|
487
|
-
unit: 'parcels',
|
|
488
|
-
label: 'of food handed out on Thursday evenings, each a week of groceries for one household.',
|
|
489
|
-
},
|
|
490
|
-
{
|
|
491
|
-
_key: 'children',
|
|
492
|
-
value: '46',
|
|
493
|
-
unit: 'children',
|
|
494
|
-
label: 'from nine schools came to homework club at least once a week.',
|
|
495
|
-
},
|
|
496
|
-
{
|
|
497
|
-
_key: 'vegetables',
|
|
498
|
-
value: '1.4',
|
|
499
|
-
unit: 'tonnes',
|
|
500
|
-
label: 'of vegetables grown in the garden went straight onto the food bank tables.',
|
|
501
|
-
},
|
|
502
|
-
{
|
|
503
|
-
_key: 'volunteers',
|
|
504
|
-
value: '312',
|
|
505
|
-
unit: 'volunteers',
|
|
506
|
-
label: 'gave 21,600 hours between them. Two part-time staff organise the rotas.',
|
|
507
|
-
},
|
|
508
|
-
],
|
|
326
|
+
title: words.home.impactTitle,
|
|
327
|
+
items: words.home.impact.map((item, index) => ({ _key: `impact-${index}`, ...item })),
|
|
509
328
|
},
|
|
510
|
-
list('home-programmes', 'programme', {
|
|
511
|
-
|
|
329
|
+
list('home-programmes', 'programme', {
|
|
330
|
+
title: words.home.programmesTitle,
|
|
331
|
+
layout: 'list',
|
|
332
|
+
limit: 4,
|
|
333
|
+
}),
|
|
334
|
+
list('home-events', 'event', { title: words.home.eventsTitle, layout: 'list', limit: 4 }),
|
|
512
335
|
{
|
|
513
336
|
_key: 'home-story',
|
|
514
337
|
_type: 'testimonial',
|
|
515
338
|
_version: BLOCK_VERSION,
|
|
516
|
-
quote:
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
attribution: {
|
|
521
|
-
name: 'Joanne Pryce',
|
|
522
|
-
role: 'Homework club volunteer since 2019',
|
|
523
|
-
...(media.portrait === undefined ? {} : { avatar: media.portrait }),
|
|
524
|
-
},
|
|
339
|
+
quote: words.home.storyQuote.map((text, index) => textBlock(`home-story-${index}`, 'normal', text)),
|
|
340
|
+
// No portrait: a testimonial's author is a character of the fiction, and a
|
|
341
|
+
// photograph of a real stranger must not stand for one.
|
|
342
|
+
attribution: { name: words.home.storyName, role: words.home.storyRole },
|
|
525
343
|
},
|
|
526
344
|
{
|
|
527
345
|
_key: 'home-money',
|
|
528
346
|
_type: 'statCounter',
|
|
529
347
|
_version: BLOCK_VERSION,
|
|
530
|
-
title:
|
|
531
|
-
stats:
|
|
532
|
-
{ _key: 'food', value: '38%', label: 'Food bought to fill the gaps in what is given' },
|
|
533
|
-
{
|
|
534
|
-
_key: 'programmes',
|
|
535
|
-
value: '23%',
|
|
536
|
-
label: 'The homework club, the garden and the winter coat bank',
|
|
537
|
-
},
|
|
538
|
-
{ _key: 'hall', value: '17%', label: 'Heating, lighting, repairing and insuring the hall' },
|
|
539
|
-
{ _key: 'rest', value: '12%', label: 'The van, the accounts and fundraising' },
|
|
540
|
-
{
|
|
541
|
-
_key: 'staff',
|
|
542
|
-
value: '10%',
|
|
543
|
-
label: 'Two part-time staff who organise 312 volunteers',
|
|
544
|
-
},
|
|
545
|
-
],
|
|
348
|
+
title: words.home.moneyTitle,
|
|
349
|
+
stats: words.home.money.map((item, index) => ({ _key: `money-${index}`, ...item })),
|
|
546
350
|
},
|
|
547
351
|
{
|
|
548
352
|
_key: 'home-give',
|
|
549
353
|
_type: 'cta',
|
|
550
354
|
_version: BLOCK_VERSION,
|
|
551
|
-
title:
|
|
552
|
-
text:
|
|
553
|
-
actions: [
|
|
554
|
-
{ label:
|
|
555
|
-
{ label:
|
|
556
|
-
],
|
|
355
|
+
title: words.home.giveTitle,
|
|
356
|
+
text: words.home.giveText,
|
|
357
|
+
actions: actions([
|
|
358
|
+
{ label: words.home.givePrimary, href: path('donate'), primary: true },
|
|
359
|
+
{ label: words.home.giveSecondary, href: path('finances') },
|
|
360
|
+
]),
|
|
557
361
|
},
|
|
558
362
|
...(partners.length === 0
|
|
559
363
|
? []
|
|
@@ -562,425 +366,166 @@ function homeBlocks(media, name) {
|
|
|
562
366
|
_key: 'home-partners',
|
|
563
367
|
_type: 'logoStrip',
|
|
564
368
|
_version: BLOCK_VERSION,
|
|
565
|
-
caption:
|
|
566
|
-
logos: partners,
|
|
369
|
+
caption: words.home.partnersCaption,
|
|
370
|
+
logos: partners.map(({ partner, id }) => ({ _key: partner.key, media: id })),
|
|
567
371
|
},
|
|
568
372
|
]),
|
|
569
373
|
{
|
|
570
374
|
_key: 'home-faq',
|
|
571
375
|
_type: 'faq',
|
|
572
376
|
_version: BLOCK_VERSION,
|
|
573
|
-
title:
|
|
574
|
-
items: answers('home-faq',
|
|
575
|
-
[
|
|
576
|
-
'Do I need a referral to use the food bank?',
|
|
577
|
-
'No. Come to the side door on a Thursday between 5.30pm and 7.30pm. We ask for a first name and how many people are at home, and nothing else.',
|
|
578
|
-
],
|
|
579
|
-
[
|
|
580
|
-
'How much time do I need to give to volunteer?',
|
|
581
|
-
'As much as suits you. Some volunteers come every week for years; others help at two collections a year. Both keep things running.',
|
|
582
|
-
],
|
|
583
|
-
[
|
|
584
|
-
'Can I give food instead of money?',
|
|
585
|
-
'Yes, at the hall on weekdays from 9.30am to 4pm. Money goes further for fresh food, so we buy that ourselves.',
|
|
586
|
-
],
|
|
587
|
-
[
|
|
588
|
-
'Is the hall accessible?',
|
|
589
|
-
'The main hall and the toilets are step-free from the Elm Street entrance. The reading room is upstairs; homework club moves downstairs for any child who needs it.',
|
|
590
|
-
],
|
|
591
|
-
]),
|
|
377
|
+
title: words.home.faqTitle,
|
|
378
|
+
items: answers('home-faq', words.home.faq),
|
|
592
379
|
},
|
|
593
380
|
];
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
return [
|
|
597
|
-
prose('what-intro', [
|
|
598
|
-
`${name} runs four programmes from the old library on Elm Street. Each one started because a neighbour noticed something missing, and each is run by volunteers with a lead volunteer and one of our two part-time staff.`,
|
|
599
|
-
'None of them asks anyone to prove they need help, and none of them costs anything to use.',
|
|
600
|
-
]),
|
|
381
|
+
const whatWeDo = [
|
|
382
|
+
prose('what-intro', words.whatWeDo.intro),
|
|
601
383
|
list('what-programmes', 'programme', { layout: 'list', limit: 20 }),
|
|
602
384
|
{
|
|
603
385
|
_key: 'what-steps',
|
|
604
386
|
_type: 'featureGrid',
|
|
605
387
|
_version: BLOCK_VERSION,
|
|
606
|
-
title:
|
|
607
|
-
items:
|
|
608
|
-
{
|
|
609
|
-
_key: 'come',
|
|
610
|
-
title: 'Come to the hall',
|
|
611
|
-
text: 'Every programme is open to anyone in Ashworth. Turn up at the times on each page, or ring the hall first if you would rather.',
|
|
612
|
-
},
|
|
613
|
-
{
|
|
614
|
-
_key: 'ask',
|
|
615
|
-
title: 'Tell us what you need',
|
|
616
|
-
text: 'A volunteer asks your first name and what would help. Nothing is written down beyond that.',
|
|
617
|
-
},
|
|
618
|
-
{
|
|
619
|
-
_key: 'more',
|
|
620
|
-
title: 'Ask about anything else',
|
|
621
|
-
text: 'If we cannot help, we know who can: debt advice, housing, benefits and the council’s support fund all hold sessions at the hall.',
|
|
622
|
-
},
|
|
623
|
-
],
|
|
388
|
+
title: words.whatWeDo.stepsTitle,
|
|
389
|
+
items: iconItems(words.whatWeDo.steps, 'what-step'),
|
|
624
390
|
},
|
|
625
391
|
];
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
return [
|
|
629
|
-
prose('events-intro', [
|
|
630
|
-
`Everything ${name} has planned for the next six weeks. Almost all of it is free and needs no booking; where it does, the event’s page says how.`,
|
|
631
|
-
]),
|
|
392
|
+
const events = [
|
|
393
|
+
prose('events-intro', words.events.intro),
|
|
632
394
|
list('events-calendar', 'event', { layout: 'list', limit: 50 }),
|
|
633
395
|
{
|
|
634
396
|
_key: 'events-host',
|
|
635
397
|
_type: 'cta',
|
|
636
398
|
_version: BLOCK_VERSION,
|
|
637
399
|
variant: { background: 'muted' },
|
|
638
|
-
title:
|
|
639
|
-
text:
|
|
640
|
-
actions: [
|
|
400
|
+
title: words.events.hostTitle,
|
|
401
|
+
text: words.events.hostText,
|
|
402
|
+
actions: actions([
|
|
641
403
|
{
|
|
642
|
-
label:
|
|
643
|
-
|
|
644
|
-
|
|
404
|
+
label: words.events.hostAction,
|
|
405
|
+
href: context.mailto(copy.identity.mailboxes.events, words.events.hostSubject),
|
|
406
|
+
primary: true,
|
|
645
407
|
},
|
|
646
|
-
],
|
|
408
|
+
]),
|
|
647
409
|
},
|
|
648
410
|
];
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
return [
|
|
652
|
-
prose('volunteer-intro', [
|
|
653
|
-
`${name} is 312 volunteers and two part-time staff. Volunteers pack the food parcels, tutor at homework club, dig the garden, sort the coats, drive the van and sit on the board of trustees.`,
|
|
654
|
-
'You do not need experience for any of it. Every new volunteer does a first shift alongside someone who has done it for years.',
|
|
655
|
-
]),
|
|
411
|
+
const volunteer = [
|
|
412
|
+
prose('volunteer-intro', words.volunteer.intro),
|
|
656
413
|
{
|
|
657
414
|
_key: 'volunteer-roles',
|
|
658
415
|
_type: 'featureGrid',
|
|
659
416
|
_version: BLOCK_VERSION,
|
|
660
|
-
title:
|
|
661
|
-
items:
|
|
662
|
-
{
|
|
663
|
-
_key: 'food',
|
|
664
|
-
icon: 'heart',
|
|
665
|
-
title: 'Food bank',
|
|
666
|
-
text: 'Thursdays, 5pm to 8pm. Setting out tables, helping households choose, packing bags. About 25 volunteers a week.',
|
|
667
|
-
link: { href: '/what-we-do/thursday-food-bank' },
|
|
668
|
-
},
|
|
669
|
-
{
|
|
670
|
-
_key: 'homework',
|
|
671
|
-
icon: 'book',
|
|
672
|
-
title: 'Homework club tutor',
|
|
673
|
-
text: 'Tuesdays or Thursdays, 3.15pm to 5.45pm in term time. Aged 16 or over, with an enhanced DBS check we arrange.',
|
|
674
|
-
link: { href: '/what-we-do/homework-club' },
|
|
675
|
-
},
|
|
676
|
-
{
|
|
677
|
-
_key: 'garden',
|
|
678
|
-
icon: 'leaf',
|
|
679
|
-
title: 'Garden',
|
|
680
|
-
text: 'Saturdays, 9.30am to 12.30pm, April to October. Digging, weeding, watering and picking. Children welcome with an adult.',
|
|
681
|
-
link: { href: '/what-we-do/community-garden' },
|
|
682
|
-
},
|
|
683
|
-
{
|
|
684
|
-
_key: 'coats',
|
|
685
|
-
icon: 'gift',
|
|
686
|
-
title: 'Coat bank',
|
|
687
|
-
text: 'Mondays, 9.30am to 1.30pm, September to February. Checking, sorting and hanging coats, and helping families find a size.',
|
|
688
|
-
link: { href: '/what-we-do/winter-coat-bank' },
|
|
689
|
-
},
|
|
690
|
-
{
|
|
691
|
-
_key: 'driver',
|
|
692
|
-
icon: 'truck',
|
|
693
|
-
title: 'Driver',
|
|
694
|
-
text: 'Thursdays, 4pm to 7pm. Collecting from shops and taking parcels to 23 households who cannot get to the hall. A full licence held for two years.',
|
|
695
|
-
},
|
|
696
|
-
{
|
|
697
|
-
_key: 'visits',
|
|
698
|
-
icon: 'users',
|
|
699
|
-
title: 'Trustee',
|
|
700
|
-
text: 'Six evening meetings a year. We are looking for a trustee with experience of property or building maintenance.',
|
|
701
|
-
},
|
|
702
|
-
],
|
|
417
|
+
title: words.volunteer.rolesTitle,
|
|
418
|
+
items: iconItems(words.volunteer.roles, 'role'),
|
|
703
419
|
},
|
|
704
420
|
{
|
|
705
421
|
_key: 'volunteer-steps',
|
|
706
422
|
_type: 'featureGrid',
|
|
707
423
|
_version: BLOCK_VERSION,
|
|
708
|
-
title:
|
|
709
|
-
items:
|
|
710
|
-
{
|
|
711
|
-
_key: 'write',
|
|
712
|
-
title: 'Write or ring',
|
|
713
|
-
text: `Email ${associationEmail(name, 'volunteer')} or ring ${ASSOCIATION_PHONE}, and tell us what you would like to do and when you are free.`,
|
|
714
|
-
},
|
|
715
|
-
{
|
|
716
|
-
_key: 'evening',
|
|
717
|
-
title: 'Come to an orientation evening',
|
|
718
|
-
text: 'Once a month, an hour and a half in the reading room with the people who run each programme.',
|
|
719
|
-
link: { href: '/events/volunteer-orientation-evening' },
|
|
720
|
-
},
|
|
721
|
-
{
|
|
722
|
-
_key: 'shift',
|
|
723
|
-
title: 'Do a first shift alongside someone',
|
|
724
|
-
text: 'Our coordinator pairs you with an experienced volunteer. After that, you choose how often to come.',
|
|
725
|
-
},
|
|
726
|
-
],
|
|
424
|
+
title: words.volunteer.stepsTitle,
|
|
425
|
+
items: iconItems(words.volunteer.steps, 'step'),
|
|
727
426
|
},
|
|
728
|
-
...mediaFigure('volunteer-photo', media, 'event-orientation',
|
|
427
|
+
...mediaFigure('volunteer-photo', media, 'event-orientation', words.volunteer.photoCaption, '16:9'),
|
|
729
428
|
{
|
|
730
429
|
_key: 'volunteer-notes',
|
|
731
430
|
_type: 'accordion',
|
|
732
431
|
_version: BLOCK_VERSION,
|
|
733
|
-
title:
|
|
734
|
-
items: answers('volunteer-notes',
|
|
735
|
-
[
|
|
736
|
-
'Is there a minimum age?',
|
|
737
|
-
'Sixteen for most roles and eighteen for driving. Younger children can help in the garden and at collections with a parent or carer.',
|
|
738
|
-
],
|
|
739
|
-
[
|
|
740
|
-
'Do I need a DBS check?',
|
|
741
|
-
'Only for the homework club. We apply for an enhanced check for you and pay for it; it usually takes three to four weeks.',
|
|
742
|
-
],
|
|
743
|
-
[
|
|
744
|
-
'What should I wear?',
|
|
745
|
-
'Closed shoes and clothes that can get dirty. We provide aprons, gloves and tools.',
|
|
746
|
-
],
|
|
747
|
-
[
|
|
748
|
-
'Are expenses paid?',
|
|
749
|
-
'Yes. We pay mileage for drivers and bus fares for anyone who asks, with no receipts needed for under £10.',
|
|
750
|
-
],
|
|
751
|
-
[
|
|
752
|
-
'Can my workplace volunteer as a team?',
|
|
753
|
-
'Yes, for the food collections, the coat collections and garden mornings, for groups of up to twelve. Write to us with a date.',
|
|
754
|
-
],
|
|
755
|
-
]),
|
|
432
|
+
title: words.volunteer.notesTitle,
|
|
433
|
+
items: answers('volunteer-notes', words.volunteer.notes),
|
|
756
434
|
},
|
|
757
435
|
{
|
|
758
436
|
_key: 'volunteer-ask',
|
|
759
437
|
_type: 'cta',
|
|
760
438
|
_version: BLOCK_VERSION,
|
|
761
439
|
variant: { background: 'muted' },
|
|
762
|
-
title:
|
|
763
|
-
text:
|
|
764
|
-
actions: [
|
|
440
|
+
title: words.volunteer.askTitle,
|
|
441
|
+
text: words.volunteer.askText,
|
|
442
|
+
actions: actions([
|
|
765
443
|
{
|
|
766
|
-
label:
|
|
767
|
-
|
|
768
|
-
|
|
444
|
+
label: words.volunteer.askAction,
|
|
445
|
+
href: context.mailto(copy.identity.mailboxes.volunteer, words.volunteer.askSubject),
|
|
446
|
+
primary: true,
|
|
769
447
|
},
|
|
770
|
-
{ label:
|
|
771
|
-
],
|
|
448
|
+
{ label: words.volunteer.phoneAction, href: copy.identity.phoneHref },
|
|
449
|
+
]),
|
|
772
450
|
},
|
|
773
451
|
];
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
const treasurer = associationEmail(name, 'treasurer');
|
|
777
|
-
return [
|
|
778
|
-
prose('donate-intro', [
|
|
779
|
-
`Every pound given to ${name} is spent in Ashworth, on food, on the homework club, the garden and the coat bank, and on keeping the hall warm and open. Last year 62% of our income came from people in the town.`,
|
|
780
|
-
'We do not take card payments on this site. Here are the ways to give, and the people to ask.',
|
|
781
|
-
]),
|
|
452
|
+
const donate = [
|
|
453
|
+
prose('donate-intro', words.donate.intro),
|
|
782
454
|
{
|
|
783
455
|
_key: 'donate-monthly',
|
|
784
456
|
_type: 'pricingTable',
|
|
785
457
|
_version: BLOCK_VERSION,
|
|
786
|
-
title:
|
|
787
|
-
tiers:
|
|
788
|
-
{
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
'With Gift Aid, worth £6.25 to us',
|
|
796
|
-
],
|
|
797
|
-
},
|
|
798
|
-
{
|
|
799
|
-
_key: 'twelve',
|
|
800
|
-
name: 'Vegetables',
|
|
801
|
-
price: '£12',
|
|
802
|
-
interval: 'a month',
|
|
803
|
-
features: [
|
|
804
|
-
'Keeps one family in fresh vegetables all year',
|
|
805
|
-
'With Gift Aid, worth £15 to us',
|
|
806
|
-
],
|
|
807
|
-
highlighted: true,
|
|
808
|
-
},
|
|
809
|
-
{
|
|
810
|
-
_key: 'thirty',
|
|
811
|
-
name: 'A place at homework club',
|
|
812
|
-
price: '£30',
|
|
813
|
-
interval: 'a month',
|
|
814
|
-
features: [
|
|
815
|
-
'Pays for one child’s place, books and snacks included',
|
|
816
|
-
'With Gift Aid, worth £37.50 to us',
|
|
817
|
-
],
|
|
818
|
-
},
|
|
819
|
-
],
|
|
458
|
+
title: words.donate.monthlyTitle,
|
|
459
|
+
tiers: words.donate.tiers.map((tier, index) => ({
|
|
460
|
+
_key: `tier-${index}`,
|
|
461
|
+
name: tier.name,
|
|
462
|
+
price: tier.price,
|
|
463
|
+
interval: tier.interval,
|
|
464
|
+
features: tier.features,
|
|
465
|
+
...(tier.highlighted === true ? { highlighted: true } : {}),
|
|
466
|
+
})),
|
|
820
467
|
},
|
|
821
|
-
prose('donate-ways',
|
|
822
|
-
'## By standing order',
|
|
823
|
-
`A standing order goes straight from your bank to ours, so none of your gift goes on fees. Email our treasurer at [${treasurer}](mailto:${treasurer}) or ring ${ASSOCIATION_PHONE}, and we send you our account details, a reference and a Gift Aid form. You set up the payment with your own bank, and can stop it at any time the same way.`,
|
|
824
|
-
'## By cheque or cash',
|
|
825
|
-
`Make cheques payable to ${name} and post them to ${ASSOCIATION_ADDRESS}. You can also give cash or a cheque at the hall on weekdays from 9.30am to 4pm, and on Thursday evenings; we give a receipt for every gift.`,
|
|
826
|
-
'## Gift Aid',
|
|
827
|
-
'If you pay UK income tax, Gift Aid adds 25p to every pound you give, at no cost to you. Tick the box on our form or tell the person who takes your gift. Last year Gift Aid brought in £25,800.',
|
|
828
|
-
'## Through your employer or your will',
|
|
829
|
-
'Payroll giving takes your gift before tax. Ask your payroll team for the Payroll Giving scheme and give our charity number, 1299418. A gift in your will, of any size, can be left to us by name; we are happy to talk it through in confidence.',
|
|
830
|
-
]),
|
|
468
|
+
prose('donate-ways', words.donate.ways),
|
|
831
469
|
{
|
|
832
470
|
_key: 'donate-questions',
|
|
833
471
|
_type: 'accordion',
|
|
834
472
|
_version: BLOCK_VERSION,
|
|
835
|
-
title:
|
|
836
|
-
items: answers('donate-questions',
|
|
837
|
-
[
|
|
838
|
-
'Can I choose which programme my gift pays for?',
|
|
839
|
-
'Yes. Tell us when you give, and the treasurer records it against that programme. Gifts with no programme named go where they are needed most, usually the food bank.',
|
|
840
|
-
],
|
|
841
|
-
[
|
|
842
|
-
'How much of my gift is spent on fundraising?',
|
|
843
|
-
'Three pence in every pound goes on fundraising, accounts and the independent examination. The full breakdown is on our finances page.',
|
|
844
|
-
],
|
|
845
|
-
[
|
|
846
|
-
'Can I give food or coats instead?',
|
|
847
|
-
'Yes. The food bank and the coat bank pages list what we need most this month and when to bring it.',
|
|
848
|
-
],
|
|
849
|
-
[
|
|
850
|
-
'How do I cancel a standing order?',
|
|
851
|
-
'With your bank, in the same way you set it up. You do not need to tell us, though we are always glad to hear why.',
|
|
852
|
-
],
|
|
853
|
-
]),
|
|
473
|
+
title: words.donate.questionsTitle,
|
|
474
|
+
items: answers('donate-questions', words.donate.questions),
|
|
854
475
|
},
|
|
855
476
|
{
|
|
856
477
|
_key: 'donate-ask',
|
|
857
478
|
_type: 'cta',
|
|
858
479
|
_version: BLOCK_VERSION,
|
|
859
|
-
title:
|
|
860
|
-
text:
|
|
861
|
-
actions: [
|
|
480
|
+
title: words.donate.askTitle,
|
|
481
|
+
text: words.donate.askText,
|
|
482
|
+
actions: actions([
|
|
862
483
|
{
|
|
863
|
-
label:
|
|
864
|
-
|
|
865
|
-
|
|
484
|
+
label: words.donate.askAction,
|
|
485
|
+
href: context.mailto(copy.identity.mailboxes.treasurer, words.donate.askSubject),
|
|
486
|
+
primary: true,
|
|
866
487
|
},
|
|
867
|
-
{ label:
|
|
868
|
-
],
|
|
488
|
+
{ label: words.donate.phoneAction, href: copy.identity.phoneHref },
|
|
489
|
+
]),
|
|
869
490
|
},
|
|
870
491
|
];
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
return [
|
|
874
|
-
prose('finances-intro', [
|
|
875
|
-
`${name} is a charitable incorporated organisation registered in England and Wales, number ${CHARITY_NUMBER}. Our accounts for the year to 31 March are independently examined and filed with the Charity Commission.`,
|
|
876
|
-
'These are the figures from our last annual report. A printed copy of the full accounts is at the hall, and we post one to anyone who asks.',
|
|
877
|
-
]),
|
|
492
|
+
const finances = [
|
|
493
|
+
prose('finances-intro', words.finances.intro),
|
|
878
494
|
{
|
|
879
495
|
_key: 'finances-year',
|
|
880
496
|
_type: 'stats',
|
|
881
497
|
_version: BLOCK_VERSION,
|
|
882
|
-
title:
|
|
883
|
-
items:
|
|
884
|
-
{
|
|
885
|
-
_key: 'income',
|
|
886
|
-
value: '£286,400',
|
|
887
|
-
label: 'received, from 1,940 people, 14 local businesses and 6 charitable trusts.',
|
|
888
|
-
},
|
|
889
|
-
{
|
|
890
|
-
_key: 'spent',
|
|
891
|
-
value: '£271,900',
|
|
892
|
-
label: 'spent on the four programmes, the hall and the people who organise them.',
|
|
893
|
-
},
|
|
894
|
-
{
|
|
895
|
-
_key: 'reserves',
|
|
896
|
-
value: '£68,000',
|
|
897
|
-
label: 'held in reserve, three months of spending, as our reserves policy requires.',
|
|
898
|
-
},
|
|
899
|
-
{
|
|
900
|
-
_key: 'hours',
|
|
901
|
-
value: '21,600',
|
|
902
|
-
unit: 'hours',
|
|
903
|
-
label: 'given by volunteers. We do not put a value on them in the accounts.',
|
|
904
|
-
},
|
|
905
|
-
],
|
|
498
|
+
title: words.finances.yearTitle,
|
|
499
|
+
items: words.finances.year.map((item, index) => ({ _key: `year-${index}`, ...item })),
|
|
906
500
|
},
|
|
907
501
|
{
|
|
908
502
|
_key: 'finances-spending',
|
|
909
503
|
_type: 'statCounter',
|
|
910
504
|
_version: BLOCK_VERSION,
|
|
911
|
-
title:
|
|
912
|
-
stats:
|
|
913
|
-
{ _key: 'food', value: '38%', label: 'Food bought for the food bank' },
|
|
914
|
-
{
|
|
915
|
-
_key: 'hall',
|
|
916
|
-
value: '17%',
|
|
917
|
-
label: 'Running the hall: heating, lighting, repairs, insurance',
|
|
918
|
-
},
|
|
919
|
-
{
|
|
920
|
-
_key: 'homework',
|
|
921
|
-
value: '12%',
|
|
922
|
-
label: 'Homework club: books, laptops, snacks and DBS checks',
|
|
923
|
-
},
|
|
924
|
-
{ _key: 'coats', value: '11%', label: 'The coat bank, the garden and emergency help' },
|
|
925
|
-
{
|
|
926
|
-
_key: 'staff',
|
|
927
|
-
value: '10%',
|
|
928
|
-
label: 'A part-time coordinator and a part-time volunteer manager',
|
|
929
|
-
},
|
|
930
|
-
{ _key: 'van', value: '9%', label: 'The van: fuel, insurance and repairs' },
|
|
931
|
-
{
|
|
932
|
-
_key: 'admin',
|
|
933
|
-
value: '3%',
|
|
934
|
-
label: 'Fundraising, accounts and the independent examination',
|
|
935
|
-
},
|
|
936
|
-
],
|
|
505
|
+
title: words.finances.spendingTitle,
|
|
506
|
+
stats: words.finances.spending.map((item, index) => ({ _key: `spent-${index}`, ...item })),
|
|
937
507
|
},
|
|
938
508
|
{
|
|
939
509
|
_key: 'finances-income',
|
|
940
510
|
_type: 'statCounter',
|
|
941
511
|
_version: BLOCK_VERSION,
|
|
942
|
-
title:
|
|
943
|
-
stats:
|
|
944
|
-
{ _key: 'people', value: '46%', label: 'Gifts from individuals, most of them monthly' },
|
|
945
|
-
{ _key: 'trusts', value: '27%', label: 'Grants from six charitable trusts' },
|
|
946
|
-
{ _key: 'business', value: '11%', label: 'Local businesses, in money and in food' },
|
|
947
|
-
{ _key: 'giftaid', value: '9%', label: 'Gift Aid claimed on individual gifts' },
|
|
948
|
-
{ _key: 'events', value: '7%', label: 'The community supper and sponsored events' },
|
|
949
|
-
],
|
|
512
|
+
title: words.finances.incomeTitle,
|
|
513
|
+
stats: words.finances.income.map((item, index) => ({ _key: `income-${index}`, ...item })),
|
|
950
514
|
},
|
|
951
|
-
prose('finances-notes',
|
|
952
|
-
'## Why the hall costs so little',
|
|
953
|
-
'We bought the old library outright in 2001, with money raised over six years, so we pay no rent. The 17% it costs is heating a Victorian building, keeping the roof sound and insuring it.',
|
|
954
|
-
'## What we do not spend money on',
|
|
955
|
-
'Nobody is paid to fundraise, the trustees are unpaid and claim no expenses, and we have no offices other than the hall. When we spend on something new, the trustees agree it at a meeting and the minutes are available at the hall.',
|
|
956
|
-
]),
|
|
515
|
+
prose('finances-notes', words.finances.notes),
|
|
957
516
|
];
|
|
958
|
-
|
|
959
|
-
function aboutBlocks(media, name) {
|
|
960
|
-
const gallery = ['event-supper', 'programme-garden', 'programme-coat-bank', 'event-orientation']
|
|
517
|
+
const gallery = ['event-planting', 'event-supper', 'programme-garden', 'programme-coat-bank']
|
|
961
518
|
.map((key) => media[key])
|
|
962
519
|
.filter((id) => id !== undefined);
|
|
963
|
-
const
|
|
964
|
-
|
|
965
|
-
return id === undefined ? [] : [{ _key: partner.key, media: id, name: partner.name }];
|
|
966
|
-
});
|
|
967
|
-
return [
|
|
968
|
-
prose('about-story', [
|
|
969
|
-
`${name} started in the winter of 1994, when three neighbours on Elm Street, a retired teacher, a bus driver and a nurse working nights, borrowed a van and took hot meals to eleven households who had run out of money for food.`,
|
|
970
|
-
'By the next winter they had forty volunteers and a spare room above the hardware shop. In 2001, after six years of jumble sales and sponsored walks, the charity bought the old public library on Elm Street, so that no landlord could ever close the food bank.',
|
|
971
|
-
'The homework club opened in the library’s reading room in 2009, the garden in 2012 and the coat bank in 2016. Each began because someone who came to the hall noticed something missing and offered to start it.',
|
|
972
|
-
]),
|
|
520
|
+
const about = [
|
|
521
|
+
prose('about-story', words.about.story),
|
|
973
522
|
{
|
|
974
523
|
_key: 'about-years',
|
|
975
524
|
_type: 'statCounter',
|
|
976
525
|
_version: BLOCK_VERSION,
|
|
977
|
-
stats:
|
|
978
|
-
{ _key: 'founded', value: '1994', label: 'The first van of hot meals' },
|
|
979
|
-
{ _key: 'hall', value: '2001', label: 'The old library bought outright' },
|
|
980
|
-
{ _key: 'programmes', value: '4', label: 'Programmes running every week' },
|
|
981
|
-
{ _key: 'volunteers', value: '312', label: 'Volunteers on the rota today' },
|
|
982
|
-
],
|
|
526
|
+
stats: words.about.years.map((item, index) => ({ _key: `year-${index}`, ...item })),
|
|
983
527
|
},
|
|
528
|
+
...mediaFigure('about-hall', media, 'hall', words.about.hallCaption, '16:9'),
|
|
984
529
|
...(gallery.length < 2
|
|
985
530
|
? []
|
|
986
531
|
: [
|
|
@@ -992,25 +537,14 @@ function aboutBlocks(media, name) {
|
|
|
992
537
|
items: gallery.map((id, index) => ({ _key: `about-gallery-${index}`, media: id })),
|
|
993
538
|
},
|
|
994
539
|
]),
|
|
995
|
-
prose('about-
|
|
996
|
-
'## Our trustees',
|
|
997
|
-
'Six unpaid trustees are responsible for the charity. They are elected at the annual general meeting for three years, and at least two of them are always volunteers.',
|
|
998
|
-
'- Helen Ashby, chair. A retired head teacher and a homework club tutor since 2010.',
|
|
999
|
-
'- Martin Okafor, treasurer. A chartered accountant who works for the NHS trust.',
|
|
1000
|
-
'- Sarah Whitlock, secretary. A solicitor, and a driver on Thursdays.',
|
|
1001
|
-
'- Daniel Reyes. Runs a building firm in the town and looks after the hall.',
|
|
1002
|
-
'- Amina Hussain. A pharmacist on Marlow Street and a food bank volunteer.',
|
|
1003
|
-
'- Tom Garside. A student at Ashworth College, elected by the volunteers.',
|
|
1004
|
-
'## Our staff',
|
|
1005
|
-
'Priya Nair coordinates the programmes and Colin Birch manages volunteers. Both work three days a week, and both started as volunteers.',
|
|
1006
|
-
]),
|
|
540
|
+
prose('about-people', words.about.people),
|
|
1007
541
|
{
|
|
1008
542
|
_key: 'about-quote',
|
|
1009
543
|
_type: 'quote',
|
|
1010
544
|
_version: BLOCK_VERSION,
|
|
1011
|
-
text:
|
|
1012
|
-
author:
|
|
1013
|
-
role:
|
|
545
|
+
text: words.about.quote,
|
|
546
|
+
author: words.about.quoteAuthor,
|
|
547
|
+
role: words.about.quoteRole,
|
|
1014
548
|
},
|
|
1015
549
|
...(partners.length === 0
|
|
1016
550
|
? []
|
|
@@ -1019,297 +553,154 @@ function aboutBlocks(media, name) {
|
|
|
1019
553
|
_key: 'about-partners',
|
|
1020
554
|
_type: 'logos',
|
|
1021
555
|
_version: BLOCK_VERSION,
|
|
1022
|
-
title:
|
|
1023
|
-
items: partners,
|
|
556
|
+
title: words.about.partnersTitle,
|
|
557
|
+
items: partners.map(({ partner, id }) => ({
|
|
558
|
+
_key: partner.key,
|
|
559
|
+
media: id,
|
|
560
|
+
name: partner.name,
|
|
561
|
+
})),
|
|
1024
562
|
},
|
|
1025
563
|
]),
|
|
1026
564
|
];
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
return [
|
|
1030
|
-
prose('contact-intro', [
|
|
1031
|
-
`The quickest way to reach ${name} is to ring the hall or come in. Someone is there on weekdays from 9.30am to 4pm, and on Thursday evenings until 8pm.`,
|
|
1032
|
-
]),
|
|
565
|
+
const contact = [
|
|
566
|
+
prose('contact-intro', words.contact.intro),
|
|
1033
567
|
{
|
|
1034
568
|
_key: 'contact-ways',
|
|
1035
569
|
_type: 'featureGrid',
|
|
1036
570
|
_version: BLOCK_VERSION,
|
|
1037
|
-
items:
|
|
1038
|
-
{
|
|
1039
|
-
_key: 'phone',
|
|
1040
|
-
icon: 'phone',
|
|
1041
|
-
title: `Ring ${ASSOCIATION_PHONE}`,
|
|
1042
|
-
text: 'Weekdays from 9.30am to 4pm. Leave a message at other times and we ring back the next working day.',
|
|
1043
|
-
link: { href: PHONE_LINK },
|
|
1044
|
-
},
|
|
1045
|
-
{
|
|
1046
|
-
_key: 'email',
|
|
1047
|
-
icon: 'mail',
|
|
1048
|
-
title: 'Write to us',
|
|
1049
|
-
text: `${associationEmail(name)}, for anything at all. Each programme page also gives the address of the people who run it.`,
|
|
1050
|
-
link: { href: `mailto:${associationEmail(name)}` },
|
|
1051
|
-
},
|
|
1052
|
-
{
|
|
1053
|
-
_key: 'visit',
|
|
1054
|
-
icon: 'map-pin',
|
|
1055
|
-
title: 'Visit the hall',
|
|
1056
|
-
text: `${ASSOCIATION_ADDRESS}. The 14 and 22 buses stop outside; the Elm Street entrance is step-free.`,
|
|
1057
|
-
link: { href: 'https://www.openstreetmap.org/' },
|
|
1058
|
-
},
|
|
1059
|
-
{
|
|
1060
|
-
_key: 'hours',
|
|
1061
|
-
icon: 'clock',
|
|
1062
|
-
title: 'Opening hours',
|
|
1063
|
-
text: 'Monday to Friday, 9.30am to 4pm. Thursday evenings, 5.30pm to 8pm. Saturday mornings in the garden, April to October.',
|
|
1064
|
-
},
|
|
1065
|
-
],
|
|
571
|
+
items: iconItems(words.contact.ways, 'way'),
|
|
1066
572
|
},
|
|
1067
|
-
prose('contact-concerns',
|
|
1068
|
-
'## Raising a concern',
|
|
1069
|
-
`If you are worried about the safety of a child or an adult at any of our programmes, speak to Priya Nair, our safeguarding lead, on ${ASSOCIATION_PHONE}, or to any trustee. If someone is in immediate danger, ring 999.`,
|
|
1070
|
-
`If you are unhappy with how we have treated you, write to the chair of trustees at ${ASSOCIATION_ADDRESS}. We reply within ten working days.`,
|
|
1071
|
-
]),
|
|
573
|
+
prose('contact-concerns', words.contact.concerns),
|
|
1072
574
|
];
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
'- For the food bank: a first name and the number of people at home, on paper, destroyed at the end of each month.',
|
|
1080
|
-
'- For donors: name, address and the gifts you make, and a Gift Aid declaration if you give one.',
|
|
1081
|
-
'- For volunteers: contact details, an emergency contact, the shifts you do and, for homework club tutors, the date of a DBS check.',
|
|
1082
|
-
'- For homework club: a parent or carer’s contact details and anything they tell us about the child’s health or learning.',
|
|
1083
|
-
'## Why, and for how long',
|
|
1084
|
-
'We keep donation records for six years after your last gift, because HMRC requires it for Gift Aid. We keep volunteer details while you volunteer and for a year afterwards. We never sell or share personal information, and we do not use it for anything other than the reason you gave it.',
|
|
1085
|
-
'## This website',
|
|
1086
|
-
'This site sets no advertising or tracking cookies. If you choose a light or dark appearance, your browser remembers the choice on your own device.',
|
|
1087
|
-
'## Your rights',
|
|
1088
|
-
'You can ask to see, correct or delete what we hold about you, at any time and at no cost. If you are unhappy with how we have handled your information, you can complain to the Information Commissioner’s Office.',
|
|
575
|
+
const credits = [
|
|
576
|
+
prose('credits-body', [
|
|
577
|
+
...words.credits.intro,
|
|
578
|
+
...ASSOCIATION_PHOTO_CREDITS.map((credit) => `- ${credit.title} · ${credit.author} · ${credit.licenceUrl === undefined
|
|
579
|
+
? credit.licence
|
|
580
|
+
: `[${credit.licence}](${credit.licenceUrl})`} · [${words.credits.sourceWord}](${credit.source})`),
|
|
1089
581
|
]),
|
|
1090
582
|
];
|
|
1091
|
-
}
|
|
1092
|
-
/**
|
|
1093
|
-
* Every page, in the order the charity would present them. A function of
|
|
1094
|
-
* `media` (`SeedContext.media`) and of the site's name: several blocks need
|
|
1095
|
-
* ids `seedDemoMedia` only knows at scaffold time, and the copy names the
|
|
1096
|
-
* organisation the site belongs to. With no media, every picture block is
|
|
1097
|
-
* left out rather than emitted empty.
|
|
1098
|
-
*/
|
|
1099
|
-
export function buildAssociationDemoPages(media, siteName) {
|
|
1100
|
-
const name = nameOf(siteName);
|
|
1101
583
|
return [
|
|
1102
|
-
{ title:
|
|
1103
|
-
{ title:
|
|
1104
|
-
{ title:
|
|
1105
|
-
{ title:
|
|
1106
|
-
{ title:
|
|
1107
|
-
{ title:
|
|
1108
|
-
{ title:
|
|
1109
|
-
{ title:
|
|
1110
|
-
{
|
|
584
|
+
{ title: words.titles.home, slug: slug.home, blocks: home },
|
|
585
|
+
{ title: words.titles.whatWeDo, slug: slug.whatWeDo, blocks: whatWeDo },
|
|
586
|
+
{ title: words.titles.events, slug: slug.events, blocks: events },
|
|
587
|
+
{ title: words.titles.volunteer, slug: slug.volunteer, blocks: volunteer },
|
|
588
|
+
{ title: words.titles.donate, slug: slug.donate, blocks: donate },
|
|
589
|
+
{ title: words.titles.finances, slug: slug.finances, blocks: finances },
|
|
590
|
+
{ title: words.titles.about, slug: slug.about, blocks: about },
|
|
591
|
+
{ title: words.titles.contact, slug: slug.contact, blocks: contact },
|
|
592
|
+
{
|
|
593
|
+
title: words.titles.privacy,
|
|
594
|
+
slug: slug.privacy,
|
|
595
|
+
blocks: [prose('privacy-body', words.privacy)],
|
|
596
|
+
},
|
|
597
|
+
{ title: words.titles.legal, slug: slug.legal, blocks: [prose('legal-body', words.legal)] },
|
|
598
|
+
{ title: words.titles.credits, slug: slug.credits, blocks: credits },
|
|
1111
599
|
];
|
|
1112
600
|
}
|
|
1113
601
|
// ---------------------------------------------------------------------------
|
|
1114
602
|
// Navigation, settings, pictures
|
|
1115
603
|
// ---------------------------------------------------------------------------
|
|
1116
|
-
/** Header navigation and the header's standing ask. The footer is grouped in columns: see `
|
|
1117
|
-
export
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
{ label:
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
heading: 'What we do',
|
|
1141
|
-
links: [
|
|
1142
|
-
{ label: 'Thursday food bank', url: '/what-we-do/thursday-food-bank' },
|
|
1143
|
-
{ label: 'Homework club', url: '/what-we-do/homework-club' },
|
|
1144
|
-
{ label: 'Community garden', url: '/what-we-do/community-garden' },
|
|
1145
|
-
{ label: 'Winter coat bank', url: '/what-we-do/winter-coat-bank' },
|
|
1146
|
-
],
|
|
1147
|
-
},
|
|
1148
|
-
{
|
|
1149
|
-
heading: 'About us',
|
|
1150
|
-
links: [
|
|
1151
|
-
{ label: 'Our story', url: '/about' },
|
|
1152
|
-
{ label: 'Where the money goes', url: '/finances' },
|
|
1153
|
-
{ label: 'Contact us', url: '/contact' },
|
|
1154
|
-
{ label: 'Privacy', url: '/privacy' },
|
|
604
|
+
/** Header navigation and the header's standing ask. The footer is grouped in columns: see `associationFooter`. */
|
|
605
|
+
export function associationMenus(copy) {
|
|
606
|
+
const url = (page) => `/${copy.pageSlugs[page]}`;
|
|
607
|
+
return {
|
|
608
|
+
header: copy.menus.header.map((item) => ({ label: item.label, url: url(item.page) })),
|
|
609
|
+
// Seeded with the demo content instead (`seedFooterMenu`): a footer in
|
|
610
|
+
// columns needs an unlinked heading per column, which `BlueprintMenus`
|
|
611
|
+
// cannot express.
|
|
612
|
+
footer: [],
|
|
613
|
+
headerAction: { label: copy.menus.action, url: url('donate') },
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
export function associationFooter(copy) {
|
|
617
|
+
return copy.footer;
|
|
618
|
+
}
|
|
619
|
+
export function associationFooterNote(copy, siteName) {
|
|
620
|
+
return copy.footerNote(contextFor(copy, siteName));
|
|
621
|
+
}
|
|
622
|
+
export function associationSiteSettings(copy) {
|
|
623
|
+
return {
|
|
624
|
+
'general.tagline': copy.settings.tagline,
|
|
625
|
+
'general.socialLinks': [
|
|
626
|
+
{ label: 'Facebook', url: 'https://facebook.com/example' },
|
|
627
|
+
{ label: 'Instagram', url: 'https://instagram.com/example' },
|
|
1155
628
|
],
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
`${ASSOCIATION_PHONE}`,
|
|
1166
|
-
associationEmail(siteName),
|
|
1167
|
-
'',
|
|
1168
|
-
'The hall is open Monday to Friday, 9.30am to 4pm, and on Thursday evenings.',
|
|
1169
|
-
].join('\n');
|
|
629
|
+
// Rewritten with the site's own email address when the demo content is
|
|
630
|
+
// seeded (`seedAssociationDemoContent`).
|
|
631
|
+
'general.footerNote': associationFooterNote(copy, undefined),
|
|
632
|
+
// A food bank page is not a discussion: no comment form under an event.
|
|
633
|
+
'discussion.enabled': false,
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
function onlyOn(...targets) {
|
|
637
|
+
return { pages: { mode: 'only', targets } };
|
|
1170
638
|
}
|
|
1171
|
-
export const ASSOCIATION_SITE_SETTINGS = {
|
|
1172
|
-
'general.tagline': 'Food, homework help, a garden and warm coats, from the old library on Elm Street.',
|
|
1173
|
-
'general.socialLinks': [
|
|
1174
|
-
{ label: 'Facebook', url: 'https://facebook.com/example' },
|
|
1175
|
-
{ label: 'Instagram', url: 'https://instagram.com/example' },
|
|
1176
|
-
],
|
|
1177
|
-
// Rewritten with the site's own email address when the demo content is
|
|
1178
|
-
// seeded (`seedAssociationDemoContent`).
|
|
1179
|
-
'general.footerNote': associationFooterNote(undefined),
|
|
1180
|
-
// A food bank page is not a discussion: no comment form under an event.
|
|
1181
|
-
'discussion.enabled': false,
|
|
1182
|
-
};
|
|
1183
639
|
/**
|
|
1184
640
|
* The side column a neighbour expects beside the charity's own pages. On a
|
|
1185
|
-
* programme, the ask to keep it free and where else the hall can help
|
|
1186
|
-
*
|
|
1187
|
-
*
|
|
1188
|
-
*
|
|
641
|
+
* programme, the ask to keep it free and where else the hall can help; on an
|
|
642
|
+
* event, the four weekly programmes with their photographs and the call to lend
|
|
643
|
+
* a hand on the day; on search results, the programmes and the same ask to
|
|
644
|
+
* give.
|
|
1189
645
|
*
|
|
1190
|
-
* What the pages already show is never repeated: an event already ends on
|
|
1191
|
-
*
|
|
646
|
+
* What the pages already show is never repeated: an event already ends on the
|
|
647
|
+
* other dates at the hall, in date order, and a programme on the other
|
|
1192
648
|
* programmes, so neither gets a second list of its own kind. The home page
|
|
1193
|
-
* opens on its hero and keeps its full width, and every site page
|
|
1194
|
-
*
|
|
1195
|
-
*
|
|
1196
|
-
*
|
|
1197
|
-
*
|
|
1198
|
-
* when the site is called something else.
|
|
649
|
+
* opens on its hero and keeps its full width, and every site page already
|
|
650
|
+
* carries its own lists and asks. No contact widget: the footer note on every
|
|
651
|
+
* page already gives the hall's address, telephone, email and opening hours. No
|
|
652
|
+
* widget names the charity, so none goes stale when the site is called
|
|
653
|
+
* something else.
|
|
1199
654
|
*/
|
|
1200
|
-
|
|
1201
|
-
const
|
|
1202
|
-
const
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
655
|
+
export function associationWidgets(copy) {
|
|
656
|
+
const w = copy.widgets;
|
|
657
|
+
const eventTarget = { kind: 'collection', collection: 'event' };
|
|
658
|
+
const programmeTarget = { kind: 'collection', collection: 'programme' };
|
|
659
|
+
const searchTarget = { kind: 'search' };
|
|
660
|
+
const fill = (line) => line
|
|
661
|
+
.replaceAll('{phone}', copy.identity.phone)
|
|
662
|
+
.replaceAll('{phoneHref}', copy.identity.phoneHref);
|
|
663
|
+
return [
|
|
664
|
+
{
|
|
665
|
+
area: 'sidebar',
|
|
666
|
+
type: 'cta',
|
|
667
|
+
settings: {
|
|
668
|
+
heading: w.keepFreeHeading,
|
|
669
|
+
body: w.keepFreeBody,
|
|
670
|
+
label: w.keepFreeLabel,
|
|
671
|
+
href: `/${copy.pageSlugs.donate}`,
|
|
672
|
+
},
|
|
673
|
+
visibility: onlyOn(programmeTarget, searchTarget),
|
|
1215
674
|
},
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
textBlock('widget-advice-0', 'normal', 'Debt advice, housing, benefits and the council’s support fund all hold sessions at the hall.'),
|
|
1225
|
-
textBlock('widget-advice-1', 'normal', `Ring [${ASSOCIATION_PHONE}](${PHONE_LINK}) on a weekday and we will tell you when the next one is.`),
|
|
1226
|
-
],
|
|
675
|
+
{
|
|
676
|
+
area: 'sidebar',
|
|
677
|
+
type: 'text',
|
|
678
|
+
title: w.adviceTitle,
|
|
679
|
+
settings: {
|
|
680
|
+
body: w.adviceLines.map((line, index) => textBlock(`widget-advice-${index}`, 'normal', fill(line))),
|
|
681
|
+
},
|
|
682
|
+
visibility: onlyOn(programmeTarget),
|
|
1227
683
|
},
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
settings: { collection: 'programme', count: 4, showDate: false, showImage: true },
|
|
1235
|
-
visibility: onlyOn(ASSOCIATION_EVENT, ASSOCIATION_SEARCH),
|
|
1236
|
-
},
|
|
1237
|
-
{
|
|
1238
|
-
area: 'sidebar',
|
|
1239
|
-
type: 'cta',
|
|
1240
|
-
settings: {
|
|
1241
|
-
heading: 'Lend a hand on the day',
|
|
1242
|
-
body: 'Collections, garden mornings and the supper all run on volunteers. Come for two hours or stay all day; nobody needs experience.',
|
|
1243
|
-
label: 'Volunteer with us',
|
|
1244
|
-
href: '/volunteer',
|
|
684
|
+
{
|
|
685
|
+
area: 'sidebar',
|
|
686
|
+
type: 'recentEntries',
|
|
687
|
+
title: w.weeklyTitle,
|
|
688
|
+
settings: { collection: 'programme', count: 4, showDate: false, showImage: true },
|
|
689
|
+
visibility: onlyOn(eventTarget, searchTarget),
|
|
1245
690
|
},
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
name: 'hero',
|
|
1260
|
-
spec: heroArt(associationPalette(), 'mesh', 21),
|
|
1261
|
-
alt: 'Around twenty volunteers in work aprons and caps gathered outdoors, smiling',
|
|
1262
|
-
photo: 'association/hero.jpg',
|
|
1263
|
-
},
|
|
1264
|
-
...[
|
|
1265
|
-
[
|
|
1266
|
-
'programme-food-bank',
|
|
1267
|
-
'association/food-bank.jpg',
|
|
1268
|
-
'Volunteers packing tins and dry food into boxes for the Thursday food bank',
|
|
1269
|
-
],
|
|
1270
|
-
[
|
|
1271
|
-
'programme-homework-club',
|
|
1272
|
-
'association/homework-club.jpg',
|
|
1273
|
-
'Student volunteers around a table at the start of a homework club afternoon',
|
|
1274
|
-
],
|
|
1275
|
-
[
|
|
1276
|
-
'programme-garden',
|
|
1277
|
-
'association/garden-planting.jpg',
|
|
1278
|
-
'Neighbours kneeling at a raised bed, planting out seedlings in the sun',
|
|
1279
|
-
],
|
|
1280
|
-
[
|
|
1281
|
-
'programme-coat-bank',
|
|
1282
|
-
'association/winter-coat-collection.jpg',
|
|
1283
|
-
'Donated winter coats on rails, with two people looking for a size',
|
|
1284
|
-
],
|
|
1285
|
-
[
|
|
1286
|
-
'event-orientation',
|
|
1287
|
-
'association/volunteer-orientation.jpg',
|
|
1288
|
-
'New volunteers listening around a table in a bright meeting room',
|
|
1289
|
-
],
|
|
1290
|
-
[
|
|
1291
|
-
'event-supper',
|
|
1292
|
-
'association/fundraising-dinner.jpg',
|
|
1293
|
-
'Guests talking at round tables in a panelled hall during a charity supper',
|
|
1294
|
-
],
|
|
1295
|
-
[
|
|
1296
|
-
'portrait',
|
|
1297
|
-
'association/volunteer-portrait.jpg',
|
|
1298
|
-
'Joanne Pryce, a homework club volunteer, talking at a table',
|
|
1299
|
-
],
|
|
1300
|
-
].map(([name, photo, alt], index) => ({
|
|
1301
|
-
name,
|
|
1302
|
-
spec: coverArt(associationPalette(), index + 1),
|
|
1303
|
-
alt,
|
|
1304
|
-
photo,
|
|
1305
|
-
})),
|
|
1306
|
-
...ASSOCIATION_PARTNERS.map((partner, index) => ({
|
|
1307
|
-
name: partner.key,
|
|
1308
|
-
spec: logoArt(index + 1),
|
|
1309
|
-
alt: partner.name,
|
|
1310
|
-
photo: `association/${partner.key}.png`,
|
|
1311
|
-
})),
|
|
1312
|
-
];
|
|
691
|
+
{
|
|
692
|
+
area: 'sidebar',
|
|
693
|
+
type: 'cta',
|
|
694
|
+
settings: {
|
|
695
|
+
heading: w.handHeading,
|
|
696
|
+
body: w.handBody,
|
|
697
|
+
label: w.handLabel,
|
|
698
|
+
href: `/${copy.pageSlugs.volunteer}`,
|
|
699
|
+
},
|
|
700
|
+
visibility: onlyOn(eventTarget),
|
|
701
|
+
},
|
|
702
|
+
];
|
|
703
|
+
}
|
|
1313
704
|
/** The starting skin's palette, for the fallback art a missing photograph would get. */
|
|
1314
705
|
function associationPalette() {
|
|
1315
706
|
const skin = STARTING_SKINS.association;
|
|
@@ -1322,6 +713,29 @@ function associationPalette() {
|
|
|
1322
713
|
}
|
|
1323
714
|
return skin.color;
|
|
1324
715
|
}
|
|
716
|
+
/**
|
|
717
|
+
* Bundled photographs (`assets/photos/association/`), every one looked at full
|
|
718
|
+
* size and credited (`association-credits.ts`). The partner wordmarks were
|
|
719
|
+
* rendered once from OFL typefaces. `spec` is only the fallback a missing file
|
|
720
|
+
* would get.
|
|
721
|
+
*/
|
|
722
|
+
export function associationMediaSpecs(copy) {
|
|
723
|
+
const palette = associationPalette();
|
|
724
|
+
return [
|
|
725
|
+
...copy.media.map((item, index) => ({
|
|
726
|
+
name: item.name,
|
|
727
|
+
spec: item.name === 'hero' ? heroArt(palette, 'sun', 21) : coverArt(palette, index + 1),
|
|
728
|
+
alt: item.alt,
|
|
729
|
+
photo: `association/${item.file}`,
|
|
730
|
+
})),
|
|
731
|
+
...copy.partners.map((partner, index) => ({
|
|
732
|
+
name: partner.key,
|
|
733
|
+
spec: logoArt(index + 1),
|
|
734
|
+
alt: partner.name,
|
|
735
|
+
photo: `association/${partner.file}`,
|
|
736
|
+
})),
|
|
737
|
+
];
|
|
738
|
+
}
|
|
1325
739
|
export const ASSOCIATION_RECOMMENDED_AGENTS = [
|
|
1326
740
|
{
|
|
1327
741
|
name: 'contentAgent',
|
|
@@ -1334,14 +748,17 @@ export const ASSOCIATION_RECOMMENDED_AGENTS = [
|
|
|
1334
748
|
reason: 'Audits the events and programme pages so people nearby find them from a search engine.',
|
|
1335
749
|
},
|
|
1336
750
|
];
|
|
751
|
+
// ---------------------------------------------------------------------------
|
|
752
|
+
// Seeding
|
|
753
|
+
// ---------------------------------------------------------------------------
|
|
1337
754
|
/** Seeds the footer menu at the `footer` location, one placeholder per column with its links as children. */
|
|
1338
|
-
async function seedFooterMenu(db, locale) {
|
|
755
|
+
async function seedFooterMenu(db, locale, copy) {
|
|
1339
756
|
await ensureMenuTables(db);
|
|
1340
757
|
const store = createMenuStore({ db });
|
|
1341
758
|
if ((await store.byLocation('footer', locale)) !== null)
|
|
1342
759
|
return;
|
|
1343
760
|
const menu = await store.create({ name: 'footer', locale, label: 'footer', location: 'footer' });
|
|
1344
|
-
for (const column of
|
|
761
|
+
for (const column of associationFooter(copy)) {
|
|
1345
762
|
const heading = await store.createItem(menu.id, {
|
|
1346
763
|
label: column.heading,
|
|
1347
764
|
kind: 'submenu-placeholder',
|
|
@@ -1357,87 +774,95 @@ async function seedFooterMenu(db, locale) {
|
|
|
1357
774
|
}
|
|
1358
775
|
}
|
|
1359
776
|
/** Writes the footer note again with the site's own email address. */
|
|
1360
|
-
async function seedFooterNote(ctx) {
|
|
777
|
+
async function seedFooterNote(ctx, copy) {
|
|
1361
778
|
const definition = siteSettingByKey('general.footerNote');
|
|
1362
779
|
if (definition === undefined)
|
|
1363
780
|
return;
|
|
1364
781
|
await ensureSiteSettingsTables(ctx.db);
|
|
1365
782
|
const store = createSiteSettingsStore({ db: ctx.db });
|
|
1366
783
|
const locale = definition.scope === 'site' ? SITE_SETTINGS_SITE_SCOPE : ctx.defaultLocale;
|
|
1367
|
-
await store.set('general.footerNote', locale, associationFooterNote(ctx.siteName), ctx.adminId);
|
|
784
|
+
await store.set('general.footerNote', locale, associationFooterNote(copy, ctx.siteName), ctx.adminId);
|
|
1368
785
|
}
|
|
1369
786
|
/**
|
|
1370
787
|
* Inserts the blueprint's content through the real `ContentStore` and
|
|
1371
788
|
* `MenuStore`, never mocked (house rule): programmes first, in the order the
|
|
1372
|
-
* charity presents them, then events in date order, then the pages.
|
|
1373
|
-
*
|
|
1374
|
-
* behind it.
|
|
789
|
+
* charity presents them, then events in date order, then the pages. Everything
|
|
790
|
+
* is published, so every list and every link has something real behind it.
|
|
1375
791
|
*/
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
const
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
792
|
+
function seedAssociationDemoContent(copy) {
|
|
793
|
+
return async (ctx) => {
|
|
794
|
+
const { db, defaultLocale, adminId, media } = ctx;
|
|
795
|
+
const model = associationSchema(copy);
|
|
796
|
+
const context = contextFor(copy, ctx.siteName);
|
|
797
|
+
const programmeStore = createContentStore({ db, collection: model.programme, defaultLocale });
|
|
798
|
+
const eventStore = createContentStore({ db, collection: model.event, defaultLocale });
|
|
799
|
+
const pageStore = createContentStore({ db, collection: model.page, defaultLocale });
|
|
800
|
+
for (const item of copy.programmes) {
|
|
801
|
+
const photo = media[item.photo];
|
|
802
|
+
await programmeStore.create({
|
|
803
|
+
status: 'published',
|
|
804
|
+
createdBy: adminId,
|
|
805
|
+
values: {
|
|
806
|
+
title: item.title,
|
|
807
|
+
slug: item.slug,
|
|
808
|
+
summary: item.summary,
|
|
809
|
+
schedule: item.schedule,
|
|
810
|
+
location: item.location,
|
|
811
|
+
address: `${copy.identity.street}, ${copy.identity.town}`,
|
|
812
|
+
audience: item.audience,
|
|
813
|
+
cost: item.cost,
|
|
814
|
+
contact: context.email(item.mailbox),
|
|
815
|
+
...(photo === undefined ? {} : { coverImage: photo }),
|
|
816
|
+
},
|
|
817
|
+
blocks: { blocks: associationProgrammeBlocks(copy, item).map(toBlockZoneEntry) },
|
|
818
|
+
});
|
|
819
|
+
}
|
|
820
|
+
for (const item of copy.events) {
|
|
821
|
+
const photo = item.photo === undefined ? undefined : media[item.photo];
|
|
822
|
+
await eventStore.create({
|
|
823
|
+
status: 'published',
|
|
824
|
+
createdBy: adminId,
|
|
825
|
+
values: {
|
|
826
|
+
title: item.title,
|
|
827
|
+
slug: item.slug,
|
|
828
|
+
date: futureIso(item.daysFromNow, item.start),
|
|
829
|
+
endsAt: futureIso(item.daysFromNow, item.end),
|
|
830
|
+
location: item.location,
|
|
831
|
+
address: item.address,
|
|
832
|
+
cost: item.cost,
|
|
833
|
+
booking: item.booking,
|
|
834
|
+
description: item.description,
|
|
835
|
+
...(photo === undefined ? {} : { coverImage: photo }),
|
|
836
|
+
},
|
|
837
|
+
blocks: { blocks: associationEventBlocks(copy, item).map(toBlockZoneEntry) },
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
for (const demo of buildAssociationDemoPages(copy, media, ctx.siteName)) {
|
|
841
|
+
await pageStore.create({
|
|
842
|
+
status: 'published',
|
|
843
|
+
createdBy: adminId,
|
|
844
|
+
values: { title: demo.title, slug: demo.slug },
|
|
845
|
+
blocks: { blocks: demo.blocks.map(toBlockZoneEntry) },
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
await seedFooterMenu(db, defaultLocale, copy);
|
|
849
|
+
await seedFooterNote(ctx, copy);
|
|
850
|
+
};
|
|
1432
851
|
}
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
852
|
+
/** The whole blueprint, in one language. */
|
|
853
|
+
export function createAssociationContentPack(locale) {
|
|
854
|
+
const copy = associationCopyFor(locale);
|
|
855
|
+
return {
|
|
856
|
+
collections: associationSchema(copy).collections,
|
|
857
|
+
recommendedAgents: ASSOCIATION_RECOMMENDED_AGENTS,
|
|
858
|
+
seedDemoContent: seedAssociationDemoContent(copy),
|
|
859
|
+
defaultTheme: '@cogenta/theme-association',
|
|
860
|
+
menus: associationMenus(copy),
|
|
861
|
+
widgets: associationWidgets(copy),
|
|
862
|
+
siteSettings: associationSiteSettings(copy),
|
|
863
|
+
mediaSpecs: associationMediaSpecs(copy),
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
/** The English pack, which `BLUEPRINT_CONTENT_PACKS` lists; `contentPackFor` picks by locale. */
|
|
867
|
+
export const associationContentPack = createAssociationContentPack('en');
|
|
1443
868
|
//# sourceMappingURL=association.js.map
|