[{"data":1,"prerenderedAt":639},["ShallowReactive",2],{"sanity-LevEgKvCUg3Ul3GKyhTsfZIfaGswLQ-qsmdjo9-lWe4":3,"sanity-gUDjqIRNMF532PosZyYlP_BSN2nT4RbC16-qucC17es":84,"shiki-block-v-0-0-0-0-0-1-0-0":633,"shiki-block-v-0-0-0-0-0-1-0-1":634,"shiki-block-v-0-0-0-0-0-1-0-2":635,"shiki-block-v-0-0-0-0-0-1-0-3":636,"shiki-block-v-0-0-0-0-0-1-0-4":637,"shiki-block-v-0-0-0-0-0-1-0-5":638},{"data":4},{"_createdAt":5,"_id":6,"_rev":7,"_system":8,"_type":6,"_updatedAt":11,"acceptAllLink":12,"acceptNecessaryLink":40,"bannerColorSource":50,"bannerDescription":51,"bannerTitle":52,"categories":53,"declineAllLink":54,"managePreferencesLink":63,"modalColorSource":50,"modalTitle":72,"preferencesIconColorSource":50,"provider":73,"savePreferencesLink":74,"thirdPartyEmbedCode":53,"title":83},"2026-07-28T12:06:44Z","cookieSettings","ci4zAxlS92c5lxcUZgKERY",{"base":9},{"id":6,"rev":10},"4areb77bueJ0iGsV9TVGmy","2026-09-03T17:08:03Z",{"_type":13,"newTab":14,"style":15,"title":38,"type":39},"link",false,{"_type":16,"design":17,"icon":30,"iconPosition":34,"stylePreset":35},"link.style",{"_type":18,"colorSource":19,"gradient":20,"hover":25,"shape":29,"style":29},"link.style.design","manual",{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},"gradient","to-r","linear","at-center",{"_type":26,"colorSource":27,"gradient":28},"link.style.hover","none",{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},"default",{"_type":31,"name":32,"type":33},"icon.config","pi-compass","noicon","start",{"_ref":36,"_type":37},"0a45d6ae-0177-47f2-ab3e-2dd19191fca6","reference","Accept all","button",{"_type":13,"newTab":14,"style":41,"title":49,"type":39},{"_type":16,"design":42,"icon":46,"iconPosition":34,"stylePreset":47},{"_type":18,"colorSource":19,"gradient":43,"hover":44,"shape":29,"style":29},{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},{"_type":26,"colorSource":27,"gradient":45},{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},{"_type":31,"name":32,"type":33},{"_ref":48,"_type":37},"1b28bc78-22fc-4f39-ab55-441e2a601f6e","Accept necessary","inherit","We use cookies to enhance your browsing experience and analyse our traffic. Please choose your cookie preferences below.","We use cookies",null,{"_type":13,"newTab":14,"style":55,"title":62,"type":39},{"_type":16,"design":56,"icon":60,"iconPosition":34,"stylePreset":61},{"_type":18,"colorSource":19,"gradient":57,"hover":58,"shape":29,"style":29},{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},{"_type":26,"colorSource":27,"gradient":59},{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},{"_type":31,"name":32,"type":33},{"_ref":48,"_type":37},"Decline all",{"_type":13,"newTab":14,"style":64,"title":71,"type":39},{"_type":16,"design":65,"icon":69,"iconPosition":34,"stylePreset":70},{"_type":18,"colorSource":19,"gradient":66,"hover":67,"shape":29,"style":29},{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},{"_type":26,"colorSource":27,"gradient":68},{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},{"_type":31,"name":32,"type":33},{"_ref":48,"_type":37},"Manage preferences","Cookie Preferences","custom",{"_type":13,"newTab":14,"style":75,"title":82,"type":39},{"_type":16,"design":76,"icon":80,"iconPosition":34,"stylePreset":81},{"_type":18,"colorSource":19,"gradient":77,"hover":78,"shape":29,"style":29},{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},{"_type":26,"colorSource":27,"gradient":79},{"_type":21,"colorSource":19,"direction":22,"gradientType":23,"radialPosition":24},{"_type":31,"name":32,"type":33},{"_ref":36,"_type":37},"Save preferences","Cookie Settings",{"data":85,"sourceMap":-1},[86],{"_createdAt":87,"_id":88,"_rev":89,"_system":90,"_type":93,"_updatedAt":94,"authorProfile":95,"authorRef":101,"body":103,"categories":587,"excerpt":596,"footer":53,"layout":597,"mainImage":607,"navigation":53,"publishedAt":612,"readTime":613,"relatedPosts":614,"routeOptions":615,"seo":621,"showOnWebsite":617,"slug":620,"tags":627,"title":632},"2026-08-03T18:49:20Z","f2c017a9-1085-40fb-b887-21b029ed8137","CD9L37YSY0XMQhixkMM2fR",{"base":91},{"id":88,"rev":92},"CD9L37YSY0XMQhixkMKKEB","post","2026-08-03T22:33:15Z",{"avatar":53,"bio":96,"name":97,"role":98,"sameAs":99},"Builds Nuxion. Ex-agency lead who got tired of rebuilding the same CMS plumbing on every project and decided to ship it once","Jason Reid","Founder \u002F Content Writer",[100],"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fjason-reid-150476116\u002F",{"_ref":102,"_type":37},"006a4499-f3d6-4fbc-8cb4-3ddf05f11242",[104,115,124,132,149,158,166,172,180,204,210,218,226,234,242,260,275,291,322,330,336,344,352,360,368,372,380,386,410,418,426,434,446,462,475,487,499,507,515,519,527,535,543,551,559,567,575],{"_key":105,"_type":106,"children":107,"markDefs":113,"style":114},"aeaae8cf7b4e","block",[108],{"_key":109,"_type":110,"marks":111,"text":112},"4f2e459c415f","span",[],"Stop Rebuilding the Same Landing Page",[],"h1",{"_key":116,"_type":106,"children":117,"markDefs":122,"style":123},"91f7cd81c172",[118],{"_key":119,"_type":110,"marks":120,"text":121},"87c060ddd950",[],"Every agency has a version of this story. A client signs off on a beautiful homepage. Three weeks later they want the testimonials moved above the pricing table, a new FAQ section, and the hero swapped for one with a background video. None of that is hard. All of it is a developer ticket, a branch, a review, and a deploy.",[],"normal",{"_key":125,"_type":106,"children":126,"markDefs":131,"style":123},"7a9175168d4e",[127],{"_key":128,"_type":110,"marks":129,"text":130},"229fb291f9e0",[],"Multiply that across a dozen clients and you are not running a studio anymore — you are running a queue.",[],{"_key":133,"_type":106,"children":134,"markDefs":148,"style":123},"e7a5c072e7af",[135,139,144],{"_key":136,"_type":110,"marks":137,"text":138},"fa5e6a9b0cb8",[],"The fix is not \"use a CMS.\" Most teams already do. The fix is deciding ",{"_key":140,"_type":110,"marks":141,"text":143},"60fbc65cb805",[142],"strong","what unit of content the CMS actually owns",{"_key":145,"_type":110,"marks":146,"text":147},"47bf1fffa6a7",[],". If it owns fields on a fixed template, you have moved the copy out of the codebase and left the layout in it. Editors still can't build a page. If it owns an ordered list of blocks, editors can.",[],{"_key":150,"_type":106,"children":151,"markDefs":156,"style":157},"f33c7ba61d7d",[152],{"_key":153,"_type":110,"marks":154,"text":155},"aceffd5f42e7",[],"What a block-based page actually is",[],"h2",{"_key":159,"_type":106,"children":160,"markDefs":165,"style":123},"894e3d5f7678",[161],{"_key":162,"_type":110,"marks":163,"text":164},"f115be29a85c",[],"A page stops being a template and becomes an array:",[],{"_key":167,"_type":168,"colorSource":50,"markDefs":53,"snippet":169},"3cf770360b4b","code.block",{"_type":170,"code":171},"code","Page\n├── Hero (with image, heading, two CTAs)\n├── Feature grid (3 columns)\n├── Testimonial carousel\n├── FAQ accordion\n└── CTA banner",{"_key":173,"_type":106,"children":174,"markDefs":179,"style":123},"eec641f4b441",[175],{"_key":176,"_type":110,"marks":177,"text":178},"bc534a369b8b",[],"Each entry is a typed object with its own schema. The frontend reads the array in order and renders a component per entry. Reorder the array in the Studio, and the page reorders. Add a block, and the page grows. Delete one, and it's gone. No deploy, no branch, no ticket.",[],{"_key":181,"_type":106,"children":182,"markDefs":203,"style":123},"dcd9b8d370a3",[183,187,191,195,199],{"_key":184,"_type":110,"marks":185,"text":186},"13a82c6b2960",[],"In this starter that dispatch is a single renderer. ",{"_key":188,"_type":110,"marks":189,"text":190},"10702c81bfae",[170],"ComponentRenderer.vue",{"_key":192,"_type":110,"marks":193,"text":194},"37388f551d4d",[]," looks up the Sanity ",{"_key":196,"_type":110,"marks":197,"text":198},"ad0ba2d30ada",[170],"_type",{"_key":200,"_type":110,"marks":201,"text":202},"4ab20f2046da",[]," in a registry and mounts the matching Vue component:",[],{"_key":205,"_type":168,"colorSource":50,"markDefs":53,"snippet":206},"dc239dbc72cf",{"_type":170,"code":207,"filename":208,"language":209},"export function webComponentImports() {\n    return {\n        'hero.simple': defineAsyncComponent(() => import('.\u002FBlocks\u002FHero\u002FHeroSimple.vue')),\n        'block.faq': defineAsyncComponent(() => import('.\u002FBlocks\u002FFaq.vue')),\n        \u002F\u002F …\n    }\n}","app\u002Fcomponents\u002Fui\u002Findex.ts","typescript",{"_key":211,"_type":106,"children":212,"markDefs":217,"style":123},"4b32660a283c",[213],{"_key":214,"_type":110,"marks":215,"text":216},"55a63c50e893",[],"Async imports matter here. A page that uses four blocks ships four blocks' worth of JavaScript, not the whole library.",[],{"_key":219,"_type":106,"children":220,"markDefs":225,"style":157},"b3459c0c2494",[221],{"_key":222,"_type":110,"marks":223,"text":224},"73859f6667b1",[],"The three-file contract",[],{"_key":227,"_type":106,"children":228,"markDefs":233,"style":123},"781f7dc2034a",[229],{"_key":230,"_type":110,"marks":231,"text":232},"61b438fc79f1",[],"The temptation with a page builder is to make block creation \"easy\" by making it dynamic — generic field bags, JSON blobs, a schema-less escape hatch. That buys you a fast first block and an unmaintainable twentieth.",[],{"_key":235,"_type":106,"children":236,"markDefs":241,"style":123},"3d0bae99eecc",[237],{"_key":238,"_type":110,"marks":239,"text":240},"7617b626f7b9",[],"The alternative is a small, boring contract. Every block is exactly three things:",[],{"_key":243,"_type":106,"children":244,"level":257,"listItem":258,"markDefs":259,"style":123},"a0bf5d9d09d3",[245,249,253],{"_key":246,"_type":110,"marks":247,"text":248},"0bcbf2e69347",[142],"A Sanity schema",{"_key":250,"_type":110,"marks":251,"text":252},"3f1deeacdf5f",[]," — ",{"_key":254,"_type":110,"marks":255,"text":256},"626008d0b305",[170],"studio\u002Fschemas\u002Fweb\u002Fcustom\u002Fcustom.hero.ts",1,"number",[],{"_key":261,"_type":106,"children":262,"level":257,"listItem":258,"markDefs":274,"style":123},"cc7f504a6e21",[263,267,270],{"_key":264,"_type":110,"marks":265,"text":266},"6afd19b47833",[142],"A Vue component",{"_key":268,"_type":110,"marks":269,"text":252},"a79cb3378939",[],{"_key":271,"_type":110,"marks":272,"text":273},"fe436283ac73",[170],"app\u002Fcomponents\u002Fcustom\u002FCustomHero.vue",[],{"_key":276,"_type":106,"children":277,"level":257,"listItem":258,"markDefs":290,"style":123},"412688a00298",[278,282,286],{"_key":279,"_type":110,"marks":280,"text":281},"83f3eae04b4e",[142],"A registration",{"_key":283,"_type":110,"marks":284,"text":285},"8b851b345cc0",[]," — one line in ",{"_key":287,"_type":110,"marks":288,"text":289},"115c81ba29f5",[170],"customComponentImports()",[],{"_key":292,"_type":106,"children":293,"markDefs":321,"style":123},"984683da592e",[294,298,302,306,310,313,317],{"_key":295,"_type":110,"marks":296,"text":297},"ded86a1686f0",[],"The naming maps straight across: ",{"_key":299,"_type":110,"marks":300,"text":301},"df799d971613",[170],"custom.hero",{"_key":303,"_type":110,"marks":304,"text":305},"73385195ddb1",[]," → ",{"_key":307,"_type":110,"marks":308,"text":309},"c5c0d4364f85",[170],"CustomHero.vue",{"_key":311,"_type":110,"marks":312,"text":305},"6fc8768a8729",[],{"_key":314,"_type":110,"marks":315,"text":316},"4382f247cb08",[170],"custom.hero.ts",{"_key":318,"_type":110,"marks":319,"text":320},"064011c4360a",[],". When you have thirty blocks, you can find any of them without grep.",[],{"_key":323,"_type":106,"children":324,"markDefs":329,"style":123},"344aef0d8f3e",[325],{"_key":326,"_type":110,"marks":327,"text":328},"c4e0b00a8999",[],"It's repetitive enough that we scaffolded it:",[],{"_key":331,"_type":168,"colorSource":50,"markDefs":53,"snippet":332},"1703d9e6ad5a",{"_type":170,"code":333,"filename":334,"language":335},"npm run scaffold:component -- custom.testimonial-wall","Shell","bash",{"_key":337,"_type":106,"children":338,"markDefs":343,"style":123},"ebcb9537ae3a",[339],{"_key":340,"_type":110,"marks":341,"text":342},"e4b177b93c68",[],"That writes all three files and wires the registrations. Roughly a minute from idea to a block an editor can insert.",[],{"_key":345,"_type":106,"children":346,"markDefs":351,"style":157},"6776c8eb756f",[347],{"_key":348,"_type":110,"marks":349,"text":350},"b69b961eb57f",[],"Type safety is what makes this survivable",[],{"_key":353,"_type":106,"children":354,"markDefs":359,"style":123},"34600eb3e2d1",[355],{"_key":356,"_type":110,"marks":357,"text":358},"47060ea11908",[],"Here is the failure mode that kills page builders in year two: someone renames a schema, or deletes a block type, and nothing complains. The Studio quietly starts rendering blank sections. You find out when a client emails.",[],{"_key":361,"_type":106,"children":362,"markDefs":367,"style":123},"b53b3a57bb9a",[363],{"_key":364,"_type":110,"marks":365,"text":366},"383c9101a26c",[],"Sanity's TypeGen closes that hole. Schemas compile to TypeScript types:",[],{"_key":369,"_type":168,"colorSource":50,"markDefs":53,"snippet":370},"b174480d3241",{"_type":170,"code":371,"filename":334},"cd studio && npm run schema:types",{"_key":373,"_type":106,"children":374,"markDefs":379,"style":123},"0d13e64d015f",[375],{"_key":376,"_type":110,"marks":377,"text":378},"d1e2d26977d2",[],"Components consume them directly:",[],{"_key":381,"_type":168,"colorSource":50,"markDefs":53,"snippet":382},"a5254dee22c5",{"_type":170,"code":383,"filename":384,"language":385},"\u003Cscript setup lang=\"ts\">\nimport type { HeroSimple, ComponentProps } from '~~\u002Ftypes'\n\ninterface Props extends ComponentProps\u003CHeroSimple> {}\nconst props = defineProps\u003CProps>()\n\u003C\u002Fscript>","components\u002Fui\u002FBlocks\u002FHeroSimple.vue","vue",{"_key":387,"_type":106,"children":388,"markDefs":409,"style":123},"1e28010a22fa",[389,393,397,401,405],{"_key":390,"_type":110,"marks":391,"text":392},"8e0c3dd4af45",[],"And the registry itself is checked against the union of every valid block type with ",{"_key":394,"_type":110,"marks":395,"text":396},"d27e03fd1af8",[170],"satisfies",{"_key":398,"_type":110,"marks":399,"text":400},"0d5b3f18b31e",[],". Rename a schema and forget to update the registry, and ",{"_key":402,"_type":110,"marks":403,"text":404},"8a27fa42c112",[170],"typecheck",{"_key":406,"_type":110,"marks":407,"text":408},"db19b74a68bc",[]," fails in CI. Not in production, not in a client email — in CI.",[],{"_key":411,"_type":106,"children":412,"markDefs":417,"style":123},"e75aedb68c63",[413],{"_key":414,"_type":110,"marks":415,"text":416},"ded6206c812e",[],"That single constraint is what lets a page builder grow past ten blocks without becoming folklore.",[],{"_key":419,"_type":106,"children":420,"markDefs":425,"style":157},"e50b5d72742d",[421],{"_key":422,"_type":110,"marks":423,"text":424},"7834a78ebba6",[],"Give editors control, not a blank canvas",[],{"_key":427,"_type":106,"children":428,"markDefs":433,"style":123},"81da9523868b",[429],{"_key":430,"_type":110,"marks":431,"text":432},"9d1e59f1ad4a",[],"The other way page builders die is by giving away too much. Once editors can set arbitrary padding, colours, and widths per block, every page drifts and the design system stops meaning anything.",[],{"_key":435,"_type":106,"children":436,"markDefs":445,"style":123},"c674c78ff48d",[437,441],{"_key":438,"_type":110,"marks":439,"text":440},"119ee2465788",[],"The useful boundary is: ",{"_key":442,"_type":110,"marks":443,"text":444},"3c7eee4f2634",[142],"editors control composition and content; the system controls layout primitives.",[],{"_key":447,"_type":106,"children":448,"markDefs":461,"style":123},"e476f994ed83",[449,453,457],{"_key":450,"_type":110,"marks":451,"text":452},"88d57133f5f3",[],"Horizontal width is a good example. In this starter, individual blocks never set their own outer gutter or max-width. That belongs to ",{"_key":454,"_type":110,"marks":455,"text":456},"d17eb2546081",[170],"PageSection",{"_key":458,"_type":110,"marks":459,"text":460},"7049b6085007",[],", which exposes a three-state intent to the editor:",[],{"_key":463,"_type":106,"children":464,"level":257,"listItem":473,"markDefs":474,"style":123},"a41ba1899ad3",[465,469],{"_key":466,"_type":110,"marks":467,"text":468},"8f98f71a03a5",[170],"contained",{"_key":470,"_type":110,"marks":471,"text":472},"2a6046d4b356",[]," — the default 88rem container with a responsive gutter","bullet",[],{"_key":476,"_type":106,"children":477,"level":257,"listItem":473,"markDefs":486,"style":123},"4b04c9636996",[478,482],{"_key":479,"_type":110,"marks":480,"text":481},"1a049b340ab7",[170],"full",{"_key":483,"_type":110,"marks":484,"text":485},"fcd11465ab94",[]," — full-width band, content still inset",[],{"_key":488,"_type":106,"children":489,"level":257,"listItem":473,"markDefs":498,"style":123},"540f51630812",[490,494],{"_key":491,"_type":110,"marks":492,"text":493},"3f78fa64241e",[170],"bleed",{"_key":495,"_type":110,"marks":496,"text":497},"ee8b85bf1220",[]," — edge-to-edge, for media, carousels, and maps",[],{"_key":500,"_type":106,"children":501,"markDefs":506,"style":123},"67071f3a100b",[502],{"_key":503,"_type":110,"marks":504,"text":505},"c1800892b7ba",[],"Three named choices, not a padding input. Editors get real layout control; the page still can't end up with a hero inset by 4px more than the section under it.",[],{"_key":508,"_type":106,"children":509,"markDefs":514,"style":123},"1371a1b4ffa1",[510],{"_key":511,"_type":110,"marks":512,"text":513},"ae4497ff9fb9",[],"Colour works the same way. Themes are documents in Sanity, compiled to CSS variables at build time:",[],{"_key":516,"_type":168,"colorSource":50,"markDefs":53,"snippet":517},"5320e0c370b3",{"_type":170,"code":518,"filename":334},"npm run cssvars:generate",{"_key":520,"_type":106,"children":521,"markDefs":526,"style":123},"5a7861c510d6",[522],{"_key":523,"_type":110,"marks":524,"text":525},"2a2c0ed4d0a1",[],"No hex codes in Vue files. A client rebrand is content editing, not a refactor.",[],{"_key":528,"_type":106,"children":529,"markDefs":534,"style":157},"5a4742ae7d84",[530],{"_key":531,"_type":110,"marks":532,"text":533},"46fa2eef5362",[],"What actually changes",[],{"_key":536,"_type":106,"children":537,"markDefs":542,"style":123},"242f5b64ab69",[538],{"_key":539,"_type":110,"marks":540,"text":541},"36670a417312",[],"The measurable difference isn't rendering speed — it's who is unblocked.",[],{"_key":544,"_type":106,"children":545,"level":257,"listItem":473,"markDefs":550,"style":123},"d11e3954d5df",[546],{"_key":547,"_type":110,"marks":548,"text":549},"8be65be9e58c",[],"A new landing page for a campaign: editor, that afternoon, no deploy.",[],{"_key":552,"_type":106,"children":553,"level":257,"listItem":473,"markDefs":558,"style":123},"1301c6d772c8",[554],{"_key":555,"_type":110,"marks":556,"text":557},"60b90bdc68b3",[],"Reordering sections after a stakeholder review: editor, two minutes.",[],{"_key":560,"_type":106,"children":561,"level":257,"listItem":473,"markDefs":566,"style":123},"92ebc1982632",[562],{"_key":563,"_type":110,"marks":564,"text":565},"f5096e640d23",[],"A genuinely new block type: developer, one scaffold command, one component.",[],{"_key":568,"_type":106,"children":569,"markDefs":574,"style":123},"33f6fb21091d",[570],{"_key":571,"_type":110,"marks":572,"text":573},"a7d31ab3fc4f",[],"Developers stop being a bottleneck for layout changes and go back to building the things only developers can build. That's the whole return.",[],{"_key":576,"_type":106,"children":577,"markDefs":586,"style":123},"3bf44e4fb153",[578,582],{"_key":579,"_type":110,"marks":580,"text":581},"a37f436b5aaf",[142],"Next up:",{"_key":583,"_type":110,"marks":584,"text":585},"4747ffef4901",[]," a walkthrough of getting the whole stack — Nuxt, Studio, demo content, and theming — running locally in about ten minutes.",[],[588],{"_createdAt":589,"_id":590,"_rev":591,"_type":592,"_updatedAt":593,"slug":594,"title":595},"2026-08-03T18:51:13Z","8d240ef6-720b-42da-84de-73fb748e72e0","lWC3z1etCH2cpKB4GjKi5T","category","2026-08-03T18:51:17Z","architecture","Architecture","Bespoke templates make every client request a developer ticket. A block-based page builder backed by a CMS turns those tickets into ten minutes of editor time — without giving up type safety or design control.",{"_type":598,"colorOptions":599,"fontOptions":603,"layout":29,"pageDesign":606},"post.layout.options",{"_type":600,"theme":601},"page.color.options",{"_ref":602,"_type":37},"1a6a1945-8c18-4b61-91a7-6b862a7e3a9c",{"_type":604,"bodyFont":605,"primaryFont":605},"font.options","","design2",{"_type":608,"alt":609,"asset":610},"image","Image of a page building example ",{"_ref":611,"_type":37},"image-40fa80d6d8763f190b03a55de477d46874832b86-5604x3736-jpg","2026-08-03T18:22:55.929Z",4,[],{"_type":616,"includeInSitemap":617,"slug":618},"page.routing.options",true,{"_type":619,"current":620},"slug","stop-rebuilding-the-same-landing-page-the-case-for-a-component-driven-page-builder",{"_type":622,"favicon":623,"image":53,"schema":624,"socialImages":626},"seo",{"mimeType":53,"url":53},{"organizationType":625},"Organization",{"facebook":53,"linkedin":53,"twitter":53},[628,629,630,631],"nuxt","sanity","page-builder","cms","Stop Rebuilding the Same Landing Page: The Case for a Component-Driven Page Builder","\u003Cpre class=\"shiki shiki-themes github-light github-dark nuxion-code__pre\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">npm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> run\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> setup:project\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark nuxion-code__pre\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">npm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> run\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev:all\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark nuxion-code__pre\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">cd\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> studio\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> &#x26;&#x26; DATASET\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">development\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> npm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> run\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> demo:import\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark nuxion-code__pre\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">npm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> run\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> env:check\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark nuxion-code__pre\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">const\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> { \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">data\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> } \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> await\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> useSanityQuery\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">PageQueryResult\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>(\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">PAGE_QUERY\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, { slug })\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki shiki-themes github-light github-dark nuxion-code__pre\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">cd\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> studio\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> &#x26;&#x26; \u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">npm\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> run\u003C\u002Fspan>\u003Cspan style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> schema:types\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",1789667191763]