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