From eca47efb1d71c96699c091fb6e6f0d5388994fc0 Mon Sep 17 00:00:00 2001 From: jackdomleo7 Date: Sat, 2 Nov 2024 01:04:44 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20jackdoml?= =?UTF-8?q?eo7/jackdomleo.dev@d916bdb3ce34cd417ad3d086fb439bb97e2c1054=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 200.html | 2 +- 404.html | 2 +- _nuxt/builds/latest.json | 2 +- _nuxt/builds/meta/8e55545d-3efb-4690-8630-dae96222bfde.json | 1 - _nuxt/builds/meta/de6dc0fd-e93a-4eff-9c52-5d8bf25e5684.json | 1 + _payload.json | 2 +- blog/2020/hover-css-media-query/_payload.json | 2 +- blog/2020/hover-css-media-query/index.html | 6 +++--- blog/2020/learning-neumorphic-design/_payload.json | 2 +- blog/2020/learning-neumorphic-design/index.html | 6 +++--- blog/2023/should-you-clean-out-your-blog/_payload.json | 2 +- blog/2023/should-you-clean-out-your-blog/index.html | 6 +++--- blog/2023/when-is-a-clickable-div-okay/_payload.json | 2 +- blog/2023/when-is-a-clickable-div-okay/index.html | 6 +++--- blog/2024/how-to-protect-state-in-pinia/_payload.json | 2 +- blog/2024/how-to-protect-state-in-pinia/index.html | 6 +++--- blog/_payload.json | 2 +- blog/index.html | 6 +++--- index.html | 6 +++--- links/_payload.json | 2 +- links/index.html | 6 +++--- privacy-policy/_payload.json | 2 +- privacy-policy/index.html | 6 +++--- projects/_payload.json | 2 +- projects/index.html | 6 +++--- sitemap.xml | 2 +- 26 files changed, 45 insertions(+), 45 deletions(-) delete mode 100644 _nuxt/builds/meta/8e55545d-3efb-4690-8630-dae96222bfde.json create mode 100644 _nuxt/builds/meta/de6dc0fd-e93a-4eff-9c52-5d8bf25e5684.json diff --git a/200.html b/200.html index 08a86c454..1ee620dd4 100644 --- a/200.html +++ b/200.html @@ -50,4 +50,4 @@
- \ No newline at end of file + \ No newline at end of file diff --git a/404.html b/404.html index 08a86c454..1ee620dd4 100644 --- a/404.html +++ b/404.html @@ -50,4 +50,4 @@
- \ No newline at end of file + \ No newline at end of file diff --git a/_nuxt/builds/latest.json b/_nuxt/builds/latest.json index c6865d389..1d27eb544 100644 --- a/_nuxt/builds/latest.json +++ b/_nuxt/builds/latest.json @@ -1 +1 @@ -{"id":"8e55545d-3efb-4690-8630-dae96222bfde","timestamp":1730423458956} \ No newline at end of file +{"id":"de6dc0fd-e93a-4eff-9c52-5d8bf25e5684","timestamp":1730509461703} \ No newline at end of file diff --git a/_nuxt/builds/meta/8e55545d-3efb-4690-8630-dae96222bfde.json b/_nuxt/builds/meta/8e55545d-3efb-4690-8630-dae96222bfde.json deleted file mode 100644 index dcbfe1609..000000000 --- a/_nuxt/builds/meta/8e55545d-3efb-4690-8630-dae96222bfde.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"8e55545d-3efb-4690-8630-dae96222bfde","timestamp":1730423458956,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/privacy-policy","/","/blog/2024/how-to-protect-state-in-pinia","/blog/2020/hover-css-media-query","/blog/2023/when-is-a-clickable-div-okay","/links","/blog/2020/learning-neumorphic-design","/blog/2023/should-you-clean-out-your-blog","/projects","/blog"]} \ No newline at end of file diff --git a/_nuxt/builds/meta/de6dc0fd-e93a-4eff-9c52-5d8bf25e5684.json b/_nuxt/builds/meta/de6dc0fd-e93a-4eff-9c52-5d8bf25e5684.json new file mode 100644 index 000000000..adb9ae5b5 --- /dev/null +++ b/_nuxt/builds/meta/de6dc0fd-e93a-4eff-9c52-5d8bf25e5684.json @@ -0,0 +1 @@ +{"id":"de6dc0fd-e93a-4eff-9c52-5d8bf25e5684","timestamp":1730509461703,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/privacy-policy","/","/blog/2023/when-is-a-clickable-div-okay","/blog/2020/hover-css-media-query","/blog/2024/how-to-protect-state-in-pinia","/blog/2023/should-you-clean-out-your-blog","/blog/2020/learning-neumorphic-design","/links","/projects","/blog"]} \ No newline at end of file diff --git a/_payload.json b/_payload.json index 174845688..f799dabcf 100644 --- a/_payload.json +++ b/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":1029},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"$pqtWcjQkdb":117,"project-list-undefined":261},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":259},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"2QHyZ7VxF5oLnaQdSZOGQF","2022-11-29T19:03:07.826Z","2024-10-27T19:04:32.339Z",{"sys":131},{"id":17,"type":9,"linkType":18},123,21,{"sys":135},{"type":9,"linkType":56,"id":136},"home",{"name":63,"metaDescription":138,"title":115,"heroBody":139,"heroImage":149,"aboutTitle":172,"aboutBody":173,"aboutImage":149,"skillsTitle":210,"skillsList":211},"A Nottinghamshire-based frontend & UX developer, primarily working with Vue.js, Nuxt.js, TypeScript, SCSS & many more technologies.",{"data":140,"content":141,"nodeType":116},{},[142],{"data":143,"content":144,"nodeType":101},{},[145],{"data":146,"marks":147,"value":148,"nodeType":100},{},[],"Senior Frontend Developer",{"metadata":150,"sys":153,"fields":161},{"tags":151,"concepts":152},[],[],{"space":154,"id":156,"type":13,"createdAt":157,"updatedAt":157,"environment":158,"publishedVersion":160,"revision":20,"locale":21},{"sys":155},{"type":9,"linkType":10,"id":11},"1mPOrNhlrFYTBTczYmv3ZW","2023-01-21T21:22:09.036Z",{"sys":159},{"id":17,"type":9,"linkType":18},6,{"title":162,"description":163,"file":164},"Me (portrait)","Jack Domleo portrait",{"url":165,"details":166,"fileName":170,"contentType":171},"//images.ctfassets.net/l1wujzr3g1ab/1mPOrNhlrFYTBTczYmv3ZW/6bc83cfc55892490e750e5d9f47d40d9/me.jpg",{"size":167,"image":168},23399,{"width":169,"height":169},460,"me.jpg","image/jpeg","About me",{"nodeType":116,"data":174,"content":175},{},[176,196,203],{"nodeType":101,"data":177,"content":178},{},[179,183,192],{"nodeType":100,"value":180,"marks":181,"data":182},"Hi, I'm Jack Domleo, a Nottinghamshire-based developer in the UK, currently working as a Senior Frontend Developer at ",[],{},{"nodeType":184,"data":185,"content":187},"hyperlink",{"uri":186},"https://www.oceanfinance.co.uk/",[188],{"nodeType":100,"value":189,"marks":190,"data":191},"Ocean Finance",[],{},{"nodeType":100,"value":193,"marks":194,"data":195},".",[],{},{"nodeType":101,"data":197,"content":198},{},[199],{"nodeType":100,"value":200,"marks":201,"data":202},"I have 6 years of professional experience working as a developer. I often work with Vue.js, TypeScript, Vite, Vitest, SCSS, Storybook, and PlayWright.",[],{},{"nodeType":101,"data":204,"content":205},{},[206],{"nodeType":100,"value":207,"marks":208,"data":209},"I have a passion for frontend technologies, and writing clean websites and applications while maintaining high accessibility standards.",[],{},"Skills",[212,216,220,224,228,232,236,240,244,247,251,255],{"id":213,"key":214,"value":215},"d896fe97-be3e-4c5f-978b-0327614319f4","vue","Vue.js",{"id":217,"key":218,"value":219},"42846b2b-1fb3-4e40-995a-45f6e74f8bb3","nuxt","Nuxt.js",{"id":221,"key":222,"value":223},"dc3fdfb3-a196-4a15-a775-e8d8d35fc83b","typescript","TypeScript",{"id":225,"key":226,"value":227},"b5ac1642-12dd-4073-88f6-6314ac9c7919","jest","Jest",{"id":229,"key":230,"value":231},"853277e0-df13-4e88-88f8-a857bcac9d3a","storybook","Storybook",{"id":233,"key":234,"value":235},"d36cf843-6326-4b93-9f32-ee489277ecd6","sass","Sass/SCSS",{"id":237,"key":238,"value":239},"3cf64446-8147-475a-b64e-54df9b5ce682","a11y","Accessibility",{"id":241,"key":242,"value":243},"a98d8951-611b-4321-8c43-ee325ba5e932","node_js","Node.js",{"id":245,"key":246,"value":246},"7329b3e5-11e0-493f-ac9a-1dcc1d496a3e","npm",{"id":248,"key":249,"value":250},"bdea57ff-9074-4455-b456-57eaecf2f71e","vs_code","VS Code",{"id":252,"key":253,"value":254},"b4e8d466-6275-45a0-9916-5175565ff32b","javascript","JavaScript",{"id":256,"key":257,"value":258},"3e620c9f-53e6-4e83-bd1a-3a01fe90eb52","html","HTML",{"Asset":260},[149],{"sys":262,"total":263,"skip":37,"limit":264,"items":265,"includes":1027},{"type":36},15,1000,[266,324,376,424,475,529,577,629,679,728,779,829,878,926,975],{"metadata":267,"sys":270,"fields":281},{"tags":268,"concepts":269},[],[],{"space":271,"id":273,"type":47,"createdAt":274,"updatedAt":274,"environment":275,"publishedVersion":277,"revision":20,"contentType":278,"locale":21},{"sys":272},{"type":9,"linkType":10,"id":11},"4Kiex9dMPsL87rteSvnG2h","2023-01-28T19:13:41.069Z",{"sys":276},{"id":17,"type":9,"linkType":18},10,{"sys":279},{"type":9,"linkType":56,"id":280},"project",{"name":282,"type":283,"url":284,"description":285,"tech":295,"tags":299,"image":301},"Grassverse NFT","Client","https://www.grassverse.org/",{"data":286,"content":287,"nodeType":116},{},[288],{"data":289,"content":290,"nodeType":101},{},[291],{"data":292,"marks":293,"value":294,"nodeType":100},{},[],"This website came with pre-existing designs and includes a CMS and an account section for Grassverse asset owners to log in to view their assets and fellow owners of assets.",[296,297,223,298],"Nuxt 2","Web3","SCSS",[300],"NFT",{"metadata":302,"sys":305,"fields":313},{"tags":303,"concepts":304},[],[],{"space":306,"id":308,"type":13,"createdAt":309,"updatedAt":309,"environment":310,"publishedVersion":312,"revision":20,"locale":21},{"sys":307},{"type":9,"linkType":10,"id":11},"01rxXuPpEQ6phTc1Bvt9W9","2023-01-28T19:13:34.307Z",{"sys":311},{"id":17,"type":9,"linkType":18},3,{"title":314,"description":315,"file":316},"grassverse-project-img","",{"url":317,"details":318,"fileName":323,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/01rxXuPpEQ6phTc1Bvt9W9/5d347eb3e2a3731922c0aa7046273780/grassverse-project-img.png",{"size":319,"image":320},163210,{"width":321,"height":322},600,315,"grassverse-project-img.png",{"metadata":325,"sys":328,"fields":337},{"tags":326,"concepts":327},[],[],{"space":329,"id":331,"type":47,"createdAt":332,"updatedAt":332,"environment":333,"publishedVersion":19,"revision":20,"contentType":335,"locale":21},{"sys":330},{"type":9,"linkType":10,"id":11},"2JxOvMguZVHxM565SKDspu","2023-01-28T18:25:42.700Z",{"sys":334},{"id":17,"type":9,"linkType":18},{"sys":336},{"type":9,"linkType":56,"id":280},{"name":338,"type":339,"url":340,"description":341,"tech":351,"tags":353,"image":355},"npx jackdomleo7","Mini","https://github.com/jackdomleo7/npx_business_card",{"data":342,"content":343,"nodeType":116},{},[344],{"data":345,"content":346,"nodeType":101},{},[347],{"data":348,"marks":349,"value":350,"nodeType":100},{},[],"A simple npm script to show some details about me right in the console.",[254,352],"npx",[354],"npm package",{"metadata":356,"sys":359,"fields":367},{"tags":357,"concepts":358},[],[],{"space":360,"id":362,"type":13,"createdAt":363,"updatedAt":363,"environment":364,"publishedVersion":366,"revision":20,"locale":21},{"sys":361},{"type":9,"linkType":10,"id":11},"2ilJcH34gnOn1SEfkJqlJj","2023-01-28T18:25:36.903Z",{"sys":365},{"id":17,"type":9,"linkType":18},5,{"title":368,"description":338,"file":369},"npx-jackdomleo7-project-img",{"url":370,"details":371,"fileName":374,"contentType":375},"//images.ctfassets.net/l1wujzr3g1ab/2ilJcH34gnOn1SEfkJqlJj/69c7b64c07e828439e60e1287e47828c/npx-jackdomleo7-project-img.gif",{"size":372,"image":373},30415,{"width":321,"height":322},"npx-jackdomleo7-project-img.gif","image/gif",{"metadata":377,"sys":380,"fields":389},{"tags":378,"concepts":379},[],[],{"space":381,"id":383,"type":47,"createdAt":384,"updatedAt":384,"environment":385,"publishedVersion":277,"revision":20,"contentType":387,"locale":21},{"sys":382},{"type":9,"linkType":10,"id":11},"1y1gYckxXHOqS4a811GoMM","2023-01-28T18:10:23.588Z",{"sys":386},{"id":17,"type":9,"linkType":18},{"sys":388},{"type":9,"linkType":56,"id":280},{"name":390,"type":283,"url":391,"description":392,"tech":402,"tags":403,"image":404},"Mad Parrot Crew NFT","https://www.madparrotcrew.com/",{"data":393,"content":394,"nodeType":116},{},[395],{"data":396,"content":397,"nodeType":101},{},[398],{"data":399,"marks":400,"value":401,"nodeType":100},{},[],"Created a fully responsive minting website based on existing designs for the Mad Parrot Crew NFT.",[296,223,298],[300],{"metadata":405,"sys":408,"fields":415},{"tags":406,"concepts":407},[],[],{"space":409,"id":411,"type":13,"createdAt":412,"updatedAt":412,"environment":413,"publishedVersion":160,"revision":20,"locale":21},{"sys":410},{"type":9,"linkType":10,"id":11},"4yYU2VsDfEvMnOIFnWe8s6","2023-01-28T18:10:15.589Z",{"sys":414},{"id":17,"type":9,"linkType":18},{"title":416,"description":417,"file":418},"mad-parrot-crew-project-img","Screenshot of Mad Parrot Crew home page",{"url":419,"details":420,"fileName":423,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/4yYU2VsDfEvMnOIFnWe8s6/550e38a11ea5618096b160698925405c/mad-parrot-crew-project-img.png",{"size":421,"image":422},148413,{"width":321,"height":322},"mad-parrot-crew-project-img.png",{"metadata":425,"sys":428,"fields":438},{"tags":426,"concepts":427},[],[],{"space":429,"id":431,"type":47,"createdAt":432,"updatedAt":432,"environment":433,"publishedVersion":435,"revision":20,"contentType":436,"locale":21},{"sys":430},{"type":9,"linkType":10,"id":11},"6OEC4mGGiIzD1ebZVuCeke","2023-01-28T17:54:35.724Z",{"sys":434},{"id":17,"type":9,"linkType":18},7,{"sys":437},{"type":9,"linkType":56,"id":280},{"name":439,"type":440,"url":441,"description":442,"tech":452,"image":454},"Spring Clean Twitter Bot","Project","https://github.com/jackdomleo7/Spring_Clean_Twitter_Bot",{"data":443,"content":444,"nodeType":116},{},[445],{"data":446,"content":447,"nodeType":101},{},[448],{"data":449,"marks":450,"value":451,"nodeType":100},{},[],"A Twitter bot to automatically clean up my Twitter account.",[223,453],"CRON",{"metadata":455,"sys":458,"fields":466},{"tags":456,"concepts":457},[],[],{"space":459,"id":461,"type":13,"createdAt":462,"updatedAt":462,"environment":463,"publishedVersion":465,"revision":20,"locale":21},{"sys":460},{"type":9,"linkType":10,"id":11},"5zb0pDWNBVdorGnCnM0gwb","2023-01-28T17:54:30.356Z",{"sys":464},{"id":17,"type":9,"linkType":18},4,{"title":467,"description":468,"file":469},"twitter-spring-clean-bot-project-img","Twitter spring clean",{"url":470,"details":471,"fileName":474,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/5zb0pDWNBVdorGnCnM0gwb/d9cf343aeb2136f44ab17dc6b0410281/twitter-spring-clean-bot-project-img.png",{"size":472,"image":473},150202,{"width":321,"height":322},"twitter-spring-clean-bot-project-img.png",{"metadata":476,"sys":479,"fields":488},{"tags":477,"concepts":478},[],[],{"space":480,"id":482,"type":47,"createdAt":483,"updatedAt":483,"environment":484,"publishedVersion":277,"revision":20,"contentType":486,"locale":21},{"sys":481},{"type":9,"linkType":10,"id":11},"5kzQZ2SXoScnodt56Ulmiv","2023-01-28T17:37:10.177Z",{"sys":485},{"id":17,"type":9,"linkType":18},{"sys":487},{"type":9,"linkType":56,"id":280},{"name":489,"type":339,"url":490,"description":491,"tech":505,"tags":507,"image":509},"Colour Theme Watcher & Switcher","https://codepen.io/jackdomleo7/full/OJWaeem",{"data":492,"content":493,"nodeType":116},{},[494],{"data":495,"content":496,"nodeType":101},{},[497,501],{"data":498,"marks":499,"value":500,"nodeType":100},{},[],"A pure JavaScript snippet to watch",{"data":502,"marks":503,"value":504,"nodeType":100},{},[],"/detect a user's colour theme and allow them to change it.",[254,506],"CSS",[508],"Utility",{"metadata":510,"sys":513,"fields":520},{"tags":511,"concepts":512},[],[],{"space":514,"id":516,"type":13,"createdAt":517,"updatedAt":517,"environment":518,"publishedVersion":366,"revision":20,"locale":21},{"sys":515},{"type":9,"linkType":10,"id":11},"5u50SbmPUZoqIhzqtV7UaL","2023-01-28T17:37:05.167Z",{"sys":519},{"id":17,"type":9,"linkType":18},{"title":521,"description":522,"file":523},"colour-theme-picker-project-img","Changing colour theme from dark to light",{"url":524,"details":525,"fileName":528,"contentType":375},"//images.ctfassets.net/l1wujzr3g1ab/5u50SbmPUZoqIhzqtV7UaL/b7abf17a991a5e6b491ed212cd8e1c49/colour-theme-picker-project-img.gif",{"size":526,"image":527},123783,{"width":321,"height":322},"colour-theme-picker-project-img.gif",{"metadata":530,"sys":533,"fields":542},{"tags":531,"concepts":532},[],[],{"space":534,"id":536,"type":47,"createdAt":537,"updatedAt":537,"environment":538,"publishedVersion":19,"revision":20,"contentType":540,"locale":21},{"sys":535},{"type":9,"linkType":10,"id":11},"2qHSazjv6Ro4OXfCrkVkwg","2023-01-28T17:31:17.504Z",{"sys":539},{"id":17,"type":9,"linkType":18},{"sys":541},{"type":9,"linkType":56,"id":280},{"name":543,"type":339,"url":544,"description":545,"tech":555,"image":557},"Custom Car Colour Preview","https://codepen.io/jackdomleo7/full/wvoYjNP",{"data":546,"content":547,"nodeType":116},{},[548],{"data":549,"content":550,"nodeType":101},{},[551],{"data":552,"marks":553,"value":554,"nodeType":100},{},[],"An application to preview different colours of a car.",[556,298],"SVG",{"metadata":558,"sys":561,"fields":568},{"tags":559,"concepts":560},[],[],{"space":562,"id":564,"type":13,"createdAt":565,"updatedAt":565,"environment":566,"publishedVersion":366,"revision":20,"locale":21},{"sys":563},{"type":9,"linkType":10,"id":11},"1ZmqPLpQtjTJPsWiUB8ihd","2023-01-28T17:31:09.936Z",{"sys":567},{"id":17,"type":9,"linkType":18},{"title":569,"description":570,"file":571},"car-colour-picker-project-img","A car changing colour",{"url":572,"details":573,"fileName":576,"contentType":375},"//images.ctfassets.net/l1wujzr3g1ab/1ZmqPLpQtjTJPsWiUB8ihd/89be01caacd54b1d9e5975e584056260/car-colour-picker-project-img.gif",{"size":574,"image":575},439705,{"width":321,"height":322},"car-colour-picker-project-img.gif",{"metadata":578,"sys":581,"fields":593},{"tags":579,"concepts":580},[],[],{"space":582,"id":584,"type":47,"createdAt":585,"updatedAt":586,"environment":587,"publishedVersion":589,"revision":590,"contentType":591,"locale":21},{"sys":583},{"type":9,"linkType":10,"id":11},"wpQfsnzkVT7y1Eg4ANU24","2023-01-28T17:25:18.524Z","2023-01-28T17:37:25.464Z",{"sys":588},{"id":17,"type":9,"linkType":18},14,2,{"sys":592},{"type":9,"linkType":56,"id":280},{"name":594,"type":440,"url":595,"description":596,"tech":606,"tags":608,"image":609},"Checka11y.css","https://checka11y.jackdomleo.dev/",{"data":597,"content":598,"nodeType":116},{},[599],{"data":600,"content":601,"nodeType":101},{},[602],{"data":603,"marks":604,"value":605,"nodeType":100},{},[],"A CSS stylesheet to quickly highlight a11y concerns and a really good education project for those wanting to learn about accessibility.",[298,607],"Cypress",[354,508],{"metadata":610,"sys":613,"fields":620},{"tags":611,"concepts":612},[],[],{"space":614,"id":616,"type":13,"createdAt":617,"updatedAt":617,"environment":618,"publishedVersion":366,"revision":20,"locale":21},{"sys":615},{"type":9,"linkType":10,"id":11},"3nPJwMFNQ8OZ7OlHMED3YJ","2023-01-28T17:25:13.225Z",{"sys":619},{"id":17,"type":9,"linkType":18},{"title":621,"description":622,"file":623},"checka11y-project-img","Checka11y.css logo",{"url":624,"details":625,"fileName":628,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nPJwMFNQ8OZ7OlHMED3YJ/9350ee10587c33b4e9dd71464aa1173d/checka11y-project-img.png",{"size":626,"image":627},28340,{"width":321,"height":322},"checka11y-project-img.png",{"metadata":630,"sys":633,"fields":642},{"tags":631,"concepts":632},[],[],{"space":634,"id":636,"type":47,"createdAt":637,"updatedAt":637,"environment":638,"publishedVersion":19,"revision":20,"contentType":640,"locale":21},{"sys":635},{"type":9,"linkType":10,"id":11},"6egKMvjf6ugswngEWd7bzb","2023-01-28T17:19:29.418Z",{"sys":639},{"id":17,"type":9,"linkType":18},{"sys":641},{"type":9,"linkType":56,"id":280},{"name":643,"type":339,"url":644,"description":645,"tech":655,"tags":657,"image":659},"Spinning Smiley Face","https://codepen.io/jackdomleo7/full/wvKLjVb",{"data":646,"content":647,"nodeType":116},{},[648],{"data":649,"content":650,"nodeType":101},{},[651],{"data":652,"marks":653,"value":654,"nodeType":100},{},[],"A cute spinning smiley face while learning GSAP.",[656,298],"GSAP",[658],"Animation",{"metadata":660,"sys":663,"fields":670},{"tags":661,"concepts":662},[],[],{"space":664,"id":666,"type":13,"createdAt":667,"updatedAt":667,"environment":668,"publishedVersion":366,"revision":20,"locale":21},{"sys":665},{"type":9,"linkType":10,"id":11},"6i901gWFLWWSjs2ZYc9rpL","2023-01-28T17:19:17.739Z",{"sys":669},{"id":17,"type":9,"linkType":18},{"title":671,"description":672,"file":673},"spinning-smiley-face-project-img","Spinning smiley face animation",{"url":674,"details":675,"fileName":678,"contentType":375},"//images.ctfassets.net/l1wujzr3g1ab/6i901gWFLWWSjs2ZYc9rpL/e32d8b3cb14a794272c70360d1a39ac9/spinning-smiley-face-project-img.gif",{"size":676,"image":677},232759,{"width":321,"height":322},"spinning-smiley-face-project-img.gif",{"metadata":680,"sys":683,"fields":692},{"tags":681,"concepts":682},[],[],{"space":684,"id":686,"type":47,"createdAt":687,"updatedAt":687,"environment":688,"publishedVersion":435,"revision":20,"contentType":690,"locale":21},{"sys":685},{"type":9,"linkType":10,"id":11},"1rx3EwhjpCdMESgcFDv0CY","2023-01-28T17:10:10.423Z",{"sys":689},{"id":17,"type":9,"linkType":18},{"sys":691},{"type":9,"linkType":56,"id":280},{"name":693,"type":339,"url":694,"description":695,"tech":705,"tags":706,"image":708},"CSS Union Jack Flag","https://codepen.io/jackdomleo7/full/abvrgEo",{"nodeType":116,"data":696,"content":697},{},[698],{"nodeType":101,"data":699,"content":700},{},[701],{"nodeType":100,"value":702,"marks":703,"data":704},"A pure CSS pixel-perfect Union Jack flag.",[],{},[298],[707],"CSS Art",{"metadata":709,"sys":712,"fields":719},{"tags":710,"concepts":711},[],[],{"space":713,"id":715,"type":13,"createdAt":716,"updatedAt":716,"environment":717,"publishedVersion":366,"revision":20,"locale":21},{"sys":714},{"type":9,"linkType":10,"id":11},"2220otIqCHTmP1a6UkmHTO","2023-01-28T17:10:05.172Z",{"sys":718},{"id":17,"type":9,"linkType":18},{"title":720,"description":721,"file":722},"union-jack-project-img","Union Jack Flag",{"url":723,"details":724,"fileName":727,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2220otIqCHTmP1a6UkmHTO/1b888dd09c45cbb842cd476585c54eaf/union-jack-project-img.png",{"size":725,"image":726},29999,{"width":321,"height":322},"union-jack-project-img.png",{"metadata":729,"sys":732,"fields":743},{"tags":730,"concepts":731},[],[],{"space":733,"id":735,"type":47,"createdAt":736,"updatedAt":737,"environment":738,"publishedVersion":740,"revision":590,"contentType":741,"locale":21},{"sys":734},{"type":9,"linkType":10,"id":11},"3NkVQqDSFreEt3KgDspqhk","2023-01-28T12:20:29.489Z","2023-01-28T17:37:59.428Z",{"sys":739},{"id":17,"type":9,"linkType":18},9,{"sys":742},{"type":9,"linkType":56,"id":280},{"name":744,"type":339,"url":745,"description":746,"tech":756,"tags":757,"image":759},"Neumorphic Design Elements","https://codepen.io/jackdomleo7/full/mdeowoz",{"data":747,"content":748,"nodeType":116},{},[749],{"data":750,"content":751,"nodeType":101},{},[752],{"data":753,"marks":754,"value":755,"nodeType":100},{},[],"Some common UI elements in the style of neumorphic design.",[298],[758],"Popular",{"metadata":760,"sys":763,"fields":770},{"tags":761,"concepts":762},[],[],{"space":764,"id":766,"type":13,"createdAt":767,"updatedAt":767,"environment":768,"publishedVersion":366,"revision":20,"locale":21},{"sys":765},{"type":9,"linkType":10,"id":11},"5Qg1EnfhYLYpuJAT0qkaNc","2023-01-28T12:19:53.096Z",{"sys":769},{"id":17,"type":9,"linkType":18},{"title":771,"description":772,"file":773},"neumorphic-design-project-img","Neumorphic design components",{"url":774,"details":775,"fileName":778,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/5Qg1EnfhYLYpuJAT0qkaNc/43107f82a221c1809ab117bfd206170f/neumorphic-design-project-img.png",{"size":776,"image":777},31790,{"width":321,"height":322},"neumorphic-design-project-img.png",{"metadata":780,"sys":783,"fields":792},{"tags":781,"concepts":782},[],[],{"space":784,"id":786,"type":47,"createdAt":787,"updatedAt":787,"environment":788,"publishedVersion":19,"revision":20,"contentType":790,"locale":21},{"sys":785},{"type":9,"linkType":10,"id":11},"7vaOyrQvl5V0jGSDY3EsM2","2023-01-28T11:36:08.387Z",{"sys":789},{"id":17,"type":9,"linkType":18},{"sys":791},{"type":9,"linkType":56,"id":280},{"name":793,"type":283,"url":794,"description":795,"tech":805,"tags":807,"image":809},"TMD Interior Projects & Building Services Ltd","https://github.com/jackdomleo7/tmdip.co.uk",{"data":796,"content":797,"nodeType":116},{},[798],{"data":799,"content":800,"nodeType":101},{},[801],{"data":802,"marks":803,"value":804,"nodeType":100},{},[],"Designed and built a fully responsive static website for a small shop-fitting & interior design company. This website needed a modern but minimal feel to it so they could clearly get their message across to visitors. Unfortunately, the company closed in October 2021.",[296,223,806,298],"Prismic",[808],"Website",{"metadata":810,"sys":813,"fields":820},{"tags":811,"concepts":812},[],[],{"space":814,"id":816,"type":13,"createdAt":817,"updatedAt":817,"environment":818,"publishedVersion":160,"revision":20,"locale":21},{"sys":815},{"type":9,"linkType":10,"id":11},"v3W2zbHXA5PrqQNtVPUMm","2023-01-28T11:36:03.512Z",{"sys":819},{"id":17,"type":9,"linkType":18},{"title":821,"description":822,"file":823},"tmdip-project-img","Screenshot of TMD Interior Projects home page",{"url":824,"details":825,"fileName":828,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/v3W2zbHXA5PrqQNtVPUMm/1053b757abf68582bfa0f410077806c8/tmdip-project-img.png",{"size":826,"image":827},102678,{"width":321,"height":322},"tmdip-project-img.png",{"metadata":830,"sys":833,"fields":844},{"tags":831,"concepts":832},[],[],{"space":834,"id":836,"type":47,"createdAt":837,"updatedAt":838,"environment":839,"publishedVersion":841,"revision":590,"contentType":842,"locale":21},{"sys":835},{"type":9,"linkType":10,"id":11},"4ujuAFszSXcHDSvTByVFDD","2023-01-27T22:02:31.611Z","2023-01-28T17:37:41.676Z",{"sys":840},{"id":17,"type":9,"linkType":18},12,{"sys":843},{"type":9,"linkType":56,"id":280},{"name":845,"type":440,"url":846,"description":847,"tech":857,"tags":858,"image":859},"Cooltipz.css","https://cooltipz.jackdomleo.dev",{"data":848,"content":849,"nodeType":116},{},[850],{"data":851,"content":852,"nodeType":101},{},[853],{"data":854,"marks":855,"value":856,"nodeType":100},{},[],"A pure CSS solution for adding highly customisable, accessible tooltips to HTML.",[298],[354,758,508],{"metadata":860,"sys":863,"fields":870},{"tags":861,"concepts":862},[],[],{"space":864,"id":866,"type":13,"createdAt":867,"updatedAt":867,"environment":868,"publishedVersion":312,"revision":20,"locale":21},{"sys":865},{"type":9,"linkType":10,"id":11},"26fP6efyZsX7tw8rGCVrDL","2023-01-27T22:02:21.767Z",{"sys":869},{"id":17,"type":9,"linkType":18},{"title":871,"description":315,"file":872},"cooltipz-project-img",{"url":873,"details":874,"fileName":877,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/26fP6efyZsX7tw8rGCVrDL/0bc668a492f6b7eb375a3ad568df6c83/cooltipz-project-img.png",{"size":875,"image":876},11929,{"width":321,"height":322},"cooltipz-project-img.png",{"metadata":879,"sys":882,"fields":891},{"tags":880,"concepts":881},[],[],{"space":883,"id":885,"type":47,"createdAt":886,"updatedAt":886,"environment":887,"publishedVersion":53,"revision":20,"contentType":889,"locale":21},{"sys":884},{"type":9,"linkType":10,"id":11},"6YB39UZiiMFBSFf5YBFqaO","2023-01-27T21:57:40.389Z",{"sys":888},{"id":17,"type":9,"linkType":18},{"sys":890},{"type":9,"linkType":56,"id":280},{"name":892,"type":339,"url":893,"description":894,"tech":904,"tags":905,"image":907},"Jumping into Lightspeed","https://codepen.io/jackdomleo7/full/rNOYdwz",{"data":895,"content":896,"nodeType":116},{},[897],{"data":898,"content":899,"nodeType":101},{},[900],{"data":901,"marks":902,"value":903,"nodeType":100},{},[],"A mini animation demonstrating Star Wars lightspeed using HTML, CSS & JS.",[254,506],[906,658],"Star Wars",{"metadata":908,"sys":911,"fields":918},{"tags":909,"concepts":910},[],[],{"space":912,"id":914,"type":13,"createdAt":915,"updatedAt":915,"environment":916,"publishedVersion":312,"revision":20,"locale":21},{"sys":913},{"type":9,"linkType":10,"id":11},"zXmBtqvpORf1Zffobl22F","2023-01-27T21:57:26.116Z",{"sys":917},{"id":17,"type":9,"linkType":18},{"title":919,"description":315,"file":920},"lightspeed-project-img",{"url":921,"details":922,"fileName":925,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/zXmBtqvpORf1Zffobl22F/c4a75a537080960d72f5930149bf2817/lightspeed-project-img.png",{"size":923,"image":924},100927,{"width":321,"height":322},"lightspeed-project-img.png",{"metadata":927,"sys":930,"fields":939},{"tags":928,"concepts":929},[],[],{"space":931,"id":933,"type":47,"createdAt":934,"updatedAt":934,"environment":935,"publishedVersion":841,"revision":20,"contentType":937,"locale":21},{"sys":932},{"type":9,"linkType":10,"id":11},"4aZX5AexMhJjo66sZ0Nm03","2023-01-27T21:51:09.097Z",{"sys":936},{"id":17,"type":9,"linkType":18},{"sys":938},{"type":9,"linkType":56,"id":280},{"name":940,"type":339,"url":941,"description":942,"tech":952,"tags":953,"image":955},"Pixel Art R2-D2","https://codepen.io/jackdomleo7/full/ZEEqdxy",{"data":943,"content":944,"nodeType":116},{},[945],{"data":946,"content":947,"nodeType":101},{},[948],{"data":949,"marks":950,"value":951,"nodeType":100},{},[],"A pure CSS, single div pixel art of the beloved Star Wars droid, R2-D2.",[506],[707,954,906],"Single div",{"metadata":956,"sys":959,"fields":966},{"tags":957,"concepts":958},[],[],{"space":960,"id":962,"type":13,"createdAt":963,"updatedAt":963,"environment":964,"publishedVersion":366,"revision":20,"locale":21},{"sys":961},{"type":9,"linkType":10,"id":11},"1lG3pACHA8YGmbbpQ2fpA7","2023-01-27T21:50:58.303Z",{"sys":965},{"id":17,"type":9,"linkType":18},{"title":967,"description":968,"file":969},"r2-d2-project-img","R2-D2 from Star Wars as pixel art",{"url":970,"details":971,"fileName":974,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1lG3pACHA8YGmbbpQ2fpA7/6ed00265778f38c5bd7f1bc395eb484d/r2-d2-project-img.png",{"size":972,"image":973},37976,{"width":321,"height":322},"r2-d2-project-img.png",{"metadata":976,"sys":979,"fields":990},{"tags":977,"concepts":978},[],[],{"space":980,"id":982,"type":47,"createdAt":983,"updatedAt":984,"environment":985,"publishedVersion":987,"revision":312,"contentType":988,"locale":21},{"sys":981},{"type":9,"linkType":10,"id":11},"4RGkQbZ9QFaahqn14RB3fg","2023-01-27T21:40:30.860Z","2023-12-18T23:39:32.367Z",{"sys":986},{"id":17,"type":9,"linkType":18},20,{"sys":989},{"type":9,"linkType":56,"id":280},{"name":991,"type":440,"url":992,"description":993,"tech":1003,"tags":1006,"image":1007},"My website","https://github.com/jackdomleo7/jackdomleo.dev",{"data":994,"content":995,"nodeType":116},{},[996],{"data":997,"content":998,"nodeType":101},{},[999],{"data":1000,"marks":1001,"value":1002,"nodeType":100},{},[],"Designed and built a fully responsive static website and blog for myself. This has been through many design variations as my UI skills have developed.",[1004,1005,223,298],"Nuxt 3","Contentful",[808],{"metadata":1008,"sys":1011,"fields":1018},{"tags":1009,"concepts":1010},[],[],{"space":1012,"id":1014,"type":13,"createdAt":1015,"updatedAt":1015,"environment":1016,"publishedVersion":435,"revision":20,"locale":21},{"sys":1013},{"type":9,"linkType":10,"id":11},"7fXjHpN3LyWRS6iULHyR02","2023-01-27T21:40:19.986Z",{"sys":1017},{"id":17,"type":9,"linkType":18},{"title":1019,"description":1020,"file":1021},"jackdomleo.dev-project-img","Screenshot of jackdomleo.dev homepage",{"url":1022,"details":1023,"fileName":1026,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/7fXjHpN3LyWRS6iULHyR02/8b59f60fb2404576a0c93553694fb1b6/jackdomleo.dev-project-img.png",{"size":1024,"image":1025},44662,{"width":321,"height":322},"jackdomleo.dev-project-img.png",{"Asset":1028},[301,557,955,708,859,355,609,404,759,509,454,659,1007,809,907],1730423475331] \ No newline at end of file +[{"data":1,"prerenderedAt":1029},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"$pqtWcjQkdb":117,"project-list-undefined":261},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":259},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"2QHyZ7VxF5oLnaQdSZOGQF","2022-11-29T19:03:07.826Z","2024-10-27T19:04:32.339Z",{"sys":131},{"id":17,"type":9,"linkType":18},123,21,{"sys":135},{"type":9,"linkType":56,"id":136},"home",{"name":63,"metaDescription":138,"title":115,"heroBody":139,"heroImage":149,"aboutTitle":172,"aboutBody":173,"aboutImage":149,"skillsTitle":210,"skillsList":211},"A Nottinghamshire-based frontend & UX developer, primarily working with Vue.js, Nuxt.js, TypeScript, SCSS & many more technologies.",{"data":140,"content":141,"nodeType":116},{},[142],{"data":143,"content":144,"nodeType":101},{},[145],{"data":146,"marks":147,"value":148,"nodeType":100},{},[],"Senior Frontend Developer",{"metadata":150,"sys":153,"fields":161},{"tags":151,"concepts":152},[],[],{"space":154,"id":156,"type":13,"createdAt":157,"updatedAt":157,"environment":158,"publishedVersion":160,"revision":20,"locale":21},{"sys":155},{"type":9,"linkType":10,"id":11},"1mPOrNhlrFYTBTczYmv3ZW","2023-01-21T21:22:09.036Z",{"sys":159},{"id":17,"type":9,"linkType":18},6,{"title":162,"description":163,"file":164},"Me (portrait)","Jack Domleo portrait",{"url":165,"details":166,"fileName":170,"contentType":171},"//images.ctfassets.net/l1wujzr3g1ab/1mPOrNhlrFYTBTczYmv3ZW/6bc83cfc55892490e750e5d9f47d40d9/me.jpg",{"size":167,"image":168},23399,{"width":169,"height":169},460,"me.jpg","image/jpeg","About me",{"nodeType":116,"data":174,"content":175},{},[176,196,203],{"nodeType":101,"data":177,"content":178},{},[179,183,192],{"nodeType":100,"value":180,"marks":181,"data":182},"Hi, I'm Jack Domleo, a Nottinghamshire-based developer in the UK, currently working as a Senior Frontend Developer at ",[],{},{"nodeType":184,"data":185,"content":187},"hyperlink",{"uri":186},"https://www.oceanfinance.co.uk/",[188],{"nodeType":100,"value":189,"marks":190,"data":191},"Ocean Finance",[],{},{"nodeType":100,"value":193,"marks":194,"data":195},".",[],{},{"nodeType":101,"data":197,"content":198},{},[199],{"nodeType":100,"value":200,"marks":201,"data":202},"I have 6 years of professional experience working as a developer. I often work with Vue.js, TypeScript, Vite, Vitest, SCSS, Storybook, and PlayWright.",[],{},{"nodeType":101,"data":204,"content":205},{},[206],{"nodeType":100,"value":207,"marks":208,"data":209},"I have a passion for frontend technologies, and writing clean websites and applications while maintaining high accessibility standards.",[],{},"Skills",[212,216,220,224,228,232,236,240,244,247,251,255],{"id":213,"key":214,"value":215},"d896fe97-be3e-4c5f-978b-0327614319f4","vue","Vue.js",{"id":217,"key":218,"value":219},"42846b2b-1fb3-4e40-995a-45f6e74f8bb3","nuxt","Nuxt.js",{"id":221,"key":222,"value":223},"dc3fdfb3-a196-4a15-a775-e8d8d35fc83b","typescript","TypeScript",{"id":225,"key":226,"value":227},"b5ac1642-12dd-4073-88f6-6314ac9c7919","jest","Jest",{"id":229,"key":230,"value":231},"853277e0-df13-4e88-88f8-a857bcac9d3a","storybook","Storybook",{"id":233,"key":234,"value":235},"d36cf843-6326-4b93-9f32-ee489277ecd6","sass","Sass/SCSS",{"id":237,"key":238,"value":239},"3cf64446-8147-475a-b64e-54df9b5ce682","a11y","Accessibility",{"id":241,"key":242,"value":243},"a98d8951-611b-4321-8c43-ee325ba5e932","node_js","Node.js",{"id":245,"key":246,"value":246},"7329b3e5-11e0-493f-ac9a-1dcc1d496a3e","npm",{"id":248,"key":249,"value":250},"bdea57ff-9074-4455-b456-57eaecf2f71e","vs_code","VS Code",{"id":252,"key":253,"value":254},"b4e8d466-6275-45a0-9916-5175565ff32b","javascript","JavaScript",{"id":256,"key":257,"value":258},"3e620c9f-53e6-4e83-bd1a-3a01fe90eb52","html","HTML",{"Asset":260},[149],{"sys":262,"total":263,"skip":37,"limit":264,"items":265,"includes":1027},{"type":36},15,1000,[266,324,376,424,475,529,577,629,679,728,779,829,878,926,975],{"metadata":267,"sys":270,"fields":281},{"tags":268,"concepts":269},[],[],{"space":271,"id":273,"type":47,"createdAt":274,"updatedAt":274,"environment":275,"publishedVersion":277,"revision":20,"contentType":278,"locale":21},{"sys":272},{"type":9,"linkType":10,"id":11},"4Kiex9dMPsL87rteSvnG2h","2023-01-28T19:13:41.069Z",{"sys":276},{"id":17,"type":9,"linkType":18},10,{"sys":279},{"type":9,"linkType":56,"id":280},"project",{"name":282,"type":283,"url":284,"description":285,"tech":295,"tags":299,"image":301},"Grassverse NFT","Client","https://www.grassverse.org/",{"data":286,"content":287,"nodeType":116},{},[288],{"data":289,"content":290,"nodeType":101},{},[291],{"data":292,"marks":293,"value":294,"nodeType":100},{},[],"This website came with pre-existing designs and includes a CMS and an account section for Grassverse asset owners to log in to view their assets and fellow owners of assets.",[296,297,223,298],"Nuxt 2","Web3","SCSS",[300],"NFT",{"metadata":302,"sys":305,"fields":313},{"tags":303,"concepts":304},[],[],{"space":306,"id":308,"type":13,"createdAt":309,"updatedAt":309,"environment":310,"publishedVersion":312,"revision":20,"locale":21},{"sys":307},{"type":9,"linkType":10,"id":11},"01rxXuPpEQ6phTc1Bvt9W9","2023-01-28T19:13:34.307Z",{"sys":311},{"id":17,"type":9,"linkType":18},3,{"title":314,"description":315,"file":316},"grassverse-project-img","",{"url":317,"details":318,"fileName":323,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/01rxXuPpEQ6phTc1Bvt9W9/5d347eb3e2a3731922c0aa7046273780/grassverse-project-img.png",{"size":319,"image":320},163210,{"width":321,"height":322},600,315,"grassverse-project-img.png",{"metadata":325,"sys":328,"fields":337},{"tags":326,"concepts":327},[],[],{"space":329,"id":331,"type":47,"createdAt":332,"updatedAt":332,"environment":333,"publishedVersion":19,"revision":20,"contentType":335,"locale":21},{"sys":330},{"type":9,"linkType":10,"id":11},"2JxOvMguZVHxM565SKDspu","2023-01-28T18:25:42.700Z",{"sys":334},{"id":17,"type":9,"linkType":18},{"sys":336},{"type":9,"linkType":56,"id":280},{"name":338,"type":339,"url":340,"description":341,"tech":351,"tags":353,"image":355},"npx jackdomleo7","Mini","https://github.com/jackdomleo7/npx_business_card",{"data":342,"content":343,"nodeType":116},{},[344],{"data":345,"content":346,"nodeType":101},{},[347],{"data":348,"marks":349,"value":350,"nodeType":100},{},[],"A simple npm script to show some details about me right in the console.",[254,352],"npx",[354],"npm package",{"metadata":356,"sys":359,"fields":367},{"tags":357,"concepts":358},[],[],{"space":360,"id":362,"type":13,"createdAt":363,"updatedAt":363,"environment":364,"publishedVersion":366,"revision":20,"locale":21},{"sys":361},{"type":9,"linkType":10,"id":11},"2ilJcH34gnOn1SEfkJqlJj","2023-01-28T18:25:36.903Z",{"sys":365},{"id":17,"type":9,"linkType":18},5,{"title":368,"description":338,"file":369},"npx-jackdomleo7-project-img",{"url":370,"details":371,"fileName":374,"contentType":375},"//images.ctfassets.net/l1wujzr3g1ab/2ilJcH34gnOn1SEfkJqlJj/69c7b64c07e828439e60e1287e47828c/npx-jackdomleo7-project-img.gif",{"size":372,"image":373},30415,{"width":321,"height":322},"npx-jackdomleo7-project-img.gif","image/gif",{"metadata":377,"sys":380,"fields":389},{"tags":378,"concepts":379},[],[],{"space":381,"id":383,"type":47,"createdAt":384,"updatedAt":384,"environment":385,"publishedVersion":277,"revision":20,"contentType":387,"locale":21},{"sys":382},{"type":9,"linkType":10,"id":11},"1y1gYckxXHOqS4a811GoMM","2023-01-28T18:10:23.588Z",{"sys":386},{"id":17,"type":9,"linkType":18},{"sys":388},{"type":9,"linkType":56,"id":280},{"name":390,"type":283,"url":391,"description":392,"tech":402,"tags":403,"image":404},"Mad Parrot Crew NFT","https://www.madparrotcrew.com/",{"data":393,"content":394,"nodeType":116},{},[395],{"data":396,"content":397,"nodeType":101},{},[398],{"data":399,"marks":400,"value":401,"nodeType":100},{},[],"Created a fully responsive minting website based on existing designs for the Mad Parrot Crew NFT.",[296,223,298],[300],{"metadata":405,"sys":408,"fields":415},{"tags":406,"concepts":407},[],[],{"space":409,"id":411,"type":13,"createdAt":412,"updatedAt":412,"environment":413,"publishedVersion":160,"revision":20,"locale":21},{"sys":410},{"type":9,"linkType":10,"id":11},"4yYU2VsDfEvMnOIFnWe8s6","2023-01-28T18:10:15.589Z",{"sys":414},{"id":17,"type":9,"linkType":18},{"title":416,"description":417,"file":418},"mad-parrot-crew-project-img","Screenshot of Mad Parrot Crew home page",{"url":419,"details":420,"fileName":423,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/4yYU2VsDfEvMnOIFnWe8s6/550e38a11ea5618096b160698925405c/mad-parrot-crew-project-img.png",{"size":421,"image":422},148413,{"width":321,"height":322},"mad-parrot-crew-project-img.png",{"metadata":425,"sys":428,"fields":438},{"tags":426,"concepts":427},[],[],{"space":429,"id":431,"type":47,"createdAt":432,"updatedAt":432,"environment":433,"publishedVersion":435,"revision":20,"contentType":436,"locale":21},{"sys":430},{"type":9,"linkType":10,"id":11},"6OEC4mGGiIzD1ebZVuCeke","2023-01-28T17:54:35.724Z",{"sys":434},{"id":17,"type":9,"linkType":18},7,{"sys":437},{"type":9,"linkType":56,"id":280},{"name":439,"type":440,"url":441,"description":442,"tech":452,"image":454},"Spring Clean Twitter Bot","Project","https://github.com/jackdomleo7/Spring_Clean_Twitter_Bot",{"data":443,"content":444,"nodeType":116},{},[445],{"data":446,"content":447,"nodeType":101},{},[448],{"data":449,"marks":450,"value":451,"nodeType":100},{},[],"A Twitter bot to automatically clean up my Twitter account.",[223,453],"CRON",{"metadata":455,"sys":458,"fields":466},{"tags":456,"concepts":457},[],[],{"space":459,"id":461,"type":13,"createdAt":462,"updatedAt":462,"environment":463,"publishedVersion":465,"revision":20,"locale":21},{"sys":460},{"type":9,"linkType":10,"id":11},"5zb0pDWNBVdorGnCnM0gwb","2023-01-28T17:54:30.356Z",{"sys":464},{"id":17,"type":9,"linkType":18},4,{"title":467,"description":468,"file":469},"twitter-spring-clean-bot-project-img","Twitter spring clean",{"url":470,"details":471,"fileName":474,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/5zb0pDWNBVdorGnCnM0gwb/d9cf343aeb2136f44ab17dc6b0410281/twitter-spring-clean-bot-project-img.png",{"size":472,"image":473},150202,{"width":321,"height":322},"twitter-spring-clean-bot-project-img.png",{"metadata":476,"sys":479,"fields":488},{"tags":477,"concepts":478},[],[],{"space":480,"id":482,"type":47,"createdAt":483,"updatedAt":483,"environment":484,"publishedVersion":277,"revision":20,"contentType":486,"locale":21},{"sys":481},{"type":9,"linkType":10,"id":11},"5kzQZ2SXoScnodt56Ulmiv","2023-01-28T17:37:10.177Z",{"sys":485},{"id":17,"type":9,"linkType":18},{"sys":487},{"type":9,"linkType":56,"id":280},{"name":489,"type":339,"url":490,"description":491,"tech":505,"tags":507,"image":509},"Colour Theme Watcher & Switcher","https://codepen.io/jackdomleo7/full/OJWaeem",{"data":492,"content":493,"nodeType":116},{},[494],{"data":495,"content":496,"nodeType":101},{},[497,501],{"data":498,"marks":499,"value":500,"nodeType":100},{},[],"A pure JavaScript snippet to watch",{"data":502,"marks":503,"value":504,"nodeType":100},{},[],"/detect a user's colour theme and allow them to change it.",[254,506],"CSS",[508],"Utility",{"metadata":510,"sys":513,"fields":520},{"tags":511,"concepts":512},[],[],{"space":514,"id":516,"type":13,"createdAt":517,"updatedAt":517,"environment":518,"publishedVersion":366,"revision":20,"locale":21},{"sys":515},{"type":9,"linkType":10,"id":11},"5u50SbmPUZoqIhzqtV7UaL","2023-01-28T17:37:05.167Z",{"sys":519},{"id":17,"type":9,"linkType":18},{"title":521,"description":522,"file":523},"colour-theme-picker-project-img","Changing colour theme from dark to light",{"url":524,"details":525,"fileName":528,"contentType":375},"//images.ctfassets.net/l1wujzr3g1ab/5u50SbmPUZoqIhzqtV7UaL/b7abf17a991a5e6b491ed212cd8e1c49/colour-theme-picker-project-img.gif",{"size":526,"image":527},123783,{"width":321,"height":322},"colour-theme-picker-project-img.gif",{"metadata":530,"sys":533,"fields":542},{"tags":531,"concepts":532},[],[],{"space":534,"id":536,"type":47,"createdAt":537,"updatedAt":537,"environment":538,"publishedVersion":19,"revision":20,"contentType":540,"locale":21},{"sys":535},{"type":9,"linkType":10,"id":11},"2qHSazjv6Ro4OXfCrkVkwg","2023-01-28T17:31:17.504Z",{"sys":539},{"id":17,"type":9,"linkType":18},{"sys":541},{"type":9,"linkType":56,"id":280},{"name":543,"type":339,"url":544,"description":545,"tech":555,"image":557},"Custom Car Colour Preview","https://codepen.io/jackdomleo7/full/wvoYjNP",{"data":546,"content":547,"nodeType":116},{},[548],{"data":549,"content":550,"nodeType":101},{},[551],{"data":552,"marks":553,"value":554,"nodeType":100},{},[],"An application to preview different colours of a car.",[556,298],"SVG",{"metadata":558,"sys":561,"fields":568},{"tags":559,"concepts":560},[],[],{"space":562,"id":564,"type":13,"createdAt":565,"updatedAt":565,"environment":566,"publishedVersion":366,"revision":20,"locale":21},{"sys":563},{"type":9,"linkType":10,"id":11},"1ZmqPLpQtjTJPsWiUB8ihd","2023-01-28T17:31:09.936Z",{"sys":567},{"id":17,"type":9,"linkType":18},{"title":569,"description":570,"file":571},"car-colour-picker-project-img","A car changing colour",{"url":572,"details":573,"fileName":576,"contentType":375},"//images.ctfassets.net/l1wujzr3g1ab/1ZmqPLpQtjTJPsWiUB8ihd/89be01caacd54b1d9e5975e584056260/car-colour-picker-project-img.gif",{"size":574,"image":575},439705,{"width":321,"height":322},"car-colour-picker-project-img.gif",{"metadata":578,"sys":581,"fields":593},{"tags":579,"concepts":580},[],[],{"space":582,"id":584,"type":47,"createdAt":585,"updatedAt":586,"environment":587,"publishedVersion":589,"revision":590,"contentType":591,"locale":21},{"sys":583},{"type":9,"linkType":10,"id":11},"wpQfsnzkVT7y1Eg4ANU24","2023-01-28T17:25:18.524Z","2023-01-28T17:37:25.464Z",{"sys":588},{"id":17,"type":9,"linkType":18},14,2,{"sys":592},{"type":9,"linkType":56,"id":280},{"name":594,"type":440,"url":595,"description":596,"tech":606,"tags":608,"image":609},"Checka11y.css","https://checka11y.jackdomleo.dev/",{"data":597,"content":598,"nodeType":116},{},[599],{"data":600,"content":601,"nodeType":101},{},[602],{"data":603,"marks":604,"value":605,"nodeType":100},{},[],"A CSS stylesheet to quickly highlight a11y concerns and a really good education project for those wanting to learn about accessibility.",[298,607],"Cypress",[354,508],{"metadata":610,"sys":613,"fields":620},{"tags":611,"concepts":612},[],[],{"space":614,"id":616,"type":13,"createdAt":617,"updatedAt":617,"environment":618,"publishedVersion":366,"revision":20,"locale":21},{"sys":615},{"type":9,"linkType":10,"id":11},"3nPJwMFNQ8OZ7OlHMED3YJ","2023-01-28T17:25:13.225Z",{"sys":619},{"id":17,"type":9,"linkType":18},{"title":621,"description":622,"file":623},"checka11y-project-img","Checka11y.css logo",{"url":624,"details":625,"fileName":628,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nPJwMFNQ8OZ7OlHMED3YJ/9350ee10587c33b4e9dd71464aa1173d/checka11y-project-img.png",{"size":626,"image":627},28340,{"width":321,"height":322},"checka11y-project-img.png",{"metadata":630,"sys":633,"fields":642},{"tags":631,"concepts":632},[],[],{"space":634,"id":636,"type":47,"createdAt":637,"updatedAt":637,"environment":638,"publishedVersion":19,"revision":20,"contentType":640,"locale":21},{"sys":635},{"type":9,"linkType":10,"id":11},"6egKMvjf6ugswngEWd7bzb","2023-01-28T17:19:29.418Z",{"sys":639},{"id":17,"type":9,"linkType":18},{"sys":641},{"type":9,"linkType":56,"id":280},{"name":643,"type":339,"url":644,"description":645,"tech":655,"tags":657,"image":659},"Spinning Smiley Face","https://codepen.io/jackdomleo7/full/wvKLjVb",{"data":646,"content":647,"nodeType":116},{},[648],{"data":649,"content":650,"nodeType":101},{},[651],{"data":652,"marks":653,"value":654,"nodeType":100},{},[],"A cute spinning smiley face while learning GSAP.",[656,298],"GSAP",[658],"Animation",{"metadata":660,"sys":663,"fields":670},{"tags":661,"concepts":662},[],[],{"space":664,"id":666,"type":13,"createdAt":667,"updatedAt":667,"environment":668,"publishedVersion":366,"revision":20,"locale":21},{"sys":665},{"type":9,"linkType":10,"id":11},"6i901gWFLWWSjs2ZYc9rpL","2023-01-28T17:19:17.739Z",{"sys":669},{"id":17,"type":9,"linkType":18},{"title":671,"description":672,"file":673},"spinning-smiley-face-project-img","Spinning smiley face animation",{"url":674,"details":675,"fileName":678,"contentType":375},"//images.ctfassets.net/l1wujzr3g1ab/6i901gWFLWWSjs2ZYc9rpL/e32d8b3cb14a794272c70360d1a39ac9/spinning-smiley-face-project-img.gif",{"size":676,"image":677},232759,{"width":321,"height":322},"spinning-smiley-face-project-img.gif",{"metadata":680,"sys":683,"fields":692},{"tags":681,"concepts":682},[],[],{"space":684,"id":686,"type":47,"createdAt":687,"updatedAt":687,"environment":688,"publishedVersion":435,"revision":20,"contentType":690,"locale":21},{"sys":685},{"type":9,"linkType":10,"id":11},"1rx3EwhjpCdMESgcFDv0CY","2023-01-28T17:10:10.423Z",{"sys":689},{"id":17,"type":9,"linkType":18},{"sys":691},{"type":9,"linkType":56,"id":280},{"name":693,"type":339,"url":694,"description":695,"tech":705,"tags":706,"image":708},"CSS Union Jack Flag","https://codepen.io/jackdomleo7/full/abvrgEo",{"nodeType":116,"data":696,"content":697},{},[698],{"nodeType":101,"data":699,"content":700},{},[701],{"nodeType":100,"value":702,"marks":703,"data":704},"A pure CSS pixel-perfect Union Jack flag.",[],{},[298],[707],"CSS Art",{"metadata":709,"sys":712,"fields":719},{"tags":710,"concepts":711},[],[],{"space":713,"id":715,"type":13,"createdAt":716,"updatedAt":716,"environment":717,"publishedVersion":366,"revision":20,"locale":21},{"sys":714},{"type":9,"linkType":10,"id":11},"2220otIqCHTmP1a6UkmHTO","2023-01-28T17:10:05.172Z",{"sys":718},{"id":17,"type":9,"linkType":18},{"title":720,"description":721,"file":722},"union-jack-project-img","Union Jack Flag",{"url":723,"details":724,"fileName":727,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2220otIqCHTmP1a6UkmHTO/1b888dd09c45cbb842cd476585c54eaf/union-jack-project-img.png",{"size":725,"image":726},29999,{"width":321,"height":322},"union-jack-project-img.png",{"metadata":729,"sys":732,"fields":743},{"tags":730,"concepts":731},[],[],{"space":733,"id":735,"type":47,"createdAt":736,"updatedAt":737,"environment":738,"publishedVersion":740,"revision":590,"contentType":741,"locale":21},{"sys":734},{"type":9,"linkType":10,"id":11},"3NkVQqDSFreEt3KgDspqhk","2023-01-28T12:20:29.489Z","2023-01-28T17:37:59.428Z",{"sys":739},{"id":17,"type":9,"linkType":18},9,{"sys":742},{"type":9,"linkType":56,"id":280},{"name":744,"type":339,"url":745,"description":746,"tech":756,"tags":757,"image":759},"Neumorphic Design Elements","https://codepen.io/jackdomleo7/full/mdeowoz",{"data":747,"content":748,"nodeType":116},{},[749],{"data":750,"content":751,"nodeType":101},{},[752],{"data":753,"marks":754,"value":755,"nodeType":100},{},[],"Some common UI elements in the style of neumorphic design.",[298],[758],"Popular",{"metadata":760,"sys":763,"fields":770},{"tags":761,"concepts":762},[],[],{"space":764,"id":766,"type":13,"createdAt":767,"updatedAt":767,"environment":768,"publishedVersion":366,"revision":20,"locale":21},{"sys":765},{"type":9,"linkType":10,"id":11},"5Qg1EnfhYLYpuJAT0qkaNc","2023-01-28T12:19:53.096Z",{"sys":769},{"id":17,"type":9,"linkType":18},{"title":771,"description":772,"file":773},"neumorphic-design-project-img","Neumorphic design components",{"url":774,"details":775,"fileName":778,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/5Qg1EnfhYLYpuJAT0qkaNc/43107f82a221c1809ab117bfd206170f/neumorphic-design-project-img.png",{"size":776,"image":777},31790,{"width":321,"height":322},"neumorphic-design-project-img.png",{"metadata":780,"sys":783,"fields":792},{"tags":781,"concepts":782},[],[],{"space":784,"id":786,"type":47,"createdAt":787,"updatedAt":787,"environment":788,"publishedVersion":19,"revision":20,"contentType":790,"locale":21},{"sys":785},{"type":9,"linkType":10,"id":11},"7vaOyrQvl5V0jGSDY3EsM2","2023-01-28T11:36:08.387Z",{"sys":789},{"id":17,"type":9,"linkType":18},{"sys":791},{"type":9,"linkType":56,"id":280},{"name":793,"type":283,"url":794,"description":795,"tech":805,"tags":807,"image":809},"TMD Interior Projects & Building Services Ltd","https://github.com/jackdomleo7/tmdip.co.uk",{"data":796,"content":797,"nodeType":116},{},[798],{"data":799,"content":800,"nodeType":101},{},[801],{"data":802,"marks":803,"value":804,"nodeType":100},{},[],"Designed and built a fully responsive static website for a small shop-fitting & interior design company. This website needed a modern but minimal feel to it so they could clearly get their message across to visitors. Unfortunately, the company closed in October 2021.",[296,223,806,298],"Prismic",[808],"Website",{"metadata":810,"sys":813,"fields":820},{"tags":811,"concepts":812},[],[],{"space":814,"id":816,"type":13,"createdAt":817,"updatedAt":817,"environment":818,"publishedVersion":160,"revision":20,"locale":21},{"sys":815},{"type":9,"linkType":10,"id":11},"v3W2zbHXA5PrqQNtVPUMm","2023-01-28T11:36:03.512Z",{"sys":819},{"id":17,"type":9,"linkType":18},{"title":821,"description":822,"file":823},"tmdip-project-img","Screenshot of TMD Interior Projects home page",{"url":824,"details":825,"fileName":828,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/v3W2zbHXA5PrqQNtVPUMm/1053b757abf68582bfa0f410077806c8/tmdip-project-img.png",{"size":826,"image":827},102678,{"width":321,"height":322},"tmdip-project-img.png",{"metadata":830,"sys":833,"fields":844},{"tags":831,"concepts":832},[],[],{"space":834,"id":836,"type":47,"createdAt":837,"updatedAt":838,"environment":839,"publishedVersion":841,"revision":590,"contentType":842,"locale":21},{"sys":835},{"type":9,"linkType":10,"id":11},"4ujuAFszSXcHDSvTByVFDD","2023-01-27T22:02:31.611Z","2023-01-28T17:37:41.676Z",{"sys":840},{"id":17,"type":9,"linkType":18},12,{"sys":843},{"type":9,"linkType":56,"id":280},{"name":845,"type":440,"url":846,"description":847,"tech":857,"tags":858,"image":859},"Cooltipz.css","https://cooltipz.jackdomleo.dev",{"data":848,"content":849,"nodeType":116},{},[850],{"data":851,"content":852,"nodeType":101},{},[853],{"data":854,"marks":855,"value":856,"nodeType":100},{},[],"A pure CSS solution for adding highly customisable, accessible tooltips to HTML.",[298],[354,758,508],{"metadata":860,"sys":863,"fields":870},{"tags":861,"concepts":862},[],[],{"space":864,"id":866,"type":13,"createdAt":867,"updatedAt":867,"environment":868,"publishedVersion":312,"revision":20,"locale":21},{"sys":865},{"type":9,"linkType":10,"id":11},"26fP6efyZsX7tw8rGCVrDL","2023-01-27T22:02:21.767Z",{"sys":869},{"id":17,"type":9,"linkType":18},{"title":871,"description":315,"file":872},"cooltipz-project-img",{"url":873,"details":874,"fileName":877,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/26fP6efyZsX7tw8rGCVrDL/0bc668a492f6b7eb375a3ad568df6c83/cooltipz-project-img.png",{"size":875,"image":876},11929,{"width":321,"height":322},"cooltipz-project-img.png",{"metadata":879,"sys":882,"fields":891},{"tags":880,"concepts":881},[],[],{"space":883,"id":885,"type":47,"createdAt":886,"updatedAt":886,"environment":887,"publishedVersion":53,"revision":20,"contentType":889,"locale":21},{"sys":884},{"type":9,"linkType":10,"id":11},"6YB39UZiiMFBSFf5YBFqaO","2023-01-27T21:57:40.389Z",{"sys":888},{"id":17,"type":9,"linkType":18},{"sys":890},{"type":9,"linkType":56,"id":280},{"name":892,"type":339,"url":893,"description":894,"tech":904,"tags":905,"image":907},"Jumping into Lightspeed","https://codepen.io/jackdomleo7/full/rNOYdwz",{"data":895,"content":896,"nodeType":116},{},[897],{"data":898,"content":899,"nodeType":101},{},[900],{"data":901,"marks":902,"value":903,"nodeType":100},{},[],"A mini animation demonstrating Star Wars lightspeed using HTML, CSS & JS.",[254,506],[906,658],"Star Wars",{"metadata":908,"sys":911,"fields":918},{"tags":909,"concepts":910},[],[],{"space":912,"id":914,"type":13,"createdAt":915,"updatedAt":915,"environment":916,"publishedVersion":312,"revision":20,"locale":21},{"sys":913},{"type":9,"linkType":10,"id":11},"zXmBtqvpORf1Zffobl22F","2023-01-27T21:57:26.116Z",{"sys":917},{"id":17,"type":9,"linkType":18},{"title":919,"description":315,"file":920},"lightspeed-project-img",{"url":921,"details":922,"fileName":925,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/zXmBtqvpORf1Zffobl22F/c4a75a537080960d72f5930149bf2817/lightspeed-project-img.png",{"size":923,"image":924},100927,{"width":321,"height":322},"lightspeed-project-img.png",{"metadata":927,"sys":930,"fields":939},{"tags":928,"concepts":929},[],[],{"space":931,"id":933,"type":47,"createdAt":934,"updatedAt":934,"environment":935,"publishedVersion":841,"revision":20,"contentType":937,"locale":21},{"sys":932},{"type":9,"linkType":10,"id":11},"4aZX5AexMhJjo66sZ0Nm03","2023-01-27T21:51:09.097Z",{"sys":936},{"id":17,"type":9,"linkType":18},{"sys":938},{"type":9,"linkType":56,"id":280},{"name":940,"type":339,"url":941,"description":942,"tech":952,"tags":953,"image":955},"Pixel Art R2-D2","https://codepen.io/jackdomleo7/full/ZEEqdxy",{"data":943,"content":944,"nodeType":116},{},[945],{"data":946,"content":947,"nodeType":101},{},[948],{"data":949,"marks":950,"value":951,"nodeType":100},{},[],"A pure CSS, single div pixel art of the beloved Star Wars droid, R2-D2.",[506],[707,954,906],"Single div",{"metadata":956,"sys":959,"fields":966},{"tags":957,"concepts":958},[],[],{"space":960,"id":962,"type":13,"createdAt":963,"updatedAt":963,"environment":964,"publishedVersion":366,"revision":20,"locale":21},{"sys":961},{"type":9,"linkType":10,"id":11},"1lG3pACHA8YGmbbpQ2fpA7","2023-01-27T21:50:58.303Z",{"sys":965},{"id":17,"type":9,"linkType":18},{"title":967,"description":968,"file":969},"r2-d2-project-img","R2-D2 from Star Wars as pixel art",{"url":970,"details":971,"fileName":974,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1lG3pACHA8YGmbbpQ2fpA7/6ed00265778f38c5bd7f1bc395eb484d/r2-d2-project-img.png",{"size":972,"image":973},37976,{"width":321,"height":322},"r2-d2-project-img.png",{"metadata":976,"sys":979,"fields":990},{"tags":977,"concepts":978},[],[],{"space":980,"id":982,"type":47,"createdAt":983,"updatedAt":984,"environment":985,"publishedVersion":987,"revision":312,"contentType":988,"locale":21},{"sys":981},{"type":9,"linkType":10,"id":11},"4RGkQbZ9QFaahqn14RB3fg","2023-01-27T21:40:30.860Z","2023-12-18T23:39:32.367Z",{"sys":986},{"id":17,"type":9,"linkType":18},20,{"sys":989},{"type":9,"linkType":56,"id":280},{"name":991,"type":440,"url":992,"description":993,"tech":1003,"tags":1006,"image":1007},"My website","https://github.com/jackdomleo7/jackdomleo.dev",{"data":994,"content":995,"nodeType":116},{},[996],{"data":997,"content":998,"nodeType":101},{},[999],{"data":1000,"marks":1001,"value":1002,"nodeType":100},{},[],"Designed and built a fully responsive static website and blog for myself. This has been through many design variations as my UI skills have developed.",[1004,1005,223,298],"Nuxt 3","Contentful",[808],{"metadata":1008,"sys":1011,"fields":1018},{"tags":1009,"concepts":1010},[],[],{"space":1012,"id":1014,"type":13,"createdAt":1015,"updatedAt":1015,"environment":1016,"publishedVersion":435,"revision":20,"locale":21},{"sys":1013},{"type":9,"linkType":10,"id":11},"7fXjHpN3LyWRS6iULHyR02","2023-01-27T21:40:19.986Z",{"sys":1017},{"id":17,"type":9,"linkType":18},{"title":1019,"description":1020,"file":1021},"jackdomleo.dev-project-img","Screenshot of jackdomleo.dev homepage",{"url":1022,"details":1023,"fileName":1026,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/7fXjHpN3LyWRS6iULHyR02/8b59f60fb2404576a0c93553694fb1b6/jackdomleo.dev-project-img.png",{"size":1024,"image":1025},44662,{"width":321,"height":322},"jackdomleo.dev-project-img.png",{"Asset":1028},[301,557,955,708,859,355,609,404,759,509,454,659,1007,809,907],1730509477487] \ No newline at end of file diff --git a/blog/2020/hover-css-media-query/_payload.json b/blog/2020/hover-css-media-query/_payload.json index 9c4ce1cda..ddbcf6cd6 100644 --- a/blog/2020/hover-css-media-query/_payload.json +++ b/blog/2020/hover-css-media-query/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":627},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-hover-css-media-query":117,"$rpzcfBTaqR":464,"article-list-hover-css-media-query":481},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":462},{"type":36},[120],{"metadata":121,"sys":124,"fields":136},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":53,"contentType":133,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"5GKjEQKbXAneX7HsUv1qtm","2023-01-22T21:55:27.965Z","2023-01-24T08:10:50.331Z",{"sys":131},{"id":17,"type":9,"linkType":18},110,{"sys":134},{"type":9,"linkType":56,"id":135},"article",{"title":137,"slug":138,"image":139,"description":160,"publishDate":161,"tags":162,"body":164},"@media (hover: hover) - CSS Media Query","hover-css-media-query",{"metadata":140,"sys":143,"fields":151},{"tags":141,"concepts":142},[],[],{"space":144,"id":146,"type":13,"createdAt":147,"updatedAt":147,"environment":148,"publishedVersion":150,"revision":20,"locale":21},{"sys":145},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":149},{"id":17,"type":9,"linkType":18},5,{"title":152,"description":153,"file":154},"css=hover-media-query-og","CSS media query for hover",{"url":155,"details":156,"fileName":159,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":157,"image":158},13019,{"width":30,"height":31},"css=hover-media-query-og.png","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.","2020-07-06",[163],"CSS",{"nodeType":116,"data":165,"content":166},{},[167,198,225,241,248,256,264,271,278,289,296,312,323,330,337,360,371,386,393,433,437,444],{"nodeType":168,"data":169,"content":170},"blockquote",{},[171,178],{"nodeType":101,"data":172,"content":173},{},[174],{"nodeType":100,"value":175,"marks":176,"data":177},"The `hover` CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",[],{},{"nodeType":101,"data":179,"content":180},{},[181,185,194],{"nodeType":100,"value":182,"marks":183,"data":184},"- ",[],{},{"nodeType":186,"data":187,"content":189},"hyperlink",{"uri":188},"https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover",[190],{"nodeType":100,"value":191,"marks":192,"data":193},"MDN web docs",[],{},{"nodeType":100,"value":195,"marks":196,"data":197},"\r",[],{},{"nodeType":101,"data":199,"content":200},{},[201,205,211,215,221],{"nodeType":100,"value":202,"marks":203,"data":204},"Not to be confused with the ",[],{},{"nodeType":100,"value":206,"marks":207,"data":210},":hover",[208],{"type":209},"code",{},{"nodeType":100,"value":212,"marks":213,"data":214}," psuedo selector, this is a ",[],{},{"nodeType":100,"value":216,"marks":217,"data":220},"media query",[218],{"type":219},"bold",{},{"nodeType":100,"value":222,"marks":223,"data":224}," you may have never used or never considered using.\r",[],{},{"nodeType":101,"data":226,"content":227},{},[228,232,237],{"nodeType":100,"value":229,"marks":230,"data":231},"Let's look at an example and see how it could be improved using the ",[],{},{"nodeType":100,"value":233,"marks":234,"data":236},"hover",[235],{"type":209},{},{"nodeType":100,"value":238,"marks":239,"data":240}," media query.",[],{},{"nodeType":101,"data":242,"content":243},{},[244],{"nodeType":100,"value":245,"marks":246,"data":247},"Let's assume we're using this HTML for the below demonstration.\r",[],{},{"nodeType":101,"data":249,"content":250},{},[251],{"nodeType":100,"value":252,"marks":253,"data":255},"HTML\n\u003Cbutton class=\"button\">\n Hover me\r\n \u003Csvg>...\u003C/svg>\r\n\u003C/button>\r",[254],{"type":209},{},{"nodeType":257,"data":258,"content":259},"heading-2",{},[260],{"nodeType":100,"value":261,"marks":262,"data":263},"Showing an icon on hover\r",[],{},{"nodeType":101,"data":265,"content":266},{},[267],{"nodeType":100,"value":268,"marks":269,"data":270},"This is a typical feature request. It's not very detailed, but as front-end developers, it's enough for us to work with and create a prototype button at the least.\r",[],{},{"nodeType":101,"data":272,"content":273},{},[274],{"nodeType":100,"value":275,"marks":276,"data":277},"For this to work, we may jump to do something like this:\r",[],{},{"nodeType":101,"data":279,"content":280},{},[281,286],{"nodeType":100,"value":282,"marks":283,"data":285},"CSS\n.button {\r\n background: darkorange;\r\n color: white;\r\n border: none;\r\n padding: 1rem;\r\n text-align: center;\r\n position: relative;\r\n cursor: pointer;\r\n}\n\r\n.button svg {\r\n height: 2rem;\r\n width: 2rem;\r\n position: absolute;\r\n top: 50%;\r\n right: 0.6rem;\r\n fill: currentColor;\r\n opacity: 0;\r\n}\n\r\n.button:hover {\r\n padding-right: 3rem;\r\n}\n\r\n.button:hover svg {\r\n opacity: 1;\r\n}",[284],{"type":209},{},{"nodeType":100,"value":195,"marks":287,"data":288},[],{},{"nodeType":101,"data":290,"content":291},{},[292],{"nodeType":100,"value":293,"marks":294,"data":295},"This would for sure show the icon when the button is hovered! 💪 But it doesn't work on my mobile... It doesn't know I'm hovering the button.\r",[],{},{"nodeType":101,"data":297,"content":298},{},[299,303,308],{"nodeType":100,"value":300,"marks":301,"data":302},"So, how do we cater for touchscreen devices that can't hover? A common solution would be to always display the icon on _mobile devices (take note of this, I will come back to it later)_ and add the hovering functionality for larger screens by using a ",[],{},{"nodeType":100,"value":304,"marks":305,"data":307},"min-width",[306],{"type":209},{},{"nodeType":100,"value":309,"marks":310,"data":311}," media query, typically these are screens that are 768px or wider:\r",[],{},{"nodeType":101,"data":313,"content":314},{},[315,320],{"nodeType":100,"value":316,"marks":317,"data":319},"CSS\n.button {\r\n background: darkorange;\r\n color: white;\r\n border: none;\r\n padding: 1rem;\r\n padding-right: 3rem;\r\n text-align: center;\r\n position: relative;\r\n}\n\r\n.button svg {\r\n height: 2rem;\r\n width: 2rem;\r\n position: absolute;\r\n top: 50%;\r\n right: 0.6rem;\r\n fill: currentColor;\r\n opacity: 1;\r\n}\n\r\n@media (min-width: 768px) {\r\n .button {\r\n padding-right: 1rem;\r\n cursor: pointer;\r\n }\n\r\n .button svg {\r\n opacity: 0;\r\n }\n\r\n .button:hover {\r\n padding-right: 3rem;\r\n }\n\r\n .button:hover svg {\r\n opacity: 1;\r\n }\r\n}",[318],{"type":209},{},{"nodeType":100,"value":195,"marks":321,"data":322},[],{},{"nodeType":101,"data":324,"content":325},{},[326],{"nodeType":100,"value":327,"marks":328,"data":329},"Great! We now have a button that always shows the icon on devices with a screen width less than 768px and will initially hide the icon on devices with a screen width of 768px wide or wider.\r",[],{},{"nodeType":101,"data":331,"content":332},{},[333],{"nodeType":100,"value":334,"marks":335,"data":336},"Chances are, this works for most cases and has been an acceptable solution for many years. However, we can't assume a device doesn't have a hover input mechanism just because of its screen width, and vice-versa.\r",[],{},{"nodeType":101,"data":338,"content":339},{},[340,344,348,352,356],{"nodeType":100,"value":341,"marks":342,"data":343},"This is where our `hover` media query comes in. Let's take a look at how we can refactor our ",[],{},{"nodeType":100,"value":304,"marks":345,"data":347},[346],{"type":209},{},{"nodeType":100,"value":349,"marks":350,"data":351}," to use ",[],{},{"nodeType":100,"value":233,"marks":353,"data":355},[354],{"type":209},{},{"nodeType":100,"value":357,"marks":358,"data":359}," instead.",[],{},{"nodeType":101,"data":361,"content":362},{},[363,368],{"nodeType":100,"value":364,"marks":365,"data":367},"CSS\n.button {\r\n background: darkorange;\r\n color: white;\r\n border: none;\r\n padding: 1rem;\r\n padding-right: 3rem;\r\n text-align: center;\r\n position: relative;\r\n}\n\r\n.button svg {\r\n height: 2rem;\r\n width: 2rem;\r\n position: absolute;\r\n top: 50%;\r\n right: 0.6rem;\r\n fill: currentColor;\r\n opacity: 1;\r\n}\n\r\n@media (hover: hover) {\r\n .button {\r\n padding-right: 1rem;\r\n cursor: pointer;\r\n }\n\r\n .button svg {\r\n opacity: 0;\r\n }\n\r\n .button:hover {\r\n padding-right: 3rem;\r\n }\n\r\n .button:hover svg {\r\n opacity: 1;\r\n }\r\n}",[366],{"type":209},{},{"nodeType":100,"value":195,"marks":369,"data":370},[],{},{"nodeType":101,"data":372,"content":373},{},[374,378,382],{"nodeType":100,"value":375,"marks":376,"data":377},"Outside any media query, we define our base styles that apply to everything. Inside our ",[],{},{"nodeType":100,"value":233,"marks":379,"data":381},[380],{"type":209},{},{"nodeType":100,"value":383,"marks":384,"data":385}," media query, we define styles specific to devices with a hover input mechanism.\r",[],{},{"nodeType":101,"data":387,"content":388},{},[389],{"nodeType":100,"value":390,"marks":391,"data":392},"Can you see how this is better than determining hover-specific styles based on screen size?\r",[],{},{"nodeType":101,"data":394,"content":395},{},[396,400,404,408,413,417,421,425,429],{"nodeType":100,"value":397,"marks":398,"data":399},"It's also a cleaner method because we define our ",[],{},{"nodeType":100,"value":233,"marks":401,"data":403},[402],{"type":219},{},{"nodeType":100,"value":405,"marks":406,"data":407}," styles in our ",[],{},{"nodeType":100,"value":233,"marks":409,"data":412},[410,411],{"type":219},{"type":209},{},{"nodeType":100,"value":414,"marks":415,"data":416}," media query, it's grouped them nicely for us. These ",[],{},{"nodeType":100,"value":233,"marks":418,"data":420},[419],{"type":209},{},{"nodeType":100,"value":422,"marks":423,"data":424}," styles would be harder to identify in the stylesheet if they were encapsulated in a ",[],{},{"nodeType":100,"value":304,"marks":426,"data":428},[427],{"type":209},{},{"nodeType":100,"value":430,"marks":431,"data":432}," media query.\r",[],{},{"nodeType":434,"data":435,"content":436},"hr",{},[],{"nodeType":101,"data":438,"content":439},{},[440],{"nodeType":100,"value":441,"marks":442,"data":443},"For a working example, I created a CodePen below (with a few extra CSS properties) that I hope will help 🙂.",[],{},{"nodeType":101,"data":445,"content":446},{},[447,451,459],{"nodeType":100,"value":448,"marks":449,"data":450},"\r\n",[],{},{"nodeType":186,"data":452,"content":454},{"uri":453},"https://codepen.io/jackdomleo7/embed/jOWZRXX",[455],{"nodeType":100,"value":456,"marks":457,"data":458},"CodePen: hover: hover media query",[],{},{"nodeType":100,"value":195,"marks":460,"data":461},[],{},{"Asset":463},[139],{"sys":465,"total":20,"skip":37,"limit":20,"items":466},{"type":36},[467],{"fields":468,"sys":479},{"articleDisclaimer":469},{"data":470,"content":471,"nodeType":116},{},[472],{"data":473,"content":474,"nodeType":101},{},[475],{"data":476,"marks":477,"value":478,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":480,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":482,"total":150,"skip":37,"limit":483,"items":484,"includes":612},{"type":36},1000,[485,518,551,582],{"fields":486,"sys":516},{"title":487,"description":488,"image":489,"tags":512,"publishDate":514,"slug":515},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":490,"sys":493,"fields":503},{"tags":491,"concepts":492},[],[],{"space":494,"id":496,"type":13,"createdAt":497,"updatedAt":498,"environment":499,"publishedVersion":501,"revision":502,"locale":21},{"sys":495},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":500},{"id":17,"type":9,"linkType":18},9,2,{"title":504,"description":504,"file":505},"Pineapple",{"url":506,"details":507,"fileName":510,"contentType":511},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":508,"image":509},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg",[513],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":517,"type":47},"7CUW25a1jLiar8pzd8K9Nh",{"fields":519,"sys":549},{"title":520,"description":521,"image":522,"tags":543,"publishDate":547,"slug":548},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":523,"sys":526,"fields":534},{"tags":524,"concepts":525},[],[],{"space":527,"id":529,"type":13,"createdAt":530,"updatedAt":530,"environment":531,"publishedVersion":533,"revision":20,"locale":21},{"sys":528},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":532},{"id":17,"type":9,"linkType":18},7,{"title":535,"description":536,"file":537},"When is a clickable div okay","An example modal element",{"url":538,"details":539,"fileName":542,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":540,"image":541},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[544,545,546],"Accessibility","UX","HTML","2023-07-18","when-is-a-clickable-div-okay",{"id":550,"type":47},"brxitJC35PyChlVzusyLP",{"fields":552,"sys":580},{"title":553,"description":554,"image":555,"tags":575,"publishDate":578,"slug":579},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":556,"sys":559,"fields":566},{"tags":557,"concepts":558},[],[],{"space":560,"id":562,"type":13,"createdAt":563,"updatedAt":563,"environment":564,"publishedVersion":150,"revision":20,"locale":21},{"sys":561},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":565},{"id":17,"type":9,"linkType":18},{"title":567,"description":568,"file":569},"clutter","A cluttered office desk",{"url":570,"details":571,"fileName":574,"contentType":511},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":572,"image":573},281805,{"width":30,"height":31},"clutter.jpg",[576,577,546],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":581,"type":47},"9dijdAHS9ROnOwXit47NQ",{"fields":583,"sys":610},{"title":584,"description":585,"image":586,"tags":606,"publishDate":608,"slug":609},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":587,"sys":590,"fields":597},{"tags":588,"concepts":589},[],[],{"space":591,"id":593,"type":13,"createdAt":594,"updatedAt":594,"environment":595,"publishedVersion":533,"revision":20,"locale":21},{"sys":592},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":596},{"id":17,"type":9,"linkType":18},{"title":598,"description":599,"file":600},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":601,"details":602,"fileName":605,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":603,"image":604},6959,{"width":30,"height":31},"neumorphic-design-og.png",[607,163],"Design","2020-05-27","learning-neumorphic-design",{"id":611,"type":47},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":613},[614,522,489,555,586],{"metadata":615,"sys":618,"fields":623},{"tags":616,"concepts":617},[],[],{"space":619,"id":146,"type":13,"createdAt":147,"updatedAt":147,"environment":621,"publishedVersion":150,"revision":20,"locale":21},{"sys":620},{"type":9,"linkType":10,"id":11},{"sys":622},{"id":17,"type":9,"linkType":18},{"title":152,"description":153,"file":624},{"url":155,"details":625,"fileName":159,"contentType":33},{"size":157,"image":626},{"width":30,"height":31},1730423475331] \ No newline at end of file +[{"data":1,"prerenderedAt":627},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-hover-css-media-query":117,"$rpzcfBTaqR":464,"article-list-hover-css-media-query":481},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":462},{"type":36},[120],{"metadata":121,"sys":124,"fields":136},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":53,"contentType":133,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"5GKjEQKbXAneX7HsUv1qtm","2023-01-22T21:55:27.965Z","2023-01-24T08:10:50.331Z",{"sys":131},{"id":17,"type":9,"linkType":18},110,{"sys":134},{"type":9,"linkType":56,"id":135},"article",{"title":137,"slug":138,"image":139,"description":160,"publishDate":161,"tags":162,"body":164},"@media (hover: hover) - CSS Media Query","hover-css-media-query",{"metadata":140,"sys":143,"fields":151},{"tags":141,"concepts":142},[],[],{"space":144,"id":146,"type":13,"createdAt":147,"updatedAt":147,"environment":148,"publishedVersion":150,"revision":20,"locale":21},{"sys":145},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":149},{"id":17,"type":9,"linkType":18},5,{"title":152,"description":153,"file":154},"css=hover-media-query-og","CSS media query for hover",{"url":155,"details":156,"fileName":159,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":157,"image":158},13019,{"width":30,"height":31},"css=hover-media-query-og.png","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.","2020-07-06",[163],"CSS",{"nodeType":116,"data":165,"content":166},{},[167,198,225,241,248,256,264,271,278,289,296,312,323,330,337,360,371,386,393,433,437,444],{"nodeType":168,"data":169,"content":170},"blockquote",{},[171,178],{"nodeType":101,"data":172,"content":173},{},[174],{"nodeType":100,"value":175,"marks":176,"data":177},"The `hover` CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",[],{},{"nodeType":101,"data":179,"content":180},{},[181,185,194],{"nodeType":100,"value":182,"marks":183,"data":184},"- ",[],{},{"nodeType":186,"data":187,"content":189},"hyperlink",{"uri":188},"https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover",[190],{"nodeType":100,"value":191,"marks":192,"data":193},"MDN web docs",[],{},{"nodeType":100,"value":195,"marks":196,"data":197},"\r",[],{},{"nodeType":101,"data":199,"content":200},{},[201,205,211,215,221],{"nodeType":100,"value":202,"marks":203,"data":204},"Not to be confused with the ",[],{},{"nodeType":100,"value":206,"marks":207,"data":210},":hover",[208],{"type":209},"code",{},{"nodeType":100,"value":212,"marks":213,"data":214}," psuedo selector, this is a ",[],{},{"nodeType":100,"value":216,"marks":217,"data":220},"media query",[218],{"type":219},"bold",{},{"nodeType":100,"value":222,"marks":223,"data":224}," you may have never used or never considered using.\r",[],{},{"nodeType":101,"data":226,"content":227},{},[228,232,237],{"nodeType":100,"value":229,"marks":230,"data":231},"Let's look at an example and see how it could be improved using the ",[],{},{"nodeType":100,"value":233,"marks":234,"data":236},"hover",[235],{"type":209},{},{"nodeType":100,"value":238,"marks":239,"data":240}," media query.",[],{},{"nodeType":101,"data":242,"content":243},{},[244],{"nodeType":100,"value":245,"marks":246,"data":247},"Let's assume we're using this HTML for the below demonstration.\r",[],{},{"nodeType":101,"data":249,"content":250},{},[251],{"nodeType":100,"value":252,"marks":253,"data":255},"HTML\n\u003Cbutton class=\"button\">\n Hover me\r\n \u003Csvg>...\u003C/svg>\r\n\u003C/button>\r",[254],{"type":209},{},{"nodeType":257,"data":258,"content":259},"heading-2",{},[260],{"nodeType":100,"value":261,"marks":262,"data":263},"Showing an icon on hover\r",[],{},{"nodeType":101,"data":265,"content":266},{},[267],{"nodeType":100,"value":268,"marks":269,"data":270},"This is a typical feature request. It's not very detailed, but as front-end developers, it's enough for us to work with and create a prototype button at the least.\r",[],{},{"nodeType":101,"data":272,"content":273},{},[274],{"nodeType":100,"value":275,"marks":276,"data":277},"For this to work, we may jump to do something like this:\r",[],{},{"nodeType":101,"data":279,"content":280},{},[281,286],{"nodeType":100,"value":282,"marks":283,"data":285},"CSS\n.button {\r\n background: darkorange;\r\n color: white;\r\n border: none;\r\n padding: 1rem;\r\n text-align: center;\r\n position: relative;\r\n cursor: pointer;\r\n}\n\r\n.button svg {\r\n height: 2rem;\r\n width: 2rem;\r\n position: absolute;\r\n top: 50%;\r\n right: 0.6rem;\r\n fill: currentColor;\r\n opacity: 0;\r\n}\n\r\n.button:hover {\r\n padding-right: 3rem;\r\n}\n\r\n.button:hover svg {\r\n opacity: 1;\r\n}",[284],{"type":209},{},{"nodeType":100,"value":195,"marks":287,"data":288},[],{},{"nodeType":101,"data":290,"content":291},{},[292],{"nodeType":100,"value":293,"marks":294,"data":295},"This would for sure show the icon when the button is hovered! 💪 But it doesn't work on my mobile... It doesn't know I'm hovering the button.\r",[],{},{"nodeType":101,"data":297,"content":298},{},[299,303,308],{"nodeType":100,"value":300,"marks":301,"data":302},"So, how do we cater for touchscreen devices that can't hover? A common solution would be to always display the icon on _mobile devices (take note of this, I will come back to it later)_ and add the hovering functionality for larger screens by using a ",[],{},{"nodeType":100,"value":304,"marks":305,"data":307},"min-width",[306],{"type":209},{},{"nodeType":100,"value":309,"marks":310,"data":311}," media query, typically these are screens that are 768px or wider:\r",[],{},{"nodeType":101,"data":313,"content":314},{},[315,320],{"nodeType":100,"value":316,"marks":317,"data":319},"CSS\n.button {\r\n background: darkorange;\r\n color: white;\r\n border: none;\r\n padding: 1rem;\r\n padding-right: 3rem;\r\n text-align: center;\r\n position: relative;\r\n}\n\r\n.button svg {\r\n height: 2rem;\r\n width: 2rem;\r\n position: absolute;\r\n top: 50%;\r\n right: 0.6rem;\r\n fill: currentColor;\r\n opacity: 1;\r\n}\n\r\n@media (min-width: 768px) {\r\n .button {\r\n padding-right: 1rem;\r\n cursor: pointer;\r\n }\n\r\n .button svg {\r\n opacity: 0;\r\n }\n\r\n .button:hover {\r\n padding-right: 3rem;\r\n }\n\r\n .button:hover svg {\r\n opacity: 1;\r\n }\r\n}",[318],{"type":209},{},{"nodeType":100,"value":195,"marks":321,"data":322},[],{},{"nodeType":101,"data":324,"content":325},{},[326],{"nodeType":100,"value":327,"marks":328,"data":329},"Great! We now have a button that always shows the icon on devices with a screen width less than 768px and will initially hide the icon on devices with a screen width of 768px wide or wider.\r",[],{},{"nodeType":101,"data":331,"content":332},{},[333],{"nodeType":100,"value":334,"marks":335,"data":336},"Chances are, this works for most cases and has been an acceptable solution for many years. However, we can't assume a device doesn't have a hover input mechanism just because of its screen width, and vice-versa.\r",[],{},{"nodeType":101,"data":338,"content":339},{},[340,344,348,352,356],{"nodeType":100,"value":341,"marks":342,"data":343},"This is where our `hover` media query comes in. Let's take a look at how we can refactor our ",[],{},{"nodeType":100,"value":304,"marks":345,"data":347},[346],{"type":209},{},{"nodeType":100,"value":349,"marks":350,"data":351}," to use ",[],{},{"nodeType":100,"value":233,"marks":353,"data":355},[354],{"type":209},{},{"nodeType":100,"value":357,"marks":358,"data":359}," instead.",[],{},{"nodeType":101,"data":361,"content":362},{},[363,368],{"nodeType":100,"value":364,"marks":365,"data":367},"CSS\n.button {\r\n background: darkorange;\r\n color: white;\r\n border: none;\r\n padding: 1rem;\r\n padding-right: 3rem;\r\n text-align: center;\r\n position: relative;\r\n}\n\r\n.button svg {\r\n height: 2rem;\r\n width: 2rem;\r\n position: absolute;\r\n top: 50%;\r\n right: 0.6rem;\r\n fill: currentColor;\r\n opacity: 1;\r\n}\n\r\n@media (hover: hover) {\r\n .button {\r\n padding-right: 1rem;\r\n cursor: pointer;\r\n }\n\r\n .button svg {\r\n opacity: 0;\r\n }\n\r\n .button:hover {\r\n padding-right: 3rem;\r\n }\n\r\n .button:hover svg {\r\n opacity: 1;\r\n }\r\n}",[366],{"type":209},{},{"nodeType":100,"value":195,"marks":369,"data":370},[],{},{"nodeType":101,"data":372,"content":373},{},[374,378,382],{"nodeType":100,"value":375,"marks":376,"data":377},"Outside any media query, we define our base styles that apply to everything. Inside our ",[],{},{"nodeType":100,"value":233,"marks":379,"data":381},[380],{"type":209},{},{"nodeType":100,"value":383,"marks":384,"data":385}," media query, we define styles specific to devices with a hover input mechanism.\r",[],{},{"nodeType":101,"data":387,"content":388},{},[389],{"nodeType":100,"value":390,"marks":391,"data":392},"Can you see how this is better than determining hover-specific styles based on screen size?\r",[],{},{"nodeType":101,"data":394,"content":395},{},[396,400,404,408,413,417,421,425,429],{"nodeType":100,"value":397,"marks":398,"data":399},"It's also a cleaner method because we define our ",[],{},{"nodeType":100,"value":233,"marks":401,"data":403},[402],{"type":219},{},{"nodeType":100,"value":405,"marks":406,"data":407}," styles in our ",[],{},{"nodeType":100,"value":233,"marks":409,"data":412},[410,411],{"type":219},{"type":209},{},{"nodeType":100,"value":414,"marks":415,"data":416}," media query, it's grouped them nicely for us. These ",[],{},{"nodeType":100,"value":233,"marks":418,"data":420},[419],{"type":209},{},{"nodeType":100,"value":422,"marks":423,"data":424}," styles would be harder to identify in the stylesheet if they were encapsulated in a ",[],{},{"nodeType":100,"value":304,"marks":426,"data":428},[427],{"type":209},{},{"nodeType":100,"value":430,"marks":431,"data":432}," media query.\r",[],{},{"nodeType":434,"data":435,"content":436},"hr",{},[],{"nodeType":101,"data":438,"content":439},{},[440],{"nodeType":100,"value":441,"marks":442,"data":443},"For a working example, I created a CodePen below (with a few extra CSS properties) that I hope will help 🙂.",[],{},{"nodeType":101,"data":445,"content":446},{},[447,451,459],{"nodeType":100,"value":448,"marks":449,"data":450},"\r\n",[],{},{"nodeType":186,"data":452,"content":454},{"uri":453},"https://codepen.io/jackdomleo7/embed/jOWZRXX",[455],{"nodeType":100,"value":456,"marks":457,"data":458},"CodePen: hover: hover media query",[],{},{"nodeType":100,"value":195,"marks":460,"data":461},[],{},{"Asset":463},[139],{"sys":465,"total":20,"skip":37,"limit":20,"items":466},{"type":36},[467],{"fields":468,"sys":479},{"articleDisclaimer":469},{"data":470,"content":471,"nodeType":116},{},[472],{"data":473,"content":474,"nodeType":101},{},[475],{"data":476,"marks":477,"value":478,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":480,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":482,"total":150,"skip":37,"limit":483,"items":484,"includes":612},{"type":36},1000,[485,518,551,582],{"fields":486,"sys":516},{"title":487,"description":488,"image":489,"tags":512,"publishDate":514,"slug":515},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":490,"sys":493,"fields":503},{"tags":491,"concepts":492},[],[],{"space":494,"id":496,"type":13,"createdAt":497,"updatedAt":498,"environment":499,"publishedVersion":501,"revision":502,"locale":21},{"sys":495},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":500},{"id":17,"type":9,"linkType":18},9,2,{"title":504,"description":504,"file":505},"Pineapple",{"url":506,"details":507,"fileName":510,"contentType":511},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":508,"image":509},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg",[513],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":517,"type":47},"7CUW25a1jLiar8pzd8K9Nh",{"fields":519,"sys":549},{"title":520,"description":521,"image":522,"tags":543,"publishDate":547,"slug":548},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":523,"sys":526,"fields":534},{"tags":524,"concepts":525},[],[],{"space":527,"id":529,"type":13,"createdAt":530,"updatedAt":530,"environment":531,"publishedVersion":533,"revision":20,"locale":21},{"sys":528},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":532},{"id":17,"type":9,"linkType":18},7,{"title":535,"description":536,"file":537},"When is a clickable div okay","An example modal element",{"url":538,"details":539,"fileName":542,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":540,"image":541},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[544,545,546],"Accessibility","UX","HTML","2023-07-18","when-is-a-clickable-div-okay",{"id":550,"type":47},"brxitJC35PyChlVzusyLP",{"fields":552,"sys":580},{"title":553,"description":554,"image":555,"tags":575,"publishDate":578,"slug":579},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":556,"sys":559,"fields":566},{"tags":557,"concepts":558},[],[],{"space":560,"id":562,"type":13,"createdAt":563,"updatedAt":563,"environment":564,"publishedVersion":150,"revision":20,"locale":21},{"sys":561},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":565},{"id":17,"type":9,"linkType":18},{"title":567,"description":568,"file":569},"clutter","A cluttered office desk",{"url":570,"details":571,"fileName":574,"contentType":511},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":572,"image":573},281805,{"width":30,"height":31},"clutter.jpg",[576,577,546],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":581,"type":47},"9dijdAHS9ROnOwXit47NQ",{"fields":583,"sys":610},{"title":584,"description":585,"image":586,"tags":606,"publishDate":608,"slug":609},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":587,"sys":590,"fields":597},{"tags":588,"concepts":589},[],[],{"space":591,"id":593,"type":13,"createdAt":594,"updatedAt":594,"environment":595,"publishedVersion":533,"revision":20,"locale":21},{"sys":592},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":596},{"id":17,"type":9,"linkType":18},{"title":598,"description":599,"file":600},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":601,"details":602,"fileName":605,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":603,"image":604},6959,{"width":30,"height":31},"neumorphic-design-og.png",[607,163],"Design","2020-05-27","learning-neumorphic-design",{"id":611,"type":47},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":613},[614,522,489,555,586],{"metadata":615,"sys":618,"fields":623},{"tags":616,"concepts":617},[],[],{"space":619,"id":146,"type":13,"createdAt":147,"updatedAt":147,"environment":621,"publishedVersion":150,"revision":20,"locale":21},{"sys":620},{"type":9,"linkType":10,"id":11},{"sys":622},{"id":17,"type":9,"linkType":18},{"title":152,"description":153,"file":624},{"url":155,"details":625,"fileName":159,"contentType":33},{"size":157,"image":626},{"width":30,"height":31},1730509477487] \ No newline at end of file diff --git a/blog/2020/hover-css-media-query/index.html b/blog/2020/hover-css-media-query/index.html index 93052eddb..291f385af 100644 --- a/blog/2020/hover-css-media-query/index.html +++ b/blog/2020/hover-css-media-query/index.html @@ -23,7 +23,7 @@ - + @@ -187,5 +187,5 @@ opacity: 1; } }

Outside any media query, we define our base styles that apply to everything. Inside our hover media query, we define styles specific to devices with a hover input mechanism.

Can you see how this is better than determining hover-specific styles based on screen size?

It's also a cleaner method because we define our hover styles in our hover media query, it's grouped them nicely for us. These hover styles would be harder to identify in the stylesheet if they were encapsulated in a min-width media query.


For a working example, I created a CodePen below (with a few extra CSS properties) that I hope will help 🙂.

-

See the Pen hover: hover media query by @jackdomleo7 on CodePen

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

- \ No newline at end of file +

See the Pen hover: hover media query by @jackdomleo7 on CodePen

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

+ \ No newline at end of file diff --git a/blog/2020/learning-neumorphic-design/_payload.json b/blog/2020/learning-neumorphic-design/_payload.json index 0bf97cf53..bd6b9c446 100644 --- a/blog/2020/learning-neumorphic-design/_payload.json +++ b/blog/2020/learning-neumorphic-design/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":781},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-learning-neumorphic-design":117,"$rpzcfBTaqR":619,"article-list-learning-neumorphic-design":636},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":617},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"2KWdODn6oaRYNzG4Qz4yd3","2023-01-24T20:35:19.875Z","2023-01-24T20:40:12.164Z",{"sys":131},{"id":17,"type":9,"linkType":18},114,3,{"sys":135},{"type":9,"linkType":56,"id":136},"article",{"title":138,"slug":139,"image":140,"description":161,"publishDate":162,"tags":163,"body":166},"Learning Neumorphic Design","learning-neumorphic-design",{"metadata":141,"sys":144,"fields":152},{"tags":142,"concepts":143},[],[],{"space":145,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":149,"publishedVersion":151,"revision":20,"locale":21},{"sys":146},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":150},{"id":17,"type":9,"linkType":18},7,{"title":153,"description":154,"file":155},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":156,"details":157,"fileName":160,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":158,"image":159},6959,{"width":30,"height":31},"neumorphic-design-og.png","The awesome design trend that never took off! What are the fundamentals to neumorphic design?","2020-05-27",[164,165],"Design","CSS",{"nodeType":116,"data":167,"content":168},{},[169,177,184,203,210,217,282,289,318,325,332,340,357,374,381,397,404,411,418,425,432,450,482,499,514,531,537,544,551,568,575,582,589,596,603,610],{"nodeType":170,"data":171,"content":172},"heading-2",{},[173],{"nodeType":100,"value":174,"marks":175,"data":176},"What is neumorphic design?\r",[],{},{"nodeType":101,"data":178,"content":179},{},[180],{"nodeType":100,"value":181,"marks":182,"data":183},"Neumorphic design is a combination of skeuomorphic design and flat design. It gives a soft UI vibe with a 3D, nearly-realistic style by cleverly and carefully combining background colours, gradients, shapes, rounded edges and shadows. The design trend is made to feel like the elements are being pushed through and/or out of the page while being one with the background.",[],{},{"nodeType":101,"data":185,"content":186},{},[187,191,200],{"nodeType":100,"value":188,"marks":189,"data":190},"",[],{},{"nodeType":192,"data":193,"content":195},"hyperlink",{"uri":194},"https://codepen.io/jackdomleo7/embed/GRpaNGp",[196],{"nodeType":100,"value":197,"marks":198,"data":199},"CodePen: Neumorphic music player UI",[],{},{"nodeType":100,"value":188,"marks":201,"data":202},[],{},{"nodeType":101,"data":204,"content":205},{},[206],{"nodeType":100,"value":207,"marks":208,"data":209},"\r",[],{},{"nodeType":101,"data":211,"content":212},{},[213],{"nodeType":100,"value":214,"marks":215,"data":216},"Summarise neumorphic design in a few words:\r",[],{},{"nodeType":218,"data":219,"content":220},"unordered-list",{},[221,232,242,252,262,272],{"nodeType":222,"data":223,"content":224},"list-item",{},[225],{"nodeType":101,"data":226,"content":227},{},[228],{"nodeType":100,"value":229,"marks":230,"data":231},"Soft\r",[],{},{"nodeType":222,"data":233,"content":234},{},[235],{"nodeType":101,"data":236,"content":237},{},[238],{"nodeType":100,"value":239,"marks":240,"data":241},"Rounded\r",[],{},{"nodeType":222,"data":243,"content":244},{},[245],{"nodeType":101,"data":246,"content":247},{},[248],{"nodeType":100,"value":249,"marks":250,"data":251},"Smooth\r",[],{},{"nodeType":222,"data":253,"content":254},{},[255],{"nodeType":101,"data":256,"content":257},{},[258],{"nodeType":100,"value":259,"marks":260,"data":261},"Futuristic\r",[],{},{"nodeType":222,"data":263,"content":264},{},[265],{"nodeType":101,"data":266,"content":267},{},[268],{"nodeType":100,"value":269,"marks":270,"data":271},"Modern\r",[],{},{"nodeType":222,"data":273,"content":274},{},[275],{"nodeType":101,"data":276,"content":277},{},[278],{"nodeType":100,"value":279,"marks":280,"data":281},"Anti-accessible\r",[],{},{"nodeType":170,"data":283,"content":284},{},[285],{"nodeType":100,"value":286,"marks":287,"data":288},"Learning neumorphism\r",[],{},{"nodeType":101,"data":290,"content":291},{},[292,296,302,306,314],{"nodeType":100,"value":293,"marks":294,"data":295},"Learning neumorphism was quite difficult for me to begin with because I don't see myself as very design-minded (yet). I really struggled to get the CSS ",[],{},{"nodeType":100,"value":297,"marks":298,"data":301},"box-shadow",[299],{"type":300},"code",{},{"nodeType":100,"value":303,"marks":304,"data":305}," looking right. When I first came across neumorphic design, I was instantly hooked; I was searching ",[],{},{"nodeType":192,"data":307,"content":309},{"uri":308},"https://codepen.io/search/pens?q=neumorphic",[310],{"nodeType":100,"value":311,"marks":312,"data":313},"neumorphic on CodePen",[],{},{"nodeType":100,"value":315,"marks":316,"data":317},", I was searching [neumorphic on Google and was reading many articles on the topic. I find the aesthetics of neumorphic design so inviting to learn more about.\r",[],{},{"nodeType":170,"data":319,"content":320},{},[321],{"nodeType":100,"value":322,"marks":323,"data":324},"Themes\r",[],{},{"nodeType":101,"data":326,"content":327},{},[328],{"nodeType":100,"value":329,"marks":330,"data":331},"Neumorphic design has many themes to consider, I have listed some of the primary themes to kick-start your design.\r",[],{},{"nodeType":333,"data":334,"content":335},"heading-3",{},[336],{"nodeType":100,"value":337,"marks":338,"data":339},"Font\r",[],{},{"nodeType":101,"data":341,"content":342},{},[343,347,353],{"nodeType":100,"value":344,"marks":345,"data":346},"A theme of neumorphic design is roundness, so you should probably consider choosing a font with rounded letters. A rounded font will give your UI the ",[],{},{"nodeType":100,"value":348,"marks":349,"data":352},"soft",[350],{"type":351},"bold",{},{"nodeType":100,"value":354,"marks":355,"data":356}," vibe that comes with neumorphic design, rather than a sharp edge. To further explain this, I created a simple CodePen below:\r",[],{},{"nodeType":101,"data":358,"content":359},{},[360,363,371],{"nodeType":100,"value":188,"marks":361,"data":362},[],{},{"nodeType":192,"data":364,"content":366},{"uri":365},"https://codepen.io/jackdomleo7/embed/dyYEdPg",[367],{"nodeType":100,"value":368,"marks":369,"data":370},"CodePen: Choosing a neumorphic font-family",[],{},{"nodeType":100,"value":188,"marks":372,"data":373},[],{},{"nodeType":333,"data":375,"content":376},{},[377],{"nodeType":100,"value":378,"marks":379,"data":380},"Sizing\r",[],{},{"nodeType":101,"data":382,"content":383},{},[384,388,393],{"nodeType":100,"value":385,"marks":386,"data":387},"When considering sizing with neumorphic, you shouldn't look at it as \"Can a mouse click it?\" You should come from the angle of, \"Will my thumb be able to press it easily on mobile?\" With this in mind, it's natural to have ",[],{},{"nodeType":100,"value":389,"marks":390,"data":392},"larger components",[391],{"type":351},{},{"nodeType":100,"value":394,"marks":395,"data":396},".\r",[],{},{"nodeType":101,"data":398,"content":399},{},[400],{"nodeType":100,"value":401,"marks":402,"data":403},"Naturally, larger components will ultimately prevent you from creating small, cluttered and hard-to-read UIs. Think about padding. Neumorphism should allow for space and keep things distanced apart.\r",[],{},{"nodeType":333,"data":405,"content":406},{},[407],{"nodeType":100,"value":408,"marks":409,"data":410},"Colour\r",[],{},{"nodeType":101,"data":412,"content":413},{},[414],{"nodeType":100,"value":415,"marks":416,"data":417},"This is where your neumorphic design starts looking neumorphic. You should remember that the component and the background colour should be the same or very very similar.\r",[],{},{"nodeType":101,"data":419,"content":420},{},[421],{"nodeType":100,"value":422,"marks":423,"data":424},"It's OK to have components that contrast with the background, as long as the majority of your components blend in. It's also OK to have components that contrast with the background if you apply the shadows correctly...\r",[],{},{"nodeType":333,"data":426,"content":427},{},[428],{"nodeType":100,"value":429,"marks":430,"data":431},"Shadow\r",[],{},{"nodeType":101,"data":433,"content":434},{},[435,439,446],{"nodeType":100,"value":436,"marks":437,"data":438},"Save the best until last. Shadows. This needs to be right, I spent ages learning the complexes of the ",[],{},{"nodeType":192,"data":440,"content":442},{"uri":441},"https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow",[443],{"nodeType":100,"value":297,"marks":444,"data":445},[],{},{"nodeType":100,"value":447,"marks":448,"data":449}," CSS property. I played around with it by adding a shadow to an element, adding two shadows, three shadows, etc. You can't implement neumorphism effectively if you don't know about shadows.\r",[],{},{"nodeType":101,"data":451,"content":452},{},[453,457,461,465,470,474,478],{"nodeType":100,"value":454,"marks":455,"data":456},"Wait! Two shadows, three shadows? Yes. You can apply multiple shadows to a single CSS ",[],{},{"nodeType":100,"value":297,"marks":458,"data":460},[459],{"type":300},{},{"nodeType":100,"value":462,"marks":463,"data":464}," property. Although the R2-D2 below doesn't have anything to do with neumorphic design, it does demonstrate multiple shadows quite well. Below is a CodePen I created a while back of a pixel art R2-D2. It consists of a single ",[],{},{"nodeType":100,"value":466,"marks":467,"data":469},"\u003Cdiv>",[468],{"type":300},{},{"nodeType":100,"value":471,"marks":472,"data":473},", then a very long, but easy-to-understand ",[],{},{"nodeType":100,"value":297,"marks":475,"data":477},[476],{"type":300},{},{"nodeType":100,"value":479,"marks":480,"data":481}," CSS property.\r",[],{},{"nodeType":101,"data":483,"content":484},{},[485,488,496],{"nodeType":100,"value":188,"marks":486,"data":487},[],{},{"nodeType":192,"data":489,"content":491},{"uri":490},"https://codepen.io/jackdomleo7/embed/ZEEqdxy",[492],{"nodeType":100,"value":493,"marks":494,"data":495},"CodePen: Single Div Pixel Art R2-D2",[],{},{"nodeType":100,"value":188,"marks":497,"data":498},[],{},{"nodeType":101,"data":500,"content":501},{},[502,506,510],{"nodeType":100,"value":503,"marks":504,"data":505},"The trick to neumorphic design shadows is there are two shadows on your ",[],{},{"nodeType":100,"value":297,"marks":507,"data":509},[508],{"type":300},{},{"nodeType":100,"value":511,"marks":512,"data":513}," CSS property, one lighter shadow and one darker. Now imagine you have a light source in the top left-hand corner of your page shining from the top left to the bottom right. Since a theme of neumorphism is 3D, you need to think, \"Where will the shadow be?\" Here is a little CodePen I created to help explain it.",[],{},{"nodeType":101,"data":515,"content":516},{},[517,520,528],{"nodeType":100,"value":188,"marks":518,"data":519},[],{},{"nodeType":192,"data":521,"content":523},{"uri":522},"https://codepen.io/jackdomleo7/embed/yLYWqoQ",[524],{"nodeType":100,"value":525,"marks":526,"data":527},"CodePen: Understanding neumorphic design shadows",[],{},{"nodeType":100,"value":188,"marks":529,"data":530},[],{},{"nodeType":101,"data":532,"content":533},{},[534],{"nodeType":100,"value":207,"marks":535,"data":536},[],{},{"nodeType":170,"data":538,"content":539},{},[540],{"nodeType":100,"value":541,"marks":542,"data":543},"Put it all together",[],{},{"nodeType":101,"data":545,"content":546},{},[547],{"nodeType":100,"value":548,"marks":549,"data":550},"When you combine all these themes, ideas, tips and tricks, you can end up with a nice set of components for your design system.\r",[],{},{"nodeType":101,"data":552,"content":553},{},[554,557,565],{"nodeType":100,"value":188,"marks":555,"data":556},[],{},{"nodeType":192,"data":558,"content":560},{"uri":559},"https://codepen.io/jackdomleo7/embed/mdeowoz",[561],{"nodeType":100,"value":562,"marks":563,"data":564},"CodePen: Neumorphic Design Elements",[],{},{"nodeType":100,"value":188,"marks":566,"data":567},[],{},{"nodeType":170,"data":569,"content":570},{},[571],{"nodeType":100,"value":572,"marks":573,"data":574},"When not to use neumorphic design?\r",[],{},{"nodeType":101,"data":576,"content":577},{},[578],{"nodeType":100,"value":579,"marks":580,"data":581},"Neumorphic design became a big trend in early 2020 but was quickly discarded.\r",[],{},{"nodeType":101,"data":583,"content":584},{},[585],{"nodeType":100,"value":586,"marks":587,"data":588},"Neumorphic design became popular for its sexiness. It brought a really nice, Futuristic, 3D-like design to the UI and I have to admit, I do love how it looks. But good UI/UX design in 2020, it's not all about good looks, it needs to be as equally accessible as it is sexy.\r",[],{},{"nodeType":101,"data":590,"content":591},{},[592],{"nodeType":100,"value":593,"marks":594,"data":595},"Neumorphic design lacks colour contrast since an element's background colour should be the same or very similar to the background it sits on to look neumorphic, this makes it difficult for some users to see, therefore making it difficult for them to use your website or application.\r",[],{},{"nodeType":101,"data":597,"content":598},{},[599],{"nodeType":100,"value":600,"marks":601,"data":602},"There are ways around this if you really want to include neumorphic design; you could learn about implementing different themes and offer a \"high contrast\" theme. The high contrast theme wouldn't be neumorphic but at least you're giving user's the option of what vibe they want or need.",[],{},{"nodeType":101,"data":604,"content":605},{},[606],{"nodeType":100,"value":607,"marks":608,"data":609},"In other words, neumorphic is only useful for demonstrations, much like this one and should ideally never be used in the real world.",[],{},{"nodeType":101,"data":611,"content":612},{},[613],{"nodeType":100,"value":614,"marks":615,"data":616},"I had fun learning about neumorphic design, but I feel this is where I part ways with it and never touch on it again.",[],{},{"Asset":618},[140],{"sys":620,"total":20,"skip":37,"limit":20,"items":621},{"type":36},[622],{"fields":623,"sys":634},{"articleDisclaimer":624},{"data":625,"content":626,"nodeType":116},{},[627],{"data":628,"content":629,"nodeType":101},{},[630],{"data":631,"marks":632,"value":633,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":635,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":637,"total":638,"skip":37,"limit":639,"items":640,"includes":766},{"type":36},5,1000,[641,674,706,737],{"fields":642,"sys":672},{"title":643,"description":644,"image":645,"tags":668,"publishDate":670,"slug":671},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":646,"sys":649,"fields":659},{"tags":647,"concepts":648},[],[],{"space":650,"id":652,"type":13,"createdAt":653,"updatedAt":654,"environment":655,"publishedVersion":657,"revision":658,"locale":21},{"sys":651},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":656},{"id":17,"type":9,"linkType":18},9,2,{"title":660,"description":660,"file":661},"Pineapple",{"url":662,"details":663,"fileName":666,"contentType":667},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":664,"image":665},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg",[669],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":673,"type":47},"7CUW25a1jLiar8pzd8K9Nh",{"fields":675,"sys":704},{"title":676,"description":677,"image":678,"tags":698,"publishDate":702,"slug":703},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":679,"sys":682,"fields":689},{"tags":680,"concepts":681},[],[],{"space":683,"id":685,"type":13,"createdAt":686,"updatedAt":686,"environment":687,"publishedVersion":151,"revision":20,"locale":21},{"sys":684},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":688},{"id":17,"type":9,"linkType":18},{"title":690,"description":691,"file":692},"When is a clickable div okay","An example modal element",{"url":693,"details":694,"fileName":697,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":695,"image":696},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[699,700,701],"Accessibility","UX","HTML","2023-07-18","when-is-a-clickable-div-okay",{"id":705,"type":47},"brxitJC35PyChlVzusyLP",{"fields":707,"sys":735},{"title":708,"description":709,"image":710,"tags":730,"publishDate":733,"slug":734},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":711,"sys":714,"fields":721},{"tags":712,"concepts":713},[],[],{"space":715,"id":717,"type":13,"createdAt":718,"updatedAt":718,"environment":719,"publishedVersion":638,"revision":20,"locale":21},{"sys":716},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":720},{"id":17,"type":9,"linkType":18},{"title":722,"description":723,"file":724},"clutter","A cluttered office desk",{"url":725,"details":726,"fileName":729,"contentType":667},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":727,"image":728},281805,{"width":30,"height":31},"clutter.jpg",[731,732,701],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":736,"type":47},"9dijdAHS9ROnOwXit47NQ",{"fields":738,"sys":764},{"title":739,"description":740,"image":741,"tags":761,"publishDate":762,"slug":763},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":742,"sys":745,"fields":752},{"tags":743,"concepts":744},[],[],{"space":746,"id":748,"type":13,"createdAt":749,"updatedAt":749,"environment":750,"publishedVersion":638,"revision":20,"locale":21},{"sys":747},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":751},{"id":17,"type":9,"linkType":18},{"title":753,"description":754,"file":755},"css=hover-media-query-og","CSS media query for hover",{"url":756,"details":757,"fileName":760,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":758,"image":759},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[165],"2020-07-06","hover-css-media-query",{"id":765,"type":47},"5GKjEQKbXAneX7HsUv1qtm",{"Asset":767},[741,678,645,710,768],{"metadata":769,"sys":772,"fields":777},{"tags":770,"concepts":771},[],[],{"space":773,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":775,"publishedVersion":151,"revision":20,"locale":21},{"sys":774},{"type":9,"linkType":10,"id":11},{"sys":776},{"id":17,"type":9,"linkType":18},{"title":153,"description":154,"file":778},{"url":156,"details":779,"fileName":160,"contentType":33},{"size":158,"image":780},{"width":30,"height":31},1730423475331] \ No newline at end of file +[{"data":1,"prerenderedAt":781},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-learning-neumorphic-design":117,"$rpzcfBTaqR":619,"article-list-learning-neumorphic-design":636},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":617},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"2KWdODn6oaRYNzG4Qz4yd3","2023-01-24T20:35:19.875Z","2023-01-24T20:40:12.164Z",{"sys":131},{"id":17,"type":9,"linkType":18},114,3,{"sys":135},{"type":9,"linkType":56,"id":136},"article",{"title":138,"slug":139,"image":140,"description":161,"publishDate":162,"tags":163,"body":166},"Learning Neumorphic Design","learning-neumorphic-design",{"metadata":141,"sys":144,"fields":152},{"tags":142,"concepts":143},[],[],{"space":145,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":149,"publishedVersion":151,"revision":20,"locale":21},{"sys":146},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":150},{"id":17,"type":9,"linkType":18},7,{"title":153,"description":154,"file":155},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":156,"details":157,"fileName":160,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":158,"image":159},6959,{"width":30,"height":31},"neumorphic-design-og.png","The awesome design trend that never took off! What are the fundamentals to neumorphic design?","2020-05-27",[164,165],"Design","CSS",{"nodeType":116,"data":167,"content":168},{},[169,177,184,203,210,217,282,289,318,325,332,340,357,374,381,397,404,411,418,425,432,450,482,499,514,531,537,544,551,568,575,582,589,596,603,610],{"nodeType":170,"data":171,"content":172},"heading-2",{},[173],{"nodeType":100,"value":174,"marks":175,"data":176},"What is neumorphic design?\r",[],{},{"nodeType":101,"data":178,"content":179},{},[180],{"nodeType":100,"value":181,"marks":182,"data":183},"Neumorphic design is a combination of skeuomorphic design and flat design. It gives a soft UI vibe with a 3D, nearly-realistic style by cleverly and carefully combining background colours, gradients, shapes, rounded edges and shadows. The design trend is made to feel like the elements are being pushed through and/or out of the page while being one with the background.",[],{},{"nodeType":101,"data":185,"content":186},{},[187,191,200],{"nodeType":100,"value":188,"marks":189,"data":190},"",[],{},{"nodeType":192,"data":193,"content":195},"hyperlink",{"uri":194},"https://codepen.io/jackdomleo7/embed/GRpaNGp",[196],{"nodeType":100,"value":197,"marks":198,"data":199},"CodePen: Neumorphic music player UI",[],{},{"nodeType":100,"value":188,"marks":201,"data":202},[],{},{"nodeType":101,"data":204,"content":205},{},[206],{"nodeType":100,"value":207,"marks":208,"data":209},"\r",[],{},{"nodeType":101,"data":211,"content":212},{},[213],{"nodeType":100,"value":214,"marks":215,"data":216},"Summarise neumorphic design in a few words:\r",[],{},{"nodeType":218,"data":219,"content":220},"unordered-list",{},[221,232,242,252,262,272],{"nodeType":222,"data":223,"content":224},"list-item",{},[225],{"nodeType":101,"data":226,"content":227},{},[228],{"nodeType":100,"value":229,"marks":230,"data":231},"Soft\r",[],{},{"nodeType":222,"data":233,"content":234},{},[235],{"nodeType":101,"data":236,"content":237},{},[238],{"nodeType":100,"value":239,"marks":240,"data":241},"Rounded\r",[],{},{"nodeType":222,"data":243,"content":244},{},[245],{"nodeType":101,"data":246,"content":247},{},[248],{"nodeType":100,"value":249,"marks":250,"data":251},"Smooth\r",[],{},{"nodeType":222,"data":253,"content":254},{},[255],{"nodeType":101,"data":256,"content":257},{},[258],{"nodeType":100,"value":259,"marks":260,"data":261},"Futuristic\r",[],{},{"nodeType":222,"data":263,"content":264},{},[265],{"nodeType":101,"data":266,"content":267},{},[268],{"nodeType":100,"value":269,"marks":270,"data":271},"Modern\r",[],{},{"nodeType":222,"data":273,"content":274},{},[275],{"nodeType":101,"data":276,"content":277},{},[278],{"nodeType":100,"value":279,"marks":280,"data":281},"Anti-accessible\r",[],{},{"nodeType":170,"data":283,"content":284},{},[285],{"nodeType":100,"value":286,"marks":287,"data":288},"Learning neumorphism\r",[],{},{"nodeType":101,"data":290,"content":291},{},[292,296,302,306,314],{"nodeType":100,"value":293,"marks":294,"data":295},"Learning neumorphism was quite difficult for me to begin with because I don't see myself as very design-minded (yet). I really struggled to get the CSS ",[],{},{"nodeType":100,"value":297,"marks":298,"data":301},"box-shadow",[299],{"type":300},"code",{},{"nodeType":100,"value":303,"marks":304,"data":305}," looking right. When I first came across neumorphic design, I was instantly hooked; I was searching ",[],{},{"nodeType":192,"data":307,"content":309},{"uri":308},"https://codepen.io/search/pens?q=neumorphic",[310],{"nodeType":100,"value":311,"marks":312,"data":313},"neumorphic on CodePen",[],{},{"nodeType":100,"value":315,"marks":316,"data":317},", I was searching [neumorphic on Google and was reading many articles on the topic. I find the aesthetics of neumorphic design so inviting to learn more about.\r",[],{},{"nodeType":170,"data":319,"content":320},{},[321],{"nodeType":100,"value":322,"marks":323,"data":324},"Themes\r",[],{},{"nodeType":101,"data":326,"content":327},{},[328],{"nodeType":100,"value":329,"marks":330,"data":331},"Neumorphic design has many themes to consider, I have listed some of the primary themes to kick-start your design.\r",[],{},{"nodeType":333,"data":334,"content":335},"heading-3",{},[336],{"nodeType":100,"value":337,"marks":338,"data":339},"Font\r",[],{},{"nodeType":101,"data":341,"content":342},{},[343,347,353],{"nodeType":100,"value":344,"marks":345,"data":346},"A theme of neumorphic design is roundness, so you should probably consider choosing a font with rounded letters. A rounded font will give your UI the ",[],{},{"nodeType":100,"value":348,"marks":349,"data":352},"soft",[350],{"type":351},"bold",{},{"nodeType":100,"value":354,"marks":355,"data":356}," vibe that comes with neumorphic design, rather than a sharp edge. To further explain this, I created a simple CodePen below:\r",[],{},{"nodeType":101,"data":358,"content":359},{},[360,363,371],{"nodeType":100,"value":188,"marks":361,"data":362},[],{},{"nodeType":192,"data":364,"content":366},{"uri":365},"https://codepen.io/jackdomleo7/embed/dyYEdPg",[367],{"nodeType":100,"value":368,"marks":369,"data":370},"CodePen: Choosing a neumorphic font-family",[],{},{"nodeType":100,"value":188,"marks":372,"data":373},[],{},{"nodeType":333,"data":375,"content":376},{},[377],{"nodeType":100,"value":378,"marks":379,"data":380},"Sizing\r",[],{},{"nodeType":101,"data":382,"content":383},{},[384,388,393],{"nodeType":100,"value":385,"marks":386,"data":387},"When considering sizing with neumorphic, you shouldn't look at it as \"Can a mouse click it?\" You should come from the angle of, \"Will my thumb be able to press it easily on mobile?\" With this in mind, it's natural to have ",[],{},{"nodeType":100,"value":389,"marks":390,"data":392},"larger components",[391],{"type":351},{},{"nodeType":100,"value":394,"marks":395,"data":396},".\r",[],{},{"nodeType":101,"data":398,"content":399},{},[400],{"nodeType":100,"value":401,"marks":402,"data":403},"Naturally, larger components will ultimately prevent you from creating small, cluttered and hard-to-read UIs. Think about padding. Neumorphism should allow for space and keep things distanced apart.\r",[],{},{"nodeType":333,"data":405,"content":406},{},[407],{"nodeType":100,"value":408,"marks":409,"data":410},"Colour\r",[],{},{"nodeType":101,"data":412,"content":413},{},[414],{"nodeType":100,"value":415,"marks":416,"data":417},"This is where your neumorphic design starts looking neumorphic. You should remember that the component and the background colour should be the same or very very similar.\r",[],{},{"nodeType":101,"data":419,"content":420},{},[421],{"nodeType":100,"value":422,"marks":423,"data":424},"It's OK to have components that contrast with the background, as long as the majority of your components blend in. It's also OK to have components that contrast with the background if you apply the shadows correctly...\r",[],{},{"nodeType":333,"data":426,"content":427},{},[428],{"nodeType":100,"value":429,"marks":430,"data":431},"Shadow\r",[],{},{"nodeType":101,"data":433,"content":434},{},[435,439,446],{"nodeType":100,"value":436,"marks":437,"data":438},"Save the best until last. Shadows. This needs to be right, I spent ages learning the complexes of the ",[],{},{"nodeType":192,"data":440,"content":442},{"uri":441},"https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow",[443],{"nodeType":100,"value":297,"marks":444,"data":445},[],{},{"nodeType":100,"value":447,"marks":448,"data":449}," CSS property. I played around with it by adding a shadow to an element, adding two shadows, three shadows, etc. You can't implement neumorphism effectively if you don't know about shadows.\r",[],{},{"nodeType":101,"data":451,"content":452},{},[453,457,461,465,470,474,478],{"nodeType":100,"value":454,"marks":455,"data":456},"Wait! Two shadows, three shadows? Yes. You can apply multiple shadows to a single CSS ",[],{},{"nodeType":100,"value":297,"marks":458,"data":460},[459],{"type":300},{},{"nodeType":100,"value":462,"marks":463,"data":464}," property. Although the R2-D2 below doesn't have anything to do with neumorphic design, it does demonstrate multiple shadows quite well. Below is a CodePen I created a while back of a pixel art R2-D2. It consists of a single ",[],{},{"nodeType":100,"value":466,"marks":467,"data":469},"\u003Cdiv>",[468],{"type":300},{},{"nodeType":100,"value":471,"marks":472,"data":473},", then a very long, but easy-to-understand ",[],{},{"nodeType":100,"value":297,"marks":475,"data":477},[476],{"type":300},{},{"nodeType":100,"value":479,"marks":480,"data":481}," CSS property.\r",[],{},{"nodeType":101,"data":483,"content":484},{},[485,488,496],{"nodeType":100,"value":188,"marks":486,"data":487},[],{},{"nodeType":192,"data":489,"content":491},{"uri":490},"https://codepen.io/jackdomleo7/embed/ZEEqdxy",[492],{"nodeType":100,"value":493,"marks":494,"data":495},"CodePen: Single Div Pixel Art R2-D2",[],{},{"nodeType":100,"value":188,"marks":497,"data":498},[],{},{"nodeType":101,"data":500,"content":501},{},[502,506,510],{"nodeType":100,"value":503,"marks":504,"data":505},"The trick to neumorphic design shadows is there are two shadows on your ",[],{},{"nodeType":100,"value":297,"marks":507,"data":509},[508],{"type":300},{},{"nodeType":100,"value":511,"marks":512,"data":513}," CSS property, one lighter shadow and one darker. Now imagine you have a light source in the top left-hand corner of your page shining from the top left to the bottom right. Since a theme of neumorphism is 3D, you need to think, \"Where will the shadow be?\" Here is a little CodePen I created to help explain it.",[],{},{"nodeType":101,"data":515,"content":516},{},[517,520,528],{"nodeType":100,"value":188,"marks":518,"data":519},[],{},{"nodeType":192,"data":521,"content":523},{"uri":522},"https://codepen.io/jackdomleo7/embed/yLYWqoQ",[524],{"nodeType":100,"value":525,"marks":526,"data":527},"CodePen: Understanding neumorphic design shadows",[],{},{"nodeType":100,"value":188,"marks":529,"data":530},[],{},{"nodeType":101,"data":532,"content":533},{},[534],{"nodeType":100,"value":207,"marks":535,"data":536},[],{},{"nodeType":170,"data":538,"content":539},{},[540],{"nodeType":100,"value":541,"marks":542,"data":543},"Put it all together",[],{},{"nodeType":101,"data":545,"content":546},{},[547],{"nodeType":100,"value":548,"marks":549,"data":550},"When you combine all these themes, ideas, tips and tricks, you can end up with a nice set of components for your design system.\r",[],{},{"nodeType":101,"data":552,"content":553},{},[554,557,565],{"nodeType":100,"value":188,"marks":555,"data":556},[],{},{"nodeType":192,"data":558,"content":560},{"uri":559},"https://codepen.io/jackdomleo7/embed/mdeowoz",[561],{"nodeType":100,"value":562,"marks":563,"data":564},"CodePen: Neumorphic Design Elements",[],{},{"nodeType":100,"value":188,"marks":566,"data":567},[],{},{"nodeType":170,"data":569,"content":570},{},[571],{"nodeType":100,"value":572,"marks":573,"data":574},"When not to use neumorphic design?\r",[],{},{"nodeType":101,"data":576,"content":577},{},[578],{"nodeType":100,"value":579,"marks":580,"data":581},"Neumorphic design became a big trend in early 2020 but was quickly discarded.\r",[],{},{"nodeType":101,"data":583,"content":584},{},[585],{"nodeType":100,"value":586,"marks":587,"data":588},"Neumorphic design became popular for its sexiness. It brought a really nice, Futuristic, 3D-like design to the UI and I have to admit, I do love how it looks. But good UI/UX design in 2020, it's not all about good looks, it needs to be as equally accessible as it is sexy.\r",[],{},{"nodeType":101,"data":590,"content":591},{},[592],{"nodeType":100,"value":593,"marks":594,"data":595},"Neumorphic design lacks colour contrast since an element's background colour should be the same or very similar to the background it sits on to look neumorphic, this makes it difficult for some users to see, therefore making it difficult for them to use your website or application.\r",[],{},{"nodeType":101,"data":597,"content":598},{},[599],{"nodeType":100,"value":600,"marks":601,"data":602},"There are ways around this if you really want to include neumorphic design; you could learn about implementing different themes and offer a \"high contrast\" theme. The high contrast theme wouldn't be neumorphic but at least you're giving user's the option of what vibe they want or need.",[],{},{"nodeType":101,"data":604,"content":605},{},[606],{"nodeType":100,"value":607,"marks":608,"data":609},"In other words, neumorphic is only useful for demonstrations, much like this one and should ideally never be used in the real world.",[],{},{"nodeType":101,"data":611,"content":612},{},[613],{"nodeType":100,"value":614,"marks":615,"data":616},"I had fun learning about neumorphic design, but I feel this is where I part ways with it and never touch on it again.",[],{},{"Asset":618},[140],{"sys":620,"total":20,"skip":37,"limit":20,"items":621},{"type":36},[622],{"fields":623,"sys":634},{"articleDisclaimer":624},{"data":625,"content":626,"nodeType":116},{},[627],{"data":628,"content":629,"nodeType":101},{},[630],{"data":631,"marks":632,"value":633,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":635,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":637,"total":638,"skip":37,"limit":639,"items":640,"includes":766},{"type":36},5,1000,[641,674,706,737],{"fields":642,"sys":672},{"title":643,"description":644,"image":645,"tags":668,"publishDate":670,"slug":671},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":646,"sys":649,"fields":659},{"tags":647,"concepts":648},[],[],{"space":650,"id":652,"type":13,"createdAt":653,"updatedAt":654,"environment":655,"publishedVersion":657,"revision":658,"locale":21},{"sys":651},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":656},{"id":17,"type":9,"linkType":18},9,2,{"title":660,"description":660,"file":661},"Pineapple",{"url":662,"details":663,"fileName":666,"contentType":667},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":664,"image":665},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg",[669],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":673,"type":47},"7CUW25a1jLiar8pzd8K9Nh",{"fields":675,"sys":704},{"title":676,"description":677,"image":678,"tags":698,"publishDate":702,"slug":703},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":679,"sys":682,"fields":689},{"tags":680,"concepts":681},[],[],{"space":683,"id":685,"type":13,"createdAt":686,"updatedAt":686,"environment":687,"publishedVersion":151,"revision":20,"locale":21},{"sys":684},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":688},{"id":17,"type":9,"linkType":18},{"title":690,"description":691,"file":692},"When is a clickable div okay","An example modal element",{"url":693,"details":694,"fileName":697,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":695,"image":696},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[699,700,701],"Accessibility","UX","HTML","2023-07-18","when-is-a-clickable-div-okay",{"id":705,"type":47},"brxitJC35PyChlVzusyLP",{"fields":707,"sys":735},{"title":708,"description":709,"image":710,"tags":730,"publishDate":733,"slug":734},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":711,"sys":714,"fields":721},{"tags":712,"concepts":713},[],[],{"space":715,"id":717,"type":13,"createdAt":718,"updatedAt":718,"environment":719,"publishedVersion":638,"revision":20,"locale":21},{"sys":716},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":720},{"id":17,"type":9,"linkType":18},{"title":722,"description":723,"file":724},"clutter","A cluttered office desk",{"url":725,"details":726,"fileName":729,"contentType":667},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":727,"image":728},281805,{"width":30,"height":31},"clutter.jpg",[731,732,701],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":736,"type":47},"9dijdAHS9ROnOwXit47NQ",{"fields":738,"sys":764},{"title":739,"description":740,"image":741,"tags":761,"publishDate":762,"slug":763},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":742,"sys":745,"fields":752},{"tags":743,"concepts":744},[],[],{"space":746,"id":748,"type":13,"createdAt":749,"updatedAt":749,"environment":750,"publishedVersion":638,"revision":20,"locale":21},{"sys":747},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":751},{"id":17,"type":9,"linkType":18},{"title":753,"description":754,"file":755},"css=hover-media-query-og","CSS media query for hover",{"url":756,"details":757,"fileName":760,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":758,"image":759},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[165],"2020-07-06","hover-css-media-query",{"id":765,"type":47},"5GKjEQKbXAneX7HsUv1qtm",{"Asset":767},[741,678,645,710,768],{"metadata":769,"sys":772,"fields":777},{"tags":770,"concepts":771},[],[],{"space":773,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":775,"publishedVersion":151,"revision":20,"locale":21},{"sys":774},{"type":9,"linkType":10,"id":11},{"sys":776},{"id":17,"type":9,"linkType":18},{"title":153,"description":154,"file":778},{"url":156,"details":779,"fileName":160,"contentType":33},{"size":158,"image":780},{"width":30,"height":31},1730509477487] \ No newline at end of file diff --git a/blog/2020/learning-neumorphic-design/index.html b/blog/2020/learning-neumorphic-design/index.html index 8196fd4ba..5dfa21e10 100644 --- a/blog/2020/learning-neumorphic-design/index.html +++ b/blog/2020/learning-neumorphic-design/index.html @@ -23,7 +23,7 @@ - + @@ -83,5 +83,5 @@ -

Learning Neumorphic Design

A music player UI with a neumorphism design

What is neumorphic design?

Neumorphic design is a combination of skeuomorphic design and flat design. It gives a soft UI vibe with a 3D, nearly-realistic style by cleverly and carefully combining background colours, gradients, shapes, rounded edges and shadows. The design trend is made to feel like the elements are being pushed through and/or out of the page while being one with the background.

See the Pen Neumorphic music player UI by @jackdomleo7 on CodePen

Summarise neumorphic design in a few words:

  • Soft

  • Rounded

  • Smooth

  • Futuristic

  • Modern

  • Anti-accessible

Learning neumorphism

Learning neumorphism was quite difficult for me to begin with because I don't see myself as very design-minded (yet). I really struggled to get the CSS box-shadow looking right. When I first came across neumorphic design, I was instantly hooked; I was searching neumorphic on CodePen, I was searching [neumorphic on Google and was reading many articles on the topic. I find the aesthetics of neumorphic design so inviting to learn more about.

Themes

Neumorphic design has many themes to consider, I have listed some of the primary themes to kick-start your design.

Font

A theme of neumorphic design is roundness, so you should probably consider choosing a font with rounded letters. A rounded font will give your UI the soft vibe that comes with neumorphic design, rather than a sharp edge. To further explain this, I created a simple CodePen below:

See the Pen Choosing a neumorphic font-family by @jackdomleo7 on CodePen

Sizing

When considering sizing with neumorphic, you shouldn't look at it as "Can a mouse click it?" You should come from the angle of, "Will my thumb be able to press it easily on mobile?" With this in mind, it's natural to have larger components.

Naturally, larger components will ultimately prevent you from creating small, cluttered and hard-to-read UIs. Think about padding. Neumorphism should allow for space and keep things distanced apart.

Colour

This is where your neumorphic design starts looking neumorphic. You should remember that the component and the background colour should be the same or very very similar.

It's OK to have components that contrast with the background, as long as the majority of your components blend in. It's also OK to have components that contrast with the background if you apply the shadows correctly...

Shadow

Save the best until last. Shadows. This needs to be right, I spent ages learning the complexes of the box-shadow CSS property. I played around with it by adding a shadow to an element, adding two shadows, three shadows, etc. You can't implement neumorphism effectively if you don't know about shadows.

Wait! Two shadows, three shadows? Yes. You can apply multiple shadows to a single CSS box-shadow property. Although the R2-D2 below doesn't have anything to do with neumorphic design, it does demonstrate multiple shadows quite well. Below is a CodePen I created a while back of a pixel art R2-D2. It consists of a single <div>, then a very long, but easy-to-understand box-shadow CSS property.

See the Pen Single Div Pixel Art R2-D2 by @jackdomleo7 on CodePen

The trick to neumorphic design shadows is there are two shadows on your box-shadow CSS property, one lighter shadow and one darker. Now imagine you have a light source in the top left-hand corner of your page shining from the top left to the bottom right. Since a theme of neumorphism is 3D, you need to think, "Where will the shadow be?" Here is a little CodePen I created to help explain it.

See the Pen Understanding neumorphic design shadows by @jackdomleo7 on CodePen

Put it all together

When you combine all these themes, ideas, tips and tricks, you can end up with a nice set of components for your design system.

See the Pen Neumorphic Design Elements by @jackdomleo7 on CodePen

When not to use neumorphic design?

Neumorphic design became a big trend in early 2020 but was quickly discarded.

Neumorphic design became popular for its sexiness. It brought a really nice, Futuristic, 3D-like design to the UI and I have to admit, I do love how it looks. But good UI/UX design in 2020, it's not all about good looks, it needs to be as equally accessible as it is sexy.

Neumorphic design lacks colour contrast since an element's background colour should be the same or very similar to the background it sits on to look neumorphic, this makes it difficult for some users to see, therefore making it difficult for them to use your website or application.

There are ways around this if you really want to include neumorphic design; you could learn about implementing different themes and offer a "high contrast" theme. The high contrast theme wouldn't be neumorphic but at least you're giving user's the option of what vibe they want or need.

In other words, neumorphic is only useful for demonstrations, much like this one and should ideally never be used in the real world.

I had fun learning about neumorphic design, but I feel this is where I part ways with it and never touch on it again.

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

- \ No newline at end of file +

Learning Neumorphic Design

A music player UI with a neumorphism design

What is neumorphic design?

Neumorphic design is a combination of skeuomorphic design and flat design. It gives a soft UI vibe with a 3D, nearly-realistic style by cleverly and carefully combining background colours, gradients, shapes, rounded edges and shadows. The design trend is made to feel like the elements are being pushed through and/or out of the page while being one with the background.

See the Pen Neumorphic music player UI by @jackdomleo7 on CodePen

Summarise neumorphic design in a few words:

  • Soft

  • Rounded

  • Smooth

  • Futuristic

  • Modern

  • Anti-accessible

Learning neumorphism

Learning neumorphism was quite difficult for me to begin with because I don't see myself as very design-minded (yet). I really struggled to get the CSS box-shadow looking right. When I first came across neumorphic design, I was instantly hooked; I was searching neumorphic on CodePen, I was searching [neumorphic on Google and was reading many articles on the topic. I find the aesthetics of neumorphic design so inviting to learn more about.

Themes

Neumorphic design has many themes to consider, I have listed some of the primary themes to kick-start your design.

Font

A theme of neumorphic design is roundness, so you should probably consider choosing a font with rounded letters. A rounded font will give your UI the soft vibe that comes with neumorphic design, rather than a sharp edge. To further explain this, I created a simple CodePen below:

See the Pen Choosing a neumorphic font-family by @jackdomleo7 on CodePen

Sizing

When considering sizing with neumorphic, you shouldn't look at it as "Can a mouse click it?" You should come from the angle of, "Will my thumb be able to press it easily on mobile?" With this in mind, it's natural to have larger components.

Naturally, larger components will ultimately prevent you from creating small, cluttered and hard-to-read UIs. Think about padding. Neumorphism should allow for space and keep things distanced apart.

Colour

This is where your neumorphic design starts looking neumorphic. You should remember that the component and the background colour should be the same or very very similar.

It's OK to have components that contrast with the background, as long as the majority of your components blend in. It's also OK to have components that contrast with the background if you apply the shadows correctly...

Shadow

Save the best until last. Shadows. This needs to be right, I spent ages learning the complexes of the box-shadow CSS property. I played around with it by adding a shadow to an element, adding two shadows, three shadows, etc. You can't implement neumorphism effectively if you don't know about shadows.

Wait! Two shadows, three shadows? Yes. You can apply multiple shadows to a single CSS box-shadow property. Although the R2-D2 below doesn't have anything to do with neumorphic design, it does demonstrate multiple shadows quite well. Below is a CodePen I created a while back of a pixel art R2-D2. It consists of a single <div>, then a very long, but easy-to-understand box-shadow CSS property.

See the Pen Single Div Pixel Art R2-D2 by @jackdomleo7 on CodePen

The trick to neumorphic design shadows is there are two shadows on your box-shadow CSS property, one lighter shadow and one darker. Now imagine you have a light source in the top left-hand corner of your page shining from the top left to the bottom right. Since a theme of neumorphism is 3D, you need to think, "Where will the shadow be?" Here is a little CodePen I created to help explain it.

See the Pen Understanding neumorphic design shadows by @jackdomleo7 on CodePen

Put it all together

When you combine all these themes, ideas, tips and tricks, you can end up with a nice set of components for your design system.

See the Pen Neumorphic Design Elements by @jackdomleo7 on CodePen

When not to use neumorphic design?

Neumorphic design became a big trend in early 2020 but was quickly discarded.

Neumorphic design became popular for its sexiness. It brought a really nice, Futuristic, 3D-like design to the UI and I have to admit, I do love how it looks. But good UI/UX design in 2020, it's not all about good looks, it needs to be as equally accessible as it is sexy.

Neumorphic design lacks colour contrast since an element's background colour should be the same or very similar to the background it sits on to look neumorphic, this makes it difficult for some users to see, therefore making it difficult for them to use your website or application.

There are ways around this if you really want to include neumorphic design; you could learn about implementing different themes and offer a "high contrast" theme. The high contrast theme wouldn't be neumorphic but at least you're giving user's the option of what vibe they want or need.

In other words, neumorphic is only useful for demonstrations, much like this one and should ideally never be used in the real world.

I had fun learning about neumorphic design, but I feel this is where I part ways with it and never touch on it again.

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

+ \ No newline at end of file diff --git a/blog/2023/should-you-clean-out-your-blog/_payload.json b/blog/2023/should-you-clean-out-your-blog/_payload.json index 3af31032b..f7784518c 100644 --- a/blog/2023/should-you-clean-out-your-blog/_payload.json +++ b/blog/2023/should-you-clean-out-your-blog/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":935},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-should-you-clean-out-your-blog":117,"$rpzcfBTaqR":775,"article-list-should-you-clean-out-your-blog":792},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":773},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"9dijdAHS9ROnOwXit47NQ","2023-02-16T21:37:49.894Z","2024-04-30T18:50:28.239Z",{"sys":131},{"id":17,"type":9,"linkType":18},734,6,{"sys":135},{"type":9,"linkType":56,"id":136},"article",{"title":138,"slug":139,"image":140,"description":162,"publishDate":163,"tags":164,"body":168},"Should you clean out your blog?","should-you-clean-out-your-blog",{"metadata":141,"sys":144,"fields":152},{"tags":142,"concepts":143},[],[],{"space":145,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":149,"publishedVersion":151,"revision":20,"locale":21},{"sys":146},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":150},{"id":17,"type":9,"linkType":18},5,{"title":153,"description":154,"file":155},"clutter","A cluttered office desk",{"url":156,"details":157,"fileName":160,"contentType":161},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":158,"image":159},281805,{"width":30,"height":31},"clutter.jpg","image/jpeg","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.","2023-02-16",[165,166,167],"Tips","Productivity","HTML",{"nodeType":116,"data":169,"content":170},{},[171,177,184,191,226,234,241,248,255,272,295,303,310,322,329,368,376,383,390,397,404,423,454,507,515,522,529,536,543,550,573,580,587,594,601,631,638,669,677,684,691,698,705,712,719,726,733,759,766],{"nodeType":101,"data":172,"content":173},{},[174],{"nodeType":100,"value":162,"marks":175,"data":176},[],{},{"nodeType":101,"data":178,"content":179},{},[180],{"nodeType":100,"value":181,"marks":182,"data":183},"Old and outdated articles are like dust on a coffee table; they're there for everyone to see until you decide to do something about it.",[],{},{"nodeType":101,"data":185,"content":186},{},[187],{"nodeType":100,"value":188,"marks":189,"data":190},"There are three reasons why an article should be considered being cleaned from your blog:",[],{},{"nodeType":192,"data":193,"content":194},"ordered-list",{},[195,206,216],{"nodeType":196,"data":197,"content":198},"list-item",{},[199],{"nodeType":101,"data":200,"content":201},{},[202],{"nodeType":100,"value":203,"marks":204,"data":205},"Outdated content - can be rewritten and updated",[],{},{"nodeType":196,"data":207,"content":208},{},[209],{"nodeType":101,"data":210,"content":211},{},[212],{"nodeType":100,"value":213,"marks":214,"data":215},"Outdated content - cannot be rewritten (the topic is no longer relevant)",[],{},{"nodeType":196,"data":217,"content":218},{},[219],{"nodeType":101,"data":220,"content":221},{},[222],{"nodeType":100,"value":223,"marks":224,"data":225},"Subject or style of writing may no longer align with you or your audience",[],{},{"nodeType":227,"data":228,"content":229},"heading-2",{},[230],{"nodeType":100,"value":231,"marks":232,"data":233},"1. Outdated content - can be rewritten and updated",[],{},{"nodeType":101,"data":235,"content":236},{},[237],{"nodeType":100,"value":238,"marks":239,"data":240},"More often than not, an article's subject or content is likely to become old news.",[],{},{"nodeType":101,"data":242,"content":243},{},[244],{"nodeType":100,"value":245,"marks":246,"data":247},"Depending on the subject, the time in which an article is considered outdated can vary wildly. Typically, in tech (the main focus of my blog), the average time a particular thing is considered relevant and modern is 18 months. This means, after 18 months of an article being published on a given subject, at least some of its content may no longer be relevant.",[],{},{"nodeType":101,"data":249,"content":250},{},[251],{"nodeType":100,"value":252,"marks":253,"data":254},"This can be a perfect opportunity to keep your content fresh and your audience trusting your ability to keep up with the times and not show them anything that may no longer be of any use to them.",[],{},{"nodeType":101,"data":256,"content":257},{},[258,262,268],{"nodeType":100,"value":259,"marks":260,"data":261},"There are two ways to rewrite an article, either approach is fine but should be chosen based on preference and the best need for the blog, and both approaches work for articles with a high organic SEO rating that you'll want to maintain - ",[],{},{"nodeType":100,"value":263,"marks":264,"data":267},"the approach you use may vary between different articles and article subjects within the same blog",[265],{"type":266},"italic",{},{"nodeType":100,"value":269,"marks":270,"data":271},".",[],{},{"nodeType":192,"data":273,"content":274},{},[275,285],{"nodeType":196,"data":276,"content":277},{},[278],{"nodeType":101,"data":279,"content":280},{},[281],{"nodeType":100,"value":282,"marks":283,"data":284},"Keep updating the original article keeping it forever evergreen",[],{},{"nodeType":196,"data":286,"content":287},{},[288],{"nodeType":101,"data":289,"content":290},{},[291],{"nodeType":100,"value":292,"marks":293,"data":294},"Writing an entirely new article",[],{},{"nodeType":296,"data":297,"content":298},"heading-3",{},[299],{"nodeType":100,"value":300,"marks":301,"data":302},"1.1 Keep updating the original article keeping it forever evergreen",[],{},{"nodeType":101,"data":304,"content":305},{},[306],{"nodeType":100,"value":307,"marks":308,"data":309},"This approach is the simpler of the two. Essentially, just keep updating and publishing updates and new content to the original article as if it were a \"living document\".",[],{},{"nodeType":101,"data":311,"content":312},{},[313,317],{"nodeType":100,"value":314,"marks":315,"data":316},"This approach only works, though, if you state, at the top of the article, \"Updated on\" with the date and/or time the article was last updated, otherwise, the user won't know how fresh the content is or if the article ever gets updates. This should be stated below the \"Published on\" line to show that this article gets updates. ",[],{},{"nodeType":100,"value":318,"marks":319,"data":321},"You should refrain, however, from displaying \"Updated on\" if an article has never been updated since \"Updated on\" will show the same date as \"Published on\".",[320],{"type":266},{},{"nodeType":101,"data":323,"content":324},{},[325],{"nodeType":100,"value":326,"marks":327,"data":328},"The advantage of this method is there is no need for redirects or SEO management. Just update the article's content, publish it and away you go.",[],{},{"nodeType":101,"data":330,"content":331},{},[332,336,342,346,355,359,364],{"nodeType":100,"value":333,"marks":334,"data":335},"If you're more technical and want an extra potential SEO boost and to improve your article's metadata, you can add the ",[],{},{"nodeType":100,"value":337,"marks":338,"data":341},"article:modified_time",[339],{"type":340},"code",{},{"nodeType":100,"value":343,"marks":344,"data":345}," ",[],{},{"nodeType":347,"data":348,"content":350},"hyperlink",{"uri":349},"https://ogp.me/",[351],{"nodeType":100,"value":352,"marks":353,"data":354},"Open Graph metadata",[],{},{"nodeType":100,"value":356,"marks":357,"data":358}," to the ",[],{},{"nodeType":100,"value":360,"marks":361,"data":363},"\u003Chead>",[362],{"type":340},{},{"nodeType":100,"value":365,"marks":366,"data":367}," of your HTML.",[],{},{"nodeType":101,"data":369,"content":370},{},[371],{"nodeType":100,"value":372,"marks":373,"data":375},"HTML\n\u003Chead>\n \u003Cmeta property=\"og:type\" content=\"article\" />\n \u003Cmeta property=\"article:published_time\" content=\"2021-10-31\" />\n \u003Cmeta property=\"article:modified_time\" content=\"2023-02-16\" />\n\u003C/head>",[374],{"type":340},{},{"nodeType":101,"data":377,"content":378},{},[379],{"nodeType":100,"value":380,"marks":381,"data":382},"The disadvantage to this approach is if your blog is architected to show newer articles towards the top, any articles you update will likely still be low down in the list. This can be easily remedied (if it is considered an issue) by either rearchitecting the order to define new articles as the latest published or latest updated or by adding a more advanced filter/sort functionality.",[],{},{"nodeType":296,"data":384,"content":385},{},[386],{"nodeType":100,"value":387,"marks":388,"data":389},"1.2 Writing an entirely new article",[],{},{"nodeType":101,"data":391,"content":392},{},[393],{"nodeType":100,"value":394,"marks":395,"data":396},"If updating the same article is not for you and you'd rather write an entirely new article, this should be fine. With a little bit more setup, you can rewrite an article and hopefully have no negative SEO impact.",[],{},{"nodeType":101,"data":398,"content":399},{},[400],{"nodeType":100,"value":401,"marks":402,"data":403},"This new article should be written as if it were brand new and not a rewrite, whereby you should not reference or link to the old article.",[],{},{"nodeType":101,"data":405,"content":406},{},[407,411,419],{"nodeType":100,"value":408,"marks":409,"data":410},"So that your article can get the best SEO benefit, it's best to delete the old article and set up a ",[],{},{"nodeType":347,"data":412,"content":414},{"uri":413},"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301",[415],{"nodeType":100,"value":416,"marks":417,"data":418},"301 (Permanent redirect)",[],{},{"nodeType":100,"value":420,"marks":421,"data":422}," from the old article URL to the new article URL. By setting up a 301 (Permanent redirect), all the SEO \"juice\" that was earned by the old article will be transferred to the new article, and any backlinks that reference the old article will automatically redirect users to the new version of the article.",[],{},{"nodeType":101,"data":424,"content":425},{},[426,430,438,442,450],{"nodeType":100,"value":427,"marks":428,"data":429},"You could alternatively delete the old article and return a ",[],{},{"nodeType":347,"data":431,"content":433},{"uri":432},"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",[434],{"nodeType":100,"value":435,"marks":436,"data":437},"404 (Not found)",[],{},{"nodeType":100,"value":439,"marks":440,"data":441}," or a ",[],{},{"nodeType":347,"data":443,"content":445},{"uri":444},"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/410",[446],{"nodeType":100,"value":447,"marks":448,"data":449},"410 (Gone)",[],{},{"nodeType":100,"value":451,"marks":452,"data":453}," status code, but you won't get the SEO or UX (user experience) benefits that a 301 (Permanent redirect) will give you.",[],{},{"nodeType":101,"data":455,"content":456},{},[457,461,469,473,478,482,486,490,495,499,503],{"nodeType":100,"value":458,"marks":459,"data":460},"If you're absolutely intent on keeping and not deleting the old article, there are some steps you could take to ensure the maximum benefit of the new article, such as adding a link at the top of the old article that directs the user to a newer version of the article and adding a ",[],{},{"nodeType":347,"data":462,"content":464},{"uri":463},"https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel#attr-canonical",[465],{"nodeType":100,"value":466,"marks":467,"data":468},"canonical link",[],{},{"nodeType":100,"value":470,"marks":471,"data":472}," and the ",[],{},{"nodeType":100,"value":474,"marks":475,"data":477},"article:expiration_time",[476],{"type":340},{},{"nodeType":100,"value":479,"marks":480,"data":481}," Open Graph metadata to the ",[],{},{"nodeType":100,"value":360,"marks":483,"data":485},[484],{"type":340},{},{"nodeType":100,"value":487,"marks":488,"data":489}," of your HTML. The ",[],{},{"nodeType":100,"value":491,"marks":492,"data":494},"canonical",[493],{"type":340},{},{"nodeType":100,"value":496,"marks":497,"data":498}," link tells search engines that this page is the same as a different page and all organic SEO earned by this page should be given to the other URL. The ",[],{},{"nodeType":100,"value":474,"marks":500,"data":502},[501],{"type":340},{},{"nodeType":100,"value":504,"marks":505,"data":506}," Open Graph metadata provides extra information about when the article will expire or is going to expire.",[],{},{"nodeType":101,"data":508,"content":509},{},[510],{"nodeType":100,"value":511,"marks":512,"data":514},"HTML\n\u003Chead>\n \u003Clink rel=\"canonical\" href=\"NEW_ARTICLE_URL\" />\n \u003Cmeta property=\"og:type\" content=\"article\" />\n \u003Cmeta property=\"article:published_time\" content=\"2021-10-31\" />\n \u003Cmeta property=\"article:expiration_time\" content=\"2023-02-16\" />\n\u003C/head>",[513],{"type":340},{},{"nodeType":101,"data":516,"content":517},{},[518],{"nodeType":100,"value":519,"marks":520,"data":521},"The disadvantages to this approach are it may require more setup to properly delete and rewrite an article by adding redirects or metadata, and it could potentially take longer to completely rewrite an article than it would be to update an existing article.",[],{},{"nodeType":227,"data":523,"content":524},{},[525],{"nodeType":100,"value":526,"marks":527,"data":528},"2. Outdated content - cannot be rewritten (the topic is no longer relevant)",[],{},{"nodeType":101,"data":530,"content":531},{},[532],{"nodeType":100,"value":533,"marks":534,"data":535},"For some topics, it is inevitable that they will reach the point where the entire topic is just no longer relevant. It's not worth rewriting, it can't be updated and it's not adding any value to your blog.",[],{},{"nodeType":101,"data":537,"content":538},{},[539],{"nodeType":100,"value":540,"marks":541,"data":542},"Over time, old articles where content has not been updated for a long time can often start harming your site's global SEO rating because search engines see this as not keeping content up to date and showing neglect.",[],{},{"nodeType":101,"data":544,"content":545},{},[546],{"nodeType":100,"value":547,"marks":548,"data":549},"You have two options:",[],{},{"nodeType":192,"data":551,"content":552},{},[553,563],{"nodeType":196,"data":554,"content":555},{},[556],{"nodeType":101,"data":557,"content":558},{},[559],{"nodeType":100,"value":560,"marks":561,"data":562},"Delete the article",[],{},{"nodeType":196,"data":564,"content":565},{},[566],{"nodeType":101,"data":567,"content":568},{},[569],{"nodeType":100,"value":570,"marks":571,"data":572},"Keep the article",[],{},{"nodeType":296,"data":574,"content":575},{},[576],{"nodeType":100,"value":577,"marks":578,"data":579},"2.1 Delete the article",[],{},{"nodeType":101,"data":581,"content":582},{},[583],{"nodeType":100,"value":584,"marks":585,"data":586},"Simply, if the article is providing no value and is not worth rewriting or updating, delete it.",[],{},{"nodeType":101,"data":588,"content":589},{},[590],{"nodeType":100,"value":591,"marks":592,"data":593},"By default, any backlinks to the article will show a 404 (Not found) error to the user. If you want to provide a better user experience, you could change this to return a 410 (Gone) status code and display a nicer error message that may say \"This article has been removed\" rather than the standard \"Page not found\".",[],{},{"nodeType":101,"data":595,"content":596},{},[597],{"nodeType":100,"value":598,"marks":599,"data":600},"Whether you return a 404 (Not found) or a 410 (Gone) status code, according to Google, will not impact SEO any differently.",[],{},{"nodeType":602,"data":603,"content":604},"blockquote",{},[605,612],{"nodeType":101,"data":606,"content":607},{},[608],{"nodeType":100,"value":609,"marks":610,"data":611},"Currently Google treats 410s (Gone) the same as 404s (Not found), so it’s immaterial to us whether you return one or the other.",[],{},{"nodeType":101,"data":613,"content":614},{},[615,619,627],{"nodeType":100,"value":616,"marks":617,"data":618},"- ",[],{},{"nodeType":347,"data":620,"content":622},{"uri":621},"https://developers.google.com/search/blog/2011/05/do-404s-hurt-my-site",[623],{"nodeType":100,"value":624,"marks":625,"data":626},"Google Search Central",[],{},{"nodeType":100,"value":628,"marks":629,"data":630},"",[],{},{"nodeType":296,"data":632,"content":633},{},[634],{"nodeType":100,"value":635,"marks":636,"data":637},"2.2 Keep the article",[],{},{"nodeType":101,"data":639,"content":640},{},[641,645,649,652,656,660,665],{"nodeType":100,"value":642,"marks":643,"data":644},"If you've identified an old, outdated article but you've decided you want to keep it, you could implement an ",[],{},{"nodeType":100,"value":474,"marks":646,"data":648},[647],{"type":340},{},{"nodeType":100,"value":479,"marks":650,"data":651},[],{},{"nodeType":100,"value":360,"marks":653,"data":655},[654],{"type":340},{},{"nodeType":100,"value":657,"marks":658,"data":659}," of the HTML. This ",[],{},{"nodeType":100,"value":661,"marks":662,"data":664},"could",[663],{"type":266},{},{"nodeType":100,"value":666,"marks":667,"data":668}," provide extra information to search engines that you as the author have identified this article as expired, although no one truly knows how search engines rank pages, so this is just an educated guess, but I don't see any negative to adding this metadata.",[],{},{"nodeType":101,"data":670,"content":671},{},[672],{"nodeType":100,"value":673,"marks":674,"data":676},"HTML\n\u003Chead>\n \u003Cmeta property=\"og:type\" content=\"article\" />\n \u003Cmeta property=\"article:published_time\" content=\"2021-10-31\" />\n \u003Cmeta property=\"article:expiration_time\" content=\"2023-02-16\" />\n\u003C/head>",[675],{"type":340},{},{"nodeType":101,"data":678,"content":679},{},[680],{"nodeType":100,"value":681,"marks":682,"data":683},"To improve user experience, you could add a note to the top of the article that the content is now outdated.",[],{},{"nodeType":101,"data":685,"content":686},{},[687],{"nodeType":100,"value":688,"marks":689,"data":690},"If you want to go one step further, you could hide this article from the blog, so users searching for new articles won't be able to see this outdated article. But this would still mean anyone with the URL and backlinks will still work.",[],{},{"nodeType":227,"data":692,"content":693},{},[694],{"nodeType":100,"value":695,"marks":696,"data":697},"3. Subject or style of writing may no longer align with you or your audience",[],{},{"nodeType":101,"data":699,"content":700},{},[701],{"nodeType":100,"value":702,"marks":703,"data":704},"As your blog progresses, your niche, style of writing or attitude may change. This might make some older articles irrelevant to your blog.",[],{},{"nodeType":101,"data":706,"content":707},{},[708],{"nodeType":100,"value":709,"marks":710,"data":711},"It's very common for blogs to take different turns in their niche as they mature. Your audience may have taken a particular liking to a specific niche that some of your older articles may no longer meet.",[],{},{"nodeType":101,"data":713,"content":714},{},[715],{"nodeType":100,"value":716,"marks":717,"data":718},"In this case, it's time for a decision. Do you delete these irrelevant articles? Do you keep them? Do you rewrite them or update them? What you do may vary from article to article.",[],{},{"nodeType":227,"data":720,"content":721},{},[722],{"nodeType":100,"value":723,"marks":724,"data":725},"What do I do?",[],{},{"nodeType":101,"data":727,"content":728},{},[729],{"nodeType":100,"value":730,"marks":731,"data":732},"I tend to do a mixture of all I've mentioned above. There is no set rule, just whatever works for the specific article you're considering cleaning up. So if you ever come across my blog, just know that all the articles on my website may not be all that I've ever written... there are very likely a lot more articles I have deleted than articles that are active on my blog.",[],{},{"nodeType":101,"data":734,"content":735},{},[736,740,747,751,755],{"nodeType":100,"value":737,"marks":738,"data":739},"I post my articles on ",[],{},{"nodeType":347,"data":741,"content":742},{"uri":72},[743],{"nodeType":100,"value":744,"marks":745,"data":746},"jackdomleo.dev/blog",[],{},{"nodeType":100,"value":748,"marks":749,"data":750},", but I used to also cross-post them onto other blogging platforms, such as DEV.to and Hashnode where I would use ",[],{},{"nodeType":100,"value":491,"marks":752,"data":754},[753],{"type":340},{},{"nodeType":100,"value":756,"marks":757,"data":758}," links to send all the SEO \"juice\" from the articles on the blogging platforms straight to the original articles on my website. So when I was cleaning my blog, I had to also remember to clean the blogging platforms I cross-posted to.",[],{},{"nodeType":227,"data":760,"content":761},{},[762],{"nodeType":100,"value":763,"marks":764,"data":765},"TL;DR",[],{},{"nodeType":101,"data":767,"content":768},{},[769],{"nodeType":100,"value":770,"marks":771,"data":772},"Yes, you should clean out your blog and maintain it. It can provide many benefits such as improved SEO and improved user experience. Cleaning your blog does not necessarily mean deleting articles, it simply means keeping on top of your content so your articles can provide the most value to you, your blog and your audience.",[],{},{"Asset":774},[140],{"sys":776,"total":20,"skip":37,"limit":20,"items":777},{"type":36},[778],{"fields":779,"sys":790},{"articleDisclaimer":780},{"data":781,"content":782,"nodeType":116},{},[783],{"data":784,"content":785,"nodeType":101},{},[786],{"data":787,"marks":788,"value":789,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":791,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":793,"total":151,"skip":37,"limit":794,"items":795,"includes":920},{"type":36},1000,[796,828,860,890],{"fields":797,"sys":826},{"title":798,"description":799,"image":800,"tags":822,"publishDate":824,"slug":825},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":801,"sys":804,"fields":814},{"tags":802,"concepts":803},[],[],{"space":805,"id":807,"type":13,"createdAt":808,"updatedAt":809,"environment":810,"publishedVersion":812,"revision":813,"locale":21},{"sys":806},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":811},{"id":17,"type":9,"linkType":18},9,2,{"title":815,"description":815,"file":816},"Pineapple",{"url":817,"details":818,"fileName":821,"contentType":161},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":819,"image":820},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",[823],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":827,"type":47},"7CUW25a1jLiar8pzd8K9Nh",{"fields":829,"sys":858},{"title":830,"description":831,"image":832,"tags":853,"publishDate":856,"slug":857},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":833,"sys":836,"fields":844},{"tags":834,"concepts":835},[],[],{"space":837,"id":839,"type":13,"createdAt":840,"updatedAt":840,"environment":841,"publishedVersion":843,"revision":20,"locale":21},{"sys":838},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":842},{"id":17,"type":9,"linkType":18},7,{"title":845,"description":846,"file":847},"When is a clickable div okay","An example modal element",{"url":848,"details":849,"fileName":852,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":850,"image":851},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[854,855,167],"Accessibility","UX","2023-07-18","when-is-a-clickable-div-okay",{"id":859,"type":47},"brxitJC35PyChlVzusyLP",{"fields":861,"sys":888},{"title":862,"description":863,"image":864,"tags":884,"publishDate":886,"slug":887},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":865,"sys":868,"fields":875},{"tags":866,"concepts":867},[],[],{"space":869,"id":871,"type":13,"createdAt":872,"updatedAt":872,"environment":873,"publishedVersion":151,"revision":20,"locale":21},{"sys":870},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":874},{"id":17,"type":9,"linkType":18},{"title":876,"description":877,"file":878},"css=hover-media-query-og","CSS media query for hover",{"url":879,"details":880,"fileName":883,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":881,"image":882},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[885],"CSS","2020-07-06","hover-css-media-query",{"id":889,"type":47},"5GKjEQKbXAneX7HsUv1qtm",{"fields":891,"sys":918},{"title":892,"description":893,"image":894,"tags":914,"publishDate":916,"slug":917},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":895,"sys":898,"fields":905},{"tags":896,"concepts":897},[],[],{"space":899,"id":901,"type":13,"createdAt":902,"updatedAt":902,"environment":903,"publishedVersion":843,"revision":20,"locale":21},{"sys":900},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":904},{"id":17,"type":9,"linkType":18},{"title":906,"description":907,"file":908},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":909,"details":910,"fileName":913,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":911,"image":912},6959,{"width":30,"height":31},"neumorphic-design-og.png",[915,885],"Design","2020-05-27","learning-neumorphic-design",{"id":919,"type":47},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":921},[864,832,800,922,894],{"metadata":923,"sys":926,"fields":931},{"tags":924,"concepts":925},[],[],{"space":927,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":929,"publishedVersion":151,"revision":20,"locale":21},{"sys":928},{"type":9,"linkType":10,"id":11},{"sys":930},{"id":17,"type":9,"linkType":18},{"title":153,"description":154,"file":932},{"url":156,"details":933,"fileName":160,"contentType":161},{"size":158,"image":934},{"width":30,"height":31},1730423475330] \ No newline at end of file +[{"data":1,"prerenderedAt":935},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-should-you-clean-out-your-blog":117,"$rpzcfBTaqR":775,"article-list-should-you-clean-out-your-blog":792},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":773},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"9dijdAHS9ROnOwXit47NQ","2023-02-16T21:37:49.894Z","2024-04-30T18:50:28.239Z",{"sys":131},{"id":17,"type":9,"linkType":18},734,6,{"sys":135},{"type":9,"linkType":56,"id":136},"article",{"title":138,"slug":139,"image":140,"description":162,"publishDate":163,"tags":164,"body":168},"Should you clean out your blog?","should-you-clean-out-your-blog",{"metadata":141,"sys":144,"fields":152},{"tags":142,"concepts":143},[],[],{"space":145,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":149,"publishedVersion":151,"revision":20,"locale":21},{"sys":146},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":150},{"id":17,"type":9,"linkType":18},5,{"title":153,"description":154,"file":155},"clutter","A cluttered office desk",{"url":156,"details":157,"fileName":160,"contentType":161},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":158,"image":159},281805,{"width":30,"height":31},"clutter.jpg","image/jpeg","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.","2023-02-16",[165,166,167],"Tips","Productivity","HTML",{"nodeType":116,"data":169,"content":170},{},[171,177,184,191,226,234,241,248,255,272,295,303,310,322,329,368,376,383,390,397,404,423,454,507,515,522,529,536,543,550,573,580,587,594,601,631,638,669,677,684,691,698,705,712,719,726,733,759,766],{"nodeType":101,"data":172,"content":173},{},[174],{"nodeType":100,"value":162,"marks":175,"data":176},[],{},{"nodeType":101,"data":178,"content":179},{},[180],{"nodeType":100,"value":181,"marks":182,"data":183},"Old and outdated articles are like dust on a coffee table; they're there for everyone to see until you decide to do something about it.",[],{},{"nodeType":101,"data":185,"content":186},{},[187],{"nodeType":100,"value":188,"marks":189,"data":190},"There are three reasons why an article should be considered being cleaned from your blog:",[],{},{"nodeType":192,"data":193,"content":194},"ordered-list",{},[195,206,216],{"nodeType":196,"data":197,"content":198},"list-item",{},[199],{"nodeType":101,"data":200,"content":201},{},[202],{"nodeType":100,"value":203,"marks":204,"data":205},"Outdated content - can be rewritten and updated",[],{},{"nodeType":196,"data":207,"content":208},{},[209],{"nodeType":101,"data":210,"content":211},{},[212],{"nodeType":100,"value":213,"marks":214,"data":215},"Outdated content - cannot be rewritten (the topic is no longer relevant)",[],{},{"nodeType":196,"data":217,"content":218},{},[219],{"nodeType":101,"data":220,"content":221},{},[222],{"nodeType":100,"value":223,"marks":224,"data":225},"Subject or style of writing may no longer align with you or your audience",[],{},{"nodeType":227,"data":228,"content":229},"heading-2",{},[230],{"nodeType":100,"value":231,"marks":232,"data":233},"1. Outdated content - can be rewritten and updated",[],{},{"nodeType":101,"data":235,"content":236},{},[237],{"nodeType":100,"value":238,"marks":239,"data":240},"More often than not, an article's subject or content is likely to become old news.",[],{},{"nodeType":101,"data":242,"content":243},{},[244],{"nodeType":100,"value":245,"marks":246,"data":247},"Depending on the subject, the time in which an article is considered outdated can vary wildly. Typically, in tech (the main focus of my blog), the average time a particular thing is considered relevant and modern is 18 months. This means, after 18 months of an article being published on a given subject, at least some of its content may no longer be relevant.",[],{},{"nodeType":101,"data":249,"content":250},{},[251],{"nodeType":100,"value":252,"marks":253,"data":254},"This can be a perfect opportunity to keep your content fresh and your audience trusting your ability to keep up with the times and not show them anything that may no longer be of any use to them.",[],{},{"nodeType":101,"data":256,"content":257},{},[258,262,268],{"nodeType":100,"value":259,"marks":260,"data":261},"There are two ways to rewrite an article, either approach is fine but should be chosen based on preference and the best need for the blog, and both approaches work for articles with a high organic SEO rating that you'll want to maintain - ",[],{},{"nodeType":100,"value":263,"marks":264,"data":267},"the approach you use may vary between different articles and article subjects within the same blog",[265],{"type":266},"italic",{},{"nodeType":100,"value":269,"marks":270,"data":271},".",[],{},{"nodeType":192,"data":273,"content":274},{},[275,285],{"nodeType":196,"data":276,"content":277},{},[278],{"nodeType":101,"data":279,"content":280},{},[281],{"nodeType":100,"value":282,"marks":283,"data":284},"Keep updating the original article keeping it forever evergreen",[],{},{"nodeType":196,"data":286,"content":287},{},[288],{"nodeType":101,"data":289,"content":290},{},[291],{"nodeType":100,"value":292,"marks":293,"data":294},"Writing an entirely new article",[],{},{"nodeType":296,"data":297,"content":298},"heading-3",{},[299],{"nodeType":100,"value":300,"marks":301,"data":302},"1.1 Keep updating the original article keeping it forever evergreen",[],{},{"nodeType":101,"data":304,"content":305},{},[306],{"nodeType":100,"value":307,"marks":308,"data":309},"This approach is the simpler of the two. Essentially, just keep updating and publishing updates and new content to the original article as if it were a \"living document\".",[],{},{"nodeType":101,"data":311,"content":312},{},[313,317],{"nodeType":100,"value":314,"marks":315,"data":316},"This approach only works, though, if you state, at the top of the article, \"Updated on\" with the date and/or time the article was last updated, otherwise, the user won't know how fresh the content is or if the article ever gets updates. This should be stated below the \"Published on\" line to show that this article gets updates. ",[],{},{"nodeType":100,"value":318,"marks":319,"data":321},"You should refrain, however, from displaying \"Updated on\" if an article has never been updated since \"Updated on\" will show the same date as \"Published on\".",[320],{"type":266},{},{"nodeType":101,"data":323,"content":324},{},[325],{"nodeType":100,"value":326,"marks":327,"data":328},"The advantage of this method is there is no need for redirects or SEO management. Just update the article's content, publish it and away you go.",[],{},{"nodeType":101,"data":330,"content":331},{},[332,336,342,346,355,359,364],{"nodeType":100,"value":333,"marks":334,"data":335},"If you're more technical and want an extra potential SEO boost and to improve your article's metadata, you can add the ",[],{},{"nodeType":100,"value":337,"marks":338,"data":341},"article:modified_time",[339],{"type":340},"code",{},{"nodeType":100,"value":343,"marks":344,"data":345}," ",[],{},{"nodeType":347,"data":348,"content":350},"hyperlink",{"uri":349},"https://ogp.me/",[351],{"nodeType":100,"value":352,"marks":353,"data":354},"Open Graph metadata",[],{},{"nodeType":100,"value":356,"marks":357,"data":358}," to the ",[],{},{"nodeType":100,"value":360,"marks":361,"data":363},"\u003Chead>",[362],{"type":340},{},{"nodeType":100,"value":365,"marks":366,"data":367}," of your HTML.",[],{},{"nodeType":101,"data":369,"content":370},{},[371],{"nodeType":100,"value":372,"marks":373,"data":375},"HTML\n\u003Chead>\n \u003Cmeta property=\"og:type\" content=\"article\" />\n \u003Cmeta property=\"article:published_time\" content=\"2021-10-31\" />\n \u003Cmeta property=\"article:modified_time\" content=\"2023-02-16\" />\n\u003C/head>",[374],{"type":340},{},{"nodeType":101,"data":377,"content":378},{},[379],{"nodeType":100,"value":380,"marks":381,"data":382},"The disadvantage to this approach is if your blog is architected to show newer articles towards the top, any articles you update will likely still be low down in the list. This can be easily remedied (if it is considered an issue) by either rearchitecting the order to define new articles as the latest published or latest updated or by adding a more advanced filter/sort functionality.",[],{},{"nodeType":296,"data":384,"content":385},{},[386],{"nodeType":100,"value":387,"marks":388,"data":389},"1.2 Writing an entirely new article",[],{},{"nodeType":101,"data":391,"content":392},{},[393],{"nodeType":100,"value":394,"marks":395,"data":396},"If updating the same article is not for you and you'd rather write an entirely new article, this should be fine. With a little bit more setup, you can rewrite an article and hopefully have no negative SEO impact.",[],{},{"nodeType":101,"data":398,"content":399},{},[400],{"nodeType":100,"value":401,"marks":402,"data":403},"This new article should be written as if it were brand new and not a rewrite, whereby you should not reference or link to the old article.",[],{},{"nodeType":101,"data":405,"content":406},{},[407,411,419],{"nodeType":100,"value":408,"marks":409,"data":410},"So that your article can get the best SEO benefit, it's best to delete the old article and set up a ",[],{},{"nodeType":347,"data":412,"content":414},{"uri":413},"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301",[415],{"nodeType":100,"value":416,"marks":417,"data":418},"301 (Permanent redirect)",[],{},{"nodeType":100,"value":420,"marks":421,"data":422}," from the old article URL to the new article URL. By setting up a 301 (Permanent redirect), all the SEO \"juice\" that was earned by the old article will be transferred to the new article, and any backlinks that reference the old article will automatically redirect users to the new version of the article.",[],{},{"nodeType":101,"data":424,"content":425},{},[426,430,438,442,450],{"nodeType":100,"value":427,"marks":428,"data":429},"You could alternatively delete the old article and return a ",[],{},{"nodeType":347,"data":431,"content":433},{"uri":432},"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",[434],{"nodeType":100,"value":435,"marks":436,"data":437},"404 (Not found)",[],{},{"nodeType":100,"value":439,"marks":440,"data":441}," or a ",[],{},{"nodeType":347,"data":443,"content":445},{"uri":444},"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/410",[446],{"nodeType":100,"value":447,"marks":448,"data":449},"410 (Gone)",[],{},{"nodeType":100,"value":451,"marks":452,"data":453}," status code, but you won't get the SEO or UX (user experience) benefits that a 301 (Permanent redirect) will give you.",[],{},{"nodeType":101,"data":455,"content":456},{},[457,461,469,473,478,482,486,490,495,499,503],{"nodeType":100,"value":458,"marks":459,"data":460},"If you're absolutely intent on keeping and not deleting the old article, there are some steps you could take to ensure the maximum benefit of the new article, such as adding a link at the top of the old article that directs the user to a newer version of the article and adding a ",[],{},{"nodeType":347,"data":462,"content":464},{"uri":463},"https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel#attr-canonical",[465],{"nodeType":100,"value":466,"marks":467,"data":468},"canonical link",[],{},{"nodeType":100,"value":470,"marks":471,"data":472}," and the ",[],{},{"nodeType":100,"value":474,"marks":475,"data":477},"article:expiration_time",[476],{"type":340},{},{"nodeType":100,"value":479,"marks":480,"data":481}," Open Graph metadata to the ",[],{},{"nodeType":100,"value":360,"marks":483,"data":485},[484],{"type":340},{},{"nodeType":100,"value":487,"marks":488,"data":489}," of your HTML. The ",[],{},{"nodeType":100,"value":491,"marks":492,"data":494},"canonical",[493],{"type":340},{},{"nodeType":100,"value":496,"marks":497,"data":498}," link tells search engines that this page is the same as a different page and all organic SEO earned by this page should be given to the other URL. The ",[],{},{"nodeType":100,"value":474,"marks":500,"data":502},[501],{"type":340},{},{"nodeType":100,"value":504,"marks":505,"data":506}," Open Graph metadata provides extra information about when the article will expire or is going to expire.",[],{},{"nodeType":101,"data":508,"content":509},{},[510],{"nodeType":100,"value":511,"marks":512,"data":514},"HTML\n\u003Chead>\n \u003Clink rel=\"canonical\" href=\"NEW_ARTICLE_URL\" />\n \u003Cmeta property=\"og:type\" content=\"article\" />\n \u003Cmeta property=\"article:published_time\" content=\"2021-10-31\" />\n \u003Cmeta property=\"article:expiration_time\" content=\"2023-02-16\" />\n\u003C/head>",[513],{"type":340},{},{"nodeType":101,"data":516,"content":517},{},[518],{"nodeType":100,"value":519,"marks":520,"data":521},"The disadvantages to this approach are it may require more setup to properly delete and rewrite an article by adding redirects or metadata, and it could potentially take longer to completely rewrite an article than it would be to update an existing article.",[],{},{"nodeType":227,"data":523,"content":524},{},[525],{"nodeType":100,"value":526,"marks":527,"data":528},"2. Outdated content - cannot be rewritten (the topic is no longer relevant)",[],{},{"nodeType":101,"data":530,"content":531},{},[532],{"nodeType":100,"value":533,"marks":534,"data":535},"For some topics, it is inevitable that they will reach the point where the entire topic is just no longer relevant. It's not worth rewriting, it can't be updated and it's not adding any value to your blog.",[],{},{"nodeType":101,"data":537,"content":538},{},[539],{"nodeType":100,"value":540,"marks":541,"data":542},"Over time, old articles where content has not been updated for a long time can often start harming your site's global SEO rating because search engines see this as not keeping content up to date and showing neglect.",[],{},{"nodeType":101,"data":544,"content":545},{},[546],{"nodeType":100,"value":547,"marks":548,"data":549},"You have two options:",[],{},{"nodeType":192,"data":551,"content":552},{},[553,563],{"nodeType":196,"data":554,"content":555},{},[556],{"nodeType":101,"data":557,"content":558},{},[559],{"nodeType":100,"value":560,"marks":561,"data":562},"Delete the article",[],{},{"nodeType":196,"data":564,"content":565},{},[566],{"nodeType":101,"data":567,"content":568},{},[569],{"nodeType":100,"value":570,"marks":571,"data":572},"Keep the article",[],{},{"nodeType":296,"data":574,"content":575},{},[576],{"nodeType":100,"value":577,"marks":578,"data":579},"2.1 Delete the article",[],{},{"nodeType":101,"data":581,"content":582},{},[583],{"nodeType":100,"value":584,"marks":585,"data":586},"Simply, if the article is providing no value and is not worth rewriting or updating, delete it.",[],{},{"nodeType":101,"data":588,"content":589},{},[590],{"nodeType":100,"value":591,"marks":592,"data":593},"By default, any backlinks to the article will show a 404 (Not found) error to the user. If you want to provide a better user experience, you could change this to return a 410 (Gone) status code and display a nicer error message that may say \"This article has been removed\" rather than the standard \"Page not found\".",[],{},{"nodeType":101,"data":595,"content":596},{},[597],{"nodeType":100,"value":598,"marks":599,"data":600},"Whether you return a 404 (Not found) or a 410 (Gone) status code, according to Google, will not impact SEO any differently.",[],{},{"nodeType":602,"data":603,"content":604},"blockquote",{},[605,612],{"nodeType":101,"data":606,"content":607},{},[608],{"nodeType":100,"value":609,"marks":610,"data":611},"Currently Google treats 410s (Gone) the same as 404s (Not found), so it’s immaterial to us whether you return one or the other.",[],{},{"nodeType":101,"data":613,"content":614},{},[615,619,627],{"nodeType":100,"value":616,"marks":617,"data":618},"- ",[],{},{"nodeType":347,"data":620,"content":622},{"uri":621},"https://developers.google.com/search/blog/2011/05/do-404s-hurt-my-site",[623],{"nodeType":100,"value":624,"marks":625,"data":626},"Google Search Central",[],{},{"nodeType":100,"value":628,"marks":629,"data":630},"",[],{},{"nodeType":296,"data":632,"content":633},{},[634],{"nodeType":100,"value":635,"marks":636,"data":637},"2.2 Keep the article",[],{},{"nodeType":101,"data":639,"content":640},{},[641,645,649,652,656,660,665],{"nodeType":100,"value":642,"marks":643,"data":644},"If you've identified an old, outdated article but you've decided you want to keep it, you could implement an ",[],{},{"nodeType":100,"value":474,"marks":646,"data":648},[647],{"type":340},{},{"nodeType":100,"value":479,"marks":650,"data":651},[],{},{"nodeType":100,"value":360,"marks":653,"data":655},[654],{"type":340},{},{"nodeType":100,"value":657,"marks":658,"data":659}," of the HTML. This ",[],{},{"nodeType":100,"value":661,"marks":662,"data":664},"could",[663],{"type":266},{},{"nodeType":100,"value":666,"marks":667,"data":668}," provide extra information to search engines that you as the author have identified this article as expired, although no one truly knows how search engines rank pages, so this is just an educated guess, but I don't see any negative to adding this metadata.",[],{},{"nodeType":101,"data":670,"content":671},{},[672],{"nodeType":100,"value":673,"marks":674,"data":676},"HTML\n\u003Chead>\n \u003Cmeta property=\"og:type\" content=\"article\" />\n \u003Cmeta property=\"article:published_time\" content=\"2021-10-31\" />\n \u003Cmeta property=\"article:expiration_time\" content=\"2023-02-16\" />\n\u003C/head>",[675],{"type":340},{},{"nodeType":101,"data":678,"content":679},{},[680],{"nodeType":100,"value":681,"marks":682,"data":683},"To improve user experience, you could add a note to the top of the article that the content is now outdated.",[],{},{"nodeType":101,"data":685,"content":686},{},[687],{"nodeType":100,"value":688,"marks":689,"data":690},"If you want to go one step further, you could hide this article from the blog, so users searching for new articles won't be able to see this outdated article. But this would still mean anyone with the URL and backlinks will still work.",[],{},{"nodeType":227,"data":692,"content":693},{},[694],{"nodeType":100,"value":695,"marks":696,"data":697},"3. Subject or style of writing may no longer align with you or your audience",[],{},{"nodeType":101,"data":699,"content":700},{},[701],{"nodeType":100,"value":702,"marks":703,"data":704},"As your blog progresses, your niche, style of writing or attitude may change. This might make some older articles irrelevant to your blog.",[],{},{"nodeType":101,"data":706,"content":707},{},[708],{"nodeType":100,"value":709,"marks":710,"data":711},"It's very common for blogs to take different turns in their niche as they mature. Your audience may have taken a particular liking to a specific niche that some of your older articles may no longer meet.",[],{},{"nodeType":101,"data":713,"content":714},{},[715],{"nodeType":100,"value":716,"marks":717,"data":718},"In this case, it's time for a decision. Do you delete these irrelevant articles? Do you keep them? Do you rewrite them or update them? What you do may vary from article to article.",[],{},{"nodeType":227,"data":720,"content":721},{},[722],{"nodeType":100,"value":723,"marks":724,"data":725},"What do I do?",[],{},{"nodeType":101,"data":727,"content":728},{},[729],{"nodeType":100,"value":730,"marks":731,"data":732},"I tend to do a mixture of all I've mentioned above. There is no set rule, just whatever works for the specific article you're considering cleaning up. So if you ever come across my blog, just know that all the articles on my website may not be all that I've ever written... there are very likely a lot more articles I have deleted than articles that are active on my blog.",[],{},{"nodeType":101,"data":734,"content":735},{},[736,740,747,751,755],{"nodeType":100,"value":737,"marks":738,"data":739},"I post my articles on ",[],{},{"nodeType":347,"data":741,"content":742},{"uri":72},[743],{"nodeType":100,"value":744,"marks":745,"data":746},"jackdomleo.dev/blog",[],{},{"nodeType":100,"value":748,"marks":749,"data":750},", but I used to also cross-post them onto other blogging platforms, such as DEV.to and Hashnode where I would use ",[],{},{"nodeType":100,"value":491,"marks":752,"data":754},[753],{"type":340},{},{"nodeType":100,"value":756,"marks":757,"data":758}," links to send all the SEO \"juice\" from the articles on the blogging platforms straight to the original articles on my website. So when I was cleaning my blog, I had to also remember to clean the blogging platforms I cross-posted to.",[],{},{"nodeType":227,"data":760,"content":761},{},[762],{"nodeType":100,"value":763,"marks":764,"data":765},"TL;DR",[],{},{"nodeType":101,"data":767,"content":768},{},[769],{"nodeType":100,"value":770,"marks":771,"data":772},"Yes, you should clean out your blog and maintain it. It can provide many benefits such as improved SEO and improved user experience. Cleaning your blog does not necessarily mean deleting articles, it simply means keeping on top of your content so your articles can provide the most value to you, your blog and your audience.",[],{},{"Asset":774},[140],{"sys":776,"total":20,"skip":37,"limit":20,"items":777},{"type":36},[778],{"fields":779,"sys":790},{"articleDisclaimer":780},{"data":781,"content":782,"nodeType":116},{},[783],{"data":784,"content":785,"nodeType":101},{},[786],{"data":787,"marks":788,"value":789,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":791,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":793,"total":151,"skip":37,"limit":794,"items":795,"includes":920},{"type":36},1000,[796,828,860,890],{"fields":797,"sys":826},{"title":798,"description":799,"image":800,"tags":822,"publishDate":824,"slug":825},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":801,"sys":804,"fields":814},{"tags":802,"concepts":803},[],[],{"space":805,"id":807,"type":13,"createdAt":808,"updatedAt":809,"environment":810,"publishedVersion":812,"revision":813,"locale":21},{"sys":806},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":811},{"id":17,"type":9,"linkType":18},9,2,{"title":815,"description":815,"file":816},"Pineapple",{"url":817,"details":818,"fileName":821,"contentType":161},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":819,"image":820},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",[823],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":827,"type":47},"7CUW25a1jLiar8pzd8K9Nh",{"fields":829,"sys":858},{"title":830,"description":831,"image":832,"tags":853,"publishDate":856,"slug":857},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":833,"sys":836,"fields":844},{"tags":834,"concepts":835},[],[],{"space":837,"id":839,"type":13,"createdAt":840,"updatedAt":840,"environment":841,"publishedVersion":843,"revision":20,"locale":21},{"sys":838},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":842},{"id":17,"type":9,"linkType":18},7,{"title":845,"description":846,"file":847},"When is a clickable div okay","An example modal element",{"url":848,"details":849,"fileName":852,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":850,"image":851},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[854,855,167],"Accessibility","UX","2023-07-18","when-is-a-clickable-div-okay",{"id":859,"type":47},"brxitJC35PyChlVzusyLP",{"fields":861,"sys":888},{"title":862,"description":863,"image":864,"tags":884,"publishDate":886,"slug":887},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":865,"sys":868,"fields":875},{"tags":866,"concepts":867},[],[],{"space":869,"id":871,"type":13,"createdAt":872,"updatedAt":872,"environment":873,"publishedVersion":151,"revision":20,"locale":21},{"sys":870},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":874},{"id":17,"type":9,"linkType":18},{"title":876,"description":877,"file":878},"css=hover-media-query-og","CSS media query for hover",{"url":879,"details":880,"fileName":883,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":881,"image":882},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[885],"CSS","2020-07-06","hover-css-media-query",{"id":889,"type":47},"5GKjEQKbXAneX7HsUv1qtm",{"fields":891,"sys":918},{"title":892,"description":893,"image":894,"tags":914,"publishDate":916,"slug":917},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":895,"sys":898,"fields":905},{"tags":896,"concepts":897},[],[],{"space":899,"id":901,"type":13,"createdAt":902,"updatedAt":902,"environment":903,"publishedVersion":843,"revision":20,"locale":21},{"sys":900},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":904},{"id":17,"type":9,"linkType":18},{"title":906,"description":907,"file":908},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":909,"details":910,"fileName":913,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":911,"image":912},6959,{"width":30,"height":31},"neumorphic-design-og.png",[915,885],"Design","2020-05-27","learning-neumorphic-design",{"id":919,"type":47},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":921},[864,832,800,922,894],{"metadata":923,"sys":926,"fields":931},{"tags":924,"concepts":925},[],[],{"space":927,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":929,"publishedVersion":151,"revision":20,"locale":21},{"sys":928},{"type":9,"linkType":10,"id":11},{"sys":930},{"id":17,"type":9,"linkType":18},{"title":153,"description":154,"file":932},{"url":156,"details":933,"fileName":160,"contentType":161},{"size":158,"image":934},{"width":30,"height":31},1730509477487] \ No newline at end of file diff --git a/blog/2023/should-you-clean-out-your-blog/index.html b/blog/2023/should-you-clean-out-your-blog/index.html index a9bf915f2..d2f6b78d5 100644 --- a/blog/2023/should-you-clean-out-your-blog/index.html +++ b/blog/2023/should-you-clean-out-your-blog/index.html @@ -22,7 +22,7 @@ - + @@ -95,5 +95,5 @@ <meta property="og:type" content="article" /> <meta property="article:published_time" content="2021-10-31" /> <meta property="article:expiration_time" content="2023-02-16" /> -</head>

To improve user experience, you could add a note to the top of the article that the content is now outdated.

If you want to go one step further, you could hide this article from the blog, so users searching for new articles won't be able to see this outdated article. But this would still mean anyone with the URL and backlinks will still work.

3. Subject or style of writing may no longer align with you or your audience

As your blog progresses, your niche, style of writing or attitude may change. This might make some older articles irrelevant to your blog.

It's very common for blogs to take different turns in their niche as they mature. Your audience may have taken a particular liking to a specific niche that some of your older articles may no longer meet.

In this case, it's time for a decision. Do you delete these irrelevant articles? Do you keep them? Do you rewrite them or update them? What you do may vary from article to article.

What do I do?

I tend to do a mixture of all I've mentioned above. There is no set rule, just whatever works for the specific article you're considering cleaning up. So if you ever come across my blog, just know that all the articles on my website may not be all that I've ever written... there are very likely a lot more articles I have deleted than articles that are active on my blog.

I post my articles on jackdomleo.dev/blog, but I used to also cross-post them onto other blogging platforms, such as DEV.to and Hashnode where I would use canonical links to send all the SEO "juice" from the articles on the blogging platforms straight to the original articles on my website. So when I was cleaning my blog, I had to also remember to clean the blogging platforms I cross-posted to.

TL;DR

Yes, you should clean out your blog and maintain it. It can provide many benefits such as improved SEO and improved user experience. Cleaning your blog does not necessarily mean deleting articles, it simply means keeping on top of your content so your articles can provide the most value to you, your blog and your audience.

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

- \ No newline at end of file +</head>

To improve user experience, you could add a note to the top of the article that the content is now outdated.

If you want to go one step further, you could hide this article from the blog, so users searching for new articles won't be able to see this outdated article. But this would still mean anyone with the URL and backlinks will still work.

3. Subject or style of writing may no longer align with you or your audience

As your blog progresses, your niche, style of writing or attitude may change. This might make some older articles irrelevant to your blog.

It's very common for blogs to take different turns in their niche as they mature. Your audience may have taken a particular liking to a specific niche that some of your older articles may no longer meet.

In this case, it's time for a decision. Do you delete these irrelevant articles? Do you keep them? Do you rewrite them or update them? What you do may vary from article to article.

What do I do?

I tend to do a mixture of all I've mentioned above. There is no set rule, just whatever works for the specific article you're considering cleaning up. So if you ever come across my blog, just know that all the articles on my website may not be all that I've ever written... there are very likely a lot more articles I have deleted than articles that are active on my blog.

I post my articles on jackdomleo.dev/blog, but I used to also cross-post them onto other blogging platforms, such as DEV.to and Hashnode where I would use canonical links to send all the SEO "juice" from the articles on the blogging platforms straight to the original articles on my website. So when I was cleaning my blog, I had to also remember to clean the blogging platforms I cross-posted to.

TL;DR

Yes, you should clean out your blog and maintain it. It can provide many benefits such as improved SEO and improved user experience. Cleaning your blog does not necessarily mean deleting articles, it simply means keeping on top of your content so your articles can provide the most value to you, your blog and your audience.

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

+ \ No newline at end of file diff --git a/blog/2023/when-is-a-clickable-div-okay/_payload.json b/blog/2023/when-is-a-clickable-div-okay/_payload.json index 762dfdae9..f6820e182 100644 --- a/blog/2023/when-is-a-clickable-div-okay/_payload.json +++ b/blog/2023/when-is-a-clickable-div-okay/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":647},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-when-is-a-clickable-div-okay":117,"$rpzcfBTaqR":487,"article-list-when-is-a-clickable-div-okay":504},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":485},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"brxitJC35PyChlVzusyLP","2023-07-18T19:03:23.464Z","2023-07-18T19:37:51.212Z",{"sys":131},{"id":17,"type":9,"linkType":18},262,2,{"sys":135},{"type":9,"linkType":56,"id":136},"article",{"title":138,"slug":139,"image":140,"description":161,"publishDate":162,"tags":163,"body":167},"When is a clickable div okay?","when-is-a-clickable-div-okay",{"metadata":141,"sys":144,"fields":152},{"tags":142,"concepts":143},[],[],{"space":145,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":149,"publishedVersion":151,"revision":20,"locale":21},{"sys":146},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":150},{"id":17,"type":9,"linkType":18},7,{"title":153,"description":154,"file":155},"When is a clickable div okay","An example modal element",{"url":156,"details":157,"fileName":160,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":158,"image":159},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?","2023-07-18",[164,165,166],"Accessibility","UX","HTML",{"nodeType":116,"data":168,"content":169},{},[170,190,198,223,255,289,296,303,310,317,335,342,386,401,426,457,464],{"nodeType":101,"data":171,"content":172},{},[173,177,186],{"nodeType":100,"value":174,"marks":175,"data":176},"A ",[],{},{"nodeType":178,"data":179,"content":181},"hyperlink",{"uri":180},"https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event",[182],{"nodeType":100,"value":183,"marks":184,"data":185},"click event",[],{},{"nodeType":100,"value":187,"marks":188,"data":189}," is an event listener that listens for a user's click (or a tap if on a touchscreen device), and then some custom JavaScript can be run once triggered. JavaScript and HTML allow us to put click events on any HTML element, but just because we can doesn't mean we should.",[],{},{"nodeType":191,"data":192,"content":193},"heading-2",{},[194],{"nodeType":100,"value":195,"marks":196,"data":197},"Why is putting a click event on a div a bad idea?",[],{},{"nodeType":101,"data":199,"content":200},{},[201,205,211,215,219],{"nodeType":100,"value":202,"marks":203,"data":204},"There are countless articles on the web advising not to put click events on ",[],{},{"nodeType":100,"value":206,"marks":207,"data":210},"\u003Cdiv>",[208],{"type":209},"code",{},{"nodeType":100,"value":212,"marks":213,"data":214}," HTML elements, but that's not the focus of this article, this article is quite the opposite so here is a TL;DR of why you should not put click events on ",[],{},{"nodeType":100,"value":206,"marks":216,"data":218},[217],{"type":209},{},{"nodeType":100,"value":220,"marks":221,"data":222}," HTML elements.",[],{},{"nodeType":101,"data":224,"content":225},{},[226,229,233,237,242,246,251],{"nodeType":100,"value":174,"marks":227,"data":228},[],{},{"nodeType":100,"value":206,"marks":230,"data":232},[231],{"type":209},{},{"nodeType":100,"value":234,"marks":235,"data":236}," HTML element, with no ",[],{},{"nodeType":100,"value":238,"marks":239,"data":241},"role",[240],{"type":209},{},{"nodeType":100,"value":243,"marks":244,"data":245}," attribute, is semantic-less: i.e. it has no semantic value at all, it solely exists for layout and styling purposes. This means, screenreaders or tabbing on a keyboard for example, will completely skip all semantic-less elements. A ",[],{},{"nodeType":100,"value":247,"marks":248,"data":250},"\u003Cspan>",[249],{"type":209},{},{"nodeType":100,"value":252,"marks":253,"data":254}," is also a semantic-less HTML element. If these elements are being skipped, users who rely on screenreaders or keyboards are going to have a difficult time interacting with your element (hint: they won't be able to at all).",[],{},{"nodeType":101,"data":256,"content":257},{},[258,262,267,271,276,280,285],{"nodeType":100,"value":259,"marks":260,"data":261},"You could put ",[],{},{"nodeType":100,"value":263,"marks":264,"data":266},"tabindex=\"0\"",[265],{"type":209},{},{"nodeType":100,"value":268,"marks":269,"data":270}," on the semantic-less element, meaning keyboards can now focus the element, but you lose so much other semantic value by not using the correct HTML in the first place: ",[],{},{"nodeType":100,"value":272,"marks":273,"data":275},"\u003Cbutton onclick=\"\">...\u003C/button>",[274],{"type":209},{},{"nodeType":100,"value":277,"marks":278,"data":279}," (recommended) or ",[],{},{"nodeType":100,"value":281,"marks":282,"data":284},"\u003Cdiv role=\"button\" onclick=\"\">...\u003C/div>",[283],{"type":209},{},{"nodeType":100,"value":286,"marks":287,"data":288},".",[],{},{"nodeType":101,"data":290,"content":291},{},[292],{"nodeType":100,"value":293,"marks":294,"data":295},"You can, by all means, put a click event on any element, you just need to ensure you're using the click event correctly and wisely.",[],{},{"nodeType":191,"data":297,"content":298},{},[299],{"nodeType":100,"value":300,"marks":301,"data":302},"When is it okay to put a click event on a div?",[],{},{"nodeType":101,"data":304,"content":305},{},[306],{"nodeType":100,"value":307,"marks":308,"data":309},"Now that we know it is taboo to put click events on semantic-less elements, let's explore a scenario where it would be considered perfectly fine to put a click event on a semantic-less element.",[],{},{"nodeType":101,"data":311,"content":312},{},[313],{"nodeType":100,"value":314,"marks":315,"data":316},"Behold... The Mighty Modal!",[],{},{"nodeType":101,"data":318,"content":319},{},[320,324,332],{"nodeType":100,"value":321,"marks":322,"data":323},"",[],{},{"nodeType":178,"data":325,"content":327},{"uri":326},"https://codepen.io/jackdomleo7/embed/yLJLOQr",[328],{"nodeType":100,"value":329,"marks":330,"data":331},"CodePen: A11y modal",[],{},{"nodeType":100,"value":321,"marks":333,"data":334},[],{},{"nodeType":101,"data":336,"content":337},{},[338],{"nodeType":100,"value":339,"marks":340,"data":341},"A modal is a fancy name for a pop-up window. When we consider a modal, as users, we typically assume there are 3 methods to close the modal:",[],{},{"nodeType":343,"data":344,"content":345},"ordered-list",{},[346,357,367],{"nodeType":347,"data":348,"content":349},"list-item",{},[350],{"nodeType":101,"data":351,"content":352},{},[353],{"nodeType":100,"value":354,"marks":355,"data":356},"Clicking the cross in the top corner",[],{},{"nodeType":347,"data":358,"content":359},{},[360],{"nodeType":101,"data":361,"content":362},{},[363],{"nodeType":100,"value":364,"marks":365,"data":366},"Clicking the greyed-out area behind the modal",[],{},{"nodeType":347,"data":368,"content":369},{},[370],{"nodeType":101,"data":371,"content":372},{},[373,377,382],{"nodeType":100,"value":374,"marks":375,"data":376},"Pressing the ",[],{},{"nodeType":100,"value":378,"marks":379,"data":381},"Esc",[380],{"type":209},{},{"nodeType":100,"value":383,"marks":384,"data":385}," key on the keyboard",[],{},{"nodeType":101,"data":387,"content":388},{},[389,393,397],{"nodeType":100,"value":390,"marks":391,"data":392},"There may also be a \"Cancel\", \"Close\" or similar call-to-action button on the modal. In this case, we can ignore the ",[],{},{"nodeType":100,"value":378,"marks":394,"data":396},[395],{"type":209},{},{"nodeType":100,"value":398,"marks":399,"data":400}," key method, since this is not related to clicking.",[],{},{"nodeType":101,"data":402,"content":403},{},[404,408,413,417,422],{"nodeType":100,"value":405,"marks":406,"data":407},"So, the 2 ways a user can close a modal by clicking is by clicking the cross, and by clicking the greyed-out area. The cross should obviously be a ",[],{},{"nodeType":100,"value":409,"marks":410,"data":412},"\u003Cbutton>X\u003C/button>",[411],{"type":209},{},{"nodeType":100,"value":414,"marks":415,"data":416}," since it is a user action. But what about the greyed-out area, should this be a ",[],{},{"nodeType":100,"value":418,"marks":419,"data":421},"button",[420],{"type":209},{},{"nodeType":100,"value":423,"marks":424,"data":425}," element too?",[],{},{"nodeType":101,"data":427,"content":428},{},[429,433,437,441,445,449,453],{"nodeType":100,"value":430,"marks":431,"data":432},"It could be a ",[],{},{"nodeType":100,"value":418,"marks":434,"data":436},[435],{"type":209},{},{"nodeType":100,"value":438,"marks":439,"data":440}," element, but it would make the code look ugly and it isn't really necessary in this case. For this modal to be considered accessible, it needs at least 1 way for each type of user to close the modal. We have a semantic ",[],{},{"nodeType":100,"value":418,"marks":442,"data":444},[443],{"type":209},{},{"nodeType":100,"value":446,"marks":447,"data":448}," element for the cross that a user can click or tab to, and we have the ",[],{},{"nodeType":100,"value":378,"marks":450,"data":452},[451],{"type":209},{},{"nodeType":100,"value":454,"marks":455,"data":456}," key handler for keyboard users. This should cover the majority of users if not all.",[],{},{"nodeType":101,"data":458,"content":459},{},[460],{"nodeType":100,"value":461,"marks":462,"data":463},"Clicking the greyed-out area is a nice-to-have minor UX (user experience) improvement. A user who relies on semantic elements so that they can be identified by screenreaders and keyboards is not going to expect that they can interact with the greyed-out area, it might actually confuse them more if they see a huge focus ring around the entire greyed-out section, causing poorer UX for these users since they may not associate it with closing the modal.",[],{},{"nodeType":101,"data":465,"content":466},{},[467,471,476,481],{"nodeType":100,"value":468,"marks":469,"data":470},"In this case, we can add a nice simple ",[],{},{"nodeType":100,"value":472,"marks":473,"data":475},"\u003Cdiv onclick=\"\">\u003C",[474],{"type":209},{},{"nodeType":100,"value":477,"marks":478,"data":480},"/div>",[479],{"type":209},{},{"nodeType":100,"value":482,"marks":483,"data":484}," for the greyed-out area and not have to worry about harming accessibility. Simple.",[],{},{"Asset":486},[140],{"sys":488,"total":20,"skip":37,"limit":20,"items":489},{"type":36},[490],{"fields":491,"sys":502},{"articleDisclaimer":492},{"data":493,"content":494,"nodeType":116},{},[495],{"data":496,"content":497,"nodeType":101},{},[498],{"data":499,"marks":500,"value":501,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":503,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":505,"total":506,"skip":37,"limit":507,"items":508,"includes":632},{"type":36},5,1000,[509,541,572,602],{"fields":510,"sys":539},{"title":511,"description":512,"image":513,"tags":535,"publishDate":537,"slug":538},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":514,"sys":517,"fields":526},{"tags":515,"concepts":516},[],[],{"space":518,"id":520,"type":13,"createdAt":521,"updatedAt":522,"environment":523,"publishedVersion":525,"revision":133,"locale":21},{"sys":519},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":524},{"id":17,"type":9,"linkType":18},9,{"title":527,"description":527,"file":528},"Pineapple",{"url":529,"details":530,"fileName":533,"contentType":534},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":531,"image":532},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg",[536],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":540,"type":47},"7CUW25a1jLiar8pzd8K9Nh",{"fields":542,"sys":570},{"title":543,"description":544,"image":545,"tags":565,"publishDate":568,"slug":569},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":546,"sys":549,"fields":556},{"tags":547,"concepts":548},[],[],{"space":550,"id":552,"type":13,"createdAt":553,"updatedAt":553,"environment":554,"publishedVersion":506,"revision":20,"locale":21},{"sys":551},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":555},{"id":17,"type":9,"linkType":18},{"title":557,"description":558,"file":559},"clutter","A cluttered office desk",{"url":560,"details":561,"fileName":564,"contentType":534},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":562,"image":563},281805,{"width":30,"height":31},"clutter.jpg",[566,567,166],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":571,"type":47},"9dijdAHS9ROnOwXit47NQ",{"fields":573,"sys":600},{"title":574,"description":575,"image":576,"tags":596,"publishDate":598,"slug":599},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":577,"sys":580,"fields":587},{"tags":578,"concepts":579},[],[],{"space":581,"id":583,"type":13,"createdAt":584,"updatedAt":584,"environment":585,"publishedVersion":506,"revision":20,"locale":21},{"sys":582},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":586},{"id":17,"type":9,"linkType":18},{"title":588,"description":589,"file":590},"css=hover-media-query-og","CSS media query for hover",{"url":591,"details":592,"fileName":595,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":593,"image":594},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[597],"CSS","2020-07-06","hover-css-media-query",{"id":601,"type":47},"5GKjEQKbXAneX7HsUv1qtm",{"fields":603,"sys":630},{"title":604,"description":605,"image":606,"tags":626,"publishDate":628,"slug":629},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":607,"sys":610,"fields":617},{"tags":608,"concepts":609},[],[],{"space":611,"id":613,"type":13,"createdAt":614,"updatedAt":614,"environment":615,"publishedVersion":151,"revision":20,"locale":21},{"sys":612},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":616},{"id":17,"type":9,"linkType":18},{"title":618,"description":619,"file":620},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":621,"details":622,"fileName":625,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":623,"image":624},6959,{"width":30,"height":31},"neumorphic-design-og.png",[627,597],"Design","2020-05-27","learning-neumorphic-design",{"id":631,"type":47},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":633},[576,634,513,545,606],{"metadata":635,"sys":638,"fields":643},{"tags":636,"concepts":637},[],[],{"space":639,"id":147,"type":13,"createdAt":148,"updatedAt":148,"environment":641,"publishedVersion":151,"revision":20,"locale":21},{"sys":640},{"type":9,"linkType":10,"id":11},{"sys":642},{"id":17,"type":9,"linkType":18},{"title":153,"description":154,"file":644},{"url":156,"details":645,"fileName":160,"contentType":33},{"size":158,"image":646},{"width":30,"height":31},1730423475331] \ No newline at end of file +[{"data":1,"prerenderedAt":647},["ShallowReactive",2],{"$siNM9WAguS":3,"article-when-is-a-clickable-div-okay":34,"$mMA9bTNYLP":411,"$rpzcfBTaqR":487,"article-list-when-is-a-clickable-div-okay":504},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38,"includes":409},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"brxitJC35PyChlVzusyLP","Entry","2023-07-18T19:03:23.464Z","2023-07-18T19:37:51.212Z",{"sys":51},{"id":17,"type":9,"linkType":18},262,2,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","article",{"title":59,"slug":60,"image":61,"description":82,"publishDate":83,"tags":84,"body":88},"When is a clickable div okay?","when-is-a-clickable-div-okay",{"metadata":62,"sys":65,"fields":73},{"tags":63,"concepts":64},[],[],{"space":66,"id":68,"type":13,"createdAt":69,"updatedAt":69,"environment":70,"publishedVersion":72,"revision":20,"locale":21},{"sys":67},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":71},{"id":17,"type":9,"linkType":18},7,{"title":74,"description":75,"file":76},"When is a clickable div okay","An example modal element",{"url":77,"details":78,"fileName":81,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":79,"image":80},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?","2023-07-18",[85,86,87],"Accessibility","UX","HTML",{"nodeType":89,"data":90,"content":91},"document",{},[92,114,122,147,179,213,220,227,234,241,259,266,310,325,350,381,388],{"nodeType":93,"data":94,"content":95},"paragraph",{},[96,101,110],{"nodeType":97,"value":98,"marks":99,"data":100},"text","A ",[],{},{"nodeType":102,"data":103,"content":105},"hyperlink",{"uri":104},"https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event",[106],{"nodeType":97,"value":107,"marks":108,"data":109},"click event",[],{},{"nodeType":97,"value":111,"marks":112,"data":113}," is an event listener that listens for a user's click (or a tap if on a touchscreen device), and then some custom JavaScript can be run once triggered. JavaScript and HTML allow us to put click events on any HTML element, but just because we can doesn't mean we should.",[],{},{"nodeType":115,"data":116,"content":117},"heading-2",{},[118],{"nodeType":97,"value":119,"marks":120,"data":121},"Why is putting a click event on a div a bad idea?",[],{},{"nodeType":93,"data":123,"content":124},{},[125,129,135,139,143],{"nodeType":97,"value":126,"marks":127,"data":128},"There are countless articles on the web advising not to put click events on ",[],{},{"nodeType":97,"value":130,"marks":131,"data":134},"\u003Cdiv>",[132],{"type":133},"code",{},{"nodeType":97,"value":136,"marks":137,"data":138}," HTML elements, but that's not the focus of this article, this article is quite the opposite so here is a TL;DR of why you should not put click events on ",[],{},{"nodeType":97,"value":130,"marks":140,"data":142},[141],{"type":133},{},{"nodeType":97,"value":144,"marks":145,"data":146}," HTML elements.",[],{},{"nodeType":93,"data":148,"content":149},{},[150,153,157,161,166,170,175],{"nodeType":97,"value":98,"marks":151,"data":152},[],{},{"nodeType":97,"value":130,"marks":154,"data":156},[155],{"type":133},{},{"nodeType":97,"value":158,"marks":159,"data":160}," HTML element, with no ",[],{},{"nodeType":97,"value":162,"marks":163,"data":165},"role",[164],{"type":133},{},{"nodeType":97,"value":167,"marks":168,"data":169}," attribute, is semantic-less: i.e. it has no semantic value at all, it solely exists for layout and styling purposes. This means, screenreaders or tabbing on a keyboard for example, will completely skip all semantic-less elements. A ",[],{},{"nodeType":97,"value":171,"marks":172,"data":174},"\u003Cspan>",[173],{"type":133},{},{"nodeType":97,"value":176,"marks":177,"data":178}," is also a semantic-less HTML element. If these elements are being skipped, users who rely on screenreaders or keyboards are going to have a difficult time interacting with your element (hint: they won't be able to at all).",[],{},{"nodeType":93,"data":180,"content":181},{},[182,186,191,195,200,204,209],{"nodeType":97,"value":183,"marks":184,"data":185},"You could put ",[],{},{"nodeType":97,"value":187,"marks":188,"data":190},"tabindex=\"0\"",[189],{"type":133},{},{"nodeType":97,"value":192,"marks":193,"data":194}," on the semantic-less element, meaning keyboards can now focus the element, but you lose so much other semantic value by not using the correct HTML in the first place: ",[],{},{"nodeType":97,"value":196,"marks":197,"data":199},"\u003Cbutton onclick=\"\">...\u003C/button>",[198],{"type":133},{},{"nodeType":97,"value":201,"marks":202,"data":203}," (recommended) or ",[],{},{"nodeType":97,"value":205,"marks":206,"data":208},"\u003Cdiv role=\"button\" onclick=\"\">...\u003C/div>",[207],{"type":133},{},{"nodeType":97,"value":210,"marks":211,"data":212},".",[],{},{"nodeType":93,"data":214,"content":215},{},[216],{"nodeType":97,"value":217,"marks":218,"data":219},"You can, by all means, put a click event on any element, you just need to ensure you're using the click event correctly and wisely.",[],{},{"nodeType":115,"data":221,"content":222},{},[223],{"nodeType":97,"value":224,"marks":225,"data":226},"When is it okay to put a click event on a div?",[],{},{"nodeType":93,"data":228,"content":229},{},[230],{"nodeType":97,"value":231,"marks":232,"data":233},"Now that we know it is taboo to put click events on semantic-less elements, let's explore a scenario where it would be considered perfectly fine to put a click event on a semantic-less element.",[],{},{"nodeType":93,"data":235,"content":236},{},[237],{"nodeType":97,"value":238,"marks":239,"data":240},"Behold... The Mighty Modal!",[],{},{"nodeType":93,"data":242,"content":243},{},[244,248,256],{"nodeType":97,"value":245,"marks":246,"data":247},"",[],{},{"nodeType":102,"data":249,"content":251},{"uri":250},"https://codepen.io/jackdomleo7/embed/yLJLOQr",[252],{"nodeType":97,"value":253,"marks":254,"data":255},"CodePen: A11y modal",[],{},{"nodeType":97,"value":245,"marks":257,"data":258},[],{},{"nodeType":93,"data":260,"content":261},{},[262],{"nodeType":97,"value":263,"marks":264,"data":265},"A modal is a fancy name for a pop-up window. When we consider a modal, as users, we typically assume there are 3 methods to close the modal:",[],{},{"nodeType":267,"data":268,"content":269},"ordered-list",{},[270,281,291],{"nodeType":271,"data":272,"content":273},"list-item",{},[274],{"nodeType":93,"data":275,"content":276},{},[277],{"nodeType":97,"value":278,"marks":279,"data":280},"Clicking the cross in the top corner",[],{},{"nodeType":271,"data":282,"content":283},{},[284],{"nodeType":93,"data":285,"content":286},{},[287],{"nodeType":97,"value":288,"marks":289,"data":290},"Clicking the greyed-out area behind the modal",[],{},{"nodeType":271,"data":292,"content":293},{},[294],{"nodeType":93,"data":295,"content":296},{},[297,301,306],{"nodeType":97,"value":298,"marks":299,"data":300},"Pressing the ",[],{},{"nodeType":97,"value":302,"marks":303,"data":305},"Esc",[304],{"type":133},{},{"nodeType":97,"value":307,"marks":308,"data":309}," key on the keyboard",[],{},{"nodeType":93,"data":311,"content":312},{},[313,317,321],{"nodeType":97,"value":314,"marks":315,"data":316},"There may also be a \"Cancel\", \"Close\" or similar call-to-action button on the modal. In this case, we can ignore the ",[],{},{"nodeType":97,"value":302,"marks":318,"data":320},[319],{"type":133},{},{"nodeType":97,"value":322,"marks":323,"data":324}," key method, since this is not related to clicking.",[],{},{"nodeType":93,"data":326,"content":327},{},[328,332,337,341,346],{"nodeType":97,"value":329,"marks":330,"data":331},"So, the 2 ways a user can close a modal by clicking is by clicking the cross, and by clicking the greyed-out area. The cross should obviously be a ",[],{},{"nodeType":97,"value":333,"marks":334,"data":336},"\u003Cbutton>X\u003C/button>",[335],{"type":133},{},{"nodeType":97,"value":338,"marks":339,"data":340}," since it is a user action. But what about the greyed-out area, should this be a ",[],{},{"nodeType":97,"value":342,"marks":343,"data":345},"button",[344],{"type":133},{},{"nodeType":97,"value":347,"marks":348,"data":349}," element too?",[],{},{"nodeType":93,"data":351,"content":352},{},[353,357,361,365,369,373,377],{"nodeType":97,"value":354,"marks":355,"data":356},"It could be a ",[],{},{"nodeType":97,"value":342,"marks":358,"data":360},[359],{"type":133},{},{"nodeType":97,"value":362,"marks":363,"data":364}," element, but it would make the code look ugly and it isn't really necessary in this case. For this modal to be considered accessible, it needs at least 1 way for each type of user to close the modal. We have a semantic ",[],{},{"nodeType":97,"value":342,"marks":366,"data":368},[367],{"type":133},{},{"nodeType":97,"value":370,"marks":371,"data":372}," element for the cross that a user can click or tab to, and we have the ",[],{},{"nodeType":97,"value":302,"marks":374,"data":376},[375],{"type":133},{},{"nodeType":97,"value":378,"marks":379,"data":380}," key handler for keyboard users. This should cover the majority of users if not all.",[],{},{"nodeType":93,"data":382,"content":383},{},[384],{"nodeType":97,"value":385,"marks":386,"data":387},"Clicking the greyed-out area is a nice-to-have minor UX (user experience) improvement. A user who relies on semantic elements so that they can be identified by screenreaders and keyboards is not going to expect that they can interact with the greyed-out area, it might actually confuse them more if they see a huge focus ring around the entire greyed-out section, causing poorer UX for these users since they may not associate it with closing the modal.",[],{},{"nodeType":93,"data":389,"content":390},{},[391,395,400,405],{"nodeType":97,"value":392,"marks":393,"data":394},"In this case, we can add a nice simple ",[],{},{"nodeType":97,"value":396,"marks":397,"data":399},"\u003Cdiv onclick=\"\">\u003C",[398],{"type":133},{},{"nodeType":97,"value":401,"marks":402,"data":404},"/div>",[403],{"type":133},{},{"nodeType":97,"value":406,"marks":407,"data":408}," for the greyed-out area and not have to worry about harming accessibility. Simple.",[],{},{"Asset":410},[61],{"sys":412,"total":20,"skip":37,"limit":20,"items":413},{"type":36},[414],{"metadata":415,"sys":418,"fields":431},{"tags":416,"concepts":417},[],[],{"space":419,"id":421,"type":47,"createdAt":422,"updatedAt":423,"environment":424,"publishedVersion":426,"revision":427,"contentType":428,"locale":21},{"sys":420},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":425},{"id":17,"type":9,"linkType":18},61,13,{"sys":429},{"type":9,"linkType":56,"id":430},"footer",{"name":432,"quickLinks":433,"socialLinks":450,"legalText":463},"Footer",[434,438,442,446],{"id":435,"key":436,"value":437},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":439,"key":440,"value":441},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":443,"key":444,"value":445},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":447,"key":448,"value":449},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[451,455,459],{"id":452,"key":453,"value":454},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":456,"key":457,"value":458},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":460,"key":461,"value":462},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":464,"content":465,"nodeType":89},{},[466,473,480],{"data":467,"content":468,"nodeType":93},{},[469],{"data":470,"marks":471,"value":472,"nodeType":97},{},[],"©2018-2024",{"data":474,"content":475,"nodeType":93},{},[476],{"data":477,"marks":478,"value":479,"nodeType":97},{},[],"All rights reserved.",{"data":481,"content":482,"nodeType":93},{},[483],{"data":484,"marks":485,"value":486,"nodeType":97},{},[],"Jack Domleo",{"sys":488,"total":20,"skip":37,"limit":20,"items":489},{"type":36},[490],{"fields":491,"sys":502},{"articleDisclaimer":492},{"data":493,"content":494,"nodeType":89},{},[495],{"data":496,"content":497,"nodeType":93},{},[498],{"data":499,"marks":500,"value":501,"nodeType":97},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":503,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":505,"total":506,"skip":37,"limit":507,"items":508,"includes":632},{"type":36},5,1000,[509,541,572,602],{"fields":510,"sys":539},{"title":511,"description":512,"image":513,"tags":535,"publishDate":537,"slug":538},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":514,"sys":517,"fields":526},{"tags":515,"concepts":516},[],[],{"space":518,"id":520,"type":13,"createdAt":521,"updatedAt":522,"environment":523,"publishedVersion":525,"revision":53,"locale":21},{"sys":519},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":524},{"id":17,"type":9,"linkType":18},9,{"title":527,"description":527,"file":528},"Pineapple",{"url":529,"details":530,"fileName":533,"contentType":534},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":531,"image":532},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg",[536],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":540,"type":47},"7CUW25a1jLiar8pzd8K9Nh",{"fields":542,"sys":570},{"title":543,"description":544,"image":545,"tags":565,"publishDate":568,"slug":569},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":546,"sys":549,"fields":556},{"tags":547,"concepts":548},[],[],{"space":550,"id":552,"type":13,"createdAt":553,"updatedAt":553,"environment":554,"publishedVersion":506,"revision":20,"locale":21},{"sys":551},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":555},{"id":17,"type":9,"linkType":18},{"title":557,"description":558,"file":559},"clutter","A cluttered office desk",{"url":560,"details":561,"fileName":564,"contentType":534},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":562,"image":563},281805,{"width":30,"height":31},"clutter.jpg",[566,567,87],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":571,"type":47},"9dijdAHS9ROnOwXit47NQ",{"fields":573,"sys":600},{"title":574,"description":575,"image":576,"tags":596,"publishDate":598,"slug":599},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":577,"sys":580,"fields":587},{"tags":578,"concepts":579},[],[],{"space":581,"id":583,"type":13,"createdAt":584,"updatedAt":584,"environment":585,"publishedVersion":506,"revision":20,"locale":21},{"sys":582},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":586},{"id":17,"type":9,"linkType":18},{"title":588,"description":589,"file":590},"css=hover-media-query-og","CSS media query for hover",{"url":591,"details":592,"fileName":595,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":593,"image":594},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[597],"CSS","2020-07-06","hover-css-media-query",{"id":601,"type":47},"5GKjEQKbXAneX7HsUv1qtm",{"fields":603,"sys":630},{"title":604,"description":605,"image":606,"tags":626,"publishDate":628,"slug":629},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":607,"sys":610,"fields":617},{"tags":608,"concepts":609},[],[],{"space":611,"id":613,"type":13,"createdAt":614,"updatedAt":614,"environment":615,"publishedVersion":72,"revision":20,"locale":21},{"sys":612},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":616},{"id":17,"type":9,"linkType":18},{"title":618,"description":619,"file":620},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":621,"details":622,"fileName":625,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":623,"image":624},6959,{"width":30,"height":31},"neumorphic-design-og.png",[627,597],"Design","2020-05-27","learning-neumorphic-design",{"id":631,"type":47},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":633},[576,634,513,545,606],{"metadata":635,"sys":638,"fields":643},{"tags":636,"concepts":637},[],[],{"space":639,"id":68,"type":13,"createdAt":69,"updatedAt":69,"environment":641,"publishedVersion":72,"revision":20,"locale":21},{"sys":640},{"type":9,"linkType":10,"id":11},{"sys":642},{"id":17,"type":9,"linkType":18},{"title":74,"description":75,"file":644},{"url":77,"details":645,"fileName":81,"contentType":33},{"size":79,"image":646},{"width":30,"height":31},1730509477487] \ No newline at end of file diff --git a/blog/2023/when-is-a-clickable-div-okay/index.html b/blog/2023/when-is-a-clickable-div-okay/index.html index 1830a35aa..46c9d0099 100644 --- a/blog/2023/when-is-a-clickable-div-okay/index.html +++ b/blog/2023/when-is-a-clickable-div-okay/index.html @@ -23,7 +23,7 @@ - + @@ -83,5 +83,5 @@ -

When is a clickable div okay?

An example modal element

A click event is an event listener that listens for a user's click (or a tap if on a touchscreen device), and then some custom JavaScript can be run once triggered. JavaScript and HTML allow us to put click events on any HTML element, but just because we can doesn't mean we should.

Why is putting a click event on a div a bad idea?

There are countless articles on the web advising not to put click events on <div> HTML elements, but that's not the focus of this article, this article is quite the opposite so here is a TL;DR of why you should not put click events on <div> HTML elements.

A <div> HTML element, with no role attribute, is semantic-less: i.e. it has no semantic value at all, it solely exists for layout and styling purposes. This means, screenreaders or tabbing on a keyboard for example, will completely skip all semantic-less elements. A <span> is also a semantic-less HTML element. If these elements are being skipped, users who rely on screenreaders or keyboards are going to have a difficult time interacting with your element (hint: they won't be able to at all).

You could put tabindex="0" on the semantic-less element, meaning keyboards can now focus the element, but you lose so much other semantic value by not using the correct HTML in the first place: <button onclick="">...</button> (recommended) or <div role="button" onclick="">...</div>.

You can, by all means, put a click event on any element, you just need to ensure you're using the click event correctly and wisely.

When is it okay to put a click event on a div?

Now that we know it is taboo to put click events on semantic-less elements, let's explore a scenario where it would be considered perfectly fine to put a click event on a semantic-less element.

Behold... The Mighty Modal!

See the Pen A11y modal by @jackdomleo7 on CodePen

A modal is a fancy name for a pop-up window. When we consider a modal, as users, we typically assume there are 3 methods to close the modal:

  1. Clicking the cross in the top corner

  2. Clicking the greyed-out area behind the modal

  3. Pressing the Esc key on the keyboard

There may also be a "Cancel", "Close" or similar call-to-action button on the modal. In this case, we can ignore the Esc key method, since this is not related to clicking.

So, the 2 ways a user can close a modal by clicking is by clicking the cross, and by clicking the greyed-out area. The cross should obviously be a <button>X</button> since it is a user action. But what about the greyed-out area, should this be a button element too?

It could be a button element, but it would make the code look ugly and it isn't really necessary in this case. For this modal to be considered accessible, it needs at least 1 way for each type of user to close the modal. We have a semantic button element for the cross that a user can click or tab to, and we have the Esc key handler for keyboard users. This should cover the majority of users if not all.

Clicking the greyed-out area is a nice-to-have minor UX (user experience) improvement. A user who relies on semantic elements so that they can be identified by screenreaders and keyboards is not going to expect that they can interact with the greyed-out area, it might actually confuse them more if they see a huge focus ring around the entire greyed-out section, causing poorer UX for these users since they may not associate it with closing the modal.

In this case, we can add a nice simple <div onclick=""></div> for the greyed-out area and not have to worry about harming accessibility. Simple.

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

- \ No newline at end of file +

When is a clickable div okay?

An example modal element

A click event is an event listener that listens for a user's click (or a tap if on a touchscreen device), and then some custom JavaScript can be run once triggered. JavaScript and HTML allow us to put click events on any HTML element, but just because we can doesn't mean we should.

Why is putting a click event on a div a bad idea?

There are countless articles on the web advising not to put click events on <div> HTML elements, but that's not the focus of this article, this article is quite the opposite so here is a TL;DR of why you should not put click events on <div> HTML elements.

A <div> HTML element, with no role attribute, is semantic-less: i.e. it has no semantic value at all, it solely exists for layout and styling purposes. This means, screenreaders or tabbing on a keyboard for example, will completely skip all semantic-less elements. A <span> is also a semantic-less HTML element. If these elements are being skipped, users who rely on screenreaders or keyboards are going to have a difficult time interacting with your element (hint: they won't be able to at all).

You could put tabindex="0" on the semantic-less element, meaning keyboards can now focus the element, but you lose so much other semantic value by not using the correct HTML in the first place: <button onclick="">...</button> (recommended) or <div role="button" onclick="">...</div>.

You can, by all means, put a click event on any element, you just need to ensure you're using the click event correctly and wisely.

When is it okay to put a click event on a div?

Now that we know it is taboo to put click events on semantic-less elements, let's explore a scenario where it would be considered perfectly fine to put a click event on a semantic-less element.

Behold... The Mighty Modal!

See the Pen A11y modal by @jackdomleo7 on CodePen

A modal is a fancy name for a pop-up window. When we consider a modal, as users, we typically assume there are 3 methods to close the modal:

  1. Clicking the cross in the top corner

  2. Clicking the greyed-out area behind the modal

  3. Pressing the Esc key on the keyboard

There may also be a "Cancel", "Close" or similar call-to-action button on the modal. In this case, we can ignore the Esc key method, since this is not related to clicking.

So, the 2 ways a user can close a modal by clicking is by clicking the cross, and by clicking the greyed-out area. The cross should obviously be a <button>X</button> since it is a user action. But what about the greyed-out area, should this be a button element too?

It could be a button element, but it would make the code look ugly and it isn't really necessary in this case. For this modal to be considered accessible, it needs at least 1 way for each type of user to close the modal. We have a semantic button element for the cross that a user can click or tab to, and we have the Esc key handler for keyboard users. This should cover the majority of users if not all.

Clicking the greyed-out area is a nice-to-have minor UX (user experience) improvement. A user who relies on semantic elements so that they can be identified by screenreaders and keyboards is not going to expect that they can interact with the greyed-out area, it might actually confuse them more if they see a huge focus ring around the entire greyed-out section, causing poorer UX for these users since they may not associate it with closing the modal.

In this case, we can add a nice simple <div onclick=""></div> for the greyed-out area and not have to worry about harming accessibility. Simple.

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

+ \ No newline at end of file diff --git a/blog/2024/how-to-protect-state-in-pinia/_payload.json b/blog/2024/how-to-protect-state-in-pinia/_payload.json index a3d03549e..1a7fa61dd 100644 --- a/blog/2024/how-to-protect-state-in-pinia/_payload.json +++ b/blog/2024/how-to-protect-state-in-pinia/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":536},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-how-to-protect-state-in-pinia":117,"$rpzcfBTaqR":375,"article-list-how-to-protect-state-in-pinia":392},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":373},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"7CUW25a1jLiar8pzd8K9Nh","2024-04-07T19:00:42.324Z","2024-04-30T18:52:40.840Z",{"sys":131},{"id":17,"type":9,"linkType":18},291,2,{"sys":135},{"type":9,"linkType":56,"id":136},"article",{"title":138,"slug":139,"image":140,"description":162,"publishDate":163,"tags":164,"body":166},"How to protect state in Pinia 🍍","how-to-protect-state-in-pinia",{"metadata":141,"sys":144,"fields":153},{"tags":142,"concepts":143},[],[],{"space":145,"id":147,"type":13,"createdAt":148,"updatedAt":149,"environment":150,"publishedVersion":152,"revision":133,"locale":21},{"sys":146},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":151},{"id":17,"type":9,"linkType":18},9,{"title":154,"description":154,"file":155},"Pineapple",{"url":156,"details":157,"fileName":160,"contentType":161},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":158,"image":159},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.","2024-04-07",[165],"Vue",{"nodeType":116,"data":167,"content":168},{},[169,219,236,243,250,266,274,322,345],{"nodeType":101,"data":170,"content":171},{},[172,176,185,189,197,201,209,213],{"nodeType":100,"value":173,"marks":174,"data":175},"",[],{},{"nodeType":177,"data":178,"content":180},"hyperlink",{"uri":179},"https://pinia.vuejs.org/",[181],{"nodeType":100,"value":182,"marks":183,"data":184},"Pinia",[],{},{"nodeType":100,"value":186,"marks":187,"data":188}," is a relatively new state management tool for the Vue ecosystem. It is the new preferred state management tool recommended by the Vue core team replacing ",[],{},{"nodeType":177,"data":190,"content":192},{"uri":191},"https://vuex.vuejs.org/",[193],{"nodeType":100,"value":194,"marks":195,"data":196},"Vuex",[],{},{"nodeType":100,"value":198,"marks":199,"data":200},". Compared to Vuex, Pinia is type-safe by default (",[],{},{"nodeType":177,"data":202,"content":204},{"uri":203},"https://github.com/paroi-tech/direct-vuex",[205],{"nodeType":100,"value":206,"marks":207,"data":208},"direct-vuex",[],{},{"nodeType":100,"value":210,"marks":211,"data":212}," was needed to make Vuex type-safe), extremely lightweight, and modular by design (meaning you can create multiple stores instead of multiple modules inside one store, which optimises performance). Similar to Vuex, Pinia has state, computed properties (getters) and methods (mutations and actions). ",[],{},{"nodeType":100,"value":214,"marks":215,"data":218},"Read more about Pinia and its usage to understand the similarities and differences between Pinia and Vuex.",[216],{"type":217},"italic",{},{"nodeType":101,"data":220,"content":221},{},[222,226,232],{"nodeType":100,"value":223,"marks":224,"data":225},"Vuex's state is automatically protected, whereas Pinia's state is not. In Vuex, you could not directly edit the state, to do so you needed a mutation method that would edit or \"mutate\" the state for you. If you tried editing the state directly in Vuex, you would be faced with the following error message, \"",[],{},{"nodeType":100,"value":227,"marks":228,"data":231},"Error: [vuex] do not mutate vuex store state outside mutation handlers.",[229],{"type":230},"code",{},{"nodeType":100,"value":233,"marks":234,"data":235},"\"",[],{},{"nodeType":101,"data":237,"content":238},{},[239],{"nodeType":100,"value":240,"marks":241,"data":242},"But with Pinia, the state is exposed and can be mutated willy nilly from anywhere within your application. In a lot of cases, this is fine and actually makes state management a lot easier and simpler because in these cases there is no need for a mutation method whose sole purpose is to update a state property with the value you passed to the mutation method.",[],{},{"nodeType":101,"data":244,"content":245},{},[246],{"nodeType":100,"value":247,"marks":248,"data":249},"In some cases though, this might not be ideal. For example, we are building a rugby game in Vue (it's just an example, go with it). Unlike with football (or soccer for you Americans) where the scoring system increments by 1 whenever a goal is scored, rugby's scoring system increases by a different number depending on how those points were scored. 5 points for a try, 3 points for a penalty, 2 points for a conversion, and 3 points for a drop goal.",[],{},{"nodeType":101,"data":251,"content":252},{},[253,257,262],{"nodeType":100,"value":254,"marks":255,"data":256},"We want to be able to protect the ",[],{},{"nodeType":100,"value":258,"marks":259,"data":261},"score",[260],{"type":230},{},{"nodeType":100,"value":263,"marks":264,"data":265}," state property by only allowing it to be mutated in a specific way. We can easily do this by creating an exposed computed property that returns the state, and not exposing the state property.",[],{},{"nodeType":101,"data":267,"content":268},{},[269],{"nodeType":100,"value":270,"marks":271,"data":273},"TYPESCRIPT\nimport { defineStore } from 'pinia';\nimport { ref, computed } from 'vue';\n\nexport const useRugbyStore = defineStore('rugbyStory', () => {\n const _score = ref\u003Cnumber>(0);\n\n const score = computed(() => _score.value);\n\n function scorePoints(type: 'try'|'penalty'|'conversion'|'drop goal'): void {\n switch (type) {\n case 'try':\n _score.value += 5;\n break;\n case 'penalty':\n case 'drop goal':\n _score.value += 3;\n break;\n case 'conversion':\n _score.value += 2;\n break;\n }\n }\n\n return { score, scorePoints };\n})",[272],{"type":230},{},{"nodeType":101,"data":275,"content":276},{},[277,281,286,290,294,298,302,306,310,314,319],{"nodeType":100,"value":278,"marks":279,"data":280},"In the example above, ",[],{},{"nodeType":100,"value":282,"marks":283,"data":285},"_score",[284],{"type":230},{},{"nodeType":100,"value":287,"marks":288,"data":289}," (annotated prefixed with an underscore to show it is internal) can be read via the ",[],{},{"nodeType":100,"value":258,"marks":291,"data":293},[292],{"type":230},{},{"nodeType":100,"value":295,"marks":296,"data":297}," computed property, but cannot be mutated directly. Since ",[],{},{"nodeType":100,"value":258,"marks":299,"data":301},[300],{"type":230},{},{"nodeType":100,"value":303,"marks":304,"data":305}," is a computed property, Vue does not allow its value to be changed, if you try editing the value of ",[],{},{"nodeType":100,"value":258,"marks":307,"data":309},[308],{"type":230},{},{"nodeType":100,"value":311,"marks":312,"data":313},", you will get the following TypeScript error, \"",[],{},{"nodeType":100,"value":315,"marks":316,"data":318},"Cannot assign to \"score\" because it is a read-only property.",[317],{"type":230},{},{"nodeType":100,"value":233,"marks":320,"data":321},[],{},{"nodeType":101,"data":323,"content":324},{},[325,329,333,337,341],{"nodeType":100,"value":326,"marks":327,"data":328},"One caveat to this though is that ",[],{},{"nodeType":100,"value":258,"marks":330,"data":332},[331],{"type":230},{},{"nodeType":100,"value":334,"marks":335,"data":336}," or ",[],{},{"nodeType":100,"value":282,"marks":338,"data":340},[339],{"type":230},{},{"nodeType":100,"value":342,"marks":343,"data":344}," will never appear in Pinia's global state or in the Vue devtools Pinia panel, so keep this in mind.",[],{},{"nodeType":101,"data":346,"content":347},{},[348,352,360,364,369],{"nodeType":100,"value":349,"marks":350,"data":351},"I feel this is quite a simple, neat, easy-to-maintain, and type-safe method of protecting Pinia state. I have found other methods of protecting state such as ",[],{},{"nodeType":177,"data":353,"content":355},{"uri":354},"https://github.com/vuejs/pinia/issues/58#issuecomment-983284955",[356],{"nodeType":100,"value":357,"marks":358,"data":359},"this example",[],{},{"nodeType":100,"value":361,"marks":362,"data":363}," using Vue's ",[],{},{"nodeType":100,"value":365,"marks":366,"data":368},"readonly()",[367],{"type":230},{},{"nodeType":100,"value":370,"marks":371,"data":372}," method but I didn't find this to be type-safe or very nice to use.",[],{},{"Asset":374},[140],{"sys":376,"total":20,"skip":37,"limit":20,"items":377},{"type":36},[378],{"fields":379,"sys":390},{"articleDisclaimer":380},{"data":381,"content":382,"nodeType":116},{},[383],{"data":384,"content":385,"nodeType":101},{},[386],{"data":387,"marks":388,"value":389,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":391,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":393,"total":394,"skip":37,"limit":395,"items":396,"includes":521},{"type":36},5,1000,[397,430,461,491],{"fields":398,"sys":428},{"title":399,"description":400,"image":401,"tags":422,"publishDate":426,"slug":427},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":402,"sys":405,"fields":413},{"tags":403,"concepts":404},[],[],{"space":406,"id":408,"type":13,"createdAt":409,"updatedAt":409,"environment":410,"publishedVersion":412,"revision":20,"locale":21},{"sys":407},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":411},{"id":17,"type":9,"linkType":18},7,{"title":414,"description":415,"file":416},"When is a clickable div okay","An example modal element",{"url":417,"details":418,"fileName":421,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":419,"image":420},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[423,424,425],"Accessibility","UX","HTML","2023-07-18","when-is-a-clickable-div-okay",{"id":429,"type":47},"brxitJC35PyChlVzusyLP",{"fields":431,"sys":459},{"title":432,"description":433,"image":434,"tags":454,"publishDate":457,"slug":458},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":435,"sys":438,"fields":445},{"tags":436,"concepts":437},[],[],{"space":439,"id":441,"type":13,"createdAt":442,"updatedAt":442,"environment":443,"publishedVersion":394,"revision":20,"locale":21},{"sys":440},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":444},{"id":17,"type":9,"linkType":18},{"title":446,"description":447,"file":448},"clutter","A cluttered office desk",{"url":449,"details":450,"fileName":453,"contentType":161},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":451,"image":452},281805,{"width":30,"height":31},"clutter.jpg",[455,456,425],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":460,"type":47},"9dijdAHS9ROnOwXit47NQ",{"fields":462,"sys":489},{"title":463,"description":464,"image":465,"tags":485,"publishDate":487,"slug":488},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":466,"sys":469,"fields":476},{"tags":467,"concepts":468},[],[],{"space":470,"id":472,"type":13,"createdAt":473,"updatedAt":473,"environment":474,"publishedVersion":394,"revision":20,"locale":21},{"sys":471},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":475},{"id":17,"type":9,"linkType":18},{"title":477,"description":478,"file":479},"css=hover-media-query-og","CSS media query for hover",{"url":480,"details":481,"fileName":484,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":482,"image":483},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[486],"CSS","2020-07-06","hover-css-media-query",{"id":490,"type":47},"5GKjEQKbXAneX7HsUv1qtm",{"fields":492,"sys":519},{"title":493,"description":494,"image":495,"tags":515,"publishDate":517,"slug":518},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":496,"sys":499,"fields":506},{"tags":497,"concepts":498},[],[],{"space":500,"id":502,"type":13,"createdAt":503,"updatedAt":503,"environment":504,"publishedVersion":412,"revision":20,"locale":21},{"sys":501},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":505},{"id":17,"type":9,"linkType":18},{"title":507,"description":508,"file":509},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":510,"details":511,"fileName":514,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":512,"image":513},6959,{"width":30,"height":31},"neumorphic-design-og.png",[516,486],"Design","2020-05-27","learning-neumorphic-design",{"id":520,"type":47},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":522},[465,401,523,434,495],{"metadata":524,"sys":527,"fields":532},{"tags":525,"concepts":526},[],[],{"space":528,"id":147,"type":13,"createdAt":148,"updatedAt":149,"environment":530,"publishedVersion":152,"revision":133,"locale":21},{"sys":529},{"type":9,"linkType":10,"id":11},{"sys":531},{"id":17,"type":9,"linkType":18},{"title":154,"description":154,"file":533},{"url":156,"details":534,"fileName":160,"contentType":161},{"size":158,"image":535},{"width":30,"height":31},1730423475330] \ No newline at end of file +[{"data":1,"prerenderedAt":536},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"article-how-to-protect-state-in-pinia":117,"$rpzcfBTaqR":375,"article-list-how-to-protect-state-in-pinia":392},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119,"includes":373},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"7CUW25a1jLiar8pzd8K9Nh","2024-04-07T19:00:42.324Z","2024-04-30T18:52:40.840Z",{"sys":131},{"id":17,"type":9,"linkType":18},291,2,{"sys":135},{"type":9,"linkType":56,"id":136},"article",{"title":138,"slug":139,"image":140,"description":162,"publishDate":163,"tags":164,"body":166},"How to protect state in Pinia 🍍","how-to-protect-state-in-pinia",{"metadata":141,"sys":144,"fields":153},{"tags":142,"concepts":143},[],[],{"space":145,"id":147,"type":13,"createdAt":148,"updatedAt":149,"environment":150,"publishedVersion":152,"revision":133,"locale":21},{"sys":146},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":151},{"id":17,"type":9,"linkType":18},9,{"title":154,"description":154,"file":155},"Pineapple",{"url":156,"details":157,"fileName":160,"contentType":161},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":158,"image":159},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.","2024-04-07",[165],"Vue",{"nodeType":116,"data":167,"content":168},{},[169,219,236,243,250,266,274,322,345],{"nodeType":101,"data":170,"content":171},{},[172,176,185,189,197,201,209,213],{"nodeType":100,"value":173,"marks":174,"data":175},"",[],{},{"nodeType":177,"data":178,"content":180},"hyperlink",{"uri":179},"https://pinia.vuejs.org/",[181],{"nodeType":100,"value":182,"marks":183,"data":184},"Pinia",[],{},{"nodeType":100,"value":186,"marks":187,"data":188}," is a relatively new state management tool for the Vue ecosystem. It is the new preferred state management tool recommended by the Vue core team replacing ",[],{},{"nodeType":177,"data":190,"content":192},{"uri":191},"https://vuex.vuejs.org/",[193],{"nodeType":100,"value":194,"marks":195,"data":196},"Vuex",[],{},{"nodeType":100,"value":198,"marks":199,"data":200},". Compared to Vuex, Pinia is type-safe by default (",[],{},{"nodeType":177,"data":202,"content":204},{"uri":203},"https://github.com/paroi-tech/direct-vuex",[205],{"nodeType":100,"value":206,"marks":207,"data":208},"direct-vuex",[],{},{"nodeType":100,"value":210,"marks":211,"data":212}," was needed to make Vuex type-safe), extremely lightweight, and modular by design (meaning you can create multiple stores instead of multiple modules inside one store, which optimises performance). Similar to Vuex, Pinia has state, computed properties (getters) and methods (mutations and actions). ",[],{},{"nodeType":100,"value":214,"marks":215,"data":218},"Read more about Pinia and its usage to understand the similarities and differences between Pinia and Vuex.",[216],{"type":217},"italic",{},{"nodeType":101,"data":220,"content":221},{},[222,226,232],{"nodeType":100,"value":223,"marks":224,"data":225},"Vuex's state is automatically protected, whereas Pinia's state is not. In Vuex, you could not directly edit the state, to do so you needed a mutation method that would edit or \"mutate\" the state for you. If you tried editing the state directly in Vuex, you would be faced with the following error message, \"",[],{},{"nodeType":100,"value":227,"marks":228,"data":231},"Error: [vuex] do not mutate vuex store state outside mutation handlers.",[229],{"type":230},"code",{},{"nodeType":100,"value":233,"marks":234,"data":235},"\"",[],{},{"nodeType":101,"data":237,"content":238},{},[239],{"nodeType":100,"value":240,"marks":241,"data":242},"But with Pinia, the state is exposed and can be mutated willy nilly from anywhere within your application. In a lot of cases, this is fine and actually makes state management a lot easier and simpler because in these cases there is no need for a mutation method whose sole purpose is to update a state property with the value you passed to the mutation method.",[],{},{"nodeType":101,"data":244,"content":245},{},[246],{"nodeType":100,"value":247,"marks":248,"data":249},"In some cases though, this might not be ideal. For example, we are building a rugby game in Vue (it's just an example, go with it). Unlike with football (or soccer for you Americans) where the scoring system increments by 1 whenever a goal is scored, rugby's scoring system increases by a different number depending on how those points were scored. 5 points for a try, 3 points for a penalty, 2 points for a conversion, and 3 points for a drop goal.",[],{},{"nodeType":101,"data":251,"content":252},{},[253,257,262],{"nodeType":100,"value":254,"marks":255,"data":256},"We want to be able to protect the ",[],{},{"nodeType":100,"value":258,"marks":259,"data":261},"score",[260],{"type":230},{},{"nodeType":100,"value":263,"marks":264,"data":265}," state property by only allowing it to be mutated in a specific way. We can easily do this by creating an exposed computed property that returns the state, and not exposing the state property.",[],{},{"nodeType":101,"data":267,"content":268},{},[269],{"nodeType":100,"value":270,"marks":271,"data":273},"TYPESCRIPT\nimport { defineStore } from 'pinia';\nimport { ref, computed } from 'vue';\n\nexport const useRugbyStore = defineStore('rugbyStory', () => {\n const _score = ref\u003Cnumber>(0);\n\n const score = computed(() => _score.value);\n\n function scorePoints(type: 'try'|'penalty'|'conversion'|'drop goal'): void {\n switch (type) {\n case 'try':\n _score.value += 5;\n break;\n case 'penalty':\n case 'drop goal':\n _score.value += 3;\n break;\n case 'conversion':\n _score.value += 2;\n break;\n }\n }\n\n return { score, scorePoints };\n})",[272],{"type":230},{},{"nodeType":101,"data":275,"content":276},{},[277,281,286,290,294,298,302,306,310,314,319],{"nodeType":100,"value":278,"marks":279,"data":280},"In the example above, ",[],{},{"nodeType":100,"value":282,"marks":283,"data":285},"_score",[284],{"type":230},{},{"nodeType":100,"value":287,"marks":288,"data":289}," (annotated prefixed with an underscore to show it is internal) can be read via the ",[],{},{"nodeType":100,"value":258,"marks":291,"data":293},[292],{"type":230},{},{"nodeType":100,"value":295,"marks":296,"data":297}," computed property, but cannot be mutated directly. Since ",[],{},{"nodeType":100,"value":258,"marks":299,"data":301},[300],{"type":230},{},{"nodeType":100,"value":303,"marks":304,"data":305}," is a computed property, Vue does not allow its value to be changed, if you try editing the value of ",[],{},{"nodeType":100,"value":258,"marks":307,"data":309},[308],{"type":230},{},{"nodeType":100,"value":311,"marks":312,"data":313},", you will get the following TypeScript error, \"",[],{},{"nodeType":100,"value":315,"marks":316,"data":318},"Cannot assign to \"score\" because it is a read-only property.",[317],{"type":230},{},{"nodeType":100,"value":233,"marks":320,"data":321},[],{},{"nodeType":101,"data":323,"content":324},{},[325,329,333,337,341],{"nodeType":100,"value":326,"marks":327,"data":328},"One caveat to this though is that ",[],{},{"nodeType":100,"value":258,"marks":330,"data":332},[331],{"type":230},{},{"nodeType":100,"value":334,"marks":335,"data":336}," or ",[],{},{"nodeType":100,"value":282,"marks":338,"data":340},[339],{"type":230},{},{"nodeType":100,"value":342,"marks":343,"data":344}," will never appear in Pinia's global state or in the Vue devtools Pinia panel, so keep this in mind.",[],{},{"nodeType":101,"data":346,"content":347},{},[348,352,360,364,369],{"nodeType":100,"value":349,"marks":350,"data":351},"I feel this is quite a simple, neat, easy-to-maintain, and type-safe method of protecting Pinia state. I have found other methods of protecting state such as ",[],{},{"nodeType":177,"data":353,"content":355},{"uri":354},"https://github.com/vuejs/pinia/issues/58#issuecomment-983284955",[356],{"nodeType":100,"value":357,"marks":358,"data":359},"this example",[],{},{"nodeType":100,"value":361,"marks":362,"data":363}," using Vue's ",[],{},{"nodeType":100,"value":365,"marks":366,"data":368},"readonly()",[367],{"type":230},{},{"nodeType":100,"value":370,"marks":371,"data":372}," method but I didn't find this to be type-safe or very nice to use.",[],{},{"Asset":374},[140],{"sys":376,"total":20,"skip":37,"limit":20,"items":377},{"type":36},[378],{"fields":379,"sys":390},{"articleDisclaimer":380},{"data":381,"content":382,"nodeType":116},{},[383],{"data":384,"content":385,"nodeType":101},{},[386],{"data":387,"marks":388,"value":389,"nodeType":100},{},[],"Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.",{"id":391,"type":47},"3Viop9UQLlIrWglTQjk5Bd",{"sys":393,"total":394,"skip":37,"limit":395,"items":396,"includes":521},{"type":36},5,1000,[397,430,461,491],{"fields":398,"sys":428},{"title":399,"description":400,"image":401,"tags":422,"publishDate":426,"slug":427},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":402,"sys":405,"fields":413},{"tags":403,"concepts":404},[],[],{"space":406,"id":408,"type":13,"createdAt":409,"updatedAt":409,"environment":410,"publishedVersion":412,"revision":20,"locale":21},{"sys":407},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":411},{"id":17,"type":9,"linkType":18},7,{"title":414,"description":415,"file":416},"When is a clickable div okay","An example modal element",{"url":417,"details":418,"fileName":421,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":419,"image":420},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[423,424,425],"Accessibility","UX","HTML","2023-07-18","when-is-a-clickable-div-okay",{"id":429,"type":47},"brxitJC35PyChlVzusyLP",{"fields":431,"sys":459},{"title":432,"description":433,"image":434,"tags":454,"publishDate":457,"slug":458},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":435,"sys":438,"fields":445},{"tags":436,"concepts":437},[],[],{"space":439,"id":441,"type":13,"createdAt":442,"updatedAt":442,"environment":443,"publishedVersion":394,"revision":20,"locale":21},{"sys":440},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":444},{"id":17,"type":9,"linkType":18},{"title":446,"description":447,"file":448},"clutter","A cluttered office desk",{"url":449,"details":450,"fileName":453,"contentType":161},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":451,"image":452},281805,{"width":30,"height":31},"clutter.jpg",[455,456,425],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":460,"type":47},"9dijdAHS9ROnOwXit47NQ",{"fields":462,"sys":489},{"title":463,"description":464,"image":465,"tags":485,"publishDate":487,"slug":488},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":466,"sys":469,"fields":476},{"tags":467,"concepts":468},[],[],{"space":470,"id":472,"type":13,"createdAt":473,"updatedAt":473,"environment":474,"publishedVersion":394,"revision":20,"locale":21},{"sys":471},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":475},{"id":17,"type":9,"linkType":18},{"title":477,"description":478,"file":479},"css=hover-media-query-og","CSS media query for hover",{"url":480,"details":481,"fileName":484,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":482,"image":483},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[486],"CSS","2020-07-06","hover-css-media-query",{"id":490,"type":47},"5GKjEQKbXAneX7HsUv1qtm",{"fields":492,"sys":519},{"title":493,"description":494,"image":495,"tags":515,"publishDate":517,"slug":518},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":496,"sys":499,"fields":506},{"tags":497,"concepts":498},[],[],{"space":500,"id":502,"type":13,"createdAt":503,"updatedAt":503,"environment":504,"publishedVersion":412,"revision":20,"locale":21},{"sys":501},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":505},{"id":17,"type":9,"linkType":18},{"title":507,"description":508,"file":509},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":510,"details":511,"fileName":514,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":512,"image":513},6959,{"width":30,"height":31},"neumorphic-design-og.png",[516,486],"Design","2020-05-27","learning-neumorphic-design",{"id":520,"type":47},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":522},[465,401,523,434,495],{"metadata":524,"sys":527,"fields":532},{"tags":525,"concepts":526},[],[],{"space":528,"id":147,"type":13,"createdAt":148,"updatedAt":149,"environment":530,"publishedVersion":152,"revision":133,"locale":21},{"sys":529},{"type":9,"linkType":10,"id":11},{"sys":531},{"id":17,"type":9,"linkType":18},{"title":154,"description":154,"file":533},{"url":156,"details":534,"fileName":160,"contentType":161},{"size":158,"image":535},{"width":30,"height":31},1730509477487] \ No newline at end of file diff --git a/blog/2024/how-to-protect-state-in-pinia/index.html b/blog/2024/how-to-protect-state-in-pinia/index.html index 9b7246f08..a2cc54e50 100644 --- a/blog/2024/how-to-protect-state-in-pinia/index.html +++ b/blog/2024/how-to-protect-state-in-pinia/index.html @@ -22,7 +22,7 @@ - + @@ -106,5 +106,5 @@ } return { score, scorePoints }; -})

In the example above, _score (annotated prefixed with an underscore to show it is internal) can be read via the score computed property, but cannot be mutated directly. Since score is a computed property, Vue does not allow its value to be changed, if you try editing the value of score, you will get the following TypeScript error, "Cannot assign to "score" because it is a read-only property."

One caveat to this though is that score or _score will never appear in Pinia's global state or in the Vue devtools Pinia panel, so keep this in mind.

I feel this is quite a simple, neat, easy-to-maintain, and type-safe method of protecting Pinia state. I have found other methods of protecting state such as this example using Vue's readonly() method but I didn't find this to be type-safe or very nice to use.

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

- \ No newline at end of file +})

In the example above, _score (annotated prefixed with an underscore to show it is internal) can be read via the score computed property, but cannot be mutated directly. Since score is a computed property, Vue does not allow its value to be changed, if you try editing the value of score, you will get the following TypeScript error, "Cannot assign to "score" because it is a read-only property."

One caveat to this though is that score or _score will never appear in Pinia's global state or in the Vue devtools Pinia panel, so keep this in mind.

I feel this is quite a simple, neat, easy-to-maintain, and type-safe method of protecting Pinia state. I have found other methods of protecting state such as this example using Vue's readonly() method but I didn't find this to be type-safe or very nice to use.

Disclaimer: All data and information are correct to the best of my knowledge at the time of writing.

What to read next

+ \ No newline at end of file diff --git a/blog/_payload.json b/blog/_payload.json index ba99eb2ef..5a95752ba 100644 --- a/blog/_payload.json +++ b/blog/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":298},["ShallowReactive",2],{"$siNM9WAguS":3,"$NjJfml0E8M":34,"$mMA9bTNYLP":57,"article-list-undefined":134},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"fields":40,"sys":54},{"hubDescription":41},{"nodeType":42,"data":43,"content":44},"document",{},[45],{"nodeType":46,"data":47,"content":48},"paragraph",{},[49],{"nodeType":50,"value":51,"marks":52,"data":53},"text","I write articles about frontend development, careers in tech, my experiences and more. All articles are my own writing.",[],{},{"id":55,"type":56},"3Viop9UQLlIrWglTQjk5Bd","Entry",{"sys":58,"total":20,"skip":37,"limit":20,"items":59},{"type":36},[60],{"metadata":61,"sys":64,"fields":78},{"tags":62,"concepts":63},[],[],{"space":65,"id":67,"type":56,"createdAt":68,"updatedAt":69,"environment":70,"publishedVersion":72,"revision":73,"contentType":74,"locale":21},{"sys":66},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":71},{"id":17,"type":9,"linkType":18},61,13,{"sys":75},{"type":9,"linkType":76,"id":77},"ContentType","footer",{"name":79,"quickLinks":80,"socialLinks":97,"legalText":110},"Footer",[81,85,89,93],{"id":82,"key":83,"value":84},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":86,"key":87,"value":88},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":90,"key":91,"value":92},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":94,"key":95,"value":96},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[98,102,106],{"id":99,"key":100,"value":101},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":103,"key":104,"value":105},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":107,"key":108,"value":109},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":111,"content":112,"nodeType":42},{},[113,120,127],{"data":114,"content":115,"nodeType":46},{},[116],{"data":117,"marks":118,"value":119,"nodeType":50},{},[],"©2018-2024",{"data":121,"content":122,"nodeType":46},{},[123],{"data":124,"marks":125,"value":126,"nodeType":50},{},[],"All rights reserved.",{"data":128,"content":129,"nodeType":46},{},[130],{"data":131,"marks":132,"value":133,"nodeType":50},{},[],"Jack Domleo",{"sys":135,"total":136,"skip":37,"limit":137,"items":138,"includes":296},{"type":36},5,1000,[139,172,205,236,266],{"fields":140,"sys":170},{"title":141,"description":142,"image":143,"tags":166,"publishDate":168,"slug":169},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":144,"sys":147,"fields":157},{"tags":145,"concepts":146},[],[],{"space":148,"id":150,"type":13,"createdAt":151,"updatedAt":152,"environment":153,"publishedVersion":155,"revision":156,"locale":21},{"sys":149},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":154},{"id":17,"type":9,"linkType":18},9,2,{"title":158,"description":158,"file":159},"Pineapple",{"url":160,"details":161,"fileName":164,"contentType":165},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":162,"image":163},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg",[167],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":171,"type":56},"7CUW25a1jLiar8pzd8K9Nh",{"fields":173,"sys":203},{"title":174,"description":175,"image":176,"tags":197,"publishDate":201,"slug":202},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":177,"sys":180,"fields":188},{"tags":178,"concepts":179},[],[],{"space":181,"id":183,"type":13,"createdAt":184,"updatedAt":184,"environment":185,"publishedVersion":187,"revision":20,"locale":21},{"sys":182},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":186},{"id":17,"type":9,"linkType":18},7,{"title":189,"description":190,"file":191},"When is a clickable div okay","An example modal element",{"url":192,"details":193,"fileName":196,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":194,"image":195},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[198,199,200],"Accessibility","UX","HTML","2023-07-18","when-is-a-clickable-div-okay",{"id":204,"type":56},"brxitJC35PyChlVzusyLP",{"fields":206,"sys":234},{"title":207,"description":208,"image":209,"tags":229,"publishDate":232,"slug":233},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":210,"sys":213,"fields":220},{"tags":211,"concepts":212},[],[],{"space":214,"id":216,"type":13,"createdAt":217,"updatedAt":217,"environment":218,"publishedVersion":136,"revision":20,"locale":21},{"sys":215},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":219},{"id":17,"type":9,"linkType":18},{"title":221,"description":222,"file":223},"clutter","A cluttered office desk",{"url":224,"details":225,"fileName":228,"contentType":165},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":226,"image":227},281805,{"width":30,"height":31},"clutter.jpg",[230,231,200],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":235,"type":56},"9dijdAHS9ROnOwXit47NQ",{"fields":237,"sys":264},{"title":238,"description":239,"image":240,"tags":260,"publishDate":262,"slug":263},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":241,"sys":244,"fields":251},{"tags":242,"concepts":243},[],[],{"space":245,"id":247,"type":13,"createdAt":248,"updatedAt":248,"environment":249,"publishedVersion":136,"revision":20,"locale":21},{"sys":246},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":250},{"id":17,"type":9,"linkType":18},{"title":252,"description":253,"file":254},"css=hover-media-query-og","CSS media query for hover",{"url":255,"details":256,"fileName":259,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":257,"image":258},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[261],"CSS","2020-07-06","hover-css-media-query",{"id":265,"type":56},"5GKjEQKbXAneX7HsUv1qtm",{"fields":267,"sys":294},{"title":268,"description":269,"image":270,"tags":290,"publishDate":292,"slug":293},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":271,"sys":274,"fields":281},{"tags":272,"concepts":273},[],[],{"space":275,"id":277,"type":13,"createdAt":278,"updatedAt":278,"environment":279,"publishedVersion":187,"revision":20,"locale":21},{"sys":276},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":280},{"id":17,"type":9,"linkType":18},{"title":282,"description":283,"file":284},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":285,"details":286,"fileName":289,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":287,"image":288},6959,{"width":30,"height":31},"neumorphic-design-og.png",[291,261],"Design","2020-05-27","learning-neumorphic-design",{"id":295,"type":56},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":297},[240,176,143,209,270],1730423475929] \ No newline at end of file +[{"data":1,"prerenderedAt":298},["ShallowReactive",2],{"$siNM9WAguS":3,"$NjJfml0E8M":34,"$mMA9bTNYLP":57,"article-list-undefined":134},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"fields":40,"sys":54},{"hubDescription":41},{"nodeType":42,"data":43,"content":44},"document",{},[45],{"nodeType":46,"data":47,"content":48},"paragraph",{},[49],{"nodeType":50,"value":51,"marks":52,"data":53},"text","I write articles about frontend development, careers in tech, my experiences and more. All articles are my own writing.",[],{},{"id":55,"type":56},"3Viop9UQLlIrWglTQjk5Bd","Entry",{"sys":58,"total":20,"skip":37,"limit":20,"items":59},{"type":36},[60],{"metadata":61,"sys":64,"fields":78},{"tags":62,"concepts":63},[],[],{"space":65,"id":67,"type":56,"createdAt":68,"updatedAt":69,"environment":70,"publishedVersion":72,"revision":73,"contentType":74,"locale":21},{"sys":66},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":71},{"id":17,"type":9,"linkType":18},61,13,{"sys":75},{"type":9,"linkType":76,"id":77},"ContentType","footer",{"name":79,"quickLinks":80,"socialLinks":97,"legalText":110},"Footer",[81,85,89,93],{"id":82,"key":83,"value":84},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":86,"key":87,"value":88},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":90,"key":91,"value":92},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":94,"key":95,"value":96},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[98,102,106],{"id":99,"key":100,"value":101},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":103,"key":104,"value":105},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":107,"key":108,"value":109},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":111,"content":112,"nodeType":42},{},[113,120,127],{"data":114,"content":115,"nodeType":46},{},[116],{"data":117,"marks":118,"value":119,"nodeType":50},{},[],"©2018-2024",{"data":121,"content":122,"nodeType":46},{},[123],{"data":124,"marks":125,"value":126,"nodeType":50},{},[],"All rights reserved.",{"data":128,"content":129,"nodeType":46},{},[130],{"data":131,"marks":132,"value":133,"nodeType":50},{},[],"Jack Domleo",{"sys":135,"total":136,"skip":37,"limit":137,"items":138,"includes":296},{"type":36},5,1000,[139,172,205,236,266],{"fields":140,"sys":170},{"title":141,"description":142,"image":143,"tags":166,"publishDate":168,"slug":169},"How to protect state in Pinia 🍍","Pinia, unlike Vuex, allows the state to be mutated directly, but sometimes we want to protect the state from being changed willy-nilly.",{"metadata":144,"sys":147,"fields":157},{"tags":145,"concepts":146},[],[],{"space":148,"id":150,"type":13,"createdAt":151,"updatedAt":152,"environment":153,"publishedVersion":155,"revision":156,"locale":21},{"sys":149},{"type":9,"linkType":10,"id":11},"5iurYkErtwupD6LkJba4Jd","2024-03-23T20:34:09.782Z","2024-03-23T20:36:22.415Z",{"sys":154},{"id":17,"type":9,"linkType":18},9,2,{"title":158,"description":158,"file":159},"Pineapple",{"url":160,"details":161,"fileName":164,"contentType":165},"//images.ctfassets.net/l1wujzr3g1ab/5iurYkErtwupD6LkJba4Jd/eb717e6e4789957a33423f5f9fea4197/sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg",{"size":162,"image":163},153411,{"width":30,"height":31},"sumner-mahaffey-7vCt_lFxKx4-unsplash.jpg","image/jpeg",[167],"Vue","2024-04-07","how-to-protect-state-in-pinia",{"id":171,"type":56},"7CUW25a1jLiar8pzd8K9Nh",{"fields":173,"sys":203},{"title":174,"description":175,"image":176,"tags":197,"publishDate":201,"slug":202},"When is a clickable div okay?","When it comes to accessibility, putting a click event on a div is taboo, but when is it okay to do so?",{"metadata":177,"sys":180,"fields":188},{"tags":178,"concepts":179},[],[],{"space":181,"id":183,"type":13,"createdAt":184,"updatedAt":184,"environment":185,"publishedVersion":187,"revision":20,"locale":21},{"sys":182},{"type":9,"linkType":10,"id":11},"3nzHtHCAq4EKudWvrOOw4p","2023-07-11T21:23:08.036Z",{"sys":186},{"id":17,"type":9,"linkType":18},7,{"title":189,"description":190,"file":191},"When is a clickable div okay","An example modal element",{"url":192,"details":193,"fileName":196,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nzHtHCAq4EKudWvrOOw4p/8bd8a51d97f431c933084f4413036eec/when-is-a-clickable-div-okay.png",{"size":194,"image":195},133997,{"width":30,"height":31},"when-is-a-clickable-div-okay.png",[198,199,200],"Accessibility","UX","HTML","2023-07-18","when-is-a-clickable-div-okay",{"id":204,"type":56},"brxitJC35PyChlVzusyLP",{"fields":206,"sys":234},{"title":207,"description":208,"image":209,"tags":229,"publishDate":232,"slug":233},"Should you clean out your blog?","If like me, you own a blog, you may ask yourself if it's ever a good idea to clean it out from time to time.",{"metadata":210,"sys":213,"fields":220},{"tags":211,"concepts":212},[],[],{"space":214,"id":216,"type":13,"createdAt":217,"updatedAt":217,"environment":218,"publishedVersion":136,"revision":20,"locale":21},{"sys":215},{"type":9,"linkType":10,"id":11},"6Fk3J1WEn0YRhIGUawl63P","2023-02-15T20:26:31.807Z",{"sys":219},{"id":17,"type":9,"linkType":18},{"title":221,"description":222,"file":223},"clutter","A cluttered office desk",{"url":224,"details":225,"fileName":228,"contentType":165},"//images.ctfassets.net/l1wujzr3g1ab/6Fk3J1WEn0YRhIGUawl63P/a98a9a5ba72aef1afc04111bc7a9e5f9/clutter.jpg",{"size":226,"image":227},281805,{"width":30,"height":31},"clutter.jpg",[230,231,200],"Tips","Productivity","2023-02-16","should-you-clean-out-your-blog",{"id":235,"type":56},"9dijdAHS9ROnOwXit47NQ",{"fields":237,"sys":264},{"title":238,"description":239,"image":240,"tags":260,"publishDate":262,"slug":263},"@media (hover: hover) - CSS Media Query","The hover CSS media feature can be used to test whether the user's primary input mechanism can hover over elements.",{"metadata":241,"sys":244,"fields":251},{"tags":242,"concepts":243},[],[],{"space":245,"id":247,"type":13,"createdAt":248,"updatedAt":248,"environment":249,"publishedVersion":136,"revision":20,"locale":21},{"sys":246},{"type":9,"linkType":10,"id":11},"1BWwf3Fg2A0y1RhcY7oNqq","2023-01-22T21:55:22.730Z",{"sys":250},{"id":17,"type":9,"linkType":18},{"title":252,"description":253,"file":254},"css=hover-media-query-og","CSS media query for hover",{"url":255,"details":256,"fileName":259,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1BWwf3Fg2A0y1RhcY7oNqq/0dadb7c242364de5ac4f5b63dd57f1b6/css_hover-media-query-og.png",{"size":257,"image":258},13019,{"width":30,"height":31},"css=hover-media-query-og.png",[261],"CSS","2020-07-06","hover-css-media-query",{"id":265,"type":56},"5GKjEQKbXAneX7HsUv1qtm",{"fields":267,"sys":294},{"title":268,"description":269,"image":270,"tags":290,"publishDate":292,"slug":293},"Learning Neumorphic Design","The awesome design trend that never took off! What are the fundamentals to neumorphic design?",{"metadata":271,"sys":274,"fields":281},{"tags":272,"concepts":273},[],[],{"space":275,"id":277,"type":13,"createdAt":278,"updatedAt":278,"environment":279,"publishedVersion":187,"revision":20,"locale":21},{"sys":276},{"type":9,"linkType":10,"id":11},"T6RRM5TpnSzYm6UQolMMf","2023-01-24T20:35:16.287Z",{"sys":280},{"id":17,"type":9,"linkType":18},{"title":282,"description":283,"file":284},"neumorphic-design-og","A music player UI with a neumorphism design",{"url":285,"details":286,"fileName":289,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/T6RRM5TpnSzYm6UQolMMf/a51b32aea0faa8885d8e525c436b5073/neumorphic-design-og.png",{"size":287,"image":288},6959,{"width":30,"height":31},"neumorphic-design-og.png",[291,261],"Design","2020-05-27","learning-neumorphic-design",{"id":295,"type":56},"2KWdODn6oaRYNzG4Qz4yd3",{"Asset":297},[240,176,143,209,270],1730509478136] \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index 99bc0d4cf..e057d3f0a 100644 --- a/blog/index.html +++ b/blog/index.html @@ -25,7 +25,7 @@ - + @@ -80,5 +80,5 @@ -
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/index.html b/index.html index abed1ca2e..97449b013 100644 --- a/index.html +++ b/index.html @@ -21,7 +21,7 @@ - + @@ -77,5 +77,5 @@ -
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/links/_payload.json b/links/_payload.json index 82aea2cf7..064b8c1ef 100644 --- a/links/_payload.json +++ b/links/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":156},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"$jGglCoQTCg":117},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119},{"type":36},[120],{"metadata":121,"sys":124,"fields":135},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":52,"revision":53,"contentType":132,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"7wQfnGkr6ugDbtBc01Oo3q","2023-01-29T22:34:29.625Z","2024-04-30T18:48:13.573Z",{"sys":131},{"id":17,"type":9,"linkType":18},{"sys":133},{"type":9,"linkType":56,"id":134},"links",{"title":75,"links":136},{"items":137},[138,141,143,145,148,150,152],{"name":139,"url":64,"icon":140},"Website","j_icon",{"name":71,"url":72,"icon":142},"blog",{"name":80,"url":81,"icon":144},"github",{"name":146,"url":147,"icon":144},"GitHub Gists","https://gist.github.com/jackdomleo7",{"name":84,"url":85,"icon":149},"codepen",{"name":88,"url":89,"icon":151},"linkedin",{"name":153,"url":154,"icon":155},"Goodreads","https://www.goodreads.com/author/show/21046556.Jack_Domleo","goodreads",1730423475716] \ No newline at end of file +[{"data":1,"prerenderedAt":156},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"$jGglCoQTCg":117},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119},{"type":36},[120],{"metadata":121,"sys":124,"fields":135},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":52,"revision":53,"contentType":132,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"7wQfnGkr6ugDbtBc01Oo3q","2023-01-29T22:34:29.625Z","2024-04-30T18:48:13.573Z",{"sys":131},{"id":17,"type":9,"linkType":18},{"sys":133},{"type":9,"linkType":56,"id":134},"links",{"title":75,"links":136},{"items":137},[138,141,143,145,148,150,152],{"name":139,"url":64,"icon":140},"Website","j_icon",{"name":71,"url":72,"icon":142},"blog",{"name":80,"url":81,"icon":144},"github",{"name":146,"url":147,"icon":144},"GitHub Gists","https://gist.github.com/jackdomleo7",{"name":84,"url":85,"icon":149},"codepen",{"name":88,"url":89,"icon":151},"linkedin",{"name":153,"url":154,"icon":155},"Goodreads","https://www.goodreads.com/author/show/21046556.Jack_Domleo","goodreads",1730509477879] \ No newline at end of file diff --git a/links/index.html b/links/index.html index f7d67f9eb..8a2cab3f3 100644 --- a/links/index.html +++ b/links/index.html @@ -18,7 +18,7 @@ - + @@ -70,5 +70,5 @@ -
- \ No newline at end of file +
+ \ No newline at end of file diff --git a/privacy-policy/_payload.json b/privacy-policy/_payload.json index 20c6aa371..0651f3485 100644 --- a/privacy-policy/_payload.json +++ b/privacy-policy/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":225},["ShallowReactive",2],{"$siNM9WAguS":3,"$mMA9bTNYLP":34,"basicpage-privacy-policy":117},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","Entry","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":51},{"id":17,"type":9,"linkType":18},61,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","footer",{"name":59,"quickLinks":60,"socialLinks":77,"legalText":90},"Footer",[61,65,69,73],{"id":62,"key":63,"value":64},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":66,"key":67,"value":68},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":70,"key":71,"value":72},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":74,"key":75,"value":76},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[78,82,86],{"id":79,"key":80,"value":81},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":83,"key":84,"value":85},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":87,"key":88,"value":89},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":91,"content":92,"nodeType":116},{},[93,102,109],{"data":94,"content":95,"nodeType":101},{},[96],{"data":97,"marks":98,"value":99,"nodeType":100},{},[],"©2018-2024","text","paragraph",{"data":103,"content":104,"nodeType":101},{},[105],{"data":106,"marks":107,"value":108,"nodeType":100},{},[],"All rights reserved.",{"data":110,"content":111,"nodeType":101},{},[112],{"data":113,"marks":114,"value":115,"nodeType":100},{},[],"Jack Domleo","document",{"sys":118,"total":20,"skip":37,"limit":20,"items":119},{"type":36},[120],{"metadata":121,"sys":124,"fields":137},{"tags":122,"concepts":123},[],[],{"space":125,"id":127,"type":47,"createdAt":128,"updatedAt":129,"environment":130,"publishedVersion":132,"revision":133,"contentType":134,"locale":21},{"sys":126},{"type":9,"linkType":10,"id":11},"5BhyWcixuuIzHusSjOmiNu","2023-01-31T07:57:09.214Z","2023-12-16T18:46:15.413Z",{"sys":131},{"id":17,"type":9,"linkType":18},38,3,{"sys":135},{"type":9,"linkType":56,"id":136},"basicPage",{"title":138,"slug":139,"body":140},"Privacy Policy","privacy-policy",{"nodeType":116,"data":141,"content":142},{},[143,156,176,183,190,197],{"nodeType":101,"data":144,"content":145},{},[146,152],{"nodeType":100,"value":147,"marks":148,"data":151},"Definitions",[149],{"type":150},"bold",{},{"nodeType":100,"value":153,"marks":154,"data":155},": 'I', 'me', 'my': Jack Domleo - owner of this website.\r",[],{},{"nodeType":101,"data":157,"content":158},{},[159,163,172],{"nodeType":100,"value":160,"marks":161,"data":162},"Your privacy is important to me. It is my policy to respect your privacy regarding any information I may collect from you across this website, ",[],{},{"nodeType":164,"data":165,"content":167},"hyperlink",{"uri":166},"https://jackdomleo.dev",[168],{"nodeType":100,"value":169,"marks":170,"data":171},"jackdomleo.dev",[],{},{"nodeType":100,"value":173,"marks":174,"data":175},".",[],{},{"nodeType":101,"data":177,"content":178},{},[179],{"nodeType":100,"value":180,"marks":181,"data":182},"I do not collect any personal information. I do not use cookies or any tracking software.\r",[],{},{"nodeType":101,"data":184,"content":185},{},[186],{"nodeType":100,"value":187,"marks":188,"data":189},"My website may link to external sites that are not operated by me. Please be aware that I have no control over the content and practices of these sites, and cannot accept responsibility or liability for their respective privacy policies.\r",[],{},{"nodeType":101,"data":191,"content":192},{},[193],{"nodeType":100,"value":194,"marks":195,"data":196},"My website may link to external sites via an affiliate link. Please be aware that each site may have its own way of tracking the affiliate back to me, whether it be via cookies or my own discount code. Please review their respective privacy policies regarding affiliate tracking.\r",[],{},{"nodeType":101,"data":198,"content":199},{},[200,204,210,214,222],{"nodeType":100,"value":201,"marks":202,"data":203},"Your continued use of my website will be regarded as acceptance of my practices around privacy and personal information. If you have any questions about how I handle user data and personal information, feel free to contact me via ",[],{},{"nodeType":164,"data":205,"content":206},{"uri":89},[207],{"nodeType":100,"value":88,"marks":208,"data":209},[],{},{"nodeType":100,"value":211,"marks":212,"data":213}," or ",[],{},{"nodeType":164,"data":215,"content":217},{"uri":216},"mailto:jackdomleo7@gmail.com",[218],{"nodeType":100,"value":219,"marks":220,"data":221},"email",[],{},{"nodeType":100,"value":173,"marks":223,"data":224},[],{},1730423475331] \ No newline at end of file +[{"data":1,"prerenderedAt":225},["ShallowReactive",2],{"$siNM9WAguS":3,"basicpage-privacy-policy":34,"$mMA9bTNYLP":151},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"5BhyWcixuuIzHusSjOmiNu","Entry","2023-01-31T07:57:09.214Z","2023-12-16T18:46:15.413Z",{"sys":51},{"id":17,"type":9,"linkType":18},38,3,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","basicPage",{"title":59,"slug":60,"body":61},"Privacy Policy","privacy-policy",{"nodeType":62,"data":63,"content":64},"document",{},[65,80,100,107,114,121],{"nodeType":66,"data":67,"content":68},"paragraph",{},[69,76],{"nodeType":70,"value":71,"marks":72,"data":75},"text","Definitions",[73],{"type":74},"bold",{},{"nodeType":70,"value":77,"marks":78,"data":79},": 'I', 'me', 'my': Jack Domleo - owner of this website.\r",[],{},{"nodeType":66,"data":81,"content":82},{},[83,87,96],{"nodeType":70,"value":84,"marks":85,"data":86},"Your privacy is important to me. It is my policy to respect your privacy regarding any information I may collect from you across this website, ",[],{},{"nodeType":88,"data":89,"content":91},"hyperlink",{"uri":90},"https://jackdomleo.dev",[92],{"nodeType":70,"value":93,"marks":94,"data":95},"jackdomleo.dev",[],{},{"nodeType":70,"value":97,"marks":98,"data":99},".",[],{},{"nodeType":66,"data":101,"content":102},{},[103],{"nodeType":70,"value":104,"marks":105,"data":106},"I do not collect any personal information. I do not use cookies or any tracking software.\r",[],{},{"nodeType":66,"data":108,"content":109},{},[110],{"nodeType":70,"value":111,"marks":112,"data":113},"My website may link to external sites that are not operated by me. Please be aware that I have no control over the content and practices of these sites, and cannot accept responsibility or liability for their respective privacy policies.\r",[],{},{"nodeType":66,"data":115,"content":116},{},[117],{"nodeType":70,"value":118,"marks":119,"data":120},"My website may link to external sites via an affiliate link. Please be aware that each site may have its own way of tracking the affiliate back to me, whether it be via cookies or my own discount code. Please review their respective privacy policies regarding affiliate tracking.\r",[],{},{"nodeType":66,"data":122,"content":123},{},[124,128,136,140,148],{"nodeType":70,"value":125,"marks":126,"data":127},"Your continued use of my website will be regarded as acceptance of my practices around privacy and personal information. If you have any questions about how I handle user data and personal information, feel free to contact me via ",[],{},{"nodeType":88,"data":129,"content":131},{"uri":130},"https://linkedin.com/in/jackdomleo7",[132],{"nodeType":70,"value":133,"marks":134,"data":135},"LinkedIn",[],{},{"nodeType":70,"value":137,"marks":138,"data":139}," or ",[],{},{"nodeType":88,"data":141,"content":143},{"uri":142},"mailto:jackdomleo7@gmail.com",[144],{"nodeType":70,"value":145,"marks":146,"data":147},"email",[],{},{"nodeType":70,"value":97,"marks":149,"data":150},[],{},{"sys":152,"total":20,"skip":37,"limit":20,"items":153},{"type":36},[154],{"metadata":155,"sys":158,"fields":171},{"tags":156,"concepts":157},[],[],{"space":159,"id":161,"type":47,"createdAt":162,"updatedAt":163,"environment":164,"publishedVersion":166,"revision":167,"contentType":168,"locale":21},{"sys":160},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":165},{"id":17,"type":9,"linkType":18},61,13,{"sys":169},{"type":9,"linkType":56,"id":170},"footer",{"name":172,"quickLinks":173,"socialLinks":190,"legalText":201},"Footer",[174,178,182,186],{"id":175,"key":176,"value":177},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":179,"key":180,"value":181},"3b093617-4c9c-41b7-ab57-72a53a2cb400","Projects","/projects",{"id":183,"key":184,"value":185},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":187,"key":188,"value":189},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[191,195,199],{"id":192,"key":193,"value":194},"6ca24d29-3228-4215-8b8e-32ad04743b65","GitHub","https://github.com/jackdomleo7",{"id":196,"key":197,"value":198},"46719126-f516-4853-9444-e40cd0576918","CodePen","https://codepen.io/jackdomleo7",{"id":200,"key":133,"value":130},"c1581e8d-c729-4232-8944-0f767d94177d",{"data":202,"content":203,"nodeType":62},{},[204,211,218],{"data":205,"content":206,"nodeType":66},{},[207],{"data":208,"marks":209,"value":210,"nodeType":70},{},[],"©2018-2024",{"data":212,"content":213,"nodeType":66},{},[214],{"data":215,"marks":216,"value":217,"nodeType":70},{},[],"All rights reserved.",{"data":219,"content":220,"nodeType":66},{},[221],{"data":222,"marks":223,"value":224,"nodeType":70},{},[],"Jack Domleo",1730509477487] \ No newline at end of file diff --git a/privacy-policy/index.html b/privacy-policy/index.html index dad844275..5b4714c44 100644 --- a/privacy-policy/index.html +++ b/privacy-policy/index.html @@ -18,7 +18,7 @@ - + @@ -70,5 +70,5 @@ -

Privacy Policy

Last updated:

Definitions: 'I', 'me', 'my': Jack Domleo - owner of this website.

Your privacy is important to me. It is my policy to respect your privacy regarding any information I may collect from you across this website, jackdomleo.dev.

I do not collect any personal information. I do not use cookies or any tracking software.

My website may link to external sites that are not operated by me. Please be aware that I have no control over the content and practices of these sites, and cannot accept responsibility or liability for their respective privacy policies.

My website may link to external sites via an affiliate link. Please be aware that each site may have its own way of tracking the affiliate back to me, whether it be via cookies or my own discount code. Please review their respective privacy policies regarding affiliate tracking.

Your continued use of my website will be regarded as acceptance of my practices around privacy and personal information. If you have any questions about how I handle user data and personal information, feel free to contact me via LinkedIn or email.

- \ No newline at end of file +

Privacy Policy

Last updated:

Definitions: 'I', 'me', 'my': Jack Domleo - owner of this website.

Your privacy is important to me. It is my policy to respect your privacy regarding any information I may collect from you across this website, jackdomleo.dev.

I do not collect any personal information. I do not use cookies or any tracking software.

My website may link to external sites that are not operated by me. Please be aware that I have no control over the content and practices of these sites, and cannot accept responsibility or liability for their respective privacy policies.

My website may link to external sites via an affiliate link. Please be aware that each site may have its own way of tracking the affiliate back to me, whether it be via cookies or my own discount code. Please review their respective privacy policies regarding affiliate tracking.

Your continued use of my website will be regarded as acceptance of my practices around privacy and personal information. If you have any questions about how I handle user data and personal information, feel free to contact me via LinkedIn or email.

+ \ No newline at end of file diff --git a/projects/_payload.json b/projects/_payload.json index be0909085..86e48f6ee 100644 --- a/projects/_payload.json +++ b/projects/_payload.json @@ -1 +1 @@ -[{"data":1,"prerenderedAt":939},["ShallowReactive",2],{"$siNM9WAguS":3,"$YWCdSV8Jub":34,"project-list-undefined":98,"$mMA9bTNYLP":869},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"4Og1KH2T7fvFl3RgBWX1rL","Entry","2023-01-27T22:02:37.696Z","2023-01-28T19:14:25.079Z",{"sys":51},{"id":17,"type":9,"linkType":18},33,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","projects",{"title":59,"description":60},"Projects",{"data":61,"content":62,"nodeType":97},{},[63],{"data":64,"content":65,"nodeType":96},{},[66,71,80,84,92],{"data":67,"marks":68,"value":69,"nodeType":70},{},[],"I enjoy creating different types of projects in my spare time using a range of technologies. You can find all of my featured projects here, and many more projects on ","text",{"data":72,"content":74,"nodeType":79},{"uri":73},"https://github.com/jackdomleo7",[75],{"data":76,"marks":77,"value":78,"nodeType":70},{},[],"GitHub","hyperlink",{"data":81,"marks":82,"value":83,"nodeType":70},{},[]," and ",{"data":85,"content":87,"nodeType":79},{"uri":86},"https://codepen.io/jackdomleo7",[88],{"data":89,"marks":90,"value":91,"nodeType":70},{},[],"CodePen",{"data":93,"marks":94,"value":95,"nodeType":70},{},[],".","paragraph","document",{"sys":99,"total":100,"skip":37,"limit":101,"items":102,"includes":867},{"type":36},15,1000,[103,162,215,264,315,369,417,469,519,568,619,669,718,766,815],{"metadata":104,"sys":107,"fields":118},{"tags":105,"concepts":106},[],[],{"space":108,"id":110,"type":47,"createdAt":111,"updatedAt":111,"environment":112,"publishedVersion":114,"revision":20,"contentType":115,"locale":21},{"sys":109},{"type":9,"linkType":10,"id":11},"4Kiex9dMPsL87rteSvnG2h","2023-01-28T19:13:41.069Z",{"sys":113},{"id":17,"type":9,"linkType":18},10,{"sys":116},{"type":9,"linkType":56,"id":117},"project",{"name":119,"type":120,"url":121,"description":122,"tech":132,"tags":137,"image":139},"Grassverse NFT","Client","https://www.grassverse.org/",{"data":123,"content":124,"nodeType":97},{},[125],{"data":126,"content":127,"nodeType":96},{},[128],{"data":129,"marks":130,"value":131,"nodeType":70},{},[],"This website came with pre-existing designs and includes a CMS and an account section for Grassverse asset owners to log in to view their assets and fellow owners of assets.",[133,134,135,136],"Nuxt 2","Web3","TypeScript","SCSS",[138],"NFT",{"metadata":140,"sys":143,"fields":151},{"tags":141,"concepts":142},[],[],{"space":144,"id":146,"type":13,"createdAt":147,"updatedAt":147,"environment":148,"publishedVersion":150,"revision":20,"locale":21},{"sys":145},{"type":9,"linkType":10,"id":11},"01rxXuPpEQ6phTc1Bvt9W9","2023-01-28T19:13:34.307Z",{"sys":149},{"id":17,"type":9,"linkType":18},3,{"title":152,"description":153,"file":154},"grassverse-project-img","",{"url":155,"details":156,"fileName":161,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/01rxXuPpEQ6phTc1Bvt9W9/5d347eb3e2a3731922c0aa7046273780/grassverse-project-img.png",{"size":157,"image":158},163210,{"width":159,"height":160},600,315,"grassverse-project-img.png",{"metadata":163,"sys":166,"fields":175},{"tags":164,"concepts":165},[],[],{"space":167,"id":169,"type":47,"createdAt":170,"updatedAt":170,"environment":171,"publishedVersion":19,"revision":20,"contentType":173,"locale":21},{"sys":168},{"type":9,"linkType":10,"id":11},"2JxOvMguZVHxM565SKDspu","2023-01-28T18:25:42.700Z",{"sys":172},{"id":17,"type":9,"linkType":18},{"sys":174},{"type":9,"linkType":56,"id":117},{"name":176,"type":177,"url":178,"description":179,"tech":189,"tags":192,"image":194},"npx jackdomleo7","Mini","https://github.com/jackdomleo7/npx_business_card",{"data":180,"content":181,"nodeType":97},{},[182],{"data":183,"content":184,"nodeType":96},{},[185],{"data":186,"marks":187,"value":188,"nodeType":70},{},[],"A simple npm script to show some details about me right in the console.",[190,191],"JavaScript","npx",[193],"npm package",{"metadata":195,"sys":198,"fields":206},{"tags":196,"concepts":197},[],[],{"space":199,"id":201,"type":13,"createdAt":202,"updatedAt":202,"environment":203,"publishedVersion":205,"revision":20,"locale":21},{"sys":200},{"type":9,"linkType":10,"id":11},"2ilJcH34gnOn1SEfkJqlJj","2023-01-28T18:25:36.903Z",{"sys":204},{"id":17,"type":9,"linkType":18},5,{"title":207,"description":176,"file":208},"npx-jackdomleo7-project-img",{"url":209,"details":210,"fileName":213,"contentType":214},"//images.ctfassets.net/l1wujzr3g1ab/2ilJcH34gnOn1SEfkJqlJj/69c7b64c07e828439e60e1287e47828c/npx-jackdomleo7-project-img.gif",{"size":211,"image":212},30415,{"width":159,"height":160},"npx-jackdomleo7-project-img.gif","image/gif",{"metadata":216,"sys":219,"fields":228},{"tags":217,"concepts":218},[],[],{"space":220,"id":222,"type":47,"createdAt":223,"updatedAt":223,"environment":224,"publishedVersion":114,"revision":20,"contentType":226,"locale":21},{"sys":221},{"type":9,"linkType":10,"id":11},"1y1gYckxXHOqS4a811GoMM","2023-01-28T18:10:23.588Z",{"sys":225},{"id":17,"type":9,"linkType":18},{"sys":227},{"type":9,"linkType":56,"id":117},{"name":229,"type":120,"url":230,"description":231,"tech":241,"tags":242,"image":243},"Mad Parrot Crew NFT","https://www.madparrotcrew.com/",{"data":232,"content":233,"nodeType":97},{},[234],{"data":235,"content":236,"nodeType":96},{},[237],{"data":238,"marks":239,"value":240,"nodeType":70},{},[],"Created a fully responsive minting website based on existing designs for the Mad Parrot Crew NFT.",[133,135,136],[138],{"metadata":244,"sys":247,"fields":255},{"tags":245,"concepts":246},[],[],{"space":248,"id":250,"type":13,"createdAt":251,"updatedAt":251,"environment":252,"publishedVersion":254,"revision":20,"locale":21},{"sys":249},{"type":9,"linkType":10,"id":11},"4yYU2VsDfEvMnOIFnWe8s6","2023-01-28T18:10:15.589Z",{"sys":253},{"id":17,"type":9,"linkType":18},6,{"title":256,"description":257,"file":258},"mad-parrot-crew-project-img","Screenshot of Mad Parrot Crew home page",{"url":259,"details":260,"fileName":263,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/4yYU2VsDfEvMnOIFnWe8s6/550e38a11ea5618096b160698925405c/mad-parrot-crew-project-img.png",{"size":261,"image":262},148413,{"width":159,"height":160},"mad-parrot-crew-project-img.png",{"metadata":265,"sys":268,"fields":278},{"tags":266,"concepts":267},[],[],{"space":269,"id":271,"type":47,"createdAt":272,"updatedAt":272,"environment":273,"publishedVersion":275,"revision":20,"contentType":276,"locale":21},{"sys":270},{"type":9,"linkType":10,"id":11},"6OEC4mGGiIzD1ebZVuCeke","2023-01-28T17:54:35.724Z",{"sys":274},{"id":17,"type":9,"linkType":18},7,{"sys":277},{"type":9,"linkType":56,"id":117},{"name":279,"type":280,"url":281,"description":282,"tech":292,"image":294},"Spring Clean Twitter Bot","Project","https://github.com/jackdomleo7/Spring_Clean_Twitter_Bot",{"data":283,"content":284,"nodeType":97},{},[285],{"data":286,"content":287,"nodeType":96},{},[288],{"data":289,"marks":290,"value":291,"nodeType":70},{},[],"A Twitter bot to automatically clean up my Twitter account.",[135,293],"CRON",{"metadata":295,"sys":298,"fields":306},{"tags":296,"concepts":297},[],[],{"space":299,"id":301,"type":13,"createdAt":302,"updatedAt":302,"environment":303,"publishedVersion":305,"revision":20,"locale":21},{"sys":300},{"type":9,"linkType":10,"id":11},"5zb0pDWNBVdorGnCnM0gwb","2023-01-28T17:54:30.356Z",{"sys":304},{"id":17,"type":9,"linkType":18},4,{"title":307,"description":308,"file":309},"twitter-spring-clean-bot-project-img","Twitter spring clean",{"url":310,"details":311,"fileName":314,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/5zb0pDWNBVdorGnCnM0gwb/d9cf343aeb2136f44ab17dc6b0410281/twitter-spring-clean-bot-project-img.png",{"size":312,"image":313},150202,{"width":159,"height":160},"twitter-spring-clean-bot-project-img.png",{"metadata":316,"sys":319,"fields":328},{"tags":317,"concepts":318},[],[],{"space":320,"id":322,"type":47,"createdAt":323,"updatedAt":323,"environment":324,"publishedVersion":114,"revision":20,"contentType":326,"locale":21},{"sys":321},{"type":9,"linkType":10,"id":11},"5kzQZ2SXoScnodt56Ulmiv","2023-01-28T17:37:10.177Z",{"sys":325},{"id":17,"type":9,"linkType":18},{"sys":327},{"type":9,"linkType":56,"id":117},{"name":329,"type":177,"url":330,"description":331,"tech":345,"tags":347,"image":349},"Colour Theme Watcher & Switcher","https://codepen.io/jackdomleo7/full/OJWaeem",{"data":332,"content":333,"nodeType":97},{},[334],{"data":335,"content":336,"nodeType":96},{},[337,341],{"data":338,"marks":339,"value":340,"nodeType":70},{},[],"A pure JavaScript snippet to watch",{"data":342,"marks":343,"value":344,"nodeType":70},{},[],"/detect a user's colour theme and allow them to change it.",[190,346],"CSS",[348],"Utility",{"metadata":350,"sys":353,"fields":360},{"tags":351,"concepts":352},[],[],{"space":354,"id":356,"type":13,"createdAt":357,"updatedAt":357,"environment":358,"publishedVersion":205,"revision":20,"locale":21},{"sys":355},{"type":9,"linkType":10,"id":11},"5u50SbmPUZoqIhzqtV7UaL","2023-01-28T17:37:05.167Z",{"sys":359},{"id":17,"type":9,"linkType":18},{"title":361,"description":362,"file":363},"colour-theme-picker-project-img","Changing colour theme from dark to light",{"url":364,"details":365,"fileName":368,"contentType":214},"//images.ctfassets.net/l1wujzr3g1ab/5u50SbmPUZoqIhzqtV7UaL/b7abf17a991a5e6b491ed212cd8e1c49/colour-theme-picker-project-img.gif",{"size":366,"image":367},123783,{"width":159,"height":160},"colour-theme-picker-project-img.gif",{"metadata":370,"sys":373,"fields":382},{"tags":371,"concepts":372},[],[],{"space":374,"id":376,"type":47,"createdAt":377,"updatedAt":377,"environment":378,"publishedVersion":19,"revision":20,"contentType":380,"locale":21},{"sys":375},{"type":9,"linkType":10,"id":11},"2qHSazjv6Ro4OXfCrkVkwg","2023-01-28T17:31:17.504Z",{"sys":379},{"id":17,"type":9,"linkType":18},{"sys":381},{"type":9,"linkType":56,"id":117},{"name":383,"type":177,"url":384,"description":385,"tech":395,"image":397},"Custom Car Colour Preview","https://codepen.io/jackdomleo7/full/wvoYjNP",{"data":386,"content":387,"nodeType":97},{},[388],{"data":389,"content":390,"nodeType":96},{},[391],{"data":392,"marks":393,"value":394,"nodeType":70},{},[],"An application to preview different colours of a car.",[396,136],"SVG",{"metadata":398,"sys":401,"fields":408},{"tags":399,"concepts":400},[],[],{"space":402,"id":404,"type":13,"createdAt":405,"updatedAt":405,"environment":406,"publishedVersion":205,"revision":20,"locale":21},{"sys":403},{"type":9,"linkType":10,"id":11},"1ZmqPLpQtjTJPsWiUB8ihd","2023-01-28T17:31:09.936Z",{"sys":407},{"id":17,"type":9,"linkType":18},{"title":409,"description":410,"file":411},"car-colour-picker-project-img","A car changing colour",{"url":412,"details":413,"fileName":416,"contentType":214},"//images.ctfassets.net/l1wujzr3g1ab/1ZmqPLpQtjTJPsWiUB8ihd/89be01caacd54b1d9e5975e584056260/car-colour-picker-project-img.gif",{"size":414,"image":415},439705,{"width":159,"height":160},"car-colour-picker-project-img.gif",{"metadata":418,"sys":421,"fields":433},{"tags":419,"concepts":420},[],[],{"space":422,"id":424,"type":47,"createdAt":425,"updatedAt":426,"environment":427,"publishedVersion":429,"revision":430,"contentType":431,"locale":21},{"sys":423},{"type":9,"linkType":10,"id":11},"wpQfsnzkVT7y1Eg4ANU24","2023-01-28T17:25:18.524Z","2023-01-28T17:37:25.464Z",{"sys":428},{"id":17,"type":9,"linkType":18},14,2,{"sys":432},{"type":9,"linkType":56,"id":117},{"name":434,"type":280,"url":435,"description":436,"tech":446,"tags":448,"image":449},"Checka11y.css","https://checka11y.jackdomleo.dev/",{"data":437,"content":438,"nodeType":97},{},[439],{"data":440,"content":441,"nodeType":96},{},[442],{"data":443,"marks":444,"value":445,"nodeType":70},{},[],"A CSS stylesheet to quickly highlight a11y concerns and a really good education project for those wanting to learn about accessibility.",[136,447],"Cypress",[193,348],{"metadata":450,"sys":453,"fields":460},{"tags":451,"concepts":452},[],[],{"space":454,"id":456,"type":13,"createdAt":457,"updatedAt":457,"environment":458,"publishedVersion":205,"revision":20,"locale":21},{"sys":455},{"type":9,"linkType":10,"id":11},"3nPJwMFNQ8OZ7OlHMED3YJ","2023-01-28T17:25:13.225Z",{"sys":459},{"id":17,"type":9,"linkType":18},{"title":461,"description":462,"file":463},"checka11y-project-img","Checka11y.css logo",{"url":464,"details":465,"fileName":468,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nPJwMFNQ8OZ7OlHMED3YJ/9350ee10587c33b4e9dd71464aa1173d/checka11y-project-img.png",{"size":466,"image":467},28340,{"width":159,"height":160},"checka11y-project-img.png",{"metadata":470,"sys":473,"fields":482},{"tags":471,"concepts":472},[],[],{"space":474,"id":476,"type":47,"createdAt":477,"updatedAt":477,"environment":478,"publishedVersion":19,"revision":20,"contentType":480,"locale":21},{"sys":475},{"type":9,"linkType":10,"id":11},"6egKMvjf6ugswngEWd7bzb","2023-01-28T17:19:29.418Z",{"sys":479},{"id":17,"type":9,"linkType":18},{"sys":481},{"type":9,"linkType":56,"id":117},{"name":483,"type":177,"url":484,"description":485,"tech":495,"tags":497,"image":499},"Spinning Smiley Face","https://codepen.io/jackdomleo7/full/wvKLjVb",{"data":486,"content":487,"nodeType":97},{},[488],{"data":489,"content":490,"nodeType":96},{},[491],{"data":492,"marks":493,"value":494,"nodeType":70},{},[],"A cute spinning smiley face while learning GSAP.",[496,136],"GSAP",[498],"Animation",{"metadata":500,"sys":503,"fields":510},{"tags":501,"concepts":502},[],[],{"space":504,"id":506,"type":13,"createdAt":507,"updatedAt":507,"environment":508,"publishedVersion":205,"revision":20,"locale":21},{"sys":505},{"type":9,"linkType":10,"id":11},"6i901gWFLWWSjs2ZYc9rpL","2023-01-28T17:19:17.739Z",{"sys":509},{"id":17,"type":9,"linkType":18},{"title":511,"description":512,"file":513},"spinning-smiley-face-project-img","Spinning smiley face animation",{"url":514,"details":515,"fileName":518,"contentType":214},"//images.ctfassets.net/l1wujzr3g1ab/6i901gWFLWWSjs2ZYc9rpL/e32d8b3cb14a794272c70360d1a39ac9/spinning-smiley-face-project-img.gif",{"size":516,"image":517},232759,{"width":159,"height":160},"spinning-smiley-face-project-img.gif",{"metadata":520,"sys":523,"fields":532},{"tags":521,"concepts":522},[],[],{"space":524,"id":526,"type":47,"createdAt":527,"updatedAt":527,"environment":528,"publishedVersion":275,"revision":20,"contentType":530,"locale":21},{"sys":525},{"type":9,"linkType":10,"id":11},"1rx3EwhjpCdMESgcFDv0CY","2023-01-28T17:10:10.423Z",{"sys":529},{"id":17,"type":9,"linkType":18},{"sys":531},{"type":9,"linkType":56,"id":117},{"name":533,"type":177,"url":534,"description":535,"tech":545,"tags":546,"image":548},"CSS Union Jack Flag","https://codepen.io/jackdomleo7/full/abvrgEo",{"nodeType":97,"data":536,"content":537},{},[538],{"nodeType":96,"data":539,"content":540},{},[541],{"nodeType":70,"value":542,"marks":543,"data":544},"A pure CSS pixel-perfect Union Jack flag.",[],{},[136],[547],"CSS Art",{"metadata":549,"sys":552,"fields":559},{"tags":550,"concepts":551},[],[],{"space":553,"id":555,"type":13,"createdAt":556,"updatedAt":556,"environment":557,"publishedVersion":205,"revision":20,"locale":21},{"sys":554},{"type":9,"linkType":10,"id":11},"2220otIqCHTmP1a6UkmHTO","2023-01-28T17:10:05.172Z",{"sys":558},{"id":17,"type":9,"linkType":18},{"title":560,"description":561,"file":562},"union-jack-project-img","Union Jack Flag",{"url":563,"details":564,"fileName":567,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2220otIqCHTmP1a6UkmHTO/1b888dd09c45cbb842cd476585c54eaf/union-jack-project-img.png",{"size":565,"image":566},29999,{"width":159,"height":160},"union-jack-project-img.png",{"metadata":569,"sys":572,"fields":583},{"tags":570,"concepts":571},[],[],{"space":573,"id":575,"type":47,"createdAt":576,"updatedAt":577,"environment":578,"publishedVersion":580,"revision":430,"contentType":581,"locale":21},{"sys":574},{"type":9,"linkType":10,"id":11},"3NkVQqDSFreEt3KgDspqhk","2023-01-28T12:20:29.489Z","2023-01-28T17:37:59.428Z",{"sys":579},{"id":17,"type":9,"linkType":18},9,{"sys":582},{"type":9,"linkType":56,"id":117},{"name":584,"type":177,"url":585,"description":586,"tech":596,"tags":597,"image":599},"Neumorphic Design Elements","https://codepen.io/jackdomleo7/full/mdeowoz",{"data":587,"content":588,"nodeType":97},{},[589],{"data":590,"content":591,"nodeType":96},{},[592],{"data":593,"marks":594,"value":595,"nodeType":70},{},[],"Some common UI elements in the style of neumorphic design.",[136],[598],"Popular",{"metadata":600,"sys":603,"fields":610},{"tags":601,"concepts":602},[],[],{"space":604,"id":606,"type":13,"createdAt":607,"updatedAt":607,"environment":608,"publishedVersion":205,"revision":20,"locale":21},{"sys":605},{"type":9,"linkType":10,"id":11},"5Qg1EnfhYLYpuJAT0qkaNc","2023-01-28T12:19:53.096Z",{"sys":609},{"id":17,"type":9,"linkType":18},{"title":611,"description":612,"file":613},"neumorphic-design-project-img","Neumorphic design components",{"url":614,"details":615,"fileName":618,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/5Qg1EnfhYLYpuJAT0qkaNc/43107f82a221c1809ab117bfd206170f/neumorphic-design-project-img.png",{"size":616,"image":617},31790,{"width":159,"height":160},"neumorphic-design-project-img.png",{"metadata":620,"sys":623,"fields":632},{"tags":621,"concepts":622},[],[],{"space":624,"id":626,"type":47,"createdAt":627,"updatedAt":627,"environment":628,"publishedVersion":19,"revision":20,"contentType":630,"locale":21},{"sys":625},{"type":9,"linkType":10,"id":11},"7vaOyrQvl5V0jGSDY3EsM2","2023-01-28T11:36:08.387Z",{"sys":629},{"id":17,"type":9,"linkType":18},{"sys":631},{"type":9,"linkType":56,"id":117},{"name":633,"type":120,"url":634,"description":635,"tech":645,"tags":647,"image":649},"TMD Interior Projects & Building Services Ltd","https://github.com/jackdomleo7/tmdip.co.uk",{"data":636,"content":637,"nodeType":97},{},[638],{"data":639,"content":640,"nodeType":96},{},[641],{"data":642,"marks":643,"value":644,"nodeType":70},{},[],"Designed and built a fully responsive static website for a small shop-fitting & interior design company. This website needed a modern but minimal feel to it so they could clearly get their message across to visitors. Unfortunately, the company closed in October 2021.",[133,135,646,136],"Prismic",[648],"Website",{"metadata":650,"sys":653,"fields":660},{"tags":651,"concepts":652},[],[],{"space":654,"id":656,"type":13,"createdAt":657,"updatedAt":657,"environment":658,"publishedVersion":254,"revision":20,"locale":21},{"sys":655},{"type":9,"linkType":10,"id":11},"v3W2zbHXA5PrqQNtVPUMm","2023-01-28T11:36:03.512Z",{"sys":659},{"id":17,"type":9,"linkType":18},{"title":661,"description":662,"file":663},"tmdip-project-img","Screenshot of TMD Interior Projects home page",{"url":664,"details":665,"fileName":668,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/v3W2zbHXA5PrqQNtVPUMm/1053b757abf68582bfa0f410077806c8/tmdip-project-img.png",{"size":666,"image":667},102678,{"width":159,"height":160},"tmdip-project-img.png",{"metadata":670,"sys":673,"fields":684},{"tags":671,"concepts":672},[],[],{"space":674,"id":676,"type":47,"createdAt":677,"updatedAt":678,"environment":679,"publishedVersion":681,"revision":430,"contentType":682,"locale":21},{"sys":675},{"type":9,"linkType":10,"id":11},"4ujuAFszSXcHDSvTByVFDD","2023-01-27T22:02:31.611Z","2023-01-28T17:37:41.676Z",{"sys":680},{"id":17,"type":9,"linkType":18},12,{"sys":683},{"type":9,"linkType":56,"id":117},{"name":685,"type":280,"url":686,"description":687,"tech":697,"tags":698,"image":699},"Cooltipz.css","https://cooltipz.jackdomleo.dev",{"data":688,"content":689,"nodeType":97},{},[690],{"data":691,"content":692,"nodeType":96},{},[693],{"data":694,"marks":695,"value":696,"nodeType":70},{},[],"A pure CSS solution for adding highly customisable, accessible tooltips to HTML.",[136],[193,598,348],{"metadata":700,"sys":703,"fields":710},{"tags":701,"concepts":702},[],[],{"space":704,"id":706,"type":13,"createdAt":707,"updatedAt":707,"environment":708,"publishedVersion":150,"revision":20,"locale":21},{"sys":705},{"type":9,"linkType":10,"id":11},"26fP6efyZsX7tw8rGCVrDL","2023-01-27T22:02:21.767Z",{"sys":709},{"id":17,"type":9,"linkType":18},{"title":711,"description":153,"file":712},"cooltipz-project-img",{"url":713,"details":714,"fileName":717,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/26fP6efyZsX7tw8rGCVrDL/0bc668a492f6b7eb375a3ad568df6c83/cooltipz-project-img.png",{"size":715,"image":716},11929,{"width":159,"height":160},"cooltipz-project-img.png",{"metadata":719,"sys":722,"fields":731},{"tags":720,"concepts":721},[],[],{"space":723,"id":725,"type":47,"createdAt":726,"updatedAt":726,"environment":727,"publishedVersion":53,"revision":20,"contentType":729,"locale":21},{"sys":724},{"type":9,"linkType":10,"id":11},"6YB39UZiiMFBSFf5YBFqaO","2023-01-27T21:57:40.389Z",{"sys":728},{"id":17,"type":9,"linkType":18},{"sys":730},{"type":9,"linkType":56,"id":117},{"name":732,"type":177,"url":733,"description":734,"tech":744,"tags":745,"image":747},"Jumping into Lightspeed","https://codepen.io/jackdomleo7/full/rNOYdwz",{"data":735,"content":736,"nodeType":97},{},[737],{"data":738,"content":739,"nodeType":96},{},[740],{"data":741,"marks":742,"value":743,"nodeType":70},{},[],"A mini animation demonstrating Star Wars lightspeed using HTML, CSS & JS.",[190,346],[746,498],"Star Wars",{"metadata":748,"sys":751,"fields":758},{"tags":749,"concepts":750},[],[],{"space":752,"id":754,"type":13,"createdAt":755,"updatedAt":755,"environment":756,"publishedVersion":150,"revision":20,"locale":21},{"sys":753},{"type":9,"linkType":10,"id":11},"zXmBtqvpORf1Zffobl22F","2023-01-27T21:57:26.116Z",{"sys":757},{"id":17,"type":9,"linkType":18},{"title":759,"description":153,"file":760},"lightspeed-project-img",{"url":761,"details":762,"fileName":765,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/zXmBtqvpORf1Zffobl22F/c4a75a537080960d72f5930149bf2817/lightspeed-project-img.png",{"size":763,"image":764},100927,{"width":159,"height":160},"lightspeed-project-img.png",{"metadata":767,"sys":770,"fields":779},{"tags":768,"concepts":769},[],[],{"space":771,"id":773,"type":47,"createdAt":774,"updatedAt":774,"environment":775,"publishedVersion":681,"revision":20,"contentType":777,"locale":21},{"sys":772},{"type":9,"linkType":10,"id":11},"4aZX5AexMhJjo66sZ0Nm03","2023-01-27T21:51:09.097Z",{"sys":776},{"id":17,"type":9,"linkType":18},{"sys":778},{"type":9,"linkType":56,"id":117},{"name":780,"type":177,"url":781,"description":782,"tech":792,"tags":793,"image":795},"Pixel Art R2-D2","https://codepen.io/jackdomleo7/full/ZEEqdxy",{"data":783,"content":784,"nodeType":97},{},[785],{"data":786,"content":787,"nodeType":96},{},[788],{"data":789,"marks":790,"value":791,"nodeType":70},{},[],"A pure CSS, single div pixel art of the beloved Star Wars droid, R2-D2.",[346],[547,794,746],"Single div",{"metadata":796,"sys":799,"fields":806},{"tags":797,"concepts":798},[],[],{"space":800,"id":802,"type":13,"createdAt":803,"updatedAt":803,"environment":804,"publishedVersion":205,"revision":20,"locale":21},{"sys":801},{"type":9,"linkType":10,"id":11},"1lG3pACHA8YGmbbpQ2fpA7","2023-01-27T21:50:58.303Z",{"sys":805},{"id":17,"type":9,"linkType":18},{"title":807,"description":808,"file":809},"r2-d2-project-img","R2-D2 from Star Wars as pixel art",{"url":810,"details":811,"fileName":814,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1lG3pACHA8YGmbbpQ2fpA7/6ed00265778f38c5bd7f1bc395eb484d/r2-d2-project-img.png",{"size":812,"image":813},37976,{"width":159,"height":160},"r2-d2-project-img.png",{"metadata":816,"sys":819,"fields":830},{"tags":817,"concepts":818},[],[],{"space":820,"id":822,"type":47,"createdAt":823,"updatedAt":824,"environment":825,"publishedVersion":827,"revision":150,"contentType":828,"locale":21},{"sys":821},{"type":9,"linkType":10,"id":11},"4RGkQbZ9QFaahqn14RB3fg","2023-01-27T21:40:30.860Z","2023-12-18T23:39:32.367Z",{"sys":826},{"id":17,"type":9,"linkType":18},20,{"sys":829},{"type":9,"linkType":56,"id":117},{"name":831,"type":280,"url":832,"description":833,"tech":843,"tags":846,"image":847},"My website","https://github.com/jackdomleo7/jackdomleo.dev",{"data":834,"content":835,"nodeType":97},{},[836],{"data":837,"content":838,"nodeType":96},{},[839],{"data":840,"marks":841,"value":842,"nodeType":70},{},[],"Designed and built a fully responsive static website and blog for myself. This has been through many design variations as my UI skills have developed.",[844,845,135,136],"Nuxt 3","Contentful",[648],{"metadata":848,"sys":851,"fields":858},{"tags":849,"concepts":850},[],[],{"space":852,"id":854,"type":13,"createdAt":855,"updatedAt":855,"environment":856,"publishedVersion":275,"revision":20,"locale":21},{"sys":853},{"type":9,"linkType":10,"id":11},"7fXjHpN3LyWRS6iULHyR02","2023-01-27T21:40:19.986Z",{"sys":857},{"id":17,"type":9,"linkType":18},{"title":859,"description":860,"file":861},"jackdomleo.dev-project-img","Screenshot of jackdomleo.dev homepage",{"url":862,"details":863,"fileName":866,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/7fXjHpN3LyWRS6iULHyR02/8b59f60fb2404576a0c93553694fb1b6/jackdomleo.dev-project-img.png",{"size":864,"image":865},44662,{"width":159,"height":160},"jackdomleo.dev-project-img.png",{"Asset":868},[139,397,795,548,699,194,449,243,599,349,294,499,847,649,747],{"sys":870,"total":20,"skip":37,"limit":20,"items":871},{"type":36},[872],{"metadata":873,"sys":876,"fields":888},{"tags":874,"concepts":875},[],[],{"space":877,"id":879,"type":47,"createdAt":880,"updatedAt":881,"environment":882,"publishedVersion":884,"revision":53,"contentType":885,"locale":21},{"sys":878},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":883},{"id":17,"type":9,"linkType":18},61,{"sys":886},{"type":9,"linkType":56,"id":887},"footer",{"name":889,"quickLinks":890,"socialLinks":906,"legalText":915},"Footer",[891,895,898,902],{"id":892,"key":893,"value":894},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":896,"key":59,"value":897},"3b093617-4c9c-41b7-ab57-72a53a2cb400","/projects",{"id":899,"key":900,"value":901},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":903,"key":904,"value":905},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[907,909,911],{"id":908,"key":78,"value":73},"6ca24d29-3228-4215-8b8e-32ad04743b65",{"id":910,"key":91,"value":86},"46719126-f516-4853-9444-e40cd0576918",{"id":912,"key":913,"value":914},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":916,"content":917,"nodeType":97},{},[918,925,932],{"data":919,"content":920,"nodeType":96},{},[921],{"data":922,"marks":923,"value":924,"nodeType":70},{},[],"©2018-2024",{"data":926,"content":927,"nodeType":96},{},[928],{"data":929,"marks":930,"value":931,"nodeType":70},{},[],"All rights reserved.",{"data":933,"content":934,"nodeType":96},{},[935],{"data":936,"marks":937,"value":938,"nodeType":70},{},[],"Jack Domleo",1730423475713] \ No newline at end of file +[{"data":1,"prerenderedAt":939},["ShallowReactive",2],{"$siNM9WAguS":3,"$YWCdSV8Jub":34,"$mMA9bTNYLP":98,"project-list-undefined":168},{"metadata":4,"sys":6,"fields":22},{"tags":5},[],{"space":7,"id":12,"type":13,"createdAt":14,"updatedAt":14,"environment":15,"publishedVersion":19,"revision":20,"locale":21},{"sys":8},{"type":9,"linkType":10,"id":11},"Link","Space","l1wujzr3g1ab","2HwSTbJwsbPDLabrSltaa3","Asset","2023-02-04T20:48:16.198Z",{"sys":16},{"id":17,"type":9,"linkType":18},"master","Environment",8,1,"en-GB",{"title":23,"description":24,"file":25},"Open Graphic","Jack Domleo. Frontend & UX Developer.",{"url":26,"details":27,"fileName":32,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2HwSTbJwsbPDLabrSltaa3/b8c5098e2bfd7f192665fccfa3e3380e/og.png",{"size":28,"image":29},8570,{"width":30,"height":31},1200,630,"og.png","image/png",{"sys":35,"total":20,"skip":37,"limit":20,"items":38},{"type":36},"Array",0,[39],{"metadata":40,"sys":43,"fields":58},{"tags":41,"concepts":42},[],[],{"space":44,"id":46,"type":47,"createdAt":48,"updatedAt":49,"environment":50,"publishedVersion":52,"revision":53,"contentType":54,"locale":21},{"sys":45},{"type":9,"linkType":10,"id":11},"4Og1KH2T7fvFl3RgBWX1rL","Entry","2023-01-27T22:02:37.696Z","2023-01-28T19:14:25.079Z",{"sys":51},{"id":17,"type":9,"linkType":18},33,13,{"sys":55},{"type":9,"linkType":56,"id":57},"ContentType","projects",{"title":59,"description":60},"Projects",{"data":61,"content":62,"nodeType":97},{},[63],{"data":64,"content":65,"nodeType":96},{},[66,71,80,84,92],{"data":67,"marks":68,"value":69,"nodeType":70},{},[],"I enjoy creating different types of projects in my spare time using a range of technologies. You can find all of my featured projects here, and many more projects on ","text",{"data":72,"content":74,"nodeType":79},{"uri":73},"https://github.com/jackdomleo7",[75],{"data":76,"marks":77,"value":78,"nodeType":70},{},[],"GitHub","hyperlink",{"data":81,"marks":82,"value":83,"nodeType":70},{},[]," and ",{"data":85,"content":87,"nodeType":79},{"uri":86},"https://codepen.io/jackdomleo7",[88],{"data":89,"marks":90,"value":91,"nodeType":70},{},[],"CodePen",{"data":93,"marks":94,"value":95,"nodeType":70},{},[],".","paragraph","document",{"sys":99,"total":20,"skip":37,"limit":20,"items":100},{"type":36},[101],{"metadata":102,"sys":105,"fields":117},{"tags":103,"concepts":104},[],[],{"space":106,"id":108,"type":47,"createdAt":109,"updatedAt":110,"environment":111,"publishedVersion":113,"revision":53,"contentType":114,"locale":21},{"sys":107},{"type":9,"linkType":10,"id":11},"6LjVGiRVd7SMt9ewdVBNbQ","2023-01-01T15:40:18.235Z","2024-10-27T19:05:34.977Z",{"sys":112},{"id":17,"type":9,"linkType":18},61,{"sys":115},{"type":9,"linkType":56,"id":116},"footer",{"name":118,"quickLinks":119,"socialLinks":135,"legalText":144},"Footer",[120,124,127,131],{"id":121,"key":122,"value":123},"dbd24c1c-5840-4132-af46-08b3762b393b","Home","/",{"id":125,"key":59,"value":126},"3b093617-4c9c-41b7-ab57-72a53a2cb400","/projects",{"id":128,"key":129,"value":130},"6d25b987-cc30-4b09-93f3-fd6d947c7ffc","Blog","/blog",{"id":132,"key":133,"value":134},"ceaccf06-ba0a-41d5-9202-56beaaa5f242","Links","/links",[136,138,140],{"id":137,"key":78,"value":73},"6ca24d29-3228-4215-8b8e-32ad04743b65",{"id":139,"key":91,"value":86},"46719126-f516-4853-9444-e40cd0576918",{"id":141,"key":142,"value":143},"c1581e8d-c729-4232-8944-0f767d94177d","LinkedIn","https://linkedin.com/in/jackdomleo7",{"data":145,"content":146,"nodeType":97},{},[147,154,161],{"data":148,"content":149,"nodeType":96},{},[150],{"data":151,"marks":152,"value":153,"nodeType":70},{},[],"©2018-2024",{"data":155,"content":156,"nodeType":96},{},[157],{"data":158,"marks":159,"value":160,"nodeType":70},{},[],"All rights reserved.",{"data":162,"content":163,"nodeType":96},{},[164],{"data":165,"marks":166,"value":167,"nodeType":70},{},[],"Jack Domleo",{"sys":169,"total":170,"skip":37,"limit":171,"items":172,"includes":937},{"type":36},15,1000,[173,232,285,334,385,439,487,539,589,638,689,739,788,836,885],{"metadata":174,"sys":177,"fields":188},{"tags":175,"concepts":176},[],[],{"space":178,"id":180,"type":47,"createdAt":181,"updatedAt":181,"environment":182,"publishedVersion":184,"revision":20,"contentType":185,"locale":21},{"sys":179},{"type":9,"linkType":10,"id":11},"4Kiex9dMPsL87rteSvnG2h","2023-01-28T19:13:41.069Z",{"sys":183},{"id":17,"type":9,"linkType":18},10,{"sys":186},{"type":9,"linkType":56,"id":187},"project",{"name":189,"type":190,"url":191,"description":192,"tech":202,"tags":207,"image":209},"Grassverse NFT","Client","https://www.grassverse.org/",{"data":193,"content":194,"nodeType":97},{},[195],{"data":196,"content":197,"nodeType":96},{},[198],{"data":199,"marks":200,"value":201,"nodeType":70},{},[],"This website came with pre-existing designs and includes a CMS and an account section for Grassverse asset owners to log in to view their assets and fellow owners of assets.",[203,204,205,206],"Nuxt 2","Web3","TypeScript","SCSS",[208],"NFT",{"metadata":210,"sys":213,"fields":221},{"tags":211,"concepts":212},[],[],{"space":214,"id":216,"type":13,"createdAt":217,"updatedAt":217,"environment":218,"publishedVersion":220,"revision":20,"locale":21},{"sys":215},{"type":9,"linkType":10,"id":11},"01rxXuPpEQ6phTc1Bvt9W9","2023-01-28T19:13:34.307Z",{"sys":219},{"id":17,"type":9,"linkType":18},3,{"title":222,"description":223,"file":224},"grassverse-project-img","",{"url":225,"details":226,"fileName":231,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/01rxXuPpEQ6phTc1Bvt9W9/5d347eb3e2a3731922c0aa7046273780/grassverse-project-img.png",{"size":227,"image":228},163210,{"width":229,"height":230},600,315,"grassverse-project-img.png",{"metadata":233,"sys":236,"fields":245},{"tags":234,"concepts":235},[],[],{"space":237,"id":239,"type":47,"createdAt":240,"updatedAt":240,"environment":241,"publishedVersion":19,"revision":20,"contentType":243,"locale":21},{"sys":238},{"type":9,"linkType":10,"id":11},"2JxOvMguZVHxM565SKDspu","2023-01-28T18:25:42.700Z",{"sys":242},{"id":17,"type":9,"linkType":18},{"sys":244},{"type":9,"linkType":56,"id":187},{"name":246,"type":247,"url":248,"description":249,"tech":259,"tags":262,"image":264},"npx jackdomleo7","Mini","https://github.com/jackdomleo7/npx_business_card",{"data":250,"content":251,"nodeType":97},{},[252],{"data":253,"content":254,"nodeType":96},{},[255],{"data":256,"marks":257,"value":258,"nodeType":70},{},[],"A simple npm script to show some details about me right in the console.",[260,261],"JavaScript","npx",[263],"npm package",{"metadata":265,"sys":268,"fields":276},{"tags":266,"concepts":267},[],[],{"space":269,"id":271,"type":13,"createdAt":272,"updatedAt":272,"environment":273,"publishedVersion":275,"revision":20,"locale":21},{"sys":270},{"type":9,"linkType":10,"id":11},"2ilJcH34gnOn1SEfkJqlJj","2023-01-28T18:25:36.903Z",{"sys":274},{"id":17,"type":9,"linkType":18},5,{"title":277,"description":246,"file":278},"npx-jackdomleo7-project-img",{"url":279,"details":280,"fileName":283,"contentType":284},"//images.ctfassets.net/l1wujzr3g1ab/2ilJcH34gnOn1SEfkJqlJj/69c7b64c07e828439e60e1287e47828c/npx-jackdomleo7-project-img.gif",{"size":281,"image":282},30415,{"width":229,"height":230},"npx-jackdomleo7-project-img.gif","image/gif",{"metadata":286,"sys":289,"fields":298},{"tags":287,"concepts":288},[],[],{"space":290,"id":292,"type":47,"createdAt":293,"updatedAt":293,"environment":294,"publishedVersion":184,"revision":20,"contentType":296,"locale":21},{"sys":291},{"type":9,"linkType":10,"id":11},"1y1gYckxXHOqS4a811GoMM","2023-01-28T18:10:23.588Z",{"sys":295},{"id":17,"type":9,"linkType":18},{"sys":297},{"type":9,"linkType":56,"id":187},{"name":299,"type":190,"url":300,"description":301,"tech":311,"tags":312,"image":313},"Mad Parrot Crew NFT","https://www.madparrotcrew.com/",{"data":302,"content":303,"nodeType":97},{},[304],{"data":305,"content":306,"nodeType":96},{},[307],{"data":308,"marks":309,"value":310,"nodeType":70},{},[],"Created a fully responsive minting website based on existing designs for the Mad Parrot Crew NFT.",[203,205,206],[208],{"metadata":314,"sys":317,"fields":325},{"tags":315,"concepts":316},[],[],{"space":318,"id":320,"type":13,"createdAt":321,"updatedAt":321,"environment":322,"publishedVersion":324,"revision":20,"locale":21},{"sys":319},{"type":9,"linkType":10,"id":11},"4yYU2VsDfEvMnOIFnWe8s6","2023-01-28T18:10:15.589Z",{"sys":323},{"id":17,"type":9,"linkType":18},6,{"title":326,"description":327,"file":328},"mad-parrot-crew-project-img","Screenshot of Mad Parrot Crew home page",{"url":329,"details":330,"fileName":333,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/4yYU2VsDfEvMnOIFnWe8s6/550e38a11ea5618096b160698925405c/mad-parrot-crew-project-img.png",{"size":331,"image":332},148413,{"width":229,"height":230},"mad-parrot-crew-project-img.png",{"metadata":335,"sys":338,"fields":348},{"tags":336,"concepts":337},[],[],{"space":339,"id":341,"type":47,"createdAt":342,"updatedAt":342,"environment":343,"publishedVersion":345,"revision":20,"contentType":346,"locale":21},{"sys":340},{"type":9,"linkType":10,"id":11},"6OEC4mGGiIzD1ebZVuCeke","2023-01-28T17:54:35.724Z",{"sys":344},{"id":17,"type":9,"linkType":18},7,{"sys":347},{"type":9,"linkType":56,"id":187},{"name":349,"type":350,"url":351,"description":352,"tech":362,"image":364},"Spring Clean Twitter Bot","Project","https://github.com/jackdomleo7/Spring_Clean_Twitter_Bot",{"data":353,"content":354,"nodeType":97},{},[355],{"data":356,"content":357,"nodeType":96},{},[358],{"data":359,"marks":360,"value":361,"nodeType":70},{},[],"A Twitter bot to automatically clean up my Twitter account.",[205,363],"CRON",{"metadata":365,"sys":368,"fields":376},{"tags":366,"concepts":367},[],[],{"space":369,"id":371,"type":13,"createdAt":372,"updatedAt":372,"environment":373,"publishedVersion":375,"revision":20,"locale":21},{"sys":370},{"type":9,"linkType":10,"id":11},"5zb0pDWNBVdorGnCnM0gwb","2023-01-28T17:54:30.356Z",{"sys":374},{"id":17,"type":9,"linkType":18},4,{"title":377,"description":378,"file":379},"twitter-spring-clean-bot-project-img","Twitter spring clean",{"url":380,"details":381,"fileName":384,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/5zb0pDWNBVdorGnCnM0gwb/d9cf343aeb2136f44ab17dc6b0410281/twitter-spring-clean-bot-project-img.png",{"size":382,"image":383},150202,{"width":229,"height":230},"twitter-spring-clean-bot-project-img.png",{"metadata":386,"sys":389,"fields":398},{"tags":387,"concepts":388},[],[],{"space":390,"id":392,"type":47,"createdAt":393,"updatedAt":393,"environment":394,"publishedVersion":184,"revision":20,"contentType":396,"locale":21},{"sys":391},{"type":9,"linkType":10,"id":11},"5kzQZ2SXoScnodt56Ulmiv","2023-01-28T17:37:10.177Z",{"sys":395},{"id":17,"type":9,"linkType":18},{"sys":397},{"type":9,"linkType":56,"id":187},{"name":399,"type":247,"url":400,"description":401,"tech":415,"tags":417,"image":419},"Colour Theme Watcher & Switcher","https://codepen.io/jackdomleo7/full/OJWaeem",{"data":402,"content":403,"nodeType":97},{},[404],{"data":405,"content":406,"nodeType":96},{},[407,411],{"data":408,"marks":409,"value":410,"nodeType":70},{},[],"A pure JavaScript snippet to watch",{"data":412,"marks":413,"value":414,"nodeType":70},{},[],"/detect a user's colour theme and allow them to change it.",[260,416],"CSS",[418],"Utility",{"metadata":420,"sys":423,"fields":430},{"tags":421,"concepts":422},[],[],{"space":424,"id":426,"type":13,"createdAt":427,"updatedAt":427,"environment":428,"publishedVersion":275,"revision":20,"locale":21},{"sys":425},{"type":9,"linkType":10,"id":11},"5u50SbmPUZoqIhzqtV7UaL","2023-01-28T17:37:05.167Z",{"sys":429},{"id":17,"type":9,"linkType":18},{"title":431,"description":432,"file":433},"colour-theme-picker-project-img","Changing colour theme from dark to light",{"url":434,"details":435,"fileName":438,"contentType":284},"//images.ctfassets.net/l1wujzr3g1ab/5u50SbmPUZoqIhzqtV7UaL/b7abf17a991a5e6b491ed212cd8e1c49/colour-theme-picker-project-img.gif",{"size":436,"image":437},123783,{"width":229,"height":230},"colour-theme-picker-project-img.gif",{"metadata":440,"sys":443,"fields":452},{"tags":441,"concepts":442},[],[],{"space":444,"id":446,"type":47,"createdAt":447,"updatedAt":447,"environment":448,"publishedVersion":19,"revision":20,"contentType":450,"locale":21},{"sys":445},{"type":9,"linkType":10,"id":11},"2qHSazjv6Ro4OXfCrkVkwg","2023-01-28T17:31:17.504Z",{"sys":449},{"id":17,"type":9,"linkType":18},{"sys":451},{"type":9,"linkType":56,"id":187},{"name":453,"type":247,"url":454,"description":455,"tech":465,"image":467},"Custom Car Colour Preview","https://codepen.io/jackdomleo7/full/wvoYjNP",{"data":456,"content":457,"nodeType":97},{},[458],{"data":459,"content":460,"nodeType":96},{},[461],{"data":462,"marks":463,"value":464,"nodeType":70},{},[],"An application to preview different colours of a car.",[466,206],"SVG",{"metadata":468,"sys":471,"fields":478},{"tags":469,"concepts":470},[],[],{"space":472,"id":474,"type":13,"createdAt":475,"updatedAt":475,"environment":476,"publishedVersion":275,"revision":20,"locale":21},{"sys":473},{"type":9,"linkType":10,"id":11},"1ZmqPLpQtjTJPsWiUB8ihd","2023-01-28T17:31:09.936Z",{"sys":477},{"id":17,"type":9,"linkType":18},{"title":479,"description":480,"file":481},"car-colour-picker-project-img","A car changing colour",{"url":482,"details":483,"fileName":486,"contentType":284},"//images.ctfassets.net/l1wujzr3g1ab/1ZmqPLpQtjTJPsWiUB8ihd/89be01caacd54b1d9e5975e584056260/car-colour-picker-project-img.gif",{"size":484,"image":485},439705,{"width":229,"height":230},"car-colour-picker-project-img.gif",{"metadata":488,"sys":491,"fields":503},{"tags":489,"concepts":490},[],[],{"space":492,"id":494,"type":47,"createdAt":495,"updatedAt":496,"environment":497,"publishedVersion":499,"revision":500,"contentType":501,"locale":21},{"sys":493},{"type":9,"linkType":10,"id":11},"wpQfsnzkVT7y1Eg4ANU24","2023-01-28T17:25:18.524Z","2023-01-28T17:37:25.464Z",{"sys":498},{"id":17,"type":9,"linkType":18},14,2,{"sys":502},{"type":9,"linkType":56,"id":187},{"name":504,"type":350,"url":505,"description":506,"tech":516,"tags":518,"image":519},"Checka11y.css","https://checka11y.jackdomleo.dev/",{"data":507,"content":508,"nodeType":97},{},[509],{"data":510,"content":511,"nodeType":96},{},[512],{"data":513,"marks":514,"value":515,"nodeType":70},{},[],"A CSS stylesheet to quickly highlight a11y concerns and a really good education project for those wanting to learn about accessibility.",[206,517],"Cypress",[263,418],{"metadata":520,"sys":523,"fields":530},{"tags":521,"concepts":522},[],[],{"space":524,"id":526,"type":13,"createdAt":527,"updatedAt":527,"environment":528,"publishedVersion":275,"revision":20,"locale":21},{"sys":525},{"type":9,"linkType":10,"id":11},"3nPJwMFNQ8OZ7OlHMED3YJ","2023-01-28T17:25:13.225Z",{"sys":529},{"id":17,"type":9,"linkType":18},{"title":531,"description":532,"file":533},"checka11y-project-img","Checka11y.css logo",{"url":534,"details":535,"fileName":538,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/3nPJwMFNQ8OZ7OlHMED3YJ/9350ee10587c33b4e9dd71464aa1173d/checka11y-project-img.png",{"size":536,"image":537},28340,{"width":229,"height":230},"checka11y-project-img.png",{"metadata":540,"sys":543,"fields":552},{"tags":541,"concepts":542},[],[],{"space":544,"id":546,"type":47,"createdAt":547,"updatedAt":547,"environment":548,"publishedVersion":19,"revision":20,"contentType":550,"locale":21},{"sys":545},{"type":9,"linkType":10,"id":11},"6egKMvjf6ugswngEWd7bzb","2023-01-28T17:19:29.418Z",{"sys":549},{"id":17,"type":9,"linkType":18},{"sys":551},{"type":9,"linkType":56,"id":187},{"name":553,"type":247,"url":554,"description":555,"tech":565,"tags":567,"image":569},"Spinning Smiley Face","https://codepen.io/jackdomleo7/full/wvKLjVb",{"data":556,"content":557,"nodeType":97},{},[558],{"data":559,"content":560,"nodeType":96},{},[561],{"data":562,"marks":563,"value":564,"nodeType":70},{},[],"A cute spinning smiley face while learning GSAP.",[566,206],"GSAP",[568],"Animation",{"metadata":570,"sys":573,"fields":580},{"tags":571,"concepts":572},[],[],{"space":574,"id":576,"type":13,"createdAt":577,"updatedAt":577,"environment":578,"publishedVersion":275,"revision":20,"locale":21},{"sys":575},{"type":9,"linkType":10,"id":11},"6i901gWFLWWSjs2ZYc9rpL","2023-01-28T17:19:17.739Z",{"sys":579},{"id":17,"type":9,"linkType":18},{"title":581,"description":582,"file":583},"spinning-smiley-face-project-img","Spinning smiley face animation",{"url":584,"details":585,"fileName":588,"contentType":284},"//images.ctfassets.net/l1wujzr3g1ab/6i901gWFLWWSjs2ZYc9rpL/e32d8b3cb14a794272c70360d1a39ac9/spinning-smiley-face-project-img.gif",{"size":586,"image":587},232759,{"width":229,"height":230},"spinning-smiley-face-project-img.gif",{"metadata":590,"sys":593,"fields":602},{"tags":591,"concepts":592},[],[],{"space":594,"id":596,"type":47,"createdAt":597,"updatedAt":597,"environment":598,"publishedVersion":345,"revision":20,"contentType":600,"locale":21},{"sys":595},{"type":9,"linkType":10,"id":11},"1rx3EwhjpCdMESgcFDv0CY","2023-01-28T17:10:10.423Z",{"sys":599},{"id":17,"type":9,"linkType":18},{"sys":601},{"type":9,"linkType":56,"id":187},{"name":603,"type":247,"url":604,"description":605,"tech":615,"tags":616,"image":618},"CSS Union Jack Flag","https://codepen.io/jackdomleo7/full/abvrgEo",{"nodeType":97,"data":606,"content":607},{},[608],{"nodeType":96,"data":609,"content":610},{},[611],{"nodeType":70,"value":612,"marks":613,"data":614},"A pure CSS pixel-perfect Union Jack flag.",[],{},[206],[617],"CSS Art",{"metadata":619,"sys":622,"fields":629},{"tags":620,"concepts":621},[],[],{"space":623,"id":625,"type":13,"createdAt":626,"updatedAt":626,"environment":627,"publishedVersion":275,"revision":20,"locale":21},{"sys":624},{"type":9,"linkType":10,"id":11},"2220otIqCHTmP1a6UkmHTO","2023-01-28T17:10:05.172Z",{"sys":628},{"id":17,"type":9,"linkType":18},{"title":630,"description":631,"file":632},"union-jack-project-img","Union Jack Flag",{"url":633,"details":634,"fileName":637,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/2220otIqCHTmP1a6UkmHTO/1b888dd09c45cbb842cd476585c54eaf/union-jack-project-img.png",{"size":635,"image":636},29999,{"width":229,"height":230},"union-jack-project-img.png",{"metadata":639,"sys":642,"fields":653},{"tags":640,"concepts":641},[],[],{"space":643,"id":645,"type":47,"createdAt":646,"updatedAt":647,"environment":648,"publishedVersion":650,"revision":500,"contentType":651,"locale":21},{"sys":644},{"type":9,"linkType":10,"id":11},"3NkVQqDSFreEt3KgDspqhk","2023-01-28T12:20:29.489Z","2023-01-28T17:37:59.428Z",{"sys":649},{"id":17,"type":9,"linkType":18},9,{"sys":652},{"type":9,"linkType":56,"id":187},{"name":654,"type":247,"url":655,"description":656,"tech":666,"tags":667,"image":669},"Neumorphic Design Elements","https://codepen.io/jackdomleo7/full/mdeowoz",{"data":657,"content":658,"nodeType":97},{},[659],{"data":660,"content":661,"nodeType":96},{},[662],{"data":663,"marks":664,"value":665,"nodeType":70},{},[],"Some common UI elements in the style of neumorphic design.",[206],[668],"Popular",{"metadata":670,"sys":673,"fields":680},{"tags":671,"concepts":672},[],[],{"space":674,"id":676,"type":13,"createdAt":677,"updatedAt":677,"environment":678,"publishedVersion":275,"revision":20,"locale":21},{"sys":675},{"type":9,"linkType":10,"id":11},"5Qg1EnfhYLYpuJAT0qkaNc","2023-01-28T12:19:53.096Z",{"sys":679},{"id":17,"type":9,"linkType":18},{"title":681,"description":682,"file":683},"neumorphic-design-project-img","Neumorphic design components",{"url":684,"details":685,"fileName":688,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/5Qg1EnfhYLYpuJAT0qkaNc/43107f82a221c1809ab117bfd206170f/neumorphic-design-project-img.png",{"size":686,"image":687},31790,{"width":229,"height":230},"neumorphic-design-project-img.png",{"metadata":690,"sys":693,"fields":702},{"tags":691,"concepts":692},[],[],{"space":694,"id":696,"type":47,"createdAt":697,"updatedAt":697,"environment":698,"publishedVersion":19,"revision":20,"contentType":700,"locale":21},{"sys":695},{"type":9,"linkType":10,"id":11},"7vaOyrQvl5V0jGSDY3EsM2","2023-01-28T11:36:08.387Z",{"sys":699},{"id":17,"type":9,"linkType":18},{"sys":701},{"type":9,"linkType":56,"id":187},{"name":703,"type":190,"url":704,"description":705,"tech":715,"tags":717,"image":719},"TMD Interior Projects & Building Services Ltd","https://github.com/jackdomleo7/tmdip.co.uk",{"data":706,"content":707,"nodeType":97},{},[708],{"data":709,"content":710,"nodeType":96},{},[711],{"data":712,"marks":713,"value":714,"nodeType":70},{},[],"Designed and built a fully responsive static website for a small shop-fitting & interior design company. This website needed a modern but minimal feel to it so they could clearly get their message across to visitors. Unfortunately, the company closed in October 2021.",[203,205,716,206],"Prismic",[718],"Website",{"metadata":720,"sys":723,"fields":730},{"tags":721,"concepts":722},[],[],{"space":724,"id":726,"type":13,"createdAt":727,"updatedAt":727,"environment":728,"publishedVersion":324,"revision":20,"locale":21},{"sys":725},{"type":9,"linkType":10,"id":11},"v3W2zbHXA5PrqQNtVPUMm","2023-01-28T11:36:03.512Z",{"sys":729},{"id":17,"type":9,"linkType":18},{"title":731,"description":732,"file":733},"tmdip-project-img","Screenshot of TMD Interior Projects home page",{"url":734,"details":735,"fileName":738,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/v3W2zbHXA5PrqQNtVPUMm/1053b757abf68582bfa0f410077806c8/tmdip-project-img.png",{"size":736,"image":737},102678,{"width":229,"height":230},"tmdip-project-img.png",{"metadata":740,"sys":743,"fields":754},{"tags":741,"concepts":742},[],[],{"space":744,"id":746,"type":47,"createdAt":747,"updatedAt":748,"environment":749,"publishedVersion":751,"revision":500,"contentType":752,"locale":21},{"sys":745},{"type":9,"linkType":10,"id":11},"4ujuAFszSXcHDSvTByVFDD","2023-01-27T22:02:31.611Z","2023-01-28T17:37:41.676Z",{"sys":750},{"id":17,"type":9,"linkType":18},12,{"sys":753},{"type":9,"linkType":56,"id":187},{"name":755,"type":350,"url":756,"description":757,"tech":767,"tags":768,"image":769},"Cooltipz.css","https://cooltipz.jackdomleo.dev",{"data":758,"content":759,"nodeType":97},{},[760],{"data":761,"content":762,"nodeType":96},{},[763],{"data":764,"marks":765,"value":766,"nodeType":70},{},[],"A pure CSS solution for adding highly customisable, accessible tooltips to HTML.",[206],[263,668,418],{"metadata":770,"sys":773,"fields":780},{"tags":771,"concepts":772},[],[],{"space":774,"id":776,"type":13,"createdAt":777,"updatedAt":777,"environment":778,"publishedVersion":220,"revision":20,"locale":21},{"sys":775},{"type":9,"linkType":10,"id":11},"26fP6efyZsX7tw8rGCVrDL","2023-01-27T22:02:21.767Z",{"sys":779},{"id":17,"type":9,"linkType":18},{"title":781,"description":223,"file":782},"cooltipz-project-img",{"url":783,"details":784,"fileName":787,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/26fP6efyZsX7tw8rGCVrDL/0bc668a492f6b7eb375a3ad568df6c83/cooltipz-project-img.png",{"size":785,"image":786},11929,{"width":229,"height":230},"cooltipz-project-img.png",{"metadata":789,"sys":792,"fields":801},{"tags":790,"concepts":791},[],[],{"space":793,"id":795,"type":47,"createdAt":796,"updatedAt":796,"environment":797,"publishedVersion":53,"revision":20,"contentType":799,"locale":21},{"sys":794},{"type":9,"linkType":10,"id":11},"6YB39UZiiMFBSFf5YBFqaO","2023-01-27T21:57:40.389Z",{"sys":798},{"id":17,"type":9,"linkType":18},{"sys":800},{"type":9,"linkType":56,"id":187},{"name":802,"type":247,"url":803,"description":804,"tech":814,"tags":815,"image":817},"Jumping into Lightspeed","https://codepen.io/jackdomleo7/full/rNOYdwz",{"data":805,"content":806,"nodeType":97},{},[807],{"data":808,"content":809,"nodeType":96},{},[810],{"data":811,"marks":812,"value":813,"nodeType":70},{},[],"A mini animation demonstrating Star Wars lightspeed using HTML, CSS & JS.",[260,416],[816,568],"Star Wars",{"metadata":818,"sys":821,"fields":828},{"tags":819,"concepts":820},[],[],{"space":822,"id":824,"type":13,"createdAt":825,"updatedAt":825,"environment":826,"publishedVersion":220,"revision":20,"locale":21},{"sys":823},{"type":9,"linkType":10,"id":11},"zXmBtqvpORf1Zffobl22F","2023-01-27T21:57:26.116Z",{"sys":827},{"id":17,"type":9,"linkType":18},{"title":829,"description":223,"file":830},"lightspeed-project-img",{"url":831,"details":832,"fileName":835,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/zXmBtqvpORf1Zffobl22F/c4a75a537080960d72f5930149bf2817/lightspeed-project-img.png",{"size":833,"image":834},100927,{"width":229,"height":230},"lightspeed-project-img.png",{"metadata":837,"sys":840,"fields":849},{"tags":838,"concepts":839},[],[],{"space":841,"id":843,"type":47,"createdAt":844,"updatedAt":844,"environment":845,"publishedVersion":751,"revision":20,"contentType":847,"locale":21},{"sys":842},{"type":9,"linkType":10,"id":11},"4aZX5AexMhJjo66sZ0Nm03","2023-01-27T21:51:09.097Z",{"sys":846},{"id":17,"type":9,"linkType":18},{"sys":848},{"type":9,"linkType":56,"id":187},{"name":850,"type":247,"url":851,"description":852,"tech":862,"tags":863,"image":865},"Pixel Art R2-D2","https://codepen.io/jackdomleo7/full/ZEEqdxy",{"data":853,"content":854,"nodeType":97},{},[855],{"data":856,"content":857,"nodeType":96},{},[858],{"data":859,"marks":860,"value":861,"nodeType":70},{},[],"A pure CSS, single div pixel art of the beloved Star Wars droid, R2-D2.",[416],[617,864,816],"Single div",{"metadata":866,"sys":869,"fields":876},{"tags":867,"concepts":868},[],[],{"space":870,"id":872,"type":13,"createdAt":873,"updatedAt":873,"environment":874,"publishedVersion":275,"revision":20,"locale":21},{"sys":871},{"type":9,"linkType":10,"id":11},"1lG3pACHA8YGmbbpQ2fpA7","2023-01-27T21:50:58.303Z",{"sys":875},{"id":17,"type":9,"linkType":18},{"title":877,"description":878,"file":879},"r2-d2-project-img","R2-D2 from Star Wars as pixel art",{"url":880,"details":881,"fileName":884,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/1lG3pACHA8YGmbbpQ2fpA7/6ed00265778f38c5bd7f1bc395eb484d/r2-d2-project-img.png",{"size":882,"image":883},37976,{"width":229,"height":230},"r2-d2-project-img.png",{"metadata":886,"sys":889,"fields":900},{"tags":887,"concepts":888},[],[],{"space":890,"id":892,"type":47,"createdAt":893,"updatedAt":894,"environment":895,"publishedVersion":897,"revision":220,"contentType":898,"locale":21},{"sys":891},{"type":9,"linkType":10,"id":11},"4RGkQbZ9QFaahqn14RB3fg","2023-01-27T21:40:30.860Z","2023-12-18T23:39:32.367Z",{"sys":896},{"id":17,"type":9,"linkType":18},20,{"sys":899},{"type":9,"linkType":56,"id":187},{"name":901,"type":350,"url":902,"description":903,"tech":913,"tags":916,"image":917},"My website","https://github.com/jackdomleo7/jackdomleo.dev",{"data":904,"content":905,"nodeType":97},{},[906],{"data":907,"content":908,"nodeType":96},{},[909],{"data":910,"marks":911,"value":912,"nodeType":70},{},[],"Designed and built a fully responsive static website and blog for myself. This has been through many design variations as my UI skills have developed.",[914,915,205,206],"Nuxt 3","Contentful",[718],{"metadata":918,"sys":921,"fields":928},{"tags":919,"concepts":920},[],[],{"space":922,"id":924,"type":13,"createdAt":925,"updatedAt":925,"environment":926,"publishedVersion":345,"revision":20,"locale":21},{"sys":923},{"type":9,"linkType":10,"id":11},"7fXjHpN3LyWRS6iULHyR02","2023-01-27T21:40:19.986Z",{"sys":927},{"id":17,"type":9,"linkType":18},{"title":929,"description":930,"file":931},"jackdomleo.dev-project-img","Screenshot of jackdomleo.dev homepage",{"url":932,"details":933,"fileName":936,"contentType":33},"//images.ctfassets.net/l1wujzr3g1ab/7fXjHpN3LyWRS6iULHyR02/8b59f60fb2404576a0c93553694fb1b6/jackdomleo.dev-project-img.png",{"size":934,"image":935},44662,{"width":229,"height":230},"jackdomleo.dev-project-img.png",{"Asset":938},[209,467,865,618,769,264,519,313,669,419,364,569,917,719,817],1730509477876] \ No newline at end of file diff --git a/projects/index.html b/projects/index.html index 6c12fd08a..ae27fd713 100644 --- a/projects/index.html +++ b/projects/index.html @@ -26,7 +26,7 @@ - + @@ -80,5 +80,5 @@ -

Projects

I enjoy creating different types of projects in my spare time using a range of technologies. You can find all of my featured projects here, and many more projects on GitHub and CodePen.

Mini Projects

Client Projects

- \ No newline at end of file +

Projects

I enjoy creating different types of projects in my spare time using a range of technologies. You can find all of my featured projects here, and many more projects on GitHub and CodePen.

Mini Projects

Client Projects

+ \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 82628c4d1..116fbb2da 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -160,4 +160,4 @@ - \ No newline at end of file + \ No newline at end of file