[{"data":1,"prerenderedAt":2775},["ShallowReactive",2],{"navigation_docs":3,"-modules-interface-admin":587,"-modules-interface-admin-surround":2770},[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":217,"body":589,"description":2764,"extension":2765,"links":2766,"meta":2767,"navigation":1474,"path":351,"seo":2768,"stem":352,"__hash__":2769},"docs\u002F3.modules\u002F4.interface\u002F2.admin.md",{"type":590,"value":591,"toc":2745},"minimark",[592,609,629,634,694,698,747,751,1076,1097,1101,1107,1250,1263,1287,1310,1317,1339,1343,1357,1420,1423,1427,1433,1436,1530,1863,1873,2141,2283,2300,2303,2310,2394,2401,2404,2418,2449,2459,2463,2473,2480,2609,2612,2622,2720,2724,2741],[593,594,595,596,600,601,605,606,608],"p",{},"Admin gives your ",[597,598,599],"a",{"href":87},"staff"," one place to manage the app: a guarded area under ",[602,603,604],"code",{},"\u002Fadmin"," with a\nsidebar, a search palette and a dashboard. It has no features of its own. Users, Events, Forms and other modules add\ntheir pages, sidebar entries and dashboard cards when it is installed. Install it when staff need management screens;\nfor a settings area of your own, use the ",[597,607,336],{"href":337}," directly.",[593,610,611,612,615,616,619,620,622,623,625,626,628],{},"The package is ",[602,613,614],{},"@frigear-nu\u002Fadmin",". It draws the ",[597,617,618],{"href":87},"admin area"," from the components of\n",[597,621,326],{"href":327},", the sidebar from ",[597,624,354],{"href":355}," and the dashboard from\n",[597,627,358],{"href":359},".",[630,631,633],"h2",{"id":632},"what-you-get","What you get",[635,636,637,653,659,671,677],"ul",{},[638,639,640,643,644,646,647,650,651,628],"li",{},[641,642,101],"strong",{}," (on by default): a dashboard at ",[602,645,604],{},", and the ",[602,648,649],{},"admin"," layout for every page under ",[602,652,604],{},[638,654,655,658],{},[641,656,657],{},"Admin area"," (on by default): a sidebar in three groups, a ⌘K palette and the account menu in the sidebar footer.",[638,660,661,664,665,667,668,670],{},[641,662,663],{},"Access"," (on with ",[597,666,199],{"href":200},"): only the ",[602,669,649],{}," role can open the area.",[638,672,673,676],{},[641,674,675],{},"Account menu"," (on by default): an \"Admin\" entry for users who may open the area.",[638,678,679,682,683,686,687,690,691,628],{},[641,680,681],{},"Helpers"," for module authors: ",[602,684,685],{},"extendAdminNav",", ",[602,688,689],{},"extendAdminDashboard"," and ",[602,692,693],{},"adminRoute",[695,696],"module-runtime",{":client":697},"true",[699,700,701,722,730],"note",{},[593,702,703,706,707,686,712,714,715,686,717,690,719,628],{},[641,704,705],{},"Installed for you:"," ",[597,708,709],{"href":382},[602,710,711],{},"@frigear-nu\u002Fmodule-kit",[597,713,326],{"href":327},",\n",[597,716,354],{"href":355},[597,718,358],{"href":359},[602,720,721],{},"nuxt-auth-utils",[593,723,724,706,727,628],{},[641,725,726],{},"You add:",[602,728,729],{},"@nuxt\u002Fui",[593,731,732,706,735,740,741,746],{},[641,733,734],{},"Optional:",[597,736,737],{"href":200},[602,738,739],{},"@frigear-nu\u002Fauthorization"," (guards the area by permission) and\n",[597,742,743],{"href":196},[602,744,745],{},"@frigear-nu\u002Faccount"," (the account menu in the sidebar footer).",[630,748,750],{"id":749},"quick-setup","Quick setup",[752,753,754,759,790,794,798,1040,1044,1064],"steps",{},[755,756,758],"h3",{"id":757},"install-admin","Install Admin",[760,761,766],"pre",{"className":762,"code":763,"language":764,"meta":765,"style":765},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @frigear-nu\u002Fadmin @nuxt\u002Fui @frigear-nu\u002Fauthorization\n","bash","",[602,767,768],{"__ignoreMap":765},[769,770,773,777,781,784,787],"span",{"class":771,"line":772},"line",1,[769,774,776],{"class":775},"sBMFI","pnpm",[769,778,780],{"class":779},"sfazB"," add",[769,782,783],{"class":779}," @frigear-nu\u002Fadmin",[769,785,786],{"class":779}," @nuxt\u002Fui",[769,788,789],{"class":779}," @frigear-nu\u002Fauthorization\n",[755,791,793],{"id":792},"add-it-to-nuxtconfigts","Add it to nuxt.config.ts",[795,796,797],"warning",{},"Without Authorization, nothing guards the admin pages in the browser, and the build logs a warning. The server routes\nbehind them stay guarded by the modules that own them.",[760,799,804],{"className":800,"code":801,"filename":802,"language":803,"meta":765,"style":765},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@nuxt\u002Fui', '@frigear-nu\u002Fauthorization', '@frigear-nu\u002Fadmin'],\n  admin: {\n    settings: {\n      permission: 'admin:access', \u002F\u002F the default\n    },\n  },\n  authorization: {\n    roles: {\n      \u002F\u002F `admin` already holds `admin:access`. Give it to a role of your own too:\n      manager: { label: 'Coordinator', grant: ['admin:access', 'forms:*', 'users:read', 'users:list'] },\n    },\n  },\n})\n","nuxt.config.ts","ts",[602,805,806,827,870,881,891,912,918,924,934,944,950,1021,1026,1031],{"__ignoreMap":765},[769,807,808,812,815,819,823],{"class":771,"line":772},[769,809,811],{"class":810},"s7zQu","export",[769,813,814],{"class":810}," default",[769,816,818],{"class":817},"s2Zo4"," defineNuxtConfig",[769,820,822],{"class":821},"sTEyZ","(",[769,824,826],{"class":825},"sMK4o","{\n",[769,828,830,834,837,840,843,845,847,850,853,855,857,859,861,863,865,868],{"class":771,"line":829},2,[769,831,833],{"class":832},"swJcz","  modules",[769,835,836],{"class":825},":",[769,838,839],{"class":821}," [",[769,841,842],{"class":825},"'",[769,844,729],{"class":779},[769,846,842],{"class":825},[769,848,849],{"class":825},",",[769,851,852],{"class":825}," '",[769,854,739],{"class":779},[769,856,842],{"class":825},[769,858,849],{"class":825},[769,860,852],{"class":825},[769,862,614],{"class":779},[769,864,842],{"class":825},[769,866,867],{"class":821},"]",[769,869,714],{"class":825},[769,871,873,876,878],{"class":771,"line":872},3,[769,874,875],{"class":832},"  admin",[769,877,836],{"class":825},[769,879,880],{"class":825}," {\n",[769,882,884,887,889],{"class":771,"line":883},4,[769,885,886],{"class":832},"    settings",[769,888,836],{"class":825},[769,890,880],{"class":825},[769,892,894,897,899,901,904,906,908],{"class":771,"line":893},5,[769,895,896],{"class":832},"      permission",[769,898,836],{"class":825},[769,900,852],{"class":825},[769,902,903],{"class":779},"admin:access",[769,905,842],{"class":825},[769,907,849],{"class":825},[769,909,911],{"class":910},"sHwdD"," \u002F\u002F the default\n",[769,913,915],{"class":771,"line":914},6,[769,916,917],{"class":825},"    },\n",[769,919,921],{"class":771,"line":920},7,[769,922,923],{"class":825},"  },\n",[769,925,927,930,932],{"class":771,"line":926},8,[769,928,929],{"class":832},"  authorization",[769,931,836],{"class":825},[769,933,880],{"class":825},[769,935,937,940,942],{"class":771,"line":936},9,[769,938,939],{"class":832},"    roles",[769,941,836],{"class":825},[769,943,880],{"class":825},[769,945,947],{"class":771,"line":946},10,[769,948,949],{"class":910},"      \u002F\u002F `admin` already holds `admin:access`. Give it to a role of your own too:\n",[769,951,953,956,958,961,964,966,968,971,973,975,978,980,982,984,986,988,990,992,995,997,999,1001,1004,1006,1008,1010,1013,1015,1018],{"class":771,"line":952},11,[769,954,955],{"class":832},"      manager",[769,957,836],{"class":825},[769,959,960],{"class":825}," {",[769,962,963],{"class":832}," label",[769,965,836],{"class":825},[769,967,852],{"class":825},[769,969,970],{"class":779},"Coordinator",[769,972,842],{"class":825},[769,974,849],{"class":825},[769,976,977],{"class":832}," grant",[769,979,836],{"class":825},[769,981,839],{"class":821},[769,983,842],{"class":825},[769,985,903],{"class":779},[769,987,842],{"class":825},[769,989,849],{"class":825},[769,991,852],{"class":825},[769,993,994],{"class":779},"forms:*",[769,996,842],{"class":825},[769,998,849],{"class":825},[769,1000,852],{"class":825},[769,1002,1003],{"class":779},"users:read",[769,1005,842],{"class":825},[769,1007,849],{"class":825},[769,1009,852],{"class":825},[769,1011,1012],{"class":779},"users:list",[769,1014,842],{"class":825},[769,1016,1017],{"class":821},"] ",[769,1019,1020],{"class":825},"},\n",[769,1022,1024],{"class":771,"line":1023},12,[769,1025,917],{"class":825},[769,1027,1029],{"class":771,"line":1028},13,[769,1030,923],{"class":825},[769,1032,1034,1037],{"class":771,"line":1033},14,[769,1035,1036],{"class":825},"}",[769,1038,1039],{"class":821},")\n",[755,1041,1043],{"id":1042},"give-yourself-a-role-that-holds-the-permission","Give yourself a role that holds the permission",[593,1045,1046,1047,1049,1050,1052,1053,1056,1057,1059,1060,628],{},"Only users who hold ",[602,1048,903],{}," can open the area. The module registers it and grants it to the ",[602,1051,649],{}," role. In the\nstarter, ",[602,1054,1055],{},"NUXT_ACL_ADMINS"," lists the emails that get the ",[602,1058,649],{}," role. See\n",[597,1061,1063],{"href":1062},"\u002Fget-started\u002Fauthentication#_4-roles-and-the-first-admin","Roles and the first admin",[593,1065,1066,1068,1069,1072,1073,1075],{},[602,1067,903],{}," only opens the pages. The data behind them checks its own permissions, such as ",[602,1070,1071],{},"forms:manage",", so a role\nthat holds ",[602,1074,903],{}," alone sees an empty area.",[1077,1078,1081,1084,1085,686,1087,1089,1090,1092,1093,1096],"callout",{"color":1079,"icon":1080},"success","i-lucide-check",[641,1082,1083],{},"What you should see:"," signed in with a role that holds ",[602,1086,903],{},[602,1088,604],{}," shows the dashboard with the sidebar,\nand the account menu has an \"Admin\" entry. Signed in without it, ",[602,1091,604],{}," shows a 403 error page and the entry is hidden. Signed out,\nyou are sent to ",[602,1094,1095],{},"authorization.redirectTo",", or get a 401 when it is unset.",[630,1098,1100],{"id":1099},"options","Options",[593,1102,1103,1104,1106],{},"Options go under the ",[602,1105,649],{}," key.",[1108,1109,1110,1129],"table",{},[1111,1112,1113],"thead",{},[1114,1115,1116,1120,1123,1126],"tr",{},[1117,1118,1119],"th",{},"Option",[1117,1121,1122],{},"Type",[1117,1124,1125],{},"Default",[1117,1127,1128],{},"Purpose",[1130,1131,1132,1153,1180,1203,1228],"tbody",{},[1114,1133,1134,1140,1145,1150],{},[1135,1136,1137],"td",{},[602,1138,1139],{},"settings.base",[1135,1141,1142],{},[602,1143,1144],{},"string",[1135,1146,1147],{},[602,1148,1149],{},"'\u002Fadmin'",[1135,1151,1152],{},"The path prefix of the area. A trailing slash is trimmed.",[1114,1154,1155,1160,1165,1169],{},[1135,1156,1157],{},[602,1158,1159],{},"settings.dashboard",[1135,1161,1162],{},[602,1163,1164],{},"boolean | string",[1135,1166,1167],{},[602,1168,697],{},[1135,1170,1171,1172,1175,1176,1179],{},"The dashboard page at ",[602,1173,1174],{},"base",". ",[602,1177,1178],{},"false"," turns it off; a string is a custom path.",[1114,1181,1182,1187,1192,1197],{},[1135,1183,1184],{},[602,1185,1186],{},"settings.permission",[1135,1188,1189],{},[602,1190,1191],{},"string | false",[1135,1193,1194],{},[602,1195,1196],{},"'admin:access'",[1135,1198,1199,1200,1202],{},"The permission needed to enter the area. ",[602,1201,1178],{}," sets no guard.",[1114,1204,1205,1210,1215,1219],{},[1135,1206,1207],{},[602,1208,1209],{},"settings.layout",[1135,1211,1212],{},[602,1213,1214],{},"boolean",[1135,1216,1217],{},[602,1218,697],{},[1135,1220,1221,1222,1224,1225,1227],{},"Gives every page under ",[602,1223,1174],{}," the ",[602,1226,649],{}," layout.",[1114,1229,1230,1235,1239,1244],{},[1135,1231,1232],{},[602,1233,1234],{},"settings.backTo",[1135,1236,1237],{},[602,1238,1191],{},[1135,1240,1241],{},[602,1242,1243],{},"'\u002F'",[1135,1245,1246,1247,1249],{},"Target of the sidebar's \"Back to the site\" link. ",[602,1248,1178],{}," hides it.",[593,1251,1252,1256,1257,1259,1260,1262],{},[641,1253,1254,628],{},[602,1255,1159],{}," With ",[602,1258,1178],{},", other modules' pages under ",[602,1261,1174],{}," still get the layout.",[593,1264,1265,1269,1270,1273,1274,1277,1278,1280,1281,1283,1284,1286],{},[641,1266,1267,628],{},[602,1268,1186],{}," It becomes a route rule ",[602,1271,1272],{},"{ permission }"," on ",[602,1275,1276],{},"\u003Cbase>\u002F**",", when Authorization is installed.\nThe default ",[602,1279,903],{}," is registered by Admin and granted to the ",[602,1282,649],{}," role. A custom permission must be\nregistered by your app, and given to the roles that may enter. With ",[602,1285,1178],{},", guard the area yourself. A rule of your\nown for that path wins.",[593,1288,1289,1293,1294,1273,1297,690,1300,1302,1303,1306,1307,1309],{},[641,1290,1291,628],{},[602,1292,1209],{}," It sets a route rule ",[602,1295,1296],{},"{ appLayout: 'admin' }",[602,1298,1299],{},"\u003Cbase>",[602,1301,1276],{},", unless a page picks\nits own layout. Your own ",[602,1304,1305],{},"app\u002Flayouts\u002Fadmin.vue",", in the app or a layer, replaces the module's. ",[602,1308,1178],{}," registers no\nlayout and sets no rule.",[593,1311,1312,1316],{},[641,1313,1314,628],{},[602,1315,1234],{}," A path gets the locale prefix. An absolute URL to another host is used as is.",[593,1318,1319,1320,1323,1324,1327,1328,1331,1332,1335,1336,1338],{},"With ",[602,1321,1322],{},"@nuxtjs\u002Fi18n",", every rule is repeated for each ",[602,1325,1326],{},"\u002F\u003Clocale>"," prefix. The \"Admin\" entry in the account menu is added\nonly when ",[602,1329,1330],{},"dashboard"," is on and the area is guarded (Authorization is installed and ",[602,1333,1334],{},"permission"," is not ",[602,1337,1178],{},"). The entry itself carries the permission, so it is hidden from\nusers who cannot open the area.",[755,1340,1342],{"id":1341},"runtime-config","Runtime config",[593,1344,1345,1348,1349,1352,1353,1356],{},[602,1346,1347],{},"runtimeConfig.public.admin"," holds the resolved values. Set ",[602,1350,1351],{},"NUXT_PUBLIC_ADMIN_BACK_TO"," to change ",[602,1354,1355],{},"backTo"," per\ndeploy; an empty value hides the link.",[760,1358,1360],{"className":800,"code":1359,"language":803,"meta":765,"style":765},"type PublicModuleOptions = {\n  base: string\n  dashboard?: string \u002F\u002F undefined when the dashboard is off\n  backTo?: string | false\n}\n",[602,1361,1362,1376,1386,1400,1415],{"__ignoreMap":765},[769,1363,1364,1368,1371,1374],{"class":771,"line":772},[769,1365,1367],{"class":1366},"spNyl","type",[769,1369,1370],{"class":775}," PublicModuleOptions",[769,1372,1373],{"class":825}," =",[769,1375,880],{"class":825},[769,1377,1378,1381,1383],{"class":771,"line":829},[769,1379,1380],{"class":832},"  base",[769,1382,836],{"class":825},[769,1384,1385],{"class":775}," string\n",[769,1387,1388,1391,1394,1397],{"class":771,"line":872},[769,1389,1390],{"class":832},"  dashboard",[769,1392,1393],{"class":825},"?:",[769,1395,1396],{"class":775}," string",[769,1398,1399],{"class":910}," \u002F\u002F undefined when the dashboard is off\n",[769,1401,1402,1405,1407,1409,1412],{"class":771,"line":883},[769,1403,1404],{"class":832},"  backTo",[769,1406,1393],{"class":825},[769,1408,1396],{"class":775},[769,1410,1411],{"class":825}," |",[769,1413,1414],{"class":775}," false\n",[769,1416,1417],{"class":771,"line":893},[769,1418,1419],{"class":825},"}\n",[630,1421,267],{"id":1422},"app",[755,1424,1426],{"id":1425},"add-a-page-to-the-sidebar","Add a page to the sidebar",[593,1428,1429,1430,628],{},"The sidebar is three groups, each read from its own menu path. Which group a page belongs in is explained on\n",[597,1431,96],{"href":1432},"\u002Fguide\u002Fux-patterns\u002Flayouts-and-navigation#admin-area",[593,1434,1435],{},"A module never imports Admin at runtime. It adds its entry to the group's menu path, which works whether or not Admin\nis installed. For an entry that needs runtime config, register a runtime menu file:",[760,1437,1439],{"className":800,"code":1438,"language":803,"meta":765,"style":765},"\u002F\u002F module.ts\nimport { addOptionalMenuSource } from '@frigear-nu\u002Fmodule-kit\u002Futils'\n\naddOptionalMenuSource(nuxt, { file: resolver.resolve('.\u002Fruntime\u002Fmenus'), menu: 'admin' })\n",[602,1440,1441,1446,1470,1476],{"__ignoreMap":765},[769,1442,1443],{"class":771,"line":772},[769,1444,1445],{"class":910},"\u002F\u002F module.ts\n",[769,1447,1448,1451,1453,1456,1459,1462,1464,1467],{"class":771,"line":829},[769,1449,1450],{"class":810},"import",[769,1452,960],{"class":825},[769,1454,1455],{"class":821}," addOptionalMenuSource",[769,1457,1458],{"class":825}," }",[769,1460,1461],{"class":810}," from",[769,1463,852],{"class":825},[769,1465,1466],{"class":779},"@frigear-nu\u002Fmodule-kit\u002Futils",[769,1468,1469],{"class":825},"'\n",[769,1471,1472],{"class":771,"line":872},[769,1473,1475],{"emptyLinePlaceholder":1474},true,"\n",[769,1477,1478,1481,1484,1486,1488,1491,1493,1496,1498,1501,1503,1505,1508,1510,1513,1515,1518,1520,1522,1524,1526,1528],{"class":771,"line":883},[769,1479,1480],{"class":817},"addOptionalMenuSource",[769,1482,1483],{"class":821},"(nuxt",[769,1485,849],{"class":825},[769,1487,960],{"class":825},[769,1489,1490],{"class":832}," file",[769,1492,836],{"class":825},[769,1494,1495],{"class":821}," resolver",[769,1497,628],{"class":825},[769,1499,1500],{"class":817},"resolve",[769,1502,822],{"class":821},[769,1504,842],{"class":825},[769,1506,1507],{"class":779},".\u002Fruntime\u002Fmenus",[769,1509,842],{"class":825},[769,1511,1512],{"class":821},")",[769,1514,849],{"class":825},[769,1516,1517],{"class":832}," menu",[769,1519,836],{"class":825},[769,1521,852],{"class":825},[769,1523,649],{"class":779},[769,1525,842],{"class":825},[769,1527,1458],{"class":825},[769,1529,1039],{"class":821},[760,1531,1533],{"className":800,"code":1532,"language":803,"meta":765,"style":765},"\u002F\u002F runtime\u002Fmenus.ts\nimport { defineMenuItem, defineMenuSource, extendMenuItem } from '@frigear-nu\u002Fmenu\u002Futils'\n\nexport default defineMenuSource(() => {\n  const config = useRuntimeConfig().public.forms\n\n  \u002F\u002F Manage group (the root of `admin.nav`)\n  extendMenuItem('admin.nav', defineMenuItem({\n    id: 'forms-admin',\n    label: 'Forms',\n    labelKey: 'forms.menu.admin.label',\n    icon: 'i-lucide-clipboard-list',\n    to: config.pages.admin,\n    order: 30,\n  }))\n\n  \u002F\u002F Settings group\n  extendMenuItem('admin.nav.settings', defineMenuItem({\n    id: 'forms-settings',\n    label: 'Form settings',\n    icon: 'i-lucide-settings-2',\n    to: '\u002Fadmin\u002Fforms\u002Fsettings',\n  }))\n})\n",[602,1534,1535,1540,1570,1574,1592,1617,1621,1626,1648,1664,1679,1695,1710,1730,1743,1752,1757,1763,1785,1801,1817,1833,1849,1856],{"__ignoreMap":765},[769,1536,1537],{"class":771,"line":772},[769,1538,1539],{"class":910},"\u002F\u002F runtime\u002Fmenus.ts\n",[769,1541,1542,1544,1546,1549,1551,1554,1556,1559,1561,1563,1565,1568],{"class":771,"line":829},[769,1543,1450],{"class":810},[769,1545,960],{"class":825},[769,1547,1548],{"class":821}," defineMenuItem",[769,1550,849],{"class":825},[769,1552,1553],{"class":821}," defineMenuSource",[769,1555,849],{"class":825},[769,1557,1558],{"class":821}," extendMenuItem",[769,1560,1458],{"class":825},[769,1562,1461],{"class":810},[769,1564,852],{"class":825},[769,1566,1567],{"class":779},"@frigear-nu\u002Fmenu\u002Futils",[769,1569,1469],{"class":825},[769,1571,1572],{"class":771,"line":872},[769,1573,1475],{"emptyLinePlaceholder":1474},[769,1575,1576,1578,1580,1582,1584,1587,1590],{"class":771,"line":883},[769,1577,811],{"class":810},[769,1579,814],{"class":810},[769,1581,1553],{"class":817},[769,1583,822],{"class":821},[769,1585,1586],{"class":825},"()",[769,1588,1589],{"class":1366}," =>",[769,1591,880],{"class":825},[769,1593,1594,1597,1600,1602,1605,1607,1609,1612,1614],{"class":771,"line":893},[769,1595,1596],{"class":1366},"  const",[769,1598,1599],{"class":821}," config",[769,1601,1373],{"class":825},[769,1603,1604],{"class":817}," useRuntimeConfig",[769,1606,1586],{"class":832},[769,1608,628],{"class":825},[769,1610,1611],{"class":821},"public",[769,1613,628],{"class":825},[769,1615,1616],{"class":821},"forms\n",[769,1618,1619],{"class":771,"line":914},[769,1620,1475],{"emptyLinePlaceholder":1474},[769,1622,1623],{"class":771,"line":920},[769,1624,1625],{"class":910},"  \u002F\u002F Manage group (the root of `admin.nav`)\n",[769,1627,1628,1631,1633,1635,1638,1640,1642,1644,1646],{"class":771,"line":926},[769,1629,1630],{"class":817},"  extendMenuItem",[769,1632,822],{"class":832},[769,1634,842],{"class":825},[769,1636,1637],{"class":779},"admin.nav",[769,1639,842],{"class":825},[769,1641,849],{"class":825},[769,1643,1548],{"class":817},[769,1645,822],{"class":832},[769,1647,826],{"class":825},[769,1649,1650,1653,1655,1657,1660,1662],{"class":771,"line":936},[769,1651,1652],{"class":832},"    id",[769,1654,836],{"class":825},[769,1656,852],{"class":825},[769,1658,1659],{"class":779},"forms-admin",[769,1661,842],{"class":825},[769,1663,714],{"class":825},[769,1665,1666,1669,1671,1673,1675,1677],{"class":771,"line":946},[769,1667,1668],{"class":832},"    label",[769,1670,836],{"class":825},[769,1672,852],{"class":825},[769,1674,294],{"class":779},[769,1676,842],{"class":825},[769,1678,714],{"class":825},[769,1680,1681,1684,1686,1688,1691,1693],{"class":771,"line":952},[769,1682,1683],{"class":832},"    labelKey",[769,1685,836],{"class":825},[769,1687,852],{"class":825},[769,1689,1690],{"class":779},"forms.menu.admin.label",[769,1692,842],{"class":825},[769,1694,714],{"class":825},[769,1696,1697,1700,1702,1704,1706,1708],{"class":771,"line":1023},[769,1698,1699],{"class":832},"    icon",[769,1701,836],{"class":825},[769,1703,852],{"class":825},[769,1705,498],{"class":779},[769,1707,842],{"class":825},[769,1709,714],{"class":825},[769,1711,1712,1715,1717,1719,1721,1724,1726,1728],{"class":771,"line":1028},[769,1713,1714],{"class":832},"    to",[769,1716,836],{"class":825},[769,1718,1599],{"class":821},[769,1720,628],{"class":825},[769,1722,1723],{"class":821},"pages",[769,1725,628],{"class":825},[769,1727,649],{"class":821},[769,1729,714],{"class":825},[769,1731,1732,1735,1737,1741],{"class":771,"line":1033},[769,1733,1734],{"class":832},"    order",[769,1736,836],{"class":825},[769,1738,1740],{"class":1739},"sbssI"," 30",[769,1742,714],{"class":825},[769,1744,1746,1749],{"class":771,"line":1745},15,[769,1747,1748],{"class":825},"  }",[769,1750,1751],{"class":832},"))\n",[769,1753,1755],{"class":771,"line":1754},16,[769,1756,1475],{"emptyLinePlaceholder":1474},[769,1758,1760],{"class":771,"line":1759},17,[769,1761,1762],{"class":910},"  \u002F\u002F Settings group\n",[769,1764,1766,1768,1770,1772,1775,1777,1779,1781,1783],{"class":771,"line":1765},18,[769,1767,1630],{"class":817},[769,1769,822],{"class":832},[769,1771,842],{"class":825},[769,1773,1774],{"class":779},"admin.nav.settings",[769,1776,842],{"class":825},[769,1778,849],{"class":825},[769,1780,1548],{"class":817},[769,1782,822],{"class":832},[769,1784,826],{"class":825},[769,1786,1788,1790,1792,1794,1797,1799],{"class":771,"line":1787},19,[769,1789,1652],{"class":832},[769,1791,836],{"class":825},[769,1793,852],{"class":825},[769,1795,1796],{"class":779},"forms-settings",[769,1798,842],{"class":825},[769,1800,714],{"class":825},[769,1802,1804,1806,1808,1810,1813,1815],{"class":771,"line":1803},20,[769,1805,1668],{"class":832},[769,1807,836],{"class":825},[769,1809,852],{"class":825},[769,1811,1812],{"class":779},"Form settings",[769,1814,842],{"class":825},[769,1816,714],{"class":825},[769,1818,1820,1822,1824,1826,1829,1831],{"class":771,"line":1819},21,[769,1821,1699],{"class":832},[769,1823,836],{"class":825},[769,1825,852],{"class":825},[769,1827,1828],{"class":779},"i-lucide-settings-2",[769,1830,842],{"class":825},[769,1832,714],{"class":825},[769,1834,1836,1838,1840,1842,1845,1847],{"class":771,"line":1835},22,[769,1837,1714],{"class":832},[769,1839,836],{"class":825},[769,1841,852],{"class":825},[769,1843,1844],{"class":779},"\u002Fadmin\u002Fforms\u002Fsettings",[769,1846,842],{"class":825},[769,1848,714],{"class":825},[769,1850,1852,1854],{"class":771,"line":1851},23,[769,1853,1748],{"class":825},[769,1855,1751],{"class":832},[769,1857,1859,1861],{"class":771,"line":1858},24,[769,1860,1036],{"class":825},[769,1862,1039],{"class":821},[593,1864,1865,1866,1869,1870,836],{},"For entries known at build time, call the helpers from ",[602,1867,1868],{},"@frigear-nu\u002Fadmin\u002Futils"," in ",[602,1871,1872],{},"setup()",[760,1874,1876],{"className":800,"code":1875,"language":803,"meta":765,"style":765},"import { extendAdminNav, extendAdminDashboard, adminRoute } from '@frigear-nu\u002Fadmin\u002Futils'\n\nextendAdminNav(nuxt, { label: 'Forms', to: adminRoute(nuxt, 'forms'), icon: 'i-lucide-clipboard-list', order: 20 })\nextendAdminNav(nuxt, { label: 'OAuth applications', to: adminRoute(nuxt, 'oauth'), icon: 'i-lucide-key-round' }, 'settings')\nextendAdminDashboard(nuxt, { component: resolver.resolve('.\u002Fruntime\u002Fapp\u002Fwidgets\u002FSubmissions.vue'), order: 10 })\nextendAdminDashboard(nuxt, { component: resolver.resolve('.\u002Fruntime\u002Fapp\u002Fwidgets\u002FSubmissionCount.vue'), order: 10 }, 'top')\n",[602,1877,1878,1907,1911,1980,2046,2091],{"__ignoreMap":765},[769,1879,1880,1882,1884,1887,1889,1892,1894,1897,1899,1901,1903,1905],{"class":771,"line":772},[769,1881,1450],{"class":810},[769,1883,960],{"class":825},[769,1885,1886],{"class":821}," extendAdminNav",[769,1888,849],{"class":825},[769,1890,1891],{"class":821}," extendAdminDashboard",[769,1893,849],{"class":825},[769,1895,1896],{"class":821}," adminRoute",[769,1898,1458],{"class":825},[769,1900,1461],{"class":810},[769,1902,852],{"class":825},[769,1904,1868],{"class":779},[769,1906,1469],{"class":825},[769,1908,1909],{"class":771,"line":829},[769,1910,1475],{"emptyLinePlaceholder":1474},[769,1912,1913,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933,1936,1938,1940,1942,1944,1946,1949,1951,1953,1955,1958,1960,1962,1964,1966,1968,1971,1973,1976,1978],{"class":771,"line":872},[769,1914,685],{"class":817},[769,1916,1483],{"class":821},[769,1918,849],{"class":825},[769,1920,960],{"class":825},[769,1922,963],{"class":832},[769,1924,836],{"class":825},[769,1926,852],{"class":825},[769,1928,294],{"class":779},[769,1930,842],{"class":825},[769,1932,849],{"class":825},[769,1934,1935],{"class":832}," to",[769,1937,836],{"class":825},[769,1939,1896],{"class":817},[769,1941,1483],{"class":821},[769,1943,849],{"class":825},[769,1945,852],{"class":825},[769,1947,1948],{"class":779},"forms",[769,1950,842],{"class":825},[769,1952,1512],{"class":821},[769,1954,849],{"class":825},[769,1956,1957],{"class":832}," icon",[769,1959,836],{"class":825},[769,1961,852],{"class":825},[769,1963,498],{"class":779},[769,1965,842],{"class":825},[769,1967,849],{"class":825},[769,1969,1970],{"class":832}," order",[769,1972,836],{"class":825},[769,1974,1975],{"class":1739}," 20",[769,1977,1458],{"class":825},[769,1979,1039],{"class":821},[769,1981,1982,1984,1986,1988,1990,1992,1994,1996,1999,2001,2003,2005,2007,2009,2011,2013,2015,2018,2020,2022,2024,2026,2028,2030,2032,2034,2037,2039,2042,2044],{"class":771,"line":883},[769,1983,685],{"class":817},[769,1985,1483],{"class":821},[769,1987,849],{"class":825},[769,1989,960],{"class":825},[769,1991,963],{"class":832},[769,1993,836],{"class":825},[769,1995,852],{"class":825},[769,1997,1998],{"class":779},"OAuth applications",[769,2000,842],{"class":825},[769,2002,849],{"class":825},[769,2004,1935],{"class":832},[769,2006,836],{"class":825},[769,2008,1896],{"class":817},[769,2010,1483],{"class":821},[769,2012,849],{"class":825},[769,2014,852],{"class":825},[769,2016,2017],{"class":779},"oauth",[769,2019,842],{"class":825},[769,2021,1512],{"class":821},[769,2023,849],{"class":825},[769,2025,1957],{"class":832},[769,2027,836],{"class":825},[769,2029,852],{"class":825},[769,2031,134],{"class":779},[769,2033,842],{"class":825},[769,2035,2036],{"class":825}," },",[769,2038,852],{"class":825},[769,2040,2041],{"class":779},"settings",[769,2043,842],{"class":825},[769,2045,1039],{"class":821},[769,2047,2048,2050,2052,2054,2056,2059,2061,2063,2065,2067,2069,2071,2074,2076,2078,2080,2082,2084,2087,2089],{"class":771,"line":893},[769,2049,689],{"class":817},[769,2051,1483],{"class":821},[769,2053,849],{"class":825},[769,2055,960],{"class":825},[769,2057,2058],{"class":832}," component",[769,2060,836],{"class":825},[769,2062,1495],{"class":821},[769,2064,628],{"class":825},[769,2066,1500],{"class":817},[769,2068,822],{"class":821},[769,2070,842],{"class":825},[769,2072,2073],{"class":779},".\u002Fruntime\u002Fapp\u002Fwidgets\u002FSubmissions.vue",[769,2075,842],{"class":825},[769,2077,1512],{"class":821},[769,2079,849],{"class":825},[769,2081,1970],{"class":832},[769,2083,836],{"class":825},[769,2085,2086],{"class":1739}," 10",[769,2088,1458],{"class":825},[769,2090,1039],{"class":821},[769,2092,2093,2095,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115,2118,2120,2122,2124,2126,2128,2130,2132,2134,2137,2139],{"class":771,"line":914},[769,2094,689],{"class":817},[769,2096,1483],{"class":821},[769,2098,849],{"class":825},[769,2100,960],{"class":825},[769,2102,2058],{"class":832},[769,2104,836],{"class":825},[769,2106,1495],{"class":821},[769,2108,628],{"class":825},[769,2110,1500],{"class":817},[769,2112,822],{"class":821},[769,2114,842],{"class":825},[769,2116,2117],{"class":779},".\u002Fruntime\u002Fapp\u002Fwidgets\u002FSubmissionCount.vue",[769,2119,842],{"class":825},[769,2121,1512],{"class":821},[769,2123,849],{"class":825},[769,2125,1970],{"class":832},[769,2127,836],{"class":825},[769,2129,2086],{"class":1739},[769,2131,2036],{"class":825},[769,2133,852],{"class":825},[769,2135,2136],{"class":779},"top",[769,2138,842],{"class":825},[769,2140,1039],{"class":821},[1108,2142,2143,2155],{},[1111,2144,2145],{},[1114,2146,2147,2150,2153],{},[1117,2148,2149],{},"Export",[1117,2151,2152],{},"Signature",[1117,2154,1128],{},[1130,2156,2157,2178,2198,2219,2241,2256],{},[1114,2158,2159,2163,2168],{},[1135,2160,2161],{},[602,2162,685],{},[1135,2164,2165],{},[602,2166,2167],{},"(nuxt, items: MenuItem | MenuItem[], group?: 'overview' | 'manage' | 'settings')",[1135,2169,2170,2171,2174,2175,628],{},"Adds sidebar entries. ",[602,2172,2173],{},"group"," defaults to ",[602,2176,2177],{},"'manage'",[1114,2179,2180,2184,2189],{},[1135,2181,2182],{},[602,2183,689],{},[1135,2185,2186],{},[602,2187,2188],{},"(nuxt, widgets: WidgetDefinition | WidgetDefinition[], position?: 'top' | 'main' | 'side')",[1135,2190,2191,2192,2174,2195,628],{},"Adds dashboard widgets. ",[602,2193,2194],{},"position",[602,2196,2197],{},"'main'",[1114,2199,2200,2204,2209],{},[1135,2201,2202],{},[602,2203,693],{},[1135,2205,2206],{},[602,2207,2208],{},"(nuxt, ...segments: string[]) => string",[1135,2210,2211,2212,2215,2216,628],{},"A path below the configured base: ",[602,2213,2214],{},"adminRoute(nuxt, 'events', ':id')"," is ",[602,2217,2218],{},"\u002Fadmin\u002Fevents\u002F:id",[1114,2220,2221,2226,2231],{},[1135,2222,2223],{},[602,2224,2225],{},"ADMIN_NAV_GROUPS",[1135,2227,2228],{},[602,2229,2230],{},"{ overview, manage, settings }",[1135,2232,2233,2234,686,2237,690,2239,628],{},"The menu path of each group: ",[602,2235,2236],{},"admin.nav.overview",[602,2238,1637],{},[602,2240,1774],{},[1114,2242,2243,2248,2253],{},[1135,2244,2245],{},[602,2246,2247],{},"ADMIN_NAV_MENU",[1135,2249,2250],{},[602,2251,2252],{},"'admin.nav'",[1135,2254,2255],{},"The menu of the Manage group.",[1114,2257,2258,2269,2280],{},[1135,2259,2260,686,2263,686,2266],{},[602,2261,2262],{},"ADMIN_DASHBOARD_AREA",[602,2264,2265],{},"ADMIN_DASHBOARD_TOP_AREA",[602,2267,2268],{},"ADMIN_DASHBOARD_SIDE_AREA",[1135,2270,2271,686,2274,686,2277],{},[602,2272,2273],{},"'admin.dashboard'",[602,2275,2276],{},"'.top'",[602,2278,2279],{},"'.side'",[1135,2281,2282],{},"The three dashboard widget areas.",[593,2284,2285,2286,2288,2289,2291,2292,2295,2296,2299],{},"Use ",[602,2287,693],{}," so a module's default paths follow the host's ",[602,2290,1174],{},". A module can also call ",[602,2293,2294],{},"extendMenu"," or\n",[602,2297,2298],{},"extendWidgets"," directly, without depending on Admin.",[755,2301,2302],{"id":1330},"Dashboard",[593,2304,2305,2306,2309],{},"The dashboard is three ",[597,2307,2308],{"href":87},"widget areas",", so modules fill it without Admin knowing them:",[1108,2311,2312,2329],{},[1111,2313,2314],{},[1114,2315,2316,2319,2323,2326],{},[1117,2317,2318],{},"Widget area",[1117,2320,2321],{},[602,2322,2194],{},[1117,2324,2325],{},"Layout",[1117,2327,2328],{},"Put here",[1130,2330,2331,2353,2373],{},[1114,2332,2333,2338,2343,2346],{},[1135,2334,2335],{},[602,2336,2337],{},"admin.dashboard.top",[1135,2339,2340],{},[602,2341,2342],{},"'top'",[1135,2344,2345],{},"A row of up to four cards",[1135,2347,2348,2349,2352],{},"One ",[602,2350,2351],{},"StatCard"," per widget.",[1114,2354,2355,2360,2364,2367],{},[1135,2356,2357],{},[602,2358,2359],{},"admin.dashboard",[1135,2361,2362],{},[602,2363,2197],{},[1135,2365,2366],{},"A wide column, full width when the side column is empty",[1135,2368,2369,2370,628],{},"Lists and tables, such as a ",[602,2371,2372],{},"ListCard",[1114,2374,2375,2380,2385,2388],{},[1135,2376,2377],{},[602,2378,2379],{},"admin.dashboard.side",[1135,2381,2382],{},[602,2383,2384],{},"'side'",[1135,2386,2387],{},"A narrow column next to it",[1135,2389,2390,2391,2393],{},"Short ",[602,2392,2372],{},"s.",[593,2395,2396,2397,2400],{},"Widgets load their own data with ",[602,2398,2399],{},"useLazyFetch"," and receive no context. When no module adds a widget, the dashboard\nshows a shortcut card for every entry of the Manage and Settings groups.",[755,2402,2325],{"id":2403},"layout",[593,2405,2406,2407,2409,2410,2412,2413,2417],{},"The ",[602,2408,649],{}," layout feeds the admin menus to the shared ",[597,2411,336],{"href":337},", which draws the\nchrome. The ",[597,2414,2416],{"href":2415},"\u002Fmodules\u002Fidentity\u002Faccount#layout","account area"," uses the same shell.",[635,2419,2420,2426,2438],{},[638,2421,2422,2425],{},[641,2423,2424],{},"Search."," The ⌘K palette has one group per sidebar group, so everything in the sidebar is searchable.",[638,2427,2428,706,2431,2434,2435,2437],{},[641,2429,2430],{},"Account menu.",[602,2432,2433],{},"AccountMenu"," from ",[597,2436,195],{"href":196}," sits in the sidebar footer, when installed.",[638,2439,2440,706,2443,690,2445,2448],{},[641,2441,2442],{},"Overrides.",[602,2444,2433],{},[602,2446,2447],{},"LanguageSelect"," are resolved by name, so your own versions win and neither is\nrequired.",[593,2450,2451,2452,2454,2455,2458],{},"What the sidebar, navbar and width look like is on\n",[597,2453,96],{"href":1432},". The dashboard page (",[602,2456,2457],{},"admin-dashboard",")\nis skipped when your app already has a page at its path.",[755,2460,2462],{"id":2461},"components","Components",[593,2464,2465,2466,2469,2470,2472],{},"Admin pages are built from the ",[597,2467,2468],{"href":333},"page components"," of UI, following the\n",[597,2471,91],{"href":102},". A module that ships admin pages declares Admin as an optional module\ndependency and UI as a dependency.",[593,2474,2475,2476,2479],{},"The old ",[602,2477,2478],{},"Admin*"," components have been removed. Replace them like this:",[1108,2481,2482,2492],{},[1111,2483,2484],{},[1114,2485,2486,2489],{},[1117,2487,2488],{},"Removed",[1117,2490,2491],{},"Use instead",[1130,2493,2494,2506,2534,2552,2564,2580,2596],{},[1114,2495,2496,2501],{},[1135,2497,2498],{},[602,2499,2500],{},"AdminPage",[1135,2502,2503],{},[602,2504,2505],{},"\u003Cdiv class=\"flex flex-col gap-4\">",[1114,2507,2508,2513],{},[1135,2509,2510],{},[602,2511,2512],{},"AdminPageHeader",[1135,2514,2515,2518,2519,2522,2523,2526,2527,2530,2531],{},[602,2516,2517],{},"PageHeading",": ",[602,2520,2521],{},"back"," becomes ",[602,2524,2525],{},"breadcrumb",", the ",[602,2528,2529],{},"links"," slot becomes ",[602,2532,2533],{},"actions",[1114,2535,2536,2544],{},[1135,2537,2538,686,2541],{},[602,2539,2540],{},"AdminSection",[602,2542,2543],{},"AdminToolbar",[1135,2545,2546,686,2549],{},[602,2547,2548],{},"SectionCard",[602,2550,2551],{},"PageToolbar",[1114,2553,2554,2559],{},[1135,2555,2556],{},[602,2557,2558],{},"AdminEmpty",[1135,2560,2561],{},[602,2562,2563],{},"\u003CUEmpty variant=\"naked\">",[1114,2565,2566,2571],{},[1135,2567,2568],{},[602,2569,2570],{},"AdminTable",[1135,2572,2573,2576,2577],{},[602,2574,2575],{},"TableCard"," around a ",[602,2578,2579],{},"UTable",[1114,2581,2582,2590],{},[1135,2583,2584,686,2587],{},[602,2585,2586],{},"AdminStatCard",[602,2588,2589],{},"AdminListCard",[1135,2591,2592,686,2594],{},[602,2593,2351],{},[602,2595,2372],{},[1114,2597,2598,2603],{},[1135,2599,2600],{},[602,2601,2602],{},"AdminKeyValue",[1135,2604,2605,2608],{},[602,2606,2607],{},"DescriptionList","; a missing value reads \"Not set\" instead of a dash",[630,2610,395],{"id":2611},"translations",[593,2613,2614,2615,2618,2619,2621],{},"Override any string in your app's ",[602,2616,2617],{},"i18n\u002Flocales\u002F\u003Ccode>.json",". The namespace is ",[602,2620,649],{},", in English and Danish.",[1108,2623,2624,2634],{},[1111,2625,2626],{},[1114,2627,2628,2631],{},[1117,2629,2630],{},"Key",[1117,2632,2633],{},"Used for",[1130,2635,2636,2646,2656,2672,2682,2698,2708],{},[1114,2637,2638,2643],{},[1135,2639,2640],{},[602,2641,2642],{},"admin.title",[1135,2644,2645],{},"The brand label and the start of the navbar line",[1114,2647,2648,2653],{},[1135,2649,2650],{},[602,2651,2652],{},"admin.nav.label",[1135,2654,2655],{},"The sidebar navigation's accessible name",[1114,2657,2658,2669],{},[1135,2659,2660,686,2663,686,2666],{},[602,2661,2662],{},"admin.nav.groups.overview",[602,2664,2665],{},".manage",[602,2667,2668],{},".settings",[1135,2670,2671],{},"The names of the sidebar groups",[1114,2673,2674,2679],{},[1135,2675,2676],{},[602,2677,2678],{},"admin.search.goTo",[1135,2680,2681],{},"The title of the ⌘K palette groups",[1114,2683,2684,2695],{},[1135,2685,2686,686,2689,686,2692],{},[602,2687,2688],{},"admin.dashboard.title",[602,2690,2691],{},".description",[602,2693,2694],{},".empty",[1135,2696,2697],{},"The dashboard page",[1114,2699,2700,2705],{},[1135,2701,2702],{},[602,2703,2704],{},"admin.backToSite",[1135,2706,2707],{},"The link back to the public site",[1114,2709,2710,2717],{},[1135,2711,2712,686,2715],{},[602,2713,2714],{},"admin.menu.label",[602,2716,2691],{},[1135,2718,2719],{},"The \"Admin\" entry in the account menu",[630,2721,2723],{"id":2722},"next-steps","Next steps",[635,2725,2726,2731,2736],{},[638,2727,2728,2730],{},[597,2729,486],{"href":487}," – add a page and its sidebar entry, step by step.",[638,2732,2733,2735],{},[597,2734,96],{"href":97}," – pick the sidebar group for a new page.",[638,2737,2738,2740],{},[597,2739,358],{"href":359}," – build a dashboard card for one of the three widget areas.",[2742,2743,2744],"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 .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":765,"searchDepth":829,"depth":829,"links":2746},[2747,2748,2753,2756,2762,2763],{"id":632,"depth":829,"text":633},{"id":749,"depth":829,"text":750,"children":2749},[2750,2751,2752],{"id":757,"depth":872,"text":758},{"id":792,"depth":872,"text":793},{"id":1042,"depth":872,"text":1043},{"id":1099,"depth":829,"text":1100,"children":2754},[2755],{"id":1341,"depth":872,"text":1342},{"id":1422,"depth":829,"text":267,"children":2757},[2758,2759,2760,2761],{"id":1425,"depth":872,"text":1426},{"id":1330,"depth":872,"text":2302},{"id":2403,"depth":872,"text":2325},{"id":2461,"depth":872,"text":2462},{"id":2611,"depth":829,"text":395},{"id":2722,"depth":829,"text":2723},"Gives your staff one guarded admin area, where every installed module adds its own management pages.","md",null,{},{"title":217,"description":2764},"fSQMusSxgjYWRluQxoaggB9n3JXQUc1fh4lo1xnVwtc",[2771,2773],{"title":179,"path":348,"stem":349,"description":2772,"children":-1},"Look up the import paths, translated-text and money helpers, and translation keys of UI.",{"title":354,"path":355,"stem":356,"description":2774,"children":-1},"Lets modules add links to your app's navigation, such as the admin sidebar, without importing each other.",1794503149048]