[{"data":1,"prerenderedAt":1992},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fyour-first-dynamic-page":553,"\u002Fguides\u002Fyour-first-dynamic-page-surround":1987},[4,22,64,89,215,503],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","1.getting-started\u002F1.index",[9,10,14,18],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":15,"path":16,"stem":17},"Key Ideas","\u002Fgetting-started\u002Fkey-ideas","1.getting-started\u002F3.key-ideas",{"title":19,"path":20,"stem":21},"Releases","\u002Fgetting-started\u002Freleases","1.getting-started\u002F4.releases",{"title":23,"path":24,"stem":25,"children":26},"Overview","\u002Fcore-concepts","2.core-concepts\u002F0.index",[27,28,32,36,40,44,48,52,56,60],{"title":23,"path":24,"stem":25},{"title":29,"path":30,"stem":31},"How It All Works","\u002Fcore-concepts\u002Farchitecture","2.core-concepts\u002F1.architecture",{"title":33,"path":34,"stem":35},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","2.core-concepts\u002F2.the-data-model",{"title":37,"path":38,"stem":39},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","2.core-concepts\u002F3.layouts-and-pages",{"title":41,"path":42,"stem":43},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","2.core-concepts\u002F4.dynamic-pages",{"title":45,"path":46,"stem":47},"Components","\u002Fcore-concepts\u002Fcomponents","2.core-concepts\u002F5.components",{"title":49,"path":50,"stem":51},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","2.core-concepts\u002F6.draft-and-publish",{"title":53,"path":54,"stem":55},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","2.core-concepts\u002F7.admin-panel",{"title":57,"path":58,"stem":59},"Caching","\u002Fcore-concepts\u002Fcaching","2.core-concepts\u002F8.caching",{"title":61,"path":62,"stem":63},"Glossary","\u002Fcore-concepts\u002Fglossary","2.core-concepts\u002F9.glossary",{"title":23,"path":65,"stem":66,"children":67},"\u002Fguides","3.guides\u002F0.index",[68,69,73,77,81,85],{"title":23,"path":65,"stem":66},{"title":70,"path":71,"stem":72},"Your First Layout","\u002Fguides\u002Fyour-first-layout","3.guides\u002F1.your-first-layout",{"title":74,"path":75,"stem":76},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","3.guides\u002F2.your-first-page-template",{"title":78,"path":79,"stem":80},"Your First Component","\u002Fguides\u002Fyour-first-component","3.guides\u002F3.your-first-component",{"title":82,"path":83,"stem":84},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","3.guides\u002F4.alternative-ui-variants",{"title":86,"path":87,"stem":88},"Your First Dynamic Page","\u002Fguides\u002Fyour-first-dynamic-page","3.guides\u002F5.your-first-dynamic-page",{"title":23,"path":90,"stem":91,"children":92},"\u002Fapi","4.api\u002F0.index",[93,94,98,102,120,162,166,170,195,199,203,207,211],{"title":23,"path":90,"stem":91},{"title":95,"path":96,"stem":97},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F02.bundle-setup",{"title":99,"path":100,"stem":101},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F03.configuration",{"title":103,"path":104,"stem":105,"children":106,"page":119},"Users","\u002Fapi\u002Fusers","4.api\u002F04.users",[107,111,115],{"title":108,"path":109,"stem":110},"Authentication","\u002Fapi\u002Fusers\u002Fauthentication","4.api\u002F04.users\u002F1.authentication",{"title":112,"path":113,"stem":114},"User Emails","\u002Fapi\u002Fusers\u002Fuser-emails","4.api\u002F04.users\u002F2.user-emails",{"title":116,"path":117,"stem":118},"Access Control","\u002Fapi\u002Fusers\u002Faccess-control","4.api\u002F04.users\u002F3.access-control",false,{"title":45,"path":121,"stem":122,"children":123,"page":119},"\u002Fapi\u002Fcomponents","4.api\u002F05.components",[124,128,149],{"title":125,"path":126,"stem":127},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F05.components\u002F1.creating-components",{"title":129,"path":130,"stem":131,"children":132,"page":119},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F05.components\u002F2.annotations",[133,137,141,145],{"title":134,"path":135,"stem":136},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F05.components\u002F2.annotations\u002F1.publishable",{"title":138,"path":139,"stem":140},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F05.components\u002F2.annotations\u002F2.uploadable",{"title":142,"path":143,"stem":144},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F05.components\u002F2.annotations\u002F3.timestamped",{"title":146,"path":147,"stem":148},"Explicit Allow Only","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fexplicit-allow-only","4.api\u002F05.components\u002F2.annotations\u002F4.explicit-allow-only",{"title":150,"path":151,"stem":152,"children":153,"page":119},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F05.components\u002F3.built-ins",[154,158],{"title":155,"path":156,"stem":157},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F05.components\u002F3.built-ins\u002F1.collection-component",{"title":159,"path":160,"stem":161},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F05.components\u002F3.built-ins\u002F2.form-component",{"title":163,"path":164,"stem":165},"Page Data & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F06.dynamic-pages",{"title":167,"path":168,"stem":169},"Routes","\u002Fapi\u002Froutes","4.api\u002F07.routes",{"title":171,"path":172,"stem":173,"children":174,"page":119},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F08.data-fixtures",[175,179,183,187,191],{"title":176,"path":177,"stem":178},"Getting Started with Fixtures","\u002Fapi\u002Fdata-fixtures\u002Fgetting-started","4.api\u002F08.data-fixtures\u002F1.getting-started",{"title":180,"path":181,"stem":182},"Builder Reference","\u002Fapi\u002Fdata-fixtures\u002Fbuilder-reference","4.api\u002F08.data-fixtures\u002F2.builder-reference",{"title":184,"path":185,"stem":186},"Seeding Content","\u002Fapi\u002Fdata-fixtures\u002Fseeding-content","4.api\u002F08.data-fixtures\u002F3.seeding-content",{"title":188,"path":189,"stem":190},"Appending & Multiple Scaffolds","\u002Fapi\u002Fdata-fixtures\u002Fappending","4.api\u002F08.data-fixtures\u002F4.appending",{"title":192,"path":193,"stem":194},"Generating Fixtures","\u002Fapi\u002Fdata-fixtures\u002Fgenerating-fixtures","4.api\u002F08.data-fixtures\u002F5.generating-fixtures",{"title":196,"path":197,"stem":198},"Real-Time (Mercure)","\u002Fapi\u002Freal-time","4.api\u002F09.real-time",{"title":200,"path":201,"stem":202},"HTTP Caching","\u002Fapi\u002Fhttp-caching","4.api\u002F10.http-caching",{"title":204,"path":205,"stem":206},"Orphaned Data","\u002Fapi\u002Forphaned-data","4.api\u002F11.orphaned-data",{"title":208,"path":209,"stem":210},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F12.console-commands",{"title":212,"path":213,"stem":214},"Debugging & Errors","\u002Fapi\u002Fdebugging","4.api\u002F13.debugging",{"title":23,"path":216,"stem":217,"children":218},"\u002Fnuxt-module","5.nuxt-module\u002F0.index",[219,220,224,237,257,286,307,430,464,467,495,499],{"title":23,"path":216,"stem":217},{"title":221,"path":222,"stem":223},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F01.module-setup",{"title":225,"path":226,"stem":227,"children":228,"page":119},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F02.configuration",[229,233],{"title":230,"path":231,"stem":232},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F02.configuration\u002F1.nuxt-config",{"title":234,"path":235,"stem":236},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F02.configuration\u002F2.site-config-and-seo",{"title":238,"path":239,"stem":240,"children":241,"page":119},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F03.building-your-ui",[242,246,250,253],{"title":243,"path":244,"stem":245},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F03.building-your-ui\u002F1.creating-layouts",{"title":247,"path":248,"stem":249},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F03.building-your-ui\u002F2.creating-page-templates",{"title":45,"path":251,"stem":252},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F03.building-your-ui\u002F3.creating-components",{"title":254,"path":255,"stem":256},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F03.building-your-ui\u002F4.cwa-cli",{"title":258,"path":259,"stem":260,"children":261,"page":119},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F04.component-helpers",[262,266,270,274,278,282],{"title":263,"path":264,"stem":265},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F04.component-helpers\u002F1.images-and-uploads",{"title":267,"path":268,"stem":269},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F04.component-helpers\u002F2.collections-and-pagination",{"title":271,"path":272,"stem":273},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F04.component-helpers\u002F3.html-content",{"title":275,"path":276,"stem":277},"Rich-Text Editor","\u002Fnuxt-module\u002Fcomponent-helpers\u002Frich-text-editor","5.nuxt-module\u002F04.component-helpers\u002F4.rich-text-editor",{"title":279,"path":280,"stem":281},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F04.component-helpers\u002F5.real-time-updates",{"title":283,"path":284,"stem":285},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F04.component-helpers\u002F6.forms",{"title":287,"path":288,"stem":289,"children":290,"page":119},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F05.cwa-components",[291,295,299,303],{"title":292,"path":293,"stem":294},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F05.cwa-components\u002F1.cwa-component-group",{"title":296,"path":297,"stem":298},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F05.cwa-components\u002F2.cwa-page",{"title":300,"path":301,"stem":302},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F05.cwa-components\u002F3.cwa-link",{"title":304,"path":305,"stem":306},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F05.cwa-components\u002F5.cwa-default-layout",{"title":308,"path":309,"stem":310,"children":311,"page":119},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F06.composables",[312,315,323,348,368,385,405],{"title":23,"path":313,"stem":314},"\u002Fnuxt-module\u002Fcomposables\u002Foverview","5.nuxt-module\u002F06.composables\u002F0.overview",{"title":316,"path":317,"stem":318,"children":319,"page":119},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F06.composables\u002F1.layout",[320],{"title":316,"path":321,"stem":322},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F06.composables\u002F1.layout\u002F1.use-cwa-layout",{"title":324,"path":325,"stem":326,"children":327,"page":119},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F06.composables\u002F2.component",[328,332,336,340,344],{"title":329,"path":330,"stem":331},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F06.composables\u002F2.component\u002F1.use-cwa-component",{"title":333,"path":334,"stem":335},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F06.composables\u002F2.component\u002F2.use-cwa-resource",{"title":337,"path":338,"stem":339},"File Field","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-file-field","5.nuxt-module\u002F06.composables\u002F2.component\u002F3.use-cwa-file-field",{"title":341,"path":342,"stem":343},"Collection Pagination","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-pagination","5.nuxt-module\u002F06.composables\u002F2.component\u002F4.use-cwa-collection-pagination",{"title":345,"path":346,"stem":347},"Collection Resource (deprecated)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F06.composables\u002F2.component\u002F9.use-cwa-collection-resource",{"title":349,"path":350,"stem":351,"children":352,"page":119},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fform","5.nuxt-module\u002F06.composables\u002F3.form",[353,356,360,364],{"title":349,"path":354,"stem":355},"\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form","5.nuxt-module\u002F06.composables\u002F3.form\u002F1.use-cwa-form",{"title":357,"path":358,"stem":359},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-input","5.nuxt-module\u002F06.composables\u002F3.form\u002F2.use-cwa-form-input",{"title":361,"path":362,"stem":363},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F06.composables\u002F3.form\u002F3.use-cwa-form-repeated",{"title":365,"path":366,"stem":367},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fform\u002Fuse-cwa-form-collection","5.nuxt-module\u002F06.composables\u002F3.form\u002F4.use-cwa-form-collection",{"title":369,"path":370,"stem":371,"children":372,"page":119},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F06.composables\u002F4.admin-manager",[373,377,381],{"title":374,"path":375,"stem":376},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":378,"path":379,"stem":380},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F2.use-cwa-resource-model",{"title":382,"path":383,"stem":384},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F06.composables\u002F4.admin-manager\u002F3.use-cwa-resource-upload",{"title":386,"path":387,"stem":388,"children":389,"page":119},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F06.composables\u002F5.utilities",[390,394,398,402],{"title":391,"path":392,"stem":393},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F1.use-cwa-resource-endpoint",{"title":395,"path":396,"stem":397},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F2.use-query-bound-model",{"title":399,"path":400,"stem":401},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F3.use-cwa-resource-route",{"title":271,"path":403,"stem":404},"\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-html-content","5.nuxt-module\u002F06.composables\u002F5.utilities\u002F4.use-html-content",{"title":406,"path":407,"stem":408,"children":409,"page":119},"Auth","\u002Fnuxt-module\u002Fcomposables\u002Fauth","5.nuxt-module\u002F06.composables\u002F6.auth",[410,414,418,422,426],{"title":411,"path":412,"stem":413},"Login","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-login","5.nuxt-module\u002F06.composables\u002F6.auth\u002F1.use-login",{"title":415,"path":416,"stem":417},"Forgot Password","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-forgot-password","5.nuxt-module\u002F06.composables\u002F6.auth\u002F2.use-forgot-password",{"title":419,"path":420,"stem":421},"Reset Password","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-reset-password","5.nuxt-module\u002F06.composables\u002F6.auth\u002F3.use-reset-password",{"title":423,"path":424,"stem":425},"Verify Email","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-verify-email","5.nuxt-module\u002F06.composables\u002F6.auth\u002F4.use-verify-email",{"title":427,"path":428,"stem":429},"Resend Verify Email","\u002Fnuxt-module\u002Fcomposables\u002Fauth\u002Fuse-resend-verify-email","5.nuxt-module\u002F06.composables\u002F6.auth\u002F5.use-resend-verify-email",{"title":431,"path":432,"stem":433,"children":434,"page":119},"Cwa Api","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F07.cwa-api",[435,438,442,446,449,452,456,460],{"title":23,"path":436,"stem":437},"\u002Fnuxt-module\u002Fcwa-api\u002Foverview","5.nuxt-module\u002F07.cwa-api\u002F1.overview",{"title":439,"path":440,"stem":441},"Resources","\u002Fnuxt-module\u002Fcwa-api\u002Fresources","5.nuxt-module\u002F07.cwa-api\u002F2.resources",{"title":443,"path":444,"stem":445},"Resources Manager","\u002Fnuxt-module\u002Fcwa-api\u002Fresources-manager","5.nuxt-module\u002F07.cwa-api\u002F3.resources-manager",{"title":406,"path":447,"stem":448},"\u002Fnuxt-module\u002Fcwa-api\u002Fauth","5.nuxt-module\u002F07.cwa-api\u002F4.auth",{"title":283,"path":450,"stem":451},"\u002Fnuxt-module\u002Fcwa-api\u002Fforms","5.nuxt-module\u002F07.cwa-api\u002F5.forms",{"title":453,"path":454,"stem":455},"Admin","\u002Fnuxt-module\u002Fcwa-api\u002Fadmin","5.nuxt-module\u002F07.cwa-api\u002F6.admin",{"title":457,"path":458,"stem":459},"Site Config","\u002Fnuxt-module\u002Fcwa-api\u002Fsite-config","5.nuxt-module\u002F07.cwa-api\u002F7.site-config",{"title":461,"path":462,"stem":463},"Orphaned Resources","\u002Fnuxt-module\u002Fcwa-api\u002Forphaned-resources","5.nuxt-module\u002F07.cwa-api\u002F8.orphaned-resources",{"title":108,"path":465,"stem":466},"\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F08.authentication",{"title":468,"path":469,"stem":470,"children":471,"page":119},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[472,475,479,483,487,491],{"title":23,"path":473,"stem":474},"\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":476,"path":477,"stem":478},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":480,"path":481,"stem":482},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":484,"path":485,"stem":486},"Styling","\u002Fnuxt-module\u002Fcwa-layer\u002Fstyling","5.nuxt-module\u002F9.cwa-layer\u002F4.styling",{"title":488,"path":489,"stem":490},"Date Pickers","\u002Fnuxt-module\u002Fcwa-layer\u002Fdate-pickers","5.nuxt-module\u002F9.cwa-layer\u002F5.date-pickers",{"title":492,"path":493,"stem":494},"Maintenance","\u002Fnuxt-module\u002Fcwa-layer\u002Fmaintenance","5.nuxt-module\u002F9.cwa-layer\u002F6.maintenance",{"title":496,"path":497,"stem":498},"PWA & Offline","\u002Fnuxt-module\u002Fpwa","5.nuxt-module\u002F91.pwa",{"title":500,"path":501,"stem":502},"Page Caching","\u002Fnuxt-module\u002Fpage-caching","5.nuxt-module\u002F92.page-caching",{"title":504,"path":505,"stem":506,"children":507},"Deploying a CWA Site","\u002Fdeployment","6.deployment\u002F0.index",[508,509,513,517,521,525,529,533,537,541,545,549],{"title":504,"path":505,"stem":506},{"title":510,"path":511,"stem":512},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":514,"path":515,"stem":516},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":518,"path":519,"stem":520},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"title":522,"path":523,"stem":524},"CI\u002FCD Variables","\u002Fdeployment\u002Fvariables","6.deployment\u002F4.variables",{"title":526,"path":527,"stem":528},"Cloudflare","\u002Fdeployment\u002Fcloudflare","6.deployment\u002F5.cloudflare",{"title":530,"path":531,"stem":532},"Origin Protection","\u002Fdeployment\u002Forigin-protection","6.deployment\u002F5.origin-protection",{"title":534,"path":535,"stem":536},"Load Testing","\u002Fdeployment\u002Fload-testing","6.deployment\u002F6.load-testing",{"title":538,"path":539,"stem":540},"Performance Audit","\u002Fdeployment\u002Fperformance-audit","6.deployment\u002F6.performance-audit",{"title":542,"path":543,"stem":544},"Reading Lighthouse Scores","\u002Fdeployment\u002Freading-lighthouse-scores","6.deployment\u002F6.reading-lighthouse-scores",{"title":546,"path":547,"stem":548},"Faster Functional Tests","\u002Fdeployment\u002Ffaster-functional-tests","6.deployment\u002F7.faster-functional-tests",{"title":550,"path":551,"stem":552},"Troubleshooting","\u002Fdeployment\u002Ftroubleshooting","6.deployment\u002F7.troubleshooting",{"id":554,"title":86,"badge":555,"body":556,"description":1982,"extension":1983,"links":555,"meta":1984,"navigation":689,"path":87,"seo":1985,"stem":88,"__hash__":1986},"docs\u002F3.guides\u002F5.your-first-dynamic-page.md",null,{"type":557,"value":558,"toc":1973},"minimark",[559,572,596,631,644,649,655,662,1023,1043,1046,1088,1104,1108,1115,1223,1241,1245,1248,1272,1282,1287,1327,1354,1359,1387,1412,1421,1443,1447,1457,1888,1907,1910,1934,1950,1956,1960,1969],[560,561,562,563,567,568,571],"p",{},"Every page so far has its own URL and its own content. Repeating content, such as blog articles, events or products, works differently. Each item is a ",[564,565,566],"strong",{},"page data"," record with its own URL and fields, and they all share one ",[564,569,570],{},"template page"," for their structure.",[560,573,574,575,579,580,583,584,587,588,591,592,595],{},"This guide builds news articles. Each article has its own Quote, shown in the ",[576,577,578],"code",{},"main"," region of the ",[576,581,582],{},"TwoColumnPageTemplate"," you built in ",[585,586,74],"a",{"href":75},". If you picked the blog feature, the template's ",[576,589,590],{},"BlogArticleData"," and ",[576,593,594],{},"BlogScaffoldPart"," are a complete working example of the same pattern.",[597,598,601],"callout",{"icon":599,"color":600},"i-heroicons-exclamation-triangle","warning",[560,602,603,606,607,611,612,615,616,619,620,622,623,626,627,630],{},[564,604,605],{},"\"Page template\" and \"template page\" are different things."," A ",[608,609,610],"em",{},"page template"," is a Vue file, such as ",[576,613,614],{},"TwoColumnPageTemplate.vue","; the admin calls it the ",[564,617,618],{},"Page UI",". A ",[608,621,570],{}," is a page record with ",[576,624,625],{},"isTemplate: true"," that many page data records share; the admin calls it a ",[564,628,629],{},"Dynamic"," page. This guide makes a template page that renders through the page template you already have.",[597,632,634],{"icon":633},"i-heroicons-photo",[560,635,636,637,591,640,643],{},"IMAGE: Two news article pages side by side, ",[576,638,639],{},"\u002Fnews\u002Ffirst-article",[576,641,642],{},"\u002Fnews\u002Fsecond-article",", with the same landing layout and two-column structure but a different quote in each main region",[645,646,648],"h2",{"id":647},"the-file","The File",[560,650,651,652,654],{},"The Vue file already exists: articles render through ",[576,653,614],{},". The new file is the PHP entity for the articles' data.",[560,656,657,658,661],{},"Create ",[576,659,660],{},"api\u002Fsrc\u002FEntity\u002FNewsArticleData.php",":",[663,664,669],"pre",{"className":665,"code":666,"language":667,"meta":668,"style":668},"language-php shiki shiki-themes github-light github-dark material-theme-palenight has-focused","\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Entity;\n\nuse ApiPlatform\\Metadata\\ApiResource;\nuse App\\Entity\\Component\\Quote;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Silverback\\ApiComponentsBundle\\Entity\\Core\\AbstractPageData;\n\n#[ApiResource(mercure: true)]\n#[ORM\\Entity]\nclass NewsArticleData extends AbstractPageData\n{\n    #[ORM\\ManyToOne(targetEntity: Quote::class)] \u002F\u002F [!code focus]\n    #[ORM\\JoinColumn(nullable: true, onDelete: 'SET NULL')] \u002F\u002F [!code focus]\n    public ?Quote $quote = null; \u002F\u002F [!code focus]\n}\n","php","",[576,670,671,684,691,715,720,741,746,768,790,816,845,850,875,888,904,910,946,991,1017],{"__ignoreMap":668},[672,673,676,680],"span",{"class":674,"line":675},"line",1,[672,677,679],{"class":678},"sVlFx","\u003C?",[672,681,683],{"class":682},"sc2zw","php\n",[672,685,687],{"class":674,"line":686},2,[672,688,690],{"emptyLinePlaceholder":689},true,"\n",[672,692,694,698,702,705,708,712],{"class":674,"line":693},3,[672,695,697],{"class":696},"sm4w6","declare",[672,699,701],{"class":700},"sOvfz","(",[672,703,704],{"class":682},"strict_types",[672,706,707],{"class":678},"=",[672,709,711],{"class":710},"scSvc","1",[672,713,714],{"class":700},");\n",[672,716,718],{"class":674,"line":717},4,[672,719,690],{"emptyLinePlaceholder":689},[672,721,723,727,731,735,738],{"class":674,"line":722},5,[672,724,726],{"class":725},"stmX-","namespace",[672,728,730],{"class":729},"sRCss"," App",[672,732,734],{"class":733},"sn4go","\\",[672,736,737],{"class":729},"Entity",[672,739,740],{"class":700},";\n",[672,742,744],{"class":674,"line":743},6,[672,745,690],{"emptyLinePlaceholder":689},[672,747,749,752,755,758,761,763,766],{"class":674,"line":748},7,[672,750,751],{"class":725},"use",[672,753,754],{"class":682}," ApiPlatform",[672,756,734],{"class":757},"sBtbT",[672,759,760],{"class":682},"Metadata",[672,762,734],{"class":757},[672,764,765],{"class":682},"ApiResource",[672,767,740],{"class":700},[672,769,771,773,775,777,779,781,783,785,788],{"class":674,"line":770},8,[672,772,751],{"class":725},[672,774,730],{"class":682},[672,776,734],{"class":757},[672,778,737],{"class":682},[672,780,734],{"class":757},[672,782,324],{"class":682},[672,784,734],{"class":757},[672,786,787],{"class":682},"Quote",[672,789,740],{"class":700},[672,791,793,795,798,800,803,805,808,811,814],{"class":674,"line":792},9,[672,794,751],{"class":725},[672,796,797],{"class":682}," Doctrine",[672,799,734],{"class":757},[672,801,802],{"class":682},"ORM",[672,804,734],{"class":757},[672,806,807],{"class":682},"Mapping",[672,809,810],{"class":725}," as",[672,812,813],{"class":729}," ORM",[672,815,740],{"class":700},[672,817,819,821,824,826,829,831,833,835,838,840,843],{"class":674,"line":818},10,[672,820,751],{"class":725},[672,822,823],{"class":682}," Silverback",[672,825,734],{"class":757},[672,827,828],{"class":682},"ApiComponentsBundle",[672,830,734],{"class":757},[672,832,737],{"class":682},[672,834,734],{"class":757},[672,836,837],{"class":682},"Core",[672,839,734],{"class":757},[672,841,842],{"class":682},"AbstractPageData",[672,844,740],{"class":700},[672,846,848],{"class":674,"line":847},11,[672,849,690],{"emptyLinePlaceholder":689},[672,851,853,857,859,861,864,866,869,872],{"class":674,"line":852},12,[672,854,856],{"class":855},"sPB8G","#[",[672,858,765],{"class":682},[672,860,701],{"class":700},[672,862,863],{"class":729},"mercure",[672,865,661],{"class":700},[672,867,868],{"class":757}," true",[672,870,871],{"class":700},")",[672,873,874],{"class":855},"]\n",[672,876,878,880,882,884,886],{"class":674,"line":877},13,[672,879,856],{"class":855},[672,881,802],{"class":682},[672,883,734],{"class":757},[672,885,737],{"class":682},[672,887,874],{"class":855},[672,889,891,895,898,901],{"class":674,"line":890},14,[672,892,894],{"class":893},"swB56","class",[672,896,897],{"class":729}," NewsArticleData",[672,899,900],{"class":893}," extends",[672,902,903],{"class":729}," AbstractPageData\n",[672,905,907],{"class":674,"line":906},15,[672,908,909],{"class":700},"{\n",[672,911,915,918,920,922,925,927,930,932,936,939,941,943],{"class":912,"line":914},[674,913],"focused",16,[672,916,917],{"class":855},"    #[",[672,919,802],{"class":682},[672,921,734],{"class":757},[672,923,924],{"class":682},"ManyToOne",[672,926,701],{"class":700},[672,928,929],{"class":729},"targetEntity",[672,931,661],{"class":700},[672,933,935],{"class":934},"sbW4m"," Quote",[672,937,938],{"class":678},"::",[672,940,894],{"class":725},[672,942,871],{"class":700},[672,944,945],{"class":855},"] ",[672,947,950,952,954,956,959,961,964,966,968,971,974,976,980,984,987,989],{"class":948,"line":949},[674,913],17,[672,951,917],{"class":855},[672,953,802],{"class":682},[672,955,734],{"class":757},[672,957,958],{"class":682},"JoinColumn",[672,960,701],{"class":700},[672,962,963],{"class":729},"nullable",[672,965,661],{"class":700},[672,967,868],{"class":757},[672,969,970],{"class":700},",",[672,972,973],{"class":729}," onDelete",[672,975,661],{"class":700},[672,977,979],{"class":978},"seSrl"," '",[672,981,983],{"class":982},"sLL54","SET NULL",[672,985,986],{"class":978},"'",[672,988,871],{"class":700},[672,990,945],{"class":855},[672,992,995,998,1001,1003,1006,1009,1011,1014],{"class":993,"line":994},[674,913],18,[672,996,997],{"class":893},"    public",[672,999,1000],{"class":678}," ?",[672,1002,787],{"class":934},[672,1004,1005],{"class":700}," $",[672,1007,1008],{"class":855},"quote ",[672,1010,707],{"class":678},[672,1012,1013],{"class":757}," null",[672,1015,1016],{"class":700},";",[672,1018,1020],{"class":674,"line":1019},19,[672,1021,1022],{"class":700},"}\n",[560,1024,1025,1027,1028,591,1031,1034,1035,1038,1039,1042],{},[576,1026,842],{}," gives each article a ",[576,1029,1030],{},"title",[576,1032,1033],{},"metaDescription",", which the module uses for the page's ",[576,1036,1037],{},"\u003Ctitle>"," and meta description. The ",[576,1040,1041],{},"quote"," field holds the component each article shows. A field like this must be typed as a component class.",[560,1044,1045],{},"Generate and run the migration from the project root:",[663,1047,1051],{"className":1048,"code":1049,"language":1050,"meta":668,"style":668},"language-bash shiki shiki-themes github-light github-dark material-theme-palenight","docker compose exec php bin\u002Fconsole doctrine:migrations:diff\ndocker compose exec php bin\u002Fconsole doctrine:migrations:migrate\n","bash",[576,1052,1053,1073],{"__ignoreMap":668},[672,1054,1055,1058,1061,1064,1067,1070],{"class":674,"line":675},[672,1056,1057],{"class":729},"docker",[672,1059,1060],{"class":982}," compose",[672,1062,1063],{"class":982}," exec",[672,1065,1066],{"class":982}," php",[672,1068,1069],{"class":982}," bin\u002Fconsole",[672,1071,1072],{"class":982}," doctrine:migrations:diff\n",[672,1074,1075,1077,1079,1081,1083,1085],{"class":674,"line":686},[672,1076,1057],{"class":729},[672,1078,1060],{"class":982},[672,1080,1063],{"class":982},[672,1082,1066],{"class":982},[672,1084,1069],{"class":982},[672,1086,1087],{"class":982}," doctrine:migrations:migrate\n",[560,1089,1090,1091,1094,1095,1098,1099,1103],{},"As in the last guide, review the migration in ",[576,1092,1093],{},"api\u002Fmigrations\u002F"," and delete its ",[576,1096,1097],{},"down()",": the template's migrations are ",[585,1100,1102],{"href":1101},"\u002Fapi\u002Fbundle-setup#database-setup","upward-only",".",[645,1105,1107],{"id":1106},"register-in-nuxtconfig","Register in nuxt.config",[560,1109,1110,1111,1114],{},"Add a ",[576,1112,1113],{},"pageData"," entry, keyed by the class's short name:",[663,1116,1120],{"className":1117,"code":1118,"language":1119,"meta":668,"style":668},"language-ts shiki shiki-themes github-light github-dark material-theme-palenight has-focused","\u002F\u002F app\u002Fnuxt.config.ts\ncwa: {\n  pageData: {\n    NewsArticleData: { \u002F\u002F [!code focus]\n      name: 'News Articles', \u002F\u002F [!code focus]\n      properties: { \u002F\u002F [!code focus]\n        quote: 'Article Quote', \u002F\u002F [!code focus]\n      }, \u002F\u002F [!code focus]\n    }, \u002F\u002F [!code focus]\n  }\n}\n","ts",[576,1121,1122,1128,1138,1147,1158,1175,1185,1202,1208,1214,1219],{"__ignoreMap":668},[672,1123,1124],{"class":674,"line":675},[672,1125,1127],{"class":1126},"sTBSN","\u002F\u002F app\u002Fnuxt.config.ts\n",[672,1129,1130,1133,1135],{"class":674,"line":686},[672,1131,1132],{"class":729},"cwa",[672,1134,661],{"class":700},[672,1136,1137],{"class":700}," {\n",[672,1139,1140,1143,1145],{"class":674,"line":693},[672,1141,1142],{"class":729},"  pageData",[672,1144,661],{"class":700},[672,1146,1137],{"class":700},[672,1148,1150,1153,1155],{"class":1149,"line":717},[674,913],[672,1151,1152],{"class":729},"    NewsArticleData",[672,1154,661],{"class":700},[672,1156,1157],{"class":700}," {",[672,1159,1161,1164,1166,1168,1171,1173],{"class":1160,"line":722},[674,913],[672,1162,1163],{"class":729},"      name",[672,1165,661],{"class":700},[672,1167,979],{"class":978},[672,1169,1170],{"class":982},"News Articles",[672,1172,986],{"class":978},[672,1174,970],{"class":700},[672,1176,1178,1181,1183],{"class":1177,"line":743},[674,913],[672,1179,1180],{"class":729},"      properties",[672,1182,661],{"class":700},[672,1184,1157],{"class":700},[672,1186,1188,1191,1193,1195,1198,1200],{"class":1187,"line":748},[674,913],[672,1189,1190],{"class":729},"        quote",[672,1192,661],{"class":700},[672,1194,979],{"class":978},[672,1196,1197],{"class":982},"Article Quote",[672,1199,986],{"class":978},[672,1201,970],{"class":700},[672,1203,1205],{"class":1204,"line":770},[674,913],[672,1206,1207],{"class":700},"      },",[672,1209,1211],{"class":1210,"line":792},[674,913],[672,1212,1213],{"class":700},"    },",[672,1215,1216],{"class":674,"line":818},[672,1217,1218],{"class":700},"  }\n",[672,1220,1221],{"class":674,"line":847},[672,1222,1022],{"class":700},[560,1224,1225,1228,1229,1232,1233,1236,1237,1240],{},[576,1226,1227],{},"name"," is how the admin lists the type at ",[576,1230,1231],{},"\u002F_cwa\u002Fdata"," and in its selects. ",[576,1234,1235],{},"properties"," gives each component field a label. Both are optional: without them the admin shows ",[576,1238,1239],{},"NewsArticleData"," and a label made from the field name.",[645,1242,1244],{"id":1243},"create-in-the-api","Create in the API",[560,1246,1247],{},"Three records make a dynamic page work:",[1249,1250,1251,1261,1266],"ol",{},[1252,1253,1254,1255,1257,1258,1260],"li",{},"a ",[564,1256,570],{},", with a region bound to the ",[576,1259,1041],{}," field;",[1252,1262,1254,1263,1265],{},[564,1264,566],{}," record for each article, naming the template page;",[1252,1267,1254,1268,1271],{},[564,1269,1270],{},"route"," for each article.",[560,1273,1274,1275,1278,1279,1281],{},"The region binding is a ",[564,1276,1277],{},"dynamic component position",". Instead of holding one component, it shows whatever component the current article holds in its ",[576,1280,1041],{}," field.",[1283,1284,1286],"h3",{"id":1285},"via-the-admin","Via the admin",[560,1288,1289,1292,1293,1296,1297,1300,1301,1304,1305,1307,1308,1311,1312,1315,1316,1318,1319,1322,1323,1326],{},[564,1290,1291],{},"The template page."," Go to ",[576,1294,1295],{},"\u002F_cwa\u002Fpages"," → ",[564,1298,1299],{},"+",". Switch the type select at the top from ",[564,1302,1303],{},"Static"," to ",[564,1306,629],{},", give it the reference ",[576,1309,1310],{},"news-template",", choose ",[564,1313,1314],{},"Two Column Page"," as the ",[564,1317,618],{}," and the ",[576,1320,1321],{},"landing"," layout, and click ",[564,1324,1325],{},"Add Now",". A template page has no route.",[560,1328,1329,1332,1333,1336,1337,1339,1340,1342,1343,1315,1345,591,1348,1315,1350,1353],{},[564,1330,1331],{},"The dynamic position."," Open the template page with the eye icon in its settings, and click ",[564,1334,1335],{},"Edit",". Click ",[564,1338,1299],{}," in the main region. The Add Component dialog has a ",[564,1341,629],{}," option as well as the component types: choose it, then ",[564,1344,1170],{},[564,1346,1347],{},"Data type",[564,1349,1197],{},[564,1351,1352],{},"Field",", and confirm.",[597,1355,1356],{"icon":633},[560,1357,1358],{},"IMAGE: The Add Component dialog on the template page, with Dynamic selected, News Articles as the Data type and Article Quote as the Field",[560,1360,1361,1292,1364,1296,1366,1296,1368,1370,1371,1373,1374,1377,1378,1380,1381,1383,1384,1103],{},[564,1362,1363],{},"An article.",[576,1365,1231],{},[564,1367,1170],{},[564,1369,1299],{},". Give the article a title, choose ",[576,1372,1310],{}," as its ",[564,1375,1376],{},"Dynamic Page",", and click ",[564,1379,1325],{},". It opens on its ",[564,1382,167],{}," tab: create a route with the path ",[576,1385,1386],{},"news\u002Ffirst-article",[560,1388,1389,1392,1393,1396,1397,1399,1400,1403,1404,1407,1408,1411],{},[564,1390,1391],{},"Its quote."," Visit ",[576,1394,1395],{},"https:\u002F\u002Flocalhost\u002Fnews\u002Ffirst-article"," and click ",[564,1398,1335],{},". Select the main region's dynamic position. Its ",[564,1401,1402],{},"Data Placeholder"," tab has an ",[564,1405,1406],{},"Add Quote"," button: click it, type the quote, and click ",[564,1409,1410],{},"Publish",". The quote belongs to this article; the next article you create gets its own.",[597,1413,1415],{"icon":1414},"i-heroicons-video-camera",[560,1416,1417,1418,1420],{},"VIDEO: The full loop: creating the Dynamic template page, adding the dynamic position on it, creating a News Article with the route ",[576,1419,1386],{},", then on that page adding its Quote from the Data Placeholder tab and publishing it",[597,1422,1424],{"icon":1423},"i-heroicons-information-circle",[560,1425,1426,1427,1430,1431,1434,1435,1438,1439,1442],{},"In the admin lists, ",[564,1428,1429],{},"blue"," records are static pages, ",[564,1432,1433],{},"yellow"," are template pages, and ",[564,1436,1437],{},"green"," are page data records, shown ",[564,1440,1441],{},"orange"," until they have a route. So you can see at a glance what is shared structure and what is one item of content.",[1283,1444,1446],{"id":1445},"via-fixtures","Via fixtures",[560,1448,1449,1450,1453,1454,661],{},"Add to ",[576,1451,1452],{},"build()"," in ",[576,1455,1456],{},"api\u002Fsrc\u002FDataFixtures\u002FParts\u002FLandingScaffoldPart.php",[663,1458,1460],{"className":665,"code":1459,"language":667,"meta":668,"style":668},"use App\\Entity\\Component\\Quote; \u002F\u002F [!code focus]\nuse App\\Entity\\NewsArticleData; \u002F\u002F [!code focus]\n\n\u002F\u002F ...\n\npublic function build(CwaFixtureBuilder $cwa, ScaffoldState $state): void\n{\n    \u002F\u002F ... the landing layout and page from the earlier guides\n\n    $cwa->page('news-template', 'TwoColumnPageTemplate', layout: 'landing', isTemplate: true) \u002F\u002F [!code focus]\n        ->group('main')->pageDataPosition(NewsArticleData::class, 'quote'); \u002F\u002F [!code focus]\n\n    $quote = new Quote(); \u002F\u002F [!code focus]\n    $quote->text = 'News is what somebody does not want you to print.'; \u002F\u002F [!code focus]\n    $quote->setPublishedAt(new \\DateTime()); \u002F\u002F [!code focus]\n    $cwa->persist($quote); \u002F\u002F [!code focus]\n\n    $article = new NewsArticleData(); \u002F\u002F [!code focus]\n    $article->setTitle('First article') \u002F\u002F [!code focus]\n        ->setMetaDescription('The first news article.'); \u002F\u002F [!code focus]\n    $article->quote = $quote; \u002F\u002F [!code focus]\n\n    $cwa->pageData($article, template: 'news-template', route: '\u002Fnews\u002Ffirst-article'); \u002F\u002F [!code focus]\n}\n",[576,1461,1462,1483,1500,1504,1509,1513,1551,1555,1560,1564,1618,1661,1665,1682,1705,1731,1750,1754,1770,1794,1814,1834,1839,1883],{"__ignoreMap":668},[672,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481],{"class":1464,"line":675},[674,913],[672,1466,751],{"class":725},[672,1468,730],{"class":682},[672,1470,734],{"class":757},[672,1472,737],{"class":682},[672,1474,734],{"class":757},[672,1476,324],{"class":682},[672,1478,734],{"class":757},[672,1480,787],{"class":682},[672,1482,1016],{"class":700},[672,1484,1486,1488,1490,1492,1494,1496,1498],{"class":1485,"line":686},[674,913],[672,1487,751],{"class":725},[672,1489,730],{"class":682},[672,1491,734],{"class":757},[672,1493,737],{"class":682},[672,1495,734],{"class":757},[672,1497,1239],{"class":682},[672,1499,1016],{"class":700},[672,1501,1502],{"class":674,"line":693},[672,1503,690],{"emptyLinePlaceholder":689},[672,1505,1506],{"class":674,"line":717},[672,1507,1508],{"class":1126},"\u002F\u002F ...\n",[672,1510,1511],{"class":674,"line":722},[672,1512,690],{"emptyLinePlaceholder":689},[672,1514,1515,1518,1521,1525,1527,1530,1532,1534,1536,1539,1541,1544,1546,1548],{"class":674,"line":743},[672,1516,1517],{"class":893},"public",[672,1519,1520],{"class":893}," function",[672,1522,1524],{"class":1523},"sKpYG"," build",[672,1526,701],{"class":700},[672,1528,1529],{"class":934},"CwaFixtureBuilder",[672,1531,1005],{"class":700},[672,1533,1132],{"class":855},[672,1535,970],{"class":700},[672,1537,1538],{"class":934}," ScaffoldState",[672,1540,1005],{"class":700},[672,1542,1543],{"class":855},"state",[672,1545,871],{"class":700},[672,1547,661],{"class":678},[672,1549,1550],{"class":725}," void\n",[672,1552,1553],{"class":674,"line":748},[672,1554,909],{"class":700},[672,1556,1557],{"class":674,"line":770},[672,1558,1559],{"class":1126},"    \u002F\u002F ... the landing layout and page from the earlier guides\n",[672,1561,1562],{"class":674,"line":792},[672,1563,690],{"emptyLinePlaceholder":689},[672,1565,1567,1570,1572,1575,1578,1580,1582,1584,1586,1588,1590,1592,1594,1596,1599,1601,1603,1605,1607,1609,1612,1614,1616],{"class":1566,"line":818},[674,913],[672,1568,1569],{"class":700},"    $",[672,1571,1132],{"class":855},[672,1573,1574],{"class":678},"->",[672,1576,1577],{"class":1523},"page",[672,1579,701],{"class":700},[672,1581,986],{"class":978},[672,1583,1310],{"class":982},[672,1585,986],{"class":978},[672,1587,970],{"class":700},[672,1589,979],{"class":978},[672,1591,582],{"class":982},[672,1593,986],{"class":978},[672,1595,970],{"class":700},[672,1597,1598],{"class":729}," layout",[672,1600,661],{"class":700},[672,1602,979],{"class":978},[672,1604,1321],{"class":982},[672,1606,986],{"class":978},[672,1608,970],{"class":700},[672,1610,1611],{"class":729}," isTemplate",[672,1613,661],{"class":700},[672,1615,868],{"class":757},[672,1617,871],{"class":700},[672,1619,1621,1624,1627,1629,1631,1633,1635,1637,1639,1642,1644,1646,1648,1650,1652,1654,1656,1658],{"class":1620,"line":847},[674,913],[672,1622,1623],{"class":678},"        ->",[672,1625,1626],{"class":1523},"group",[672,1628,701],{"class":700},[672,1630,986],{"class":978},[672,1632,578],{"class":982},[672,1634,986],{"class":978},[672,1636,871],{"class":700},[672,1638,1574],{"class":678},[672,1640,1641],{"class":1523},"pageDataPosition",[672,1643,701],{"class":700},[672,1645,1239],{"class":934},[672,1647,938],{"class":678},[672,1649,894],{"class":725},[672,1651,970],{"class":700},[672,1653,979],{"class":978},[672,1655,1041],{"class":982},[672,1657,986],{"class":978},[672,1659,1660],{"class":700},");",[672,1662,1663],{"class":674,"line":852},[672,1664,690],{"emptyLinePlaceholder":689},[672,1666,1668,1670,1672,1674,1677,1679],{"class":1667,"line":877},[674,913],[672,1669,1569],{"class":700},[672,1671,1008],{"class":855},[672,1673,707],{"class":678},[672,1675,1676],{"class":725}," new",[672,1678,935],{"class":934},[672,1680,1681],{"class":700},"();",[672,1683,1685,1687,1689,1691,1694,1696,1698,1701,1703],{"class":1684,"line":890},[674,913],[672,1686,1569],{"class":700},[672,1688,1041],{"class":855},[672,1690,1574],{"class":678},[672,1692,1693],{"class":855},"text ",[672,1695,707],{"class":678},[672,1697,979],{"class":978},[672,1699,1700],{"class":982},"News is what somebody does not want you to print.",[672,1702,986],{"class":978},[672,1704,1016],{"class":700},[672,1706,1708,1710,1712,1714,1717,1719,1722,1725,1728],{"class":1707,"line":906},[674,913],[672,1709,1569],{"class":700},[672,1711,1041],{"class":855},[672,1713,1574],{"class":678},[672,1715,1716],{"class":1523},"setPublishedAt",[672,1718,701],{"class":700},[672,1720,1721],{"class":725},"new",[672,1723,1724],{"class":757}," \\",[672,1726,1727],{"class":934},"DateTime",[672,1729,1730],{"class":700},"());",[672,1732,1734,1736,1738,1740,1743,1746,1748],{"class":1733,"line":914},[674,913],[672,1735,1569],{"class":700},[672,1737,1132],{"class":855},[672,1739,1574],{"class":678},[672,1741,1742],{"class":1523},"persist",[672,1744,1745],{"class":700},"($",[672,1747,1041],{"class":855},[672,1749,1660],{"class":700},[672,1751,1752],{"class":674,"line":949},[672,1753,690],{"emptyLinePlaceholder":689},[672,1755,1757,1759,1762,1764,1766,1768],{"class":1756,"line":994},[674,913],[672,1758,1569],{"class":700},[672,1760,1761],{"class":855},"article ",[672,1763,707],{"class":678},[672,1765,1676],{"class":725},[672,1767,897],{"class":934},[672,1769,1681],{"class":700},[672,1771,1773,1775,1778,1780,1783,1785,1787,1790,1792],{"class":1772,"line":1019},[674,913],[672,1774,1569],{"class":700},[672,1776,1777],{"class":855},"article",[672,1779,1574],{"class":678},[672,1781,1782],{"class":1523},"setTitle",[672,1784,701],{"class":700},[672,1786,986],{"class":978},[672,1788,1789],{"class":982},"First article",[672,1791,986],{"class":978},[672,1793,871],{"class":700},[672,1795,1798,1800,1803,1805,1807,1810,1812],{"class":1796,"line":1797},[674,913],20,[672,1799,1623],{"class":678},[672,1801,1802],{"class":1523},"setMetaDescription",[672,1804,701],{"class":700},[672,1806,986],{"class":978},[672,1808,1809],{"class":982},"The first news article.",[672,1811,986],{"class":978},[672,1813,1660],{"class":700},[672,1815,1818,1820,1822,1824,1826,1828,1830,1832],{"class":1816,"line":1817},[674,913],21,[672,1819,1569],{"class":700},[672,1821,1777],{"class":855},[672,1823,1574],{"class":678},[672,1825,1008],{"class":855},[672,1827,707],{"class":678},[672,1829,1005],{"class":700},[672,1831,1041],{"class":855},[672,1833,1016],{"class":700},[672,1835,1837],{"class":674,"line":1836},22,[672,1838,690],{"emptyLinePlaceholder":689},[672,1840,1843,1845,1847,1849,1851,1853,1855,1857,1860,1862,1864,1866,1868,1870,1873,1875,1877,1879,1881],{"class":1841,"line":1842},[674,913],23,[672,1844,1569],{"class":700},[672,1846,1132],{"class":855},[672,1848,1574],{"class":678},[672,1850,1113],{"class":1523},[672,1852,1745],{"class":700},[672,1854,1777],{"class":855},[672,1856,970],{"class":700},[672,1858,1859],{"class":729}," template",[672,1861,661],{"class":700},[672,1863,979],{"class":978},[672,1865,1310],{"class":982},[672,1867,986],{"class":978},[672,1869,970],{"class":700},[672,1871,1872],{"class":729}," route",[672,1874,661],{"class":700},[672,1876,979],{"class":978},[672,1878,639],{"class":982},[672,1880,986],{"class":978},[672,1882,1660],{"class":700},[672,1884,1886],{"class":674,"line":1885},24,[672,1887,1022],{"class":700},[560,1889,1890,1892,1893,1896,1897,1899,1900,1903,1904,1103],{},[576,1891,625],{}," makes the page a template page, so it gets no route. ",[576,1894,1895],{},"pageDataPosition()"," takes the page data class and the field name, and creates the dynamic position in the ",[576,1898,578],{}," group. ",[576,1901,1902],{},"pageData()"," takes the template page's reference, not its ",[576,1905,1906],{},"uiComponent",[560,1908,1909],{},"Load it from the project root:",[663,1911,1913],{"className":1048,"code":1912,"language":1050,"meta":668,"style":668},"docker compose exec php bin\u002Fconsole doctrine:fixtures:load --append\n",[576,1914,1915],{"__ignoreMap":668},[672,1916,1917,1919,1921,1923,1925,1927,1930],{"class":674,"line":675},[672,1918,1057],{"class":729},[672,1920,1060],{"class":982},[672,1922,1063],{"class":982},[672,1924,1066],{"class":982},[672,1926,1069],{"class":982},[672,1928,1929],{"class":982}," doctrine:fixtures:load",[672,1931,1933],{"class":1932},"szhYu"," --append\n",[597,1935,1936],{"icon":599,"color":600},[560,1937,1938,1941,1942,1945,1946,1103],{},[576,1939,1940],{},"--append"," keeps anything that already exists. An article whose route path already exists is kept as it is, and so is its quote, so a second load doesn't create another one. A group that already exists is kept too, without new positions, as in ",[585,1943,78],{"href":1944},"\u002Fguides\u002Fyour-first-component#via-fixtures",". See ",[585,1947,1949],{"href":1948},"\u002Fapi\u002Fdata-fixtures\u002Fappending#appending-to-an-existing-site","Appending to an Existing Site",[560,1951,1952,1953,1955],{},"Visit ",[576,1954,1395],{},": the landing layout wraps the two-column page, and the main region shows this article's quote.",[645,1957,1959],{"id":1958},"next-how-dynamic-pages-work","Next: How Dynamic Pages Work",[560,1961,1962,1963,1965,1966,1968],{},"You've built every piece the guides cover. ",[585,1964,41],{"href":42}," explains how page data, template pages and dynamic positions fit together, and the API's ",[585,1967,163],{"href":164}," covers collections, nested pages and route generation.",[1970,1971,1972],"style",{},"html pre.shiki code .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#89DDFF}html pre.shiki code .sc2zw, html code.shiki .sc2zw{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sm4w6, html code.shiki .sm4w6{--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .scSvc, html code.shiki .scSvc{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#F78C6C}html pre.shiki code .stmX-, html code.shiki .stmX-{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F78C6C}html pre.shiki code .sRCss, html code.shiki .sRCss{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .sn4go, html code.shiki .sn4go{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#89DDFF}html pre.shiki code .sBtbT, html code.shiki .sBtbT{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#89DDFF}html pre.shiki code .sPB8G, html code.shiki .sPB8G{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}html pre.shiki code .swB56, html code.shiki .swB56{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}html pre.shiki code .seSrl, html code.shiki .seSrl{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .sLL54, html code.shiki .sLL54{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTBSN, html code.shiki .sTBSN{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sKpYG, html code.shiki .sKpYG{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .szhYu, html code.shiki .szhYu{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#C3E88D}",{"title":668,"searchDepth":686,"depth":686,"links":1974},[1975,1976,1977,1981],{"id":647,"depth":686,"text":648},{"id":1106,"depth":686,"text":1107},{"id":1243,"depth":686,"text":1244,"children":1978},[1979,1980],{"id":1285,"depth":693,"text":1286},{"id":1445,"depth":693,"text":1446},{"id":1958,"depth":686,"text":1959},"Build news articles that share one template page, each with its own URL and its own Quote, using a page data entity and a dynamic component position.","md",{},{"title":86,"description":1982},"k0Patcz54Fdh_5QKzoEDcnRgpR-xvBqhd86lf5OmmLg",[1988,1990],{"title":82,"path":83,"stem":84,"description":1989,"children":-1},"Give the same component multiple visual styles — using style class names for CSS variation or ui\u002F Vue files for fully different templates.",{"title":23,"path":90,"stem":91,"description":1991,"children":-1},"What the API Components Bundle provides, the order to read this section in, and a reference for the core resources it registers.",1791855268657]