[{"data":1,"prerenderedAt":2834},["ShallowReactive",2],{"navigation_docs":3,"-modules-identity-account":587,"-modules-identity-account-surround":2829},[4,50,155,441,504],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":49},"Get Started","i-lucide-rocket","\u002Fget-started","1.get-started",[10,15,20,25,30,35,40,45],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fget-started\u002Fintroduction","1.get-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fget-started\u002Finstallation","1.get-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Project structure","\u002Fget-started\u002Fproject-structure","1.get-started\u002F3.project-structure","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Configuration","\u002Fget-started\u002Fconfiguration","1.get-started\u002F4.configuration","i-lucide-settings",{"title":31,"path":32,"stem":33,"icon":34},"Authentication","\u002Fget-started\u002Fauthentication","1.get-started\u002F5.authentication","i-lucide-lock",{"title":36,"path":37,"stem":38,"icon":39},"Adding modules","\u002Fget-started\u002Fadding-modules","1.get-started\u002F6.adding-modules","i-lucide-puzzle",{"title":41,"path":42,"stem":43,"icon":44},"Database","\u002Fget-started\u002Fdatabase","1.get-started\u002F7.database","i-lucide-database",{"title":46,"path":47,"stem":48,"icon":6},"Deployment","\u002Fget-started\u002Fdeployment","1.get-started\u002F8.deployment",false,{"title":51,"icon":52,"path":53,"stem":54,"children":55,"page":49},"Guide","i-lucide-book-open","\u002Fguide","2.guide",[56,90,115,125],{"title":57,"icon":49,"path":58,"stem":59,"children":60,"page":49},"Concepts","\u002Fguide\u002Fconcepts","2.guide\u002F1.concepts",[61,66,71,76,80,85],{"title":62,"path":63,"stem":64,"icon":65},"Architecture","\u002Fguide\u002Fconcepts\u002Farchitecture","2.guide\u002F1.concepts\u002F1.architecture","i-lucide-blocks",{"title":67,"path":68,"stem":69,"icon":70},"Access control","\u002Fguide\u002Fconcepts\u002Fauth-and-scopes","2.guide\u002F1.concepts\u002F2.auth-and-scopes","i-lucide-shield-check",{"title":72,"path":73,"stem":74,"icon":75},"Extension points","\u002Fguide\u002Fconcepts\u002Fextension-points","2.guide\u002F1.concepts\u002F3.extension-points","i-lucide-plug",{"title":77,"path":78,"stem":79,"icon":44},"Database extensions","\u002Fguide\u002Fconcepts\u002Fdatabase-extensions","2.guide\u002F1.concepts\u002F4.database-extensions",{"title":81,"path":82,"stem":83,"icon":84},"Identity","\u002Fguide\u002Fconcepts\u002Fidentity","2.guide\u002F1.concepts\u002F5.identity","i-lucide-fingerprint",{"title":86,"path":87,"stem":88,"icon":89},"Glossary","\u002Fguide\u002Fconcepts\u002Fglossary","2.guide\u002F1.concepts\u002F6.glossary","i-lucide-book-a",{"title":91,"icon":49,"path":92,"stem":93,"children":94,"page":49},"UX patterns","\u002Fguide\u002Fux-patterns","2.guide\u002F2.ux-patterns",[95,100,105,110],{"title":96,"path":97,"stem":98,"icon":99},"Layouts and navigation","\u002Fguide\u002Fux-patterns\u002Flayouts-and-navigation","2.guide\u002F2.ux-patterns\u002F1.layouts-and-navigation","i-lucide-layout-template",{"title":101,"path":102,"stem":103,"icon":104},"Pages","\u002Fguide\u002Fux-patterns\u002Fpages","2.guide\u002F2.ux-patterns\u002F2.pages","i-lucide-table",{"title":106,"path":107,"stem":108,"icon":109},"Forms and actions","\u002Fguide\u002Fux-patterns\u002Fforms-and-actions","2.guide\u002F2.ux-patterns\u002F3.forms-and-actions","i-lucide-square-pen",{"title":111,"path":112,"stem":113,"icon":114},"Text and formatting","\u002Fguide\u002Fux-patterns\u002Ftext-and-formatting","2.guide\u002F2.ux-patterns\u002F4.text-and-formatting","i-lucide-type",{"title":116,"icon":49,"path":117,"stem":118,"children":119,"page":49},"Best practices","\u002Fguide\u002Fbest-practices","2.guide\u002F3.best-practices",[120],{"title":121,"path":122,"stem":123,"icon":124},"HTTP routes","\u002Fguide\u002Fbest-practices\u002Fhttp-routes","2.guide\u002F3.best-practices\u002F1.http-routes","i-lucide-route",{"title":126,"icon":49,"path":127,"stem":128,"children":129,"page":49},"Going further","\u002Fguide\u002Fgoing-further","2.guide\u002F4.going-further",[130,135,140,145,150],{"title":131,"path":132,"stem":133,"icon":134},"Use your own OAuth server","\u002Fguide\u002Fgoing-further\u002Fown-oauth-server","2.guide\u002F4.going-further\u002F1.own-oauth-server","i-lucide-key-round",{"title":136,"path":137,"stem":138,"icon":139},"Create an OAuth application","\u002Fguide\u002Fgoing-further\u002Foauth-application","2.guide\u002F4.going-further\u002F2.oauth-application","i-lucide-app-window",{"title":141,"path":142,"stem":143,"icon":144},"Signing keys","\u002Fguide\u002Fgoing-further\u002Fsigning-keys","2.guide\u002F4.going-further\u002F3.signing-keys","i-lucide-key-square",{"title":146,"path":147,"stem":148,"icon":149},"Stripe setup","\u002Fguide\u002Fgoing-further\u002Fstripe-setup","2.guide\u002F4.going-further\u002F4.stripe-setup","i-lucide-credit-card",{"title":151,"path":152,"stem":153,"icon":154},"Migrate to the permission model","\u002Fguide\u002Fgoing-further\u002Fmigrate-access-control","2.guide\u002F4.going-further\u002F5.migrate-access-control","i-lucide-arrow-right-left",{"title":156,"icon":157,"path":158,"stem":159,"children":160},"Modules","i-lucide-boxes","\u002Fmodules","3.modules",[161,163,244,273,320,375],{"title":156,"path":158,"stem":162},"3.modules\u002Findex",{"title":81,"icon":49,"path":164,"stem":165,"children":166,"page":49},"\u002Fmodules\u002Fidentity","3.modules\u002F1.identity",[167,190,194,198,220,224,240],{"title":168,"path":169,"stem":170,"children":171},"Auth","\u002Fmodules\u002Fidentity\u002Fauth","3.modules\u002F1.identity\u002F1.auth\u002Findex",[172,174,178,182,186],{"title":173,"path":169,"stem":170},"Overview",{"title":175,"path":176,"stem":177},"Server API","\u002Fmodules\u002Fidentity\u002Fauth\u002Fserver","3.modules\u002F1.identity\u002F1.auth\u002F2.server",{"title":179,"path":180,"stem":181},"Reference","\u002Fmodules\u002Fidentity\u002Fauth\u002Freference","3.modules\u002F1.identity\u002F1.auth\u002F3.reference",{"title":183,"path":184,"stem":185},"Client mode","\u002Fmodules\u002Fidentity\u002Fauth\u002Fclient-mode","3.modules\u002F1.identity\u002F1.auth\u002F4.client-mode",{"title":187,"path":188,"stem":189},"OAuth providers","\u002Fmodules\u002Fidentity\u002Fauth\u002Foauth-providers","3.modules\u002F1.identity\u002F1.auth\u002F5.oauth-providers",{"title":191,"path":192,"stem":193},"Users","\u002Fmodules\u002Fidentity\u002Fusers","3.modules\u002F1.identity\u002F2.users",{"title":195,"path":196,"stem":197},"Account","\u002Fmodules\u002Fidentity\u002Faccount","3.modules\u002F1.identity\u002F3.account",{"title":199,"path":200,"stem":201,"children":202},"Authorization","\u002Fmodules\u002Fidentity\u002Fauthorization","3.modules\u002F1.identity\u002F4.authorization\u002Findex",[203,204,208,212,216],{"title":173,"path":200,"stem":201},{"title":205,"path":206,"stem":207},"Roles and requirements","\u002Fmodules\u002Fidentity\u002Fauthorization\u002Froles-and-requirements","3.modules\u002F1.identity\u002F4.authorization\u002F2.roles-and-requirements",{"title":209,"path":210,"stem":211},"Policies","\u002Fmodules\u002Fidentity\u002Fauthorization\u002Fpolicies","3.modules\u002F1.identity\u002F4.authorization\u002F3.policies",{"title":213,"path":214,"stem":215},"Client","\u002Fmodules\u002Fidentity\u002Fauthorization\u002Fclient","3.modules\u002F1.identity\u002F4.authorization\u002F4.client",{"title":217,"path":218,"stem":219},"Admin","\u002Fmodules\u002Fidentity\u002Fauthorization\u002Fadmin","3.modules\u002F1.identity\u002F4.authorization\u002F5.admin",{"title":221,"path":222,"stem":223},"Preferences","\u002Fmodules\u002Fidentity\u002Fpreferences","3.modules\u002F1.identity\u002F5.preferences",{"title":225,"path":226,"stem":227,"children":228},"OAuth Server","\u002Fmodules\u002Fidentity\u002Foauth-server","3.modules\u002F1.identity\u002F6.oauth-server\u002Findex",[229,230,233,237],{"title":173,"path":226,"stem":227},{"title":175,"path":231,"stem":232},"\u002Fmodules\u002Fidentity\u002Foauth-server\u002Fserver","3.modules\u002F1.identity\u002F6.oauth-server\u002F2.server",{"title":234,"path":235,"stem":236},"Hooks","\u002Fmodules\u002Fidentity\u002Foauth-server\u002Fhooks","3.modules\u002F1.identity\u002F6.oauth-server\u002F3.hooks",{"title":179,"path":238,"stem":239},"\u002Fmodules\u002Fidentity\u002Foauth-server\u002Froutes-and-clients","3.modules\u002F1.identity\u002F6.oauth-server\u002F4.routes-and-clients",{"title":241,"path":242,"stem":243},"OAuth Resource","\u002Fmodules\u002Fidentity\u002Foauth-resource","3.modules\u002F1.identity\u002F8.oauth-resource",{"title":245,"icon":49,"path":246,"stem":247,"children":248,"page":49},"Commerce","\u002Fmodules\u002Fcommerce","3.modules\u002F2.commerce",[249,253,257],{"title":250,"path":251,"stem":252},"Stripe","\u002Fmodules\u002Fcommerce\u002Fstripe","3.modules\u002F2.commerce\u002F1.stripe",{"title":254,"path":255,"stem":256},"Payments","\u002Fmodules\u002Fcommerce\u002Fpayments","3.modules\u002F2.commerce\u002F2.payments",{"title":258,"path":259,"stem":260,"children":261},"Subscriptions","\u002Fmodules\u002Fcommerce\u002Fsubscriptions","3.modules\u002F2.commerce\u002F3.subscriptions\u002Findex",[262,263,266,270],{"title":173,"path":259,"stem":260},{"title":175,"path":264,"stem":265},"\u002Fmodules\u002Fcommerce\u002Fsubscriptions\u002Fserver","3.modules\u002F2.commerce\u002F3.subscriptions\u002F2.server",{"title":267,"path":268,"stem":269},"App","\u002Fmodules\u002Fcommerce\u002Fsubscriptions\u002Fapp","3.modules\u002F2.commerce\u002F3.subscriptions\u002F3.app",{"title":179,"path":271,"stem":272},"\u002Fmodules\u002Fcommerce\u002Fsubscriptions\u002Freference","3.modules\u002F2.commerce\u002F3.subscriptions\u002F4.reference",{"title":274,"icon":49,"path":275,"stem":276,"children":277,"page":49},"Features","\u002Fmodules\u002Ffeatures","3.modules\u002F3.features",[278,293,312,316],{"title":279,"path":280,"stem":281,"children":282},"Events","\u002Fmodules\u002Ffeatures\u002Fevents","3.modules\u002F3.features\u002F1.events\u002Findex",[283,284,287,290],{"title":173,"path":280,"stem":281},{"title":175,"path":285,"stem":286},"\u002Fmodules\u002Ffeatures\u002Fevents\u002Fserver","3.modules\u002F3.features\u002F1.events\u002F2.server",{"title":267,"path":288,"stem":289},"\u002Fmodules\u002Ffeatures\u002Fevents\u002Fapp","3.modules\u002F3.features\u002F1.events\u002F3.app",{"title":179,"path":291,"stem":292},"\u002Fmodules\u002Ffeatures\u002Fevents\u002Freference","3.modules\u002F3.features\u002F1.events\u002F4.reference",{"title":294,"path":295,"stem":296,"children":297},"Forms","\u002Fmodules\u002Ffeatures\u002Fforms","3.modules\u002F3.features\u002F2.forms\u002Findex",[298,299,303,306,309],{"title":173,"path":295,"stem":296},{"title":300,"path":301,"stem":302},"Definition","\u002Fmodules\u002Ffeatures\u002Fforms\u002Fdefinition","3.modules\u002F3.features\u002F2.forms\u002F2.definition",{"title":175,"path":304,"stem":305},"\u002Fmodules\u002Ffeatures\u002Fforms\u002Fserver","3.modules\u002F3.features\u002F2.forms\u002F3.server",{"title":267,"path":307,"stem":308},"\u002Fmodules\u002Ffeatures\u002Fforms\u002Fapp","3.modules\u002F3.features\u002F2.forms\u002F4.app",{"title":179,"path":310,"stem":311},"\u002Fmodules\u002Ffeatures\u002Fforms\u002Freference","3.modules\u002F3.features\u002F2.forms\u002F5.reference",{"title":313,"path":314,"stem":315},"Cookie Consent","\u002Fmodules\u002Ffeatures\u002Fcookie-consent","3.modules\u002F3.features\u002F3.cookie-consent",{"title":317,"path":318,"stem":319},"MCP","\u002Fmodules\u002Ffeatures\u002Fmcp","3.modules\u002F3.features\u002F4.mcp",{"title":321,"icon":49,"path":322,"stem":323,"children":324,"page":49},"Interface","\u002Fmodules\u002Finterface","3.modules\u002F4.interface",[325,350,353,357,361],{"title":326,"path":327,"stem":328,"children":329},"UI","\u002Fmodules\u002Finterface\u002Fui","3.modules\u002F4.interface\u002F1.ui\u002Findex",[330,331,335,339,343,347],{"title":173,"path":327,"stem":328},{"title":332,"path":333,"stem":334},"Page components","\u002Fmodules\u002Finterface\u002Fui\u002Fpage-components","3.modules\u002F4.interface\u002F1.ui\u002F2.page-components",{"title":336,"path":337,"stem":338},"App shell","\u002Fmodules\u002Finterface\u002Fui\u002Fapp-shell","3.modules\u002F4.interface\u002F1.ui\u002F3.app-shell",{"title":340,"path":341,"stem":342},"Form inputs","\u002Fmodules\u002Finterface\u002Fui\u002Fform-inputs","3.modules\u002F4.interface\u002F1.ui\u002F4.form-inputs",{"title":344,"path":345,"stem":346},"Composables and helpers","\u002Fmodules\u002Finterface\u002Fui\u002Fcomposables","3.modules\u002F4.interface\u002F1.ui\u002F5.composables",{"title":179,"path":348,"stem":349},"\u002Fmodules\u002Finterface\u002Fui\u002Freference","3.modules\u002F4.interface\u002F1.ui\u002F6.reference",{"title":217,"path":351,"stem":352},"\u002Fmodules\u002Finterface\u002Fadmin","3.modules\u002F4.interface\u002F2.admin",{"title":354,"path":355,"stem":356},"Menu","\u002Fmodules\u002Finterface\u002Fmenu","3.modules\u002F4.interface\u002F3.menu",{"title":358,"path":359,"stem":360},"Widget","\u002Fmodules\u002Finterface\u002Fwidget","3.modules\u002F4.interface\u002F4.widget",{"title":362,"path":363,"stem":364,"children":365},"Mobile","\u002Fmodules\u002Finterface\u002Fmobile","3.modules\u002F4.interface\u002F5.mobile\u002Findex",[366,367,371],{"title":173,"path":363,"stem":364},{"title":368,"path":369,"stem":370},"CLI and devices","\u002Fmodules\u002Finterface\u002Fmobile\u002Fcli-and-devices","3.modules\u002F4.interface\u002F5.mobile\u002F2.cli-and-devices",{"title":372,"path":373,"stem":374},"Splash screen","\u002Fmodules\u002Finterface\u002Fmobile\u002Fsplash-screen","3.modules\u002F4.interface\u002F5.mobile\u002F3.splash-screen",{"title":376,"icon":49,"path":377,"stem":378,"children":379,"page":49},"Platform","\u002Fmodules\u002Fplatform","3.modules\u002F5.platform",[380,402,406,423],{"title":381,"path":382,"stem":383,"children":384},"Module Kit","\u002Fmodules\u002Fplatform\u002Fmodule-kit","3.modules\u002F5.platform\u002F1.module-kit\u002Findex",[385,386,390,394,398],{"title":173,"path":382,"stem":383},{"title":387,"path":388,"stem":389},"Server toolkit","\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fserver-toolkit","3.modules\u002F5.platform\u002F1.module-kit\u002F2.server-toolkit",{"title":391,"path":392,"stem":393},"Registries and menus","\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fregistries-and-menus","3.modules\u002F5.platform\u002F1.module-kit\u002F3.registries-and-menus",{"title":395,"path":396,"stem":397},"Translations","\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fi18n","3.modules\u002F5.platform\u002F1.module-kit\u002F4.i18n",{"title":399,"path":400,"stem":401},"Database helpers","\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fdatabase","3.modules\u002F5.platform\u002F1.module-kit\u002F5.database",{"title":403,"path":404,"stem":405},"Notify","\u002Fmodules\u002Fplatform\u002Fnotify","3.modules\u002F5.platform\u002F2.notify",{"title":407,"path":408,"stem":409,"children":410},"Email Templates","\u002Fmodules\u002Fplatform\u002Femail-templates","3.modules\u002F5.platform\u002F3.email-templates\u002Findex",[411,412,416,419],{"title":173,"path":408,"stem":409},{"title":413,"path":414,"stem":415},"Email components","\u002Fmodules\u002Fplatform\u002Femail-templates\u002Fcomponents","3.modules\u002F5.platform\u002F3.email-templates\u002F2.components",{"title":175,"path":417,"stem":418},"\u002Fmodules\u002Fplatform\u002Femail-templates\u002Fserver","3.modules\u002F5.platform\u002F3.email-templates\u002F3.server",{"title":420,"path":421,"stem":422},"Module emails","\u002Fmodules\u002Fplatform\u002Femail-templates\u002Fmodule-emails","3.modules\u002F5.platform\u002F3.email-templates\u002F4.module-emails",{"title":424,"path":425,"stem":426,"children":427},"Base Layer","\u002Fmodules\u002Fplatform\u002Fbase-layer","3.modules\u002F5.platform\u002F4.base-layer\u002Findex",[428,429,433,437],{"title":173,"path":425,"stem":426},{"title":430,"path":431,"stem":432},"Content collections","\u002Fmodules\u002Fplatform\u002Fbase-layer\u002Fcontent-collections","3.modules\u002F5.platform\u002F4.base-layer\u002F2.content-collections",{"title":434,"path":435,"stem":436},"Layouts and routing","\u002Fmodules\u002Fplatform\u002Fbase-layer\u002Flayouts-and-routing","3.modules\u002F5.platform\u002F4.base-layer\u002F3.layouts-and-routing",{"title":438,"path":439,"stem":440},"Composables and utils","\u002Fmodules\u002Fplatform\u002Fbase-layer\u002Fcomposables-and-utils","3.modules\u002F5.platform\u002F4.base-layer\u002F4.composables-and-utils",{"title":442,"icon":443,"path":444,"stem":445,"children":446,"page":49},"Examples","i-lucide-code-xml","\u002Fexamples","4.examples",[447,466,476],{"title":448,"icon":49,"path":449,"stem":450,"children":451,"page":49},"Starters","\u002Fexamples\u002Fstarters","4.examples\u002F1.starters",[452,456,461],{"title":453,"path":454,"stem":455,"icon":6},"Workspace starter","\u002Fexamples\u002Fstarters\u002Fworkspace","4.examples\u002F1.starters\u002F1.workspace",{"title":457,"path":458,"stem":459,"icon":460},"Mobile starter","\u002Fexamples\u002Fstarters\u002Fmobile","4.examples\u002F1.starters\u002F2.mobile","i-lucide-smartphone",{"title":462,"path":463,"stem":464,"icon":465},"Standalone mobile starter","\u002Fexamples\u002Fstarters\u002Fmobile-standalone","4.examples\u002F1.starters\u002F3.mobile-standalone","i-lucide-tablet-smartphone",{"title":467,"icon":49,"path":468,"stem":469,"children":470,"page":49},"Apps","\u002Fexamples\u002Fapps","4.examples\u002F2.apps",[471],{"title":472,"path":473,"stem":474,"icon":475},"Frigear website app","\u002Fexamples\u002Fapps\u002Ffrigear-nu-website","4.examples\u002F2.apps\u002F1.frigear-nu-website","i-lucide-layout-dashboard",{"title":477,"icon":49,"path":478,"stem":479,"children":480,"page":49},"Tasks","\u002Fexamples\u002Ftasks","4.examples\u002F3.tasks",[481,485,489,494,499],{"title":482,"path":483,"stem":484,"icon":70},"Protect a route","\u002Fexamples\u002Ftasks\u002Fprotect-a-route","4.examples\u002F3.tasks\u002F1.protect-a-route",{"title":486,"path":487,"stem":488,"icon":475},"Add an admin page","\u002Fexamples\u002Ftasks\u002Fadd-an-admin-page","4.examples\u002F3.tasks\u002F2.add-an-admin-page",{"title":490,"path":491,"stem":492,"icon":493},"Sell event tickets","\u002Fexamples\u002Ftasks\u002Fsell-event-tickets","4.examples\u002F3.tasks\u002F3.sell-event-tickets","i-lucide-ticket",{"title":495,"path":496,"stem":497,"icon":498},"Build a form","\u002Fexamples\u002Ftasks\u002Fbuild-a-form","4.examples\u002F3.tasks\u002F4.build-a-form","i-lucide-clipboard-list",{"title":500,"path":501,"stem":502,"icon":503},"Send an email","\u002Fexamples\u002Ftasks\u002Fsend-an-email","4.examples\u002F3.tasks\u002F5.send-an-email","i-lucide-mail",{"title":505,"icon":506,"path":507,"stem":508,"children":509,"page":49},"Contribute","i-lucide-git-pull-request","\u002Fcontribute","5.contribute",[510,513,518,544,549,552,556,571],{"title":173,"path":511,"stem":512,"icon":506},"\u002Fcontribute\u002Foverview","5.contribute\u002F1.overview",{"title":514,"path":515,"stem":516,"icon":517},"Local development","\u002Fcontribute\u002Flocal-development","5.contribute\u002F2.local-development","i-lucide-terminal",{"title":519,"icon":49,"path":520,"stem":521,"children":522,"page":49},"Writing a module","\u002Fcontribute\u002Fwriting-a-module","5.contribute\u002F3.writing-a-module",[523,527,532,536,541],{"title":524,"path":525,"stem":526,"icon":39},"Scaffold a module","\u002Fcontribute\u002Fwriting-a-module\u002Fscaffold","5.contribute\u002F3.writing-a-module\u002F1.scaffold",{"title":528,"path":529,"stem":530,"icon":531},"Setup checklist","\u002Fcontribute\u002Fwriting-a-module\u002Fsetup-checklist","5.contribute\u002F3.writing-a-module\u002F2.setup-checklist","i-lucide-list-checks",{"title":533,"path":534,"stem":535,"icon":44},"Database tables","\u002Fcontribute\u002Fwriting-a-module\u002Fdatabase-tables","5.contribute\u002F3.writing-a-module\u002F3.database-tables",{"title":537,"path":538,"stem":539,"icon":540},"Testing","\u002Fcontribute\u002Fwriting-a-module\u002Ftesting","5.contribute\u002F3.writing-a-module\u002F4.testing","i-lucide-flask-conical",{"title":67,"path":542,"stem":543,"icon":70},"\u002Fcontribute\u002Fwriting-a-module\u002Faccess-control","5.contribute\u002F3.writing-a-module\u002F5.access-control",{"title":545,"path":546,"stem":547,"icon":548},"Publishing","\u002Fcontribute\u002Fpublishing","5.contribute\u002F4.publishing","i-lucide-package-check",{"title":448,"path":550,"stem":551,"icon":6},"\u002Fcontribute\u002Fstarters","5.contribute\u002F5.starters",{"title":553,"path":554,"stem":555,"icon":52},"Documentation","\u002Fcontribute\u002Fdocumentation","5.contribute\u002F6.documentation",{"title":557,"icon":49,"path":558,"stem":559,"children":560,"page":49},"Tooling","\u002Fcontribute\u002Ftooling","5.contribute\u002F7.tooling",[561,566],{"title":562,"path":563,"stem":564,"icon":565},"CLI","\u002Fcontribute\u002Ftooling\u002Fcli","5.contribute\u002F7.tooling\u002F1.cli","i-lucide-square-terminal",{"title":567,"path":568,"stem":569,"icon":570},"ESLint config","\u002Fcontribute\u002Ftooling\u002Feslint-config","5.contribute\u002F7.tooling\u002F2.eslint-config","i-lucide-spell-check",{"title":572,"icon":49,"path":573,"stem":574,"children":575},"Decisions","\u002Fcontribute\u002Fdecisions","5.contribute\u002F8.decisions\u002Findex",[576,578,583],{"title":572,"path":573,"stem":574,"icon":577},"i-lucide-scale",{"title":579,"path":580,"stem":581,"icon":582},"Session lifetimes per OAuth client","\u002Fcontribute\u002Fdecisions\u002Foauth-token-lifetimes","5.contribute\u002F8.decisions\u002F1.oauth-token-lifetimes","i-lucide-timer",{"title":584,"path":585,"stem":586,"icon":70},"One permission model","\u002Fcontribute\u002Fdecisions\u002Fpermission-model","5.contribute\u002F8.decisions\u002F2.permission-model",{"id":588,"title":195,"body":589,"description":2823,"extension":2824,"links":2825,"meta":2826,"navigation":1869,"path":196,"seo":2827,"stem":197,"__hash__":2828},"docs\u002F3.modules\u002F1.identity\u002F3.account.md",{"type":590,"value":591,"toc":2802},"minimark",[592,604,615,620,697,705,709,776,780,1191,1203,1207,1213,1394,1412,1422,1432,1443,1549,1563,1567,1593,1596,1599,1601,1607,1636,1650,1666,1669,1681,1703,1717,1720,1751,1756,1775,1778,1785,1821,1831,1954,1967,1971,2145,2155,2191,2196,2226,2235,2240,2243,2265,2279,2329,2371,2382,2386,2395,2433,2437,2453,2587,2601,2605,2629,2645,2649,2652,2655,2677,2723,2777,2781,2798],[593,594,595,596,600,601,603],"p",{},"Account gives every signed-in user a place to manage themselves: their name and avatar, email address, password,\npasskeys and ",[597,598,599],"a",{"href":87},"API tokens",". Other modules add their own pages to the same area, such as\nmembership or tickets. Install it when users sign in to your app and should look after their own account. Staff manage\nother people's accounts in the admin area of ",[597,602,191],{"href":192}," instead.",[593,605,606,607,611,612,614],{},"The package is ",[608,609,610],"code",{},"@frigear-nu\u002Faccount",". It is a settings page inside your public site, with its own section navigation.\nIt owns no tables and registers no server routes: its pages call the routes of Users and ",[597,613,168],{"href":169},".",[616,617,619],"h2",{"id":618},"what-you-get","What you get",[621,622,623,648,665,688],"ul",{},[624,625,626,629,630,633,634,633,637,640,641,644,645,614],"li",{},[627,628,101],"strong",{}," (each opt-in): an overview at ",[608,631,632],{},"\u002Faccount",", ",[608,635,636],{},"\u002Faccount\u002Fprofile",[608,638,639],{},"\u002Faccount\u002Fsecurity"," (password and passkeys),\n",[608,642,643],{},"\u002Faccount\u002Fdocuments"," and ",[608,646,647],{},"\u002Faccount\u002Fapi-tokens",[624,649,650,653,654,657,658,661,662,664],{},[627,651,652],{},"Layout"," (on by default): the ",[608,655,656],{},"account"," layout, with the site header and footer, a left section list and a\n",[608,659,660],{},"PageSectionSwitcher"," on narrow screens. Pages other modules add under ",[608,663,632],{}," get it too.",[624,666,667,669,670,673,674,677,678,633,681,644,684,687],{},[627,668,344],{},": ",[608,671,672],{},"useAccount()"," for the profile, email and password changes, ",[608,675,676],{},"useAccountNav()"," for the\nnavigation, and the ",[608,679,680],{},"AccountHeader",[608,682,683],{},"AccountIdentity",[608,685,686],{},"AccountMenu"," components (on by default).",[624,689,690,693,694,696],{},[627,691,692],{},"Account menu"," (on by default): ",[608,695,686],{},", the signed-in user's dropdown with the account links, sign-out and\ncolour mode.",[593,698,699,700,644,702,614],{},"The screens follow the ",[597,701,91],{"href":97},[597,703,704],{"href":102},"pages",[706,707],"module-runtime",{":client":708},"true",[710,711,712,741,749],"note",{},[593,713,714,717,718,633,721,726,727,644,732,737,738,614],{},[627,715,716],{},"Installed for you:"," ",[608,719,720],{},"@frigear-nu\u002Fmodule-kit",[597,722,723],{"href":169},[608,724,725],{},"@frigear-nu\u002Fauth",",\n",[597,728,729],{"href":192},[608,730,731],{},"@frigear-nu\u002Fusers",[597,733,734],{"href":327},[608,735,736],{},"@frigear-nu\u002Fui",", which brings ",[608,739,740],{},"@nuxt\u002Fui",[593,742,743,717,746,614],{},[627,744,745],{},"You add:",[608,747,748],{},"@nuxthub\u002Fcore",[593,750,751,717,754,759,760,765,766,769,770,775],{},[627,752,753],{},"Optional:",[597,755,756],{"href":355},[608,757,758],{},"@frigear-nu\u002Fmenu"," (the account navigation, the dropdown and the overview\npage), ",[597,761,762],{"href":359},[608,763,764],{},"@frigear-nu\u002Fwidget"," (the ",[608,767,768],{},"account.overview"," widget area) and\n",[597,771,772],{"href":200},[608,773,774],{},"@frigear-nu\u002Fauthorization"," (closes the area to visitors).",[616,777,779],{"id":778},"quick-setup","Quick setup",[781,782,783,788,816,820,826],"steps",{},[784,785,787],"h3",{"id":786},"install-account","Install Account",[789,790,795],"pre",{"className":791,"code":792,"language":793,"meta":794,"style":794},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @frigear-nu\u002Faccount @nuxthub\u002Fcore\n","bash","",[608,796,797],{"__ignoreMap":794},[798,799,802,806,810,813],"span",{"class":800,"line":801},"line",1,[798,803,805],{"class":804},"sBMFI","pnpm",[798,807,809],{"class":808},"sfazB"," add",[798,811,812],{"class":808}," @frigear-nu\u002Faccount",[798,814,815],{"class":808}," @nuxthub\u002Fcore\n",[784,817,819],{"id":818},"add-it-to-nuxtconfigts","Add it to nuxt.config.ts",[593,821,822,823,825],{},"Turn on the pages you want. Each takes ",[608,824,708],{}," for its default path, or a path of your own:",[789,827,832],{"className":828,"code":829,"filename":830,"language":831,"meta":794,"style":794},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: [\n    '@nuxthub\u002Fcore',\n    '@frigear-nu\u002Fmenu', \u002F\u002F optional\n    '@frigear-nu\u002Faccount',\n  ],\n  account: {\n    settings: {\n      pages: {\n        profile: true, \u002F\u002F or a custom path, e.g. '\u002Fme'\n        security: true,\n        index: true, \u002F\u002F the overview, only registered with @frigear-nu\u002Fmenu\n        documents: true,\n        apiTokens: true,\n      },\n      documents: [\n        { id: 'handbook', label: { da: 'Håndbog', en: 'Handbook' }, path: '\u002Fassets\u002Ffiles\u002Fhandbook.pdf' },\n        { id: 'crew', label: 'Crew plan', path: '\u002Fassets\u002Ffiles\u002Fcrew.pdf', permission: 'crew-area:view' },\n      ],\n    },\n  },\n})\n","nuxt.config.ts","ts",[608,833,834,855,868,881,897,908,916,927,937,947,964,976,991,1003,1015,1021,1031,1104,1162,1170,1176,1182],{"__ignoreMap":794},[798,835,836,840,843,847,851],{"class":800,"line":801},[798,837,839],{"class":838},"s7zQu","export",[798,841,842],{"class":838}," default",[798,844,846],{"class":845},"s2Zo4"," defineNuxtConfig",[798,848,850],{"class":849},"sTEyZ","(",[798,852,854],{"class":853},"sMK4o","{\n",[798,856,858,862,865],{"class":800,"line":857},2,[798,859,861],{"class":860},"swJcz","  modules",[798,863,864],{"class":853},":",[798,866,867],{"class":849}," [\n",[798,869,871,874,876,879],{"class":800,"line":870},3,[798,872,873],{"class":853},"    '",[798,875,748],{"class":808},[798,877,878],{"class":853},"'",[798,880,726],{"class":853},[798,882,884,886,888,890,893],{"class":800,"line":883},4,[798,885,873],{"class":853},[798,887,758],{"class":808},[798,889,878],{"class":853},[798,891,892],{"class":853},",",[798,894,896],{"class":895},"sHwdD"," \u002F\u002F optional\n",[798,898,900,902,904,906],{"class":800,"line":899},5,[798,901,873],{"class":853},[798,903,610],{"class":808},[798,905,878],{"class":853},[798,907,726],{"class":853},[798,909,911,914],{"class":800,"line":910},6,[798,912,913],{"class":849},"  ]",[798,915,726],{"class":853},[798,917,919,922,924],{"class":800,"line":918},7,[798,920,921],{"class":860},"  account",[798,923,864],{"class":853},[798,925,926],{"class":853}," {\n",[798,928,930,933,935],{"class":800,"line":929},8,[798,931,932],{"class":860},"    settings",[798,934,864],{"class":853},[798,936,926],{"class":853},[798,938,940,943,945],{"class":800,"line":939},9,[798,941,942],{"class":860},"      pages",[798,944,864],{"class":853},[798,946,926],{"class":853},[798,948,950,953,955,959,961],{"class":800,"line":949},10,[798,951,952],{"class":860},"        profile",[798,954,864],{"class":853},[798,956,958],{"class":957},"sfNiH"," true",[798,960,892],{"class":853},[798,962,963],{"class":895}," \u002F\u002F or a custom path, e.g. '\u002Fme'\n",[798,965,967,970,972,974],{"class":800,"line":966},11,[798,968,969],{"class":860},"        security",[798,971,864],{"class":853},[798,973,958],{"class":957},[798,975,726],{"class":853},[798,977,979,982,984,986,988],{"class":800,"line":978},12,[798,980,981],{"class":860},"        index",[798,983,864],{"class":853},[798,985,958],{"class":957},[798,987,892],{"class":853},[798,989,990],{"class":895}," \u002F\u002F the overview, only registered with @frigear-nu\u002Fmenu\n",[798,992,994,997,999,1001],{"class":800,"line":993},13,[798,995,996],{"class":860},"        documents",[798,998,864],{"class":853},[798,1000,958],{"class":957},[798,1002,726],{"class":853},[798,1004,1006,1009,1011,1013],{"class":800,"line":1005},14,[798,1007,1008],{"class":860},"        apiTokens",[798,1010,864],{"class":853},[798,1012,958],{"class":957},[798,1014,726],{"class":853},[798,1016,1018],{"class":800,"line":1017},15,[798,1019,1020],{"class":853},"      },\n",[798,1022,1024,1027,1029],{"class":800,"line":1023},16,[798,1025,1026],{"class":860},"      documents",[798,1028,864],{"class":853},[798,1030,867],{"class":849},[798,1032,1034,1037,1040,1042,1045,1048,1050,1052,1055,1057,1060,1063,1065,1067,1070,1072,1074,1077,1079,1081,1084,1086,1089,1092,1094,1096,1099,1101],{"class":800,"line":1033},17,[798,1035,1036],{"class":853},"        {",[798,1038,1039],{"class":860}," id",[798,1041,864],{"class":853},[798,1043,1044],{"class":853}," '",[798,1046,1047],{"class":808},"handbook",[798,1049,878],{"class":853},[798,1051,892],{"class":853},[798,1053,1054],{"class":860}," label",[798,1056,864],{"class":853},[798,1058,1059],{"class":853}," {",[798,1061,1062],{"class":860}," da",[798,1064,864],{"class":853},[798,1066,1044],{"class":853},[798,1068,1069],{"class":808},"Håndbog",[798,1071,878],{"class":853},[798,1073,892],{"class":853},[798,1075,1076],{"class":860}," en",[798,1078,864],{"class":853},[798,1080,1044],{"class":853},[798,1082,1083],{"class":808},"Handbook",[798,1085,878],{"class":853},[798,1087,1088],{"class":853}," },",[798,1090,1091],{"class":860}," path",[798,1093,864],{"class":853},[798,1095,1044],{"class":853},[798,1097,1098],{"class":808},"\u002Fassets\u002Ffiles\u002Fhandbook.pdf",[798,1100,878],{"class":853},[798,1102,1103],{"class":853}," },\n",[798,1105,1107,1109,1111,1113,1115,1118,1120,1122,1124,1126,1128,1131,1133,1135,1137,1139,1141,1144,1146,1148,1151,1153,1155,1158,1160],{"class":800,"line":1106},18,[798,1108,1036],{"class":853},[798,1110,1039],{"class":860},[798,1112,864],{"class":853},[798,1114,1044],{"class":853},[798,1116,1117],{"class":808},"crew",[798,1119,878],{"class":853},[798,1121,892],{"class":853},[798,1123,1054],{"class":860},[798,1125,864],{"class":853},[798,1127,1044],{"class":853},[798,1129,1130],{"class":808},"Crew plan",[798,1132,878],{"class":853},[798,1134,892],{"class":853},[798,1136,1091],{"class":860},[798,1138,864],{"class":853},[798,1140,1044],{"class":853},[798,1142,1143],{"class":808},"\u002Fassets\u002Ffiles\u002Fcrew.pdf",[798,1145,878],{"class":853},[798,1147,892],{"class":853},[798,1149,1150],{"class":860}," permission",[798,1152,864],{"class":853},[798,1154,1044],{"class":853},[798,1156,1157],{"class":808},"crew-area:view",[798,1159,878],{"class":853},[798,1161,1103],{"class":853},[798,1163,1165,1168],{"class":800,"line":1164},19,[798,1166,1167],{"class":849},"      ]",[798,1169,726],{"class":853},[798,1171,1173],{"class":800,"line":1172},20,[798,1174,1175],{"class":853},"    },\n",[798,1177,1179],{"class":800,"line":1178},21,[798,1180,1181],{"class":853},"  },\n",[798,1183,1185,1188],{"class":800,"line":1184},22,[798,1186,1187],{"class":853},"}",[798,1189,1190],{"class":849},")\n",[1192,1193,1196,1199,1200,1202],"callout",{"color":1194,"icon":1195},"success","i-lucide-check",[627,1197,1198],{},"What you should see:"," signed in, ",[608,1201,636],{}," shows your name and email inside the site, with the account\nsections in a list on the left.",[616,1204,1206],{"id":1205},"options","Options",[593,1208,1209,1210,1212],{},"Options go under the ",[608,1211,656],{}," key.",[1214,1215,1216,1235],"table",{},[1217,1218,1219],"thead",{},[1220,1221,1222,1226,1229,1232],"tr",{},[1223,1224,1225],"th",{},"Option",[1223,1227,1228],{},"Type",[1223,1230,1231],{},"Default",[1223,1233,1234],{},"Purpose",[1236,1237,1238,1264,1287,1307,1331,1355,1375],"tbody",{},[1220,1239,1240,1246,1251,1255],{},[1241,1242,1243],"td",{},[608,1244,1245],{},"settings.layout",[1241,1247,1248],{},[608,1249,1250],{},"boolean",[1241,1252,1253],{},[608,1254,708],{},[1241,1256,1257,1258,1260,1261,614],{},"Renders the account area in the ",[608,1259,656],{}," layout. See ",[597,1262,652],{"href":1263},"#layout",[1220,1265,1266,1271,1276,1279],{},[1241,1267,1268],{},[608,1269,1270],{},"settings.pages.index",[1241,1272,1273],{},[608,1274,1275],{},"string | boolean",[1241,1277,1278],{},"off",[1241,1280,1281,1282,1284,1285,614],{},"The overview: summary, widgets and shortcuts. ",[608,1283,708],{}," means ",[608,1286,632],{},[1220,1288,1289,1294,1298,1300],{},[1241,1290,1291],{},[608,1292,1293],{},"settings.pages.profile",[1241,1295,1296],{},[608,1297,1275],{},[1241,1299,1278],{},[1241,1301,1302,1303,1284,1305,614],{},"Name, avatar and email. ",[608,1304,708],{},[608,1306,636],{},[1220,1308,1309,1314,1318,1320],{},[1241,1310,1311],{},[608,1312,1313],{},"settings.pages.security",[1241,1315,1316],{},[608,1317,1275],{},[1241,1319,1278],{},[1241,1321,1322,1323,1326,1327,1284,1329,614],{},"Password, passkeys and, with OAuth Server, ",[627,1324,1325],{},"Signed-in apps",". ",[608,1328,708],{},[608,1330,639],{},[1220,1332,1333,1338,1342,1344],{},[1241,1334,1335],{},[608,1336,1337],{},"settings.pages.documents",[1241,1339,1340],{},[608,1341,1275],{},[1241,1343,1278],{},[1241,1345,1346,1347,1350,1351,1284,1353,614],{},"Lists ",[608,1348,1349],{},"settings.documents"," for download. ",[608,1352,708],{},[608,1354,643],{},[1220,1356,1357,1362,1366,1368],{},[1241,1358,1359],{},[608,1360,1361],{},"settings.pages.apiTokens",[1241,1363,1364],{},[608,1365,1275],{},[1241,1367,1278],{},[1241,1369,1370,1371,1284,1373,614],{},"Create and revoke API tokens. ",[608,1372,708],{},[608,1374,647],{},[1220,1376,1377,1381,1386,1391],{},[1241,1378,1379],{},[608,1380,1349],{},[1241,1382,1383],{},[608,1384,1385],{},"AccountDocument[]",[1241,1387,1388],{},[608,1389,1390],{},"[]",[1241,1392,1393],{},"Files offered on the documents page.",[593,1395,1396,1400,1401,1404,1405,1408,1409,1411],{},[627,1397,1398,614],{},[608,1399,1245],{}," An ",[608,1402,1403],{},"app\u002Flayouts\u002Faccount.vue"," of your own (or a layer's) replaces the module's, and the route rule\nstill applies it by name. ",[608,1406,1407],{},"false"," registers no layout and sets no rule. The shipped pages then render their own\n",[608,1410,680],{}," but bring no container.",[593,1413,1414,1418,1419,1421],{},[627,1415,1416,614],{},[608,1417,1270],{}," It needs ",[608,1420,758],{},". Without Menu it is skipped with a warning.",[593,1423,1424,1428,1429,614],{},[627,1425,1426,614],{},[608,1427,1361],{}," It is skipped when Auth has ",[608,1430,1431],{},"apiTokens: false",[593,1433,1434,1439,1440,1442],{},[627,1435,1436,614],{},[608,1437,1438],{},"settings.pages.*"," A page is on with ",[608,1441,708],{}," (its default path) or a custom path, and off when left out. A page\nwhose path already exists in your app is not registered. So your app replaces a shipped page by declaring its own at\nthat path.",[789,1444,1446],{"className":828,"code":1445,"language":831,"meta":794,"style":794},"type AccountDocument = {\n  id: string\n  \u002F** A string, or a locale map (falls back to `en`, then the first value). *\u002F\n  label: string | Record\u003Cstring, string>\n  \u002F** Where the file is served from, e.g. `\u002Fassets\u002Ffiles\u002Fhandbook.pdf`. *\u002F\n  path: string\n  icon?: string\n  \u002F** The permission a user must hold to see it listed. Omit to list it for every signed-in user. Needs Authorization. *\u002F\n  permission?: string\n}\n",[608,1447,1448,1462,1472,1477,1506,1511,1520,1530,1535,1544],{"__ignoreMap":794},[798,1449,1450,1454,1457,1460],{"class":800,"line":801},[798,1451,1453],{"class":1452},"spNyl","type",[798,1455,1456],{"class":804}," AccountDocument",[798,1458,1459],{"class":853}," =",[798,1461,926],{"class":853},[798,1463,1464,1467,1469],{"class":800,"line":857},[798,1465,1466],{"class":860},"  id",[798,1468,864],{"class":853},[798,1470,1471],{"class":804}," string\n",[798,1473,1474],{"class":800,"line":870},[798,1475,1476],{"class":895},"  \u002F** A string, or a locale map (falls back to `en`, then the first value). *\u002F\n",[798,1478,1479,1482,1484,1487,1490,1493,1496,1499,1501,1503],{"class":800,"line":883},[798,1480,1481],{"class":860},"  label",[798,1483,864],{"class":853},[798,1485,1486],{"class":804}," string",[798,1488,1489],{"class":853}," |",[798,1491,1492],{"class":804}," Record",[798,1494,1495],{"class":853},"\u003C",[798,1497,1498],{"class":804},"string",[798,1500,892],{"class":853},[798,1502,1486],{"class":804},[798,1504,1505],{"class":853},">\n",[798,1507,1508],{"class":800,"line":899},[798,1509,1510],{"class":895},"  \u002F** Where the file is served from, e.g. `\u002Fassets\u002Ffiles\u002Fhandbook.pdf`. *\u002F\n",[798,1512,1513,1516,1518],{"class":800,"line":910},[798,1514,1515],{"class":860},"  path",[798,1517,864],{"class":853},[798,1519,1471],{"class":804},[798,1521,1522,1525,1528],{"class":800,"line":918},[798,1523,1524],{"class":860},"  icon",[798,1526,1527],{"class":853},"?:",[798,1529,1471],{"class":804},[798,1531,1532],{"class":800,"line":929},[798,1533,1534],{"class":895},"  \u002F** The permission a user must hold to see it listed. Omit to list it for every signed-in user. Needs Authorization. *\u002F\n",[798,1536,1537,1540,1542],{"class":800,"line":939},[798,1538,1539],{"class":860},"  permission",[798,1541,1527],{"class":853},[798,1543,1471],{"class":804},[798,1545,1546],{"class":800,"line":949},[798,1547,1548],{"class":853},"}\n",[1550,1551,1552,1555,1556,1558,1559,1562],"caution",{},[608,1553,1554],{},"permission"," only filters the list, and without ",[597,1557,199],{"href":200}," a document with a permission is never listed. A file served from ",[608,1560,1561],{},"public\u002F"," can be fetched by anyone who knows its URL. Put sensitive\nfiles behind a server route if that matters.",[616,1564,1566],{"id":1565},"server","Server",[593,1568,1569,1570,1573,1574,669,1577,1580,1581,1584,1585,1588,1589,1592],{},"Account registers no server routes of its own. Its pages call the self-service routes of\n",[597,1571,191],{"href":1572},"\u002Fmodules\u002Fidentity\u002Fusers#routes"," through ",[608,1575,1576],{},"usersApi",[608,1578,1579],{},"PATCH \u002Fapi\u002Fusers\u002Fme"," (profile), ",[608,1582,1583],{},"PUT \u002Fapi\u002Fusers\u002Fme\u002Femail","\nand ",[608,1586,1587],{},"PUT \u002Fapi\u002Fusers\u002Fme\u002Fpassword",". They need a cookie ",[597,1590,1591],{"href":87},"session"," and answer the caller's\nprofile.",[616,1594,267],{"id":1595},"app",[593,1597,1598],{},"The pages, the layout and the components your app can use or replace.",[784,1600,101],{"id":704},[593,1602,1603,1606],{},[627,1604,1605],{},"API tokens."," The page lists the user's tokens in a table.",[621,1608,1609,1615,1618,1621,1626],{},[624,1610,1611,1614],{},[627,1612,1613],{},"Create API token",", in the page heading's actions, opens a slideover with the name, scopes and expiry.",[624,1616,1617],{},"The new token is shown once above the table, with a copy button.",[624,1619,1620],{},"Revoking a token asks for confirmation.",[624,1622,1623,1624,614],{},"Tokens are created through ",[597,1625,168],{"href":169},[624,1627,1628,1629,1632,1633,1635],{},"When ",[608,1630,1631],{},"users.settings.mcp"," is on, the page also shows a \"Connect to MCP\" card (",[597,1634,317],{"href":318},").",[593,1637,1638,1641,1642,1645,1646,1649],{},[627,1639,1640],{},"Profile and security."," The profile page opens ",[627,1643,1644],{},"Change email"," in a slideover. The security page's ",[627,1647,1648],{},"Add passkey",",\nin the passkeys card heading, opens a slideover too, with an optional name field.",[593,1651,1652,1655,1656,1659,1660,1663,1664,614],{},[627,1653,1654],{},"Email changes."," Confirmed email changes are a setting of Users (",[608,1657,1658],{},"users.settings.verifyEmailChange","). Point\n",[608,1661,1662],{},"users.settings.profilePath"," at the profile page, which then shows the result. See\n",[597,1665,191],{"href":1572},[784,1667,652],{"id":1668},"layout",[593,1670,1671,1672,644,1674,1677,1678,1680],{},"Every page under ",[608,1673,632],{},[608,1675,1676],{},"\u002F\u003Clocale>\u002Faccount"," renders in the ",[608,1679,656],{}," layout, plus any configured page path\noutside it.",[621,1682,1683,1693],{},[624,1684,1685,1686,1689,1690,1692],{},"The module sets this with an ",[608,1687,1688],{},"appLayout"," route rule. So pages other modules add under ",[608,1691,632],{}," (membership,\ntickets, applications) get the layout too, whenever they register.",[624,1694,1695,1696,1698,1699,1702],{},"A page that sets ",[608,1697,1668],{}," in its own ",[608,1700,1701],{},"definePageMeta"," keeps its choice.",[593,1704,1705,1706,1708,1709,1713,1714,1716],{},"The layout itself (site header and footer, a left section list, ",[608,1707,660],{}," on narrow screens) is described\nin ",[597,1710,1712],{"href":1711},"\u002Fguide\u002Fux-patterns\u002Flayouts-and-navigation#account-area","Account area",". The navigation is built from the ",[608,1715,656],{},"\nmenu, and the layout renders no heading.",[593,1718,1719],{},"Details:",[621,1721,1722,1731,1738,1741],{},[624,1723,1724,1725,1727,1728,614],{},"Without ",[608,1726,758],{},", the navigation lists the pages that are on in ",[608,1729,1730],{},"settings.pages",[624,1732,1733,1734,1737],{},"An app without a ",[608,1735,1736],{},"default"," layout still works: the area renders on its own.",[624,1739,1740],{},"The document title defaults to the active navigation entry. A page's heading overrides it.",[624,1742,1743,1746,1747,1750],{},[608,1744,1745],{},"app.vue"," must render ",[608,1748,1749],{},"\u003CNuxtLayout>"," for any layout to apply.",[1752,1753,1755],"h4",{"id":1754},"heading","Heading",[593,1757,1758,1759,1761,1762,1767,1768,1771,1772,1774],{},"Every account page renders its own heading. ",[608,1760,680],{}," is an opt-in\n",[597,1763,1764],{"href":333},[608,1765,1766],{},"PageHeading"," for this. Its title is the page's ",[608,1769,1770],{},"title"," meta, else the label\nof the ",[608,1773,656],{}," menu item the route belongs to (longest matching path), else \"Account\". It also sets the document\ntitle.",[784,1776,173],{"id":1777},"overview",[593,1779,1780,1781,1784],{},"The overview (",[608,1782,1783],{},"pages.index",") shows, in order:",[1786,1787,1788,1794,1803,1815],"ol",{},[624,1789,1790,1791,1793],{},"an ",[608,1792,680],{}," (\"Overview\"),",[624,1795,1796,1797,1800,1801,892],{},"a summary card: ",[608,1798,1799],{},"UUser"," with avatar, name and email, and ",[608,1802,683],{},[624,1804,1805,1806,717,1808,1811,1812,1814],{},"the ",[608,1807,768],{},[597,1809,1810],{"href":359},"widget area",", when ",[608,1813,764],{}," is installed,",[624,1816,1817,1818,1820],{},"a card with shortcuts to every other entry of the ",[608,1819,656],{}," menu.",[593,1822,1823,1824,1827,1828,864],{},"Widgets receive the session ",[608,1825,1826],{},"user"," as a prop. A module adds one from its ",[608,1829,1830],{},"setup()",[789,1832,1834],{"className":828,"code":1833,"language":831,"meta":794,"style":794},"\u002F\u002F In another module's setup()\nimport { extendWidgets } from '@frigear-nu\u002Fwidget\u002Futils'\n\nextendWidgets(nuxt, 'account.overview', {\n  id: 'next-ticket',\n  component: resolver.resolve('.\u002Fruntime\u002Fapp\u002Fcomponents\u002FNextTicket.vue'),\n  order: 10,\n})\n",[608,1835,1836,1841,1865,1871,1891,1906,1935,1948],{"__ignoreMap":794},[798,1837,1838],{"class":800,"line":801},[798,1839,1840],{"class":895},"\u002F\u002F In another module's setup()\n",[798,1842,1843,1846,1848,1851,1854,1857,1859,1862],{"class":800,"line":857},[798,1844,1845],{"class":838},"import",[798,1847,1059],{"class":853},[798,1849,1850],{"class":849}," extendWidgets",[798,1852,1853],{"class":853}," }",[798,1855,1856],{"class":838}," from",[798,1858,1044],{"class":853},[798,1860,1861],{"class":808},"@frigear-nu\u002Fwidget\u002Futils",[798,1863,1864],{"class":853},"'\n",[798,1866,1867],{"class":800,"line":870},[798,1868,1870],{"emptyLinePlaceholder":1869},true,"\n",[798,1872,1873,1876,1879,1881,1883,1885,1887,1889],{"class":800,"line":883},[798,1874,1875],{"class":845},"extendWidgets",[798,1877,1878],{"class":849},"(nuxt",[798,1880,892],{"class":853},[798,1882,1044],{"class":853},[798,1884,768],{"class":808},[798,1886,878],{"class":853},[798,1888,892],{"class":853},[798,1890,926],{"class":853},[798,1892,1893,1895,1897,1899,1902,1904],{"class":800,"line":899},[798,1894,1466],{"class":860},[798,1896,864],{"class":853},[798,1898,1044],{"class":853},[798,1900,1901],{"class":808},"next-ticket",[798,1903,878],{"class":853},[798,1905,726],{"class":853},[798,1907,1908,1911,1913,1916,1918,1921,1923,1925,1928,1930,1933],{"class":800,"line":910},[798,1909,1910],{"class":860},"  component",[798,1912,864],{"class":853},[798,1914,1915],{"class":849}," resolver",[798,1917,614],{"class":853},[798,1919,1920],{"class":845},"resolve",[798,1922,850],{"class":849},[798,1924,878],{"class":853},[798,1926,1927],{"class":808},".\u002Fruntime\u002Fapp\u002Fcomponents\u002FNextTicket.vue",[798,1929,878],{"class":853},[798,1931,1932],{"class":849},")",[798,1934,726],{"class":853},[798,1936,1937,1940,1942,1946],{"class":800,"line":918},[798,1938,1939],{"class":860},"  order",[798,1941,864],{"class":853},[798,1943,1945],{"class":1944},"sbssI"," 10",[798,1947,726],{"class":853},[798,1949,1950,1952],{"class":800,"line":929},[798,1951,1187],{"class":853},[798,1953,1190],{"class":849},[593,1955,1956,1957,1962,1963,1966],{},"Use ",[597,1958,1959],{"href":333},[608,1960,1961],{},"StatCard"," for numbers and ",[608,1964,1965],{},"ListCard"," for short lists, as on the admin\ndashboard.",[784,1968,1970],{"id":1969},"composables","Composables",[789,1972,1974],{"className":828,"code":1973,"language":831,"meta":794,"style":794},"const { updateProfileDetails, changeEmailAddress, changePassword, pending, error } = useAccount()\n\nawait updateProfileDetails({ name: 'Ada Lovelace', avatar: 'https:\u002F\u002Fexample.com\u002Fada.png' }) \u002F\u002F avatar: null clears it\nawait changeEmailAddress({ email: 'ada@example.com' })\nawait changePassword({ currentPassword: 'old', newPassword: 'new-password', confirmNewPassword: 'new-password' })\n",[608,1975,1976,2016,2020,2066,2092],{"__ignoreMap":794},[798,1977,1978,1981,1983,1986,1988,1991,1993,1996,1998,2001,2003,2006,2008,2010,2013],{"class":800,"line":801},[798,1979,1980],{"class":1452},"const",[798,1982,1059],{"class":853},[798,1984,1985],{"class":849}," updateProfileDetails",[798,1987,892],{"class":853},[798,1989,1990],{"class":849}," changeEmailAddress",[798,1992,892],{"class":853},[798,1994,1995],{"class":849}," changePassword",[798,1997,892],{"class":853},[798,1999,2000],{"class":849}," pending",[798,2002,892],{"class":853},[798,2004,2005],{"class":849}," error ",[798,2007,1187],{"class":853},[798,2009,1459],{"class":853},[798,2011,2012],{"class":845}," useAccount",[798,2014,2015],{"class":849},"()\n",[798,2017,2018],{"class":800,"line":857},[798,2019,1870],{"emptyLinePlaceholder":1869},[798,2021,2022,2025,2027,2029,2032,2035,2037,2039,2042,2044,2046,2049,2051,2053,2056,2058,2060,2063],{"class":800,"line":870},[798,2023,2024],{"class":838},"await",[798,2026,1985],{"class":845},[798,2028,850],{"class":849},[798,2030,2031],{"class":853},"{",[798,2033,2034],{"class":860}," name",[798,2036,864],{"class":853},[798,2038,1044],{"class":853},[798,2040,2041],{"class":808},"Ada Lovelace",[798,2043,878],{"class":853},[798,2045,892],{"class":853},[798,2047,2048],{"class":860}," avatar",[798,2050,864],{"class":853},[798,2052,1044],{"class":853},[798,2054,2055],{"class":808},"https:\u002F\u002Fexample.com\u002Fada.png",[798,2057,878],{"class":853},[798,2059,1853],{"class":853},[798,2061,2062],{"class":849},") ",[798,2064,2065],{"class":895},"\u002F\u002F avatar: null clears it\n",[798,2067,2068,2070,2072,2074,2076,2079,2081,2083,2086,2088,2090],{"class":800,"line":883},[798,2069,2024],{"class":838},[798,2071,1990],{"class":845},[798,2073,850],{"class":849},[798,2075,2031],{"class":853},[798,2077,2078],{"class":860}," email",[798,2080,864],{"class":853},[798,2082,1044],{"class":853},[798,2084,2085],{"class":808},"ada@example.com",[798,2087,878],{"class":853},[798,2089,1853],{"class":853},[798,2091,1190],{"class":849},[798,2093,2094,2096,2098,2100,2102,2105,2107,2109,2112,2114,2116,2119,2121,2123,2126,2128,2130,2133,2135,2137,2139,2141,2143],{"class":800,"line":899},[798,2095,2024],{"class":838},[798,2097,1995],{"class":845},[798,2099,850],{"class":849},[798,2101,2031],{"class":853},[798,2103,2104],{"class":860}," currentPassword",[798,2106,864],{"class":853},[798,2108,1044],{"class":853},[798,2110,2111],{"class":808},"old",[798,2113,878],{"class":853},[798,2115,892],{"class":853},[798,2117,2118],{"class":860}," newPassword",[798,2120,864],{"class":853},[798,2122,1044],{"class":853},[798,2124,2125],{"class":808},"new-password",[798,2127,878],{"class":853},[798,2129,892],{"class":853},[798,2131,2132],{"class":860}," confirmNewPassword",[798,2134,864],{"class":853},[798,2136,1044],{"class":853},[798,2138,2125],{"class":808},[798,2140,878],{"class":853},[798,2142,1853],{"class":853},[798,2144,1190],{"class":849},[593,2146,2147,2148,644,2151,2154],{},"Each call refreshes the user session afterwards. ",[608,2149,2150],{},"pending",[608,2152,2153],{},"error"," are refs.",[789,2156,2158],{"className":828,"code":2157,"language":831,"meta":794,"style":794},"const { items, links, current } = await useAccountNav()\n",[608,2159,2160],{"__ignoreMap":794},[798,2161,2162,2164,2166,2169,2171,2174,2176,2179,2181,2183,2186,2189],{"class":800,"line":801},[798,2163,1980],{"class":1452},[798,2165,1059],{"class":853},[798,2167,2168],{"class":849}," items",[798,2170,892],{"class":853},[798,2172,2173],{"class":849}," links",[798,2175,892],{"class":853},[798,2177,2178],{"class":849}," current ",[798,2180,1187],{"class":853},[798,2182,1459],{"class":853},[798,2184,2185],{"class":838}," await",[798,2187,2188],{"class":845}," useAccountNav",[798,2190,2015],{"class":849},[593,2192,2193,2194,864],{},"The layout, the heading and the overview read ",[608,2195,676],{},[621,2197,2198,2207,2220],{},[624,2199,2200,2203,2204,2206],{},[608,2201,2202],{},"items"," are the account navigation entries: the ",[608,2205,656],{}," menu, or the pages that are on without the Menu module.",[624,2208,2209,2212,2213,2216,2217,614],{},[608,2210,2211],{},"links"," are the same entries as ",[608,2214,2215],{},"UNavigationMenu"," items, localised and with ",[608,2218,2219],{},"active",[624,2221,2222,2225],{},[608,2223,2224],{},"current"," is the entry the route belongs to.",[593,2227,2228,2229,633,2231,644,2233,614],{},"The module also auto-imports the components ",[608,2230,680],{},[608,2232,683],{},[608,2234,686],{},[784,2236,2238],{"id":2237},"accountmenu",[608,2239,686],{},[593,2241,2242],{},"The signed-in user's dropdown. It shows:",[621,2244,2245,2250,2256],{},[624,2246,2247,2248,892],{},"the user, with a role badge for any role other than ",[608,2249,1826],{},[624,2251,1805,2252,2255],{},[608,2253,2254],{},"account.dropdown"," menu: Account, Admin and sign-out,",[624,2257,2258,2261,2262,614],{},[627,2259,2260],{},"Appearance",": light, dark or system, which sets ",[608,2263,2264],{},"useColorMode().preference",[593,2266,2267,2268,2270,2271,2274,2275,2278],{},"Items with a ",[608,2269,1554],{}," are only listed for users who hold it (Authorization filters them through the ",[608,2272,2273],{},"menus:filter"," hook). The entry for the area you are in is\nleft out. Items with ",[608,2276,2277],{},"order"," 99 or more (sign-out) come last.",[1214,2280,2281,2292],{},[1217,2282,2283],{},[1220,2284,2285,2288,2290],{},[1223,2286,2287],{},"Prop",[1223,2289,1228],{},[1223,2291,1234],{},[1236,2293,2294,2312],{},[1220,2295,2296,2301,2305],{},[1241,2297,2298],{},[608,2299,2300],{},"block",[1241,2302,2303],{},[608,2304,1250],{},[1241,2306,2307,2308,2311],{},"A full-width row (avatar, name, chevrons) for a sidebar footer, as in the ",[597,2309,2310],{"href":351},"admin"," shell. Without it, an avatar button for a site header.",[1220,2313,2314,2319,2323],{},[1241,2315,2316],{},[608,2317,2318],{},"collapsed",[1241,2320,2321],{},[608,2322,1250],{},[1241,2324,2325,2326,2328],{},"With ",[608,2327,2300],{},": only the avatar, for a collapsed sidebar.",[789,2330,2334],{"className":2331,"code":2332,"language":2333,"meta":794,"style":794},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CAccountMenu \u002F>\n\u003CAccountMenu block :collapsed=\"collapsed\" \u002F>\n","vue",[608,2335,2336,2345],{"__ignoreMap":794},[798,2337,2338,2340,2342],{"class":800,"line":801},[798,2339,1495],{"class":853},[798,2341,686],{"class":860},[798,2343,2344],{"class":853}," \u002F>\n",[798,2346,2347,2349,2351,2354,2357,2359,2362,2365,2367,2369],{"class":800,"line":857},[798,2348,1495],{"class":853},[798,2350,686],{"class":860},[798,2352,2353],{"class":1452}," block",[798,2355,2356],{"class":853}," :",[798,2358,2318],{"class":1452},[798,2360,2361],{"class":853},"=",[798,2363,2364],{"class":853},"\"",[798,2366,2318],{"class":849},[798,2368,2364],{"class":853},[798,2370,2344],{"class":853},[593,2372,2373,2374,2377,2378,2381],{},"The colour mode lives here rather than in the header. Set ",[608,2375,2376],{},"header.colorMode: false"," in the\n",[597,2379,2380],{"href":425},"base layer"," app config to drop the header toggle.",[1752,2383,2385],{"id":2384},"overriding-parts","Overriding parts",[593,2387,2388,2389,2391,2392,2394],{},"The module's components have a lower priority than your app's, so a component with the same name in your app replaces\nit. ",[608,2390,683],{}," is shown next to the user in the overview's summary card and nowhere else. By default it is a role\nbadge for anyone who is not a plain ",[608,2393,1826],{},", otherwise nothing. Override it to show something else, such as a member\nnumber or a Frigear ID badge:",[789,2396,2398],{"className":2331,"code":2397,"language":2333,"meta":794,"style":794},"\u003C!-- app\u002Fcomponents\u002FAccount\u002FAccountIdentity.vue -->\n\u003Ctemplate>\n  \u003CMyIdentityDetails \u002F>\n\u003C\u002Ftemplate>\n",[608,2399,2400,2405,2414,2424],{"__ignoreMap":794},[798,2401,2402],{"class":800,"line":801},[798,2403,2404],{"class":895},"\u003C!-- app\u002Fcomponents\u002FAccount\u002FAccountIdentity.vue -->\n",[798,2406,2407,2409,2412],{"class":800,"line":857},[798,2408,1495],{"class":853},[798,2410,2411],{"class":860},"template",[798,2413,1505],{"class":853},[798,2415,2416,2419,2422],{"class":800,"line":870},[798,2417,2418],{"class":853},"  \u003C",[798,2420,2421],{"class":860},"MyIdentityDetails",[798,2423,2344],{"class":853},[798,2425,2426,2429,2431],{"class":800,"line":883},[798,2427,2428],{"class":853},"\u003C\u002F",[798,2430,2411],{"class":860},[798,2432,1505],{"class":853},[784,2434,2436],{"id":2435},"menu-contributions","Menu contributions",[593,2438,2325,2439,2441,2442,2444,2445,2447,2448,1326,2450,2452],{},[597,2440,354],{"href":355}," installed, each page that is on adds an item. The ",[608,2443,656],{}," menu is the account\nnavigation and the overview's shortcuts. ",[608,2446,2254],{}," is ",[608,2449,686],{},[608,2451,2277],{}," sorts within the menu.",[1214,2454,2455,2470],{},[1217,2456,2457],{},[1220,2458,2459,2462,2464,2467],{},[1223,2460,2461],{},"Item",[1223,2463,354],{},[1223,2465,2466],{},"Order",[1223,2468,2469],{},"Page",[1236,2471,2472,2490,2509,2530,2549,2568],{},[1220,2473,2474,2479,2483,2486],{},[1241,2475,2476,2478],{},[608,2477,656],{}," (\"Account\")",[1241,2480,2481],{},[608,2482,2254],{},[1241,2484,2485],{},"-99",[1241,2487,2488],{},[608,2489,1783],{},[1220,2491,2492,2498,2502,2505],{},[1241,2493,2494,2497],{},[608,2495,2496],{},"account-overview"," (\"Overview\")",[1241,2499,2500],{},[608,2501,656],{},[1241,2503,2504],{},"0",[1241,2506,2507],{},[608,2508,1783],{},[1220,2510,2511,2516,2522,2525],{},[1241,2512,2513],{},[608,2514,2515],{},"profile",[1241,2517,2518,644,2520],{},[608,2519,656],{},[608,2521,2254],{},[1241,2523,2524],{},"10",[1241,2526,2527],{},[608,2528,2529],{},"pages.profile",[1220,2531,2532,2537,2541,2544],{},[1241,2533,2534],{},[608,2535,2536],{},"security",[1241,2538,2539],{},[608,2540,656],{},[1241,2542,2543],{},"20",[1241,2545,2546],{},[608,2547,2548],{},"pages.security",[1220,2550,2551,2556,2560,2563],{},[1241,2552,2553],{},[608,2554,2555],{},"api-tokens",[1241,2557,2558],{},[608,2559,656],{},[1241,2561,2562],{},"25",[1241,2564,2565],{},[608,2566,2567],{},"pages.apiTokens",[1220,2569,2570,2575,2579,2582],{},[1241,2571,2572],{},[608,2573,2574],{},"documents",[1241,2576,2577],{},[608,2578,656],{},[1241,2580,2581],{},"30",[1241,2583,2584],{},[608,2585,2586],{},"pages.documents",[593,2588,2589,2590,2592,2593,2595,2596,2598,2599,1820],{},"Other modules add to the same menu: Membership (",[597,2591,258],{"href":259},") at 15, Tickets\n(",[597,2594,279],{"href":280},") at 40 and Applications (",[597,2597,225],{"href":226},") at 50. Pick\nan order between these for a new page. The source is registered for the ",[608,2600,656],{},[784,2602,2604],{"id":2603},"signed-in-only","Signed-in only",[593,2606,2325,2607,2609,2610,2613,2614,2616,2617,2620,2621,2624,2625,2628],{},[608,2608,774],{}," installed, the module adds an ",[608,2611,2612],{},"authenticated: true"," route rule for ",[608,2615,632],{}," and\n",[608,2618,2619],{},"\u002Faccount\u002F**",", and for each ",[608,2622,2623],{},"\u002F\u003Clocale>"," prefix. So every page under it is closed to\n",[597,2626,2627],{"href":87},"visitors",", including the pages other modules add (membership, tickets, applications).",[621,2630,2631,2642],{},[624,2632,2633,2634,2637,2638,2641],{},"Set ",[608,2635,2636],{},"authorization.redirectTo"," to send visitors to the sign-in page instead of a ",[608,2639,2640],{},"401"," error.",[624,2643,2644],{},"Without the Authorization module, the pages are not guarded and the module logs a warning.",[616,2646,2648],{"id":2647},"routes","Routes",[593,2650,2651],{},"None. The module registers no server routes.",[616,2653,395],{"id":2654},"translations",[593,2656,2657,2658,2661,2662,644,2665,2668,2669,2672,2673,614],{},"Override any string in your app's ",[608,2659,2660],{},"i18n\u002Flocales\u002F\u003Ccode>.json",". The module registers ",[608,2663,2664],{},"da",[608,2666,2667],{},"en"," locale files under the\n",[608,2670,2671],{},"account.*"," namespace. See\n",[597,2674,2676],{"href":2675},"\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fi18n#overriding-module-strings-in-your-app","overriding module strings",[621,2678,2679,2696,2711,2717],{},[624,2680,2681,2682,633,2684,633,2687,633,2690,644,2693,614],{},"The key groups are ",[608,2683,1770],{},[608,2685,2686],{},"menu.*",[608,2688,2689],{},"profile.*",[608,2691,2692],{},"documents.*",[608,2694,2695],{},"security.*",[624,2697,2698,2699,633,2702,633,2705,644,2708,614],{},"The layout and the menu use ",[608,2700,2701],{},"nav.*",[608,2703,2704],{},"appearance.*",[608,2706,2707],{},"overview.*",[608,2709,2710],{},"accountMenu",[624,2712,2713,2714,614],{},"The full list is in ",[608,2715,2716],{},"src\u002Fruntime\u002Fi18n\u002Flang\u002Fen.json",[624,2718,1724,2719,2722],{},[608,2720,2721],{},"@nuxtjs\u002Fi18n",", the English defaults are used.",[789,2724,2728],{"className":2725,"code":2726,"language":2727,"meta":794,"style":794},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"account\": { \"profile\": { \"title\": \"My details\" } } }\n","json",[608,2729,2730],{"__ignoreMap":794},[798,2731,2732,2734,2737,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2768,2770,2772,2774],{"class":800,"line":801},[798,2733,2031],{"class":853},[798,2735,2736],{"class":853}," \"",[798,2738,656],{"class":1452},[798,2740,2364],{"class":853},[798,2742,864],{"class":853},[798,2744,1059],{"class":853},[798,2746,2736],{"class":853},[798,2748,2515],{"class":804},[798,2750,2364],{"class":853},[798,2752,864],{"class":853},[798,2754,1059],{"class":853},[798,2756,2736],{"class":853},[798,2758,1770],{"class":1944},[798,2760,2364],{"class":853},[798,2762,864],{"class":853},[798,2764,2736],{"class":853},[798,2766,2767],{"class":808},"My details",[798,2769,2364],{"class":853},[798,2771,1853],{"class":853},[798,2773,1853],{"class":853},[798,2775,2776],{"class":853}," }\n",[616,2778,2780],{"id":2779},"next-steps","Next steps",[621,2782,2783,2788,2793],{},[624,2784,2785,2787],{},[597,2786,358],{"href":359}," – add a card of your own to the overview.",[624,2789,2790,2792],{},[597,2791,199],{"href":200}," – close the account area to visitors.",[624,2794,2795,2797],{},[597,2796,96],{"href":97}," – how the account area fits the other areas.",[2799,2800,2801],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":794,"searchDepth":857,"depth":857,"links":2803},[2804,2805,2809,2810,2811,2820,2821,2822],{"id":618,"depth":857,"text":619},{"id":778,"depth":857,"text":779,"children":2806},[2807,2808],{"id":786,"depth":870,"text":787},{"id":818,"depth":870,"text":819},{"id":1205,"depth":857,"text":1206},{"id":1565,"depth":857,"text":1566},{"id":1595,"depth":857,"text":267,"children":2812},[2813,2814,2815,2816,2817,2818,2819],{"id":704,"depth":870,"text":101},{"id":1668,"depth":870,"text":652},{"id":1777,"depth":870,"text":173},{"id":1969,"depth":870,"text":1970},{"id":2237,"depth":870,"text":686},{"id":2435,"depth":870,"text":2436},{"id":2603,"depth":870,"text":2604},{"id":2647,"depth":857,"text":2648},{"id":2654,"depth":857,"text":395},{"id":2779,"depth":857,"text":2780},"Gives signed-in users an account area where they change their profile, password, passkeys and API tokens.","md",null,{},{"title":195,"description":2823},"5gBhLSOecPB5wtywws1AtVJtN6Wp88TK7CQNqlOHk94",[2830,2832],{"title":191,"path":192,"stem":193,"description":2831,"children":-1},"Stores your app's users, lets staff manage them and lets each user change their own name, email and password.",{"title":173,"path":200,"stem":201,"description":2833,"children":-1},"Roles, permissions and policies that decide what a signed-in user may do on pages, server routes and in the interface.",1794503148052]