[{"data":1,"prerenderedAt":401},["ShallowReactive",2],{"navigation_docs":3,"-drupal-themes":221,"-drupal-themes-surround":396},[4,27,77,123,157,207],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Get started","majesticons:rocket-3-start-line","\u002Fget-started","1.get-started",[10,14,18,22],{"title":11,"path":12,"stem":13},"How it works","\u002Fget-started\u002Fhow-it-works","1.get-started\u002F10.how-it-works",{"title":15,"path":16,"stem":17},"Play online","\u002Fget-started\u002Fplay-online","1.get-started\u002F20.play-online",{"title":19,"path":20,"stem":21},"Create a new project","\u002Fget-started\u002Fcreate-new-project","1.get-started\u002F30.create-new-project",{"title":23,"path":24,"stem":25},"First steps","\u002Fget-started\u002Ffirst-steps","1.get-started\u002F40.first-steps",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Guide","mdi:book-open-page-variant-outline","\u002Fguide","2.guide",[33,37,41,45,49,53,57,61,65,69,73],{"title":34,"path":35,"stem":36},"Customized API Output","\u002Fguide\u002Fcustomized-api-output","2.guide\u002F05.customized-api-output",{"title":38,"path":39,"stem":40},"Pages & Routing","\u002Fguide\u002Fpages-routing","2.guide\u002F10.pages-routing",{"title":42,"path":43,"stem":44},"Site layout & Menus","\u002Fguide\u002Fsite-layout-menus","2.guide\u002F20.site-layout-menus",{"title":46,"path":47,"stem":48},"Authentication","\u002Fguide\u002Fauthentication","2.guide\u002F40.authentication",{"title":50,"path":51,"stem":52},"Metatags & Local tasks","\u002Fguide\u002Fmetatags-local-tasks","2.guide\u002F50.metatags-local-tasks",{"title":54,"path":55,"stem":56},"Breadcrumbs & Messages","\u002Fguide\u002Fbreadcrumbs-messages","2.guide\u002F60.breadcrumbs-messages",{"title":58,"path":59,"stem":60},"Redirects","\u002Fguide\u002Fredirects","2.guide\u002F65.redirects",{"title":62,"path":63,"stem":64},"Editorial previews","\u002Fguide\u002Feditorial-previews","2.guide\u002F70.editorial-previews",{"title":66,"path":67,"stem":68},"Layout builder","\u002Fguide\u002Flayout-builder","2.guide\u002F80.layout-builder",{"title":70,"path":71,"stem":72},"Drupal Canvas","\u002Fguide\u002Fcanvas","2.guide\u002F90.canvas",{"title":74,"path":75,"stem":76},"Drupal CMS","\u002Fguide\u002Fdrupal-cms","2.guide\u002F95.drupal-cms",{"title":78,"icon":79,"path":80,"stem":81,"children":82,"page":26},"Advanced topics","bi:diagram-3","\u002Fadvanced-topics","3.advanced-topics",[83,87,91,95,99,103,107,111,115,119],{"title":84,"path":85,"stem":86},"Multi-frontend","\u002Fadvanced-topics\u002Fmulti-frontend","3.advanced-topics\u002F05.multi-frontend",{"title":88,"path":89,"stem":90},"Listings, Views","\u002Fadvanced-topics\u002Flistings-views","3.advanced-topics\u002F10.listings-views",{"title":92,"path":93,"stem":94},"Searches","\u002Fadvanced-topics\u002Fsearches","3.advanced-topics\u002F20.searches",{"title":96,"path":97,"stem":98},"JSON-API & GraphQL","\u002Fadvanced-topics\u002Fjsonapi-graphql","3.advanced-topics\u002F30.jsonapi-graphql",{"title":100,"path":101,"stem":102},"Caching","\u002Fadvanced-topics\u002Fcaching","3.advanced-topics\u002F40.caching",{"title":104,"path":105,"stem":106},"Error pages","\u002Fadvanced-topics\u002Ferror-pages","3.advanced-topics\u002F50.error-pages",{"title":108,"path":109,"stem":110},"Drupal forms","\u002Fadvanced-topics\u002Fdrupal-forms","3.advanced-topics\u002F60.drupal-forms",{"title":112,"path":113,"stem":114},"Site Templates","\u002Fadvanced-topics\u002Fsite-templates","3.advanced-topics\u002F65.site-templates",{"title":116,"path":117,"stem":118},"Block layout","\u002Fadvanced-topics\u002Fblock-layout","3.advanced-topics\u002F70.block-layout",{"title":120,"path":121,"stem":122},"Debugging API requests","\u002Fadvanced-topics\u002Fdebugging","3.advanced-topics\u002F80.debugging",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":26},"Drupal","simple-icons:drupal","\u002Fdrupal","4.drupal",[129,133,137,141,145,149,153],{"title":130,"path":131,"stem":132},"Key modules","\u002Fdrupal\u002Fkey-modules","4.drupal\u002F10.key-modules",{"title":134,"path":135,"stem":136},"Custom elements","\u002Fdrupal\u002Fcustom-elements","4.drupal\u002F20.custom-elements",{"title":138,"path":139,"stem":140},"Routes","\u002Fdrupal\u002Froutes","4.drupal\u002F30.routes",{"title":142,"path":143,"stem":144},"Providing blocks","\u002Fdrupal\u002Fproviding-blocks","4.drupal\u002F40.providing-blocks",{"title":146,"path":147,"stem":148},"Custom Element Processors","\u002Fdrupal\u002Fcustom-element-processors","4.drupal\u002F50.custom-element-processors",{"title":150,"path":151,"stem":152},"Adding Drupal forms","\u002Fdrupal\u002Fadd-drupal-forms","4.drupal\u002F60.add-drupal-forms",{"title":154,"path":155,"stem":156},"Providing themes","\u002Fdrupal\u002Fthemes","4.drupal\u002F70.themes",{"title":158,"icon":159,"path":160,"stem":161,"children":162,"page":26},"Nuxt","simple-icons:nuxtdotjs","\u002Fnuxt","5.nuxt",[163,167,171,175,179,183,187,191,195,199,203],{"title":164,"path":165,"stem":166},"Introduction","\u002Fnuxt\u002Fintroduction","5.nuxt\u002F10.introduction",{"title":168,"path":169,"stem":170},"Setup","\u002Fnuxt\u002Fsetup","5.nuxt\u002F20.setup",{"title":172,"path":173,"stem":174},"Rendering Custom Elements","\u002Fnuxt\u002Frender-custom-elements","5.nuxt\u002F30.render-custom-elements",{"title":176,"path":177,"stem":178},"Default components","\u002Fnuxt\u002Fdefault-components","5.nuxt\u002F32.default-components",{"title":180,"path":181,"stem":182},"Composables","\u002Fnuxt\u002Fcomposables","5.nuxt\u002F35.composables",{"title":184,"path":185,"stem":186},"Custom Routes","\u002Fnuxt\u002Fcustom-routes","5.nuxt\u002F40.custom-routes",{"title":188,"path":189,"stem":190},"Page Layouts","\u002Fnuxt\u002Fpage-layouts","5.nuxt\u002F50.page-layouts",{"title":192,"path":193,"stem":194},"Component Previews","\u002Fnuxt\u002Fcomponent-previews","5.nuxt\u002F55.component-previews",{"title":196,"path":197,"stem":198},"Rendering modes","\u002Fnuxt\u002Frendering-modes","5.nuxt\u002F60.rendering-modes",{"title":200,"path":201,"stem":202},"Deployment options","\u002Fnuxt\u002Fdeployment","5.nuxt\u002F70.deployment",{"title":204,"path":205,"stem":206},"Resources","\u002Fnuxt\u002Fresources","5.nuxt\u002F90.resources",{"title":208,"icon":209,"path":210,"stem":211,"children":212,"page":26},"Deployment","solar:server-square-cloud-linear","\u002Fdeployment","6.deployment",[213,217],{"title":214,"path":215,"stem":216},"Deployment Strategies","\u002Fdeployment\u002Fdeployment-strategy","6.deployment\u002F10.deployment-strategy",{"title":218,"path":219,"stem":220},"Unified Hosting","\u002Fdeployment\u002Funified-hosting","6.deployment\u002F20.unified-hosting",{"id":222,"title":154,"body":223,"description":301,"extension":390,"links":391,"meta":392,"navigation":393,"path":155,"seo":394,"stem":156,"__hash__":395},"docs\u002F4.drupal\u002F70.themes.md",{"type":224,"value":225,"toc":380},"minimark",[226,231,236,249,252,265,273,277,292,295,320,325,332,335,339,363,367,376],[227,228,230],"h1",{"id":229},"providing-themes-with-javascript-rendering","Providing Themes with JavaScript Rendering",[232,233,235],"h2",{"id":234},"overview","Overview",[237,238,239,240,244,245,248],"p",{},"Lupus CSR (Client-Side Rendering) themes allow you to bundle a pre-built frontend application directly as a Drupal theme, so no separate frontend server is needed. Drupal serves the frontend's ",[241,242,243],"code",{},"index.html"," for all frontend routes; the frontend loads in the browser and fetches content from the CE API at ",[241,246,247],{},"\u002Fce-api\u002F..."," on the same origin.",[237,250,251],{},"This approach is ideal for:",[253,254,255,259,262],"ul",{},[256,257,258],"li",{},"Drupal CMS site templates where no separate frontend infrastructure is desired",[256,260,261],{},"Getting started quickly without setting up a Node.js server",[256,263,264],{},"Simple projects where SEO is not a primary concern",[237,266,267,268,272],{},"Note that client-side rendering means content is rendered in the browser via JavaScript. Search engines may not fully index CSR content. For production sites where SEO matters, use ",[269,270,271],"a",{"href":197},"server-side rendering"," instead.",[232,274,276],{"id":275},"lupus-client-side-rendering-lupus-csr","Lupus Client-Side Rendering (Lupus CSR)",[237,278,279,285,286,288,289,291],{},[269,280,284],{"href":281,"rel":282},"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Flupus_csr",[283],"nofollow","Lupus CSR"," is the Drupal base theme that enables this pattern. It intercepts Drupal's normal HTML output and delivers the frontend's ",[241,287,243],{}," instead. Because the frontend communicates with ",[241,290,247],{}," on the same origin, CORS configuration is not needed and Drupal authentication works out of the box.",[237,293,294],{},"Install it via Composer:",[296,297,302],"pre",{"className":298,"code":299,"language":300,"meta":301,"style":301},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","composer require drupal\u002Flupus_csr\n","bash","",[241,303,304],{"__ignoreMap":301},[305,306,309,313,317],"span",{"class":307,"line":308},"line",1,[305,310,312],{"class":311},"sBMFI","composer",[305,314,316],{"class":315},"sfazB"," require",[305,318,319],{"class":315}," drupal\u002Flupus_csr\n",[321,322,324],"h3",{"id":323},"using-lupus-csr-directly","Using Lupus CSR Directly",[237,326,327,328,331],{},"The simplest approach: enable Lupus CSR as your active theme and configure it through the theme settings form at ",[241,329,330],{},"\u002Fadmin\u002Fappearance\u002Fsettings\u002Flupus_csr",". Set a separate admin theme (e.g. Claro) to keep the Drupal backend accessible.",[237,333,334],{},"The frontend redirect in Lupus Decoupled settings is not needed with theme-based rendering and can stay disabled.",[321,336,338],{"id":337},"creating-a-sub-theme","Creating a Sub-Theme",[237,340,341,342,345,346,349,350,352,353,356,357,362],{},"For distributable or project-specific setups, create a sub-theme of ",[241,343,344],{},"lupus_csr"," and include your frontend build output in a ",[241,347,348],{},"dist\u002F"," directory. The ",[241,351,344],{}," module includes an example Nuxt starter in its ",[241,354,355],{},"examples\u002F"," directory. Refer to the ",[269,358,361],{"href":359,"rel":360},"https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Flupus_csr\u002F-\u002Fblob\u002F1.x\u002FUSAGE.md?ref_type=heads#lupus-csr---sub-theme-guide",[283],"Lupus CSR sub-theme guide"," for configuration details.",[321,364,366],{"id":365},"canvas-integration","Canvas Integration",[237,368,369,370,375],{},"If the theme's preview provider supports it, components are automatically registered with ",[269,371,374],{"href":372,"rel":373},"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fcanvas_extjs",[283],"Canvas ExtJS"," when the theme is installed. The component index is read from the theme's bundled build output.",[377,378,379],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--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);}",{"title":301,"searchDepth":381,"depth":381,"links":382},2,[383,384],{"id":234,"depth":381,"text":235},{"id":275,"depth":381,"text":276,"children":385},[386,388,389],{"id":323,"depth":387,"text":324},3,{"id":337,"depth":387,"text":338},{"id":365,"depth":387,"text":366},"md",null,{},true,{"title":154,"description":301},"DcMVhLCMy0unRuWPn_3YPMSnV2-Ue67xRWuUMuAzRMo",[397,399],{"title":150,"path":151,"stem":152,"description":398,"children":-1},"Lupus Decoupled Drupal supports submitting Drupal forms via the decoupled frontend, as documented under Advanced Topics - Drupal Forms.\nIn order to enable submitting another Drupal form on the frontend, a custom-elements enabled form processing route must be added. This is\ndone easily by:",{"title":164,"path":165,"stem":166,"description":400,"children":-1},"Nuxt is an open source framework under MIT license that makes web development simple and powerful.",1776084719420]