From 04b0b2972d7e9c2c2c27df080323e6d33fdc12ab Mon Sep 17 00:00:00 2001 From: Richard Osborne Date: Mon, 25 Dec 2023 17:24:27 +0000 Subject: [PATCH] Compress images --- .astro/types.d.ts | 404 +- astro.config.mjs | 1 - package.json | 6 +- src/components/Card.astro | 27 +- src/components/Cards.astro | 7 +- src/components/FrontPageLink.astro | 21 +- src/components/Hero.astro | 18 +- src/components/Solocard.astro | 12 +- src/components/images.ts | 19 + src/components/types.ts | 11 + src/content/blog/summer.mdx | 47 +- src/content/blog/week1.mdx | 20 +- src/content/blog/week2.mdx | 48 +- src/content/blog/week3.mdx | 20 +- src/content/blog/week4.mdx | 26 +- src/content/blog/week5-6.mdx | 41 +- src/content/blog/week7-8.mdx | 57 +- src/content/blog/week9-10.mdx | 49 +- src/content/blog/work1.mdx | 37 +- src/content/blog/work2.mdx | 44 +- src/content/blog/work3.mdx | 56 +- src/content/blog/work4.mdx | 63 +- src/content/blog/work5.mdx | 49 +- src/content/blog/work6.mdx | 50 +- src/content/blog/year2022-1.mdx | 102 +- src/content/blog/year2022-end.mdx | 90 +- src/content/blog/year2022-w1.mdx | 78 +- src/content/blog/year2022-w2.mdx | 97 +- src/content/blog/year2022-w3.mdx | 80 +- src/content/blog/year2023-1.mdx | 221 +- src/content/config.ts | 9 + {public => src}/images/summer/bigscreen.jpg | 0 {public => src}/images/summer/bikeride.jpg | 0 {public => src}/images/summer/camping.jpg | 0 {public => src}/images/summer/car.jpg | 0 {public => src}/images/summer/dyrham.jpg | 0 .../images/summer/garden_produce.jpg | 0 .../images/summer/harrow_grass.jpg | 0 {public => src}/images/summer/kayak.jpg | 0 .../images/summer/naughtyGuest.jpg | 0 {public => src}/images/summer/outside.jpg | 0 {public => src}/images/summer/red_arrows.png | Bin {public => src}/images/summer/shelf.jpg | 0 {public => src}/images/summer/signpost.jpg | 0 {public => src}/images/summer/subsidence.jpg | 0 {public => src}/images/week1/5f.jpg | 0 {public => src}/images/week1/5r.jpg | 0 {public => src}/images/week1/cards.jpg | 0 {public => src}/images/week1/internet.jpg | 0 {public => src}/images/week1/lounge.jpg | 0 {public => src}/images/week1/rainbow.jpg | 0 {public => src}/images/week1/shelves.jpg | 0 {public => src}/images/week2/5f-coat-1.jpg | 0 {public => src}/images/week2/bedroom.jpg | 0 {public => src}/images/week2/door.PNG | Bin {public => src}/images/week2/fishing.jpg | 0 {public => src}/images/week2/g&g-card.jpg | 0 {public => src}/images/week2/magnolia.jpg | 0 {public => src}/images/week2/office.jpg | 0 .../images/week2/paint-stripper-test.jpg | 0 {public => src}/images/week2/pew.mp4 | Bin {public => src}/images/week2/polyfilla.jpg | 0 {public => src}/images/week2/primer-0.jpg | 0 {public => src}/images/week2/primer-1.jpg | 0 {public => src}/images/week2/primer-2.jpg | 0 {public => src}/images/week2/stripping-0.jpg | 0 {public => src}/images/week2/stripping-1.jpg | 0 {public => src}/images/week2/stripping-2.jpg | 0 {public => src}/images/week2/stripping-3.jpg | 0 {public => src}/images/week2/stripping-4.jpg | 0 {public => src}/images/week2/tip.jpg | 0 {public => src}/images/week2/topcoat-1.jpg | 0 .../images/week2/windscreen-wiper.jpg | 0 {public => src}/images/week2/yuk.jpg | 0 .../images/week3/bathroom-design.jpg | 0 .../images/week3/bedroom-light.jpg | 0 {public => src}/images/week3/dishwasher.jpg | 0 {public => src}/images/week3/door1.jpg | 0 {public => src}/images/week3/door2.jpg | 0 {public => src}/images/week3/ethernet.jpg | 0 {public => src}/images/week3/movers1.jpg | 0 {public => src}/images/week3/movers2.jpg | 0 {public => src}/images/week3/movers3.jpg | 0 .../images/week3/sans-radiator.jpg | 0 .../images/week3/sofa-with-boxes.jpg | 0 {public => src}/images/week4/5f.jpg | 0 {public => src}/images/week4/bathroom.png | Bin {public => src}/images/week4/bbq.jpg | 0 {public => src}/images/week4/cherry.jpg | 0 {public => src}/images/week4/elephant.jpg | 0 {public => src}/images/week4/kitchen.jpg | 0 {public => src}/images/week4/magnolia.jpg | 0 {public => src}/images/week4/rose.jpg | 0 {public => src}/images/week4/walk.jpg | 0 {public => src}/images/week4/walk2.jpg | 0 {public => src}/images/week5-6/bae.jpg | 0 {public => src}/images/week5-6/crisis.jpg | 0 {public => src}/images/week5-6/design.png | Bin {public => src}/images/week5-6/eth1.jpg | 0 {public => src}/images/week5-6/eth2.jpg | 0 {public => src}/images/week5-6/eth3.jpg | 0 {public => src}/images/week5-6/fit.jpg | 0 {public => src}/images/week5-6/gig1.jpg | 0 {public => src}/images/week5-6/gig2.jpg | 0 .../images/week5-6/office-nikki.jpg | 0 .../images/week5-6/office-ozzy.jpg | 0 {public => src}/images/week5-6/pipes.jpg | 0 {public => src}/images/week5-6/print.jpg | 0 {public => src}/images/week5-6/utility1.jpg | 0 {public => src}/images/week5-6/utility2.jpg | 0 {public => src}/images/week5-6/utility3.jpg | 0 {public => src}/images/week5-6/windows.jpg | 0 {public => src}/images/week7-8/catlol.jpg | 0 {public => src}/images/week7-8/damp1.jpg | 0 {public => src}/images/week7-8/damp2.jpg | 0 {public => src}/images/week7-8/damp3.jpg | 0 {public => src}/images/week7-8/ethernet.jpg | 0 {public => src}/images/week7-8/fusebox1.jpg | 0 {public => src}/images/week7-8/fusebox2.jpg | 0 {public => src}/images/week7-8/kitchen1.jpg | 0 {public => src}/images/week7-8/kitchen2.jpg | 0 {public => src}/images/week7-8/kitchen3.jpg | 0 {public => src}/images/week7-8/kitchen4.jpg | 0 {public => src}/images/week7-8/lead.jpg | 0 {public => src}/images/week7-8/notourroof.jpg | 0 {public => src}/images/week7-8/pipes.jpg | 0 {public => src}/images/week7-8/protection.jpg | 0 {public => src}/images/week7-8/roof1.jpg | 0 {public => src}/images/week7-8/roof2.jpg | 0 {public => src}/images/week7-8/roof3.jpg | 0 {public => src}/images/week7-8/roof4.jpg | 0 {public => src}/images/week7-8/roof5.jpg | 0 {public => src}/images/week7-8/scaf1.jpg | 0 {public => src}/images/week7-8/shelves.jpg | 0 .../images/week7-8/splattergun.jpg | 0 {public => src}/images/week7-8/walk.jpg | 0 {public => src}/images/week9-10/breakers.jpg | 0 {public => src}/images/week9-10/cat-1.jpg | 0 {public => src}/images/week9-10/cat-2.jpg | 0 {public => src}/images/week9-10/cat-3.jpg | 0 .../images/week9-10/dodgy-paint.jpg | 0 {public => src}/images/week9-10/finished.jpg | 0 {public => src}/images/week9-10/garden-1.jpg | 0 {public => src}/images/week9-10/garden-2.jpg | 0 {public => src}/images/week9-10/layout.jpg | 0 {public => src}/images/week9-10/mist-coat.jpg | 0 {public => src}/images/week9-10/painting.jpg | 0 {public => src}/images/week9-10/privacy.jpg | 0 .../images/week9-10/self-level-1.jpg | 0 .../images/week9-10/self-level-2.jpg | 0 {public => src}/images/week9-10/shower.jpg | 0 .../images/week9-10/spinny-tool.jpg | 0 {public => src}/images/week9-10/straight.jpg | 0 {public => src}/images/week9-10/tiling-1.jpg | 0 {public => src}/images/week9-10/tiling-2.jpg | 0 {public => src}/images/week9-10/wonk.jpg | 0 {public => src}/images/work1/bath.jpg | 0 .../images/work1/bathroomfloorup.jpg | 0 {public => src}/images/work1/bellpull.jpg | 0 {public => src}/images/work1/climbingup.jpg | 0 .../images/work1/currentbathroom.jpg | 0 .../images/work1/diningroomholes.jpg | 0 {public => src}/images/work1/duplotoilet.jpg | 0 {public => src}/images/work1/eurgh.jpg | 0 {public => src}/images/work1/flytipping.jpg | 0 {public => src}/images/work1/hallwayfloor.jpg | 0 .../images/work1/holefromdining.jpg | 0 .../images/work1/holefromkitchen.jpg | 0 .../images/work1/initialbathroom.png | Bin .../images/work1/initialdiningroom.jpg | 0 {public => src}/images/work1/junctionbox.jpg | 0 {public => src}/images/work1/toolroom.jpg | 0 {public => src}/images/work2/annePower.jpg | 0 .../images/work2/backwardsPlumbing.jpg | 0 {public => src}/images/work2/bath.jpg | 0 {public => src}/images/work2/bathroom1.jpg | 0 {public => src}/images/work2/bathroom2.jpg | 0 {public => src}/images/work2/bathroom3.jpg | 0 {public => src}/images/work2/bathroom4.jpg | 0 {public => src}/images/work2/bathroom5.jpg | 0 {public => src}/images/work2/bathroom6.jpg | 0 {public => src}/images/work2/bathroom7.jpg | 0 {public => src}/images/work2/bedroom.jpg | 0 .../images/work2/contractWhite.jpg | 0 .../images/work2/contractWhite2.jpg | 0 {public => src}/images/work2/lightswitch1.jpg | 0 {public => src}/images/work2/lightswitch2.jpg | 0 {public => src}/images/work2/lvgo.jpg | 0 {public => src}/images/work2/manleyPower.jpg | 0 .../images/work2/pickingColours.jpg | 0 {public => src}/images/work2/plaster1.jpg | 0 {public => src}/images/work2/plaster2.jpg | 0 {public => src}/images/work2/sausage.jpg | 0 {public => src}/images/work2/showerDetail.jpg | 0 {public => src}/images/work2/tap.jpg | 0 {public => src}/images/work2/wood.jpg | 0 {public => src}/images/work3/bathroom1.jpg | 0 {public => src}/images/work3/bathroom2.jpg | 0 {public => src}/images/work3/bathroom3.jpg | 0 {public => src}/images/work3/bathroom4.jpg | 0 {public => src}/images/work3/bathroom5.jpg | 0 {public => src}/images/work3/bathroom6.jpg | 0 {public => src}/images/work3/bathroom7.jpg | 0 {public => src}/images/work3/bathroom8.jpg | 0 {public => src}/images/work3/bathroom9.jpg | 0 {public => src}/images/work3/coreSample.jpg | 0 {public => src}/images/work3/dance1.jpg | 0 {public => src}/images/work3/dance2.jpg | 0 {public => src}/images/work3/dishwasher.jpg | 0 {public => src}/images/work3/fireplace1.jpg | 0 {public => src}/images/work3/fireplace2.jpg | 0 {public => src}/images/work3/fireplace3.jpg | 0 {public => src}/images/work3/france1.jpg | 0 {public => src}/images/work3/france2.jpg | 0 {public => src}/images/work3/france3.jpg | 0 {public => src}/images/work3/gutter1.jpg | 0 {public => src}/images/work3/gutter2.jpg | 0 {public => src}/images/work3/kitchen1.jpg | 0 {public => src}/images/work3/kitchen2.jpg | 0 {public => src}/images/work3/kitchen3.jpg | 0 {public => src}/images/work3/kitchen4.jpg | 0 {public => src}/images/work4/bath.jpg | 0 {public => src}/images/work4/bathroom0.jpg | 0 {public => src}/images/work4/bathroom1.jpg | 0 {public => src}/images/work4/bathroom2.jpg | 0 .../images/work4/catflapcarnage.jpg | 0 {public => src}/images/work4/drawers.jpg | 0 .../images/work4/drawertesting.jpg | 0 {public => src}/images/work4/garden.jpg | 0 {public => src}/images/work4/kitchen1.jpg | 0 {public => src}/images/work4/kitchen2.jpg | 0 {public => src}/images/work4/kitchen4.jpg | 0 {public => src}/images/work4/kitchen5.jpg | 0 {public => src}/images/work4/kitchen6.jpg | 0 {public => src}/images/work4/kitchen7.jpg | 0 {public => src}/images/work4/kitchenwoo1.jpg | 0 {public => src}/images/work4/kitchenwoo2.jpg | 0 {public => src}/images/work4/lights.jpg | 0 .../images/work4/magneticbackboard.jpg | 0 {public => src}/images/work4/nikkidesk.jpg | 0 {public => src}/images/work4/ozzydesk.jpg | 0 {public => src}/images/work4/sink.jpg | 0 {public => src}/images/work4/tape.jpg | 0 {public => src}/images/work4/toilet.jpg | 0 {public => src}/images/work4/tool.jpg | 0 .../images/work4/underfloorHeating.jpg | 0 .../images/work4/undersinkmatting.jpg | 0 {public => src}/images/work4/van.jpg | 0 {public => src}/images/work5/bathroom1.jpg | 0 {public => src}/images/work5/bathroom2.jpg | 0 {public => src}/images/work5/bedroom.jpg | 0 {public => src}/images/work5/floorcolours.jpg | 0 {public => src}/images/work5/kitchen.jpg | 0 {public => src}/images/work5/loadtesting.jpg | 0 .../images/work5/ozzycooksfood.png | Bin {public => src}/images/work5/rewiring.jpg | 0 {public => src}/images/work5/socket1.jpg | 0 {public => src}/images/work5/socket2.jpg | 0 {public => src}/images/work5/socket3.jpg | 0 {public => src}/images/work5/socket4.jpg | 0 .../images/work5/speakersandlights.jpg | 0 {public => src}/images/work5/worktop1.jpg | 0 {public => src}/images/work5/worktop2.jpg | 0 {public => src}/images/work5/yum.jpg | 0 {public => src}/images/work6/cinema1.jpg | 0 {public => src}/images/work6/cinema2.jpg | 0 {public => src}/images/work6/flagstone.jpg | 0 {public => src}/images/work6/going1.jpg | 0 {public => src}/images/work6/going2.jpg | 0 {public => src}/images/work6/gone.jpg | 0 {public => src}/images/work6/green.jpg | 0 {public => src}/images/work6/grout.jpg | 0 {public => src}/images/work6/icecream.jpg | 0 {public => src}/images/work6/icecube.jpg | 0 {public => src}/images/work6/m1.jpg | 0 {public => src}/images/work6/m2.jpg | 0 {public => src}/images/work6/m3.jpg | 0 {public => src}/images/work6/m4.jpg | 0 {public => src}/images/work6/m5.jpg | 0 {public => src}/images/work6/plumbing1.png | Bin {public => src}/images/work6/plumbing2.png | Bin {public => src}/images/work6/pressies.jpg | 0 {public => src}/images/work6/stool1.jpg | 0 {public => src}/images/work6/stool2.jpg | 0 {public => src}/images/work6/tree1.jpg | 0 {public => src}/images/work6/walk.jpg | 0 .../images/year2022-1/balcony1.jpg | 0 .../images/year2022-1/balcony2.jpg | 0 .../images/year2022-1/bathroom1.jpg | 0 .../images/year2022-1/bathroom2.jpg | 0 {public => src}/images/year2022-1/car.jpg | 0 {public => src}/images/year2022-1/cine-1.jpg | 0 {public => src}/images/year2022-1/cine-2.jpg | 0 {public => src}/images/year2022-1/excuse1.jpg | 0 {public => src}/images/year2022-1/excuse2.jpg | 0 .../images/year2022-1/excuse3576.jpg | 0 {public => src}/images/year2022-1/excuse4.jpg | 0 .../images/year2022-1/excuse48.jpg | 0 {public => src}/images/year2022-1/excuse5.jpg | 0 {public => src}/images/year2022-1/excuse6.jpg | 0 {public => src}/images/year2022-1/legs0.jpg | 0 {public => src}/images/year2022-1/legs1.jpg | 0 {public => src}/images/year2022-1/legs2.jpg | 0 {public => src}/images/year2022-1/rose.jpg | 0 .../images/year2022-1/sofabed-engineering.jpg | 0 {public => src}/images/year2022-1/sofabed.jpg | 0 {public => src}/images/year2022-1/summer.jpg | 0 .../images/year2022-1/toilet-destroy.jpg | 0 .../images/year2022-1/toilet-eurgh.jpg | 0 .../images/year2022-1/toilet-fittings.jpg | 0 .../images/year2022-1/toilet-painting.jpg | 0 .../images/year2022-1/toilet-painting2.jpg | 0 .../images/year2022-1/toilet-polyfiller.jpg | 0 .../images/year2022-1/toilet-yuck.jpg | 0 {public => src}/images/year2022-1/toilet1.jpg | 0 {public => src}/images/year2022-1/toilet2.jpg | 0 {public => src}/images/year2022-1/toilet3.jpg | 0 {public => src}/images/year2022-1/toilet4.jpg | 0 {public => src}/images/year2022-1/toilet5.jpg | 0 {public => src}/images/year2022-1/toilet6.jpg | 0 {public => src}/images/year2022-1/window1.jpg | 0 {public => src}/images/year2022-1/window2.jpg | 0 .../images/year2022-end/bathroom-santa.jpg | 0 .../year2022-end/bathroom-templating.jpg | 0 .../images/year2022-end/bathroom-vanity.jpg | 0 .../images/year2022-end/bathroom1.jpg | 0 .../images/year2022-end/bathroom2.jpg | 0 .../images/year2022-end/christmas.jpg | 0 .../images/year2022-end/garden-bistro.jpg | 0 .../images/year2022-end/garden-skip.jpg | 0 .../images/year2022-end/hallway-boxing.jpg | 0 .../images/year2022-end/hallway-carpet1.jpg | 0 .../images/year2022-end/hallway-carpet2.jpg | 0 .../year2022-end/hallway-coatrackboxing.jpg | 0 .../images/year2022-end/hallway-finished.jpg | 0 .../images/year2022-end/hallway-nicetip.jpg | 0 .../images/year2022-end/hallway-oopscable.jpg | 0 .../images/year2022-end/hallway-shoerack.jpg | 0 .../images/year2022-end/hardwaxoil1.jpg | 0 .../images/year2022-end/hardwaxoil2.jpg | 0 .../year2022-end/radiator-dead-valves.jpg | 0 .../year2022-end/radiator-drainagesystem.jpg | 0 .../year2022-end/radiator-streeeeetch.jpg | 0 .../images/year2022-end/radiator-wrench.jpg | 0 .../images/year2022-end/winterwonderland.jpg | 0 .../images/year2022-w1/dining-stone.jpg | 0 .../images/year2022-w1/floorboards-up.jpg | 0 .../year2022-w1/gutterPreviousAttempt.jpg | 0 .../images/year2022-w1/gutterSolution.png | Bin .../images/year2022-w1/guttersweep.jpg | 0 .../images/year2022-w1/guttersweeping.jpg | 0 .../images/year2022-w1/hallway-floorboard.jpg | 0 .../images/year2022-w1/hallway-graffiti.jpg | 0 .../images/year2022-w1/hallway-yellow.jpg | 0 .../images/year2022-w1/happy-wifi.jpg | 0 .../images/year2022-w1/holesaw.gif | Bin .../images/year2022-w1/laserlevelling.gif | Bin .../year2022-w1/utility-channelling.jpg | 0 .../images/year2022-w1/utility-cutout.jpg | 0 .../images/year2022-w1/utility-fitting.jpg | 0 .../images/year2022-w1/utility-original.jpg | 0 .../images/year2022-w1/utility-painty.jpg | 0 .../images/year2022-w1/utility-pipes.jpg | 0 .../images/year2022-w1/utility-progress.jpg | 0 .../images/year2022-w1/utility-storage.jpg | 0 .../images/year2022-w1/utility-tap-access.jpg | 0 .../images/year2022-w1/utility-wastecut.jpg | 0 .../year2022-w2/bathroom_ceilidhstuds.jpg | 0 .../images/year2022-w2/bathroom_moodboard.jpg | 0 .../images/year2022-w2/bathroom_plan1.jpg | 0 .../images/year2022-w2/bathroom_plan2.jpg | 0 .../images/year2022-w2/bathroom_studs.jpg | 0 {public => src}/images/year2022-w2/bzzt.jpg | 0 {public => src}/images/year2022-w2/bzzt2.jpg | 0 .../images/year2022-w2/dining_electrics.jpg | 0 .../images/year2022-w2/dining_pipes.jpg | 0 .../year2022-w2/dining_plasterboardshapes.jpg | 0 .../images/year2022-w2/dining_plastered.jpg | 0 .../images/year2022-w2/dining_plastered2.jpg | 0 .../year2022-w2/dining_plasteredhalf.jpg | 0 .../images/year2022-w2/dining_studs.jpg | 0 .../year2022-w2/guest_bathroom_before.jpg | 0 .../images/year2022-w2/hall_nightclub.jpg | 0 .../images/year2022-w2/hallway_testers.jpg | 0 .../images/year2022-w2/hallway_white.jpg | 0 {public => src}/images/year2022-w2/strobe.gif | Bin .../images/year2022-w2/utility_kickboard.jpg | 0 .../images/year2022-w2/worktop_jigsaw.jpg | 0 .../images/year2022-w2/worktop_templating.jpg | 0 .../images/year2022-w2/worktop_tracksaw.jpg | 0 .../images/year2022-w3/bath_columns.jpg | 0 .../images/year2022-w3/bathroom_cutting.jpg | 0 .../year2022-w3/bathroom_floortiles.jpg | 0 .../year2022-w3/bathroom_herringbone.jpg | 0 .../images/year2022-w3/bathroom_mermaid.jpg | 0 .../images/year2022-w3/bathroom_tiles.jpg | 0 .../images/year2022-w3/bathroom_tilewidth.jpg | 0 .../bathroom_underfloorheating.jpg | 0 .../images/year2022-w3/colo_columns.jpg | 0 .../images/year2022-w3/dining_chair.jpg | 0 .../images/year2022-w3/dining_decorated.jpg | 0 .../images/year2022-w3/dining_lampshade.jpg | 0 .../images/year2022-w3/dining_painting.jpg | 0 .../images/year2022-w3/hall_floorboards.jpg | 0 .../images/year2022-w3/hall_lights.jpg | 0 .../images/year2022-w3/italy_big.jpg | 0 .../images/year2022-w3/italy_colosseum.jpg | 0 .../images/year2022-w3/italy_colosseum2.jpg | 0 .../images/year2022-w3/italy_colosseum3.jpg | 0 .../images/year2022-w3/italy_pompeii.jpg | 0 .../images/year2022-w3/italy_pompeii2.jpg | 0 .../images/year2022-w3/italy_pompeii3.jpg | 0 {public => src}/images/year2022-w3/safety.jpg | 0 .../images/year2022-w3/skyline_walk.jpg | 0 .../images/year2022-w3/skyline_walk2.jpg | 0 .../images/year2022-w3/utility_worktop.jpg | 0 .../images/year2023-1/carpet-2.jpg | 0 .../images/year2023-1/carpet-during-2.jpg | 0 .../images/year2023-1/gardengate.jpg | 0 .../images/year2023-1/gardengate2.jpg | 0 .../images/year2023-1/hall-done-1.jpg | 0 .../images/year2023-1/hall-done-2.jpg | 0 .../images/year2023-1/hall-done-3.jpg | 0 .../images/year2023-1/hall-during-23.jpg | 0 .../images/year2023-1/hall-during2.jpg | 0 .../images/year2023-1/hall-lights-after.jpg | 0 .../images/year2023-1/hall-lights-before.jpg | 0 .../images/year2023-1/hall-safety1.jpg | 0 .../images/year2023-1/hall-safety2.jpg | 0 .../images/year2023-1/hall-safety3.jpg | 0 .../images/year2023-1/hall-stripped1.jpg | 0 .../images/year2023-1/hallback-before.jpg | 0 .../images/year2023-1/hallback-during.jpg | 0 .../images/year2023-1/hallfront-before.jpg | 0 .../images/year2023-1/hallfront-during.jpg | 0 .../images/year2023-1/harrow-hallway.jpg | 0 .../images/year2023-1/herbedacious.jpg | 0 .../images/year2023-1/kayak-down.jpg | 0 .../images/year2023-1/kayak-pub.jpg | 0 .../images/year2023-1/kayak-up.jpg | 0 .../images/year2023-1/plants-transport1.jpg | 0 .../images/year2023-1/plants-transport2.jpg | 0 .../images/year2023-1/proto-lights-2.jpg | 0 .../images/year2023-1/proto-lights.jpg | 0 {public => src}/images/year2023-1/race.jpg | 0 .../images/year2023-1/shoerack.jpg | 0 .../images/year2023-1/stair-crack-fix.jpg | 0 .../images/year2023-1/stair-crack-hole.jpg | 0 .../images/year2023-1/stair-crack.jpg | 0 {public => src}/images/year2023-1/toilet.jpg | 0 {public => src}/images/year2023-1/tusks.jpg | 0 .../images/year2023-1/water-wizards.jpg | 0 .../year2023-1/zapped-thermostat-tape.jpg | 0 .../images/year2023-1/zapped-thermostat.jpg | 0 src/layouts/LayoutMdx.astro | 14 +- src/layouts/TitleLayout.astro | 9 +- src/pages/index.astro | 13 +- src/utils.ts | 10 + tsconfig.json | 7 +- yarn.lock | 3771 +++++++++-------- 460 files changed, 3183 insertions(+), 2451 deletions(-) create mode 100644 src/components/images.ts create mode 100644 src/components/types.ts rename {public => src}/images/summer/bigscreen.jpg (100%) rename {public => src}/images/summer/bikeride.jpg (100%) rename {public => src}/images/summer/camping.jpg (100%) rename {public => src}/images/summer/car.jpg (100%) rename {public => src}/images/summer/dyrham.jpg (100%) rename {public => src}/images/summer/garden_produce.jpg (100%) rename {public => src}/images/summer/harrow_grass.jpg (100%) rename {public => src}/images/summer/kayak.jpg (100%) rename {public => src}/images/summer/naughtyGuest.jpg (100%) rename {public => src}/images/summer/outside.jpg (100%) rename {public => src}/images/summer/red_arrows.png (100%) rename {public => src}/images/summer/shelf.jpg (100%) rename {public => src}/images/summer/signpost.jpg (100%) rename {public => src}/images/summer/subsidence.jpg (100%) rename {public => src}/images/week1/5f.jpg (100%) rename {public => src}/images/week1/5r.jpg (100%) rename {public => src}/images/week1/cards.jpg (100%) rename {public => src}/images/week1/internet.jpg (100%) rename {public => src}/images/week1/lounge.jpg (100%) rename {public => src}/images/week1/rainbow.jpg (100%) rename {public => src}/images/week1/shelves.jpg (100%) rename {public => src}/images/week2/5f-coat-1.jpg (100%) rename {public => src}/images/week2/bedroom.jpg (100%) rename {public => src}/images/week2/door.PNG (100%) rename {public => src}/images/week2/fishing.jpg (100%) rename {public => src}/images/week2/g&g-card.jpg (100%) rename {public => src}/images/week2/magnolia.jpg (100%) rename {public => src}/images/week2/office.jpg (100%) rename {public => src}/images/week2/paint-stripper-test.jpg (100%) rename {public => src}/images/week2/pew.mp4 (100%) rename {public => src}/images/week2/polyfilla.jpg (100%) rename {public => src}/images/week2/primer-0.jpg (100%) rename {public => src}/images/week2/primer-1.jpg (100%) rename {public => src}/images/week2/primer-2.jpg (100%) rename {public => src}/images/week2/stripping-0.jpg (100%) rename {public => src}/images/week2/stripping-1.jpg (100%) rename {public => src}/images/week2/stripping-2.jpg (100%) rename {public => src}/images/week2/stripping-3.jpg (100%) rename {public => src}/images/week2/stripping-4.jpg (100%) rename {public => src}/images/week2/tip.jpg (100%) rename {public => src}/images/week2/topcoat-1.jpg (100%) rename {public => src}/images/week2/windscreen-wiper.jpg (100%) rename {public => src}/images/week2/yuk.jpg (100%) rename {public => src}/images/week3/bathroom-design.jpg (100%) rename {public => src}/images/week3/bedroom-light.jpg (100%) rename {public => src}/images/week3/dishwasher.jpg (100%) rename {public => src}/images/week3/door1.jpg (100%) rename {public => src}/images/week3/door2.jpg (100%) rename {public => src}/images/week3/ethernet.jpg (100%) rename {public => src}/images/week3/movers1.jpg (100%) rename {public => src}/images/week3/movers2.jpg (100%) rename {public => src}/images/week3/movers3.jpg (100%) rename {public => src}/images/week3/sans-radiator.jpg (100%) rename {public => src}/images/week3/sofa-with-boxes.jpg (100%) rename {public => src}/images/week4/5f.jpg (100%) rename {public => src}/images/week4/bathroom.png (100%) rename {public => src}/images/week4/bbq.jpg (100%) rename {public => src}/images/week4/cherry.jpg (100%) rename {public => src}/images/week4/elephant.jpg (100%) rename {public => src}/images/week4/kitchen.jpg (100%) rename {public => src}/images/week4/magnolia.jpg (100%) rename {public => src}/images/week4/rose.jpg (100%) rename {public => src}/images/week4/walk.jpg (100%) rename {public => src}/images/week4/walk2.jpg (100%) rename {public => src}/images/week5-6/bae.jpg (100%) rename {public => src}/images/week5-6/crisis.jpg (100%) rename {public => src}/images/week5-6/design.png (100%) rename {public => src}/images/week5-6/eth1.jpg (100%) rename {public => src}/images/week5-6/eth2.jpg (100%) rename {public => src}/images/week5-6/eth3.jpg (100%) rename {public => src}/images/week5-6/fit.jpg (100%) rename {public => src}/images/week5-6/gig1.jpg (100%) rename {public => src}/images/week5-6/gig2.jpg (100%) rename {public => src}/images/week5-6/office-nikki.jpg (100%) rename {public => src}/images/week5-6/office-ozzy.jpg (100%) rename {public => src}/images/week5-6/pipes.jpg (100%) rename {public => src}/images/week5-6/print.jpg (100%) rename {public => src}/images/week5-6/utility1.jpg (100%) rename {public => src}/images/week5-6/utility2.jpg (100%) rename {public => src}/images/week5-6/utility3.jpg (100%) rename {public => src}/images/week5-6/windows.jpg (100%) rename {public => src}/images/week7-8/catlol.jpg (100%) rename {public => src}/images/week7-8/damp1.jpg (100%) rename {public => src}/images/week7-8/damp2.jpg (100%) rename {public => src}/images/week7-8/damp3.jpg (100%) rename {public => src}/images/week7-8/ethernet.jpg (100%) rename {public => src}/images/week7-8/fusebox1.jpg (100%) rename {public => src}/images/week7-8/fusebox2.jpg (100%) rename {public => src}/images/week7-8/kitchen1.jpg (100%) rename {public => src}/images/week7-8/kitchen2.jpg (100%) rename {public => src}/images/week7-8/kitchen3.jpg (100%) rename {public => src}/images/week7-8/kitchen4.jpg (100%) rename {public => src}/images/week7-8/lead.jpg (100%) rename {public => src}/images/week7-8/notourroof.jpg (100%) rename {public => src}/images/week7-8/pipes.jpg (100%) rename {public => src}/images/week7-8/protection.jpg (100%) rename {public => src}/images/week7-8/roof1.jpg (100%) rename {public => src}/images/week7-8/roof2.jpg (100%) rename {public => src}/images/week7-8/roof3.jpg (100%) rename {public => src}/images/week7-8/roof4.jpg (100%) rename {public => src}/images/week7-8/roof5.jpg (100%) rename {public => src}/images/week7-8/scaf1.jpg (100%) rename {public => src}/images/week7-8/shelves.jpg (100%) rename {public => src}/images/week7-8/splattergun.jpg (100%) rename {public => src}/images/week7-8/walk.jpg (100%) rename {public => src}/images/week9-10/breakers.jpg (100%) rename {public => src}/images/week9-10/cat-1.jpg (100%) rename {public => src}/images/week9-10/cat-2.jpg (100%) rename {public => src}/images/week9-10/cat-3.jpg (100%) rename {public => src}/images/week9-10/dodgy-paint.jpg (100%) rename {public => src}/images/week9-10/finished.jpg (100%) rename {public => src}/images/week9-10/garden-1.jpg (100%) rename {public => src}/images/week9-10/garden-2.jpg (100%) rename {public => src}/images/week9-10/layout.jpg (100%) rename {public => src}/images/week9-10/mist-coat.jpg (100%) rename {public => src}/images/week9-10/painting.jpg (100%) rename {public => src}/images/week9-10/privacy.jpg (100%) rename {public => src}/images/week9-10/self-level-1.jpg (100%) rename {public => src}/images/week9-10/self-level-2.jpg (100%) rename {public => src}/images/week9-10/shower.jpg (100%) rename {public => src}/images/week9-10/spinny-tool.jpg (100%) rename {public => src}/images/week9-10/straight.jpg (100%) rename {public => src}/images/week9-10/tiling-1.jpg (100%) rename {public => src}/images/week9-10/tiling-2.jpg (100%) rename {public => src}/images/week9-10/wonk.jpg (100%) rename {public => src}/images/work1/bath.jpg (100%) rename {public => src}/images/work1/bathroomfloorup.jpg (100%) rename {public => src}/images/work1/bellpull.jpg (100%) rename {public => src}/images/work1/climbingup.jpg (100%) rename {public => src}/images/work1/currentbathroom.jpg (100%) rename {public => src}/images/work1/diningroomholes.jpg (100%) rename {public => src}/images/work1/duplotoilet.jpg (100%) rename {public => src}/images/work1/eurgh.jpg (100%) rename {public => src}/images/work1/flytipping.jpg (100%) rename {public => src}/images/work1/hallwayfloor.jpg (100%) rename {public => src}/images/work1/holefromdining.jpg (100%) rename {public => src}/images/work1/holefromkitchen.jpg (100%) rename {public => src}/images/work1/initialbathroom.png (100%) rename {public => src}/images/work1/initialdiningroom.jpg (100%) rename {public => src}/images/work1/junctionbox.jpg (100%) rename {public => src}/images/work1/toolroom.jpg (100%) rename {public => src}/images/work2/annePower.jpg (100%) rename {public => src}/images/work2/backwardsPlumbing.jpg (100%) rename {public => src}/images/work2/bath.jpg (100%) rename {public => src}/images/work2/bathroom1.jpg (100%) rename {public => src}/images/work2/bathroom2.jpg (100%) rename {public => src}/images/work2/bathroom3.jpg (100%) rename {public => src}/images/work2/bathroom4.jpg (100%) rename {public => src}/images/work2/bathroom5.jpg (100%) rename {public => src}/images/work2/bathroom6.jpg (100%) rename {public => src}/images/work2/bathroom7.jpg (100%) rename {public => src}/images/work2/bedroom.jpg (100%) rename {public => src}/images/work2/contractWhite.jpg (100%) rename {public => src}/images/work2/contractWhite2.jpg (100%) rename {public => src}/images/work2/lightswitch1.jpg (100%) rename {public => src}/images/work2/lightswitch2.jpg (100%) rename {public => src}/images/work2/lvgo.jpg (100%) rename {public => src}/images/work2/manleyPower.jpg (100%) rename {public => src}/images/work2/pickingColours.jpg (100%) rename {public => src}/images/work2/plaster1.jpg (100%) rename {public => src}/images/work2/plaster2.jpg (100%) rename {public => src}/images/work2/sausage.jpg (100%) rename {public => src}/images/work2/showerDetail.jpg (100%) rename {public => src}/images/work2/tap.jpg (100%) rename {public => src}/images/work2/wood.jpg (100%) rename {public => src}/images/work3/bathroom1.jpg (100%) rename {public => src}/images/work3/bathroom2.jpg (100%) rename {public => src}/images/work3/bathroom3.jpg (100%) rename {public => src}/images/work3/bathroom4.jpg (100%) rename {public => src}/images/work3/bathroom5.jpg (100%) rename {public => src}/images/work3/bathroom6.jpg (100%) rename {public => src}/images/work3/bathroom7.jpg (100%) rename {public => src}/images/work3/bathroom8.jpg (100%) rename {public => src}/images/work3/bathroom9.jpg (100%) rename {public => src}/images/work3/coreSample.jpg (100%) rename {public => src}/images/work3/dance1.jpg (100%) rename {public => src}/images/work3/dance2.jpg (100%) rename {public => src}/images/work3/dishwasher.jpg (100%) rename {public => src}/images/work3/fireplace1.jpg (100%) rename {public => src}/images/work3/fireplace2.jpg (100%) rename {public => src}/images/work3/fireplace3.jpg (100%) rename {public => src}/images/work3/france1.jpg (100%) rename {public => src}/images/work3/france2.jpg (100%) rename {public => src}/images/work3/france3.jpg (100%) rename {public => src}/images/work3/gutter1.jpg (100%) rename {public => src}/images/work3/gutter2.jpg (100%) rename {public => src}/images/work3/kitchen1.jpg (100%) rename {public => src}/images/work3/kitchen2.jpg (100%) rename {public => src}/images/work3/kitchen3.jpg (100%) rename {public => src}/images/work3/kitchen4.jpg (100%) rename {public => src}/images/work4/bath.jpg (100%) rename {public => src}/images/work4/bathroom0.jpg (100%) rename {public => src}/images/work4/bathroom1.jpg (100%) rename {public => src}/images/work4/bathroom2.jpg (100%) rename {public => src}/images/work4/catflapcarnage.jpg (100%) rename {public => src}/images/work4/drawers.jpg (100%) rename {public => src}/images/work4/drawertesting.jpg (100%) rename {public => src}/images/work4/garden.jpg (100%) rename {public => src}/images/work4/kitchen1.jpg (100%) rename {public => src}/images/work4/kitchen2.jpg (100%) rename {public => src}/images/work4/kitchen4.jpg (100%) rename {public => src}/images/work4/kitchen5.jpg (100%) rename {public => src}/images/work4/kitchen6.jpg (100%) rename {public => src}/images/work4/kitchen7.jpg (100%) rename {public => src}/images/work4/kitchenwoo1.jpg (100%) rename {public => src}/images/work4/kitchenwoo2.jpg (100%) rename {public => src}/images/work4/lights.jpg (100%) rename {public => src}/images/work4/magneticbackboard.jpg (100%) rename {public => src}/images/work4/nikkidesk.jpg (100%) rename {public => src}/images/work4/ozzydesk.jpg (100%) rename {public => src}/images/work4/sink.jpg (100%) rename {public => src}/images/work4/tape.jpg (100%) rename {public => src}/images/work4/toilet.jpg (100%) rename {public => src}/images/work4/tool.jpg (100%) rename {public => src}/images/work4/underfloorHeating.jpg (100%) rename {public => src}/images/work4/undersinkmatting.jpg (100%) rename {public => src}/images/work4/van.jpg (100%) rename {public => src}/images/work5/bathroom1.jpg (100%) rename {public => src}/images/work5/bathroom2.jpg (100%) rename {public => src}/images/work5/bedroom.jpg (100%) rename {public => src}/images/work5/floorcolours.jpg (100%) rename {public => src}/images/work5/kitchen.jpg (100%) rename {public => src}/images/work5/loadtesting.jpg (100%) rename {public => src}/images/work5/ozzycooksfood.png (100%) rename {public => src}/images/work5/rewiring.jpg (100%) rename {public => src}/images/work5/socket1.jpg (100%) rename {public => src}/images/work5/socket2.jpg (100%) rename {public => src}/images/work5/socket3.jpg (100%) rename {public => src}/images/work5/socket4.jpg (100%) rename {public => src}/images/work5/speakersandlights.jpg (100%) rename {public => src}/images/work5/worktop1.jpg (100%) rename {public => src}/images/work5/worktop2.jpg (100%) rename {public => src}/images/work5/yum.jpg (100%) rename {public => src}/images/work6/cinema1.jpg (100%) rename {public => src}/images/work6/cinema2.jpg (100%) rename {public => src}/images/work6/flagstone.jpg (100%) rename {public => src}/images/work6/going1.jpg (100%) rename {public => src}/images/work6/going2.jpg (100%) rename {public => src}/images/work6/gone.jpg (100%) rename {public => src}/images/work6/green.jpg (100%) rename {public => src}/images/work6/grout.jpg (100%) rename {public => src}/images/work6/icecream.jpg (100%) rename {public => src}/images/work6/icecube.jpg (100%) rename {public => src}/images/work6/m1.jpg (100%) rename {public => src}/images/work6/m2.jpg (100%) rename {public => src}/images/work6/m3.jpg (100%) rename {public => src}/images/work6/m4.jpg (100%) rename {public => src}/images/work6/m5.jpg (100%) rename {public => src}/images/work6/plumbing1.png (100%) rename {public => src}/images/work6/plumbing2.png (100%) rename {public => src}/images/work6/pressies.jpg (100%) rename {public => src}/images/work6/stool1.jpg (100%) rename {public => src}/images/work6/stool2.jpg (100%) rename {public => src}/images/work6/tree1.jpg (100%) rename {public => src}/images/work6/walk.jpg (100%) rename {public => src}/images/year2022-1/balcony1.jpg (100%) rename {public => src}/images/year2022-1/balcony2.jpg (100%) rename {public => src}/images/year2022-1/bathroom1.jpg (100%) rename {public => src}/images/year2022-1/bathroom2.jpg (100%) rename {public => src}/images/year2022-1/car.jpg (100%) rename {public => src}/images/year2022-1/cine-1.jpg (100%) rename {public => src}/images/year2022-1/cine-2.jpg (100%) rename {public => src}/images/year2022-1/excuse1.jpg (100%) rename {public => src}/images/year2022-1/excuse2.jpg (100%) rename {public => src}/images/year2022-1/excuse3576.jpg (100%) rename {public => src}/images/year2022-1/excuse4.jpg (100%) rename {public => src}/images/year2022-1/excuse48.jpg (100%) rename {public => src}/images/year2022-1/excuse5.jpg (100%) rename {public => src}/images/year2022-1/excuse6.jpg (100%) rename {public => src}/images/year2022-1/legs0.jpg (100%) rename {public => src}/images/year2022-1/legs1.jpg (100%) rename {public => src}/images/year2022-1/legs2.jpg (100%) rename {public => src}/images/year2022-1/rose.jpg (100%) rename {public => src}/images/year2022-1/sofabed-engineering.jpg (100%) rename {public => src}/images/year2022-1/sofabed.jpg (100%) rename {public => src}/images/year2022-1/summer.jpg (100%) rename {public => src}/images/year2022-1/toilet-destroy.jpg (100%) rename {public => src}/images/year2022-1/toilet-eurgh.jpg (100%) rename {public => src}/images/year2022-1/toilet-fittings.jpg (100%) rename {public => src}/images/year2022-1/toilet-painting.jpg (100%) rename {public => src}/images/year2022-1/toilet-painting2.jpg (100%) rename {public => src}/images/year2022-1/toilet-polyfiller.jpg (100%) rename {public => src}/images/year2022-1/toilet-yuck.jpg (100%) rename {public => src}/images/year2022-1/toilet1.jpg (100%) rename {public => src}/images/year2022-1/toilet2.jpg (100%) rename {public => src}/images/year2022-1/toilet3.jpg (100%) rename {public => src}/images/year2022-1/toilet4.jpg (100%) rename {public => src}/images/year2022-1/toilet5.jpg (100%) rename {public => src}/images/year2022-1/toilet6.jpg (100%) rename {public => src}/images/year2022-1/window1.jpg (100%) rename {public => src}/images/year2022-1/window2.jpg (100%) rename {public => src}/images/year2022-end/bathroom-santa.jpg (100%) rename {public => src}/images/year2022-end/bathroom-templating.jpg (100%) rename {public => src}/images/year2022-end/bathroom-vanity.jpg (100%) rename {public => src}/images/year2022-end/bathroom1.jpg (100%) rename {public => src}/images/year2022-end/bathroom2.jpg (100%) rename {public => src}/images/year2022-end/christmas.jpg (100%) rename {public => src}/images/year2022-end/garden-bistro.jpg (100%) rename {public => src}/images/year2022-end/garden-skip.jpg (100%) rename {public => src}/images/year2022-end/hallway-boxing.jpg (100%) rename {public => src}/images/year2022-end/hallway-carpet1.jpg (100%) rename {public => src}/images/year2022-end/hallway-carpet2.jpg (100%) rename {public => src}/images/year2022-end/hallway-coatrackboxing.jpg (100%) rename {public => src}/images/year2022-end/hallway-finished.jpg (100%) rename {public => src}/images/year2022-end/hallway-nicetip.jpg (100%) rename {public => src}/images/year2022-end/hallway-oopscable.jpg (100%) rename {public => src}/images/year2022-end/hallway-shoerack.jpg (100%) rename {public => src}/images/year2022-end/hardwaxoil1.jpg (100%) rename {public => src}/images/year2022-end/hardwaxoil2.jpg (100%) rename {public => src}/images/year2022-end/radiator-dead-valves.jpg (100%) rename {public => src}/images/year2022-end/radiator-drainagesystem.jpg (100%) rename {public => src}/images/year2022-end/radiator-streeeeetch.jpg (100%) rename {public => src}/images/year2022-end/radiator-wrench.jpg (100%) rename {public => src}/images/year2022-end/winterwonderland.jpg (100%) rename {public => src}/images/year2022-w1/dining-stone.jpg (100%) rename {public => src}/images/year2022-w1/floorboards-up.jpg (100%) rename {public => src}/images/year2022-w1/gutterPreviousAttempt.jpg (100%) rename {public => src}/images/year2022-w1/gutterSolution.png (100%) rename {public => src}/images/year2022-w1/guttersweep.jpg (100%) rename {public => src}/images/year2022-w1/guttersweeping.jpg (100%) rename {public => src}/images/year2022-w1/hallway-floorboard.jpg (100%) rename {public => src}/images/year2022-w1/hallway-graffiti.jpg (100%) rename {public => src}/images/year2022-w1/hallway-yellow.jpg (100%) rename {public => src}/images/year2022-w1/happy-wifi.jpg (100%) rename {public => src}/images/year2022-w1/holesaw.gif (100%) rename {public => src}/images/year2022-w1/laserlevelling.gif (100%) rename {public => src}/images/year2022-w1/utility-channelling.jpg (100%) rename {public => src}/images/year2022-w1/utility-cutout.jpg (100%) rename {public => src}/images/year2022-w1/utility-fitting.jpg (100%) rename {public => src}/images/year2022-w1/utility-original.jpg (100%) rename {public => src}/images/year2022-w1/utility-painty.jpg (100%) rename {public => src}/images/year2022-w1/utility-pipes.jpg (100%) rename {public => src}/images/year2022-w1/utility-progress.jpg (100%) rename {public => src}/images/year2022-w1/utility-storage.jpg (100%) rename {public => src}/images/year2022-w1/utility-tap-access.jpg (100%) rename {public => src}/images/year2022-w1/utility-wastecut.jpg (100%) rename {public => src}/images/year2022-w2/bathroom_ceilidhstuds.jpg (100%) rename {public => src}/images/year2022-w2/bathroom_moodboard.jpg (100%) rename {public => src}/images/year2022-w2/bathroom_plan1.jpg (100%) rename {public => src}/images/year2022-w2/bathroom_plan2.jpg (100%) rename {public => src}/images/year2022-w2/bathroom_studs.jpg (100%) rename {public => src}/images/year2022-w2/bzzt.jpg (100%) rename {public => src}/images/year2022-w2/bzzt2.jpg (100%) rename {public => src}/images/year2022-w2/dining_electrics.jpg (100%) rename {public => src}/images/year2022-w2/dining_pipes.jpg (100%) rename {public => src}/images/year2022-w2/dining_plasterboardshapes.jpg (100%) rename {public => src}/images/year2022-w2/dining_plastered.jpg (100%) rename {public => src}/images/year2022-w2/dining_plastered2.jpg (100%) rename {public => src}/images/year2022-w2/dining_plasteredhalf.jpg (100%) rename {public => src}/images/year2022-w2/dining_studs.jpg (100%) rename {public => src}/images/year2022-w2/guest_bathroom_before.jpg (100%) rename {public => src}/images/year2022-w2/hall_nightclub.jpg (100%) rename {public => src}/images/year2022-w2/hallway_testers.jpg (100%) rename {public => src}/images/year2022-w2/hallway_white.jpg (100%) rename {public => src}/images/year2022-w2/strobe.gif (100%) rename {public => src}/images/year2022-w2/utility_kickboard.jpg (100%) rename {public => src}/images/year2022-w2/worktop_jigsaw.jpg (100%) rename {public => src}/images/year2022-w2/worktop_templating.jpg (100%) rename {public => src}/images/year2022-w2/worktop_tracksaw.jpg (100%) rename {public => src}/images/year2022-w3/bath_columns.jpg (100%) rename {public => src}/images/year2022-w3/bathroom_cutting.jpg (100%) rename {public => src}/images/year2022-w3/bathroom_floortiles.jpg (100%) rename {public => src}/images/year2022-w3/bathroom_herringbone.jpg (100%) rename {public => src}/images/year2022-w3/bathroom_mermaid.jpg (100%) rename {public => src}/images/year2022-w3/bathroom_tiles.jpg (100%) rename {public => src}/images/year2022-w3/bathroom_tilewidth.jpg (100%) rename {public => src}/images/year2022-w3/bathroom_underfloorheating.jpg (100%) rename {public => src}/images/year2022-w3/colo_columns.jpg (100%) rename {public => src}/images/year2022-w3/dining_chair.jpg (100%) rename {public => src}/images/year2022-w3/dining_decorated.jpg (100%) rename {public => src}/images/year2022-w3/dining_lampshade.jpg (100%) rename {public => src}/images/year2022-w3/dining_painting.jpg (100%) rename {public => src}/images/year2022-w3/hall_floorboards.jpg (100%) rename {public => src}/images/year2022-w3/hall_lights.jpg (100%) rename {public => src}/images/year2022-w3/italy_big.jpg (100%) rename {public => src}/images/year2022-w3/italy_colosseum.jpg (100%) rename {public => src}/images/year2022-w3/italy_colosseum2.jpg (100%) rename {public => src}/images/year2022-w3/italy_colosseum3.jpg (100%) rename {public => src}/images/year2022-w3/italy_pompeii.jpg (100%) rename {public => src}/images/year2022-w3/italy_pompeii2.jpg (100%) rename {public => src}/images/year2022-w3/italy_pompeii3.jpg (100%) rename {public => src}/images/year2022-w3/safety.jpg (100%) rename {public => src}/images/year2022-w3/skyline_walk.jpg (100%) rename {public => src}/images/year2022-w3/skyline_walk2.jpg (100%) rename {public => src}/images/year2022-w3/utility_worktop.jpg (100%) rename {public => src}/images/year2023-1/carpet-2.jpg (100%) rename {public => src}/images/year2023-1/carpet-during-2.jpg (100%) rename {public => src}/images/year2023-1/gardengate.jpg (100%) rename {public => src}/images/year2023-1/gardengate2.jpg (100%) rename {public => src}/images/year2023-1/hall-done-1.jpg (100%) rename {public => src}/images/year2023-1/hall-done-2.jpg (100%) rename {public => src}/images/year2023-1/hall-done-3.jpg (100%) rename {public => src}/images/year2023-1/hall-during-23.jpg (100%) rename {public => src}/images/year2023-1/hall-during2.jpg (100%) rename {public => src}/images/year2023-1/hall-lights-after.jpg (100%) rename {public => src}/images/year2023-1/hall-lights-before.jpg (100%) rename {public => src}/images/year2023-1/hall-safety1.jpg (100%) rename {public => src}/images/year2023-1/hall-safety2.jpg (100%) rename {public => src}/images/year2023-1/hall-safety3.jpg (100%) rename {public => src}/images/year2023-1/hall-stripped1.jpg (100%) rename {public => src}/images/year2023-1/hallback-before.jpg (100%) rename {public => src}/images/year2023-1/hallback-during.jpg (100%) rename {public => src}/images/year2023-1/hallfront-before.jpg (100%) rename {public => src}/images/year2023-1/hallfront-during.jpg (100%) rename {public => src}/images/year2023-1/harrow-hallway.jpg (100%) rename {public => src}/images/year2023-1/herbedacious.jpg (100%) rename {public => src}/images/year2023-1/kayak-down.jpg (100%) rename {public => src}/images/year2023-1/kayak-pub.jpg (100%) rename {public => src}/images/year2023-1/kayak-up.jpg (100%) rename {public => src}/images/year2023-1/plants-transport1.jpg (100%) rename {public => src}/images/year2023-1/plants-transport2.jpg (100%) rename {public => src}/images/year2023-1/proto-lights-2.jpg (100%) rename {public => src}/images/year2023-1/proto-lights.jpg (100%) rename {public => src}/images/year2023-1/race.jpg (100%) rename {public => src}/images/year2023-1/shoerack.jpg (100%) rename {public => src}/images/year2023-1/stair-crack-fix.jpg (100%) rename {public => src}/images/year2023-1/stair-crack-hole.jpg (100%) rename {public => src}/images/year2023-1/stair-crack.jpg (100%) rename {public => src}/images/year2023-1/toilet.jpg (100%) rename {public => src}/images/year2023-1/tusks.jpg (100%) rename {public => src}/images/year2023-1/water-wizards.jpg (100%) rename {public => src}/images/year2023-1/zapped-thermostat-tape.jpg (100%) rename {public => src}/images/year2023-1/zapped-thermostat.jpg (100%) create mode 100644 src/utils.ts diff --git a/.astro/types.d.ts b/.astro/types.d.ts index ac92831..5d8457e 100644 --- a/.astro/types.d.ts +++ b/.astro/types.d.ts @@ -1,211 +1,339 @@ +declare module 'astro:content' { + interface Render { + '.mdx': Promise<{ + Content: import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + }>; + } +} + +declare module 'astro:content' { + interface Render { + '.md': Promise<{ + Content: import('astro').MarkdownInstance<{}>['Content']; + headings: import('astro').MarkdownHeading[]; + remarkPluginFrontmatter: Record; + }>; + } +} + declare module 'astro:content' { export { z } from 'astro/zod'; - export type CollectionEntry = - (typeof entryMap)[C][keyof (typeof entryMap)[C]] & Render; + + type Flatten = T extends { [K: string]: infer U } ? U : never; + + export type CollectionKey = keyof AnyEntryMap; + export type CollectionEntry = Flatten; + + export type ContentCollectionKey = keyof ContentEntryMap; + export type DataCollectionKey = keyof DataEntryMap; + + // This needs to be in sync with ImageMetadata + export type ImageFunction = () => import('astro/zod').ZodObject<{ + src: import('astro/zod').ZodString; + width: import('astro/zod').ZodNumber; + height: import('astro/zod').ZodNumber; + format: import('astro/zod').ZodUnion< + [ + import('astro/zod').ZodLiteral<'png'>, + import('astro/zod').ZodLiteral<'jpg'>, + import('astro/zod').ZodLiteral<'jpeg'>, + import('astro/zod').ZodLiteral<'tiff'>, + import('astro/zod').ZodLiteral<'webp'>, + import('astro/zod').ZodLiteral<'gif'>, + import('astro/zod').ZodLiteral<'svg'>, + import('astro/zod').ZodLiteral<'avif'>, + ] + >; + }>; type BaseSchemaWithoutEffects = | import('astro/zod').AnyZodObject - | import('astro/zod').ZodUnion + | import('astro/zod').ZodUnion<[BaseSchemaWithoutEffects, ...BaseSchemaWithoutEffects[]]> | import('astro/zod').ZodDiscriminatedUnion - | import('astro/zod').ZodIntersection< - import('astro/zod').AnyZodObject, - import('astro/zod').AnyZodObject - >; + | import('astro/zod').ZodIntersection; type BaseSchema = | BaseSchemaWithoutEffects | import('astro/zod').ZodEffects; - type BaseCollectionConfig = { - schema?: S; - slug?: (entry: { - id: CollectionEntry['id']; - defaultSlug: string; - collection: string; - body: string; - data: import('astro/zod').infer; - }) => string | Promise; - }; - export function defineCollection( - input: BaseCollectionConfig - ): BaseCollectionConfig; + export type SchemaContext = { image: ImageFunction }; + + type DataCollectionConfig = { + type: 'data'; + schema?: S | ((context: SchemaContext) => S); + }; + + type ContentCollectionConfig = { + type?: 'content'; + schema?: S | ((context: SchemaContext) => S); + }; + + type CollectionConfig = ContentCollectionConfig | DataCollectionConfig; + + export function defineCollection( + input: CollectionConfig + ): CollectionConfig; - type EntryMapKeys = keyof typeof entryMap; type AllValuesOf = T extends any ? T[keyof T] : never; - type ValidEntrySlug = AllValuesOf<(typeof entryMap)[C]>['slug']; + type ValidContentEntrySlug = AllValuesOf< + ContentEntryMap[C] + >['slug']; export function getEntryBySlug< - C extends keyof typeof entryMap, - E extends ValidEntrySlug | (string & {}) + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), >( collection: C, // Note that this has to accept a regular string too, for SSR entrySlug: E - ): E extends ValidEntrySlug + ): E extends ValidContentEntrySlug ? Promise> : Promise | undefined>; - export function getCollection>( + + export function getDataEntryById( + collection: C, + entryId: E + ): Promise>; + + export function getCollection>( collection: C, filter?: (entry: CollectionEntry) => entry is E ): Promise; + export function getCollection( + collection: C, + filter?: (entry: CollectionEntry) => unknown + ): Promise[]>; - type InferEntrySchema = import('astro/zod').infer< - Required['schema'] + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >(entry: { + collection: C; + slug: E; + }): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >(entry: { + collection: C; + id: E; + }): E extends keyof DataEntryMap[C] + ? Promise + : Promise | undefined>; + export function getEntry< + C extends keyof ContentEntryMap, + E extends ValidContentEntrySlug | (string & {}), + >( + collection: C, + slug: E + ): E extends ValidContentEntrySlug + ? Promise> + : Promise | undefined>; + export function getEntry< + C extends keyof DataEntryMap, + E extends keyof DataEntryMap[C] | (string & {}), + >( + collection: C, + id: E + ): E extends keyof DataEntryMap[C] + ? Promise + : Promise | undefined>; + + /** Resolve an array of entry references from the same collection */ + export function getEntries( + entries: { + collection: C; + slug: ValidContentEntrySlug; + }[] + ): Promise[]>; + export function getEntries( + entries: { + collection: C; + id: keyof DataEntryMap[C]; + }[] + ): Promise[]>; + + export function reference( + collection: C + ): import('astro/zod').ZodEffects< + import('astro/zod').ZodString, + C extends keyof ContentEntryMap + ? { + collection: C; + slug: ValidContentEntrySlug; + } + : { + collection: C; + id: keyof DataEntryMap[C]; + } + >; + // Allow generic `string` to avoid excessive type errors in the config + // if `dev` is not running to update as you edit. + // Invalid collection names will be caught at build time. + export function reference( + collection: C + ): import('astro/zod').ZodEffects; + + type ReturnTypeOrOriginal = T extends (...args: any[]) => infer R ? R : T; + type InferEntrySchema = import('astro/zod').infer< + ReturnTypeOrOriginal['schema']> >; - type Render = { - render(): Promise<{ - Content: import('astro').MarkdownInstance<{}>['Content']; - headings: import('astro').MarkdownHeading[]; - remarkPluginFrontmatter: Record; - }>; - }; - - const entryMap: { + type ContentEntryMap = { "blog": { "summer.mdx": { - id: "summer.mdx", - slug: "summer", - body: string, - collection: "blog", + id: "summer.mdx"; + slug: "summer"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "week1.mdx": { - id: "week1.mdx", - slug: "week1", - body: string, - collection: "blog", + id: "week1.mdx"; + slug: "week1"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "week2.mdx": { - id: "week2.mdx", - slug: "week2", - body: string, - collection: "blog", + id: "week2.mdx"; + slug: "week2"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "week3.mdx": { - id: "week3.mdx", - slug: "week3", - body: string, - collection: "blog", + id: "week3.mdx"; + slug: "week3"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "week4.mdx": { - id: "week4.mdx", - slug: "week4", - body: string, - collection: "blog", + id: "week4.mdx"; + slug: "week4"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "week5-6.mdx": { - id: "week5-6.mdx", - slug: "week5-6", - body: string, - collection: "blog", + id: "week5-6.mdx"; + slug: "week5-6"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "week7-8.mdx": { - id: "week7-8.mdx", - slug: "week7-8", - body: string, - collection: "blog", + id: "week7-8.mdx"; + slug: "week7-8"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "week9-10.mdx": { - id: "week9-10.mdx", - slug: "week9-10", - body: string, - collection: "blog", + id: "week9-10.mdx"; + slug: "week9-10"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "work1.mdx": { - id: "work1.mdx", - slug: "work1", - body: string, - collection: "blog", + id: "work1.mdx"; + slug: "work1"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "work2.mdx": { - id: "work2.mdx", - slug: "work2", - body: string, - collection: "blog", + id: "work2.mdx"; + slug: "work2"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "work3.mdx": { - id: "work3.mdx", - slug: "work3", - body: string, - collection: "blog", + id: "work3.mdx"; + slug: "work3"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "work4.mdx": { - id: "work4.mdx", - slug: "work4", - body: string, - collection: "blog", + id: "work4.mdx"; + slug: "work4"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "work5.mdx": { - id: "work5.mdx", - slug: "work5", - body: string, - collection: "blog", + id: "work5.mdx"; + slug: "work5"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "work6.mdx": { - id: "work6.mdx", - slug: "work6", - body: string, - collection: "blog", + id: "work6.mdx"; + slug: "work6"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "year2022-1.mdx": { - id: "year2022-1.mdx", - slug: "year2022-1", - body: string, - collection: "blog", + id: "year2022-1.mdx"; + slug: "year2022-1"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "year2022-end.mdx": { - id: "year2022-end.mdx", - slug: "year2022-end", - body: string, - collection: "blog", + id: "year2022-end.mdx"; + slug: "year2022-end"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "year2022-w1.mdx": { - id: "year2022-w1.mdx", - slug: "year2022-w1", - body: string, - collection: "blog", + id: "year2022-w1.mdx"; + slug: "year2022-w1"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "year2022-w2.mdx": { - id: "year2022-w2.mdx", - slug: "year2022-w2", - body: string, - collection: "blog", + id: "year2022-w2.mdx"; + slug: "year2022-w2"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "year2022-w3.mdx": { - id: "year2022-w3.mdx", - slug: "year2022-w3", - body: string, - collection: "blog", + id: "year2022-w3.mdx"; + slug: "year2022-w3"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, +} & { render(): Render[".mdx"] }; "year2023-1.mdx": { - id: "year2023-1.mdx", - slug: "year2023-1", - body: string, - collection: "blog", + id: "year2023-1.mdx"; + slug: "year2023-1"; + body: string; + collection: "blog"; data: InferEntrySchema<"blog"> -}, -}, +} & { render(): Render[".mdx"] }; +}; }; + type DataEntryMap = { + + }; + + type AnyEntryMap = ContentEntryMap & DataEntryMap; + type ContentConfig = typeof import("../src/content/config"); } diff --git a/astro.config.mjs b/astro.config.mjs index 14d34f4..eac0373 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,5 +1,4 @@ import { defineConfig } from "astro/config"; - // https://astro.build/config import mdx from "@astrojs/mdx"; diff --git a/package.json b/package.json index fa1a7b5..7773546 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,11 @@ "astro": "astro" }, "dependencies": { - "@astrojs/mdx": "^0.15.0", + "@astrojs/mdx": "^2.0.2", + "@astrojs/react": "^3.0.8", "@astrojs/rss": "^2.1.0", - "astro": "^2.0.0", + "@rollup/plugin-dynamic-import-vars": "^2.1.2", + "astro": "^4.0.7", "astrojs-service-worker": "^0.0.9" }, "devDependencies": { diff --git a/src/components/Card.astro b/src/components/Card.astro index 0aea694..b0d851e 100644 --- a/src/components/Card.astro +++ b/src/components/Card.astro @@ -1,18 +1,31 @@ --- export interface Props { - title: string; - src: string; + imageData: ImageData, + optimize?: boolean } -const { title, src } = Astro.props; +import { Picture } from 'astro:assets' +import type { ImageData } from './types'; +import { importImage } from './images'; + +const { imageData } = Astro.props; + +const image = importImage(imageData); ---
- {title} + {imageData.title}
- {title} + {typeof image === 'string' && {imageData.title}} + {typeof image !== 'string' && + + + }
@@ -20,4 +33,8 @@ const { title, src } = Astro.props; .card { margin-bottom: 20px; } + .pic { + height: 100%; + width: 100%; + } diff --git a/src/components/Cards.astro b/src/components/Cards.astro index 42050ff..c193a39 100644 --- a/src/components/Cards.astro +++ b/src/components/Cards.astro @@ -1,8 +1,9 @@ --- import Card from "./Card.astro"; +import type { ImageData } from "./types"; export interface Props { - images: { title: string; src: string }[]; + images: ImageData[]; } const { images } = Astro.props; @@ -10,6 +11,8 @@ const { images } = Astro.props;
- {images.map((i) => )} + {images.map((i) => + + )}
diff --git a/src/components/FrontPageLink.astro b/src/components/FrontPageLink.astro index bc919d0..2b04f4d 100644 --- a/src/components/FrontPageLink.astro +++ b/src/components/FrontPageLink.astro @@ -1,20 +1,26 @@ --- export interface Props { - title: string; description: string; - imageSrc: string; + imageData: ImageData; href: string; } +import { Picture } from "astro:assets"; +import type { ImageData } from './types'; +import { importImage } from "./images"; +const { href, imageData, description } = Astro.props; -const { href, title, imageSrc, description } = Astro.props; +const optImage = importImage(imageData); ---
- +
-
{title}
+
{imageData.title}

in which {description}

@@ -58,5 +64,10 @@ const { href, title, imageSrc, description } = Astro.props; .card-text { font-size: medium; } + + .pic { + height: 100%; + width: 100%; + } } diff --git a/src/components/Hero.astro b/src/components/Hero.astro index 04b674a..1ef21e0 100644 --- a/src/components/Hero.astro +++ b/src/components/Hero.astro @@ -1,23 +1,28 @@ --- export interface Props { - title: string; date?: Date; - image: string; + imageData: ImageData; bold?: boolean; } -const { title, date, image, bold = false } = Astro.props; +import { Picture } from 'astro:assets' +import type { ImageData } from './types'; +import { importImage } from './images'; + +const { date, imageData, bold = false } = Astro.props; + +const optImage = importImage(imageData); + const actualDate = date ? new Date(date) : undefined; const dateString = actualDate?.toISOString()?.slice(0, 10); ---
-

{title}

+

{imageData.title}

{date &&
{dateString}
}
- - +