[{"data":1,"prerenderedAt":2397},["ShallowReactive",2],{"navigation":3,"\u002Fnuxt-module\u002Fauthentication":358,"\u002Fnuxt-module\u002Fauthentication-surround":2392},[4,14,36,69,140,341],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","1.getting-started\u002F1.index",[9,10],{"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,"children":18,"page":35},"Guides","\u002Fguides","2.guides",[19,23,27,31],{"title":20,"path":21,"stem":22},"Your First Layout","\u002Fguides\u002Fyour-first-layout","2.guides\u002F1.your-first-layout",{"title":24,"path":25,"stem":26},"Your First Page Template","\u002Fguides\u002Fyour-first-page-template","2.guides\u002F2.your-first-page-template",{"title":28,"path":29,"stem":30},"Your First Component","\u002Fguides\u002Fyour-first-component","2.guides\u002F3.your-first-component",{"title":32,"path":33,"stem":34},"Alternative UI Variants","\u002Fguides\u002Falternative-ui-variants","2.guides\u002F4.alternative-ui-variants",false,{"title":37,"path":38,"stem":39,"children":40,"page":35},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[41,45,49,53,57,61,65],{"title":42,"path":43,"stem":44},"How It All Works","\u002Fcore-concepts\u002Farchitecture","3.core-concepts\u002F1.architecture",{"title":46,"path":47,"stem":48},"The Data Model","\u002Fcore-concepts\u002Fthe-data-model","3.core-concepts\u002F2.the-data-model",{"title":50,"path":51,"stem":52},"Layouts & Pages","\u002Fcore-concepts\u002Flayouts-and-pages","3.core-concepts\u002F3.layouts-and-pages",{"title":54,"path":55,"stem":56},"Dynamic Pages","\u002Fcore-concepts\u002Fdynamic-pages","3.core-concepts\u002F4.dynamic-pages",{"title":58,"path":59,"stem":60},"Components","\u002Fcore-concepts\u002Fcomponents","3.core-concepts\u002F5.components",{"title":62,"path":63,"stem":64},"Draft & Publish Workflow","\u002Fcore-concepts\u002Fdraft-and-publish","3.core-concepts\u002F6.draft-and-publish",{"title":66,"path":67,"stem":68},"The Admin Panel","\u002Fcore-concepts\u002Fadmin-panel","3.core-concepts\u002F7.admin-panel",{"title":70,"path":71,"stem":72,"children":73,"page":35},"Api","\u002Fapi","4.api",[74,78,116,120,124,128,132,136],{"title":75,"path":76,"stem":77},"Bundle Setup","\u002Fapi\u002Fbundle-setup","4.api\u002F1.bundle-setup",{"title":58,"path":79,"stem":80,"children":81,"page":35},"\u002Fapi\u002Fcomponents","4.api\u002F2.components",[82,86,103],{"title":83,"path":84,"stem":85},"Creating Components","\u002Fapi\u002Fcomponents\u002Fcreating-components","4.api\u002F2.components\u002F1.creating-components",{"title":87,"path":88,"stem":89,"children":90,"page":35},"Annotations","\u002Fapi\u002Fcomponents\u002Fannotations","4.api\u002F2.components\u002F2.annotations",[91,95,99],{"title":92,"path":93,"stem":94},"Publishable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fpublishable","4.api\u002F2.components\u002F2.annotations\u002F1.publishable",{"title":96,"path":97,"stem":98},"Uploadable","\u002Fapi\u002Fcomponents\u002Fannotations\u002Fuploadable","4.api\u002F2.components\u002F2.annotations\u002F2.uploadable",{"title":100,"path":101,"stem":102},"Timestamped","\u002Fapi\u002Fcomponents\u002Fannotations\u002Ftimestamped","4.api\u002F2.components\u002F2.annotations\u002F3.timestamped",{"title":104,"path":105,"stem":106,"children":107,"page":35},"Built Ins","\u002Fapi\u002Fcomponents\u002Fbuilt-ins","4.api\u002F2.components\u002F3.built-ins",[108,112],{"title":109,"path":110,"stem":111},"Collection Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fcollection-component","4.api\u002F2.components\u002F3.built-ins\u002F1.collection-component",{"title":113,"path":114,"stem":115},"Form Component","\u002Fapi\u002Fcomponents\u002Fbuilt-ins\u002Fform-component","4.api\u002F2.components\u002F3.built-ins\u002F2.form-component",{"title":117,"path":118,"stem":119},"Dynamic & Nested Pages","\u002Fapi\u002Fdynamic-pages","4.api\u002F3.dynamic-pages",{"title":121,"path":122,"stem":123},"Users & Security","\u002Fapi\u002Fusers-and-security","4.api\u002F4.users-and-security",{"title":125,"path":126,"stem":127},"Data Fixtures","\u002Fapi\u002Fdata-fixtures","4.api\u002F5.data-fixtures",{"title":129,"path":130,"stem":131},"Configuration Reference","\u002Fapi\u002Fconfiguration","4.api\u002F6.configuration",{"title":133,"path":134,"stem":135},"Console Commands","\u002Fapi\u002Fconsole-commands","4.api\u002F7.console-commands",{"title":137,"path":138,"stem":139},"Debugging & Profiler","\u002Fapi\u002Fdebugging","4.api\u002F8.debugging",{"title":141,"path":142,"stem":143,"children":144,"page":35},"Nuxt Module","\u002Fnuxt-module","5.nuxt-module",[145,149,162,182,207,211,295,320,324],{"title":146,"path":147,"stem":148},"Module Setup","\u002Fnuxt-module\u002Fmodule-setup","5.nuxt-module\u002F1.module-setup",{"title":150,"path":151,"stem":152,"children":153,"page":35},"Configuration","\u002Fnuxt-module\u002Fconfiguration","5.nuxt-module\u002F2.configuration",[154,158],{"title":155,"path":156,"stem":157},"Nuxt Config","\u002Fnuxt-module\u002Fconfiguration\u002Fnuxt-config","5.nuxt-module\u002F2.configuration\u002F1.nuxt-config",{"title":159,"path":160,"stem":161},"Site Config & SEO","\u002Fnuxt-module\u002Fconfiguration\u002Fsite-config-and-seo","5.nuxt-module\u002F2.configuration\u002F2.site-config-and-seo",{"title":163,"path":164,"stem":165,"children":166,"page":35},"Building Your Ui","\u002Fnuxt-module\u002Fbuilding-your-ui","5.nuxt-module\u002F3.building-your-ui",[167,171,175,178],{"title":168,"path":169,"stem":170},"Layouts","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-layouts","5.nuxt-module\u002F3.building-your-ui\u002F1.creating-layouts",{"title":172,"path":173,"stem":174},"Page Templates","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-page-templates","5.nuxt-module\u002F3.building-your-ui\u002F2.creating-page-templates",{"title":83,"path":176,"stem":177},"\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcreating-components","5.nuxt-module\u002F3.building-your-ui\u002F3.creating-components",{"title":179,"path":180,"stem":181},"CLI Generator","\u002Fnuxt-module\u002Fbuilding-your-ui\u002Fcwa-cli","5.nuxt-module\u002F3.building-your-ui\u002F4.cwa-cli",{"title":183,"path":184,"stem":185,"children":186,"page":35},"Cwa Components","\u002Fnuxt-module\u002Fcwa-components","5.nuxt-module\u002F4.cwa-components",[187,191,195,199,203],{"title":188,"path":189,"stem":190},"\u003CCwaComponentGroup \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-component-group","5.nuxt-module\u002F4.cwa-components\u002F1.cwa-component-group",{"title":192,"path":193,"stem":194},"\u003CCwaPage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-page","5.nuxt-module\u002F4.cwa-components\u002F2.cwa-page",{"title":196,"path":197,"stem":198},"\u003CCwaLink \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-link","5.nuxt-module\u002F4.cwa-components\u002F3.cwa-link",{"title":200,"path":201,"stem":202},"\u003CCwaImage \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-image","5.nuxt-module\u002F4.cwa-components\u002F4.cwa-image",{"title":204,"path":205,"stem":206},"\u003CCwaDefaultLayout \u002F>","\u002Fnuxt-module\u002Fcwa-components\u002Fcwa-default-layout","5.nuxt-module\u002F4.cwa-components\u002F5.cwa-default-layout",{"title":208,"path":209,"stem":210},"The useCwa() API","\u002Fnuxt-module\u002Fcwa-api","5.nuxt-module\u002F5.cwa-api",{"title":212,"path":213,"stem":214,"children":215,"page":35},"Composables","\u002Fnuxt-module\u002Fcomposables","5.nuxt-module\u002F6.composables",[216,224,261,278],{"title":217,"path":218,"stem":219,"children":220,"page":35},"Layout","\u002Fnuxt-module\u002Fcomposables\u002Flayout","5.nuxt-module\u002F6.composables\u002F0.layout",[221],{"title":217,"path":222,"stem":223},"\u002Fnuxt-module\u002Fcomposables\u002Flayout\u002Fuse-cwa-layout","5.nuxt-module\u002F6.composables\u002F0.layout\u002F1.use-cwa-layout",{"title":225,"path":226,"stem":227,"children":228,"page":35},"Component","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent","5.nuxt-module\u002F6.composables\u002F1.component",[229,233,237,241,245,249,253,257],{"title":230,"path":231,"stem":232},"Component (recommended)","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-component","5.nuxt-module\u002F6.composables\u002F1.component\u002F0.use-cwa-component",{"title":234,"path":235,"stem":236},"Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F1.use-cwa-resource",{"title":238,"path":239,"stem":240},"Collection Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-collection-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F2.use-cwa-collection-resource",{"title":242,"path":243,"stem":244},"Image Resource","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-image-resource","5.nuxt-module\u002F6.composables\u002F1.component\u002F3.use-cwa-image-resource",{"title":246,"path":247,"stem":248},"Form","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form","5.nuxt-module\u002F6.composables\u002F1.component\u002F4.use-cwa-form",{"title":250,"path":251,"stem":252},"Form Input","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-input","5.nuxt-module\u002F6.composables\u002F1.component\u002F5.use-cwa-form-input",{"title":254,"path":255,"stem":256},"Form Repeated","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-repeated","5.nuxt-module\u002F6.composables\u002F1.component\u002F6.use-cwa-form-repeated",{"title":258,"path":259,"stem":260},"Form Collection","\u002Fnuxt-module\u002Fcomposables\u002Fcomponent\u002Fuse-cwa-form-collection","5.nuxt-module\u002F6.composables\u002F1.component\u002F7.use-cwa-form-collection",{"title":262,"path":263,"stem":264,"children":265,"page":35},"Admin Manager","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager","5.nuxt-module\u002F6.composables\u002F2.admin-manager",[266,270,274],{"title":267,"path":268,"stem":269},"Manager Tab","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-manager-tab","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F1.use-cwa-resource-manager-tab",{"title":271,"path":272,"stem":273},"Resource Model","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-model","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F2.use-cwa-resource-model",{"title":275,"path":276,"stem":277},"Resource Upload","\u002Fnuxt-module\u002Fcomposables\u002Fadmin-manager\u002Fuse-cwa-resource-upload","5.nuxt-module\u002F6.composables\u002F2.admin-manager\u002F3.use-cwa-resource-upload",{"title":279,"path":280,"stem":281,"children":282,"page":35},"Utilities","\u002Fnuxt-module\u002Fcomposables\u002Futilities","5.nuxt-module\u002F6.composables\u002F3.utilities",[283,287,291],{"title":284,"path":285,"stem":286},"Resource Endpoint","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-endpoint","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F1.use-cwa-resource-endpoint",{"title":288,"path":289,"stem":290},"Query Model","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-query-bound-model","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F2.use-query-bound-model",{"title":292,"path":293,"stem":294},"Resource Route","\u002Fnuxt-module\u002Fcomposables\u002Futilities\u002Fuse-cwa-resource-route","5.nuxt-module\u002F6.composables\u002F3.utilities\u002F3.use-cwa-resource-route",{"title":296,"path":297,"stem":298,"children":299,"page":35},"Component Helpers","\u002Fnuxt-module\u002Fcomponent-helpers","5.nuxt-module\u002F7.component-helpers",[300,304,308,312,316],{"title":301,"path":302,"stem":303},"Images & Media","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fimages-and-uploads","5.nuxt-module\u002F7.component-helpers\u002F1.images-and-uploads",{"title":305,"path":306,"stem":307},"Collections & Pagination","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fcollections-and-pagination","5.nuxt-module\u002F7.component-helpers\u002F2.collections-and-pagination",{"title":309,"path":310,"stem":311},"HTML Content","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fhtml-content","5.nuxt-module\u002F7.component-helpers\u002F3.html-content",{"title":313,"path":314,"stem":315},"Real-Time Updates","\u002Fnuxt-module\u002Fcomponent-helpers\u002Freal-time-updates","5.nuxt-module\u002F7.component-helpers\u002F4.real-time-updates",{"title":317,"path":318,"stem":319},"Forms","\u002Fnuxt-module\u002Fcomponent-helpers\u002Fforms","5.nuxt-module\u002F7.component-helpers\u002F5.forms",{"title":321,"path":322,"stem":323},"Authentication","\u002Fnuxt-module\u002Fauthentication","5.nuxt-module\u002F8.authentication",{"title":325,"path":326,"stem":327,"children":328,"page":35},"Cwa Layer","\u002Fnuxt-module\u002Fcwa-layer","5.nuxt-module\u002F9.cwa-layer",[329,333,337],{"title":330,"path":331,"stem":332},"Overview","\u002Fnuxt-module\u002Fcwa-layer\u002Foverview","5.nuxt-module\u002F9.cwa-layer\u002F1.overview",{"title":334,"path":335,"stem":336},"Auth Pages","\u002Fnuxt-module\u002Fcwa-layer\u002Fauth-pages","5.nuxt-module\u002F9.cwa-layer\u002F2.auth-pages",{"title":338,"path":339,"stem":340},"Admin Panel","\u002Fnuxt-module\u002Fcwa-layer\u002Fadmin-panel","5.nuxt-module\u002F9.cwa-layer\u002F3.admin-panel",{"title":342,"path":343,"stem":344,"children":345,"page":35},"Deployment","\u002Fdeployment","6.deployment",[346,350,354],{"title":347,"path":348,"stem":349},"Docker","\u002Fdeployment\u002Fdocker","6.deployment\u002F1.docker",{"title":351,"path":352,"stem":353},"Kubernetes & Helm","\u002Fdeployment\u002Fkubernetes","6.deployment\u002F2.kubernetes",{"title":355,"path":356,"stem":357},"CI\u002FCD","\u002Fdeployment\u002Fci-cd","6.deployment\u002F3.ci-cd",{"id":359,"title":321,"badge":360,"body":363,"description":2386,"extension":2387,"links":2388,"meta":2389,"navigation":500,"path":322,"seo":2390,"stem":323,"__hash__":2391},"docs\u002F5.nuxt-module\u002F8.authentication.md",{"label":361,"color":362},"Draft","amber",{"type":364,"value":365,"toc":2374},"minimark",[366,375,380,387,457,461,648,654,692,696,846,850,857,940,1004,1008,1153,1157,1327,1331,1337,1371,1377,1380,1408,1412,1450,1454,1461,1870,1877,1881,1892,2370],[367,368,369,370,374],"p",{},"The CWA Nuxt module wires authentication into your app automatically. The API sets HttpOnly JWT cookies on login; the module reads auth state from those cookies and exposes everything through ",[371,372,373],"code",{},"$cwa.auth",".",[376,377,379],"h2",{"id":378},"pages-provided-automatically","Pages Provided Automatically",[367,381,382,383,386],{},"You don't need to create these — the module ships them. Override any by creating the same path in ",[371,384,385],{},"app\u002Fpages\u002F",":",[388,389,390,403],"table",{},[391,392,393],"thead",{},[394,395,396,400],"tr",{},[397,398,399],"th",{},"Path",[397,401,402],{},"Purpose",[404,405,406,417,427,437,447],"tbody",{},[394,407,408,414],{},[409,410,411],"td",{},[371,412,413],{},"\u002Flogin",[409,415,416],{},"Email + password login form",[394,418,419,424],{},[409,420,421],{},[371,422,423],{},"\u002Fforgot-password",[409,425,426],{},"Request a password reset email",[394,428,429,434],{},[409,430,431],{},[371,432,433],{},"\u002Freset-password\u002F[username]\u002F[token]",[409,435,436],{},"Set a new password from an email link",[394,438,439,444],{},[409,440,441],{},[371,442,443],{},"\u002Fverify-email\u002F[username]\u002F[token]",[409,445,446],{},"Verify email address on registration",[394,448,449,454],{},[409,450,451],{},[371,452,453],{},"\u002Fconfirm-new-email\u002F[username]\u002F[newEmail]\u002F[token]",[409,455,456],{},"Confirm email address change",[376,458,460],{"id":459},"reading-auth-state","Reading Auth State",[462,463,468],"pre",{"className":464,"code":465,"language":466,"meta":467,"style":467},"language-ts shiki shiki-themes github-light github-dark material-theme-palenight","const cwa = useCwa()\n\ncwa.auth.signedIn.value         \u002F\u002F boolean\ncwa.auth.isAdmin.value          \u002F\u002F boolean — ROLE_ADMIN or higher\ncwa.auth.user.value             \u002F\u002F { id, username, emailAddress, roles, ... } or undefined\ncwa.auth.roles.value            \u002F\u002F string[]\ncwa.auth.hasRole('ROLE_EDITOR') \u002F\u002F boolean\ncwa.auth.status.value           \u002F\u002F 0=SIGNED_OUT, 1=LOADING, 2=SIGNED_IN (CwaAuthStatus enum)\n","ts","",[371,469,470,495,502,528,550,572,594,626],{"__ignoreMap":467},[471,472,475,479,483,487,491],"span",{"class":473,"line":474},"line",1,[471,476,478],{"class":477},"swB56","const",[471,480,482],{"class":481},"sc2zw"," cwa",[471,484,486],{"class":485},"sVlFx"," =",[471,488,490],{"class":489},"sKpYG"," useCwa",[471,492,494],{"class":493},"sPB8G","()\n",[471,496,498],{"class":473,"line":497},2,[471,499,501],{"emptyLinePlaceholder":500},true,"\n",[471,503,505,508,511,514,516,519,521,524],{"class":473,"line":504},3,[471,506,507],{"class":493},"cwa",[471,509,374],{"class":510},"sOvfz",[471,512,513],{"class":493},"auth",[471,515,374],{"class":510},[471,517,518],{"class":493},"signedIn",[471,520,374],{"class":510},[471,522,523],{"class":493},"value         ",[471,525,527],{"class":526},"sTBSN","\u002F\u002F boolean\n",[471,529,531,533,535,537,539,542,544,547],{"class":473,"line":530},4,[471,532,507],{"class":493},[471,534,374],{"class":510},[471,536,513],{"class":493},[471,538,374],{"class":510},[471,540,541],{"class":493},"isAdmin",[471,543,374],{"class":510},[471,545,546],{"class":493},"value          ",[471,548,549],{"class":526},"\u002F\u002F boolean — ROLE_ADMIN or higher\n",[471,551,553,555,557,559,561,564,566,569],{"class":473,"line":552},5,[471,554,507],{"class":493},[471,556,374],{"class":510},[471,558,513],{"class":493},[471,560,374],{"class":510},[471,562,563],{"class":493},"user",[471,565,374],{"class":510},[471,567,568],{"class":493},"value             ",[471,570,571],{"class":526},"\u002F\u002F { id, username, emailAddress, roles, ... } or undefined\n",[471,573,575,577,579,581,583,586,588,591],{"class":473,"line":574},6,[471,576,507],{"class":493},[471,578,374],{"class":510},[471,580,513],{"class":493},[471,582,374],{"class":510},[471,584,585],{"class":493},"roles",[471,587,374],{"class":510},[471,589,590],{"class":493},"value            ",[471,592,593],{"class":526},"\u002F\u002F string[]\n",[471,595,597,599,601,603,605,608,611,615,619,621,624],{"class":473,"line":596},7,[471,598,507],{"class":493},[471,600,374],{"class":510},[471,602,513],{"class":493},[471,604,374],{"class":510},[471,606,607],{"class":489},"hasRole",[471,609,610],{"class":493},"(",[471,612,614],{"class":613},"seSrl","'",[471,616,618],{"class":617},"sLL54","ROLE_EDITOR",[471,620,614],{"class":613},[471,622,623],{"class":493},") ",[471,625,527],{"class":526},[471,627,629,631,633,635,637,640,642,645],{"class":473,"line":628},8,[471,630,507],{"class":493},[471,632,374],{"class":510},[471,634,513],{"class":493},[471,636,374],{"class":510},[471,638,639],{"class":493},"status",[471,641,374],{"class":510},[471,643,644],{"class":493},"value           ",[471,646,647],{"class":526},"\u002F\u002F 0=SIGNED_OUT, 1=LOADING, 2=SIGNED_IN (CwaAuthStatus enum)\n",[367,649,650,651,386],{},"Auth state is only available after client-side hydration. Always wrap auth-dependent UI in ",[371,652,653],{},"\u003CClientOnly>",[462,655,659],{"className":656,"code":657,"language":658,"meta":467,"style":467},"language-vue shiki shiki-themes github-light github-dark material-theme-palenight","\u003CClientOnly>\n    \u003CUserMenu v-if=\"$cwa.auth.signedIn.value\" \u002F>\n    \u003CNuxtLink v-else to=\"\u002Flogin\">Sign in\u003C\u002FNuxtLink>\n\u003C\u002FClientOnly>\n","vue",[371,660,661,673,678,683],{"__ignoreMap":467},[471,662,663,666,670],{"class":473,"line":474},[471,664,665],{"class":510},"\u003C",[471,667,669],{"class":668},"s-h7I","ClientOnly",[471,671,672],{"class":510},">\n",[471,674,675],{"class":473,"line":497},[471,676,677],{"class":493},"    \u003CUserMenu v-if=\"$cwa.auth.signedIn.value\" \u002F>\n",[471,679,680],{"class":473,"line":504},[471,681,682],{"class":493},"    \u003CNuxtLink v-else to=\"\u002Flogin\">Sign in\u003C\u002FNuxtLink>\n",[471,684,685,688,690],{"class":473,"line":530},[471,686,687],{"class":510},"\u003C\u002F",[471,689,669],{"class":668},[471,691,672],{"class":510},[376,693,695],{"id":694},"signing-in-programmatically","Signing In Programmatically",[462,697,699],{"className":464,"code":698,"language":466,"meta":467,"style":467},"const result = await cwa.auth.signIn({ username: 'alice@example.com', password: 'secret' })\n\nif (result instanceof FetchError) {\n    \u002F\u002F result.statusCode === 401 → invalid credentials\n    error.value = 'Invalid email or password'\n} else {\n    navigateTo('\u002F')\n}\n",[371,700,701,765,769,789,794,814,825,841],{"__ignoreMap":467},[471,702,703,705,708,710,714,716,718,720,722,725,727,730,734,736,739,742,744,747,750,752,754,757,759,762],{"class":473,"line":474},[471,704,478],{"class":477},[471,706,707],{"class":481}," result",[471,709,486],{"class":485},[471,711,713],{"class":712},"sm4w6"," await",[471,715,482],{"class":493},[471,717,374],{"class":510},[471,719,513],{"class":493},[471,721,374],{"class":510},[471,723,724],{"class":489},"signIn",[471,726,610],{"class":493},[471,728,729],{"class":510},"{",[471,731,733],{"class":732},"sDHlG"," username",[471,735,386],{"class":510},[471,737,738],{"class":613}," '",[471,740,741],{"class":617},"alice@example.com",[471,743,614],{"class":613},[471,745,746],{"class":510},",",[471,748,749],{"class":732}," password",[471,751,386],{"class":510},[471,753,738],{"class":613},[471,755,756],{"class":617},"secret",[471,758,614],{"class":613},[471,760,761],{"class":510}," }",[471,763,764],{"class":493},")\n",[471,766,767],{"class":473,"line":497},[471,768,501],{"emptyLinePlaceholder":500},[471,770,771,774,777,780,784,786],{"class":473,"line":504},[471,772,773],{"class":712},"if",[471,775,776],{"class":493}," (result ",[471,778,779],{"class":485},"instanceof",[471,781,783],{"class":782},"sRCss"," FetchError",[471,785,623],{"class":493},[471,787,788],{"class":510},"{\n",[471,790,791],{"class":473,"line":530},[471,792,793],{"class":526},"    \u002F\u002F result.statusCode === 401 → invalid credentials\n",[471,795,796,799,801,804,806,808,811],{"class":473,"line":552},[471,797,798],{"class":493},"    error",[471,800,374],{"class":510},[471,802,803],{"class":493},"value",[471,805,486],{"class":485},[471,807,738],{"class":613},[471,809,810],{"class":617},"Invalid email or password",[471,812,813],{"class":613},"'\n",[471,815,816,819,822],{"class":473,"line":574},[471,817,818],{"class":510},"}",[471,820,821],{"class":712}," else",[471,823,824],{"class":510}," {\n",[471,826,827,830,832,834,837,839],{"class":473,"line":596},[471,828,829],{"class":489},"    navigateTo",[471,831,610],{"class":732},[471,833,614],{"class":613},[471,835,836],{"class":617},"\u002F",[471,838,614],{"class":613},[471,840,764],{"class":732},[471,842,843],{"class":473,"line":628},[471,844,845],{"class":510},"}\n",[376,847,849],{"id":848},"using-the-login-composable","Using the Login Composable",[367,851,852,853,856],{},"For custom login forms, ",[371,854,855],{},"useLogin"," wraps the full login flow:",[462,858,860],{"className":464,"code":859,"language":466,"meta":467,"style":467},"import { useLogin } from '#imports'\n\nconst { model, submit, loading, error } = useLogin()\n\n\u002F\u002F model.username and model.password are reactive\n\u002F\u002F submit() calls signIn and redirects on success\n\u002F\u002F error.value is the error message string, or null\n",[371,861,862,885,889,921,925,930,935],{"__ignoreMap":467},[471,863,864,867,870,873,875,878,880,883],{"class":473,"line":474},[471,865,866],{"class":712},"import",[471,868,869],{"class":510}," {",[471,871,872],{"class":493}," useLogin",[471,874,761],{"class":510},[471,876,877],{"class":712}," from",[471,879,738],{"class":613},[471,881,882],{"class":617},"#imports",[471,884,813],{"class":613},[471,886,887],{"class":473,"line":497},[471,888,501],{"emptyLinePlaceholder":500},[471,890,891,893,895,898,900,903,905,908,910,913,915,917,919],{"class":473,"line":504},[471,892,478],{"class":477},[471,894,869],{"class":510},[471,896,897],{"class":481}," model",[471,899,746],{"class":510},[471,901,902],{"class":481}," submit",[471,904,746],{"class":510},[471,906,907],{"class":481}," loading",[471,909,746],{"class":510},[471,911,912],{"class":481}," error",[471,914,761],{"class":510},[471,916,486],{"class":485},[471,918,872],{"class":489},[471,920,494],{"class":493},[471,922,923],{"class":473,"line":530},[471,924,501],{"emptyLinePlaceholder":500},[471,926,927],{"class":473,"line":552},[471,928,929],{"class":526},"\u002F\u002F model.username and model.password are reactive\n",[471,931,932],{"class":473,"line":574},[471,933,934],{"class":526},"\u002F\u002F submit() calls signIn and redirects on success\n",[471,936,937],{"class":473,"line":596},[471,938,939],{"class":526},"\u002F\u002F error.value is the error message string, or null\n",[462,941,943],{"className":656,"code":942,"language":658,"meta":467,"style":467},"\u003Cform @submit.prevent=\"submit\">\n    \u003Cinput v-model=\"model.username\" type=\"email\" placeholder=\"Email\" \u002F>\n    \u003Cinput v-model=\"model.password\" type=\"password\" placeholder=\"Password\" \u002F>\n    \u003Cp v-if=\"error\" class=\"text-red-500\">{{ error }}\u003C\u002Fp>\n    \u003Cbutton :disabled=\"loading\" type=\"submit\">Sign in\u003C\u002Fbutton>\n\u003C\u002Fform>\n",[371,944,945,976,981,986,991,996],{"__ignoreMap":467},[471,946,947,949,952,955,959,961,964,967,970,972,974],{"class":473,"line":474},[471,948,665],{"class":510},[471,950,951],{"class":668},"form",[471,953,954],{"class":510}," @",[471,956,958],{"class":957},"sGtlX","submit",[471,960,374],{"class":510},[471,962,963],{"class":957},"prevent",[471,965,966],{"class":510},"=",[471,968,969],{"class":613},"\"",[471,971,958],{"class":493},[471,973,969],{"class":613},[471,975,672],{"class":510},[471,977,978],{"class":473,"line":497},[471,979,980],{"class":493},"    \u003Cinput v-model=\"model.username\" type=\"email\" placeholder=\"Email\" \u002F>\n",[471,982,983],{"class":473,"line":504},[471,984,985],{"class":493},"    \u003Cinput v-model=\"model.password\" type=\"password\" placeholder=\"Password\" \u002F>\n",[471,987,988],{"class":473,"line":530},[471,989,990],{"class":493},"    \u003Cp v-if=\"error\" class=\"text-red-500\">{{ error }}\u003C\u002Fp>\n",[471,992,993],{"class":473,"line":552},[471,994,995],{"class":493},"    \u003Cbutton :disabled=\"loading\" type=\"submit\">Sign in\u003C\u002Fbutton>\n",[471,997,998,1000,1002],{"class":473,"line":574},[471,999,687],{"class":510},[471,1001,951],{"class":668},[471,1003,672],{"class":510},[376,1005,1007],{"id":1006},"password-reset","Password Reset",[462,1009,1011],{"className":464,"code":1010,"language":466,"meta":467,"style":467},"\u002F\u002F Step 1: request the reset email\nimport { useForgotPassword } from '#imports'\nconst { model, submit, loading, success, error } = useForgotPassword()\n\u002F\u002F model.username — the user's email or username\n\u002F\u002F submit() → POST \u002Fpassword\u002Freset\u002Frequest\u002F{username}\n\n\u002F\u002F Step 2: submit the new password (from the link parameters)\nimport { useResetPassword } from '#imports'\nconst { model, submit, loading, success, error } = useResetPassword()\n\u002F\u002F model.username, model.token, model.password, model.passwordConfirm\n\u002F\u002F submit() → PUT \u002Fpassword\u002Freset\u002F{username}\u002F{token}\n",[371,1012,1013,1018,1037,1070,1075,1080,1084,1089,1108,1141,1147],{"__ignoreMap":467},[471,1014,1015],{"class":473,"line":474},[471,1016,1017],{"class":526},"\u002F\u002F Step 1: request the reset email\n",[471,1019,1020,1022,1024,1027,1029,1031,1033,1035],{"class":473,"line":497},[471,1021,866],{"class":712},[471,1023,869],{"class":510},[471,1025,1026],{"class":493}," useForgotPassword",[471,1028,761],{"class":510},[471,1030,877],{"class":712},[471,1032,738],{"class":613},[471,1034,882],{"class":617},[471,1036,813],{"class":613},[471,1038,1039,1041,1043,1045,1047,1049,1051,1053,1055,1058,1060,1062,1064,1066,1068],{"class":473,"line":504},[471,1040,478],{"class":477},[471,1042,869],{"class":510},[471,1044,897],{"class":481},[471,1046,746],{"class":510},[471,1048,902],{"class":481},[471,1050,746],{"class":510},[471,1052,907],{"class":481},[471,1054,746],{"class":510},[471,1056,1057],{"class":481}," success",[471,1059,746],{"class":510},[471,1061,912],{"class":481},[471,1063,761],{"class":510},[471,1065,486],{"class":485},[471,1067,1026],{"class":489},[471,1069,494],{"class":493},[471,1071,1072],{"class":473,"line":530},[471,1073,1074],{"class":526},"\u002F\u002F model.username — the user's email or username\n",[471,1076,1077],{"class":473,"line":552},[471,1078,1079],{"class":526},"\u002F\u002F submit() → POST \u002Fpassword\u002Freset\u002Frequest\u002F{username}\n",[471,1081,1082],{"class":473,"line":574},[471,1083,501],{"emptyLinePlaceholder":500},[471,1085,1086],{"class":473,"line":596},[471,1087,1088],{"class":526},"\u002F\u002F Step 2: submit the new password (from the link parameters)\n",[471,1090,1091,1093,1095,1098,1100,1102,1104,1106],{"class":473,"line":628},[471,1092,866],{"class":712},[471,1094,869],{"class":510},[471,1096,1097],{"class":493}," useResetPassword",[471,1099,761],{"class":510},[471,1101,877],{"class":712},[471,1103,738],{"class":613},[471,1105,882],{"class":617},[471,1107,813],{"class":613},[471,1109,1111,1113,1115,1117,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139],{"class":473,"line":1110},9,[471,1112,478],{"class":477},[471,1114,869],{"class":510},[471,1116,897],{"class":481},[471,1118,746],{"class":510},[471,1120,902],{"class":481},[471,1122,746],{"class":510},[471,1124,907],{"class":481},[471,1126,746],{"class":510},[471,1128,1057],{"class":481},[471,1130,746],{"class":510},[471,1132,912],{"class":481},[471,1134,761],{"class":510},[471,1136,486],{"class":485},[471,1138,1097],{"class":489},[471,1140,494],{"class":493},[471,1142,1144],{"class":473,"line":1143},10,[471,1145,1146],{"class":526},"\u002F\u002F model.username, model.token, model.password, model.passwordConfirm\n",[471,1148,1150],{"class":473,"line":1149},11,[471,1151,1152],{"class":526},"\u002F\u002F submit() → PUT \u002Fpassword\u002Freset\u002F{username}\u002F{token}\n",[376,1154,1156],{"id":1155},"email-verification","Email Verification",[462,1158,1160],{"className":464,"code":1159,"language":466,"meta":467,"style":467},"\u002F\u002F Verify email (from the link)\nimport { useVerifyEmail } from '#imports'\nconst { verify, loading, success, error } = useVerifyEmail()\n\u002F\u002F Call on mount with username and token from route params\nonMounted(() => verify(route.params.username, route.params.token))\n\n\u002F\u002F Resend the verification email\nimport { useResendVerifyEmail } from '#imports'\nconst { resend, loading, success, error } = useResendVerifyEmail()\nresend(username)\n",[371,1161,1162,1167,1186,1215,1220,1262,1266,1271,1290,1319],{"__ignoreMap":467},[471,1163,1164],{"class":473,"line":474},[471,1165,1166],{"class":526},"\u002F\u002F Verify email (from the link)\n",[471,1168,1169,1171,1173,1176,1178,1180,1182,1184],{"class":473,"line":497},[471,1170,866],{"class":712},[471,1172,869],{"class":510},[471,1174,1175],{"class":493}," useVerifyEmail",[471,1177,761],{"class":510},[471,1179,877],{"class":712},[471,1181,738],{"class":613},[471,1183,882],{"class":617},[471,1185,813],{"class":613},[471,1187,1188,1190,1192,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213],{"class":473,"line":504},[471,1189,478],{"class":477},[471,1191,869],{"class":510},[471,1193,1194],{"class":481}," verify",[471,1196,746],{"class":510},[471,1198,907],{"class":481},[471,1200,746],{"class":510},[471,1202,1057],{"class":481},[471,1204,746],{"class":510},[471,1206,912],{"class":481},[471,1208,761],{"class":510},[471,1210,486],{"class":485},[471,1212,1175],{"class":489},[471,1214,494],{"class":493},[471,1216,1217],{"class":473,"line":530},[471,1218,1219],{"class":526},"\u002F\u002F Call on mount with username and token from route params\n",[471,1221,1222,1225,1227,1230,1233,1235,1238,1240,1243,1245,1248,1250,1253,1255,1257,1259],{"class":473,"line":552},[471,1223,1224],{"class":489},"onMounted",[471,1226,610],{"class":493},[471,1228,1229],{"class":510},"()",[471,1231,1232],{"class":477}," =>",[471,1234,1194],{"class":489},[471,1236,1237],{"class":493},"(route",[471,1239,374],{"class":510},[471,1241,1242],{"class":493},"params",[471,1244,374],{"class":510},[471,1246,1247],{"class":493},"username",[471,1249,746],{"class":510},[471,1251,1252],{"class":493}," route",[471,1254,374],{"class":510},[471,1256,1242],{"class":493},[471,1258,374],{"class":510},[471,1260,1261],{"class":493},"token))\n",[471,1263,1264],{"class":473,"line":574},[471,1265,501],{"emptyLinePlaceholder":500},[471,1267,1268],{"class":473,"line":596},[471,1269,1270],{"class":526},"\u002F\u002F Resend the verification email\n",[471,1272,1273,1275,1277,1280,1282,1284,1286,1288],{"class":473,"line":628},[471,1274,866],{"class":712},[471,1276,869],{"class":510},[471,1278,1279],{"class":493}," useResendVerifyEmail",[471,1281,761],{"class":510},[471,1283,877],{"class":712},[471,1285,738],{"class":613},[471,1287,882],{"class":617},[471,1289,813],{"class":613},[471,1291,1292,1294,1296,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317],{"class":473,"line":1110},[471,1293,478],{"class":477},[471,1295,869],{"class":510},[471,1297,1298],{"class":481}," resend",[471,1300,746],{"class":510},[471,1302,907],{"class":481},[471,1304,746],{"class":510},[471,1306,1057],{"class":481},[471,1308,746],{"class":510},[471,1310,912],{"class":481},[471,1312,761],{"class":510},[471,1314,486],{"class":485},[471,1316,1279],{"class":489},[471,1318,494],{"class":493},[471,1320,1321,1324],{"class":473,"line":1143},[471,1322,1323],{"class":489},"resend",[471,1325,1326],{"class":493},"(username)\n",[376,1328,1330],{"id":1329},"protecting-pages","Protecting Pages",[367,1332,1333,1334,1336],{},"The module provides a ",[371,1335,513],{}," middleware. Add it to any page that requires a signed-in user:",[462,1338,1340],{"className":464,"code":1339,"language":466,"meta":467,"style":467},"\u002F\u002F app\u002Fpages\u002Faccount.vue\ndefinePageMeta({ middleware: 'auth' })\n",[371,1341,1342,1347],{"__ignoreMap":467},[471,1343,1344],{"class":473,"line":474},[471,1345,1346],{"class":526},"\u002F\u002F app\u002Fpages\u002Faccount.vue\n",[471,1348,1349,1352,1354,1356,1359,1361,1363,1365,1367,1369],{"class":473,"line":497},[471,1350,1351],{"class":489},"definePageMeta",[471,1353,610],{"class":493},[471,1355,729],{"class":510},[471,1357,1358],{"class":732}," middleware",[471,1360,386],{"class":510},[471,1362,738],{"class":613},[471,1364,513],{"class":617},[471,1366,614],{"class":613},[471,1368,761],{"class":510},[471,1370,764],{"class":493},[367,1372,1373,1374,1376],{},"Unauthenticated users are redirected to ",[371,1375,413],{},". After login they are returned to the original page.",[367,1378,1379],{},"For admin-only areas:",[462,1381,1383],{"className":464,"code":1382,"language":466,"meta":467,"style":467},"definePageMeta({ middleware: 'admin' })\n",[371,1384,1385],{"__ignoreMap":467},[471,1386,1387,1389,1391,1393,1395,1397,1399,1402,1404,1406],{"class":473,"line":474},[471,1388,1351],{"class":489},[471,1390,610],{"class":493},[471,1392,729],{"class":510},[471,1394,1358],{"class":732},[471,1396,386],{"class":510},[471,1398,738],{"class":613},[471,1400,1401],{"class":617},"admin",[471,1403,614],{"class":613},[471,1405,761],{"class":510},[471,1407,764],{"class":493},[376,1409,1411],{"id":1410},"signing-out","Signing Out",[462,1413,1415],{"className":464,"code":1414,"language":466,"meta":467,"style":467},"await cwa.auth.signOut()\nnavigateTo('\u002Flogin')\n",[371,1416,1417,1435],{"__ignoreMap":467},[471,1418,1419,1422,1424,1426,1428,1430,1433],{"class":473,"line":474},[471,1420,1421],{"class":712},"await",[471,1423,482],{"class":493},[471,1425,374],{"class":510},[471,1427,513],{"class":493},[471,1429,374],{"class":510},[471,1431,1432],{"class":489},"signOut",[471,1434,494],{"class":493},[471,1436,1437,1440,1442,1444,1446,1448],{"class":473,"line":497},[471,1438,1439],{"class":489},"navigateTo",[471,1441,610],{"class":493},[471,1443,614],{"class":613},[471,1445,413],{"class":617},[471,1447,614],{"class":613},[471,1449,764],{"class":493},[376,1451,1453],{"id":1452},"user-registration","User Registration",[367,1455,1456,1457,1460],{},"There is no built-in ",[371,1458,1459],{},"\u002Fregister"," page. Build it yourself:",[462,1462,1464],{"className":656,"code":1463,"language":658,"meta":467,"style":467},"\u003Cscript setup lang=\"ts\">\nconst cwa = useCwa()\nconst form = reactive({ username: '', emailAddress: '', plainPassword: '' })\nconst loading = ref(false)\nconst error = ref\u003Cstring | null>(null)\n\nasync function register() {\n    loading.value = true\n    error.value = null\n    try {\n        await $fetch(`${cwa.apiUrlBase}\u002Fusers`, {\n            method: 'POST',\n            body: form,\n            credentials: 'include'\n        })\n        navigateTo('\u002Flogin?registered=1')\n    } catch (e: any) {\n        error.value = e?.data?.['hydra:description'] ?? 'Registration failed'\n    } finally {\n        loading.value = false\n    }\n}\n\u003C\u002Fscript>\n",[371,1465,1466,1489,1501,1546,1565,1598,1602,1617,1631,1644,1651,1683,1701,1713,1728,1736,1753,1779,1825,1835,1850,1856,1861],{"__ignoreMap":467},[471,1467,1468,1470,1473,1476,1479,1481,1483,1485,1487],{"class":473,"line":474},[471,1469,665],{"class":510},[471,1471,1472],{"class":668},"script",[471,1474,1475],{"class":957}," setup",[471,1477,1478],{"class":957}," lang",[471,1480,966],{"class":510},[471,1482,969],{"class":613},[471,1484,466],{"class":617},[471,1486,969],{"class":613},[471,1488,672],{"class":510},[471,1490,1491,1493,1495,1497,1499],{"class":473,"line":497},[471,1492,478],{"class":477},[471,1494,482],{"class":481},[471,1496,486],{"class":485},[471,1498,490],{"class":489},[471,1500,494],{"class":493},[471,1502,1503,1505,1508,1510,1513,1515,1517,1519,1521,1524,1526,1529,1531,1533,1535,1538,1540,1542,1544],{"class":473,"line":504},[471,1504,478],{"class":477},[471,1506,1507],{"class":481}," form",[471,1509,486],{"class":485},[471,1511,1512],{"class":489}," reactive",[471,1514,610],{"class":493},[471,1516,729],{"class":510},[471,1518,733],{"class":732},[471,1520,386],{"class":510},[471,1522,1523],{"class":613}," ''",[471,1525,746],{"class":510},[471,1527,1528],{"class":732}," emailAddress",[471,1530,386],{"class":510},[471,1532,1523],{"class":613},[471,1534,746],{"class":510},[471,1536,1537],{"class":732}," plainPassword",[471,1539,386],{"class":510},[471,1541,1523],{"class":613},[471,1543,761],{"class":510},[471,1545,764],{"class":493},[471,1547,1548,1550,1552,1554,1557,1559,1563],{"class":473,"line":530},[471,1549,478],{"class":477},[471,1551,907],{"class":481},[471,1553,486],{"class":485},[471,1555,1556],{"class":489}," ref",[471,1558,610],{"class":493},[471,1560,1562],{"class":1561},"swWMF","false",[471,1564,764],{"class":493},[471,1566,1567,1569,1571,1573,1575,1577,1581,1584,1587,1590,1592,1596],{"class":473,"line":552},[471,1568,478],{"class":477},[471,1570,912],{"class":481},[471,1572,486],{"class":485},[471,1574,1556],{"class":489},[471,1576,665],{"class":510},[471,1578,1580],{"class":1579},"sbW4m","string",[471,1582,1583],{"class":485}," |",[471,1585,1586],{"class":1579}," null",[471,1588,1589],{"class":510},">",[471,1591,610],{"class":493},[471,1593,1595],{"class":1594},"sBtbT","null",[471,1597,764],{"class":493},[471,1599,1600],{"class":473,"line":574},[471,1601,501],{"emptyLinePlaceholder":500},[471,1603,1604,1607,1610,1613,1615],{"class":473,"line":596},[471,1605,1606],{"class":477},"async",[471,1608,1609],{"class":477}," function",[471,1611,1612],{"class":489}," register",[471,1614,1229],{"class":510},[471,1616,824],{"class":510},[471,1618,1619,1622,1624,1626,1628],{"class":473,"line":628},[471,1620,1621],{"class":493},"    loading",[471,1623,374],{"class":510},[471,1625,803],{"class":493},[471,1627,486],{"class":485},[471,1629,1630],{"class":1561}," true\n",[471,1632,1633,1635,1637,1639,1641],{"class":473,"line":1110},[471,1634,798],{"class":493},[471,1636,374],{"class":510},[471,1638,803],{"class":493},[471,1640,486],{"class":485},[471,1642,1643],{"class":1594}," null\n",[471,1645,1646,1649],{"class":473,"line":1143},[471,1647,1648],{"class":712},"    try",[471,1650,824],{"class":510},[471,1652,1653,1656,1659,1661,1664,1666,1668,1671,1673,1676,1679,1681],{"class":473,"line":1149},[471,1654,1655],{"class":712},"        await",[471,1657,1658],{"class":489}," $fetch",[471,1660,610],{"class":732},[471,1662,1663],{"class":613},"`${",[471,1665,507],{"class":493},[471,1667,374],{"class":613},[471,1669,1670],{"class":493},"apiUrlBase",[471,1672,818],{"class":613},[471,1674,1675],{"class":617},"\u002Fusers",[471,1677,1678],{"class":613},"`",[471,1680,746],{"class":510},[471,1682,824],{"class":510},[471,1684,1686,1689,1691,1693,1696,1698],{"class":473,"line":1685},12,[471,1687,1688],{"class":732},"            method",[471,1690,386],{"class":510},[471,1692,738],{"class":613},[471,1694,1695],{"class":617},"POST",[471,1697,614],{"class":613},[471,1699,1700],{"class":510},",\n",[471,1702,1704,1707,1709,1711],{"class":473,"line":1703},13,[471,1705,1706],{"class":732},"            body",[471,1708,386],{"class":510},[471,1710,1507],{"class":493},[471,1712,1700],{"class":510},[471,1714,1716,1719,1721,1723,1726],{"class":473,"line":1715},14,[471,1717,1718],{"class":732},"            credentials",[471,1720,386],{"class":510},[471,1722,738],{"class":613},[471,1724,1725],{"class":617},"include",[471,1727,813],{"class":613},[471,1729,1731,1734],{"class":473,"line":1730},15,[471,1732,1733],{"class":510},"        }",[471,1735,764],{"class":732},[471,1737,1739,1742,1744,1746,1749,1751],{"class":473,"line":1738},16,[471,1740,1741],{"class":489},"        navigateTo",[471,1743,610],{"class":732},[471,1745,614],{"class":613},[471,1747,1748],{"class":617},"\u002Flogin?registered=1",[471,1750,614],{"class":613},[471,1752,764],{"class":732},[471,1754,1756,1759,1762,1765,1769,1771,1774,1777],{"class":473,"line":1755},17,[471,1757,1758],{"class":510},"    }",[471,1760,1761],{"class":712}," catch",[471,1763,1764],{"class":510}," (",[471,1766,1768],{"class":1767},"sNTR6","e",[471,1770,386],{"class":485},[471,1772,1773],{"class":1579}," any",[471,1775,1776],{"class":510},")",[471,1778,824],{"class":510},[471,1780,1782,1785,1787,1789,1791,1794,1797,1800,1802,1805,1807,1810,1812,1815,1818,1820,1823],{"class":473,"line":1781},18,[471,1783,1784],{"class":493},"        error",[471,1786,374],{"class":510},[471,1788,803],{"class":493},[471,1790,486],{"class":485},[471,1792,1793],{"class":493}," e",[471,1795,1796],{"class":510},"?.",[471,1798,1799],{"class":493},"data",[471,1801,1796],{"class":510},[471,1803,1804],{"class":732},"[",[471,1806,614],{"class":613},[471,1808,1809],{"class":617},"hydra:description",[471,1811,614],{"class":613},[471,1813,1814],{"class":732},"] ",[471,1816,1817],{"class":485},"??",[471,1819,738],{"class":613},[471,1821,1822],{"class":617},"Registration failed",[471,1824,813],{"class":613},[471,1826,1828,1830,1833],{"class":473,"line":1827},19,[471,1829,1758],{"class":510},[471,1831,1832],{"class":712}," finally",[471,1834,824],{"class":510},[471,1836,1838,1841,1843,1845,1847],{"class":473,"line":1837},20,[471,1839,1840],{"class":493},"        loading",[471,1842,374],{"class":510},[471,1844,803],{"class":493},[471,1846,486],{"class":485},[471,1848,1849],{"class":1561}," false\n",[471,1851,1853],{"class":473,"line":1852},21,[471,1854,1855],{"class":510},"    }\n",[471,1857,1859],{"class":473,"line":1858},22,[471,1860,845],{"class":510},[471,1862,1864,1866,1868],{"class":473,"line":1863},23,[471,1865,687],{"class":510},[471,1867,1472],{"class":668},[471,1869,672],{"class":510},[367,1871,1872,1873,1876],{},"After successful registration, the API sends a verification email automatically (if ",[371,1874,1875],{},"verify_on_register: true"," in the bundle config).",[376,1878,1880],{"id":1879},"customising-the-login-page","Customising the Login Page",[367,1882,1883,1884,1887,1888,1891],{},"Create ",[371,1885,1886],{},"app\u002Fpages\u002Flogin.vue"," — it takes precedence over the module's built-in page. Use ",[371,1889,1890],{},"useLogin()"," inside it to keep the same API wiring:",[462,1893,1895],{"className":656,"code":1894,"language":658,"meta":467,"style":467},"\u003C!-- app\u002Fpages\u002Flogin.vue -->\n\u003Ctemplate>\n    \u003Cdiv class=\"max-w-sm mx-auto mt-16\">\n        \u003Ch1 class=\"text-2xl font-bold mb-8\">Welcome back\u003C\u002Fh1>\n        \u003Cform @submit.prevent=\"submit\" class=\"space-y-4\">\n            \u003Cinput v-model=\"model.username\" type=\"email\" class=\"input w-full\" placeholder=\"Email\" \u002F>\n            \u003Cinput v-model=\"model.password\" type=\"password\" class=\"input w-full\" placeholder=\"Password\" \u002F>\n            \u003Cp v-if=\"error\" class=\"text-red-500 text-sm\">{{ error }}\u003C\u002Fp>\n            \u003Cbutton type=\"submit\" :disabled=\"loading\" class=\"btn-primary w-full\">\n                {{ loading ? 'Signing in...' : 'Sign in' }}\n            \u003C\u002Fbutton>\n        \u003C\u002Fform>\n        \u003CNuxtLink to=\"\u002Fforgot-password\" class=\"text-sm text-gray-500 mt-4 block\">\n            Forgot your password?\n        \u003C\u002FNuxtLink>\n    \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cscript setup lang=\"ts\">\nimport { useLogin } from '#imports'\ndefinePageMeta({ layout: false })  \u002F\u002F or use a minimal layout\nconst { model, submit, loading, error } = useLogin()\n\u003C\u002Fscript>\n",[371,1896,1897,1902,1911,1933,1963,1993,2051,2102,2142,2184,2189,2198,2207,2238,2243,2251,2260,2268,2272,2292,2310,2334,2362],{"__ignoreMap":467},[471,1898,1899],{"class":473,"line":474},[471,1900,1901],{"class":526},"\u003C!-- app\u002Fpages\u002Flogin.vue -->\n",[471,1903,1904,1906,1909],{"class":473,"line":497},[471,1905,665],{"class":510},[471,1907,1908],{"class":668},"template",[471,1910,672],{"class":510},[471,1912,1913,1916,1919,1922,1924,1926,1929,1931],{"class":473,"line":504},[471,1914,1915],{"class":510},"    \u003C",[471,1917,1918],{"class":668},"div",[471,1920,1921],{"class":957}," class",[471,1923,966],{"class":510},[471,1925,969],{"class":613},[471,1927,1928],{"class":617},"max-w-sm mx-auto mt-16",[471,1930,969],{"class":613},[471,1932,672],{"class":510},[471,1934,1935,1938,1941,1943,1945,1947,1950,1952,1954,1957,1959,1961],{"class":473,"line":530},[471,1936,1937],{"class":510},"        \u003C",[471,1939,1940],{"class":668},"h1",[471,1942,1921],{"class":957},[471,1944,966],{"class":510},[471,1946,969],{"class":613},[471,1948,1949],{"class":617},"text-2xl font-bold mb-8",[471,1951,969],{"class":613},[471,1953,1589],{"class":510},[471,1955,1956],{"class":493},"Welcome back",[471,1958,687],{"class":510},[471,1960,1940],{"class":668},[471,1962,672],{"class":510},[471,1964,1965,1967,1969,1972,1974,1976,1978,1980,1982,1984,1986,1989,1991],{"class":473,"line":552},[471,1966,1937],{"class":510},[471,1968,951],{"class":668},[471,1970,1971],{"class":957}," @submit.prevent",[471,1973,966],{"class":510},[471,1975,969],{"class":613},[471,1977,958],{"class":617},[471,1979,969],{"class":613},[471,1981,1921],{"class":957},[471,1983,966],{"class":510},[471,1985,969],{"class":613},[471,1987,1988],{"class":617},"space-y-4",[471,1990,969],{"class":613},[471,1992,672],{"class":510},[471,1994,1995,1998,2001,2004,2006,2008,2011,2013,2016,2018,2020,2023,2025,2027,2029,2031,2034,2036,2039,2041,2043,2046,2048],{"class":473,"line":574},[471,1996,1997],{"class":510},"            \u003C",[471,1999,2000],{"class":668},"input",[471,2002,2003],{"class":957}," v-model",[471,2005,966],{"class":510},[471,2007,969],{"class":613},[471,2009,2010],{"class":617},"model.username",[471,2012,969],{"class":613},[471,2014,2015],{"class":957}," type",[471,2017,966],{"class":510},[471,2019,969],{"class":613},[471,2021,2022],{"class":617},"email",[471,2024,969],{"class":613},[471,2026,1921],{"class":957},[471,2028,966],{"class":510},[471,2030,969],{"class":613},[471,2032,2033],{"class":617},"input w-full",[471,2035,969],{"class":613},[471,2037,2038],{"class":957}," placeholder",[471,2040,966],{"class":510},[471,2042,969],{"class":613},[471,2044,2045],{"class":617},"Email",[471,2047,969],{"class":613},[471,2049,2050],{"class":510}," \u002F>\n",[471,2052,2053,2055,2057,2059,2061,2063,2066,2068,2070,2072,2074,2077,2079,2081,2083,2085,2087,2089,2091,2093,2095,2098,2100],{"class":473,"line":596},[471,2054,1997],{"class":510},[471,2056,2000],{"class":668},[471,2058,2003],{"class":957},[471,2060,966],{"class":510},[471,2062,969],{"class":613},[471,2064,2065],{"class":617},"model.password",[471,2067,969],{"class":613},[471,2069,2015],{"class":957},[471,2071,966],{"class":510},[471,2073,969],{"class":613},[471,2075,2076],{"class":617},"password",[471,2078,969],{"class":613},[471,2080,1921],{"class":957},[471,2082,966],{"class":510},[471,2084,969],{"class":613},[471,2086,2033],{"class":617},[471,2088,969],{"class":613},[471,2090,2038],{"class":957},[471,2092,966],{"class":510},[471,2094,969],{"class":613},[471,2096,2097],{"class":617},"Password",[471,2099,969],{"class":613},[471,2101,2050],{"class":510},[471,2103,2104,2106,2108,2111,2113,2115,2118,2120,2122,2124,2126,2129,2131,2133,2136,2138,2140],{"class":473,"line":628},[471,2105,1997],{"class":510},[471,2107,367],{"class":668},[471,2109,2110],{"class":957}," v-if",[471,2112,966],{"class":510},[471,2114,969],{"class":613},[471,2116,2117],{"class":617},"error",[471,2119,969],{"class":613},[471,2121,1921],{"class":957},[471,2123,966],{"class":510},[471,2125,969],{"class":613},[471,2127,2128],{"class":617},"text-red-500 text-sm",[471,2130,969],{"class":613},[471,2132,1589],{"class":510},[471,2134,2135],{"class":493},"{{ error }}",[471,2137,687],{"class":510},[471,2139,367],{"class":668},[471,2141,672],{"class":510},[471,2143,2144,2146,2149,2151,2153,2155,2157,2159,2162,2164,2166,2169,2171,2173,2175,2177,2180,2182],{"class":473,"line":1110},[471,2145,1997],{"class":510},[471,2147,2148],{"class":668},"button",[471,2150,2015],{"class":957},[471,2152,966],{"class":510},[471,2154,969],{"class":613},[471,2156,958],{"class":617},[471,2158,969],{"class":613},[471,2160,2161],{"class":957}," :disabled",[471,2163,966],{"class":510},[471,2165,969],{"class":613},[471,2167,2168],{"class":617},"loading",[471,2170,969],{"class":613},[471,2172,1921],{"class":957},[471,2174,966],{"class":510},[471,2176,969],{"class":613},[471,2178,2179],{"class":617},"btn-primary w-full",[471,2181,969],{"class":613},[471,2183,672],{"class":510},[471,2185,2186],{"class":473,"line":1143},[471,2187,2188],{"class":493},"                {{ loading ? 'Signing in...' : 'Sign in' }}\n",[471,2190,2191,2194,2196],{"class":473,"line":1149},[471,2192,2193],{"class":510},"            \u003C\u002F",[471,2195,2148],{"class":668},[471,2197,672],{"class":510},[471,2199,2200,2203,2205],{"class":473,"line":1685},[471,2201,2202],{"class":510},"        \u003C\u002F",[471,2204,951],{"class":668},[471,2206,672],{"class":510},[471,2208,2209,2211,2214,2217,2219,2221,2223,2225,2227,2229,2231,2234,2236],{"class":473,"line":1703},[471,2210,1937],{"class":510},[471,2212,2213],{"class":668},"NuxtLink",[471,2215,2216],{"class":957}," to",[471,2218,966],{"class":510},[471,2220,969],{"class":613},[471,2222,423],{"class":617},[471,2224,969],{"class":613},[471,2226,1921],{"class":957},[471,2228,966],{"class":510},[471,2230,969],{"class":613},[471,2232,2233],{"class":617},"text-sm text-gray-500 mt-4 block",[471,2235,969],{"class":613},[471,2237,672],{"class":510},[471,2239,2240],{"class":473,"line":1715},[471,2241,2242],{"class":493},"            Forgot your password?\n",[471,2244,2245,2247,2249],{"class":473,"line":1730},[471,2246,2202],{"class":510},[471,2248,2213],{"class":668},[471,2250,672],{"class":510},[471,2252,2253,2256,2258],{"class":473,"line":1738},[471,2254,2255],{"class":510},"    \u003C\u002F",[471,2257,1918],{"class":668},[471,2259,672],{"class":510},[471,2261,2262,2264,2266],{"class":473,"line":1755},[471,2263,687],{"class":510},[471,2265,1908],{"class":668},[471,2267,672],{"class":510},[471,2269,2270],{"class":473,"line":1781},[471,2271,501],{"emptyLinePlaceholder":500},[471,2273,2274,2276,2278,2280,2282,2284,2286,2288,2290],{"class":473,"line":1827},[471,2275,665],{"class":510},[471,2277,1472],{"class":668},[471,2279,1475],{"class":957},[471,2281,1478],{"class":957},[471,2283,966],{"class":510},[471,2285,969],{"class":613},[471,2287,466],{"class":617},[471,2289,969],{"class":613},[471,2291,672],{"class":510},[471,2293,2294,2296,2298,2300,2302,2304,2306,2308],{"class":473,"line":1837},[471,2295,866],{"class":712},[471,2297,869],{"class":510},[471,2299,872],{"class":493},[471,2301,761],{"class":510},[471,2303,877],{"class":712},[471,2305,738],{"class":613},[471,2307,882],{"class":617},[471,2309,813],{"class":613},[471,2311,2312,2314,2316,2318,2321,2323,2326,2328,2331],{"class":473,"line":1852},[471,2313,1351],{"class":489},[471,2315,610],{"class":493},[471,2317,729],{"class":510},[471,2319,2320],{"class":732}," layout",[471,2322,386],{"class":510},[471,2324,2325],{"class":1561}," false",[471,2327,761],{"class":510},[471,2329,2330],{"class":493},")  ",[471,2332,2333],{"class":526},"\u002F\u002F or use a minimal layout\n",[471,2335,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360],{"class":473,"line":1858},[471,2337,478],{"class":477},[471,2339,869],{"class":510},[471,2341,897],{"class":481},[471,2343,746],{"class":510},[471,2345,902],{"class":481},[471,2347,746],{"class":510},[471,2349,907],{"class":481},[471,2351,746],{"class":510},[471,2353,912],{"class":481},[471,2355,761],{"class":510},[471,2357,486],{"class":485},[471,2359,872],{"class":489},[471,2361,494],{"class":493},[471,2363,2364,2366,2368],{"class":473,"line":1863},[471,2365,687],{"class":510},[471,2367,1472],{"class":668},[471,2369,672],{"class":510},[2371,2372,2373],"style",{},"html pre.shiki code .swB56, html code.shiki .swB56{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .sc2zw, html code.shiki .sc2zw{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sVlFx, html code.shiki .sVlFx{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#89DDFF}html pre.shiki code .sKpYG, html code.shiki .sKpYG{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .sPB8G, html code.shiki .sPB8G{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}html pre.shiki code .sOvfz, html code.shiki .sOvfz{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}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 .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 .s-h7I, html code.shiki .s-h7I{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#F07178}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 .sDHlG, html code.shiki .sDHlG{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#F07178}html pre.shiki code .sRCss, html code.shiki .sRCss{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .sGtlX, html code.shiki .sGtlX{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#C792EA}html pre.shiki code .swWMF, html code.shiki .swWMF{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FF9CAC}html pre.shiki code .sbW4m, html code.shiki .sbW4m{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}html pre.shiki code .sBtbT, html code.shiki .sBtbT{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#89DDFF}html pre.shiki code .sNTR6, html code.shiki .sNTR6{--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-default:#FFAB70;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":467,"searchDepth":497,"depth":497,"links":2375},[2376,2377,2378,2379,2380,2381,2382,2383,2384,2385],{"id":378,"depth":497,"text":379},{"id":459,"depth":497,"text":460},{"id":694,"depth":497,"text":695},{"id":848,"depth":497,"text":849},{"id":1006,"depth":497,"text":1007},{"id":1155,"depth":497,"text":1156},{"id":1329,"depth":497,"text":1330},{"id":1410,"depth":497,"text":1411},{"id":1452,"depth":497,"text":1453},{"id":1879,"depth":497,"text":1880},"The auto-provided auth pages, $cwa.auth state, protecting routes, and building a custom registration flow.","md",null,{},{"title":321,"description":2386},"pE2zN59BqXlDUKOZeyaVvRKNcp6Gpj99NX8IyWh8agk",[2393,2395],{"title":317,"path":318,"stem":319,"description":2394,"children":-1},"Build form components for Symfony Form types using CWA's form composables — covering every field type with Nuxt UI examples.",{"title":330,"path":331,"stem":332,"description":2396,"children":-1},"The CWA layer — what the module auto-provides, how to override it, and how to use its reusable components in your own pages.",1782512898226]