[{"data":1,"prerenderedAt":1763},["ShallowReactive",2],{"navigation_docs":3,"-examples-tasks-build-a-form":587,"-examples-tasks-build-a-form-surround":1758},[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":495,"body":589,"description":1751,"extension":1752,"links":1753,"meta":1754,"navigation":1755,"path":496,"seo":1756,"stem":497,"__hash__":1757},"docs\u002F4.examples\u002F3.tasks\u002F4.build-a-form.md",{"type":590,"value":591,"toc":1743},"minimark",[592,605,610,640,646,655,659,674,1272,1332,1335,1339,1349,1573,1586,1594,1598,1605,1611,1626,1630,1714,1718,1739],[593,594,595,599,600,604],"p",{},[596,597,598],"strong",{},"What you'll build:"," a published contact form at ",[601,602,603],"code",{},"\u002Fforms\u002Fcontact",". You define it in code and seed it into the\ndatabase. It stores each submission and emails it to your team.",[606,607,609],"h2",{"id":608},"prerequisites","Prerequisites",[611,612,613,630],"ul",{},[614,615,616,617,621,622,625,626,629],"li",{},"The ",[618,619,620],"a",{"href":454},"workspace starter",", or another ",[618,623,624],{"href":87},"host app"," with users\nand the ",[618,627,628],{"href":351},"admin area",".",[614,631,632,634,635,639],{},[618,633,294],{"href":295},", added as in ",[618,636,638],{"href":637},"\u002Fget-started\u002Fadding-modules#add-a-module","Add a module",", with its\nencryption key, permissions and migration.",[593,641,642,643,629],{},"The paths below are for the starter's ",[601,644,645],{},"apps\u002Fweb",[647,648,649,651,652,654],"note",{},[618,650,638],{"href":637}," installs Forms, enables NuxtHub KV and blob storage, sets\nits encryption key, gives its permissions to a role and generates the migration. Forms uses KV for rate limiting and blob storage for\nuploads. It installs ",[618,653,403],{"href":404}," for its emails.",[606,656,658],{"id":657},"_1-write-the-definition","1. Write the definition",[593,660,661,662,665,666,669,670,673],{},"A form defined in code is versioned with your app, and the same in every environment. ",[601,663,664],{},"defineForm()"," from\n",[601,667,668],{},"@frigear-nu\u002Fforms\u002Futils"," types the definition as a ",[601,671,672],{},"FormDefinition",": a mode, steps, fields, and where the answers go.",[675,676,682],"pre",{"className":677,"code":678,"filename":679,"language":680,"meta":681,"style":681},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineForm } from '@frigear-nu\u002Fforms\u002Futils'\n\nexport const contactForm = defineForm({\n  mode: 'single',\n  storage: 'db',\n  steps: [\n    {\n      id: 'message',\n      fields: [\n        { key: 'name', type: 'text', label: 'Name', required: true },\n        { key: 'email', type: 'email', label: 'Email', required: true },\n        {\n          key: 'subject',\n          type: 'select',\n          label: 'Subject',\n          options: [{ value: 'support', label: 'Support' }, { value: 'other', label: 'Other' }],\n        },\n        { key: 'message', type: 'textarea', label: 'Message', required: true },\n      ],\n    },\n  ],\n  submit: { successMessage: 'Thanks, we will be in touch.' },\n  delivery: {\n    email: {\n      to: ['office@example.com'],\n      subject: 'New message from {{ answer.name }}',\n      replyToField: 'email',\n    },\n  },\n})\n","apps\u002Fweb\u002Fforms\u002Fcontact.ts","ts","",[601,683,684,716,723,748,769,786,797,803,820,830,891,942,948,965,982,999,1074,1080,1131,1139,1145,1153,1177,1188,1198,1219,1236,1252,1257,1263],{"__ignoreMap":681},[685,686,689,693,697,701,704,707,710,713],"span",{"class":687,"line":688},"line",1,[685,690,692],{"class":691},"s7zQu","import",[685,694,696],{"class":695},"sMK4o"," {",[685,698,700],{"class":699},"sTEyZ"," defineForm",[685,702,703],{"class":695}," }",[685,705,706],{"class":691}," from",[685,708,709],{"class":695}," '",[685,711,668],{"class":712},"sfazB",[685,714,715],{"class":695},"'\n",[685,717,719],{"class":687,"line":718},2,[685,720,722],{"emptyLinePlaceholder":721},true,"\n",[685,724,726,729,733,736,739,742,745],{"class":687,"line":725},3,[685,727,728],{"class":691},"export",[685,730,732],{"class":731},"spNyl"," const",[685,734,735],{"class":699}," contactForm ",[685,737,738],{"class":695},"=",[685,740,700],{"class":741},"s2Zo4",[685,743,744],{"class":699},"(",[685,746,747],{"class":695},"{\n",[685,749,751,755,758,760,763,766],{"class":687,"line":750},4,[685,752,754],{"class":753},"swJcz","  mode",[685,756,757],{"class":695},":",[685,759,709],{"class":695},[685,761,762],{"class":712},"single",[685,764,765],{"class":695},"'",[685,767,768],{"class":695},",\n",[685,770,772,775,777,779,782,784],{"class":687,"line":771},5,[685,773,774],{"class":753},"  storage",[685,776,757],{"class":695},[685,778,709],{"class":695},[685,780,781],{"class":712},"db",[685,783,765],{"class":695},[685,785,768],{"class":695},[685,787,789,792,794],{"class":687,"line":788},6,[685,790,791],{"class":753},"  steps",[685,793,757],{"class":695},[685,795,796],{"class":699}," [\n",[685,798,800],{"class":687,"line":799},7,[685,801,802],{"class":695},"    {\n",[685,804,806,809,811,813,816,818],{"class":687,"line":805},8,[685,807,808],{"class":753},"      id",[685,810,757],{"class":695},[685,812,709],{"class":695},[685,814,815],{"class":712},"message",[685,817,765],{"class":695},[685,819,768],{"class":695},[685,821,823,826,828],{"class":687,"line":822},9,[685,824,825],{"class":753},"      fields",[685,827,757],{"class":695},[685,829,796],{"class":699},[685,831,833,836,839,841,843,846,848,851,854,856,858,861,863,865,868,870,872,875,877,879,882,884,888],{"class":687,"line":832},10,[685,834,835],{"class":695},"        {",[685,837,838],{"class":753}," key",[685,840,757],{"class":695},[685,842,709],{"class":695},[685,844,845],{"class":712},"name",[685,847,765],{"class":695},[685,849,850],{"class":695},",",[685,852,853],{"class":753}," type",[685,855,757],{"class":695},[685,857,709],{"class":695},[685,859,860],{"class":712},"text",[685,862,765],{"class":695},[685,864,850],{"class":695},[685,866,867],{"class":753}," label",[685,869,757],{"class":695},[685,871,709],{"class":695},[685,873,874],{"class":712},"Name",[685,876,765],{"class":695},[685,878,850],{"class":695},[685,880,881],{"class":753}," required",[685,883,757],{"class":695},[685,885,887],{"class":886},"sfNiH"," true",[685,889,890],{"class":695}," },\n",[685,892,894,896,898,900,902,905,907,909,911,913,915,917,919,921,923,925,927,930,932,934,936,938,940],{"class":687,"line":893},11,[685,895,835],{"class":695},[685,897,838],{"class":753},[685,899,757],{"class":695},[685,901,709],{"class":695},[685,903,904],{"class":712},"email",[685,906,765],{"class":695},[685,908,850],{"class":695},[685,910,853],{"class":753},[685,912,757],{"class":695},[685,914,709],{"class":695},[685,916,904],{"class":712},[685,918,765],{"class":695},[685,920,850],{"class":695},[685,922,867],{"class":753},[685,924,757],{"class":695},[685,926,709],{"class":695},[685,928,929],{"class":712},"Email",[685,931,765],{"class":695},[685,933,850],{"class":695},[685,935,881],{"class":753},[685,937,757],{"class":695},[685,939,887],{"class":886},[685,941,890],{"class":695},[685,943,945],{"class":687,"line":944},12,[685,946,947],{"class":695},"        {\n",[685,949,951,954,956,958,961,963],{"class":687,"line":950},13,[685,952,953],{"class":753},"          key",[685,955,757],{"class":695},[685,957,709],{"class":695},[685,959,960],{"class":712},"subject",[685,962,765],{"class":695},[685,964,768],{"class":695},[685,966,968,971,973,975,978,980],{"class":687,"line":967},14,[685,969,970],{"class":753},"          type",[685,972,757],{"class":695},[685,974,709],{"class":695},[685,976,977],{"class":712},"select",[685,979,765],{"class":695},[685,981,768],{"class":695},[685,983,985,988,990,992,995,997],{"class":687,"line":984},15,[685,986,987],{"class":753},"          label",[685,989,757],{"class":695},[685,991,709],{"class":695},[685,993,994],{"class":712},"Subject",[685,996,765],{"class":695},[685,998,768],{"class":695},[685,1000,1002,1005,1007,1010,1013,1016,1018,1020,1023,1025,1027,1029,1031,1033,1036,1038,1041,1043,1045,1047,1049,1052,1054,1056,1058,1060,1062,1065,1067,1069,1072],{"class":687,"line":1001},16,[685,1003,1004],{"class":753},"          options",[685,1006,757],{"class":695},[685,1008,1009],{"class":699}," [",[685,1011,1012],{"class":695},"{",[685,1014,1015],{"class":753}," value",[685,1017,757],{"class":695},[685,1019,709],{"class":695},[685,1021,1022],{"class":712},"support",[685,1024,765],{"class":695},[685,1026,850],{"class":695},[685,1028,867],{"class":753},[685,1030,757],{"class":695},[685,1032,709],{"class":695},[685,1034,1035],{"class":712},"Support",[685,1037,765],{"class":695},[685,1039,1040],{"class":695}," },",[685,1042,696],{"class":695},[685,1044,1015],{"class":753},[685,1046,757],{"class":695},[685,1048,709],{"class":695},[685,1050,1051],{"class":712},"other",[685,1053,765],{"class":695},[685,1055,850],{"class":695},[685,1057,867],{"class":753},[685,1059,757],{"class":695},[685,1061,709],{"class":695},[685,1063,1064],{"class":712},"Other",[685,1066,765],{"class":695},[685,1068,703],{"class":695},[685,1070,1071],{"class":699},"]",[685,1073,768],{"class":695},[685,1075,1077],{"class":687,"line":1076},17,[685,1078,1079],{"class":695},"        },\n",[685,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1101,1103,1106,1108,1110,1112,1114,1116,1119,1121,1123,1125,1127,1129],{"class":687,"line":1082},18,[685,1084,835],{"class":695},[685,1086,838],{"class":753},[685,1088,757],{"class":695},[685,1090,709],{"class":695},[685,1092,815],{"class":712},[685,1094,765],{"class":695},[685,1096,850],{"class":695},[685,1098,853],{"class":753},[685,1100,757],{"class":695},[685,1102,709],{"class":695},[685,1104,1105],{"class":712},"textarea",[685,1107,765],{"class":695},[685,1109,850],{"class":695},[685,1111,867],{"class":753},[685,1113,757],{"class":695},[685,1115,709],{"class":695},[685,1117,1118],{"class":712},"Message",[685,1120,765],{"class":695},[685,1122,850],{"class":695},[685,1124,881],{"class":753},[685,1126,757],{"class":695},[685,1128,887],{"class":886},[685,1130,890],{"class":695},[685,1132,1134,1137],{"class":687,"line":1133},19,[685,1135,1136],{"class":699},"      ]",[685,1138,768],{"class":695},[685,1140,1142],{"class":687,"line":1141},20,[685,1143,1144],{"class":695},"    },\n",[685,1146,1148,1151],{"class":687,"line":1147},21,[685,1149,1150],{"class":699},"  ]",[685,1152,768],{"class":695},[685,1154,1156,1159,1161,1163,1166,1168,1170,1173,1175],{"class":687,"line":1155},22,[685,1157,1158],{"class":753},"  submit",[685,1160,757],{"class":695},[685,1162,696],{"class":695},[685,1164,1165],{"class":753}," successMessage",[685,1167,757],{"class":695},[685,1169,709],{"class":695},[685,1171,1172],{"class":712},"Thanks, we will be in touch.",[685,1174,765],{"class":695},[685,1176,890],{"class":695},[685,1178,1180,1183,1185],{"class":687,"line":1179},23,[685,1181,1182],{"class":753},"  delivery",[685,1184,757],{"class":695},[685,1186,1187],{"class":695}," {\n",[685,1189,1191,1194,1196],{"class":687,"line":1190},24,[685,1192,1193],{"class":753},"    email",[685,1195,757],{"class":695},[685,1197,1187],{"class":695},[685,1199,1201,1204,1206,1208,1210,1213,1215,1217],{"class":687,"line":1200},25,[685,1202,1203],{"class":753},"      to",[685,1205,757],{"class":695},[685,1207,1009],{"class":699},[685,1209,765],{"class":695},[685,1211,1212],{"class":712},"office@example.com",[685,1214,765],{"class":695},[685,1216,1071],{"class":699},[685,1218,768],{"class":695},[685,1220,1222,1225,1227,1229,1232,1234],{"class":687,"line":1221},26,[685,1223,1224],{"class":753},"      subject",[685,1226,757],{"class":695},[685,1228,709],{"class":695},[685,1230,1231],{"class":712},"New message from {{ answer.name }}",[685,1233,765],{"class":695},[685,1235,768],{"class":695},[685,1237,1239,1242,1244,1246,1248,1250],{"class":687,"line":1238},27,[685,1240,1241],{"class":753},"      replyToField",[685,1243,757],{"class":695},[685,1245,709],{"class":695},[685,1247,904],{"class":712},[685,1249,765],{"class":695},[685,1251,768],{"class":695},[685,1253,1255],{"class":687,"line":1254},28,[685,1256,1144],{"class":695},[685,1258,1260],{"class":687,"line":1259},29,[685,1261,1262],{"class":695},"  },\n",[685,1264,1266,1269],{"class":687,"line":1265},30,[685,1267,1268],{"class":695},"}",[685,1270,1271],{"class":699},")\n",[611,1273,1274,1288,1294,1306,1319],{},[614,1275,1276,1279,1280,1283,1284,1287],{},[596,1277,1278],{},"Recipients."," ",[601,1281,1282],{},"to"," takes literal addresses. Without a ",[601,1285,1286],{},"body",", the email lists every visible answer.",[614,1289,1290,1293],{},[596,1291,1292],{},"Field keys."," They start with a letter, and contain letters, digits and underscores.",[614,1295,1296,1279,1299,1302,1303,1305],{},[596,1297,1298],{},"Reply-to.",[601,1300,1301],{},"replyToField"," must name an ",[601,1304,904],{}," field.",[614,1307,1308,1279,1311,1314,1315,1318],{},[596,1309,1310],{},"Access.",[601,1312,1313],{},"access"," defaults to ",[601,1316,1317],{},"{ availability: 'web', auth: 'none' }",": a public page with no sign-in.",[614,1320,1321,1324,1325,1327,1328,1331],{},[596,1322,1323],{},"Delivery."," The email goes through ",[618,1326,403],{"href":404},". Notify prints it with the ",[601,1329,1330],{},"log"," driver until\nyou configure a real one.",[647,1333,1334],{},"The submission is stored before the email is sent. So a delivery error never loses a submission.",[606,1336,1338],{"id":1337},"_2-enable-the-pages-and-seed-the-form","2. Enable the pages and seed the form",[593,1340,1341,1342,1345,1346,757],{},"Seeding puts the form in the database on start, so you need not create it by hand in the admin area. Add the pages and\nthe seed to the ",[601,1343,1344],{},"forms"," options you set in ",[618,1347,638],{"href":1348},"\u002Fget-started\u002Fadding-modules#add-it-to-nuxtconfigts",[675,1350,1353],{"className":677,"code":1351,"filename":1352,"language":680,"meta":681,"style":681},"import { contactForm } from '.\u002Fforms\u002Fcontact'\n\nexport default defineNuxtConfig({\n  forms: {\n    settings: {\n      pages: { form: true, admin: true, adminForm: true, adminSubmissions: true, adminSubmission: true },\n    },\n    seed: {\n      enabled: true, \u002F\u002F or NUXT_FORMS_SEED_ENABLED=true\n      forms: [{ slug: 'contact', name: 'Contact', status: 'published', definition: contactForm }],\n    },\n  },\n})\n","apps\u002Fweb\u002Fnuxt.config.ts",[601,1354,1355,1375,1379,1393,1402,1411,1465,1469,1478,1493,1559,1563,1567],{"__ignoreMap":681},[685,1356,1357,1359,1361,1364,1366,1368,1370,1373],{"class":687,"line":688},[685,1358,692],{"class":691},[685,1360,696],{"class":695},[685,1362,1363],{"class":699}," contactForm",[685,1365,703],{"class":695},[685,1367,706],{"class":691},[685,1369,709],{"class":695},[685,1371,1372],{"class":712},".\u002Fforms\u002Fcontact",[685,1374,715],{"class":695},[685,1376,1377],{"class":687,"line":718},[685,1378,722],{"emptyLinePlaceholder":721},[685,1380,1381,1383,1386,1389,1391],{"class":687,"line":725},[685,1382,728],{"class":691},[685,1384,1385],{"class":691}," default",[685,1387,1388],{"class":741}," defineNuxtConfig",[685,1390,744],{"class":699},[685,1392,747],{"class":695},[685,1394,1395,1398,1400],{"class":687,"line":750},[685,1396,1397],{"class":753},"  forms",[685,1399,757],{"class":695},[685,1401,1187],{"class":695},[685,1403,1404,1407,1409],{"class":687,"line":771},[685,1405,1406],{"class":753},"    settings",[685,1408,757],{"class":695},[685,1410,1187],{"class":695},[685,1412,1413,1416,1418,1420,1423,1425,1427,1429,1432,1434,1436,1438,1441,1443,1445,1447,1450,1452,1454,1456,1459,1461,1463],{"class":687,"line":788},[685,1414,1415],{"class":753},"      pages",[685,1417,757],{"class":695},[685,1419,696],{"class":695},[685,1421,1422],{"class":753}," form",[685,1424,757],{"class":695},[685,1426,887],{"class":886},[685,1428,850],{"class":695},[685,1430,1431],{"class":753}," admin",[685,1433,757],{"class":695},[685,1435,887],{"class":886},[685,1437,850],{"class":695},[685,1439,1440],{"class":753}," adminForm",[685,1442,757],{"class":695},[685,1444,887],{"class":886},[685,1446,850],{"class":695},[685,1448,1449],{"class":753}," adminSubmissions",[685,1451,757],{"class":695},[685,1453,887],{"class":886},[685,1455,850],{"class":695},[685,1457,1458],{"class":753}," adminSubmission",[685,1460,757],{"class":695},[685,1462,887],{"class":886},[685,1464,890],{"class":695},[685,1466,1467],{"class":687,"line":799},[685,1468,1144],{"class":695},[685,1470,1471,1474,1476],{"class":687,"line":805},[685,1472,1473],{"class":753},"    seed",[685,1475,757],{"class":695},[685,1477,1187],{"class":695},[685,1479,1480,1483,1485,1487,1489],{"class":687,"line":822},[685,1481,1482],{"class":753},"      enabled",[685,1484,757],{"class":695},[685,1486,887],{"class":886},[685,1488,850],{"class":695},[685,1490,1492],{"class":1491},"sHwdD"," \u002F\u002F or NUXT_FORMS_SEED_ENABLED=true\n",[685,1494,1495,1498,1500,1502,1504,1507,1509,1511,1514,1516,1518,1521,1523,1525,1528,1530,1532,1535,1537,1539,1542,1544,1546,1549,1551,1553,1555,1557],{"class":687,"line":832},[685,1496,1497],{"class":753},"      forms",[685,1499,757],{"class":695},[685,1501,1009],{"class":699},[685,1503,1012],{"class":695},[685,1505,1506],{"class":753}," slug",[685,1508,757],{"class":695},[685,1510,709],{"class":695},[685,1512,1513],{"class":712},"contact",[685,1515,765],{"class":695},[685,1517,850],{"class":695},[685,1519,1520],{"class":753}," name",[685,1522,757],{"class":695},[685,1524,709],{"class":695},[685,1526,1527],{"class":712},"Contact",[685,1529,765],{"class":695},[685,1531,850],{"class":695},[685,1533,1534],{"class":753}," status",[685,1536,757],{"class":695},[685,1538,709],{"class":695},[685,1540,1541],{"class":712},"published",[685,1543,765],{"class":695},[685,1545,850],{"class":695},[685,1547,1548],{"class":753}," definition",[685,1550,757],{"class":695},[685,1552,735],{"class":699},[685,1554,1268],{"class":695},[685,1556,1071],{"class":699},[685,1558,768],{"class":695},[685,1560,1561],{"class":687,"line":893},[685,1562,1144],{"class":695},[685,1564,1565],{"class":687,"line":944},[685,1566,1262],{"class":695},[685,1568,1569,1571],{"class":687,"line":950},[685,1570,1268],{"class":695},[685,1572,1271],{"class":699},[611,1574,1575,1583],{},[614,1576,1577,1314,1580,629],{},[601,1578,1579],{},"status",[601,1581,1582],{},"draft",[614,1584,1585],{},"Seeding inserts a slug only when it does not exist yet. It never overwrites a form.",[1587,1588,1589,1590,1593],"tip",{},"After the first seed, edit the form in the admin area, at ",[601,1591,1592],{},"\u002Fadmin\u002Fforms",". A changed definition in code does not reach\na form that is already seeded.",[606,1595,1597],{"id":1596},"_3-open-the-form","3. Open the form",[593,1599,1600,1601,1604],{},"Restart ",[601,1602,1603],{},"pnpm dev",". The seed runs on start.",[593,1606,1607,1608,629],{},"To place the form inside any page instead, render ",[601,1609,1610],{},"\u003CFormRenderer slug=\"contact\" \u002F>",[1612,1613,1616,1619,1620,1622,1623,1625],"callout",{"color":1614,"icon":1615},"success","i-lucide-check",[596,1617,1618],{},"What you should see:"," the form at ",[601,1621,603],{},". After you submit it, the submission is under ",[601,1624,1592],{},",\nand the email is printed in the terminal.",[606,1627,1629],{"id":1628},"troubleshooting","Troubleshooting",[1631,1632,1633,1649],"table",{},[1634,1635,1636],"thead",{},[1637,1638,1639,1643,1646],"tr",{},[1640,1641,1642],"th",{},"Symptom",[1640,1644,1645],{},"Cause",[1640,1647,1648],{},"Fix",[1650,1651,1652,1676,1697],"tbody",{},[1637,1653,1654,1660,1670],{},[1655,1656,1657,1659],"td",{},[601,1658,1592],{}," refuses you",[1655,1661,1662,1663,1666,1667,629],{},"None of your roles grants ",[601,1664,1665],{},"admin:access"," and ",[601,1668,1669],{},"forms:manage",[1655,1671,1672,1673,629],{},"Grant them, as in ",[618,1674,638],{"href":1675},"\u002Fget-started\u002Fadding-modules#give-its-permissions-to-a-role",[1637,1677,1678,1683,1688],{},[1655,1679,1680,1682],{},[601,1681,603],{}," is not found",[1655,1684,1685,1686,629],{},"The seed is off, or the form is a ",[601,1687,1582],{},[1655,1689,1690,1691,1666,1694,629],{},"Set ",[601,1692,1693],{},"seed.enabled: true",[601,1695,1696],{},"status: 'published'",[1637,1698,1699,1702,1708],{},[1655,1700,1701],{},"No email arrives",[1655,1703,1704,1705,1707],{},"Notify still uses the ",[601,1706,1330],{}," driver.",[1655,1709,1710,1711,629],{},"Configure a driver, as in ",[618,1712,500],{"href":1713},"\u002Fexamples\u002Ftasks\u002Fsend-an-email#_4-choose-a-driver",[606,1715,1717],{"id":1716},"next-steps","Next steps",[611,1719,1720,1729,1734],{},[614,1721,1722,1724,1725,1728],{},[618,1723,294],{"href":295}," – add conditional fields (",[601,1726,1727],{},"showIf","), steps, file uploads, captcha, open periods and\naccess tokens.",[614,1730,1731,1733],{},[618,1732,500],{"href":501}," – send email through a real provider instead of the terminal.",[614,1735,1736,1738],{},[618,1737,472],{"href":473}," – see an app that seeds three forms and polices them with its\nown policy.",[1740,1741,1742],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .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}",{"title":681,"searchDepth":718,"depth":718,"links":1744},[1745,1746,1747,1748,1749,1750],{"id":608,"depth":718,"text":609},{"id":657,"depth":718,"text":658},{"id":1337,"depth":718,"text":1338},{"id":1596,"depth":718,"text":1597},{"id":1628,"depth":718,"text":1629},{"id":1716,"depth":718,"text":1717},"Define a database-stored form in code, seed it, and publish it at \u002Fforms\u002F\u003Cslug> with email delivery.","md",null,{},{"icon":498},{"title":495,"description":1751},"ZJnqfE_wEDodH_M3JNJN22JSKhiXDH7y_VZ3T_o_RAc",[1759,1761],{"title":490,"path":491,"stem":492,"description":1760,"icon":493,"children":-1},"Sell paid and free event tickets with Events, Payments and Stripe, and run code when a ticket is paid.",{"title":500,"path":501,"stem":502,"description":1762,"icon":503,"children":-1},"Send a branded email from a Vue template with sendEmailTemplate, and pick the delivery driver.",1794503140360]