[{"data":1,"prerenderedAt":2489},["ShallowReactive",2],{"navigation_docs":3,"-modules-features-forms-reference":587,"-modules-features-forms-reference-surround":2484},[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":589,"body":590,"description":2477,"extension":2478,"links":2479,"meta":2480,"navigation":2481,"path":310,"seo":2482,"stem":311,"__hash__":2483},"docs\u002F3.modules\u002F3.features\u002F2.forms\u002F5.reference.md","Forms reference",{"type":591,"value":592,"toc":2470},"minimark",[593,601,605,617,688,1127,1130,1300,1353,1357,1379,1465,2040,2077,2092,2100,2117,2130,2133,2141,2268,2283,2286,2308,2366,2417,2442,2446,2466],[594,595,596,597,600],"p",{},"This page lists what Forms adds to your server: hooks, routes, tables and translations. It is for app developers and\nmodule authors. Set up the module first: ",[598,599,173],"a",{"href":295},".",[602,603,234],"h2",{"id":604},"hooks",[594,606,607,608,611,612,616],{},"Your app answers these ",[598,609,610],{"href":87},"Nitro"," hooks from a server plugin (",[613,614,615],"code",{},"server\u002Fplugins\u002F*.ts",").",[618,619,620,636],"table",{},[621,622,623],"thead",{},[624,625,626,630,633],"tr",{},[627,628,629],"th",{},"Hook",[627,631,632],{},"When",[627,634,635],{},"Payload",[637,638,639,658,673],"tbody",{},[624,640,641,647,653],{},[642,643,644],"td",{},[613,645,646],{},"forms:submitted",[642,648,649,650,600],{},"A valid submission arrived, and was stored unless ",[613,651,652],{},"storage: 'none'",[642,654,655],{},[613,656,657],{},"SubmittedContext",[624,659,660,665,668],{},[642,661,662],{},[613,663,664],{},"forms:captcha:verify",[642,666,667],{},"A captcha token must be verified.",[642,669,670],{},[613,671,672],{},"CaptchaVerifyContext",[624,674,675,680,683],{},[642,676,677],{},[613,678,679],{},"forms:delivered",[642,681,682],{},"Delivery finished: a listener delivered the submission, or one failed.",[642,684,685],{},[613,686,687],{},"{ submissionId: string | null, formSlug, status: 'delivered' | 'failed', error? }",[689,690,695],"pre",{"className":691,"code":692,"language":693,"meta":694,"style":694},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","type SubmittedContext = {\n  event: H3Event\n  form: { id: string, slug: string, name: string, version: number, definition: FormDefinition }\n  answers: Record\u003Cstring, unknown> \u002F\u002F validated; file fields hold the file names\n  files: { fieldKey: string, filename: string, contentType: string, size: number, pathname: string | null }[]\n  locale: string\n  userId: number | null\n  submissionId: string | null \u002F\u002F null when storage is 'none'\n  stored: boolean\n  delivered: boolean \u002F\u002F set true once the handler delivered; throw to mark delivery failed\n}\n\ntype CaptchaVerifyContext = {\n  event: H3Event\n  provider: 'turnstile' | 'recaptcha' | 'hcaptcha'\n  token: string\n  ip: string | undefined\n  formId?: string\n  secretKey?: string\n  secretSource?: 'form' | 'env' | 'unset'\n  valid: boolean | undefined \u002F\u002F set it to decide; left undefined, the provider is asked\n}\n","ts","",[613,696,697,717,730,791,820,886,897,912,929,940,954,960,967,979,988,1025,1035,1050,1061,1071,1104,1122],{"__ignoreMap":694},[698,699,702,706,710,714],"span",{"class":700,"line":701},"line",1,[698,703,705],{"class":704},"spNyl","type",[698,707,709],{"class":708},"sBMFI"," SubmittedContext",[698,711,713],{"class":712},"sMK4o"," =",[698,715,716],{"class":712}," {\n",[698,718,720,724,727],{"class":700,"line":719},2,[698,721,723],{"class":722},"swJcz","  event",[698,725,726],{"class":712},":",[698,728,729],{"class":708}," H3Event\n",[698,731,733,736,738,741,744,746,749,752,755,757,759,761,764,766,768,770,773,775,778,780,783,785,788],{"class":700,"line":732},3,[698,734,735],{"class":722},"  form",[698,737,726],{"class":712},[698,739,740],{"class":712}," {",[698,742,743],{"class":722}," id",[698,745,726],{"class":712},[698,747,748],{"class":708}," string",[698,750,751],{"class":712},",",[698,753,754],{"class":722}," slug",[698,756,726],{"class":712},[698,758,748],{"class":708},[698,760,751],{"class":712},[698,762,763],{"class":722}," name",[698,765,726],{"class":712},[698,767,748],{"class":708},[698,769,751],{"class":712},[698,771,772],{"class":722}," version",[698,774,726],{"class":712},[698,776,777],{"class":708}," number",[698,779,751],{"class":712},[698,781,782],{"class":722}," definition",[698,784,726],{"class":712},[698,786,787],{"class":708}," FormDefinition",[698,789,790],{"class":712}," }\n",[698,792,794,797,799,802,805,808,810,813,816],{"class":700,"line":793},4,[698,795,796],{"class":722},"  answers",[698,798,726],{"class":712},[698,800,801],{"class":708}," Record",[698,803,804],{"class":712},"\u003C",[698,806,807],{"class":708},"string",[698,809,751],{"class":712},[698,811,812],{"class":708}," unknown",[698,814,815],{"class":712},">",[698,817,819],{"class":818},"sHwdD"," \u002F\u002F validated; file fields hold the file names\n",[698,821,823,826,828,830,833,835,837,839,842,844,846,848,851,853,855,857,860,862,864,866,869,871,873,876,879,882],{"class":700,"line":822},5,[698,824,825],{"class":722},"  files",[698,827,726],{"class":712},[698,829,740],{"class":712},[698,831,832],{"class":722}," fieldKey",[698,834,726],{"class":712},[698,836,748],{"class":708},[698,838,751],{"class":712},[698,840,841],{"class":722}," filename",[698,843,726],{"class":712},[698,845,748],{"class":708},[698,847,751],{"class":712},[698,849,850],{"class":722}," contentType",[698,852,726],{"class":712},[698,854,748],{"class":708},[698,856,751],{"class":712},[698,858,859],{"class":722}," size",[698,861,726],{"class":712},[698,863,777],{"class":708},[698,865,751],{"class":712},[698,867,868],{"class":722}," pathname",[698,870,726],{"class":712},[698,872,748],{"class":708},[698,874,875],{"class":712}," |",[698,877,878],{"class":708}," null",[698,880,881],{"class":712}," }",[698,883,885],{"class":884},"sTEyZ","[]\n",[698,887,889,892,894],{"class":700,"line":888},6,[698,890,891],{"class":722},"  locale",[698,893,726],{"class":712},[698,895,896],{"class":708}," string\n",[698,898,900,903,905,907,909],{"class":700,"line":899},7,[698,901,902],{"class":722},"  userId",[698,904,726],{"class":712},[698,906,777],{"class":708},[698,908,875],{"class":712},[698,910,911],{"class":708}," null\n",[698,913,915,918,920,922,924,926],{"class":700,"line":914},8,[698,916,917],{"class":722},"  submissionId",[698,919,726],{"class":712},[698,921,748],{"class":708},[698,923,875],{"class":712},[698,925,878],{"class":708},[698,927,928],{"class":818}," \u002F\u002F null when storage is 'none'\n",[698,930,932,935,937],{"class":700,"line":931},9,[698,933,934],{"class":722},"  stored",[698,936,726],{"class":712},[698,938,939],{"class":708}," boolean\n",[698,941,943,946,948,951],{"class":700,"line":942},10,[698,944,945],{"class":722},"  delivered",[698,947,726],{"class":712},[698,949,950],{"class":708}," boolean",[698,952,953],{"class":818}," \u002F\u002F set true once the handler delivered; throw to mark delivery failed\n",[698,955,957],{"class":700,"line":956},11,[698,958,959],{"class":712},"}\n",[698,961,963],{"class":700,"line":962},12,[698,964,966],{"emptyLinePlaceholder":965},true,"\n",[698,968,970,972,975,977],{"class":700,"line":969},13,[698,971,705],{"class":704},[698,973,974],{"class":708}," CaptchaVerifyContext",[698,976,713],{"class":712},[698,978,716],{"class":712},[698,980,982,984,986],{"class":700,"line":981},14,[698,983,723],{"class":722},[698,985,726],{"class":712},[698,987,729],{"class":708},[698,989,991,994,996,999,1003,1006,1008,1010,1013,1015,1017,1019,1022],{"class":700,"line":990},15,[698,992,993],{"class":722},"  provider",[698,995,726],{"class":712},[698,997,998],{"class":712}," '",[698,1000,1002],{"class":1001},"sfazB","turnstile",[698,1004,1005],{"class":712},"'",[698,1007,875],{"class":712},[698,1009,998],{"class":712},[698,1011,1012],{"class":1001},"recaptcha",[698,1014,1005],{"class":712},[698,1016,875],{"class":712},[698,1018,998],{"class":712},[698,1020,1021],{"class":1001},"hcaptcha",[698,1023,1024],{"class":712},"'\n",[698,1026,1028,1031,1033],{"class":700,"line":1027},16,[698,1029,1030],{"class":722},"  token",[698,1032,726],{"class":712},[698,1034,896],{"class":708},[698,1036,1038,1041,1043,1045,1047],{"class":700,"line":1037},17,[698,1039,1040],{"class":722},"  ip",[698,1042,726],{"class":712},[698,1044,748],{"class":708},[698,1046,875],{"class":712},[698,1048,1049],{"class":708}," undefined\n",[698,1051,1053,1056,1059],{"class":700,"line":1052},18,[698,1054,1055],{"class":722},"  formId",[698,1057,1058],{"class":712},"?:",[698,1060,896],{"class":708},[698,1062,1064,1067,1069],{"class":700,"line":1063},19,[698,1065,1066],{"class":722},"  secretKey",[698,1068,1058],{"class":712},[698,1070,896],{"class":708},[698,1072,1074,1077,1079,1081,1084,1086,1088,1090,1093,1095,1097,1099,1102],{"class":700,"line":1073},20,[698,1075,1076],{"class":722},"  secretSource",[698,1078,1058],{"class":712},[698,1080,998],{"class":712},[698,1082,1083],{"class":1001},"form",[698,1085,1005],{"class":712},[698,1087,875],{"class":712},[698,1089,998],{"class":712},[698,1091,1092],{"class":1001},"env",[698,1094,1005],{"class":712},[698,1096,875],{"class":712},[698,1098,998],{"class":712},[698,1100,1101],{"class":1001},"unset",[698,1103,1024],{"class":712},[698,1105,1107,1110,1112,1114,1116,1119],{"class":700,"line":1106},21,[698,1108,1109],{"class":722},"  valid",[698,1111,726],{"class":712},[698,1113,950],{"class":708},[698,1115,875],{"class":712},[698,1117,1118],{"class":708}," undefined",[698,1120,1121],{"class":818}," \u002F\u002F set it to decide; left undefined, the provider is asked\n",[698,1123,1125],{"class":700,"line":1124},22,[698,1126,959],{"class":712},[594,1128,1129],{},"This listener forwards every submission to a webhook:",[689,1131,1134],{"className":691,"code":1132,"filename":1133,"language":693,"meta":694,"style":694},"export default defineNitroPlugin((nitro) => {\n  nitro.hooks.hook('forms:submitted', async (ctx) => {\n    await fetch('https:\u002F\u002Fexample.com\u002Fhook', { method: 'POST', body: JSON.stringify(ctx.answers) })\n    ctx.delivered = true\n  })\n})\n","server\u002Fplugins\u002Fforms-webhook.ts",[613,1135,1136,1166,1205,1271,1287,1294],{"__ignoreMap":694},[698,1137,1138,1142,1145,1149,1152,1154,1158,1161,1164],{"class":700,"line":701},[698,1139,1141],{"class":1140},"s7zQu","export",[698,1143,1144],{"class":1140}," default",[698,1146,1148],{"class":1147},"s2Zo4"," defineNitroPlugin",[698,1150,1151],{"class":884},"(",[698,1153,1151],{"class":712},[698,1155,1157],{"class":1156},"sHdIc","nitro",[698,1159,1160],{"class":712},")",[698,1162,1163],{"class":704}," =>",[698,1165,716],{"class":712},[698,1167,1168,1171,1173,1175,1177,1180,1182,1184,1186,1188,1190,1193,1196,1199,1201,1203],{"class":700,"line":719},[698,1169,1170],{"class":884},"  nitro",[698,1172,600],{"class":712},[698,1174,604],{"class":884},[698,1176,600],{"class":712},[698,1178,1179],{"class":1147},"hook",[698,1181,1151],{"class":722},[698,1183,1005],{"class":712},[698,1185,646],{"class":1001},[698,1187,1005],{"class":712},[698,1189,751],{"class":712},[698,1191,1192],{"class":704}," async",[698,1194,1195],{"class":712}," (",[698,1197,1198],{"class":1156},"ctx",[698,1200,1160],{"class":712},[698,1202,1163],{"class":704},[698,1204,716],{"class":712},[698,1206,1207,1210,1213,1215,1217,1220,1222,1224,1226,1229,1231,1233,1236,1238,1240,1243,1245,1248,1250,1253,1255,1257,1259,1262,1265,1268],{"class":700,"line":732},[698,1208,1209],{"class":1140},"    await",[698,1211,1212],{"class":1147}," fetch",[698,1214,1151],{"class":722},[698,1216,1005],{"class":712},[698,1218,1219],{"class":1001},"https:\u002F\u002Fexample.com\u002Fhook",[698,1221,1005],{"class":712},[698,1223,751],{"class":712},[698,1225,740],{"class":712},[698,1227,1228],{"class":722}," method",[698,1230,726],{"class":712},[698,1232,998],{"class":712},[698,1234,1235],{"class":1001},"POST",[698,1237,1005],{"class":712},[698,1239,751],{"class":712},[698,1241,1242],{"class":722}," body",[698,1244,726],{"class":712},[698,1246,1247],{"class":884}," JSON",[698,1249,600],{"class":712},[698,1251,1252],{"class":1147},"stringify",[698,1254,1151],{"class":722},[698,1256,1198],{"class":884},[698,1258,600],{"class":712},[698,1260,1261],{"class":884},"answers",[698,1263,1264],{"class":722},") ",[698,1266,1267],{"class":712},"}",[698,1269,1270],{"class":722},")\n",[698,1272,1273,1276,1278,1281,1283],{"class":700,"line":793},[698,1274,1275],{"class":884},"    ctx",[698,1277,600],{"class":712},[698,1279,1280],{"class":884},"delivered",[698,1282,713],{"class":712},[698,1284,1286],{"class":1285},"sfNiH"," true\n",[698,1288,1289,1292],{"class":700,"line":822},[698,1290,1291],{"class":712},"  }",[698,1293,1270],{"class":722},[698,1295,1296,1298],{"class":700,"line":888},[698,1297,1267],{"class":712},[698,1299,1270],{"class":884},[1301,1302,1303,1320,1342],"ul",{},[1304,1305,1306,1310,1311,1313,1314,1317,1318,600],"li",{},[1307,1308,1309],"strong",{},"Email."," The built-in email delivery is a ",[613,1312,646],{}," listener. It sends ",[613,1315,1316],{},"delivery.email"," through\n",[598,1319,403],{"href":404},[1304,1321,1322,1325,1326,1329,1330,1333,1334,1337,1338,1341],{},[1307,1323,1324],{},"Stored forms."," With ",[613,1327,1328],{},"storage: 'db'",", a failing listener sets the submission's ",[613,1331,1332],{},"deliveryStatus"," to ",[613,1335,1336],{},"failed",", with\nthe error. The visitor still sees success, and ",[1307,1339,1340],{},"Deliver again"," in the admin area runs the hooks again.",[1304,1343,1344,1325,1347,1349,1350,600],{},[1307,1345,1346],{},"Unstored forms.",[613,1348,652],{},", nothing else keeps the answers, so a failure answers ",[613,1351,1352],{},"502",[602,1354,1356],{"id":1355},"routes","Routes",[594,1358,1359,1360,1363,1364,1367,1368,1371,1372,1375,1376,600],{},"Routes the module registers, and who may call them. Public routes are under ",[613,1361,1362],{},"\u002Fapi\u002Fforms",", and staff routes under\n",[613,1365,1366],{},"\u002Fapi\u002Fadmin\u002Fforms",". Build the paths with ",[613,1369,1370],{},"formsApi"," from ",[613,1373,1374],{},"@frigear-nu\u002Fforms\u002Fapi",", for example\n",[613,1377,1378],{},"formsApi.admin.form(id)",[1301,1380,1381,1397,1410,1434],{},[1304,1382,1383,1388,1389,1392,1393,600],{},[1307,1384,1385],{},[598,1386,1387],{"href":87},"Staff"," means the caller holds ",[613,1390,1391],{},"forms:manage"," through a role. See\n",[598,1394,1396],{"href":1395},"\u002Fmodules\u002Ffeatures\u002Fforms#permissions","Permissions",[1304,1398,1399,1402,1403,1406,1407,600],{},[1307,1400,1401],{},"Session"," routes create or remove access credentials. They need ",[613,1404,1405],{},"forms:credentials",", a session-only permission, so a\ntoken gets ",[613,1408,1409],{},"403 session_required",[1304,1411,1412,1415,1416,1419,1420,1423,1424,1423,1427,1430,1431,600],{},[1307,1413,1414],{},"Errors"," carry a ",[613,1417,1418],{},"data.code",", such as ",[613,1421,1422],{},"not_found",", ",[613,1425,1426],{},"forbidden",[613,1428,1429],{},"conflict"," or ",[613,1432,1433],{},"validation_failed",[1304,1435,1436,1439,1440,1443,1444,1423,1447,1450,1451,1454,1455,1195,1458,1430,1461,1464],{},[1307,1437,1438],{},"Lists"," answer ",[613,1441,1442],{},"{ items, total, page, pageSize }",". They take ",[613,1445,1446],{},"page",[613,1448,1449],{},"pageSize"," (default 20, at most 100), ",[613,1452,1453],{},"sort",",\n",[613,1456,1457],{},"order",[613,1459,1460],{},"asc",[613,1462,1463],{},"desc",") and their filters.",[618,1466,1467,1485],{},[621,1468,1469],{},[624,1470,1471,1474,1477,1479,1482],{},[627,1472,1473],{},"Method",[627,1475,1476],{},"Path",[627,1478,168],{},[627,1480,1481],{},"Status",[627,1483,1484],{},"Purpose",[637,1486,1487,1513,1534,1554,1575,1601,1626,1651,1676,1699,1728,1750,1772,1793,1818,1843,1872,1893,1918,1948,1971,1993,2015],{},[624,1488,1489,1494,1499,1502,1507],{},[642,1490,1491],{},[613,1492,1493],{},"GET",[642,1495,1496],{},[613,1497,1498],{},"\u002Fapi\u002Fforms\u002F:slug",[642,1500,1501],{},"form access",[642,1503,1504],{},[613,1505,1506],{},"200",[642,1508,1509,1510,600],{},"The published definition, without ",[613,1511,1512],{},"delivery",[624,1514,1515,1519,1524,1527,1531],{},[642,1516,1517],{},[613,1518,1493],{},[642,1520,1521],{},[613,1522,1523],{},"\u002Fapi\u002Fforms\u002F:slug\u002Faccess",[642,1525,1526],{},"none",[642,1528,1529],{},[613,1530,1506],{},[642,1532,1533],{},"What a page needs to choose between the form, a gate and \"not found\".",[624,1535,1536,1540,1545,1547,1551],{},[642,1537,1538],{},[613,1539,1235],{},[642,1541,1542],{},[613,1543,1544],{},"\u002Fapi\u002Fforms\u002F:slug\u002Fsubmit",[642,1546,1501],{},[642,1548,1549],{},[613,1550,1506],{},[642,1552,1553],{},"Submit answers. Rate limited.",[624,1555,1556,1560,1564,1568,1572],{},[642,1557,1558],{},[613,1559,1493],{},[642,1561,1562],{},[613,1563,1366],{},[642,1565,1566],{},[613,1567,1391],{},[642,1569,1570],{},[613,1571,1506],{},[642,1573,1574],{},"Forms with submission counts. Filters below.",[624,1576,1577,1581,1585,1589,1594],{},[642,1578,1579],{},[613,1580,1235],{},[642,1582,1583],{},[613,1584,1366],{},[642,1586,1587],{},[613,1588,1391],{},[642,1590,1591],{},[613,1592,1593],{},"201",[642,1595,1596,1597,1600],{},"Create a form. ",[613,1598,1599],{},"409 conflict"," for a taken slug.",[624,1602,1603,1607,1612,1616,1620],{},[642,1604,1605],{},[613,1606,1235],{},[642,1608,1609],{},[613,1610,1611],{},"\u002Fapi\u002Fadmin\u002Fforms\u002Fimport",[642,1613,1614],{},[613,1615,1391],{},[642,1617,1618],{},[613,1619,1506],{},[642,1621,1622,1623,600],{},"Import definitions: ",[613,1624,1625],{},"{ inserted, skipped }",[624,1627,1628,1632,1637,1641,1645],{},[642,1629,1630],{},[613,1631,1493],{},[642,1633,1634],{},[613,1635,1636],{},"\u002Fapi\u002Fadmin\u002Fforms\u002F:id",[642,1638,1639],{},[613,1640,1391],{},[642,1642,1643],{},[613,1644,1506],{},[642,1646,1647,1648,600],{},"One form, with ",[613,1649,1650],{},"submissionCount",[624,1652,1653,1658,1662,1666,1670],{},[642,1654,1655],{},[613,1656,1657],{},"PATCH",[642,1659,1660],{},[613,1661,1636],{},[642,1663,1664],{},[613,1665,1391],{},[642,1667,1668],{},[613,1669,1506],{},[642,1671,1672,1673,600],{},"Update a form. A changed definition bumps ",[613,1674,1675],{},"version",[624,1677,1678,1683,1687,1691,1696],{},[642,1679,1680],{},[613,1681,1682],{},"DELETE",[642,1684,1685],{},[613,1686,1636],{},[642,1688,1689],{},[613,1690,1391],{},[642,1692,1693],{},[613,1694,1695],{},"204",[642,1697,1698],{},"Archive the form. It and its submissions are kept.",[624,1700,1701,1705,1710,1714,1718],{},[642,1702,1703],{},[613,1704,1235],{},[642,1706,1707],{},[613,1708,1709],{},"\u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Fclone",[642,1711,1712],{},[613,1713,1391],{},[642,1715,1716],{},[613,1717,1593],{},[642,1719,1720,1721,1423,1724,1727],{},"Copy into a new draft (",[613,1722,1723],{},"\u003Cslug>-copy",[613,1725,1726],{},"-copy-2",", …).",[624,1729,1730,1734,1739,1743,1747],{},[642,1731,1732],{},[613,1733,1493],{},[642,1735,1736],{},[613,1737,1738],{},"\u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Fsubmissions",[642,1740,1741],{},[613,1742,1391],{},[642,1744,1745],{},[613,1746,1506],{},[642,1748,1749],{},"A form's submissions. Filters below.",[624,1751,1752,1756,1761,1765,1769],{},[642,1753,1754],{},[613,1755,1493],{},[642,1757,1758],{},[613,1759,1760],{},"\u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Ftokens",[642,1762,1763],{},[613,1764,1391],{},[642,1766,1767],{},[613,1768,1506],{},[642,1770,1771],{},"The form access tokens, as an array.",[624,1773,1774,1778,1782,1786,1790],{},[642,1775,1776],{},[613,1777,1235],{},[642,1779,1780],{},[613,1781,1760],{},[642,1783,1784],{},[613,1785,1405],{},[642,1787,1788],{},[613,1789,1593],{},[642,1791,1792],{},"Create a token. Only this response contains it.",[624,1794,1795,1799,1804,1808,1812],{},[642,1796,1797],{},[613,1798,1682],{},[642,1800,1801],{},[613,1802,1803],{},"\u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Ftokens\u002F:tokenId",[642,1805,1806],{},[613,1807,1405],{},[642,1809,1810],{},[613,1811,1695],{},[642,1813,1814,1815,600],{},"Revoke a token. It stays listed, with ",[613,1816,1817],{},"revokedAt",[624,1819,1820,1824,1829,1833,1837],{},[642,1821,1822],{},[613,1823,1493],{},[642,1825,1826],{},[613,1827,1828],{},"\u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Fpassword",[642,1830,1831],{},[613,1832,1391],{},[642,1834,1835],{},[613,1836,1506],{},[642,1838,1839,1840,600],{},"Whether a password is set: ",[613,1841,1842],{},"{ set }",[624,1844,1845,1850,1854,1858,1862],{},[642,1846,1847],{},[613,1848,1849],{},"PUT",[642,1851,1852],{},[613,1853,1828],{},[642,1855,1856],{},[613,1857,1405],{},[642,1859,1860],{},[613,1861,1506],{},[642,1863,1864,1865,1868,1869,600],{},"Set the password ",[613,1866,1867],{},"{ password }",", 6 to 200 characters. Answers ",[613,1870,1871],{},"{ set: true }",[624,1873,1874,1878,1882,1886,1890],{},[642,1875,1876],{},[613,1877,1682],{},[642,1879,1880],{},[613,1881,1828],{},[642,1883,1884],{},[613,1885,1405],{},[642,1887,1888],{},[613,1889,1695],{},[642,1891,1892],{},"Remove the password.",[624,1894,1895,1899,1904,1908,1912],{},[642,1896,1897],{},[613,1898,1493],{},[642,1900,1901],{},[613,1902,1903],{},"\u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Fsecrets",[642,1905,1906],{},[613,1907,1391],{},[642,1909,1910],{},[613,1911,1506],{},[642,1913,1914,1915,600],{},"The names and sources of the secrets: ",[613,1916,1917],{},"{ keys, captcha, unreadable }",[624,1919,1920,1924,1929,1933,1937],{},[642,1921,1922],{},[613,1923,1849],{},[642,1925,1926],{},[613,1927,1928],{},"\u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Fsecrets\u002F:key",[642,1930,1931],{},[613,1932,1405],{},[642,1934,1935],{},[613,1936,1506],{},[642,1938,1939,1940,1943,1944,1947],{},"Write one secret ",[613,1941,1942],{},"{ value }",". ",[613,1945,1946],{},"400"," for an unknown key.",[624,1949,1950,1954,1958,1962,1966],{},[642,1951,1952],{},[613,1953,1682],{},[642,1955,1956],{},[613,1957,1928],{},[642,1959,1960],{},[613,1961,1405],{},[642,1963,1964],{},[613,1965,1695],{},[642,1967,1968,1969,1947],{},"Remove one secret. ",[613,1970,1946],{},[624,1972,1973,1977,1982,1986,1990],{},[642,1974,1975],{},[613,1976,1493],{},[642,1978,1979],{},[613,1980,1981],{},"\u002Fapi\u002Fadmin\u002Fforms\u002Fsubmissions\u002F:id",[642,1983,1984],{},[613,1985,1391],{},[642,1987,1988],{},[613,1989,1506],{},[642,1991,1992],{},"One submission.",[624,1994,1995,1999,2004,2008,2012],{},[642,1996,1997],{},[613,1998,1493],{},[642,2000,2001],{},[613,2002,2003],{},"\u002Fapi\u002Fadmin\u002Fforms\u002Fsubmissions\u002F:id\u002Ffiles\u002F:fileId",[642,2005,2006],{},[613,2007,1391],{},[642,2009,2010],{},[613,2011,1506],{},[642,2013,2014],{},"Download an uploaded file.",[624,2016,2017,2021,2026,2030,2034],{},[642,2018,2019],{},[613,2020,1235],{},[642,2022,2023],{},[613,2024,2025],{},"\u002Fapi\u002Fadmin\u002Fforms\u002Fsubmissions\u002F:id\u002Fredeliver",[642,2027,2028],{},[613,2029,1391],{},[642,2031,2032],{},[613,2033,1506],{},[642,2035,2036,2037,600],{},"Run the delivery hooks again: ",[613,2038,2039],{},"{ deliveryStatus, deliveryError }",[594,2041,2042,2047,2048,2051,2052,2055,2056,2059,2060,2063,2064,1423,2067,1423,2070,1423,2073,1430,2075,600],{},[1307,2043,2044],{},[613,2045,2046],{},"GET \u002Fapi\u002Fadmin\u002Fforms"," filters by ",[613,2049,2050],{},"q"," (name or slug), ",[613,2053,2054],{},"status"," and ",[613,2057,2058],{},"archived=false",". It sorts by ",[613,2061,2062],{},"updatedAt","\n(the default, descending), ",[613,2065,2066],{},"createdAt",[613,2068,2069],{},"name",[613,2071,2072],{},"slug",[613,2074,2054],{},[613,2076,1650],{},[594,2078,2079,2084,2085,2088,2089,2091],{},[1307,2080,2081],{},[613,2082,2083],{},"DELETE \u002Fapi\u002Fadmin\u002Fforms\u002F:id"," sets the status to ",[613,2086,2087],{},"archived",", so submissions always keep their form. A ",[613,2090,1657],{}," can\npublish it again.",[594,2093,2094,2099],{},[1307,2095,2096],{},[613,2097,2098],{},"POST \u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Fclone"," copies the name and definition. Submissions, tokens, the password and secrets\nare not copied.",[594,2101,2102,2047,2107,2059,2109,2111,2112,1430,2114,600],{},[1307,2103,2104],{},[613,2105,2106],{},"GET \u002Fapi\u002Fadmin\u002Fforms\u002F:id\u002Fsubmissions",[613,2108,1332],{},[613,2110,2066],{}," (the default,\ndescending), ",[613,2113,1332],{},[613,2115,2116],{},"locale",[594,2118,2119,2120,2055,2123,2126,2127,600],{},"The static ",[613,2121,2122],{},"import",[613,2124,2125],{},"submissions"," segments win over ",[613,2128,2129],{},":id",[602,2131,41],{"id":2132},"database",[594,2134,2135,2136,2140],{},"Tables the module adds. Generate and commit a ",[598,2137,2139],{"href":2138},"\u002Fget-started\u002Fdatabase#migrations","migration"," after installing.",[618,2142,2143,2153],{},[621,2144,2145],{},[624,2146,2147,2150],{},[627,2148,2149],{},"Table",[627,2151,2152],{},"Holds",[637,2154,2155,2184,2210,2220,2241,2254],{},[624,2156,2157,2162],{},[642,2158,2159],{},[613,2160,2161],{},"forms",[642,2163,2164,1423,2166,1423,2168,1195,2170,1423,2173,1423,2176,2178,2179,2055,2182,600],{},[613,2165,2072],{},[613,2167,2069],{},[613,2169,2054],{},[613,2171,2172],{},"draft",[613,2174,2175],{},"published",[613,2177,2087],{},"), ",[613,2180,2181],{},"definition",[613,2183,1675],{},[624,2185,2186,2191],{},[642,2187,2188],{},[613,2189,2190],{},"form_submissions",[642,2192,2193,2194,1423,2197,1423,2200,1423,2203,1423,2205,2055,2207,600],{},"Answers, ",[613,2195,2196],{},"definitionSnapshot",[613,2198,2199],{},"formVersion",[613,2201,2202],{},"userId",[613,2204,2116],{},[613,2206,1332],{},[613,2208,2209],{},"deliveryError",[624,2211,2212,2217],{},[642,2213,2214],{},[613,2215,2216],{},"form_submission_files",[642,2218,2219],{},"The blob pathname, file name, content type and size of each upload.",[624,2221,2222,2227],{},[642,2223,2224],{},[613,2225,2226],{},"form_access_tokens",[642,2228,2229,2230,1423,2233,1423,2236,2055,2239,600],{},"Form access tokens: ",[613,2231,2232],{},"tokenHash",[613,2234,2235],{},"prefix",[613,2237,2238],{},"lastUsedAt",[613,2240,1817],{},[624,2242,2243,2248],{},[642,2244,2245],{},[613,2246,2247],{},"form_access",[642,2249,2250,2251,600],{},"One row per password-protected form: ",[613,2252,2253],{},"passwordHash",[624,2255,2256,2261],{},[642,2257,2258],{},[613,2259,2260],{},"form_secrets",[642,2262,2263,2264,2267],{},"One row per form: ",[613,2265,2266],{},"secrets",", an encrypted JSON map of namespaced keys.",[594,2269,2270,2272,2273,1423,2275,1423,2278,1430,2280,2282],{},[613,2271,1332],{}," is ",[613,2274,1526],{},[613,2276,2277],{},"pending",[613,2279,1280],{},[613,2281,1336],{},". Only staff can download uploaded files.",[602,2284,395],{"id":2285},"translations",[594,2287,2288,2289,2292,2293,2055,2296,2299,2300,2303,2304,600],{},"Override any string in your app's ",[613,2290,2291],{},"i18n\u002Flocales\u002F\u003Ccode>.json",". The module registers ",[613,2294,2295],{},"da",[613,2297,2298],{},"en"," messages under\n",[613,2301,2302],{},"forms.*",", with English fallbacks. See\n",[598,2305,2307],{"href":2306},"\u002Fmodules\u002Fplatform\u002Fmodule-kit\u002Fi18n#overriding-module-strings-in-your-app","overriding module strings",[689,2309,2313],{"className":2310,"code":2311,"language":2312,"meta":694,"style":694},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"forms\": { \"actions\": { \"submit\": \"Send inquiry\" } } }\n","json",[613,2314,2315],{"__ignoreMap":694},[698,2316,2317,2320,2323,2325,2328,2330,2332,2334,2337,2339,2341,2343,2345,2349,2351,2353,2355,2358,2360,2362,2364],{"class":700,"line":701},[698,2318,2319],{"class":712},"{",[698,2321,2322],{"class":712}," \"",[698,2324,2161],{"class":704},[698,2326,2327],{"class":712},"\"",[698,2329,726],{"class":712},[698,2331,740],{"class":712},[698,2333,2322],{"class":712},[698,2335,2336],{"class":708},"actions",[698,2338,2327],{"class":712},[698,2340,726],{"class":712},[698,2342,740],{"class":712},[698,2344,2322],{"class":712},[698,2346,2348],{"class":2347},"sbssI","submit",[698,2350,2327],{"class":712},[698,2352,726],{"class":712},[698,2354,2322],{"class":712},[698,2356,2357],{"class":1001},"Send inquiry",[698,2359,2327],{"class":712},[698,2361,881],{"class":712},[698,2363,881],{"class":712},[698,2365,790],{"class":712},[594,2367,2368,2369,1423,2371,1423,2374,1423,2377,1423,2380,1423,2383,1423,2386,1423,2389,1423,2392,1423,2394,1454,2396,1423,2399,1423,2402,1423,2405,1423,2408,1423,2411,2055,2414,600],{},"Key groups: ",[613,2370,2336],{},[613,2372,2373],{},"step",[613,2375,2376],{},"success",[613,2378,2379],{},"error",[613,2381,2382],{},"embed",[613,2384,2385],{},"preview",[613,2387,2388],{},"field",[613,2390,2391],{},"value",[613,2393,2054],{},[613,2395,1512],{},[613,2397,2398],{},"validation",[613,2400,2401],{},"admin",[613,2403,2404],{},"schedule",[613,2406,2407],{},"access",[613,2409,2410],{},"menu",[613,2412,2413],{},"captcha",[613,2415,2416],{},"builder",[1301,2418,2419,2429],{},[1304,2420,2421,2424,2425,2428],{},[1307,2422,2423],{},"Form content"," lives in the definition, as ",[613,2426,2427],{},"{ da, en }"," texts.",[1304,2430,2431,2434,2435,2438,2439,600],{},[1307,2432,2433],{},"Validation messages"," use ",[613,2436,2437],{},"forms.validation.*",". A field overrides them with ",[613,2440,2441],{},"validation.message",[602,2443,2445],{"id":2444},"next-steps","Next steps",[1301,2447,2448,2453,2458],{},[1304,2449,2450,2452],{},[598,2451,175],{"href":304}," – the access modes and secrets behind these routes.",[1304,2454,2455,2457],{},[598,2456,500],{"href":501}," – configure the Notify driver that delivers form emails.",[1304,2459,2460,2462,2463,2465],{},[598,2461,300],{"href":301}," – the ",[613,2464,2181],{}," these routes store.",[2467,2468,2469],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":694,"searchDepth":719,"depth":719,"links":2471},[2472,2473,2474,2475,2476],{"id":604,"depth":719,"text":234},{"id":1355,"depth":719,"text":1356},{"id":2132,"depth":719,"text":41},{"id":2285,"depth":719,"text":395},{"id":2444,"depth":719,"text":2445},"Look up the hooks, HTTP routes, database tables and translation keys of Forms.","md",null,{},{"title":179},{"title":589,"description":2477},"UcD1aoCtjXcdLfzHtpzTTdhtbWaeagXX1JlnEq2I_RI",[2485,2487],{"title":267,"path":307,"stem":308,"description":2486,"children":-1},"Show a form on its own page, inside any page or in Markdown, and use the composables and utils behind it.",{"title":313,"path":314,"stem":315,"description":2488,"children":-1},"Ask visitors before your app sets non-essential cookies, load scripts only after they agree, and keep proof.",1794503156399]